From 8f4117ed63a2551ffbcaeda7f3fb693d3da8418e Mon Sep 17 00:00:00 2001 From: irfan798 Date: Wed, 4 Dec 2024 16:01:32 +0300 Subject: [PATCH 1/5] Add build settings for common js --- package.json | 56 ++++++++++++++++++++++++++++++++++++++++---------- tsup.config.js | 2 +- 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index d4e4405..b242eb3 100644 --- a/package.json +++ b/package.json @@ -2,18 +2,52 @@ "name": "cbor2", "version": "1.7.1", "description": "Encode and parse data in the Concise Binary Object Representation (CBOR) data format (RFC8949).", + "main": "./lib/index.cjs", "exports": { - ".": "./lib/index.js", - "./comment": "./lib/comment.js", - "./decoder": "./lib/decoder.js", - "./diagnostic": "./lib/diagnostic.js", - "./encoder": "./lib/encoder.js", - "./simple": "./lib/simple.js", - "./sorts": "./lib/sorts.js", - "./tag": "./lib/tag.js", - "./types": "./lib/types.js", - "./utils": "./lib/utils.js", - "./writer": "./lib/writer.js" + ".": { + "import": "./lib/index.js", + "require": "./lib/index.cjs" + }, + "./comment": { + "import": "./lib/comment.js", + "require": "./lib/comment.cjs" + }, + "./decoder": { + "import": "./lib/decoder.js", + "require": "./lib/decoder.cjs" + }, + "./diagnostic": { + "import": "./lib/diagnostic.js", + "require": "./lib/diagnostic.cjs" + }, + "./encoder": { + "import": "./lib/encoder.js", + "require": "./lib/encoder.cjs" + }, + "./simple": { + "import": "./lib/simple.js", + "require": "./lib/simple.cjs" + }, + "./sorts": { + "import": "./lib/sorts.js", + "require": "./lib/sorts.cjs" + }, + "./tag": { + "import": "./lib/tag.js", + "require": "./lib/tag.cjs" + }, + "./types": { + "import": "./lib/types.js", + "require": "./lib/types.cjs" + }, + "./utils": { + "import": "./lib/utils.js", + "require": "./lib/utils.cjs" + }, + "./writer": { + "import": "./lib/writer.js", + "require": "./lib/writer.cjs" + } }, "files": [ "lib" diff --git a/tsup.config.js b/tsup.config.js index bf65c9f..bdfafb5 100644 --- a/tsup.config.js +++ b/tsup.config.js @@ -15,7 +15,7 @@ export default defineConfig({ clean: true, dts: true, entry, - format: 'esm', + format: ['esm', 'cjs'], minify: true, outDir: 'lib', sourcemap: false, From 83b87db0a825558e6dca4b16d0c393c4cfadf781 Mon Sep 17 00:00:00 2001 From: irfan798 Date: Fri, 13 Dec 2024 14:56:30 +0300 Subject: [PATCH 2/5] feat: build commonjs modules as well --- tools/imports-plugin.tsup.js | 32 ++++++++++++++++++++++++++++++++ tsup.config.js | 34 +++++++++++++++++++++++++++------- 2 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 tools/imports-plugin.tsup.js diff --git a/tools/imports-plugin.tsup.js b/tools/imports-plugin.tsup.js new file mode 100644 index 0000000..3264482 --- /dev/null +++ b/tools/imports-plugin.tsup.js @@ -0,0 +1,32 @@ +/** + * Taken from: https://github.com/egoist/tsup/issues/953#issuecomment-2294998890 + * + * On TSUP when we compile to CJS, file extensions are set as .cjs but + * in the compiled files, the imports are still pointing to .js files. + * + * This plugin replaces all the imports in CJS files to point to .cjs files. + * + * - require('./path') → require('./path.cjs') in `.cjs` files + * - require('./path.js') → require('./path.cjs') in `.cjs` files + * - from './path' → from './path.cjs' in `.cjs` files + * - from './path.js' → from './path.cjs' in `.cjs` files + * - from '../path' → from '../path.cjs' in `.cjs` files + */ + +export const cjsImportsPlugin = () => ({ + name: 'cjs-imports', + + renderChunk(code) { + if (this.format === 'cjs') { + const regexCjs = /require\((?['"])(?\.[^'"]+)\.js['"]\)/g; + const regexEsm = + /from(?[\s]*)(?['"])(?\.[^'"]+)\.js['"]/g; + return { + code: code + .replace(regexCjs, 'require($$.cjs$)') + .replace(regexEsm, 'from$$$.cjs$'), + }; + } + return code; + }, +}); diff --git a/tsup.config.js b/tsup.config.js index bdfafb5..8447e8b 100644 --- a/tsup.config.js +++ b/tsup.config.js @@ -1,3 +1,4 @@ +import {cjsImportsPlugin} from './tools/imports-plugin.tsup.js'; import {defineConfig} from 'tsup'; import {fileURLToPath} from 'node:url'; import fs from 'node:fs/promises'; @@ -6,20 +7,39 @@ import path from 'node:path'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); +// Get all TypeScript files in the src directory as entry points const files = await fs.readdir(path.join(__dirname, 'src')); const entry = files .filter(f => f.endsWith('.ts')) .map(f => path.join('src', f)); -export default defineConfig({ +const commonSettings = { clean: true, - dts: true, + dts: { + resolve: true, // Ensures all dependencies are included + entry, // Generate `.d.ts` for each entry file + }, entry, - format: ['esm', 'cjs'], - minify: true, - outDir: 'lib', - sourcemap: false, + minify: false, + sourcemap: true, splitting: false, target: 'es2022', bundle: false, -}); + cjsInterop: true, +}; + +export default defineConfig([ + // ESM configuration + { + ...commonSettings, + format: ['esm'], + outDir: 'lib', + }, + // CJS configuration + { + ...commonSettings, + format: ['cjs'], + outDir: 'lib/cjs', + plugins: [cjsImportsPlugin()], + }, +]); From 4b1bd553ed0d69439b0907787adea21413f5c6f6 Mon Sep 17 00:00:00 2001 From: irfan798 Date: Fri, 13 Dec 2024 14:57:17 +0300 Subject: [PATCH 3/5] chore: set module to node16 to support both esm and cjs properly --- tsconfig.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 773fc08..e77f2df 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -25,9 +25,9 @@ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ /* Modules */ - "module": "ES2022", /* Specify what module code is generated. */ + "module": "node16", /* Specify what module code is generated. */ // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + "moduleResolution": "node16", /* Specify how TypeScript looks up a file from a given module specifier. */ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ From d5fded94b79719bc9e5ad05c7b54b295cc10355d Mon Sep 17 00:00:00 2001 From: irfan798 Date: Fri, 13 Dec 2024 17:38:30 +0300 Subject: [PATCH 4/5] fix: use regex for entry instead of fs --- tsup.config.js | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/tsup.config.js b/tsup.config.js index 8447e8b..3ddae6a 100644 --- a/tsup.config.js +++ b/tsup.config.js @@ -1,26 +1,11 @@ import {cjsImportsPlugin} from './tools/imports-plugin.tsup.js'; import {defineConfig} from 'tsup'; -import {fileURLToPath} from 'node:url'; -import fs from 'node:fs/promises'; -import path from 'node:path'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -// Get all TypeScript files in the src directory as entry points -const files = await fs.readdir(path.join(__dirname, 'src')); -const entry = files - .filter(f => f.endsWith('.ts')) - .map(f => path.join('src', f)); const commonSettings = { clean: true, - dts: { - resolve: true, // Ensures all dependencies are included - entry, // Generate `.d.ts` for each entry file - }, - entry, - minify: false, + dts: true, + entry: ['src/*.ts'], + minify: true, sourcemap: true, splitting: false, target: 'es2022', From 3bf93e432b89d7a48d993ab53ba3ec73c42559fc Mon Sep 17 00:00:00 2001 From: irfan798 Date: Fri, 13 Dec 2024 17:46:16 +0300 Subject: [PATCH 5/5] chore: refactor exports in package.json --- package.json | 100 ++++++++++++++++++++++++++------------------------- 1 file changed, 51 insertions(+), 49 deletions(-) diff --git a/package.json b/package.json index cd22d05..30b43cb 100644 --- a/package.json +++ b/package.json @@ -2,57 +2,10 @@ "name": "cbor2", "version": "1.8.0", "description": "Encode and parse data in the Concise Binary Object Representation (CBOR) data format (RFC8949).", - "main": "./lib/index.cjs", - "exports": { - ".": { - "import": "./lib/index.js", - "require": "./lib/index.cjs" - }, - "./comment": { - "import": "./lib/comment.js", - "require": "./lib/comment.cjs" - }, - "./decoder": { - "import": "./lib/decoder.js", - "require": "./lib/decoder.cjs" - }, - "./diagnostic": { - "import": "./lib/diagnostic.js", - "require": "./lib/diagnostic.cjs" - }, - "./encoder": { - "import": "./lib/encoder.js", - "require": "./lib/encoder.cjs" - }, - "./simple": { - "import": "./lib/simple.js", - "require": "./lib/simple.cjs" - }, - "./sorts": { - "import": "./lib/sorts.js", - "require": "./lib/sorts.cjs" - }, - "./tag": { - "import": "./lib/tag.js", - "require": "./lib/tag.cjs" - }, - "./types": { - "import": "./lib/types.js", - "require": "./lib/types.cjs" - }, - "./utils": { - "import": "./lib/utils.js", - "require": "./lib/utils.cjs" - }, - "./writer": { - "import": "./lib/writer.js", - "require": "./lib/writer.cjs" - } - }, + "type": "module", "files": [ "lib" ], - "type": "module", "repository": { "type": "git", "url": "git+ssh://git@github.com/hildjj/cbor2.git" @@ -108,5 +61,54 @@ "packageManager": "pnpm@9.14.4", "engines": { "node": ">=18" - } + }, + "main": "./lib/cjs/index.cjs", + "module": "./lib/index.js", + "types": "./lib/index.d.ts", + "exports": { + ".": { + "require": "./lib/cjs/index.cjs", + "import": "./lib/index.js" + }, + "./comment": { + "require": "./lib/cjs/comment.cjs", + "import": "./lib/comment.js" + }, + "./decoder": { + "require": "./lib/cjs/decoder.cjs", + "import": "./lib/decoder.js" + }, + "./diagnostic": { + "require": "./lib/cjs/diagnostic.cjs", + "import": "./lib/diagnostic.js" + }, + "./encoder": { + "require": "./lib/cjs/encoder.cjs", + "import": "./lib/encoder.js" + }, + "./simple": { + "require": "./lib/cjs/simple.cjs", + "import": "./lib/simple.js" + }, + "./sorts": { + "require": "./lib/cjs/sorts.cjs", + "import": "./lib/sorts.js" + }, + "./tag": { + "require": "./lib/cjs/tag.cjs", + "import": "./lib/tag.js" + }, + "./types": { + "require": "./lib/cjs/types.cjs", + "import": "./lib/types.js" + }, + "./utils": { + "require": "./lib/cjs/utils.cjs", + "import": "./lib/utils.js" + }, + "./writer": { + "require": "./lib/cjs/writer.cjs", + "import": "./lib/writer.js" + } + } }