build: initial support for jsr building

This commit is contained in:
alina 🌸 2024-04-20 01:07:53 +03:00
parent c5ce2c321d
commit 9d114a3552
Signed by: teidesu
SSH key fingerprint: SHA256:uNeCpw6aTSU4aIObXLvHfLkDa82HWH9EiOj9AXOIRpI
30 changed files with 682 additions and 302 deletions

View file

@ -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",

View file

@ -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:^",

View file

@ -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:^"
},

View file

@ -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)
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)
}
},

View file

@ -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:^",

View file

@ -32,7 +32,8 @@ 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(
const JPEG_HEADER = () =>
getPlatform().hexDecode(
'ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e1928' +
'2321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aad' +
'aad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c35' +
@ -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]
}

View file

@ -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 {

View file

@ -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:^",

View file

@ -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"

View file

@ -5,19 +5,13 @@
"description": "Support for TDLib and Bot API file ID for mtcute",
"author": "alina sireneva <alina@tei.su>",
"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"
}
}
".": "./src/index.ts"
},
"dependencies": {
"@mtcute/tl-runtime": "workspace:^",

View file

@ -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:^"
}
}

View file

@ -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:^"
}

View file

@ -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/*"
}
}
".": "./src/index.ts",
"./plurals/*": "./src/plurals/*"
},
"devDependencies": {
"@mtcute/core": "workspace:^",
"@mtcute/dispatcher": "workspace:^"
},
"jsrOnlyFields": {
"dependencies": {
"@mtcute/core": "workspace:^",
"@mtcute/dispatcher": "workspace:^"
}
}
}

View file

@ -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:^"
}
}

View file

@ -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:^"
}

View file

@ -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:^",

View file

@ -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"

View file

@ -35,9 +35,5 @@
"browser": {
"./src/platform.js": "./src/platform.web.js"
},
"distOnlyFields": {
"exports": {
".": "./esm/index.js"
}
}
"exports": "./src/index.ts"
}

View file

@ -11,15 +11,9 @@
"docs": "typedoc",
"build": "pnpm run -w build-package tl-runtime"
},
"distOnlyFields": {
"exports": {
".": {
"import": "./esm/index.js",
"require": "./cjs/index.js"
}
}
".": "./src/index.ts"
},
"main": "src/index.ts",
"dependencies": {
"long": "5.2.3"
}

View file

@ -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:^"
}
}

View file

@ -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

View file

@ -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 [
'/// <reference types="./index.d.ts" />',
'const exports = {};',
content,
'export const tl = exports.tl;',
'export const mtp = exports.mtp;',
].join('\n')
})
transformFile(path.join(outDir, 'binary/reader.js'), (content) => {
return [
'/// <reference types="./reader.d.ts" />',
'const exports = {};',
content,
'export const __tlReaderMap = exports.__tlReaderMap;',
].join('\n')
})
transformFile(path.join(outDir, 'binary/writer.js'), (content) => {
return [
'/// <reference types="./writer.d.ts" />',
'const exports = {};',
content,
'export const __tlWriterMap = exports.__tlWriterMap;',
].join('\n')
})
transformFile(path.join(outDir, 'binary/rsa-keys.js'), (content) => {
return [
'/// <reference types="./rsa-keys.d.ts" />',
'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)
})
}
},
})

View file

@ -31,5 +31,8 @@
},
"typedoc": {
"entryPoint": "index.d.ts"
},
"jsrOnlyFields": {
"exports": {}
}
}

View file

@ -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'))

View file

@ -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"
}
}

View file

@ -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"
]
}
}
}

View file

@ -0,0 +1 @@
export * from '@mtcute/core/utils.js'

View file

@ -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

View file

@ -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 <package name>')
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,6 +135,7 @@ function buildPackageJson() {
delete pkgJson.typedoc
if (pkgJson.browser) {
function maybeFixPath(p, repl) {
if (!p) return p
@ -127,10 +143,13 @@ function buildPackageJson() {
return repl + p.slice(6)
}
if (p.startsWith('./')) {
return repl + p.slice(2)
}
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({
fs.writeFileSync(
pkgJson,
JSON.stringify(
{
...JSON.parse(orig),
type: 'commonjs',
}, null, 2))
},
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({
fs.writeFileSync(
distPkgJson,
JSON.stringify(
{
...JSON.parse(orig),
type: 'commonjs',
}, null, 2))
},
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',
}
}
}
console.log('[i] Copying files...')
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 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'))
if (!IS_JSR) {
fs.writeFileSync(path.join(outDir, '.npmignore'), '*.tsbuildinfo\n')
}
Promise.resolve(buildConfig.final()).then(() => {
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!')
}
})

View file

@ -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) {
}
}
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 === NPMJS ? '--access public' : '--force'
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
}