From ac3737eb613a4181556fcaeb22c12f6876012d22 Mon Sep 17 00:00:00 2001 From: Tate Thurston Date: Sun, 23 Jul 2023 16:47:13 -0700 Subject: [PATCH 1/2] package refactor --- .eslintrc.cjs | 17 +- .github/workflows/ci.yml | 4 +- .github/workflows/publish.yml | 4 +- .gitignore | 3 +- .husky/pre-commit | 2 +- DEVELOPMENT.md | 4 - dist/package.json | 34 --- e2e/conformance/package.json | 4 +- e2e/conformance/runner.ts | 2 +- e2e/conformance/tsconfig.json | 8 + e2e/serialization/package.json | 4 + e2e/serialization/test.ts | 1 - e2e/serialization/tsconfig.json | 8 + e2e/treeshaking/TreeshakingTest.ts | 2 +- e2e/treeshaking/TreeshakingTestJSON.ts | 2 +- e2e/treeshaking/package.json | 4 + e2e/treeshaking/tsconfig.json | 8 + examples/closure-compiler/package.json | 1 + .../closure-compiler/src/haberdasher.pb.ts | 285 ++++++++++++++++++ examples/closure-compiler/tsconfig.json | 7 + examples/typescript/package.json | 3 +- package.json | 18 +- packages/protoscript/.npmignore | 2 + packages/protoscript/package.json | 46 +++ {src => packages/protoscript/src}/cli/core.ts | 0 .../protoscript/src}/cli/index.ts | 0 .../protoscript/src}/cli/utils.ts | 0 .../src}/codegen/autogenerate/index.ts | 0 .../src}/codegen/autogenerate/test.ts | 0 .../protoscript/src}/codegen/compile.ts | 0 .../protoscript/src}/codegen/utils.ts | 0 .../protoscript/src}/compiler.cmd | 0 {src => packages/protoscript/src}/compiler.ts | 0 {src => packages/protoscript/src}/index.ts | 0 {src => packages/protoscript/src}/plugin.ts | 0 .../protoscript/src}/runtime/arith.test.ts | 0 .../protoscript/src}/runtime/arith.ts | 0 .../protoscript/src}/runtime/constants.ts | 0 .../protoscript/src}/runtime/decoder.ts | 0 .../protoscript/src}/runtime/encoder.ts | 0 .../protoscript/src}/runtime/goog/asserts.ts | 0 .../src}/runtime/goog/crypt.test.ts | 0 .../protoscript/src}/runtime/goog/crypt.ts | 0 .../protoscript/src}/runtime/index.ts | 5 +- .../protoscript/src}/runtime/json.ts | 0 .../protoscript/src}/runtime/reader.ts | 0 .../protoscript/src}/runtime/utils.test.ts | 0 .../protoscript/src}/runtime/utils.ts | 0 .../src}/runtime/well-known-types/any.pb.ts | 0 .../src}/runtime/well-known-types/api.pb.ts | 0 .../runtime/well-known-types/duration.pb.ts | 0 .../src}/runtime/well-known-types/empty.pb.ts | 0 .../runtime/well-known-types/field_mask.pb.ts | 0 .../src}/runtime/well-known-types/index.ts | 0 .../well-known-types/source_context.pb.ts | 0 .../runtime/well-known-types/struct.pb.ts | 0 .../runtime/well-known-types/timestamp.pb.ts | 0 .../src}/runtime/well-known-types/type.pb.ts | 0 .../runtime/well-known-types/wrappers.pb.ts | 0 .../protoscript/src}/runtime/writer.ts | 0 packages/protoscript/tsconfig.json | 8 + .../well-known-types}/package.json | 3 + packages/well-known-types/tsconfig.json | 7 + .../well-known-types}/well_known_types.pb.js | 0 .../well-known-types}/well_known_types.proto | 0 pnpm-lock.yaml | 36 +-- pnpm-workspace.yaml | 3 +- public.package.json | 34 --- tsconfig.json | 3 +- well-known-types/tsconfig.json | 8 - well-known-types/well_known_types.pb.ts | 3 - 71 files changed, 444 insertions(+), 139 deletions(-) delete mode 100644 dist/package.json create mode 100644 e2e/conformance/tsconfig.json create mode 100644 e2e/serialization/tsconfig.json create mode 100644 e2e/treeshaking/tsconfig.json create mode 100644 examples/closure-compiler/src/haberdasher.pb.ts create mode 100644 examples/closure-compiler/tsconfig.json create mode 100644 packages/protoscript/.npmignore create mode 100644 packages/protoscript/package.json rename {src => packages/protoscript/src}/cli/core.ts (100%) rename {src => packages/protoscript/src}/cli/index.ts (100%) rename {src => packages/protoscript/src}/cli/utils.ts (100%) rename {src => packages/protoscript/src}/codegen/autogenerate/index.ts (100%) rename {src => packages/protoscript/src}/codegen/autogenerate/test.ts (100%) rename {src => packages/protoscript/src}/codegen/compile.ts (100%) rename {src => packages/protoscript/src}/codegen/utils.ts (100%) rename {src => packages/protoscript/src}/compiler.cmd (100%) rename {src => packages/protoscript/src}/compiler.ts (100%) rename {src => packages/protoscript/src}/index.ts (100%) rename {src => packages/protoscript/src}/plugin.ts (100%) rename {src => packages/protoscript/src}/runtime/arith.test.ts (100%) rename {src => packages/protoscript/src}/runtime/arith.ts (100%) rename {src => packages/protoscript/src}/runtime/constants.ts (100%) rename {src => packages/protoscript/src}/runtime/decoder.ts (100%) rename {src => packages/protoscript/src}/runtime/encoder.ts (100%) rename {src => packages/protoscript/src}/runtime/goog/asserts.ts (100%) rename {src => packages/protoscript/src}/runtime/goog/crypt.test.ts (100%) rename {src => packages/protoscript/src}/runtime/goog/crypt.ts (100%) rename {src => packages/protoscript/src}/runtime/index.ts (73%) rename {src => packages/protoscript/src}/runtime/json.ts (100%) rename {src => packages/protoscript/src}/runtime/reader.ts (100%) rename {src => packages/protoscript/src}/runtime/utils.test.ts (100%) rename {src => packages/protoscript/src}/runtime/utils.ts (100%) rename {src => packages/protoscript/src}/runtime/well-known-types/any.pb.ts (100%) rename {src => packages/protoscript/src}/runtime/well-known-types/api.pb.ts (100%) rename {src => packages/protoscript/src}/runtime/well-known-types/duration.pb.ts (100%) rename {src => packages/protoscript/src}/runtime/well-known-types/empty.pb.ts (100%) rename {src => packages/protoscript/src}/runtime/well-known-types/field_mask.pb.ts (100%) rename {src => packages/protoscript/src}/runtime/well-known-types/index.ts (100%) rename {src => packages/protoscript/src}/runtime/well-known-types/source_context.pb.ts (100%) rename {src => packages/protoscript/src}/runtime/well-known-types/struct.pb.ts (100%) rename {src => packages/protoscript/src}/runtime/well-known-types/timestamp.pb.ts (100%) rename {src => packages/protoscript/src}/runtime/well-known-types/type.pb.ts (100%) rename {src => packages/protoscript/src}/runtime/well-known-types/wrappers.pb.ts (100%) rename {src => packages/protoscript/src}/runtime/writer.ts (100%) create mode 100644 packages/protoscript/tsconfig.json rename {well-known-types => packages/well-known-types}/package.json (80%) create mode 100644 packages/well-known-types/tsconfig.json rename {well-known-types => packages/well-known-types}/well_known_types.pb.js (100%) rename {well-known-types => packages/well-known-types}/well_known_types.proto (100%) delete mode 100644 public.package.json delete mode 100644 well-known-types/tsconfig.json delete mode 100644 well-known-types/well_known_types.pb.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 32b81f2..05febdc 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,13 +1,17 @@ // eslint-disable-next-line no-undef module.exports = { root: true, - ignorePatterns: ["dist", "examples", "e2e", "well-known-types"], + ignorePatterns: ["dist", "*.pb.ts", "*.pb.js"], + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + }, + env: { + browser: true, + node: true, + }, plugins: ["@typescript-eslint"], - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier", - ], + extends: ["eslint:recommended", "prettier"], overrides: [ { files: ["*.ts"], @@ -18,6 +22,7 @@ module.exports = { project: ["./tsconfig.json"], }, extends: [ + "plugin:@typescript-eslint/recommended", "plugin:@typescript-eslint/recommended-requiring-type-checking", ], rules: { diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ecf7640..267f19d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,9 +20,9 @@ jobs: node-version-file: ".nvmrc" cache: "pnpm" - run: pnpm install --frozen-lockfile - - run: pnpm package:build + - run: (cd packages/protoscript && pnpm package:build) # run again to link bin that is now available after package:build - - run: pnpm install + - run: pnpm install --frozen-lockfile - run: pnpm lint - run: pnpm test:ci && pnpm codecov --token=$CODECOV_TOKEN env: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c646929..f64d3a1 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -14,7 +14,9 @@ jobs: cache: "pnpm" registry-url: "https://registry.npmjs.org" - run: pnpm install --frozen-lockfile + - run: cp README.md LICENSE CHANGELOG.md packages/protoscript + - run: cd packages/protoscript - run: pnpm package:build - - run: cd dist && npm publish + - run: npm publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore index 1ca8fe3..5a14cde 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ **/dist/* -!**/dist/package.json coverage node_modules todo.txt -well-known-types/**/*.pb.ts +packages/well-known-types/**/*.pb.ts diff --git a/.husky/pre-commit b/.husky/pre-commit index e9d68a6..1497de0 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,6 +1,6 @@ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" -pnpm run package:build +(cd packages/protoscript && pnpm run package:build) pnpm run regen pnpm run lint:fix diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index cfbff4c..eab3607 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -43,7 +43,3 @@ As part of installation, husky pre-commit hooks are installed to run linters aga ### Publishing There are CI and publishing GitHub workflows in `./github/workflows`. These are named `ci.yml` and `publish.yml`. - -### Note - -`protoscript` package self referencing is used by the wellknowntypes. right now works in a surprising manner: the package is built into dist, but the source package.json has the same name as the package.json that will be generated into dist. This results in self referencing using the source directory when everything is built. diff --git a/dist/package.json b/dist/package.json deleted file mode 100644 index 9fa92aa..0000000 --- a/dist/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "protoscript", - "version": "0.0.16", - "description": "A Protobuf runtime and code generation tool for JavaScript and TypeScript", - "license": "MIT", - "author": "Tate ", - "repository": { - "type": "git", - "url": "https://github.com/tatethurston/protoscript" - }, - "type": "module", - "main": "./cjs/index.cjs", - "module": "./index.js", - "bin": { - "protoscript": "./cli/index.js" - }, - "sideEffects": false, - "types": "./index.d.ts", - "dependencies": { - "google-protobuf": "^3.21.2", - "prettier": "^3.0.0" - }, - "keywords": ["protobuf", "protocol buffers", "typescript"], - "exports": { - "./package.json": "./package.json", - ".": { - "import": "./index.js", - "module": "./index.js", - "require": "./cjs/index.cjs", - "default": "./index.js" - }, - "./plugin": "./plugin.js" - } -} diff --git a/e2e/conformance/package.json b/e2e/conformance/package.json index f8034ba..9cbbf07 100644 --- a/e2e/conformance/package.json +++ b/e2e/conformance/package.json @@ -1,8 +1,10 @@ { "name": "conformance", + "type": "module", "scripts": { "build": "esbuild runner.ts --bundle --platform=node --target=es2020 --outfile=dist/runner.cjs", - "conformance:build": "./bin/generate_conformance_test_runner.sh" + "conformance:build": "./bin/generate_conformance_test_runner.sh", + "typecheck": "tsc --noEmit" }, "dependencies": { "protoscript": "workspace:*" diff --git a/e2e/conformance/runner.ts b/e2e/conformance/runner.ts index d0a0c4f..041aacf 100755 --- a/e2e/conformance/runner.ts +++ b/e2e/conformance/runner.ts @@ -59,7 +59,7 @@ function test(request: ConformanceRequest): ConformanceResponse { } else if (request.jsonPayload) { testMessage = TestAllTypesProto3JSON.decode(request.jsonPayload); } else { - return { runtimeError: `${request} not supported` }; + return { runtimeError: "request not supported" }; } } catch (err) { // > This string should be set to indicate parsing failed. The string can diff --git a/e2e/conformance/tsconfig.json b/e2e/conformance/tsconfig.json new file mode 100644 index 0000000..060dd2c --- /dev/null +++ b/e2e/conformance/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "dist" + }, + "exclude": ["dist"] +} diff --git a/e2e/serialization/package.json b/e2e/serialization/package.json index 2d74937..98c9e17 100644 --- a/e2e/serialization/package.json +++ b/e2e/serialization/package.json @@ -1,5 +1,9 @@ { "name": "test-serialization", + "type": "module", + "scripts": { + "typecheck": "tsc --noEmit" + }, "dependencies": { "protoscript": "workspace:*" } diff --git a/e2e/serialization/test.ts b/e2e/serialization/test.ts index d24cbea..2c3161a 100644 --- a/e2e/serialization/test.ts +++ b/e2e/serialization/test.ts @@ -1,4 +1,3 @@ -import { describe, it } from "@jest/globals"; import { Baz, Foo, FooJSON } from "./message.pb.js"; const nestedMessage: Foo.FooBar = { diff --git a/e2e/serialization/tsconfig.json b/e2e/serialization/tsconfig.json new file mode 100644 index 0000000..060dd2c --- /dev/null +++ b/e2e/serialization/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "dist" + }, + "exclude": ["dist"] +} diff --git a/e2e/treeshaking/TreeshakingTest.ts b/e2e/treeshaking/TreeshakingTest.ts index bb25a23..10f6e39 100644 --- a/e2e/treeshaking/TreeshakingTest.ts +++ b/e2e/treeshaking/TreeshakingTest.ts @@ -1,3 +1,3 @@ -import { TreeshakingTest } from "./treeshaking.pb"; +import { TreeshakingTest } from "./treeshaking.pb.js"; export default TreeshakingTest.initialize(); diff --git a/e2e/treeshaking/TreeshakingTestJSON.ts b/e2e/treeshaking/TreeshakingTestJSON.ts index b07165b..c2ce184 100644 --- a/e2e/treeshaking/TreeshakingTestJSON.ts +++ b/e2e/treeshaking/TreeshakingTestJSON.ts @@ -1,3 +1,3 @@ -import { TreeshakingTestJSON } from "./treeshaking.pb"; +import { TreeshakingTestJSON } from "./treeshaking.pb.js"; export default TreeshakingTestJSON.initialize(); diff --git a/e2e/treeshaking/package.json b/e2e/treeshaking/package.json index d668346..9c2cba3 100644 --- a/e2e/treeshaking/package.json +++ b/e2e/treeshaking/package.json @@ -1,8 +1,12 @@ { "name": "test-serialization", + "type": "module", "dependencies": { "protoscript": "workspace:*" }, + "scripts": { + "typecheck": "tsc --noEmit" + }, "devDependencies": { "esbuild": "^0.18.16" } diff --git a/e2e/treeshaking/tsconfig.json b/e2e/treeshaking/tsconfig.json new file mode 100644 index 0000000..060dd2c --- /dev/null +++ b/e2e/treeshaking/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "dist" + }, + "exclude": ["dist"] +} diff --git a/examples/closure-compiler/package.json b/examples/closure-compiler/package.json index 9025825..721c1f0 100644 --- a/examples/closure-compiler/package.json +++ b/examples/closure-compiler/package.json @@ -1,5 +1,6 @@ { "name": "js-example", + "type": "module", "main": "index.js", "license": "MIT", "scripts": { diff --git a/examples/closure-compiler/src/haberdasher.pb.ts b/examples/closure-compiler/src/haberdasher.pb.ts new file mode 100644 index 0000000..4962a02 --- /dev/null +++ b/examples/closure-compiler/src/haberdasher.pb.ts @@ -0,0 +1,285 @@ +// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +// Source: src/haberdasher.proto +/* eslint-disable */ + +import type { ByteSource, PartialDeep } from "protoscript"; +import { BinaryReader, BinaryWriter } from "protoscript"; + +//========================================// +// Types // +//========================================// + +/** + * Size of a Hat, in inches. + */ +export interface Size { + /** + * must be > 0 + */ + inches: number; +} + +/** + * A Hat is a piece of headwear made by a Haberdasher. + */ +export interface Hat { + inches: number; + /** + * anything but "invisible" + */ + color: string; + /** + * i.e. "bowler" + */ + name: string; +} + +//========================================// +// Protobuf Encode / Decode // +//========================================// + +export const Size = { + /** + * Serializes Size to protobuf. + */ + encode: function (msg: PartialDeep): Uint8Array { + return Size._writeMessage(msg, new BinaryWriter()).getResultBuffer(); + }, + + /** + * Deserializes Size from protobuf. + */ + decode: function (bytes: ByteSource): Size { + return Size._readMessage(Size.initialize(), new BinaryReader(bytes)); + }, + + /** + * Initializes Size with all fields set to their default value. + */ + initialize: function (): Size { + return { + inches: 0, + }; + }, + + /** + * @private + */ + _writeMessage: function ( + msg: PartialDeep, + writer: BinaryWriter, + ): BinaryWriter { + if (msg.inches) { + writer.writeInt32(1, msg.inches); + } + return writer; + }, + + /** + * @private + */ + _readMessage: function (msg: Size, reader: BinaryReader): Size { + while (reader.nextField()) { + const field = reader.getFieldNumber(); + switch (field) { + case 1: { + msg.inches = reader.readInt32(); + break; + } + default: { + reader.skipField(); + break; + } + } + } + return msg; + }, +}; + +export const Hat = { + /** + * Serializes Hat to protobuf. + */ + encode: function (msg: PartialDeep): Uint8Array { + return Hat._writeMessage(msg, new BinaryWriter()).getResultBuffer(); + }, + + /** + * Deserializes Hat from protobuf. + */ + decode: function (bytes: ByteSource): Hat { + return Hat._readMessage(Hat.initialize(), new BinaryReader(bytes)); + }, + + /** + * Initializes Hat with all fields set to their default value. + */ + initialize: function (): Hat { + return { + inches: 0, + color: "", + name: "", + }; + }, + + /** + * @private + */ + _writeMessage: function ( + msg: PartialDeep, + writer: BinaryWriter, + ): BinaryWriter { + if (msg.inches) { + writer.writeInt32(1, msg.inches); + } + if (msg.color) { + writer.writeString(2, msg.color); + } + if (msg.name) { + writer.writeString(3, msg.name); + } + return writer; + }, + + /** + * @private + */ + _readMessage: function (msg: Hat, reader: BinaryReader): Hat { + while (reader.nextField()) { + const field = reader.getFieldNumber(); + switch (field) { + case 1: { + msg.inches = reader.readInt32(); + break; + } + case 2: { + msg.color = reader.readString(); + break; + } + case 3: { + msg.name = reader.readString(); + break; + } + default: { + reader.skipField(); + break; + } + } + } + return msg; + }, +}; + +//========================================// +// JSON Encode / Decode // +//========================================// + +export const SizeJSON = { + /** + * Serializes Size to JSON. + */ + encode: function (msg: PartialDeep): string { + return JSON.stringify(SizeJSON._writeMessage(msg)); + }, + + /** + * Deserializes Size from JSON. + */ + decode: function (json: string): Size { + return SizeJSON._readMessage(SizeJSON.initialize(), JSON.parse(json)); + }, + + /** + * Initializes Size with all fields set to their default value. + */ + initialize: function (): Size { + return { + inches: 0, + }; + }, + + /** + * @private + */ + _writeMessage: function (msg: PartialDeep): Record { + const json: Record = {}; + if (msg.inches) { + json["inches"] = msg.inches; + } + return json; + }, + + /** + * @private + */ + _readMessage: function (msg: Size, json: any): Size { + const _inches_ = json["inches"]; + if (_inches_) { + msg.inches = _inches_; + } + return msg; + }, +}; + +export const HatJSON = { + /** + * Serializes Hat to JSON. + */ + encode: function (msg: PartialDeep): string { + return JSON.stringify(HatJSON._writeMessage(msg)); + }, + + /** + * Deserializes Hat from JSON. + */ + decode: function (json: string): Hat { + return HatJSON._readMessage(HatJSON.initialize(), JSON.parse(json)); + }, + + /** + * Initializes Hat with all fields set to their default value. + */ + initialize: function (): Hat { + return { + inches: 0, + color: "", + name: "", + }; + }, + + /** + * @private + */ + _writeMessage: function (msg: PartialDeep): Record { + const json: Record = {}; + if (msg.inches) { + json["inches"] = msg.inches; + } + if (msg.color) { + json["color"] = msg.color; + } + if (msg.name) { + json["name"] = msg.name; + } + return json; + }, + + /** + * @private + */ + _readMessage: function (msg: Hat, json: any): Hat { + const _inches_ = json["inches"]; + if (_inches_) { + msg.inches = _inches_; + } + const _color_ = json["color"]; + if (_color_) { + msg.color = _color_; + } + const _name_ = json["name"]; + if (_name_) { + msg.name = _name_; + } + return msg; + }, +}; diff --git a/examples/closure-compiler/tsconfig.json b/examples/closure-compiler/tsconfig.json new file mode 100644 index 0000000..0ed6f21 --- /dev/null +++ b/examples/closure-compiler/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "dist" + } +} diff --git a/examples/typescript/package.json b/examples/typescript/package.json index a0fc957..2158886 100644 --- a/examples/typescript/package.json +++ b/examples/typescript/package.json @@ -4,7 +4,8 @@ "license": "MIT", "type": "module", "scripts": { - "test": "tsc && node dist/index.js" + "test": "tsc && node dist/index.js", + "typecheck": "tsc --noEmit" }, "dependencies": { "protoscript": "workspace:*" diff --git a/package.json b/package.json index 14459c3..321fdfd 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "protoscript", + "name": "protoscript-dev", "version": "0.0.1", "description": "A Protobuf runtime and code generation tool for JavaScript and TypeScript", "license": "MIT", @@ -15,24 +15,18 @@ } }, "scripts": { - "build:commonjs": "esbuild src/index.ts --bundle --platform=node --target=es2020 --outfile=dist/cjs/index.cjs", - "build:module": "tsc", - "build:wellknowntypes": "(cd ./well-known-types && GENERATE_KNOWN_TYPES=1 pnpm protoscript) && cp ./well-known-types/google/protobuf/* ./src/runtime/well-known-types/", - "clean": "rm -rf dist", + "build:wellknowntypes": "(cd ./packages/well-known-types && GENERATE_KNOWN_TYPES=1 pnpm protoscript && cp google/protobuf/* ../protoscript/src/runtime/well-known-types/)", "e2e:build": "pnpm --filter './e2e/*' run build", "e2e:protoscript": "pnpm --filter './e2e/*' exec protoscript", "e2e:setup": "pnpm e2e:build && pnpm e2e:protoscript", - "examples:regen": "pnpm --filter './examples/*' exec protoscript && pnpm --filter './examples/*' exec tsc --noEmit", - "lint": "pnpm run typecheck && prettier --check . && prettier-package-json --list-different '{,example/,}package.json' && eslint .", - "lint:fix": "prettier --write . && prettier-package-json --write '{,example/}package.json' && eslint --fix .", - "package:build": "pnpm run clean && pnpm run build:commonjs && pnpm run build:module && chmod +x dist/compiler.js dist/cli/index.js && cp src/compiler.cmd dist/compiler.cmd && pnpm run package:prune && pnpm run package:copy:files", - "package:copy:files": "cp ./LICENSE ./README.md dist/ && cp ./public.package.json dist/package.json", - "package:prune": "find dist -name *test* -delete", + "examples:regen": "pnpm --filter './examples/*' exec protoscript", + "lint": "pnpm typecheck && prettier --check . && prettier-package-json --list-different '{,e2e/*,example/,packages/,}package.json' && eslint .", + "lint:fix": "prettier --write . && prettier-package-json --write '{,e2e/*,example/,packages/}package.json' && eslint --fix .", "prepare": "husky install", "regen": "pnpm build:wellknowntypes && pnpm examples:regen && pnpm e2e:protoscript", "test": "jest", "test:ci": "pnpm run e2e:setup && pnpm run test --coverage", - "typecheck": "tsc --noEmit" + "typecheck": "pnpm --recursive run typecheck" }, "dependencies": { "google-protobuf": "^3.21.2" diff --git a/packages/protoscript/.npmignore b/packages/protoscript/.npmignore new file mode 100644 index 0000000..b6ff2cc --- /dev/null +++ b/packages/protoscript/.npmignore @@ -0,0 +1,2 @@ +src +tsconfig.json diff --git a/packages/protoscript/package.json b/packages/protoscript/package.json new file mode 100644 index 0000000..3c7046e --- /dev/null +++ b/packages/protoscript/package.json @@ -0,0 +1,46 @@ +{ + "name": "protoscript", + "version": "0.0.17", + "description": "A Protobuf runtime and code generation tool for JavaScript and TypeScript", + "license": "MIT", + "author": "Tate ", + "repository": { + "type": "git", + "url": "https://github.com/tatethurston/protoscript" + }, + "type": "module", + "main": "./dist/cjs/index.cjs", + "module": "./dist/index.js", + "bin": { + "protoscript": "./dist/cli/index.js" + }, + "scripts": { + "build:commonjs": "esbuild src/index.ts --bundle --platform=node --target=es2020 --outfile=dist/cjs/index.cjs --external:protoscript", + "build:module": "tsc", + "clean": "rm -rf dist", + "package:build": "pnpm run clean && pnpm run build:commonjs && pnpm run build:module && chmod +x dist/compiler.js dist/cli/index.js && cp src/compiler.cmd dist/compiler.cmd && pnpm run package:prune", + "package:prune": "find dist -name *test* -delete", + "typecheck": "tsc --noEmit" + }, + "sideEffects": false, + "types": "./dist/index.d.ts", + "dependencies": { + "google-protobuf": "^3.21.2", + "prettier": "^3.0.0" + }, + "keywords": [ + "protobuf", + "protocol buffers", + "typescript" + ], + "exports": { + "./package.json": "./package.json", + ".": { + "import": "./dist/index.js", + "module": "./dist/index.js", + "require": "./dist/cjs/index.cjs", + "default": "./dist/index.js" + }, + "./plugin": "./dist/plugin.js" + } +} diff --git a/src/cli/core.ts b/packages/protoscript/src/cli/core.ts similarity index 100% rename from src/cli/core.ts rename to packages/protoscript/src/cli/core.ts diff --git a/src/cli/index.ts b/packages/protoscript/src/cli/index.ts similarity index 100% rename from src/cli/index.ts rename to packages/protoscript/src/cli/index.ts diff --git a/src/cli/utils.ts b/packages/protoscript/src/cli/utils.ts similarity index 100% rename from src/cli/utils.ts rename to packages/protoscript/src/cli/utils.ts diff --git a/src/codegen/autogenerate/index.ts b/packages/protoscript/src/codegen/autogenerate/index.ts similarity index 100% rename from src/codegen/autogenerate/index.ts rename to packages/protoscript/src/codegen/autogenerate/index.ts diff --git a/src/codegen/autogenerate/test.ts b/packages/protoscript/src/codegen/autogenerate/test.ts similarity index 100% rename from src/codegen/autogenerate/test.ts rename to packages/protoscript/src/codegen/autogenerate/test.ts diff --git a/src/codegen/compile.ts b/packages/protoscript/src/codegen/compile.ts similarity index 100% rename from src/codegen/compile.ts rename to packages/protoscript/src/codegen/compile.ts diff --git a/src/codegen/utils.ts b/packages/protoscript/src/codegen/utils.ts similarity index 100% rename from src/codegen/utils.ts rename to packages/protoscript/src/codegen/utils.ts diff --git a/src/compiler.cmd b/packages/protoscript/src/compiler.cmd similarity index 100% rename from src/compiler.cmd rename to packages/protoscript/src/compiler.cmd diff --git a/src/compiler.ts b/packages/protoscript/src/compiler.ts similarity index 100% rename from src/compiler.ts rename to packages/protoscript/src/compiler.ts diff --git a/src/index.ts b/packages/protoscript/src/index.ts similarity index 100% rename from src/index.ts rename to packages/protoscript/src/index.ts diff --git a/src/plugin.ts b/packages/protoscript/src/plugin.ts similarity index 100% rename from src/plugin.ts rename to packages/protoscript/src/plugin.ts diff --git a/src/runtime/arith.test.ts b/packages/protoscript/src/runtime/arith.test.ts similarity index 100% rename from src/runtime/arith.test.ts rename to packages/protoscript/src/runtime/arith.test.ts diff --git a/src/runtime/arith.ts b/packages/protoscript/src/runtime/arith.ts similarity index 100% rename from src/runtime/arith.ts rename to packages/protoscript/src/runtime/arith.ts diff --git a/src/runtime/constants.ts b/packages/protoscript/src/runtime/constants.ts similarity index 100% rename from src/runtime/constants.ts rename to packages/protoscript/src/runtime/constants.ts diff --git a/src/runtime/decoder.ts b/packages/protoscript/src/runtime/decoder.ts similarity index 100% rename from src/runtime/decoder.ts rename to packages/protoscript/src/runtime/decoder.ts diff --git a/src/runtime/encoder.ts b/packages/protoscript/src/runtime/encoder.ts similarity index 100% rename from src/runtime/encoder.ts rename to packages/protoscript/src/runtime/encoder.ts diff --git a/src/runtime/goog/asserts.ts b/packages/protoscript/src/runtime/goog/asserts.ts similarity index 100% rename from src/runtime/goog/asserts.ts rename to packages/protoscript/src/runtime/goog/asserts.ts diff --git a/src/runtime/goog/crypt.test.ts b/packages/protoscript/src/runtime/goog/crypt.test.ts similarity index 100% rename from src/runtime/goog/crypt.test.ts rename to packages/protoscript/src/runtime/goog/crypt.test.ts diff --git a/src/runtime/goog/crypt.ts b/packages/protoscript/src/runtime/goog/crypt.ts similarity index 100% rename from src/runtime/goog/crypt.ts rename to packages/protoscript/src/runtime/goog/crypt.ts diff --git a/src/runtime/index.ts b/packages/protoscript/src/runtime/index.ts similarity index 73% rename from src/runtime/index.ts rename to packages/protoscript/src/runtime/index.ts index bf26847..ed2ca66 100644 --- a/src/runtime/index.ts +++ b/packages/protoscript/src/runtime/index.ts @@ -4,10 +4,7 @@ export { decodeBase64Bytes, encodeBase64Bytes } from "./json.js"; export type ByteSource = ArrayBuffer | Uint8Array | number[] | string; export type PartialDeep = { // eslint-disable-next-line @typescript-eslint/no-explicit-any - [P in keyof T]?: T[P] extends any[] - ? T[P] - : // eslint-disable-next-line @typescript-eslint/no-explicit-any - T[P] extends Record + [P in keyof T]?: T[P] extends any[] | Record | Uint8Array ? T[P] : T[P] extends object | null | undefined ? PartialDeep diff --git a/src/runtime/json.ts b/packages/protoscript/src/runtime/json.ts similarity index 100% rename from src/runtime/json.ts rename to packages/protoscript/src/runtime/json.ts diff --git a/src/runtime/reader.ts b/packages/protoscript/src/runtime/reader.ts similarity index 100% rename from src/runtime/reader.ts rename to packages/protoscript/src/runtime/reader.ts diff --git a/src/runtime/utils.test.ts b/packages/protoscript/src/runtime/utils.test.ts similarity index 100% rename from src/runtime/utils.test.ts rename to packages/protoscript/src/runtime/utils.test.ts diff --git a/src/runtime/utils.ts b/packages/protoscript/src/runtime/utils.ts similarity index 100% rename from src/runtime/utils.ts rename to packages/protoscript/src/runtime/utils.ts diff --git a/src/runtime/well-known-types/any.pb.ts b/packages/protoscript/src/runtime/well-known-types/any.pb.ts similarity index 100% rename from src/runtime/well-known-types/any.pb.ts rename to packages/protoscript/src/runtime/well-known-types/any.pb.ts diff --git a/src/runtime/well-known-types/api.pb.ts b/packages/protoscript/src/runtime/well-known-types/api.pb.ts similarity index 100% rename from src/runtime/well-known-types/api.pb.ts rename to packages/protoscript/src/runtime/well-known-types/api.pb.ts diff --git a/src/runtime/well-known-types/duration.pb.ts b/packages/protoscript/src/runtime/well-known-types/duration.pb.ts similarity index 100% rename from src/runtime/well-known-types/duration.pb.ts rename to packages/protoscript/src/runtime/well-known-types/duration.pb.ts diff --git a/src/runtime/well-known-types/empty.pb.ts b/packages/protoscript/src/runtime/well-known-types/empty.pb.ts similarity index 100% rename from src/runtime/well-known-types/empty.pb.ts rename to packages/protoscript/src/runtime/well-known-types/empty.pb.ts diff --git a/src/runtime/well-known-types/field_mask.pb.ts b/packages/protoscript/src/runtime/well-known-types/field_mask.pb.ts similarity index 100% rename from src/runtime/well-known-types/field_mask.pb.ts rename to packages/protoscript/src/runtime/well-known-types/field_mask.pb.ts diff --git a/src/runtime/well-known-types/index.ts b/packages/protoscript/src/runtime/well-known-types/index.ts similarity index 100% rename from src/runtime/well-known-types/index.ts rename to packages/protoscript/src/runtime/well-known-types/index.ts diff --git a/src/runtime/well-known-types/source_context.pb.ts b/packages/protoscript/src/runtime/well-known-types/source_context.pb.ts similarity index 100% rename from src/runtime/well-known-types/source_context.pb.ts rename to packages/protoscript/src/runtime/well-known-types/source_context.pb.ts diff --git a/src/runtime/well-known-types/struct.pb.ts b/packages/protoscript/src/runtime/well-known-types/struct.pb.ts similarity index 100% rename from src/runtime/well-known-types/struct.pb.ts rename to packages/protoscript/src/runtime/well-known-types/struct.pb.ts diff --git a/src/runtime/well-known-types/timestamp.pb.ts b/packages/protoscript/src/runtime/well-known-types/timestamp.pb.ts similarity index 100% rename from src/runtime/well-known-types/timestamp.pb.ts rename to packages/protoscript/src/runtime/well-known-types/timestamp.pb.ts diff --git a/src/runtime/well-known-types/type.pb.ts b/packages/protoscript/src/runtime/well-known-types/type.pb.ts similarity index 100% rename from src/runtime/well-known-types/type.pb.ts rename to packages/protoscript/src/runtime/well-known-types/type.pb.ts diff --git a/src/runtime/well-known-types/wrappers.pb.ts b/packages/protoscript/src/runtime/well-known-types/wrappers.pb.ts similarity index 100% rename from src/runtime/well-known-types/wrappers.pb.ts rename to packages/protoscript/src/runtime/well-known-types/wrappers.pb.ts diff --git a/src/runtime/writer.ts b/packages/protoscript/src/runtime/writer.ts similarity index 100% rename from src/runtime/writer.ts rename to packages/protoscript/src/runtime/writer.ts diff --git a/packages/protoscript/tsconfig.json b/packages/protoscript/tsconfig.json new file mode 100644 index 0000000..dfa32f8 --- /dev/null +++ b/packages/protoscript/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "dist" + }, + "exclude": ["dist"] +} diff --git a/well-known-types/package.json b/packages/well-known-types/package.json similarity index 80% rename from well-known-types/package.json rename to packages/well-known-types/package.json index c74c1d6..ba095bd 100644 --- a/well-known-types/package.json +++ b/packages/well-known-types/package.json @@ -3,6 +3,9 @@ "main": "index.js", "license": "MIT", "type": "module", + "scripts": { + "typecheck": "tsc --noEmit" + }, "dependencies": { "protoscript": "workspace:*" }, diff --git a/packages/well-known-types/tsconfig.json b/packages/well-known-types/tsconfig.json new file mode 100644 index 0000000..d2e9a52 --- /dev/null +++ b/packages/well-known-types/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "dist" + } +} diff --git a/well-known-types/well_known_types.pb.js b/packages/well-known-types/well_known_types.pb.js similarity index 100% rename from well-known-types/well_known_types.pb.js rename to packages/well-known-types/well_known_types.pb.js diff --git a/well-known-types/well_known_types.proto b/packages/well-known-types/well_known_types.proto similarity index 100% rename from well-known-types/well_known_types.proto rename to packages/well-known-types/well_known_types.proto diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b8568a0..dec70b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,32 +64,23 @@ importers: specifier: ^5.1.6 version: 5.1.6 - dist: - dependencies: - google-protobuf: - specifier: ^3.21.2 - version: 3.21.2 - prettier: - specifier: ^3.0.0 - version: 3.0.0 - e2e/conformance: dependencies: protoscript: specifier: workspace:* - version: link:../../dist + version: link:../../packages/protoscript e2e/serialization: dependencies: protoscript: specifier: workspace:* - version: link:../../dist + version: link:../../packages/protoscript e2e/treeshaking: dependencies: protoscript: specifier: workspace:* - version: link:../../dist + version: link:../../packages/protoscript devDependencies: esbuild: specifier: ^0.18.16 @@ -99,7 +90,7 @@ importers: dependencies: protoscript: specifier: workspace:* - version: link:../../dist + version: link:../../packages/protoscript devDependencies: google-closure-compiler: specifier: ^20230502.0.0 @@ -109,7 +100,7 @@ importers: dependencies: protoscript: specifier: workspace:* - version: link:../../dist + version: link:../../packages/protoscript examples/protoc: dependencies: @@ -118,23 +109,32 @@ importers: version: 3.21.2 protoscript: specifier: workspace:* - version: link:../../dist + version: link:../../packages/protoscript examples/typescript: dependencies: protoscript: specifier: workspace:* - version: link:../../dist + version: link:../../packages/protoscript devDependencies: typescript: specifier: ^5.1.6 version: 5.1.6 - well-known-types: + packages/protoscript: + dependencies: + google-protobuf: + specifier: ^3.21.2 + version: 3.21.2 + prettier: + specifier: ^3.0.0 + version: 3.0.0 + + packages/well-known-types: dependencies: protoscript: specifier: workspace:* - version: link:../dist + version: link:../protoscript devDependencies: typescript: specifier: ^5.1.6 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 33ed98e..305bf93 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,4 @@ packages: - - "dist" - "examples/*" - "e2e/*" - - "well-known-types" + - "packages/*" diff --git a/public.package.json b/public.package.json deleted file mode 100644 index 9fa92aa..0000000 --- a/public.package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "protoscript", - "version": "0.0.16", - "description": "A Protobuf runtime and code generation tool for JavaScript and TypeScript", - "license": "MIT", - "author": "Tate ", - "repository": { - "type": "git", - "url": "https://github.com/tatethurston/protoscript" - }, - "type": "module", - "main": "./cjs/index.cjs", - "module": "./index.js", - "bin": { - "protoscript": "./cli/index.js" - }, - "sideEffects": false, - "types": "./index.d.ts", - "dependencies": { - "google-protobuf": "^3.21.2", - "prettier": "^3.0.0" - }, - "keywords": ["protobuf", "protocol buffers", "typescript"], - "exports": { - "./package.json": "./package.json", - ".": { - "import": "./index.js", - "module": "./index.js", - "require": "./cjs/index.cjs", - "default": "./index.js" - }, - "./plugin": "./plugin.js" - } -} diff --git a/tsconfig.json b/tsconfig.json index 36d6d96..648aaa1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,6 +16,5 @@ "strict": true, "declaration": true, "target": "ES2020" - }, - "include": ["src/**/*"] + } } diff --git a/well-known-types/tsconfig.json b/well-known-types/tsconfig.json deleted file mode 100644 index ede1afa..0000000 --- a/well-known-types/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "rootDir": "src", - "outDir": "dist" - }, - "include": ["src"] -} diff --git a/well-known-types/well_known_types.pb.ts b/well-known-types/well_known_types.pb.ts deleted file mode 100644 index b777b87..0000000 --- a/well-known-types/well_known_types.pb.ts +++ /dev/null @@ -1,3 +0,0 @@ -// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -// Source: well_known_types.proto -/* eslint-disable */ From 71d3e0a32327a08503ff72ec235037e4d2ea67d6 Mon Sep 17 00:00:00 2001 From: Tate Thurston Date: Sun, 23 Jul 2023 17:47:13 -0700 Subject: [PATCH 2/2] exclude uint8array from nonnullable --- packages/protoscript/src/runtime/index.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/protoscript/src/runtime/index.ts b/packages/protoscript/src/runtime/index.ts index ed2ca66..187ca7f 100644 --- a/packages/protoscript/src/runtime/index.ts +++ b/packages/protoscript/src/runtime/index.ts @@ -3,10 +3,11 @@ export { BinaryWriter } from "./writer.js"; export { decodeBase64Bytes, encodeBase64Bytes } from "./json.js"; export type ByteSource = ArrayBuffer | Uint8Array | number[] | string; export type PartialDeep = { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - [P in keyof T]?: T[P] extends any[] | Record | Uint8Array + /* eslint-disable @typescript-eslint/no-explicit-any */ + [P in keyof T]?: NonNullable extends any[] | Uint8Array ? T[P] - : T[P] extends object | null | undefined + : NonNullable extends object ? PartialDeep : T[P]; + /* eslint-enable @typescript-eslint/no-explicit-any */ };