diff options
author | Matthew Miller <matthew@millerti.me> | 2023-08-22 10:13:03 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-22 10:13:03 -0700 |
commit | fefc95e4535e6ecf903f647124a492fba3fd11d6 (patch) | |
tree | 4c924d43d32fb12a780533302eaf5dee08875d75 /packages/server/build_npm.ts | |
parent | 443c341bc2163f07b93a3ef84a43294d10b826f8 (diff) | |
parent | 2935857c76d458c26701842e500f8d97d17499c5 (diff) |
Merge pull request #425 from MasterKale/feat/server-esm-take-2-dnt
feat/server-esm-take-2-dnt
Diffstat (limited to 'packages/server/build_npm.ts')
-rw-r--r-- | packages/server/build_npm.ts | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/packages/server/build_npm.ts b/packages/server/build_npm.ts new file mode 100644 index 0000000..5ed6509 --- /dev/null +++ b/packages/server/build_npm.ts @@ -0,0 +1,173 @@ +import { build, BuildOptions, emptyDir } from 'https://deno.land/x/dnt@0.38.0/mod.ts'; + +const outDir = { + publish: './npm', + test: './npm-test', +} as const; +const lernaPackageJSON: { version: string } = JSON.parse( + Deno.readTextFileSync('./package.json'), +); +const typesPackageJSON: { version: string } = JSON.parse( + Deno.readTextFileSync('../typescript-types/npm/package.json'), +); + +// Clear both build directories +await Promise.all([ + await emptyDir(outDir.publish), + await emptyDir(outDir.test), +]); + +/** + * Maintain a separate build just for testing, as we need to shim crypto only + * when test_runner.js runs to test the ESM and CJS output. The test environment + * currently lacks `globalThis.crypto` and so shimming it is the only way to + * get the tests to successfully execute. But we don't want the shim in the + * build we post up to NPM so that the runtime's native Crypto can be used. + * + * See https://github.com/denoland/dnt/issues/181 + */ +console.log('Building for testing...'); +await build({ + entryPoints: getEntryPoints(), + outDir: outDir.test, + shims: { + deno: { + test: 'dev', + }, + crypto: true, + }, + test: true, + // TODO: Re-enable if https://github.com/denoland/dnt/issues/331 can get resolved + typeCheck: false, + package: { + name: 'for-testing-only', + version: '0.0.0', + }, + // Map from Deno package to NPM package for Node build + mappings: getMappings(), + // TypeScript tsconfig.json config + compilerOptions: getCompilerOptions(), +}); + +console.log('Building for publishing...'); +await build({ + entryPoints: getEntryPoints(), + outDir: outDir.publish, + shims: {}, + test: false, + // TODO: Re-enable if https://github.com/denoland/dnt/issues/331 can get resolved + typeCheck: false, + // package.json values + package: { + name: '@simplewebauthn/server', + version: lernaPackageJSON.version, + description: 'SimpleWebAuthn for Servers', + license: 'MIT', + author: 'Matthew Miller <matthew@millerti.me>', + repository: { + type: 'git', + url: 'git+https://github.com/MasterKale/SimpleWebAuthn.git', + directory: 'packages/server', + }, + homepage: 'https://github.com/MasterKale/SimpleWebAuthn/tree/master/packages/server#readme', + publishConfig: { + access: 'public', + }, + engines: { + node: '>=16.0.0', + }, + bugs: { + url: 'https://github.com/MasterKale/SimpleWebAuthn/issues', + }, + keywords: [ + 'typescript', + 'webauthn', + 'passkeys', + 'fido', + 'node', + ], + typesVersions: { + '*': { + '.': [ + 'esm/index.d.ts', + ], + 'helpers': [ + 'esm/helpers/index.d.ts', + ], + }, + }, + }, + // Map from Deno package to NPM package for Node build + mappings: getMappings(), + // TypeScript tsconfig.json config + compilerOptions: getCompilerOptions(), +}); + +Deno.copyFileSync('LICENSE.md', `${outDir.publish}/LICENSE.md`); +Deno.copyFileSync('README.md', `${outDir.publish}/README.md`); + +/** + * Settings we can reuse across the two build configs + */ +function getEntryPoints(): BuildOptions['entryPoints'] { + return [ + { name: '.', path: './src/index.ts' }, + { name: './helpers', path: './src/helpers/index.ts' }, + ]; +} + +function getMappings(): BuildOptions['mappings'] { + return { + 'https://deno.land/x/b64@1.1.27/src/base64.js': { + name: '@hexagon/base64', + version: '^1.1.27', + }, + 'https://deno.land/x/cbor@v1.5.2/index.js': { + name: 'cbor-x', + version: '^1.5.2', + }, + 'https://esm.sh/debug@4.3.4': { + name: 'debug', + version: '^4.3.4', + }, + 'https://esm.sh/@types/debug@4.1.8': { + name: '@types/debug', + version: '^4.1.8', + }, + 'https://esm.sh/cross-fetch@4.0.0': { + name: 'cross-fetch', + version: '^4.0.0', + }, + 'https://esm.sh/@peculiar/asn1-schema@2.3.6': { + name: '@peculiar/asn1-schema', + version: '^2.3.6', + }, + 'https://esm.sh/@peculiar/asn1-x509@2.3.6': { + name: '@peculiar/asn1-x509', + version: '^2.3.6', + }, + 'https://esm.sh/@peculiar/asn1-ecc@2.3.6': { + name: '@peculiar/asn1-ecc', + version: '^2.3.6', + }, + 'https://esm.sh/@peculiar/asn1-rsa@2.3.6': { + name: '@peculiar/asn1-rsa', + version: '^2.3.6', + }, + 'https://esm.sh/@peculiar/asn1-android@2.3.6': { + name: '@peculiar/asn1-android', + version: '^2.3.6', + }, + // Mapping for '../../typescript-types/src/index.ts' in deps.ts + '../typescript-types/src/index.ts': { + name: '@simplewebauthn/typescript-types', + version: `^${typesPackageJSON.version}`, + }, + }; +} + +function getCompilerOptions(): BuildOptions['compilerOptions'] { + return { + lib: ['ES2021'], + }; +} |