@checkdigit/typescript-config 3.3.0-PR.30-36db → 3.3.0-PR.30-2491
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/bin/builder.mjs +113 -0
- package/package.json +1 -1
package/bin/builder.mjs
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
|
3
|
+
import { promises as fs } from 'node:fs';
|
4
|
+
import path from 'node:path';
|
5
|
+
import url from 'node:url';
|
6
|
+
import { parseArgs } from 'node:util';
|
7
|
+
|
8
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
9
|
+
import { build } from 'esbuild';
|
10
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
11
|
+
import typescript from 'typescript';
|
12
|
+
|
13
|
+
/**
|
14
|
+
* Recursively obtains all files in a directory
|
15
|
+
* @param {string} directory
|
16
|
+
* @returns {Promise<string[]>}
|
17
|
+
*/
|
18
|
+
async function getFiles(directory) {
|
19
|
+
const entries = await fs.readdir(directory, { withFileTypes: true });
|
20
|
+
const files = await Promise.all(
|
21
|
+
entries.map((entry) => {
|
22
|
+
const result = path.resolve(directory, entry.name);
|
23
|
+
return entry.isDirectory() ? getFiles(result) : result;
|
24
|
+
})
|
25
|
+
);
|
26
|
+
return files.flat();
|
27
|
+
}
|
28
|
+
|
29
|
+
/**
|
30
|
+
* @param {import('esbuild').PluginBuild} pluginBuild
|
31
|
+
*/
|
32
|
+
function setup(pluginBuild) {
|
33
|
+
pluginBuild.onResolve({ filter: /.*/u }, async (resolved) => {
|
34
|
+
if (resolved.kind === 'entry-point' || !resolved.path.startsWith('.') || resolved.path.endsWith('.js')) {
|
35
|
+
return { external: resolved.kind !== 'entry-point' };
|
36
|
+
}
|
37
|
+
let isDirectory = false;
|
38
|
+
try {
|
39
|
+
const stats = await fs.lstat(path.join(resolved.resolveDir, resolved.path));
|
40
|
+
isDirectory = stats.isDirectory();
|
41
|
+
} catch {
|
42
|
+
// do nothing
|
43
|
+
}
|
44
|
+
let newPath = resolved.path;
|
45
|
+
newPath += isDirectory ? `/index.mjs` : `.mjs`;
|
46
|
+
return { path: newPath, external: true };
|
47
|
+
});
|
48
|
+
}
|
49
|
+
|
50
|
+
const {
|
51
|
+
values: { inDir, outDir },
|
52
|
+
} = parseArgs({
|
53
|
+
options: {
|
54
|
+
inDir: { type: 'string', short: 'i', default: 'src' },
|
55
|
+
outDir: { type: 'string', short: 'o', default: 'build' },
|
56
|
+
},
|
57
|
+
});
|
58
|
+
|
59
|
+
/**
|
60
|
+
* Emit declarations using typescript compiler
|
61
|
+
*/
|
62
|
+
const sourceDirectory = path.join(process.cwd(), inDir);
|
63
|
+
const allSourceFiles = await getFiles(sourceDirectory);
|
64
|
+
const productionSourceFiles = allSourceFiles.filter(
|
65
|
+
(file) => file.endsWith('.ts') // && !file.endsWith('.test.ts') && !file.endsWith('.spec.ts')
|
66
|
+
);
|
67
|
+
|
68
|
+
const configFile = typescript.readConfigFile('./tsconfig.json', typescript.sys.readFile);
|
69
|
+
const compilerOptions = typescript.parseJsonConfigFileContent(configFile.config, typescript.sys, './');
|
70
|
+
|
71
|
+
const program = typescript.createProgram(productionSourceFiles, {
|
72
|
+
...compilerOptions.options,
|
73
|
+
noEmitOnError: true,
|
74
|
+
emitDeclarationOnly: true,
|
75
|
+
rootDir: inDir,
|
76
|
+
outDir,
|
77
|
+
});
|
78
|
+
const emitResult = program.emit();
|
79
|
+
const allDiagnostics = [...typescript.getPreEmitDiagnostics(program), ...emitResult.diagnostics];
|
80
|
+
for (const diagnostic of allDiagnostics) {
|
81
|
+
if (diagnostic.file) {
|
82
|
+
const { line, character } = typescript.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
|
83
|
+
const message = typescript.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
|
84
|
+
// eslint-disable-next-line no-console
|
85
|
+
console.log(`${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`);
|
86
|
+
} else {
|
87
|
+
// eslint-disable-next-line no-console
|
88
|
+
console.log(typescript.flattenDiagnosticMessageText(diagnostic.messageText, '\n'));
|
89
|
+
}
|
90
|
+
}
|
91
|
+
if (emitResult.emitSkipped) {
|
92
|
+
throw new Error('TypeScript compilation failed');
|
93
|
+
}
|
94
|
+
|
95
|
+
/**
|
96
|
+
* Emit ESM javascript using esbuild
|
97
|
+
*/
|
98
|
+
await build({
|
99
|
+
entryPoints: productionSourceFiles,
|
100
|
+
bundle: true,
|
101
|
+
platform: 'node',
|
102
|
+
format: 'esm',
|
103
|
+
outdir: outDir,
|
104
|
+
sourcemap: 'inline',
|
105
|
+
sourcesContent: false,
|
106
|
+
outExtension: { '.js': '.mjs' },
|
107
|
+
plugins: [
|
108
|
+
{
|
109
|
+
name: 'resolve-ts',
|
110
|
+
setup,
|
111
|
+
},
|
112
|
+
],
|
113
|
+
});
|
package/package.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"name":"@checkdigit/typescript-config","version":"3.3.0-PR.30-
|
1
|
+
{"name":"@checkdigit/typescript-config","version":"3.3.0-PR.30-2491","description":"Check Digit standard Typescript configuration","prettier":"@checkdigit/prettier-config","engines":{"node":">=16"},"bin":{"builder":"./bin/builder.mjs"},"peerDependencies":{"@types/node":">=16","typescript":">=5.0.4 <5.1"},"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":{"preversion":"npm test","postversion":"git push && git push --tags","lint:fix":"eslint -f unix --ext .ts,.mts src --fix","lint":"eslint -f unix --ext .ts,.mts src","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":"tsc --module nodenext --outDir build-builder src/builder/builder.mts","build-tsc-cjs":"rimraf build-tsc-cjs && tsc --outDir build-tsc-cjs","build-esbuild-cjs":"rimraf build-esbuild-cjs && esbuild ./src/*.ts ./src/*/*.ts --platform=node --bundle --format=cjs --sourcemap=inline --sources-content=false --outdir=build-esbuild-cjs","build-esbuild-cjs-bundle":"rimraf build-esbuild-cjs-bundle && esbuild src/test/index.test.ts --bundle --platform=node --format=cjs --sourcemap=inline --sources-content=false --outfile=build-esbuild-cjs-bundle/test/index.test.cjs","build-esbuild-esm":"rimraf build-esbuild-esm && node bin/builder.mjs --outDir=build-esbuild-esm","build-esbuild-esm-bundle":"rimraf build-esbuild-esm-bundle && esbuild src/test/index.test.ts --bundle --platform=node --format=esm --sourcemap=inline --sources-content=false --outfile=build-esbuild-esm-bundle/test/index.test.mjs","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-tsc-cjs":"node --test build-tsc-cjs/test/index.test.js","test-esbuild-cjs":"node --test build-esbuild-cjs/test/index.test.js","test-esbuild-cjs-bundle":"node --test build-esbuild-cjs-bundle/test/index.test.cjs","test-esbuild-esm":"node --test build-esbuild-esm/test/index.test.mjs","test-esbuild-esm-bundle":"echo 'node -test build-esbuild-esm-bundle/test/index.test.mjs'","ci:test":"npm run test-jest-cjs && npm run test-jest-esm &&npm run test-tsc-cjs && npm run test-esbuild-cjs && npm run test-esbuild-cjs-bundle && npm run test-esbuild-esm && npm run test-esbuild-esm-bundle","ci:compile":"npm run build-tsc-cjs && npm run build-esbuild-cjs && npm run build-esbuild-cjs-bundle && npm run build-esbuild-esm && npm run build-esbuild-esm-bundle","ci:lint":"npm run lint","ci:style":"npm run prettier"},"devDependencies":{"@checkdigit/prettier-config":"^3.4.0","@types/debug":"^4.1.7","@types/jest":"^29.5.1","@typescript-eslint/eslint-plugin":"^5.59.5","@typescript-eslint/parser":"^5.59.5","debug":"^4.3.4","esbuild":"^0.17.18","eslint":"^8.40.0","eslint-config-prettier":"^8.8.0","get-port":"^6.1.2","got":"^11.8.6","jest":"^29.5.0","rimraf":"^5.0.0","ts-jest":"^29.1.0"},"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","func-style":["error","declaration",{"allowArrowFunctions":true}],"no-magic-numbers":["error",{"ignore":[1]}],"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","sort-imports":"off","line-comment-position":"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"}}]},"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":["tsconfig.json","SECURITY.md","/src/"]}
|