@checkdigit/typescript-config 7.0.0-PR.54-457d → 7.0.0-PR.54-a1c4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License
2
2
 
3
- Copyright (c) 2021-2023 Check Digit, LLC
3
+ Copyright (c) 2021-2024 Check Digit, LLC
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![MIT License](https://img.shields.io/github/license/checkdigit/typescript-config)](https://github.com/checkdigit/typescript-config/blob/master/LICENSE.txt)
4
4
 
5
- Copyright (c) 2022-2024 [Check Digit, LLC](https://checkdigit.com)
5
+ Copyright (c) 20222024 [Check Digit, LLC](https://checkdigit.com)
6
6
 
7
7
  ### Introduction
8
8
 
@@ -12,23 +12,23 @@ This module contains the standard Check Digit Typescript configuration, along wi
12
12
 
13
13
  - currently requires Node 20.11 or above.
14
14
  - emits `esnext`, with the default libraries, to avoid down-leveling. It is intended that application spec tests pick
15
- up any issues with using newer features unavailable in a particular environment. Browsers and NodeJS are fast moving
15
+ up any issues with using newer features unavailable in a particular environment. Browsers and NodeJS are fast-moving
16
16
  targets, and can add language features at any time.
17
- - uses the `module` type of `commonjs`.
17
+ - uses the `module` type of `esnext`.
18
18
  - all compiler options set for maximum strictness.
19
19
 
20
20
  ### Builder
21
21
 
22
- `builder` is a command line tool that generates either CommonJS or ESM modules, from Typescript source. It is intended
23
- to be used when publishing a package to NPM, or to bundle a package for deployment. It uses `tsc` for generating
24
- types, and `esbuild` for generating code.
22
+ `builder` is a command line tool that generates either CommonJS or ESM modules, from the Typescript source.
23
+ It is intended to be used when publishing a package to NPM, or to bundle a package for deployment.
24
+ It uses `tsc` for generating types, and `esbuild` for generating code.
25
25
 
26
26
  **Note:** if building an ESM bundle, the `require` function will be defined as a global variable, to allow
27
27
  dynamic `require`s by CommonJS submodules. This is not a problem for NodeJS, but will cause issues in a browser environment.
28
28
 
29
29
  #### Options
30
30
 
31
- - `--type` the type of output to generate. Defaults to `module` (ESM). Valid values are `commonjs`, `module` or `types`.
31
+ - `--type` the type of output to generate. Defaults to `module` (ESM). Valid values are `module` or `types`.
32
32
  - `--entryPoint` the entry point for the bundle, relative to the inDir. if not provided, the files in the inDir will
33
33
  be processed as individual unbundled files.
34
34
  - `--inDir` the input source code directory.
@@ -42,12 +42,6 @@ dynamic `require`s by CommonJS submodules. This is not a problem for NodeJS, but
42
42
  #### Examples
43
43
 
44
44
  ```
45
- # build commonjs .cjs files from Typescript source
46
- npx builder --type=commonjs --outDir=build-cjs
47
-
48
- # build single-file commonjs .cjs bundle from Typescript source
49
- npx builder --type=commonjs --entryPoint=index.ts --outDir=build-cjs-bundle --outFile=index.cjs
50
-
51
45
  # build ESM .mjs files from Typescript source
52
46
  npx builder --type=module --outDir=build-esm
53
47
 
@@ -75,10 +69,10 @@ the new version of Typescript, and/or without emitting warnings during these tes
75
69
 
76
70
  Strict semver is a little complicated, as Typescript itself does not adhere to semver. So our "best effort" policy is:
77
71
 
78
- - Each update to the minimum Node target (e.g. Node 18 to Node 20), or a change to a major compiler output option
72
+ - Each update to the minimum Node target (e.g., Node 18 to Node 20), or a change to a major compiler output option
79
73
  (e.g. `module`, `target` or `moduleResolution`) will result in a new major version of this module.
80
- We coordinate this with whatever the latest LTS version of Node is currently supported by Amazon Lambda, Google Cloud Functions
81
- and Azure Functions.
74
+ We coordinate this with whatever the latest LTS version of Node is currently supported by Amazon Lambda,
75
+ Google Cloud Functions, and Azure Functions.
82
76
  - Each new "major" version of Typescript (e.g. `4.2.x` to `4.3.x`) will result in a new minor version of this module.
83
77
  - A new minor update of Typescript (e.g. `4.3.1` to `4.3.2`) _may_ result in a patch, in
84
78
  a situation where a specific need or issue requires setting a new minimum version of Typescript.
package/bin/builder.mjs CHANGED
@@ -1,12 +1,39 @@
1
1
  #!/usr/bin/env node
2
- // src/builder/index.mts
2
+ // src/builder.ts
3
3
  import { strict as assert3 } from "node:assert";
4
4
  import { promises as fs2 } from "node:fs";
5
5
  import path2 from "node:path";
6
6
  import { parseArgs } from "node:util";
7
7
 
8
- // src/builder/builder.mts
8
+ // src/analyze.ts
9
9
  import { strict as assert } from "node:assert";
10
+ function analyze(metafile) {
11
+ const source = new Set(Object.keys(metafile.inputs).filter((key) => !key.startsWith("node_modules")));
12
+ const modules = new Set(Object.keys(metafile.inputs).filter((key) => key.startsWith("node_modules")));
13
+ const [output] = Object.entries(metafile.outputs);
14
+ assert.ok(output !== void 0);
15
+ const [, bundle] = output;
16
+ const sourceBytes = Object.entries(bundle.inputs).reduce((bytes, [file, value]) => {
17
+ if (source.has(file)) {
18
+ return bytes + value.bytesInOutput;
19
+ }
20
+ return bytes;
21
+ }, 0);
22
+ const moduleBytes = Object.entries(bundle.inputs).reduce((bytes, [file, value]) => {
23
+ if (modules.has(file)) {
24
+ return bytes + value.bytesInOutput;
25
+ }
26
+ return bytes;
27
+ }, 0);
28
+ return {
29
+ sourceBytes,
30
+ moduleBytes,
31
+ totalBytes: bundle.bytes
32
+ };
33
+ }
34
+
35
+ // src/compile.ts
36
+ import { strict as assert2 } from "node:assert";
10
37
  import { promises as fs } from "node:fs";
11
38
  import path from "node:path";
12
39
  import typescript from "typescript";
@@ -62,7 +89,7 @@ function resolveTypescriptPaths() {
62
89
  });
63
90
  };
64
91
  }
65
- async function builder_default({
92
+ async function compile_default({
66
93
  type: type2,
67
94
  entryPoint: entryPoint2,
68
95
  inDir: inDir2,
@@ -74,7 +101,7 @@ async function builder_default({
74
101
  workingDirectory = process.cwd()
75
102
  }) {
76
103
  const messages = [];
77
- assert.ok(
104
+ assert2.ok(
78
105
  entryPoint2 === void 0 && outFile2 === void 0 || entryPoint2 !== void 0 && outFile2 !== void 0,
79
106
  "entryPoint and outFile must both be provided"
80
107
  );
@@ -122,7 +149,7 @@ async function builder_default({
122
149
  ]);
123
150
  for (const diagnostic of allDiagnostics) {
124
151
  if (diagnostic.file) {
125
- assert.ok(diagnostic.start !== void 0);
152
+ assert2.ok(diagnostic.start !== void 0);
126
153
  const { line, character } = typescript.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
127
154
  const message = typescript.flattenDiagnosticMessageText(diagnostic.messageText, "\n");
128
155
  messages.push(`tsc: ${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`);
@@ -138,7 +165,7 @@ async function builder_default({
138
165
  outputFiles: declarationFiles
139
166
  };
140
167
  }
141
- const buildResult2 = await build({
168
+ const buildResult = await build({
142
169
  entryPoints: productionSourceFiles,
143
170
  bundle: true,
144
171
  minify: minify2,
@@ -176,42 +203,15 @@ async function builder_default({
176
203
  ]
177
204
  }
178
205
  });
179
- messages.push(...buildResult2.errors.map((error) => `esbuild error: ${error.text}`));
180
- messages.push(...buildResult2.warnings.map((warning) => `esbuild warning: ${warning.text}`));
206
+ messages.push(...buildResult.errors.map((error) => `esbuild error: ${error.text}`));
207
+ messages.push(...buildResult.warnings.map((warning) => `esbuild warning: ${warning.text}`));
181
208
  if (messages.length > 0) {
182
209
  throw new Error(`esbuild failed ${JSON.stringify(messages)}`);
183
210
  }
184
- return buildResult2;
185
- }
186
-
187
- // src/builder/analyze.mts
188
- import { strict as assert2 } from "node:assert";
189
- function analyze(metafile) {
190
- const source = new Set(Object.keys(metafile.inputs).filter((key) => !key.startsWith("node_modules")));
191
- const modules = new Set(Object.keys(metafile.inputs).filter((key) => key.startsWith("node_modules")));
192
- const [output] = Object.entries(metafile.outputs);
193
- assert2.ok(output !== void 0);
194
- const [, bundle] = output;
195
- const sourceBytes = Object.entries(bundle.inputs).reduce((bytes, [file, value]) => {
196
- if (source.has(file)) {
197
- return bytes + value.bytesInOutput;
198
- }
199
- return bytes;
200
- }, 0);
201
- const moduleBytes = Object.entries(bundle.inputs).reduce((bytes, [file, value]) => {
202
- if (modules.has(file)) {
203
- return bytes + value.bytesInOutput;
204
- }
205
- return bytes;
206
- }, 0);
207
- return {
208
- sourceBytes,
209
- moduleBytes,
210
- totalBytes: bundle.bytes
211
- };
211
+ return buildResult;
212
212
  }
213
213
 
214
- // src/builder/index.mts
214
+ // src/builder.ts
215
215
  var {
216
216
  values: { type, inDir, outDir, entryPoint, outFile, external, minify, sourceMap }
217
217
  } = parseArgs({
@@ -229,7 +229,7 @@ var {
229
229
  assert3.ok(type === "module" || type === "types", "type must be types or module");
230
230
  assert3.ok(inDir !== void 0, "inDir is required");
231
231
  assert3.ok(outDir !== void 0, "outDir is required");
232
- var buildResult = await builder_default({
232
+ var compileResult = await compile_default({
233
233
  type,
234
234
  inDir: path2.join(process.cwd(), inDir),
235
235
  outDir: path2.join(process.cwd(), outDir),
@@ -240,14 +240,14 @@ var buildResult = await builder_default({
240
240
  sourceMap
241
241
  });
242
242
  await Promise.all(
243
- buildResult.outputFiles.map(async (file) => {
243
+ compileResult.outputFiles.map(async (file) => {
244
244
  await fs2.mkdir(path2.join(path2.dirname(file.path)), { recursive: true });
245
245
  await fs2.writeFile(file.path, file.text);
246
246
  })
247
247
  );
248
- if (buildResult.metafile !== void 0) {
249
- const analysis = analyze(buildResult.metafile);
250
- await fs2.writeFile(path2.join(outDir, "metafile.json"), JSON.stringify(buildResult.metafile, void 0, 2));
248
+ if (compileResult.metafile !== void 0) {
249
+ const analysis = analyze(compileResult.metafile);
250
+ await fs2.writeFile(path2.join(outDir, "metafile.json"), JSON.stringify(compileResult.metafile, void 0, 2));
251
251
  console.log(
252
252
  `${outFile}: src ${analysis.sourceBytes}, node_modules ${analysis.moduleBytes}, total ${analysis.totalBytes}`
253
253
  );
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@checkdigit/typescript-config","version":"7.0.0-PR.54-457d","description":"Check Digit standard Typescript configuration","prettier":"@checkdigit/prettier-config","engines":{"node":">=20.11"},"bin":{"builder":"./bin/builder.mjs"},"peerDependencies":{"@types/node":">=20.11","esbuild":"0.20.0","typescript":"5.4.0-beta"},"repository":{"type":"git","url":"git+https://github.com/checkdigit/typescript-config.git"},"author":"Check Digit, LLC","license":"MIT","bugs":{"url":"https://github.com/checkdigit/typescript-config/issues"},"homepage":"https://github.com/checkdigit/typescript-config#readme","scripts":{"prepublishOnly":"npm run build-builder","lint:fix":"eslint --ignore-path .gitignore . --fix","lint":"eslint --max-warnings 0 --ignore-path .gitignore .","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style","build-builder":"esbuild src/builder/index.mts --bundle --platform=node --format=esm --external:typescript --external:esbuild --outfile=build-builder/builder.mjs && mkdir -p bin && { echo '#!/usr/bin/env node'; cat build-builder/builder.mjs; } > bin/builder.mjs && chmod +x bin/builder.mjs","build-types":"rimraf build-types && bin/builder.mjs --type=types --outDir=build-types","build-mjs":"rimraf build-mjs && bin/builder.mjs --type=module --outDir=build-mjs","build-mjs-bundle":"rimraf build-mjs-bundle && bin/builder.mjs --type=module --outDir=build-mjs-bundle --entryPoint=test/index.test.ts --outFile=test/index.test.mjs","build-mjs-bundle-minify":"rimraf build-mjs-bundle-minify && bin/builder.mjs --type=module --minify --outDir=build-mjs-bundle-minify --entryPoint=test/index.test.ts --outFile=test/index.test.mjs","build-mjs-bundle-no-external":"rimraf build-mjs-bundle-no-external && bin/builder.mjs --type=module --external=./node_modules/* --outDir=build-mjs-bundle-no-external --entryPoint=test/index.test.ts --outFile=test/index.test.mjs --minify","test-jest-mjs":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false src/*.mts src/*/*.mts src/*/*/*.mts","test-mjs":"node --test build-mjs/test/index.test.mjs","test-mjs-bundle":"node --test build-mjs-bundle/test/index.test.mjs","test-mjs-bundle-minify":"node --test build-mjs-bundle-minify/test/index.test.mjs","test-mjs-bundle-no-external":"node --test build-mjs-bundle-no-external/test/index.test.mjs","ci:test":"npm run test-jest-mjs && npm run test-mjs && npm run test-mjs-bundle && npm run test-mjs-bundle-no-external","ci:compile":"tsc --noEmit && npm run build-builder && npm run build-types && npm run build-mjs && npm run build-mjs-bundle && npm run build-mjs-bundle-minify && npm run build-mjs-bundle-no-external","ci:lint":"npm run lint","ci:style":"npm run prettier"},"devDependencies":{"@apidevtools/json-schema-ref-parser":"^11.1.0","@checkdigit/prettier-config":"^5.2.0","@types/debug":"^4.1.12","@types/jest":"^29.5.11","@types/uuid":"^9.0.8","@typescript-eslint/eslint-plugin":"^6.20.0","@typescript-eslint/parser":"^6.20.0","debug":"^4.3.4","eslint":"^8.56.0","eslint-config-prettier":"^9.1.0","get-port":"^7.0.0","got":"^11.8.6","jest":"^29.7.0","node-fetch":"^3.3.2","rimraf":"^5.0.5","ts-jest":"^29.1.2","uuid":"^9.0.1"},"eslintConfig":{"parser":"@typescript-eslint/parser","plugins":["@typescript-eslint"],"parserOptions":{"project":"./tsconfig.json"},"extends":["eslint:all","plugin:@typescript-eslint/recommended","plugin:@typescript-eslint/recommended-requiring-type-checking","plugin:@typescript-eslint/strict","prettier"],"rules":{"@typescript-eslint/non-nullable-type-assertion-style":"error","capitalized-comments":"off","one-var":"off","sort-keys":"off","sort-imports":"off","max-lines":["error",{"max":500,"skipBlankLines":true,"skipComments":true}],"func-style":["error","declaration",{"allowArrowFunctions":true}],"no-magic-numbers":["error",{"ignore":[0,1,2]}],"no-undefined":"off","no-ternary":"off"},"overrides":[{"files":["*.spec.mts","*.test.mts","*.spec.ts","*.test.ts"],"rules":{"@typescript-eslint/non-nullable-type-assertion-style":"off","@typescript-eslint/ban-types":"off","@typescript-eslint/require-await":"off","@typescript-eslint/consistent-type-definitions":"off","@typescript-eslint/ban-ts-comment":"off","@typescript-eslint/no-unnecessary-condition":"off","@typescript-eslint/consistent-indexed-object-style":"off","@typescript-eslint/no-unused-vars":"off","@typescript-eslint/no-unsafe-member-access":"off","line-comment-position":"off","no-fallthrough":"off","no-inline-comments":"off","no-param-reassign":"off","id-length":"off","no-magic-numbers":"off","func-names":"off","no-duplicate-imports":"off","symbol-description":"off","no-invalid-this":"off","max-lines-per-function":"off","max-lines":"off","max-statements":"off","no-await-in-loop":"off"}}]},"jest":{"moduleFileExtensions":["js","mjs","cjs","ts","mts","json","node"],"extensionsToTreatAsEsm":[".mts"],"transform":{"^.+\\.mts$":["ts-jest",{"isolatedModules":true,"diagnostics":false,"useESM":true}],"^.+\\.ts$":["ts-jest",{"isolatedModules":true,"diagnostics":false,"useESM":false}]},"collectCoverageFrom":["<rootDir>/src/**"],"testMatch":["<rootDir>/src/**/*.spec.ts","<rootDir>/src/**/*.spec.mts"]},"files":["bin","tsconfig.json","SECURITY.md"],"overrides":{"typescript":"5.4.0-beta"}}
1
+ {"name":"@checkdigit/typescript-config","version":"7.0.0-PR.54-a1c4","description":"Check Digit standard Typescript configuration","prettier":"@checkdigit/prettier-config","engines":{"node":">=20.11"},"type":"module","bin":{"builder":"./bin/builder.mjs"},"peerDependencies":{"@types/node":">=20.11","esbuild":"0.20.0","typescript":"5.4.0-beta"},"repository":{"type":"git","url":"git+https://github.com/checkdigit/typescript-config.git"},"author":"Check Digit, LLC","license":"MIT","bugs":{"url":"https://github.com/checkdigit/typescript-config/issues"},"homepage":"https://github.com/checkdigit/typescript-config#readme","scripts":{"prepublishOnly":"npm run build-builder","lint:fix":"eslint --ignore-path .gitignore . --fix","lint":"eslint --max-warnings 0 --ignore-path .gitignore .","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style","build-builder":"esbuild src/builder.ts --bundle --platform=node --format=esm --external:typescript --external:esbuild --outfile=build-builder/builder.mjs && mkdir -p bin && { echo '#!/usr/bin/env node'; cat build-builder/builder.mjs; } > bin/builder.mjs && chmod +x bin/builder.mjs","build-types":"rimraf build-types && bin/builder.mjs --type=types --outDir=build-types","build-mjs":"rimraf build-mjs && bin/builder.mjs --type=module --outDir=build-mjs","build-mjs-bundle":"rimraf build-mjs-bundle && bin/builder.mjs --type=module --outDir=build-mjs-bundle --entryPoint=test/index.test.ts --outFile=test/index.test.mjs","build-mjs-bundle-minify":"rimraf build-mjs-bundle-minify && bin/builder.mjs --type=module --minify --outDir=build-mjs-bundle-minify --entryPoint=test/index.test.ts --outFile=test/index.test.mjs","build-mjs-bundle-no-external":"rimraf build-mjs-bundle-no-external && bin/builder.mjs --type=module --external=./node_modules/* --outDir=build-mjs-bundle-no-external --entryPoint=test/index.test.ts --outFile=test/index.test.mjs --minify","test-jest-mjs":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","test-mjs":"node --test build-mjs/test/index.test.mjs","test-mjs-bundle":"node --test build-mjs-bundle/test/index.test.mjs","test-mjs-bundle-minify":"node --test build-mjs-bundle-minify/test/index.test.mjs","test-mjs-bundle-no-external":"node --test build-mjs-bundle-no-external/test/index.test.mjs","ci:test":"npm run test-jest-mjs && npm run test-mjs && npm run test-mjs-bundle && npm run test-mjs-bundle-no-external","ci:compile":"tsc --noEmit && npm run build-builder && npm run build-types && npm run build-mjs && npm run build-mjs-bundle && npm run build-mjs-bundle-minify && npm run build-mjs-bundle-no-external","ci:lint":"npm run lint","ci:style":"npm run prettier"},"devDependencies":{"@apidevtools/json-schema-ref-parser":"^11.1.0","@checkdigit/prettier-config":"^5.2.0","@types/debug":"^4.1.12","@types/jest":"^29.5.11","@types/uuid":"^9.0.8","@typescript-eslint/eslint-plugin":"^6.20.0","@typescript-eslint/parser":"^6.20.0","debug":"^4.3.4","eslint":"^8.56.0","eslint-config-prettier":"^9.1.0","jest":"^29.7.0","node-fetch":"^3.3.2","rimraf":"^5.0.5","ts-jest":"^29.1.2","uuid":"^9.0.1"},"eslintConfig":{"parser":"@typescript-eslint/parser","plugins":["@typescript-eslint"],"parserOptions":{"project":"./tsconfig.json"},"extends":["eslint:all","plugin:@typescript-eslint/recommended","plugin:@typescript-eslint/recommended-requiring-type-checking","plugin:@typescript-eslint/strict","prettier"],"rules":{"@typescript-eslint/non-nullable-type-assertion-style":"error","capitalized-comments":"off","one-var":"off","sort-keys":"off","sort-imports":"off","max-lines":["error",{"max":500,"skipBlankLines":true,"skipComments":true}],"func-style":["error","declaration",{"allowArrowFunctions":true}],"no-magic-numbers":["error",{"ignore":[0,1,2]}],"no-undefined":"off","no-ternary":"off"},"overrides":[{"files":["*.spec.ts","*.test.ts"],"rules":{"@typescript-eslint/non-nullable-type-assertion-style":"off","@typescript-eslint/ban-types":"off","@typescript-eslint/require-await":"off","@typescript-eslint/consistent-type-definitions":"off","@typescript-eslint/ban-ts-comment":"off","@typescript-eslint/no-unnecessary-condition":"off","@typescript-eslint/consistent-indexed-object-style":"off","@typescript-eslint/no-unused-vars":"off","@typescript-eslint/no-unsafe-member-access":"off","line-comment-position":"off","no-fallthrough":"off","no-inline-comments":"off","no-param-reassign":"off","id-length":"off","no-magic-numbers":"off","func-names":"off","no-duplicate-imports":"off","symbol-description":"off","no-invalid-this":"off","max-lines-per-function":"off","max-lines":"off","max-statements":"off","no-await-in-loop":"off"}}]},"jest":{"moduleFileExtensions":["js","mjs","cjs","ts","json","node"],"extensionsToTreatAsEsm":[".ts"],"transform":{"^.+\\.ts$":["ts-jest",{"isolatedModules":true,"diagnostics":false,"useESM":true}]},"collectCoverageFrom":["<rootDir>/src/**"],"testMatch":["<rootDir>/src/**/*.spec.ts"]},"files":["bin","tsconfig.json","SECURITY.md"],"overrides":{"typescript":"5.4.0-beta"}}