@checkdigit/typescript-config 5.2.0-PR.47-e8bc → 6.0.0-PR.47-da40

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/README.md CHANGED
@@ -10,7 +10,7 @@ This module contains the standard Check Digit Typescript configuration, along wi
10
10
 
11
11
  ### Typescript Configuration
12
12
 
13
- - currently requires Node 18 or above.
13
+ - currently requires Node 20 or above.
14
14
  - emits `esnext`, with the default libraries, to avoid down-leveling. It is intended that application spec tests pick
15
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.
package/bin/builder.mjs CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  // src/builder/index.mts
3
- import { strict as assert2 } from "node:assert";
3
+ import { strict as assert3 } from "node:assert";
4
+ import { promises as fs2 } from "node:fs";
4
5
  import path2 from "node:path";
5
6
  import { parseArgs } from "node:util";
6
7
 
@@ -70,9 +71,10 @@ async function builder_default({
70
71
  outFile: outFile2,
71
72
  external: external2 = [],
72
73
  minify: minify2 = false,
73
- sourceMap: sourceMap2
74
+ sourceMap: sourceMap2,
75
+ workingDirectory = process.cwd()
74
76
  }) {
75
- const messages2 = [];
77
+ const messages = [];
76
78
  assert.ok(
77
79
  entryPoint2 === void 0 && outFile2 === void 0 || entryPoint2 !== void 0 && outFile2 !== void 0,
78
80
  "entryPoint and outFile must both be provided"
@@ -111,7 +113,10 @@ async function builder_default({
111
113
  useUnknownInCatchVariables: true,
112
114
  exactOptionalPropertyTypes: true
113
115
  });
114
- const emitResult = program.emit();
116
+ const declarationFiles = [];
117
+ const emitResult = program.emit(void 0, (fileName, data) => {
118
+ declarationFiles.push({ path: fileName, text: data });
119
+ });
115
120
  const allDiagnostics = typescript.sortAndDeduplicateDiagnostics([
116
121
  ...typescript.getPreEmitDiagnostics(program),
117
122
  ...emitResult.diagnostics
@@ -121,23 +126,29 @@ async function builder_default({
121
126
  assert.ok(diagnostic.start !== void 0);
122
127
  const { line, character } = typescript.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
123
128
  const message = typescript.flattenDiagnosticMessageText(diagnostic.messageText, "\n");
124
- messages2.push(`tsc: ${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`);
129
+ messages.push(`tsc: ${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`);
125
130
  } else {
126
- messages2.push(`tsc: ${typescript.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`);
131
+ messages.push(`tsc: ${typescript.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`);
127
132
  }
128
133
  }
129
- if (messages2.length > 0) {
130
- throw new Error(`tsc failed ${JSON.stringify(messages2)}`);
134
+ if (messages.length > 0) {
135
+ throw new Error(`tsc failed ${JSON.stringify(messages)}`);
131
136
  }
132
137
  if (type2 === "types") {
133
- return [];
138
+ return {
139
+ outputFiles: declarationFiles
140
+ };
134
141
  }
135
- const buildResult = await build({
142
+ const buildResult2 = await build({
136
143
  entryPoints: productionSourceFiles,
137
144
  bundle: true,
138
145
  minify: minify2,
146
+ absWorkingDir: workingDirectory,
139
147
  platform: "node",
140
148
  format: type2 === "module" ? "esm" : "cjs",
149
+ treeShaking: type2 === "module",
150
+ write: false,
151
+ metafile: outFile2 !== void 0,
141
152
  sourcesContent: false,
142
153
  banner: type2 === "module" && outFile2 !== void 0 ? {
143
154
  js: commonJsCompatabilityBanner
@@ -166,12 +177,39 @@ async function builder_default({
166
177
  ]
167
178
  }
168
179
  });
169
- messages2.push(...buildResult.errors.map((error) => `esbuild error: ${error.text}`));
170
- messages2.push(...buildResult.warnings.map((warning) => `esbuild warning: ${warning.text}`));
171
- if (messages2.length > 0) {
172
- throw new Error(`esbuild failed ${JSON.stringify(messages2)}`);
180
+ messages.push(...buildResult2.errors.map((error) => `esbuild error: ${error.text}`));
181
+ messages.push(...buildResult2.warnings.map((warning) => `esbuild warning: ${warning.text}`));
182
+ if (messages.length > 0) {
183
+ throw new Error(`esbuild failed ${JSON.stringify(messages)}`);
173
184
  }
174
- return messages2;
185
+ return buildResult2;
186
+ }
187
+
188
+ // src/builder/analyze.mts
189
+ import { strict as assert2 } from "node:assert";
190
+ function analyze(metafile) {
191
+ const source = new Set(Object.keys(metafile.inputs).filter((key) => !key.startsWith("node_modules")));
192
+ const modules = new Set(Object.keys(metafile.inputs).filter((key) => key.startsWith("node_modules")));
193
+ const [output] = Object.entries(metafile.outputs);
194
+ assert2.ok(output !== void 0);
195
+ const [, bundle] = output;
196
+ const sourceBytes = Object.entries(bundle.inputs).reduce((bytes, [file, value]) => {
197
+ if (source.has(file)) {
198
+ return bytes + value.bytesInOutput;
199
+ }
200
+ return bytes;
201
+ }, 0);
202
+ const moduleBytes = Object.entries(bundle.inputs).reduce((bytes, [file, value]) => {
203
+ if (modules.has(file)) {
204
+ return bytes + value.bytesInOutput;
205
+ }
206
+ return bytes;
207
+ }, 0);
208
+ return {
209
+ sourceBytes,
210
+ moduleBytes,
211
+ totalBytes: bundle.bytes
212
+ };
175
213
  }
176
214
 
177
215
  // src/builder/index.mts
@@ -189,10 +227,10 @@ var {
189
227
  sourceMap: { type: "boolean", short: "s", default: false }
190
228
  }
191
229
  });
192
- assert2.ok(type === "module" || type === "commonjs" || type === "types", "type must be types, module or commonjs");
193
- assert2.ok(inDir !== void 0, "inDir is required");
194
- assert2.ok(outDir !== void 0, "outDir is required");
195
- var messages = await builder_default({
230
+ assert3.ok(type === "module" || type === "commonjs" || type === "types", "type must be types, module or commonjs");
231
+ assert3.ok(inDir !== void 0, "inDir is required");
232
+ assert3.ok(outDir !== void 0, "outDir is required");
233
+ var buildResult = await builder_default({
196
234
  type,
197
235
  inDir: path2.join(process.cwd(), inDir),
198
236
  outDir: path2.join(process.cwd(), outDir),
@@ -202,7 +240,16 @@ var messages = await builder_default({
202
240
  minify,
203
241
  sourceMap
204
242
  });
205
- if (messages.length > 0) {
206
- console.warn(JSON.stringify(messages, void 0, 2));
207
- process.exit(1);
243
+ await Promise.all(
244
+ buildResult.outputFiles.map(async (file) => {
245
+ await fs2.mkdir(path2.join(path2.dirname(file.path)), { recursive: true });
246
+ await fs2.writeFile(file.path, file.text);
247
+ })
248
+ );
249
+ if (buildResult.metafile !== void 0) {
250
+ const analysis = analyze(buildResult.metafile);
251
+ await fs2.writeFile(path2.join(outDir, "metafile.json"), JSON.stringify(buildResult.metafile, void 0, 2));
252
+ console.log(
253
+ `${outFile}: src ${analysis.sourceBytes}, node_modules ${analysis.moduleBytes}, total ${analysis.totalBytes}`
254
+ );
208
255
  }
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@checkdigit/typescript-config","version":"5.2.0-PR.47-e8bc","description":"Check Digit standard Typescript configuration","prettier":"@checkdigit/prettier-config","engines":{"node":">=18"},"bin":{"builder":"./bin/builder.mjs"},"peerDependencies":{"@types/node":">=18","esbuild":"0.19.5","typescript":"5.3.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-cjs":"rimraf build-cjs && bin/builder.mjs --type=commonjs --outDir=build-cjs","build-cjs-bundle":"rimraf build-cjs-bundle && bin/builder.mjs --type=commonjs --entryPoint=test/index.test.ts --outDir=build-cjs-bundle --outFile=test/index.test.cjs --sourceMap","build-cjs-bundle-minify":"rimraf build-cjs-bundle-minify && bin/builder.mjs --type=commonjs --entryPoint=test/index.test.ts --outDir=build-cjs-bundle-minify --outFile=test/index.test.cjs --minify --sourceMap","build-cjs-bundle-no-external":"rimraf build-cjs-bundle-no-external && bin/builder.mjs --type=commonjs --external=./node_modules/* --entryPoint=test/index.test.ts --outDir=build-cjs-bundle-no-external --outFile=test/index.test.cjs","build-esm":"rimraf build-esm && bin/builder.mjs --type=module --outDir=build-esm","build-esm-bundle":"rimraf build-esm-bundle && bin/builder.mjs --type=module --outDir=build-esm-bundle --entryPoint=test/index.test.ts --outFile=test/index.test.mjs","build-esm-bundle-minify":"rimraf build-esm-bundle-minify && bin/builder.mjs --type=module --minify --outDir=build-esm-bundle-minify --entryPoint=test/index.test.ts --outFile=test/index.test.mjs","build-esm-bundle-no-external":"rimraf build-esm-bundle-no-external && bin/builder.mjs --type=module --external=./node_modules/* --outDir=build-esm-bundle-no-external --entryPoint=test/index.test.ts --outFile=test/index.test.mjs --minify","test-jest-esm":"NODE_OPTIONS=\"--experimental-vm-modules\" jest --coverage=false src/*.mts src/*/*.mts src/*/*/*.mts","test-jest-cjs":"jest --coverage=false src/*.ts src/*/*.ts src/*/*/*.ts","test-cjs":"node --test build-cjs/test/index.test.cjs","test-cjs-bundle":"node --test build-cjs-bundle/test/index.test.cjs","test-cjs-bundle-minify":"node --test build-cjs-bundle-minify/test/index.test.cjs","test-cjs-bundle-no-external":"node --test build-cjs-bundle-no-external/test/index.test.cjs","test-esm":"node --test build-esm/test/index.test.mjs","test-esm-bundle":"node --test build-esm-bundle/test/index.test.mjs","test-esm-bundle-minify":"node --test build-esm-bundle-minify/test/index.test.mjs","test-esm-bundle-no-external":"node --test build-esm-bundle-no-external/test/index.test.mjs","ci:test":"npm run test-jest-cjs && npm run test-jest-esm && npm run test-cjs && npm run test-cjs-bundle && npm run test-cjs-bundle-no-external && npm run test-esm && npm run test-esm-bundle && npm run test-esm-bundle-no-external","ci:compile":"tsc --noEmit && npm run build-builder && npm run build-types && npm run build-cjs && npm run build-cjs-bundle && npm run build-cjs-bundle-minify && npm run build-cjs-bundle-no-external && npm run build-esm && npm run build-esm-bundle && npm run build-esm-bundle-minify && npm run build-esm-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":"^4.1.0","@types/debug":"^4.1.10","@types/jest":"^29.5.7","@types/uuid":"^9.0.6","@typescript-eslint/eslint-plugin":"^6.9.1","@typescript-eslint/parser":"^6.9.1","debug":"^4.3.4","eslint":"^8.52.0","eslint-config-prettier":"^9.0.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.1","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","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/**","!<rootDir>/src/**/*.spec.mts","!<rootDir>/src/**/*.test.mts","!<rootDir>/src/**/*.spec.ts","!<rootDir>/src/**/*.test.ts"],"testMatch":["<rootDir>/src/**/*.spec.ts","<rootDir>/src/**/*.spec.mts"]},"files":["bin","tsconfig.json","SECURITY.md"],"overrides":{"typescript":"5.3.0-beta"}}
1
+ {"name":"@checkdigit/typescript-config","version":"6.0.0-PR.47-da40","description":"Check Digit standard Typescript configuration","prettier":"@checkdigit/prettier-config","engines":{"node":">=20.9"},"bin":{"builder":"./bin/builder.mjs"},"peerDependencies":{"@types/node":">=20.9","esbuild":"0.19.5","typescript":"5.3.1-rc"},"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-cjs":"rimraf build-cjs && bin/builder.mjs --type=commonjs --outDir=build-cjs","build-cjs-bundle":"rimraf build-cjs-bundle && bin/builder.mjs --type=commonjs --entryPoint=test/index.test.ts --outDir=build-cjs-bundle --outFile=test/index.test.cjs --sourceMap","build-cjs-bundle-minify":"rimraf build-cjs-bundle-minify && bin/builder.mjs --type=commonjs --entryPoint=test/index.test.ts --outDir=build-cjs-bundle-minify --outFile=test/index.test.cjs --minify --sourceMap","build-cjs-bundle-no-external":"rimraf build-cjs-bundle-no-external && bin/builder.mjs --type=commonjs --external=./node_modules/* --entryPoint=test/index.test.ts --outDir=build-cjs-bundle-no-external --outFile=test/index.test.cjs","build-esm":"rimraf build-esm && bin/builder.mjs --type=module --outDir=build-esm","build-esm-bundle":"rimraf build-esm-bundle && bin/builder.mjs --type=module --outDir=build-esm-bundle --entryPoint=test/index.test.ts --outFile=test/index.test.mjs","build-esm-bundle-minify":"rimraf build-esm-bundle-minify && bin/builder.mjs --type=module --minify --outDir=build-esm-bundle-minify --entryPoint=test/index.test.ts --outFile=test/index.test.mjs","build-esm-bundle-no-external":"rimraf build-esm-bundle-no-external && bin/builder.mjs --type=module --external=./node_modules/* --outDir=build-esm-bundle-no-external --entryPoint=test/index.test.ts --outFile=test/index.test.mjs --minify","test-jest-esm":"NODE_OPTIONS=\"--experimental-vm-modules\" jest --coverage=false src/*.mts src/*/*.mts src/*/*/*.mts","test-jest-cjs":"jest --coverage=false src/*.ts src/*/*.ts src/*/*/*.ts","test-cjs":"node --test build-cjs/test/index.test.cjs","test-cjs-bundle":"node --test build-cjs-bundle/test/index.test.cjs","test-cjs-bundle-minify":"node --test build-cjs-bundle-minify/test/index.test.cjs","test-cjs-bundle-no-external":"node --test build-cjs-bundle-no-external/test/index.test.cjs","test-esm":"node --test build-esm/test/index.test.mjs","test-esm-bundle":"node --test build-esm-bundle/test/index.test.mjs","test-esm-bundle-minify":"node --test build-esm-bundle-minify/test/index.test.mjs","test-esm-bundle-no-external":"node --test build-esm-bundle-no-external/test/index.test.mjs","ci:test":"npm run test-jest-cjs && npm run test-jest-esm && npm run test-cjs && npm run test-cjs-bundle && npm run test-cjs-bundle-no-external && npm run test-esm && npm run test-esm-bundle && npm run test-esm-bundle-no-external","ci:compile":"tsc --noEmit && npm run build-builder && npm run build-types && npm run build-cjs && npm run build-cjs-bundle && npm run build-cjs-bundle-minify && npm run build-cjs-bundle-no-external && npm run build-esm && npm run build-esm-bundle && npm run build-esm-bundle-minify && npm run build-esm-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.0.0-PR.29-ad02","@types/debug":"^4.1.12","@types/jest":"^29.5.8","@types/uuid":"^9.0.7","@typescript-eslint/eslint-plugin":"^6.11.0","@typescript-eslint/parser":"^6.11.0","debug":"^4.3.4","eslint":"^8.53.0","eslint-config-prettier":"^9.0.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.1","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.3.1-rc"}}