From 9d114a3552ad079923bf3b8176148a98bf2f0a21 Mon Sep 17 00:00:00 2001 From: alina sireneva Date: Sat, 20 Apr 2024 01:07:53 +0300 Subject: [PATCH] build: initial support for jsr building --- package.json | 1 + packages/bun/package.json | 6 - packages/convert/package.json | 9 +- packages/core/build.config.cjs | 21 +- packages/core/package.json | 28 -- .../core/src/highlevel/utils/file-utils.ts | 45 +-- .../src/storage/sqlite/repository/peers.ts | 3 +- packages/crypto-node/package.json | 14 +- packages/dispatcher/package.json | 9 +- packages/file-id/package.json | 10 +- packages/html-parser/package.json | 13 +- packages/http-proxy/package.json | 9 +- packages/i18n/package.json | 20 +- packages/markdown-parser/package.json | 13 +- packages/mtproxy/package.json | 9 +- packages/node/package.json | 12 - packages/socks-proxy/package.json | 9 +- packages/test/package.json | 6 +- packages/tl-runtime/package.json | 10 +- packages/tl-utils/package.json | 16 +- packages/tl/.gitignore | 8 +- packages/tl/build.config.cjs | 58 +++- packages/tl/package.json | 3 + packages/wasm/build.config.cjs | 2 +- packages/wasm/package.json | 13 +- packages/web/package.json | 27 +- packages/web/src/utils.ts | 1 + pnpm-lock.yaml | 211 ++++++++++-- scripts/build-package.js | 317 ++++++++++++++++-- scripts/publish.js | 81 ++++- 30 files changed, 682 insertions(+), 302 deletions(-) create mode 100644 packages/web/src/utils.ts diff --git a/package.json b/package.json index 846eca6c..da6f9654 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "devDependencies": { "@commitlint/cli": "17.6.5", "@commitlint/config-conventional": "17.6.5", + "@teidesu/slow-types-compiler": "1.0.2", "@types/node": "20.10.0", "@types/ws": "8.5.4", "@typescript-eslint/eslint-plugin": "6.4.0", diff --git a/packages/bun/package.json b/packages/bun/package.json index 1cd930d4..a35be82e 100644 --- a/packages/bun/package.json +++ b/packages/bun/package.json @@ -16,12 +16,6 @@ ".": "./src/index.ts", "./utils.js": "./src/utils.ts" }, - "distOnlyFields": { - "exports": { - ".": "./index.js", - "./utils.js": "./utils.js" - } - }, "dependencies": { "@mtcute/core": "workspace:^", "@mtcute/wasm": "workspace:^", diff --git a/packages/convert/package.json b/packages/convert/package.json index 23bfa23a..efb000a6 100644 --- a/packages/convert/package.json +++ b/packages/convert/package.json @@ -11,14 +11,7 @@ "scripts": { "build": "pnpm run -w build-package convert" }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - } - } - }, + "exports": "./src/index.ts", "dependencies": { "@mtcute/core": "workspace:^" }, diff --git a/packages/core/build.config.cjs b/packages/core/build.config.cjs index c9699247..631e06a0 100644 --- a/packages/core/build.config.cjs +++ b/packages/core/build.config.cjs @@ -1,20 +1,27 @@ const KNOWN_DECORATORS = ['memoizeGetters', 'makeInspectable'] -module.exports = ({ path, glob, transformFile, packageDir, outDir }) => ({ +module.exports = ({ path, glob, transformFile, packageDir, outDir, jsr }) => ({ esmOnlyDirectives: true, esmImportDirectives: true, final() { const version = require(path.join(packageDir, 'package.json')).version const replaceVersion = (content) => content.replace('%VERSION%', version) - transformFile(path.join(outDir, 'cjs/network/network-manager.js'), replaceVersion) - transformFile(path.join(outDir, 'esm/network/network-manager.js'), replaceVersion) + if (jsr) { + transformFile(path.join(outDir, 'network/network-manager.ts'), replaceVersion) + } else { + transformFile(path.join(outDir, 'cjs/network/network-manager.js'), replaceVersion) + transformFile(path.join(outDir, 'esm/network/network-manager.js'), replaceVersion) + } + + if (jsr) return // make decorators properly tree-shakeable // very fragile, but it works for now :D + // skip for jsr for now because types aren't resolved correctly and it breaks everything (TODO: fix this) const decoratorsRegex = new RegExp( - `(${KNOWN_DECORATORS.join('|')})\\((.+?)\\);`, - 'gs', + `(${KNOWN_DECORATORS.join('|')})\\((.+?)\\)(?:;|$)`, + 'gsm', ) const replaceDecorators = (content, file) => { @@ -57,7 +64,9 @@ module.exports = ({ path, glob, transformFile, packageDir, outDir }) => ({ return content + '\n' + customExports.join('\n') + '\n' } - for (const f of glob.sync(path.join(outDir, 'esm/highlevel/types/**/*.js'))) { + const globSrc = path.join(outDir, jsr ? 'highlevel/types/**/*.ts' : 'esm/highlevel/types/**/*.js') + + for (const f of glob.sync(globSrc)) { transformFile(f, replaceDecorators) } }, diff --git a/packages/core/package.json b/packages/core/package.json index cd25b3ca..587fc832 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -21,34 +21,6 @@ "./methods.js": "./src/highlevel/methods.ts", "./platform.js": "./src/platform.ts" }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - }, - "./utils.js": { - "import": "./esm/utils/index.js", - "require": "./cjs/utils/index.js" - }, - "./methods.js": { - "import": "./esm/highlevel/methods.js", - "require": "./cjs/highlevel/methods.js" - }, - "./platform.js": { - "import": "./esm/platform.js", - "require": "./cjs/platform.js" - }, - "./client.js": { - "import": "./esm/highlevel/client.js", - "require": "./cjs/highlevel/client.js" - }, - "./worker.js": { - "import": "./esm/highlevel/worker/index.js", - "require": "./cjs/highlevel/worker/index.js" - } - } - }, "dependencies": { "@mtcute/tl": "workspace:^", "@mtcute/tl-runtime": "workspace:^", diff --git a/packages/core/src/highlevel/utils/file-utils.ts b/packages/core/src/highlevel/utils/file-utils.ts index d51c9d46..d7b26a94 100644 --- a/packages/core/src/highlevel/utils/file-utils.ts +++ b/packages/core/src/highlevel/utils/file-utils.ts @@ -32,27 +32,28 @@ export function isProbablyPlainText(buf: Uint8Array): boolean { } // from https://github.com/telegramdesktop/tdesktop/blob/bec39d89e19670eb436dc794a8f20b657cb87c71/Telegram/SourceFiles/ui/image/image.cpp#L225 -const JPEG_HEADER = () => getPlatform().hexDecode( - 'ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e1928' + - '2321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aad' + - 'aad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c35' + - '3c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f' + - '8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc0001108000000' + - '0003012200021101031101ffc4001f0000010501010101010100000000000000000' + - '102030405060708090a0bffc400b5100002010303020403050504040000017d0102' + - '0300041105122131410613516107227114328191a1082342b1c11552d1f02433627' + - '282090a161718191a25262728292a3435363738393a434445464748494a53545556' + - '5758595a636465666768696a737475767778797a838485868788898a92939495969' + - '798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4' + - 'd5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030' + - '101010101010101010000000000000102030405060708090a0bffc400b511000201' + - '0204040304070504040001027700010203110405213106124151076171132232810' + - '8144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a3536' + - '3738393a434445464748494a535455565758595a636465666768696a73747576777' + - '8797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5' + - 'b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f' + - '3f4f5f6f7f8f9faffda000c03010002110311003f00', -) +const JPEG_HEADER = () => + getPlatform().hexDecode( + 'ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e1928' + + '2321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aad' + + 'aad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c35' + + '3c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f' + + '8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc0001108000000' + + '0003012200021101031101ffc4001f0000010501010101010100000000000000000' + + '102030405060708090a0bffc400b5100002010303020403050504040000017d0102' + + '0300041105122131410613516107227114328191a1082342b1c11552d1f02433627' + + '282090a161718191a25262728292a3435363738393a434445464748494a53545556' + + '5758595a636465666768696a737475767778797a838485868788898a92939495969' + + '798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4' + + 'd5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030' + + '101010101010101010000000000000102030405060708090a0bffc400b511000201' + + '0204040304070504040001027700010203110405213106124151076171132232810' + + '8144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a3536' + + '3738393a434445464748494a535455565758595a636465666768696a73747576777' + + '8797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5' + + 'b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f' + + '3f4f5f6f7f8f9faffda000c03010002110311003f00', + ) let JPEG_HEADER_BYTES: Uint8Array | null = null const JPEG_FOOTER = new Uint8Array([0xff, 0xd9]) @@ -131,5 +132,5 @@ export function svgPathToFile(path: string): Uint8Array { export function extractFileName(path: string): string { if (path.startsWith('file:')) path = path.slice(5) - return path.split(/[\\/]/).pop()! + return path.split(/[\\/]/).pop()!.split('?')[0] } diff --git a/packages/core/src/storage/sqlite/repository/peers.ts b/packages/core/src/storage/sqlite/repository/peers.ts index 4f5a78a1..2e48b9ad 100644 --- a/packages/core/src/storage/sqlite/repository/peers.ts +++ b/packages/core/src/storage/sqlite/repository/peers.ts @@ -8,8 +8,7 @@ interface PeerDto { usernames: string updated: number phone: string | null - // eslint-disable-next-line no-restricted-globals - complete: Buffer + complete: Uint8Array } function mapPeerDto(dto: PeerDto): IPeersRepository.PeerInfo { diff --git a/packages/crypto-node/package.json b/packages/crypto-node/package.json index 802bd7df..ddbd8d74 100644 --- a/packages/crypto-node/package.json +++ b/packages/crypto-node/package.json @@ -19,19 +19,7 @@ ], "exports": { ".": "./src/index.ts", - "./native.js": "./src/native.ts" - }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - }, - "./native.js": { - "import": "./esm/native.cjs", - "require": "./cjs/native.cjs" - } - } + "./native.js": "./src/native.cjs" }, "dependencies": { "@mtcute/node": "workspace:^", diff --git a/packages/dispatcher/package.json b/packages/dispatcher/package.json index 1ea7cfa5..d33bd1c5 100644 --- a/packages/dispatcher/package.json +++ b/packages/dispatcher/package.json @@ -8,14 +8,7 @@ "main": "src/index.ts", "type": "module", "sideEffects": false, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - } - } - }, + "exports": "./src/index.ts", "scripts": { "build": "pnpm run -w build-package dispatcher", "gen-updates": "node ./scripts/generate.cjs" diff --git a/packages/file-id/package.json b/packages/file-id/package.json index a63a6df0..dd06018e 100644 --- a/packages/file-id/package.json +++ b/packages/file-id/package.json @@ -5,19 +5,13 @@ "description": "Support for TDLib and Bot API file ID for mtcute", "author": "alina sireneva ", "license": "MIT", - "main": "src/index.ts", "type": "module", "sideEffects": false, "scripts": { "build": "pnpm run -w build-package file-id" }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - } - } + "exports": { + ".": "./src/index.ts" }, "dependencies": { "@mtcute/tl-runtime": "workspace:^", diff --git a/packages/html-parser/package.json b/packages/html-parser/package.json index a4f5b738..0ec99170 100644 --- a/packages/html-parser/package.json +++ b/packages/html-parser/package.json @@ -11,19 +11,10 @@ "scripts": { "build": "pnpm run -w build-package html-parser" }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - } - } - }, + "exports": "./src/index.ts", "dependencies": { "htmlparser2": "^6.0.1", - "long": "5.2.3" - }, - "devDependencies": { + "long": "5.2.3", "@mtcute/core": "workspace:^" } } diff --git a/packages/http-proxy/package.json b/packages/http-proxy/package.json index b790df7d..fc96c580 100644 --- a/packages/http-proxy/package.json +++ b/packages/http-proxy/package.json @@ -12,14 +12,7 @@ "docs": "typedoc", "build": "pnpm run -w build-package http-proxy" }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - } - } - }, + "exports": "./index.ts", "dependencies": { "@mtcute/node": "workspace:^" } diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 75b094f1..7559fa44 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -11,20 +11,18 @@ "scripts": { "build": "pnpm run -w build-package i18n" }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - }, - "./plurals/*": { - "import": "./esm/plurals/*", - "require": "./cjs/plurals/*" - } - } + "exports": { + ".": "./src/index.ts", + "./plurals/*": "./src/plurals/*" }, "devDependencies": { "@mtcute/core": "workspace:^", "@mtcute/dispatcher": "workspace:^" + }, + "jsrOnlyFields": { + "dependencies": { + "@mtcute/core": "workspace:^", + "@mtcute/dispatcher": "workspace:^" + } } } diff --git a/packages/markdown-parser/package.json b/packages/markdown-parser/package.json index da5ce34e..888c9851 100644 --- a/packages/markdown-parser/package.json +++ b/packages/markdown-parser/package.json @@ -11,18 +11,9 @@ "scripts": { "build": "pnpm run -w build-package markdown-parser" }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - } - } - }, + "exports": "./src/index.ts", "dependencies": { - "long": "5.2.3" - }, - "devDependencies": { + "long": "5.2.3", "@mtcute/core": "workspace:^" } } diff --git a/packages/mtproxy/package.json b/packages/mtproxy/package.json index b3fef6fb..982cf135 100644 --- a/packages/mtproxy/package.json +++ b/packages/mtproxy/package.json @@ -12,14 +12,7 @@ "docs": "typedoc", "build": "pnpm run -w build-package mtproxy" }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - } - } - }, + "exports": "./index.ts", "dependencies": { "@mtcute/node": "workspace:^" } diff --git a/packages/node/package.json b/packages/node/package.json index 55a79fe4..97508c4f 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -16,18 +16,6 @@ ".": "./src/index.ts", "./utils.js": "./src/utils.ts" }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - }, - "./utils.js": { - "import": "./esm/utils.js", - "require": "./cjs/utils.js" - } - } - }, "dependencies": { "@mtcute/core": "workspace:^", "@mtcute/wasm": "workspace:^", diff --git a/packages/socks-proxy/package.json b/packages/socks-proxy/package.json index 58c9f74d..35e1972e 100644 --- a/packages/socks-proxy/package.json +++ b/packages/socks-proxy/package.json @@ -12,14 +12,7 @@ "docs": "typedoc", "build": "pnpm run -w build-package socks-proxy" }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - } - } - }, + "exports": "./index.ts", "dependencies": { "@mtcute/node": "workspace:^", "ip6": "0.2.7" diff --git a/packages/test/package.json b/packages/test/package.json index d44e9fe5..65341695 100644 --- a/packages/test/package.json +++ b/packages/test/package.json @@ -35,9 +35,5 @@ "browser": { "./src/platform.js": "./src/platform.web.js" }, - "distOnlyFields": { - "exports": { - ".": "./esm/index.js" - } - } + "exports": "./src/index.ts" } diff --git a/packages/tl-runtime/package.json b/packages/tl-runtime/package.json index 653f2cc2..0c7f523c 100644 --- a/packages/tl-runtime/package.json +++ b/packages/tl-runtime/package.json @@ -11,15 +11,9 @@ "docs": "typedoc", "build": "pnpm run -w build-package tl-runtime" }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - } - } + "exports": { + ".": "./src/index.ts" }, - "main": "src/index.ts", "dependencies": { "long": "5.2.3" } diff --git a/packages/tl-utils/package.json b/packages/tl-utils/package.json index 6a98750a..99222aec 100644 --- a/packages/tl-utils/package.json +++ b/packages/tl-utils/package.json @@ -16,22 +16,8 @@ ".": "./src/index.ts", "./json.js": "./src/json/index.ts" }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js" - }, - "./json.js": { - "import": "./dist/esm/json/index.js", - "require": "./dist/cjs/json/index.js" - } - } - }, "dependencies": { - "crc-32": "1.2.0" - }, - "devDependencies": { + "crc-32": "1.2.0", "@mtcute/tl-runtime": "workspace:^" } } diff --git a/packages/tl/.gitignore b/packages/tl/.gitignore index 1e8270be..c6b52dfb 100644 --- a/packages/tl/.gitignore +++ b/packages/tl/.gitignore @@ -1,8 +1,6 @@ -index.d.ts -index.js -errors.d.ts -errors.js +/index.d.ts +/index.js binary/reader.js binary/writer.js -diff.json +/diff.json diff --git a/packages/tl/build.config.cjs b/packages/tl/build.config.cjs index ab0d41d8..c8b1c6d5 100644 --- a/packages/tl/build.config.cjs +++ b/packages/tl/build.config.cjs @@ -1,4 +1,4 @@ -module.exports = ({ fs, path, outDir, packageDir }) => ({ +module.exports = ({ fs, path, outDir, packageDir, jsr, transformFile }) => ({ buildTs: false, buildCjs: false, final() { @@ -22,5 +22,61 @@ module.exports = ({ fs, path, outDir, packageDir }) => ({ for (const f of files) { fs.copyFileSync(path.join(packageDir, f), path.join(outDir, f)) } + + if (jsr) { + // jsr doesn't support cjs, so we'll need to add some shims + // todo: remove this god awfulness when tl esm rewrite + transformFile(path.join(outDir, 'index.js'), (content) => { + return [ + '/// ', + 'const exports = {};', + content, + 'export const tl = exports.tl;', + 'export const mtp = exports.mtp;', + ].join('\n') + }) + transformFile(path.join(outDir, 'binary/reader.js'), (content) => { + return [ + '/// ', + 'const exports = {};', + content, + 'export const __tlReaderMap = exports.__tlReaderMap;', + ].join('\n') + }) + transformFile(path.join(outDir, 'binary/writer.js'), (content) => { + return [ + '/// ', + 'const exports = {};', + content, + 'export const __tlWriterMap = exports.__tlWriterMap;', + ].join('\n') + }) + transformFile(path.join(outDir, 'binary/rsa-keys.js'), (content) => { + return [ + '/// ', + 'const exports = {};', + content, + 'export const __publicKeyIndex = exports.__publicKeyIndex;', + ].join('\n') + }) + + // patch deno.json to add some export maps + transformFile(path.join(outDir, 'deno.json'), (content) => { + const json = JSON.parse(content) + json.exports = {} + + for (const f of files) { + if (!f.match(/\.js(on)?$/)) continue + + if (f === 'index.js') { + json.exports['.'] = './index.js' + } else { + json.exports[`./${f}`] = `./${f}` + } + } + + return JSON.stringify(json, null, 2) + }) + } }, }) diff --git a/packages/tl/package.json b/packages/tl/package.json index caece291..8008e069 100644 --- a/packages/tl/package.json +++ b/packages/tl/package.json @@ -31,5 +31,8 @@ }, "typedoc": { "entryPoint": "index.d.ts" + }, + "jsrOnlyFields": { + "exports": {} } } \ No newline at end of file diff --git a/packages/wasm/build.config.cjs b/packages/wasm/build.config.cjs index be6444e4..0117d0e2 100644 --- a/packages/wasm/build.config.cjs +++ b/packages/wasm/build.config.cjs @@ -1,4 +1,4 @@ -module.exports = ({ path: { join }, fs, outDir, packageDir }) => ({ +module.exports = ({ path: { join }, fs, outDir, packageDir, jsr }) => ({ esmOnlyDirectives: true, final() { fs.cpSync(join(packageDir, 'mtcute.wasm'), join(outDir, 'mtcute.wasm')) diff --git a/packages/wasm/package.json b/packages/wasm/package.json index 2fea4f59..757fbd0c 100644 --- a/packages/wasm/package.json +++ b/packages/wasm/package.json @@ -17,18 +17,13 @@ ".": "./src/index.ts", "./mtcute.wasm": "./mtcute.wasm" }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - }, - "./mtcute.wasm": "./mtcute.wasm" - } - }, + "exportsKeepPath": ["./mtcute.wasm"], "devDependencies": { "@mtcute/core": "workspace:^", "@mtcute/web": "workspace:^", "@mtcute/node": "workspace:^" + }, + "jsrOnlyFields": { + "exports": "./src/index.ts" } } diff --git a/packages/web/package.json b/packages/web/package.json index b6cb0999..774696e9 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -13,25 +13,24 @@ "build": "pnpm run -w build-package web" }, "exports": { - ".": "./src/index.ts" - }, - "distOnlyFields": { - "exports": { - ".": { - "import": "./esm/index.js", - "require": "./cjs/index.js" - }, - "./utils.js": { - "import": "./esm/utils.js", - "require": "./cjs/utils.js" - } - } + ".": "./src/index.ts", + "./utils.js": "./src/utils.ts" }, "dependencies": { "@mtcute/core": "workspace:^", - "@mtcute/wasm": "workspace:^" + "@mtcute/wasm": "workspace:^", + "events": "3.2.0" }, "devDependencies": { "@mtcute/test": "workspace:^" + }, + "denoJson": { + "compilerOptions": { + "lib": [ + "dom", + "dom.iterable", + "WebWorker" + ] + } } } diff --git a/packages/web/src/utils.ts b/packages/web/src/utils.ts new file mode 100644 index 00000000..3356b98c --- /dev/null +++ b/packages/web/src/utils.ts @@ -0,0 +1 @@ +export * from '@mtcute/core/utils.js' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6af1977f..27b2801a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,6 +18,9 @@ importers: '@commitlint/config-conventional': specifier: 17.6.5 version: 17.6.5 + '@teidesu/slow-types-compiler': + specifier: 1.0.2 + version: 1.0.2(typescript@5.4.3) '@types/node': specifier: 20.10.0 version: 20.10.0 @@ -250,16 +253,15 @@ importers: packages/html-parser: dependencies: + '@mtcute/core': + specifier: workspace:^ + version: link:../core htmlparser2: specifier: ^6.0.1 version: 6.1.0 long: specifier: 5.2.3 version: 5.2.3 - devDependencies: - '@mtcute/core': - specifier: workspace:^ - version: link:../core packages/http-proxy: dependencies: @@ -278,13 +280,12 @@ importers: packages/markdown-parser: dependencies: - long: - specifier: 5.2.3 - version: 5.2.3 - devDependencies: '@mtcute/core': specifier: workspace:^ version: link:../core + long: + specifier: 5.2.3 + version: 5.2.3 packages/mtproxy: dependencies: @@ -390,13 +391,12 @@ importers: packages/tl-utils: dependencies: - crc-32: - specifier: 1.2.0 - version: 1.2.0 - devDependencies: '@mtcute/tl-runtime': specifier: workspace:^ version: link:../tl-runtime + crc-32: + specifier: 1.2.0 + version: 1.2.0 packages/wasm: devDependencies: @@ -418,6 +418,9 @@ importers: '@mtcute/wasm': specifier: workspace:^ version: link:../wasm + events: + specifier: 3.2.0 + version: 3.2.0 devDependencies: '@mtcute/test': specifier: workspace:^ @@ -1353,11 +1356,38 @@ packages: /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + /@teidesu/slow-types-compiler@1.0.2(typescript@5.4.3): + resolution: {integrity: sha512-N0e3J/My4t405V5qD2kr6xXwLMlaB+el7bdYKLXJ2yyrLN1eAx4elf6qkeRTF4xy0GoiWrS0gKS0RZfddSOw1w==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + dependencies: + arg: 5.0.2 + dedent: 1.5.3 + eager-async-pool: 1.0.0 + gunzip-maybe: 1.4.2 + semver: 7.6.0 + tar-stream: 3.1.7 + ts-morph: 22.0.0 + typescript: 5.4.3 + transitivePeerDependencies: + - babel-plugin-macros + dev: true + /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} dev: false + /@ts-morph/common@0.23.0: + resolution: {integrity: sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA==} + dependencies: + fast-glob: 3.3.2 + minimatch: 9.0.3 + mkdirp: 3.0.1 + path-browserify: 1.0.1 + dev: true + /@tsconfig/node10@1.0.8: resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==} dev: true @@ -1560,7 +1590,7 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.0 ts-api-utils: 1.0.1(typescript@5.4.3) typescript: 5.4.3 transitivePeerDependencies: @@ -1580,7 +1610,7 @@ packages: '@typescript-eslint/types': 6.4.0 '@typescript-eslint/typescript-estree': 6.4.0(typescript@5.4.3) eslint: 8.47.0 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript @@ -1826,6 +1856,10 @@ packages: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -1929,9 +1963,19 @@ packages: engines: {node: '>= 0.4'} dev: true + /b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + dev: true + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /bare-events@2.2.2: + resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} + requiresBuild: true + dev: true + optional: true + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -2046,12 +2090,22 @@ packages: safe-buffer: 5.2.1 dev: true + /browserify-zlib@0.1.4: + resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} + dependencies: + pako: 0.2.9 + dev: true + /browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} dependencies: pako: 1.0.11 dev: true + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + /buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} dev: true @@ -2294,6 +2348,10 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + /code-block-writer@13.0.1: + resolution: {integrity: sha512-c5or4P6erEA69TxaxTNcHUNcIn+oyxSRTOWV+pSYF+z4epXqNvwvJ70XPGjPNgue83oAFAPBRQYwpAJ/Hpe/Sg==} + dev: true + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -2542,6 +2600,15 @@ packages: mimic-response: 3.1.0 dev: false + /dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + dev: true + /deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} @@ -2738,6 +2805,15 @@ packages: yargs: 17.7.2 dev: true + /duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + dev: true + /eager-async-pool@1.0.0: resolution: {integrity: sha512-A2N+pbceYEz7O2KQ3TNQSSrZsivQ9i28cuNKRxfdT9QvRCoJ51pCP90hSNybOOBfoBHk15ZThJYrQWHo4h2UjA==} dev: true @@ -2775,7 +2851,6 @@ packages: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 - dev: false /enhanced-resolve@5.14.1: resolution: {integrity: sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==} @@ -3269,15 +3344,8 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} dev: true /fast-glob@3.3.1: @@ -3620,7 +3688,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.2 ignore: 5.2.0 merge2: 1.4.1 slash: 3.0.0 @@ -3639,6 +3707,18 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true + /gunzip-maybe@1.4.2: + resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} + hasBin: true + dependencies: + browserify-zlib: 0.1.4 + is-deflate: 1.0.0 + is-gzip: 1.0.0 + peek-stream: 1.1.3 + pumpify: 1.5.1 + through2: 2.0.5 + dev: true + /handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -3992,6 +4072,10 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-deflate@1.0.0: + resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} + dev: true + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -4018,6 +4102,11 @@ packages: dependencies: is-extglob: 2.1.1 + /is-gzip@1.0.0: + resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} + engines: {node: '>=0.10.0'} + dev: true + /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -4670,6 +4759,12 @@ packages: hasBin: true dev: false + /mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + dev: true + /mlly@1.4.2: resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} dependencies: @@ -5015,6 +5110,10 @@ packages: engines: {node: '>=6'} dev: true + /pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + dev: true + /pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} dev: true @@ -5123,6 +5222,14 @@ packages: sha.js: 2.4.11 dev: true + /peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + dependencies: + buffer-from: 1.1.2 + duplexify: 3.7.1 + through2: 2.0.5 + dev: true + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -5253,6 +5360,13 @@ packages: safe-buffer: 5.2.1 dev: true + /pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: @@ -5260,6 +5374,14 @@ packages: once: 1.4.0 dev: false + /pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + dev: true + /punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} dev: true @@ -5289,6 +5411,10 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + dev: true + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} @@ -5775,6 +5901,19 @@ packages: xtend: 4.0.2 dev: true + /stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + dev: true + + /streamx@2.16.1: + resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + optionalDependencies: + bare-events: 2.2.2 + dev: true + /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -5923,6 +6062,14 @@ packages: readable-stream: 3.6.0 dev: false + /tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + dependencies: + b4a: 1.6.6 + fast-fifo: 1.3.2 + streamx: 2.16.1 + dev: true + /tar@6.1.11: resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} engines: {node: '>= 10'} @@ -5953,6 +6100,13 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: true + /through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: @@ -6017,6 +6171,13 @@ packages: typescript: 5.4.3 dev: true + /ts-morph@22.0.0: + resolution: {integrity: sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw==} + dependencies: + '@ts-morph/common': 0.23.0 + code-block-writer: 13.0.1 + dev: true + /ts-node@10.9.1(@types/node@20.10.0)(typescript@5.4.3): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true diff --git a/scripts/build-package.js b/scripts/build-package.js index 23c9865c..b697cf93 100644 --- a/scripts/build-package.js +++ b/scripts/build-package.js @@ -1,16 +1,22 @@ +/* eslint-disable no-inner-declarations */ const cp = require('child_process') const path = require('path') const fs = require('fs') const glob = require('glob') +const ts = require('typescript') +const stc = require('@teidesu/slow-types-compiler') if (process.argv.length < 3) { console.log('Usage: build-package.js ') process.exit(0) } +const IS_JSR = process.env.JSR === '1' + const packagesDir = path.join(__dirname, '../packages') const packageDir = path.join(packagesDir, process.argv[2]) -const outDir = path.join(packageDir, 'dist') +let outDir = path.join(packageDir, 'dist') +if (IS_JSR) outDir = path.join(outDir, 'jsr') function exec(cmd, params) { cp.execSync(cmd, { cwd: packageDir, stdio: 'inherit', ...params }) @@ -53,6 +59,7 @@ const buildConfig = { transformFile, packageDir, outDir, + jsr: IS_JSR, }) } @@ -60,6 +67,10 @@ const buildConfig = { })(), } +function getPackageVersion(name) { + return require(path.join(packagesDir, name, 'package.json')).version +} + function buildPackageJson() { const pkgJson = JSON.parse(fs.readFileSync(path.join(packageDir, 'package.json'), 'utf-8')) @@ -85,6 +96,13 @@ function buildPackageJson() { delete pkgJson.distOnlyFields } + if (pkgJson.jsrOnlyFields) { + if (IS_JSR) { + Object.assign(pkgJson, pkgJson.jsrOnlyFields) + } + delete pkgJson.jsrOnlyFields + } + function replaceWorkspaceDependencies(field) { if (!pkgJson[field]) return @@ -104,11 +122,8 @@ function buildPackageJson() { } // note: pnpm replaces workspace:* with the current version, unlike this script - const depVersion = - value === 'workspace:*' ? - '*' : - require(path.join(packageDir, '..', name.slice(8), 'package.json')).version - dependencies[name] = `^${depVersion}` + const depVersion = value === 'workspace:*' ? '*' : `^${getPackageVersion(name.slice(8))}` + dependencies[name] = depVersion } } } @@ -120,17 +135,21 @@ function buildPackageJson() { delete pkgJson.typedoc - function maybeFixPath(p, repl) { - if (!p) return p + if (pkgJson.browser) { + function maybeFixPath(p, repl) { + if (!p) return p - if (p.startsWith('./src/')) { - return repl + p.slice(6) + if (p.startsWith('./src/')) { + return repl + p.slice(6) + } + + if (p.startsWith('./')) { + return repl + p.slice(2) + } + + return p } - return p - } - - if (pkgJson.browser) { for (const key of Object.keys(pkgJson.browser)) { if (!key.startsWith('./src/')) continue @@ -145,24 +164,88 @@ function buildPackageJson() { } } - fs.writeFileSync(path.join(packageDir, 'dist/package.json'), JSON.stringify(pkgJson, null, 2)) + // fix exports + if (pkgJson.exports) { + function maybeFixPath(path, repl) { + if (!path) return path + if (pkgJson.exportsKeepPath?.includes(path)) return path + + if (path.startsWith('./src/')) { + path = repl + path.slice(6) + } else if (path.startsWith('./')) { + path = repl + path.slice(2) + } + + return path.replace(/\.ts$/, '.js') + } + + function fixValue(value) { + if (IS_JSR) { + return maybeFixPath(value, './').replace(/\.js$/, '.ts') + } + + if (buildConfig.buildCjs) { + return { + import: maybeFixPath(value, './esm/'), + require: maybeFixPath(value, './cjs/'), + } + } + + return maybeFixPath(value, './') + } + + if (typeof pkgJson.exports === 'string') { + pkgJson.exports = { + '.': fixValue(pkgJson.exports), + } + } else { + for (const key of Object.keys(pkgJson.exports)) { + const value = pkgJson.exports[key] + + if (typeof value !== 'string') { + throw new Error('Conditional exports are not supported') + } + + pkgJson.exports[key] = fixValue(value) + } + } + + delete pkgJson.exportsKeepPath + } + + if (!IS_JSR) { + fs.writeFileSync(path.join(outDir, 'package.json'), JSON.stringify(pkgJson, null, 2)) + } + + return pkgJson } // clean fs.rmSync(path.join(outDir), { recursive: true, force: true }) fs.mkdirSync(path.join(outDir), { recursive: true }) +// for jsr - copy typescript sources +if (IS_JSR) { + buildConfig.buildCjs = false +} + buildConfig.before() -if (buildConfig.buildTs) { +if (buildConfig.buildTs && !IS_JSR) { console.log('[i] Building typescript...') - fs.cpSync(path.join(packageDir, 'tsconfig.json'), path.join(packageDir, 'tsconfig.backup.json')) + const tsconfigPath = path.join(packageDir, 'tsconfig.json') + fs.cpSync(tsconfigPath, path.join(packageDir, 'tsconfig.backup.json')) - let tsconfig = fs.readFileSync(path.join(packageDir, 'tsconfig.backup.json'), 'utf-8') - // what the fuck - tsconfig = tsconfig.replace(/(?<="extends": "\.\.\/\.\.\/)tsconfig\.json(?=",)/, '.config/tsconfig.build.json') - fs.writeFileSync(path.join(packageDir, 'tsconfig.json'), tsconfig) + const tsconfig = ts.parseConfigFileTextToJson(tsconfigPath, fs.readFileSync(tsconfigPath, 'utf-8')).config + + if (tsconfig.extends === '../../tsconfig.json') { + tsconfig.extends = '../../.config/tsconfig.build.json' + } else { + throw new Error('expected tsconfig to extend base config') + } + + fs.writeFileSync(path.join(packageDir, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2)) const restoreTsconfig = () => { fs.renameSync(path.join(packageDir, 'tsconfig.backup.json'), path.join(packageDir, 'tsconfig.json')) @@ -202,10 +285,17 @@ if (buildConfig.buildTs) { const orig = fs.readFileSync(pkgJson, 'utf8') originalFiles[pkgJson] = orig - fs.writeFileSync(pkgJson, JSON.stringify({ - ...JSON.parse(orig), - type: 'commonjs', - }, null, 2)) + fs.writeFileSync( + pkgJson, + JSON.stringify( + { + ...JSON.parse(orig), + type: 'commonjs', + }, + null, + 2, + ), + ) // maybe also dist/package.json const distPkgJson = path.join(packagesDir, pkg, 'dist/package.json') @@ -214,10 +304,17 @@ if (buildConfig.buildTs) { const orig = fs.readFileSync(distPkgJson, 'utf8') originalFiles[distPkgJson] = orig - fs.writeFileSync(distPkgJson, JSON.stringify({ - ...JSON.parse(orig), - type: 'commonjs', - }, null, 2)) + fs.writeFileSync( + distPkgJson, + JSON.stringify( + { + ...JSON.parse(orig), + type: 'commonjs', + }, + null, + 2, + ), + ) } } @@ -244,6 +341,7 @@ if (buildConfig.buildTs) { restoreTsconfig() + // todo: can we remove these? console.log('[i] Post-processing...') if (buildConfig.removeReferenceComments) { @@ -278,15 +376,160 @@ if (buildConfig.buildTs) { if (changed) fs.writeFileSync(f, content) } } +} else if (buildConfig.buildTs && IS_JSR) { + console.log('[i] Copying sources...') + fs.cpSync(path.join(packageDir, 'src'), outDir, { recursive: true }) + + const printer = ts.createPrinter() + + for (const f of glob.sync(path.join(outDir, '**/*.ts'))) { + let fileContent = fs.readFileSync(f, 'utf8') + let changed = false + + // replace .js imports with .ts + const file = ts.createSourceFile(f, fileContent, ts.ScriptTarget.ESNext, true) + let changedTs = false + + for (const imp of file.statements) { + if (imp.kind !== ts.SyntaxKind.ImportDeclaration && imp.kind !== ts.SyntaxKind.ExportDeclaration) { + continue + } + if (imp.kind === ts.SyntaxKind.ExportDeclaration && !imp.moduleSpecifier) { + continue + } + const mod = imp.moduleSpecifier.text + + if (mod[0] === '.' && mod.endsWith('.js')) { + changedTs = true + imp.moduleSpecifier = { + kind: ts.SyntaxKind.StringLiteral, + text: mod.slice(0, -3) + '.ts', + } + } + } + + if (changedTs) { + fileContent = printer.printFile(file) + changed = true + } + + // add shims for node-specific APIs and replace NodeJS.* types + // pretty fragile, but it works for now + const typesToReplace = { + 'NodeJS\\.Timeout': 'number', + 'NodeJS\\.Immediate': 'number', + } + const nodeSpecificApis = { + setImmediate: '(cb: (...args: any[]) => void, ...args: any[]) => number', + clearImmediate: '(id: number) => void', + Buffer: + '{ ' + + 'concat: (...args: any[]) => Uint8Array, ' + + 'from: (data: any, encoding?: string) => { toString(encoding?: string): string }, ' + + ' }', + SharedWorker: ['type', 'never'], + process: '{ ' + 'hrtime: { bigint: () => bigint }, ' + '}', + } + + for (const [name, decl_] of Object.entries(nodeSpecificApis)) { + if (fileContent.includes(name)) { + changed = true + const isType = Array.isArray(decl_) && decl_[0] === 'type' + const decl = isType ? decl_[1] : decl_ + + if (isType) { + fileContent = `declare type ${name} = ${decl};\n` + fileContent + } else { + fileContent = `declare const ${name}: ${decl};\n` + fileContent + } + } + } + + for (const [oldType, newType] of Object.entries(typesToReplace)) { + if (fileContent.match(oldType)) { + changed = true + fileContent = fileContent.replace(new RegExp(oldType, 'g'), newType) + } + } + + if (changed) { + fs.writeFileSync(f, fileContent) + } + } } -console.log('[i] Copying files...') +console.log('[i] Copying misc files...') + +const builtPkgJson = buildPackageJson() if (buildConfig.buildCjs) { fs.writeFileSync(path.join(outDir, 'cjs/package.json'), JSON.stringify({ type: 'commonjs' }, null, 2)) } -buildPackageJson() +if (IS_JSR) { + // generate deno.json from package.json + // https://jsr.io/docs/package-configuration + + const importMap = {} + + if (builtPkgJson.dependencies) { + for (const [name, version] of Object.entries(builtPkgJson.dependencies)) { + if (name.startsWith('@mtcute/')) { + importMap[name] = `jsr:${name}@${version}` + } else { + importMap[name] = `npm:${name}@${version}` + } + } + } + + for (const [name, target] of Object.entries(builtPkgJson.exports)) { + // jsr doesn't support wildcards, so we need to flatten those + if (!name.includes('*')) continue + + if (!name.endsWith('*') || !target.endsWith('*')) { + // for simplicity + it's the only one supported in some bundlers + throw new Error(`Invalid wildcard in export map: ${name} -> ${target}`) + } + + const base = name.slice(0, -1) + const targetBase = target.slice(0, -1) + + for (const file of glob.sync(path.join(outDir, base, '**/*'))) { + const newName = (base + path.relative(path.join(outDir, base), file)).replace(/\.ts$/, '.js') + const newTarget = targetBase + path.relative(path.join(outDir, base), file) + builtPkgJson.exports[newName] = newTarget + } + + delete builtPkgJson.exports[name] + } + + const denoJson = path.join(outDir, 'deno.json') + fs.writeFileSync( + denoJson, + JSON.stringify( + { + name: builtPkgJson.name, + version: builtPkgJson.version, + exports: builtPkgJson.exports, + exclude: ['**/*.test.ts', '**/*.test-utils.ts', '**/__fixtures__/**'], + imports: importMap, + ...builtPkgJson.denoJson, + }, + null, + 2, + ), + ) + + console.log('[i] Processing with slow-types-compiler...') + const project = stc.createProject() + stc.processPackage(project, denoJson) + const unsavedSourceFiles = project.getSourceFiles().filter((s) => !s.isSaved()) + + if (unsavedSourceFiles.length > 0) { + console.log('[v] Changed %d files', unsavedSourceFiles.length) + project.saveSync() + } +} try { fs.cpSync(path.join(packageDir, 'README.md'), path.join(outDir, 'README.md')) @@ -296,8 +539,16 @@ try { fs.cpSync(path.join(__dirname, '../LICENSE'), path.join(outDir, 'LICENSE')) -fs.writeFileSync(path.join(outDir, '.npmignore'), '*.tsbuildinfo\n') +if (!IS_JSR) { + fs.writeFileSync(path.join(outDir, '.npmignore'), '*.tsbuildinfo\n') +} Promise.resolve(buildConfig.final()).then(() => { - console.log('[v] Done!') + if (IS_JSR) { + console.log('[i] Trying to publish with --dry-run') + exec('deno publish --dry-run --allow-dirty --quiet', { cwd: outDir }) + console.log('[v] All good!') + } else { + console.log('[v] Done!') + } }) diff --git a/scripts/publish.js b/scripts/publish.js index bd5d3b06..dcd7dff8 100644 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -2,21 +2,40 @@ const fs = require('fs') const path = require('path') const cp = require('child_process') -const NPMJS = 'https://registry.npmjs.org' -const REGISTRY = process.env.REGISTRY || NPMJS +const IS_JSR = process.env.JSR === '1' +const MAIN_REGISTRY = IS_JSR ? 'http://jsr.test/' : 'https://registry.npmjs.org' +const REGISTRY = process.env.REGISTRY || MAIN_REGISTRY exports.REGISTRY = REGISTRY +if (IS_JSR) { + // for the underlying tools that expect JSR_URL env var + process.env.JSR_URL = REGISTRY +} + +const JSR_EXCEPTIONS = { + bun: 'never', + 'create-bot': 'never', + 'crypto-node': 'never', + node: 'never', + 'http-proxy': 'never', + 'socks-proxy': 'never', + mtproxy: 'never', + test: 'never', +} + async function checkVersion(name, version, retry = 0) { let registry = REGISTRY if (!registry.endsWith('/')) registry += '/' - return fetch(`${registry}@mtcute/${name}/${version}`) + const url = IS_JSR ? `${registry}@mtcute/${name}/${version}_meta.json` : `${registry}@mtcute/${name}/${version}` + + return fetch(url) .then((r) => r.status === 200) .catch((err) => { if (retry >= 5) throw err // for whatever reason this request sometimes fails with ECONNRESET - // no idea why, probably some issue in orbstack networking + // no idea why, probably some issue in docker networking console.log('[i] Error checking version:') console.log(err) @@ -39,12 +58,14 @@ async function publishSinglePackage(name) { console.log('[i] Publishing %s', name) - const version = require(path.join(packageDir, 'dist/package.json')).version + const version = IS_JSR ? + require(path.join(packageDir, 'dist/jsr/deno.json')).version : + require(path.join(packageDir, 'dist/package.json')).version const exists = await checkVersion(name, version) if (exists) { - if (process.env.E2E) { + if (process.env.E2E && !IS_JSR) { console.log('[i] %s already exists, unpublishing..', name) cp.execSync(`npm unpublish --registry ${REGISTRY} --force @mtcute/${name}`, { cwd: path.join(packageDir, 'dist'), @@ -57,26 +78,54 @@ async function publishSinglePackage(name) { } } - // publish to npm - const params = REGISTRY === NPMJS ? '--access public' : '--force' - cp.execSync(`npm publish --registry ${REGISTRY} ${params} -q`, { - cwd: path.join(packageDir, 'dist'), - stdio: 'inherit', - }) + if (IS_JSR) { + // publish to jsr + cp.execSync('deno publish --allow-dirty', { + cwd: path.join(packageDir, 'dist/jsr'), + stdio: 'inherit', + }) + } else { + // make sure dist/jsr doesn't exist (it shouldn't, but just in case) + if (fs.existsSync(path.join(packageDir, 'dist/jsr'))) { + fs.rmdirSync(path.join(packageDir, 'dist/jsr'), { recursive: true }) + } + + // publish to npm + const params = REGISTRY === MAIN_REGISTRY ? '--access public' : '--force' + cp.execSync(`npm publish --registry ${REGISTRY} ${params} -q`, { + cwd: path.join(packageDir, 'dist'), + stdio: 'inherit', + }) + } } -const LOCAL = ['crypto'] - function listPackages() { - const packages = [] + let packages = [] for (const f of fs.readdirSync(path.join(__dirname, '../packages'))) { - if (LOCAL.indexOf(f) > -1) continue if (f[0] === '.') continue + if (IS_JSR && JSR_EXCEPTIONS[f] === 'never') continue + if (!IS_JSR && JSR_EXCEPTIONS[f] === 'only') continue packages.push(f) } + if (IS_JSR) { + // we should sort them in a way that dependencies are published first. stc has a util for that + const map = {} + + for (const pkg of packages) { + const deps = require(`../packages/${pkg}/package.json`).dependencies || {} + map[pkg] = Object.keys(deps) + .filter((d) => d.startsWith('@mtcute/')) + .map((d) => d.slice(8)) + } + + const stc = require('@teidesu/slow-types-compiler') + packages = stc.determinePublishOrder(map) + console.log('[i] Publishing order:', packages.join(', ')) + } + return packages }