diff --git a/.config/vite-utils/package-json.js b/.config/vite-utils/package-json.js
new file mode 100644
index 00000000..3b65a0af
--- /dev/null
+++ b/.config/vite-utils/package-json.js
@@ -0,0 +1,167 @@
+import { readFileSync } from 'node:fs'
+import { resolve } from 'node:path'
+import { fileURLToPath } from 'node:url'
+
+const rootPackageJson = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf-8'))
+const packagesDir = fileURLToPath(new URL('../../packages', import.meta.url))
+const IS_JSR = process.env.JSR === '1'
+
+export function getPackageVersion(name) {
+ const json = JSON.parse(readFileSync(resolve(packagesDir, name, 'package.json'), 'utf-8'))
+ return json.version
+}
+
+export function processPackageJson(packageDir) {
+ const packageJsonOrig = JSON.parse(readFileSync(resolve(packageDir, 'package.json'), 'utf-8'))
+ const packageJson = structuredClone(packageJsonOrig)
+ const entrypoints = {}
+
+ // copy common fields from root
+ for (const field of ['license', 'author', 'contributors', 'homepage', 'repository', 'bugs']) {
+ if (rootPackageJson[field]) {
+ packageJson[field] = rootPackageJson[field]
+ }
+ }
+
+ const newScripts = {}
+
+ if (packageJson.keepScripts) {
+ for (const script of packageJson.keepScripts) {
+ newScripts[script] = packageJson.scripts[script]
+ }
+ delete packageJson.keepScripts
+ }
+ packageJson.scripts = newScripts
+ delete packageJson.devDependencies
+ delete packageJson.private
+
+ if (packageJson.distOnlyFields) {
+ Object.assign(packageJson, packageJson.distOnlyFields)
+ delete packageJson.distOnlyFields
+ }
+
+ if (packageJson.jsrOnlyFields) {
+ if (IS_JSR) {
+ Object.assign(packageJson, packageJson.jsrOnlyFields)
+ }
+ delete packageJson.jsrOnlyFields
+ }
+
+ function replaceWorkspaceDependencies(field) {
+ if (!packageJson[field]) return
+
+ const dependencies = packageJson[field]
+
+ for (const name of Object.keys(dependencies)) {
+ const value = dependencies[name]
+
+ if (value.startsWith('workspace:')) {
+ if (value !== 'workspace:^' && value !== 'workspace:*') {
+ throw new Error(
+ `Cannot replace workspace dependency ${name} with ${value} - only workspace:^ and * are supported`,
+ )
+ }
+ if (!name.startsWith('@mtcute/')) {
+ throw new Error(`Cannot replace workspace dependency ${name} - only @mtcute/* is supported`)
+ }
+
+ // note: pnpm replaces workspace:* with the current version, unlike this script
+ const depVersion = value === 'workspace:*' ? '*' : `^${getPackageVersion(name.slice(8))}`
+ dependencies[name] = depVersion
+ }
+ }
+ }
+
+ replaceWorkspaceDependencies('dependencies')
+ replaceWorkspaceDependencies('devDependencies')
+ replaceWorkspaceDependencies('peerDependencies')
+ replaceWorkspaceDependencies('optionalDependencies')
+
+ delete packageJson.typedoc
+
+ if (packageJson.browser) {
+ function maybeFixPath(p, repl) {
+ if (!p) return p
+
+ if (p.startsWith('./src/')) {
+ return repl + p.slice(6)
+ }
+
+ if (p.startsWith('./')) {
+ return repl + p.slice(2)
+ }
+
+ return p
+ }
+
+ for (const key of Object.keys(packageJson.browser)) {
+ if (!key.startsWith('./src/')) continue
+
+ const path = key.slice(6)
+ packageJson.browser[`./esm/${path}`] = maybeFixPath(packageJson.browser[key], './esm/')
+
+ delete packageJson.browser[key]
+ }
+ }
+
+ if (packageJson.exports) {
+ let exports = packageJson.exports
+ if (typeof exports === 'string') {
+ exports = { '.': exports }
+ }
+ if (typeof exports !== 'object') {
+ throw new TypeError('package.json exports must be an object')
+ }
+
+ const newExports = {}
+ for (const [key, value] of Object.entries(exports)) {
+ if (typeof value !== 'string') {
+ throw new TypeError(`package.json exports value must be a string: ${key}`)
+ }
+ if (value.endsWith('.wasm')) {
+ newExports[key] = value
+ continue
+ }
+
+ let entrypointName = key.replace(/^\.(\/|$)/, '').replace(/\.js$/, '')
+ if (entrypointName === '') entrypointName = 'index'
+
+ entrypoints[entrypointName] = value
+ newExports[key] = {
+ import: {
+ types: `./${entrypointName}.d.ts`,
+ default: `./${entrypointName}.js`,
+ },
+ require: {
+ types: `./${entrypointName}.d.cts`,
+ default: `./${entrypointName}.cjs`,
+ },
+ }
+ }
+
+ packageJson.exports = newExports
+ }
+
+ if (typeof packageJson.bin === 'object') {
+ const newBin = {}
+ for (const [key, value] of Object.entries(packageJson.bin)) {
+ if (typeof value !== 'string') {
+ throw new TypeError(`package.json bin value must be a string: ${key}`)
+ }
+
+ let entrypointName = key.replace(/^\.(\/|$)/, '').replace(/\.js$/, '')
+ if (entrypointName === '') entrypointName = 'index'
+
+ entrypoints[entrypointName] = value
+ newBin[key] = `./${entrypointName}.js`
+ }
+
+ packageJson.bin = newBin
+ }
+
+ return {
+ packageJsonOrig,
+ packageJson,
+ entrypoints,
+ }
+}
diff --git a/.config/vite.browser.ts b/.config/vite.browser.ts
index d2586158..b777e51c 100644
--- a/.config/vite.browser.ts
+++ b/.config/vite.browser.ts
@@ -38,10 +38,18 @@ export default mergeConfig(baseConfig, {
],
build: {
rollupOptions: {
- external: ['bun:sqlite'],
+ external: ['bun:sqlite', '@jsr/db__sqlite'],
},
},
define: {
'import.meta.env.TEST_ENV': '"browser"',
},
+ optimizeDeps: {
+ esbuildOptions: {
+ // for WHATEVER REASON browserify-zlib uses `global` and it dies in browser lol
+ define: {
+ global: 'globalThis',
+ },
+ },
+ },
})
diff --git a/.config/vite.build.ts b/.config/vite.build.ts
new file mode 100644
index 00000000..5f7ad0df
--- /dev/null
+++ b/.config/vite.build.ts
@@ -0,0 +1,111 @@
+///
+import { cpSync, existsSync, writeFileSync } from 'node:fs'
+import { relative, resolve } from 'node:path'
+import { fileURLToPath } from 'node:url'
+
+import type { ConfigEnv, UserConfig } from 'vite'
+import { nodeExternals } from 'rollup-plugin-node-externals'
+import dts from 'vite-plugin-dts'
+
+import { processPackageJson } from './vite-utils/package-json'
+
+const rootDir = fileURLToPath(new URL('..', import.meta.url))
+
+export default async (env: ConfigEnv): Promise => {
+ if (env.command !== 'build') {
+ throw new Error('This config is only for building')
+ }
+
+ const { packageJson, entrypoints } = processPackageJson(process.cwd())
+
+ let customConfig: any
+ try {
+ const mod = await import(resolve(process.cwd(), 'build.config.js'))
+ customConfig = await mod.default()
+ } catch (e) {
+ if (e.code !== 'ERR_MODULE_NOT_FOUND') throw e
+ }
+
+ const CJS_DEPRECATION_WARNING = `
+if (typeof globalThis !== 'undefined' && !globalThis._MTCUTE_CJS_DEPRECATION_WARNED) {
+ globalThis._MTCUTE_CJS_DEPRECATION_WARNED = true
+ console.warn("[${packageJson.name}] CommonJS support is deprecated and will be removed soon. Please consider switching to ESM, it's "+(new Date()).getFullYear()+" already.")
+ console.warn("[${packageJson.name}] Learn more about switching to ESM: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c")
+}
+ `.trim()
+
+ if (customConfig?.preBuild) {
+ await customConfig.preBuild()
+ }
+
+ return {
+ build: {
+ rollupOptions: {
+ plugins: [
+ ...(customConfig?.rollupPluginsPre ?? []),
+ nodeExternals(),
+ {
+ name: 'mtcute-finalize',
+ renderChunk(code, chunk, options) {
+ if (options.format !== 'cjs') return null
+
+ return `${CJS_DEPRECATION_WARNING}\n${code}`
+ },
+ async closeBundle() {
+ const packageDir = process.cwd()
+ const outDir = resolve(packageDir, 'dist')
+
+ customConfig?.finalPackageJson?.(packageJson)
+
+ writeFileSync(resolve(outDir, 'package.json'), JSON.stringify(packageJson, null, 4))
+ cpSync(resolve(rootDir, 'LICENSE'), resolve(outDir, 'LICENSE'))
+ cpSync(resolve(process.cwd(), 'README.md'), resolve(outDir, 'README.md'))
+
+ if (existsSync(resolve(outDir, 'chunks/cjs'))) {
+ // write {"type":"commonjs"} into chunks/cjs so that node doesn't complain
+ const cjsFile = resolve(outDir, 'chunks/cjs/package.json')
+ writeFileSync(cjsFile, JSON.stringify({ type: 'commonjs' }, null, 4))
+ }
+
+ for (const [name, entry] of Object.entries(entrypoints)) {
+ const dTsFile = resolve(outDir, `${name}.d.ts`)
+ if (!existsSync(dTsFile)) {
+ const entryTypings = resolve(outDir, entry.replace('/src/', '/').replace(/\.ts$/, '.d.ts'))
+ if (!existsSync(entryTypings)) continue
+
+ const relativePath = relative(outDir, entryTypings)
+ writeFileSync(dTsFile, `export * from './${relativePath.replace(/\.d\.ts$/, '.js')}'`)
+ }
+
+ cpSync(dTsFile, dTsFile.replace(/\.d\.ts$/, '.d.cts'))
+ }
+
+ await customConfig?.final?.({ outDir, packageDir })
+ },
+ },
+ ...(customConfig?.rollupPluginsPost ?? []),
+ ],
+ output: {
+ minifyInternalExports: false,
+ chunkFileNames: 'chunks/[format]/[hash].js',
+ },
+ external: customConfig?.external,
+ },
+ lib: {
+ entry: entrypoints as any,
+ formats: customConfig?.buildCjs === false ? ['es'] : ['es', 'cjs'],
+ },
+ minify: false,
+ outDir: 'dist',
+ emptyOutDir: true,
+ target: 'es2022',
+ },
+ plugins: [
+ ...(customConfig?.vitePlugins ?? []),
+ dts({
+ // broken; see https://github.com/qmhc/vite-plugin-dts/issues/321, https://github.com/microsoft/rushstack/issues/3557
+ // rollupTypes: true,
+ }),
+ ],
+ }
+}
diff --git a/.config/vite.bun.ts b/.config/vite.bun.ts
index ac2bdad6..54dd353e 100644
--- a/.config/vite.bun.ts
+++ b/.config/vite.bun.ts
@@ -82,7 +82,10 @@ export default defineConfig({
name: 'fix-wasm-load',
async transform(code) {
if (code.includes('@mtcute/wasm/mtcute.wasm')) {
- return code.replace('@mtcute/wasm/mtcute.wasm', resolve(__dirname, '../packages/wasm/mtcute.wasm'))
+ return code.replace('@mtcute/wasm/mtcute.wasm', resolve(__dirname, '../packages/wasm/src/mtcute.wasm'))
+ }
+ if (code.includes('./mtcute.wasm')) {
+ return code.replace(/\.?\.\/mtcute\.wasm/, resolve(__dirname, '../packages/wasm/src/mtcute.wasm'))
}
return code
diff --git a/.config/vite.deno.ts b/.config/vite.deno.ts
index 796d847f..1d202639 100644
--- a/.config/vite.deno.ts
+++ b/.config/vite.deno.ts
@@ -70,17 +70,16 @@ export default defineConfig({
})
},
},
- // todo
- // {
- // name: 'fix-wasm-load',
- // async transform(code, id) {
- // if (code.includes('@mtcute/wasm/mtcute.wasm')) {
- // return code.replace('@mtcute/wasm/mtcute.wasm', resolve(__dirname, '../packages/wasm/mtcute.wasm'))
- // }
+ {
+ name: 'fix-wasm-load',
+ async transform(code) {
+ if (code.includes('./mtcute.wasm')) {
+ return code.replace(/\.?\.\/mtcute\.wasm/, resolve(__dirname, '../packages/wasm/src/mtcute.wasm'))
+ }
- // return code
- // }
- // },
+ return code
+ },
+ },
testSetup(),
],
define: {
diff --git a/.config/vite.ts b/.config/vite.ts
index 39bbe63b..281d2373 100644
--- a/.config/vite.ts
+++ b/.config/vite.ts
@@ -26,12 +26,4 @@ export default defineConfig({
define: {
'import.meta.env.TEST_ENV': '"node"',
},
- optimizeDeps: {
- esbuildOptions: {
- // for WHATEVER REASON browserify-zlib uses `global` and it dies in browser lol
- define: {
- global: 'globalThis',
- },
- },
- },
})
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index b4b6bb42..9b22cf51 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -59,14 +59,14 @@ jobs:
GH_RELEASE: 1
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: node scripts/publish.js ${{ steps.find.outputs.modified }}
- - uses: denoland/setup-deno@v1
- with:
- deno-version: '1.45.5'
- - name: Build packages and publish to JSR
- env:
- JSR: 1
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: node scripts/publish.js ${{ steps.find.outputs.modified }}
+ # - uses: denoland/setup-deno@v1
+ # with:
+ # deno-version: '1.45.5'
+ # - name: Build packages and publish to JSR
+ # env:
+ # JSR: 1
+ # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ # run: node scripts/publish.js ${{ steps.find.outputs.modified }}
- name: Commit version bumps
run: |
git commit -am "v${{ steps.bump.outputs.version }}"
diff --git a/e2e/deno/tests/02.methods.ts b/e2e/deno/tests/02.methods.ts
index e60e6841..5d46712d 100644
--- a/e2e/deno/tests/02.methods.ts
+++ b/e2e/deno/tests/02.methods.ts
@@ -1,4 +1,4 @@
-import { assertEquals, assertNotEquals } from 'https://deno.land/std@0.223.0/assert/mod.ts'
+import { assertEquals } from 'https://deno.land/std@0.223.0/assert/mod.ts'
import { MtPeerNotFoundError } from '@mtcute/core'
import { TelegramClient } from '@mtcute/core/client.js'
@@ -42,17 +42,5 @@ Deno.test('2. calling methods', { sanitizeResources: false }, async (t) => {
assertEquals(history[0].chat.firstName, 'Telegram')
})
- await t.step('updateProfile', async () => {
- const bio = `mtcute e2e ${new Date().toISOString()}`
-
- const oldSelf = await tg.getFullChat('self')
- const res = await tg.updateProfile({ bio })
- const newSelf = await tg.getFullChat('self')
-
- assertEquals(res.isSelf, true)
- assertNotEquals(oldSelf.bio, newSelf.bio)
- assertEquals(newSelf.bio, bio)
- })
-
await tg.close()
})
diff --git a/e2e/node/ts/tests/02.methods.ts b/e2e/node/ts/tests/02.methods.ts
index 5f5ef74c..0e10e5c3 100644
--- a/e2e/node/ts/tests/02.methods.ts
+++ b/e2e/node/ts/tests/02.methods.ts
@@ -44,16 +44,4 @@ describe('2. calling methods', function () {
expect(history[0].chat.id).to.equal(777000)
expect(history[0].chat.firstName).to.equal('Telegram')
})
-
- it('updateProfile', async () => {
- const bio = `mtcute e2e ${new Date().toISOString()}`
-
- const oldSelf = await tg.getFullChat('self')
- const res = await tg.updateProfile({ bio })
- const newSelf = await tg.getFullChat('self')
-
- expect(res.isSelf).to.eq(true)
- expect(oldSelf.bio).to.not.equal(newSelf.bio)
- expect(newSelf.bio).to.equal(bio)
- })
})
diff --git a/e2e/node/ts/utils.ts b/e2e/node/ts/utils.ts
index 35472042..15d62b12 100644
--- a/e2e/node/ts/utils.ts
+++ b/e2e/node/ts/utils.ts
@@ -6,8 +6,9 @@ import { setPlatform } from '@mtcute/core/platform.js'
import { LogManager, sleep } from '@mtcute/core/utils.js'
import { NodePlatform, SqliteStorage, TcpTransport } from '@mtcute/node'
import { NodeCryptoProvider } from '@mtcute/node/utils.js'
+import type { BaseTelegramClientOptions } from '@mtcute/core/client.js'
-export function getApiParams(storage?: string) {
+export function getApiParams(storage?: string): BaseTelegramClientOptions {
if (!process.env.API_ID || !process.env.API_HASH) {
throw new Error('API_ID and API_HASH env variables must be set')
}
diff --git a/eslint.config.js b/eslint.config.js
index 6ba8b445..e0786811 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -56,7 +56,7 @@ export default antfu({
'style/brace-style': ['error', '1tbs', { allowSingleLine: true }],
'node/prefer-global/process': ['error', 'always'],
'node/prefer-global/buffer': ['error', 'always'],
- 'no-restricted-globals': ['error', 'Buffer', '__dirname', 'require'],
+ 'no-restricted-globals': ['error', 'Buffer', '__dirname', 'require', 'NodeJS', 'setTimeout', 'clearTimeout'],
'style/quotes': ['error', 'single', { avoidEscape: true }],
'test/consistent-test-it': 'off',
'test/prefer-lowercase-title': 'off',
@@ -112,7 +112,7 @@ export default antfu({
'import/no-relative-packages': 'off', // common-internals is symlinked from node
},
}, {
- files: ['**/scripts/**', '**/*.cjs'],
+ files: ['**/scripts/**', '**/*.cjs', '.config/**/*'],
rules: {
'no-restricted-imports': 'off',
'no-restricted-globals': 'off',
diff --git a/package.json b/package.json
index 5405615d..98075d8c 100644
--- a/package.json
+++ b/package.json
@@ -1,75 +1,84 @@
{
- "name": "mtcute-workspace",
- "type": "module",
- "version": "0.16.8",
- "private": true,
- "packageManager": "pnpm@9.0.6",
- "description": "Type-safe library for MTProto (Telegram API) for browser and NodeJS",
- "author": "alina sireneva ",
- "license": "MIT",
- "homepage": "https://mtcute.dev",
- "repository": {
- "type": "git",
- "url": "https://github.com/mtcute/mtcute"
- },
- "keywords": [
- "telegram",
- "telegram-api",
- "telegram-bot",
- "telegram-library",
- "mtproto",
- "tgbot",
- "userbot",
- "api"
- ],
- "workspaces": [
- "packages/*"
- ],
- "scripts": {
- "postinstall": "node scripts/validate-deps-versions.js && node scripts/remove-jsr-sourcefiles.js",
- "test": "pnpm run -r test && vitest --config .config/vite.ts run",
- "test:dev": "vitest --config .config/vite.ts watch",
- "test:ui": "vitest --config .config/vite.ts --ui",
- "test:coverage": "vitest --config .config/vite.ts run --coverage",
- "test:ci": "vitest --config .config/vite.ts run --coverage.enabled --coverage.reporter=json",
- "test:browser": "vitest --config .config/vite.browser.ts run",
- "test:browser:dev": "vitest --config .config/vite.browser.ts watch",
- "lint": "eslint",
- "lint:ci": "CI=1 NODE_OPTIONS=\\\"--max_old_space_size=8192\\\" eslint",
- "lint:tsc": "rimraf packages/**/dist packages/**/*.tsbuildinfo && pnpm -r --workspace-concurrency=4 exec tsc --build",
- "lint:tsc:ci": "pnpm -r exec tsc --build",
- "lint:dpdm": "dpdm -T --no-warning --no-tree --exit-code circular:1 packages/*",
- "lint:fix": "eslint --fix .",
- "publish-all": "node scripts/publish.js all",
- "docs": "typedoc --options .config/typedoc/config.cjs",
- "build-package": "node scripts/build-package.js"
- },
- "devDependencies": {
- "@antfu/eslint-config": "2.26.0",
- "@teidesu/slow-types-compiler": "1.1.0",
- "@types/deno": "npm:@teidesu/deno-types@1.45.5",
- "@types/node": "20.10.0",
- "@types/ws": "8.5.4",
- "@vitest/browser": "2.0.5",
- "@vitest/coverage-v8": "2.0.5",
- "@vitest/expect": "2.0.5",
- "@vitest/spy": "2.0.5",
- "@vitest/ui": "2.0.5",
- "chai": "5.1.0",
- "cjs-module-lexer": "1.2.3",
- "dotenv-flow": "4.1.0",
- "dpdm": "3.14.0",
- "esbuild": "0.23.0",
- "eslint": "9.9.0",
- "glob": "11.0.0",
- "playwright": "1.42.1",
- "rimraf": "6.0.1",
- "semver": "7.5.1",
- "tsx": "4.17.0",
- "typedoc": "0.26.5",
- "typescript": "5.5.4",
- "vite": "5.1.6",
- "vite-plugin-node-polyfills": "0.22.0",
- "vitest": "2.0.5"
+ "name": "mtcute-workspace",
+ "type": "module",
+ "version": "0.16.8",
+ "private": true,
+ "packageManager": "pnpm@9.0.6",
+ "description": "Type-safe library for MTProto (Telegram API) for browser and NodeJS",
+ "author": "alina sireneva ",
+ "license": "MIT",
+ "homepage": "https://mtcute.dev",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/mtcute/mtcute"
+ },
+ "keywords": [
+ "telegram",
+ "telegram-api",
+ "telegram-bot",
+ "telegram-library",
+ "mtproto",
+ "tgbot",
+ "userbot",
+ "api"
+ ],
+ "workspaces": [
+ "packages/*"
+ ],
+ "scripts": {
+ "postinstall": "node scripts/validate-deps-versions.js && node scripts/remove-jsr-sourcefiles.js",
+ "test": "vitest --config .config/vite.ts run",
+ "test:dev": "vitest --config .config/vite.ts watch",
+ "test:ui": "vitest --config .config/vite.ts --ui",
+ "test:coverage": "vitest --config .config/vite.ts run --coverage",
+ "test:ci": "vitest --config .config/vite.ts run --coverage.enabled --coverage.reporter=json",
+ "test:browser": "vitest --config .config/vite.browser.ts run",
+ "test:browser:dev": "vitest --config .config/vite.browser.ts watch",
+ "lint": "eslint",
+ "lint:ci": "CI=1 NODE_OPTIONS=\\\"--max_old_space_size=8192\\\" eslint",
+ "lint:tsc": "pnpm -r --workspace-concurrency=4 exec tsc",
+ "lint:tsc:ci": "pnpm -r exec tsc",
+ "lint:dpdm": "dpdm -T --no-warning --no-tree --exit-code circular:1 packages/*",
+ "lint:fix": "eslint --fix .",
+ "publish-all": "node scripts/publish.js all",
+ "docs": "typedoc --options .config/typedoc/config.cjs",
+ "build-package": "node scripts/build-package.js",
+ "build-package-vite": "node scripts/build-package-vite.js"
+ },
+ "devDependencies": {
+ "@antfu/eslint-config": "2.26.0",
+ "@teidesu/slow-types-compiler": "1.1.0",
+ "@types/deno": "npm:@teidesu/deno-types@1.45.5",
+ "@types/node": "20.10.0",
+ "@types/ws": "8.5.4",
+ "@vitest/browser": "2.0.5",
+ "@vitest/coverage-v8": "2.0.5",
+ "@vitest/expect": "2.0.5",
+ "@vitest/spy": "2.0.5",
+ "@vitest/ui": "2.0.5",
+ "bun-types": "^1.1.24",
+ "chai": "5.1.0",
+ "cjs-module-lexer": "1.2.3",
+ "dotenv-flow": "4.1.0",
+ "dpdm": "3.14.0",
+ "esbuild": "0.23.0",
+ "eslint": "9.9.0",
+ "glob": "11.0.0",
+ "playwright": "1.42.1",
+ "rimraf": "6.0.1",
+ "rollup-plugin-node-externals": "7.1.3",
+ "semver": "7.5.1",
+ "tsx": "4.17.0",
+ "typedoc": "0.26.5",
+ "typescript": "5.5.4",
+ "vite": "5.4.2",
+ "vite-plugin-dts": "4.0.3",
+ "vite-plugin-node-polyfills": "0.22.0",
+ "vitest": "2.0.5"
+ },
+ "pnpm": {
+ "overrides": {
+ "typescript": "5.5.4"
}
+ }
}
diff --git a/packages/bun/build.config.cjs b/packages/bun/build.config.cjs
deleted file mode 100644
index 17718026..00000000
--- a/packages/bun/build.config.cjs
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = () => ({ buildCjs: false })
diff --git a/packages/bun/build.config.js b/packages/bun/build.config.js
new file mode 100644
index 00000000..a039873e
--- /dev/null
+++ b/packages/bun/build.config.js
@@ -0,0 +1,4 @@
+export default () => ({
+ buildCjs: false,
+ external: ['bun', 'bun:sqlite'],
+})
diff --git a/packages/bun/package.json b/packages/bun/package.json
index 52d5a19d..9445a8ff 100644
--- a/packages/bun/package.json
+++ b/packages/bun/package.json
@@ -1,29 +1,28 @@
{
- "name": "@mtcute/bun",
- "type": "module",
- "version": "0.16.7",
- "private": true,
- "description": "Meta-package for Bun",
- "author": "alina sireneva ",
- "license": "MIT",
- "sideEffects": false,
- "exports": {
- ".": "./src/index.ts",
- "./utils.js": "./src/utils.ts",
- "./methods.js": "./src/methods.ts"
- },
- "scripts": {
- "docs": "typedoc",
- "build": "pnpm run -w build-package bun"
- },
- "dependencies": {
- "@mtcute/core": "workspace:^",
- "@mtcute/html-parser": "workspace:^",
- "@mtcute/markdown-parser": "workspace:^",
- "@mtcute/wasm": "workspace:^"
- },
- "devDependencies": {
- "@mtcute/test": "workspace:^",
- "bun-types": "1.0.33"
- }
+ "name": "@mtcute/bun",
+ "type": "module",
+ "version": "0.16.7",
+ "private": true,
+ "description": "Meta-package for Bun",
+ "author": "alina sireneva ",
+ "license": "MIT",
+ "sideEffects": false,
+ "exports": {
+ ".": "./src/index.ts",
+ "./utils.js": "./src/utils.ts",
+ "./methods.js": "./src/methods.ts"
+ },
+ "scripts": {
+ "docs": "typedoc",
+ "build": "pnpm run -w build-package bun"
+ },
+ "dependencies": {
+ "@mtcute/core": "workspace:^",
+ "@mtcute/html-parser": "workspace:^",
+ "@mtcute/markdown-parser": "workspace:^",
+ "@mtcute/wasm": "workspace:^"
+ },
+ "devDependencies": {
+ "@mtcute/test": "workspace:^"
+ }
}
diff --git a/packages/bun/tsconfig.json b/packages/bun/tsconfig.json
index 30689cd4..5bac6173 100644
--- a/packages/bun/tsconfig.json
+++ b/packages/bun/tsconfig.json
@@ -1,19 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "types": [
- "bun-types",
- "vite/client"
- ],
- "outDir": "./dist"
- },
- "references": [
- { "path": "../core" },
- { "path": "../dispatcher" },
- { "path": "../html-parser" },
- { "path": "../markdown-parser" }
- ],
"include": [
"./src"
]
diff --git a/packages/convert/src/gramjs/serialize.ts b/packages/convert/src/gramjs/serialize.ts
index 49fc155c..4c0dc98e 100644
--- a/packages/convert/src/gramjs/serialize.ts
+++ b/packages/convert/src/gramjs/serialize.ts
@@ -4,7 +4,7 @@ import { dataViewFromBuffer } from '@mtcute/core/utils.js'
import type { TelethonSession } from '../telethon/types.js'
-export function serializeGramjsSession(session: TelethonSession) {
+export function serializeGramjsSession(session: TelethonSession): string {
if (session.authKey.length !== 256) {
throw new MtArgumentError('authKey must be 256 bytes long')
}
diff --git a/packages/convert/src/telethon/serialize.ts b/packages/convert/src/telethon/serialize.ts
index bacd7a36..4b2957c7 100644
--- a/packages/convert/src/telethon/serialize.ts
+++ b/packages/convert/src/telethon/serialize.ts
@@ -6,7 +6,7 @@ import { serializeIpv4ToBytes, serializeIpv6ToBytes } from '../utils/ip.js'
import type { TelethonSession } from './types.js'
-export function serializeTelethonSession(session: TelethonSession) {
+export function serializeTelethonSession(session: TelethonSession): string {
if (session.authKey.length !== 256) {
throw new MtArgumentError('authKey must be 256 bytes long')
}
diff --git a/packages/convert/tsconfig.json b/packages/convert/tsconfig.json
index 3b5437ec..5bac6173 100644
--- a/packages/convert/tsconfig.json
+++ b/packages/convert/tsconfig.json
@@ -1,12 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./dist/esm"
- },
- "references": [
- { "path": "../core" }
- ],
"include": [
"./src"
]
diff --git a/packages/core/build.config.cjs b/packages/core/build.config.cjs
deleted file mode 100644
index cf790424..00000000
--- a/packages/core/build.config.cjs
+++ /dev/null
@@ -1,73 +0,0 @@
-const KNOWN_DECORATORS = ['memoizeGetters', 'makeInspectable']
-
-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('|')})\\((.+?)\\)(?:;|$)`,
- 'gms',
- )
-
- const replaceDecorators = (content, file) => {
- if (!KNOWN_DECORATORS.some(d => content.includes(d))) return null
-
- const countPerClass = new Map()
-
- content = content.replace(decoratorsRegex, (_, name, args) => {
- const [clsName_, ...rest] = args.split(',')
- const clsName = clsName_.trim()
-
- const count = (countPerClass.get(clsName) || 0) + 1
- countPerClass.set(clsName, count)
-
- const prevName = count === 1 ? clsName : `${clsName}$${count - 1}`
- const localName = `${clsName}$${count}`
-
- return `const ${localName} = /*#__PURE__*/${name}(${prevName}, ${rest.join(',')});`
- })
-
- if (countPerClass.size === 0) {
- throw new Error('No decorator usages found, but known names were used')
- }
-
- const customExports = []
-
- for (const [clsName, count] of countPerClass) {
- const needle = new RegExp(`^export class(?= ${clsName} ({|extends ))`, 'm')
-
- if (!content.match(needle)) {
- throw new Error(`Class ${clsName} not found in ${file}`)
- }
-
- content = content.replace(needle, 'class')
- customExports.push(
- `export { ${clsName}$${count} as ${clsName} }`,
- )
- }
-
- return `${content}\n${customExports.join('\n')}\n`
- }
-
- 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/build.config.js b/packages/core/build.config.js
new file mode 100644
index 00000000..430ffc71
--- /dev/null
+++ b/packages/core/build.config.js
@@ -0,0 +1,82 @@
+import { fileURLToPath } from 'node:url'
+import { createRequire } from 'node:module'
+import { resolve } from 'node:path'
+import * as fs from 'node:fs'
+
+const KNOWN_DECORATORS = ['memoizeGetters', 'makeInspectable']
+
+export default () => {
+ const networkManagerId = fileURLToPath(new URL('./src/network/network-manager.ts', import.meta.url))
+ const highlevelTypesDir = fileURLToPath(new URL('./src/highlevel/types', import.meta.url))
+
+ // make decorators properly tree-shakeable
+ // very fragile, but it kinda works :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('|')})\\((.+?)\\)(?:;|$)`,
+ 'gms',
+ )
+
+ return {
+ rollupPluginsPre: [
+ {
+ name: 'mtcute-core-build-plugin',
+ transform(code, id) {
+ if (id === networkManagerId) {
+ const require = createRequire(import.meta.url)
+ const version = require(fileURLToPath(new URL('./package.json', import.meta.url))).version
+ return code.replace('%VERSION%', version)
+ }
+
+ if (id.startsWith(highlevelTypesDir)) {
+ if (!KNOWN_DECORATORS.some(d => code.includes(d))) return null
+
+ const countPerClass = new Map()
+
+ code = code.replace(decoratorsRegex, (_, name, args) => {
+ const [clsName_, ...rest] = args.split(',')
+ const clsName = clsName_.trim()
+
+ const count = (countPerClass.get(clsName) || 0) + 1
+ countPerClass.set(clsName, count)
+
+ const prevName = count === 1 ? clsName : `${clsName}$${count - 1}`
+ const localName = `${clsName}$${count}`
+
+ return `const ${localName} = /*#__PURE__*/${name}(${prevName}, ${rest.join(',')});`
+ })
+
+ if (countPerClass.size === 0) {
+ throw new Error('No decorator usages found, but known names were used')
+ }
+
+ const customExports = []
+
+ for (const [clsName, count] of countPerClass) {
+ const needle = new RegExp(`^export class(?= ${clsName} ({|extends ))`, 'm')
+
+ if (!code.match(needle)) {
+ throw new Error(`Class ${clsName} not found in ${id.replace(import.meta.url, '')}`)
+ }
+
+ code = code.replace(needle, 'class')
+ customExports.push(`export { ${clsName}$${count} as ${clsName} }`)
+ }
+
+ return `${code}\n${customExports.join('\n')}\n`
+ }
+
+ return code
+ },
+ },
+ ],
+ finalJsr({ outDir }) {
+ const networkMgrFile = resolve(outDir, 'network/network-manager.ts')
+ const code = fs.readFileSync(networkMgrFile, 'utf8')
+
+ const require = createRequire(import.meta.url)
+ const version = require(fileURLToPath(new URL('./package.json', import.meta.url))).version
+ fs.writeFileSync(networkMgrFile, code.replace('%VERSION%', version))
+ },
+ }
+}
diff --git a/packages/core/src/highlevel/types/conversation.ts b/packages/core/src/highlevel/types/conversation.ts
index d1c4a643..fe87e8d1 100644
--- a/packages/core/src/highlevel/types/conversation.ts
+++ b/packages/core/src/highlevel/types/conversation.ts
@@ -14,6 +14,7 @@ import { sendMedia } from '../methods/messages/send-media.js'
import { sendMediaGroup } from '../methods/messages/send-media-group.js'
import { sendText } from '../methods/messages/send-text.js'
import { resolvePeer } from '../methods/users/resolve-peer.js'
+import { timers } from '../../utils/index.js'
import type { Message } from './messages/message.js'
import type { InputPeerLike } from './peers/index.js'
@@ -23,7 +24,7 @@ import type { ParametersSkip2 } from './utils.js'
interface QueuedHandler {
promise: ControllablePromise
check?: (update: T) => MaybePromise
- timeout?: NodeJS.Timeout
+ timeout?: timers.Timer
}
const CONVERSATION_SYMBOL = Symbol('conversation')
@@ -341,10 +342,10 @@ export class Conversation {
const promise = createControllablePromise()
- let timer: NodeJS.Timeout | undefined
+ let timer: timers.Timer | undefined
if (timeout !== null) {
- timer = setTimeout(() => {
+ timer = timers.setTimeout(() => {
promise.reject(new MtTimeoutError(timeout))
this._queuedNewMessage.removeBy(it => it.promise === promise)
}, timeout)
@@ -482,11 +483,11 @@ export class Conversation {
const promise = createControllablePromise()
- let timer: NodeJS.Timeout | undefined
+ let timer: timers.Timer | undefined
const timeout = params?.timeout
if (timeout) {
- timer = setTimeout(() => {
+ timer = timers.setTimeout(() => {
promise.reject(new MtTimeoutError(timeout))
this._pendingEditMessage.delete(msgId)
}, timeout)
@@ -530,10 +531,10 @@ export class Conversation {
const promise = createControllablePromise()
- let timer: NodeJS.Timeout | undefined
+ let timer: timers.Timer | undefined
if (timeout !== null) {
- timer = setTimeout(() => {
+ timer = timers.setTimeout(() => {
promise.reject(new MtTimeoutError(timeout))
this._pendingRead.delete(msgId)
}, timeout)
@@ -562,7 +563,7 @@ export class Conversation {
void this._lock.acquire().then(async () => {
try {
if (!it.check || (await it.check(msg))) {
- if (it.timeout) clearTimeout(it.timeout)
+ if (it.timeout) timers.clearTimeout(it.timeout)
it.promise.resolve(msg)
this._queuedNewMessage.popFront()
}
@@ -592,7 +593,7 @@ export class Conversation {
(async () => {
if (!it.check || (await it.check(msg))) {
- if (it.timeout) clearTimeout(it.timeout)
+ if (it.timeout) timers.clearTimeout(it.timeout)
it.promise.resolve(msg)
this._pendingEditMessage.delete(msg.id)
}
@@ -609,7 +610,7 @@ export class Conversation {
for (const msgId of this._pendingRead.keys()) {
if (msgId <= lastRead) {
const it = this._pendingRead.get(msgId)!
- if (it.timeout) clearTimeout(it.timeout)
+ if (it.timeout) timers.clearTimeout(it.timeout)
it.promise.resolve()
this._pendingRead.delete(msgId)
}
diff --git a/packages/core/src/highlevel/types/files/utils.ts b/packages/core/src/highlevel/types/files/utils.ts
index 15f4b107..705baac4 100644
--- a/packages/core/src/highlevel/types/files/utils.ts
+++ b/packages/core/src/highlevel/types/files/utils.ts
@@ -1,3 +1,4 @@
+/* eslint-disable no-restricted-globals */
import type { tdFileId } from '@mtcute/file-id'
import type { tl } from '@mtcute/tl'
diff --git a/packages/core/src/highlevel/updates/manager.ts b/packages/core/src/highlevel/updates/manager.ts
index 716bc7cf..872cbc0e 100644
--- a/packages/core/src/highlevel/updates/manager.ts
+++ b/packages/core/src/highlevel/updates/manager.ts
@@ -21,6 +21,7 @@ import {
import type { BaseTelegramClient } from '../base.js'
import type { CurrentUserInfo } from '../storage/service/current-user.js'
import { PeersIndex } from '../types/peers/peers-index.js'
+import * as timers from '../../utils/timers.js'
import type { PendingUpdate, PendingUpdateContainer, RawUpdateHandler, UpdatesManagerParams } from './types.js'
import {
@@ -142,7 +143,7 @@ export class UpdatesManager {
cpts: Map = new Map()
cptsMod: Map = new Map()
- channelDiffTimeouts: Map = new Map()
+ channelDiffTimeouts: Map = new Map()
channelsOpened: Map = new Map()
log: Logger
@@ -154,7 +155,7 @@ export class UpdatesManager {
private _channelPtsLimit: Extract
auth?: CurrentUserInfo | null // todo: do we need a local copy?
- keepAliveInterval?: NodeJS.Timeout
+ keepAliveInterval?: timers.Interval
constructor(
readonly client: BaseTelegramClient,
@@ -245,8 +246,8 @@ export class UpdatesManager {
// start updates loop in background
this.updatesLoopActive = true
- clearInterval(this.keepAliveInterval)
- this.keepAliveInterval = setInterval(this._onKeepAlive, KEEP_ALIVE_INTERVAL)
+ timers.clearInterval(this.keepAliveInterval)
+ this.keepAliveInterval = timers.setInterval(this._onKeepAlive, KEEP_ALIVE_INTERVAL)
this._loop().catch(err => this.client.emitError(err))
if (this.catchUpOnStart) {
@@ -263,10 +264,10 @@ export class UpdatesManager {
stopLoop(): void {
if (!this.updatesLoopActive) return
- clearInterval(this.keepAliveInterval)
+ timers.clearInterval(this.keepAliveInterval)
for (const timer of this.channelDiffTimeouts.values()) {
- clearTimeout(timer)
+ timers.clearTimeout(timer)
}
this.channelDiffTimeouts.clear()
@@ -814,7 +815,7 @@ export class UpdatesManager {
// clear timeout if any
if (channelDiffTimeouts.has(channelId)) {
- clearTimeout(channelDiffTimeouts.get(channelId))
+ timers.clearTimeout(channelDiffTimeouts.get(channelId))
channelDiffTimeouts.delete(channelId)
}
@@ -952,7 +953,7 @@ export class UpdatesManager {
log.debug('scheduling next fetch for channel %d in %d seconds', channelId, lastTimeout)
channelDiffTimeouts.set(
channelId,
- setTimeout(() => this._fetchChannelDifferenceViaUpdate(channelId), lastTimeout * 1000),
+ timers.setTimeout(() => this._fetchChannelDifferenceViaUpdate(channelId), lastTimeout * 1000),
)
}
diff --git a/packages/core/src/highlevel/updates/parsed.ts b/packages/core/src/highlevel/updates/parsed.ts
index 3f3a0ca1..1336392c 100644
--- a/packages/core/src/highlevel/updates/parsed.ts
+++ b/packages/core/src/highlevel/updates/parsed.ts
@@ -1,3 +1,4 @@
+import { timers } from '../../utils/index.js'
import type { Message } from '../types/messages/index.js'
import type { BusinessMessage, ParsedUpdate } from '../types/updates/index.js'
import { _parseUpdate } from '../types/updates/parse-update.js'
@@ -47,7 +48,7 @@ export function makeParsedUpdateHandler(params: ParsedUpdateHandlerParams): RawU
}
}
- const pending = new Map()
+ const pending = new Map()
return (update, peers) => {
const parsed = _parseUpdate(update, peers)
@@ -66,7 +67,7 @@ export function makeParsedUpdateHandler(params: ParsedUpdateHandlerParams): RawU
pendingGroup[0].push(parsed.data)
} else {
const messages = [parsed.data]
- const timeout = setTimeout(() => {
+ const timeout = timers.setTimeout(() => {
pending.delete(group)
if (isBusiness) {
diff --git a/packages/core/src/highlevel/updates/types.ts b/packages/core/src/highlevel/updates/types.ts
index c825c8c2..d8ef335d 100644
--- a/packages/core/src/highlevel/updates/types.ts
+++ b/packages/core/src/highlevel/updates/types.ts
@@ -1,6 +1,6 @@
import type { tl } from '@mtcute/tl'
-import type { AsyncLock, ConditionVariable, Deque, EarlyTimer, Logger, SortedLinkedList } from '../../utils/index.js'
+import type { AsyncLock, ConditionVariable, Deque, EarlyTimer, Logger, SortedLinkedList, timers } from '../../utils/index.js'
import type { CurrentUserInfo } from '../storage/service/current-user.js'
import type { PeersIndex } from '../types/peers/peers-index.js'
@@ -161,7 +161,7 @@ export interface UpdatesState {
cpts: Map
cptsMod: Map
- channelDiffTimeouts: Map
+ channelDiffTimeouts: Map
channelsOpened: Map
log: Logger
diff --git a/packages/core/src/highlevel/worker/invoker.ts b/packages/core/src/highlevel/worker/invoker.ts
index fcdc566c..c30036f6 100644
--- a/packages/core/src/highlevel/worker/invoker.ts
+++ b/packages/core/src/highlevel/worker/invoker.ts
@@ -68,7 +68,7 @@ export class WorkerInvoker {
}
}
- makeBinder(target: InvokeTarget) {
+ makeBinder(target: InvokeTarget): (method: K, isVoid?: boolean) => T[K] {
return (method: K, isVoid = false) => {
let fn
diff --git a/packages/core/src/network/mtproto-session.ts b/packages/core/src/network/mtproto-session.ts
index 72dedcd1..3b6cb121 100644
--- a/packages/core/src/network/mtproto-session.ts
+++ b/packages/core/src/network/mtproto-session.ts
@@ -11,12 +11,14 @@ import type {
} from '../utils/index.js'
import {
Deque,
+
LongMap,
LruSet,
SortedArray,
compareLongs,
getRandomInt,
randomLong,
+ timers,
} from '../utils/index.js'
import { AuthKey } from './auth-key.js'
@@ -41,7 +43,7 @@ export interface PendingRpc {
initConn?: boolean
getState?: number
cancelled?: boolean
- timeout?: NodeJS.Timeout
+ timeout?: timers.Timer
}
export type PendingMessage =
@@ -131,8 +133,8 @@ export class MtprotoSession {
authorizationPending = false
next429Timeout = 1000
- current429Timeout?: NodeJS.Timeout
- next429ResetTimeout?: NodeJS.Timeout
+ current429Timeout?: timers.Timer
+ next429ResetTimeout?: timers.Timer
constructor(
readonly _crypto: ICryptoProvider,
@@ -165,7 +167,7 @@ export class MtprotoSession {
this.resetAuthKey()
}
- clearTimeout(this.current429Timeout)
+ timers.clearTimeout(this.current429Timeout)
this.resetState(withAuthKey)
this.resetLastPing(true)
}
@@ -339,14 +341,14 @@ export class MtprotoSession {
const timeout = this.next429Timeout
this.next429Timeout = Math.min(this.next429Timeout * 2, 32000)
- clearTimeout(this.current429Timeout)
- clearTimeout(this.next429ResetTimeout)
+ timers.clearTimeout(this.current429Timeout)
+ timers.clearTimeout(this.next429ResetTimeout)
- this.current429Timeout = setTimeout(() => {
+ this.current429Timeout = timers.setTimeout(() => {
this.current429Timeout = undefined
callback()
}, timeout)
- this.next429ResetTimeout = setTimeout(() => {
+ this.next429ResetTimeout = timers.setTimeout(() => {
this.next429ResetTimeout = undefined
this.next429Timeout = 1000
}, 60000)
diff --git a/packages/core/src/network/persistent-connection.test.ts b/packages/core/src/network/persistent-connection.test.ts
index 9d77b90d..8f60f23e 100644
--- a/packages/core/src/network/persistent-connection.test.ts
+++ b/packages/core/src/network/persistent-connection.test.ts
@@ -1,7 +1,7 @@
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { StubTelegramTransport, createStub, defaultTestCryptoProvider } from '@mtcute/test'
-import { LogManager } from '../utils/index.js'
+import { LogManager, timers } from '../utils/index.js'
import type { PersistentConnectionParams } from './persistent-connection.js'
import { PersistentConnection } from './persistent-connection.js'
@@ -78,7 +78,7 @@ describe('PersistentConnection', () => {
const transportConnect = transport.connect
vi.spyOn(transport, 'connect').mockImplementation((dc, test) => {
- setTimeout(() => {
+ timers.setTimeout(() => {
transportConnect.call(transport, dc, test)
}, 100)
})
diff --git a/packages/core/src/network/persistent-connection.ts b/packages/core/src/network/persistent-connection.ts
index 35eb5ee7..4e9d79b3 100644
--- a/packages/core/src/network/persistent-connection.ts
+++ b/packages/core/src/network/persistent-connection.ts
@@ -2,6 +2,7 @@ import EventEmitter from 'node:events'
import { MtcuteError } from '../types/index.js'
import type { BasicDcOption, ICryptoProvider, Logger } from '../utils/index.js'
+import { timers } from '../utils/index.js'
import type { ReconnectionStrategy } from './reconnection.js'
import type { ITelegramTransport, TransportFactory } from './transports/index.js'
@@ -35,12 +36,12 @@ export abstract class PersistentConnection extends EventEmitter {
private _lastError: Error | null = null
private _consequentFails = 0
private _previousWait: number | null = null
- private _reconnectionTimeout: NodeJS.Timeout | null = null
+ private _reconnectionTimeout: timers.Timer | null = null
private _shouldReconnectImmediately = false
protected _disconnectedManually = false
// inactivity timeout
- private _inactivityTimeout: NodeJS.Timeout | null = null
+ private _inactivityTimeout: timers.Timer | null = null
private _inactive = true
_destroyed = false
@@ -165,9 +166,9 @@ export abstract class PersistentConnection extends EventEmitter {
this._previousWait = wait
if (this._reconnectionTimeout != null) {
- clearTimeout(this._reconnectionTimeout)
+ timers.clearTimeout(this._reconnectionTimeout)
}
- this._reconnectionTimeout = setTimeout(() => {
+ this._reconnectionTimeout = timers.setTimeout(() => {
if (this._destroyed) return
this._reconnectionTimeout = null
this.connect()
@@ -183,7 +184,7 @@ export abstract class PersistentConnection extends EventEmitter {
}
if (this._reconnectionTimeout != null) {
- clearTimeout(this._reconnectionTimeout)
+ timers.clearTimeout(this._reconnectionTimeout)
this._reconnectionTimeout = null
}
@@ -215,11 +216,12 @@ export abstract class PersistentConnection extends EventEmitter {
}
async destroy(): Promise {
+ this._disconnectedManually = true
if (this._reconnectionTimeout != null) {
- clearTimeout(this._reconnectionTimeout)
+ timers.clearTimeout(this._reconnectionTimeout)
}
if (this._inactivityTimeout != null) {
- clearTimeout(this._inactivityTimeout)
+ timers.clearTimeout(this._inactivityTimeout)
}
await this._transport.close()
@@ -229,8 +231,8 @@ export abstract class PersistentConnection extends EventEmitter {
protected _rescheduleInactivity(): void {
if (!this.params.inactivityTimeout) return
- if (this._inactivityTimeout) clearTimeout(this._inactivityTimeout)
- this._inactivityTimeout = setTimeout(this._onInactivityTimeout, this.params.inactivityTimeout)
+ if (this._inactivityTimeout) timers.clearTimeout(this._inactivityTimeout)
+ this._inactivityTimeout = timers.setTimeout(this._onInactivityTimeout, this.params.inactivityTimeout)
}
protected _onInactivityTimeout(): void {
@@ -246,7 +248,7 @@ export abstract class PersistentConnection extends EventEmitter {
this.params.inactivityTimeout = timeout
if (this._inactivityTimeout) {
- clearTimeout(this._inactivityTimeout)
+ timers.clearTimeout(this._inactivityTimeout)
}
if (timeout) {
diff --git a/packages/core/src/network/server-salt.ts b/packages/core/src/network/server-salt.ts
index 3db7a41d..2dd90326 100644
--- a/packages/core/src/network/server-salt.ts
+++ b/packages/core/src/network/server-salt.ts
@@ -1,6 +1,8 @@
import Long from 'long'
import type { mtp } from '@mtcute/tl'
+import { timers } from '../utils/index.js'
+
export class ServerSaltManager {
private _futureSalts: mtp.RawMt_future_salt[] = []
@@ -26,15 +28,15 @@ export class ServerSaltManager {
else this._scheduleNext()
}
- private _timer?: NodeJS.Timeout
+ private _timer?: timers.Timer
private _scheduleNext(): void {
- if (this._timer) clearTimeout(this._timer)
+ if (this._timer) timers.clearTimeout(this._timer)
if (this._futureSalts.length === 0) return
const next = this._futureSalts.shift()!
- this._timer = setTimeout(
+ this._timer = timers.setTimeout(
() => {
this.currentSalt = next.salt
this._scheduleNext()
@@ -44,6 +46,6 @@ export class ServerSaltManager {
}
destroy(): void {
- clearTimeout(this._timer)
+ timers.clearTimeout(this._timer)
}
}
diff --git a/packages/core/src/network/session-connection.ts b/packages/core/src/network/session-connection.ts
index 25074e5e..21c76776 100644
--- a/packages/core/src/network/session-connection.ts
+++ b/packages/core/src/network/session-connection.ts
@@ -13,11 +13,13 @@ import type {
} from '../utils/index.js'
import {
EarlyTimer,
+
concatBuffers,
createControllablePromise,
longFromBuffer,
randomLong,
removeFromLongArray,
+ timers,
} from '../utils/index.js'
import { doAuthorization } from './authorization.js'
@@ -72,12 +74,12 @@ export class SessionConnection extends PersistentConnection {
private _queuedDestroySession: Long[] = []
// waitForMessage
- private _pendingWaitForUnencrypted: [ControllablePromise, NodeJS.Timeout][] = []
+ private _pendingWaitForUnencrypted: [ControllablePromise, timers.Timer][] = []
private _usePfs
private _isPfsBindingPending = false
private _isPfsBindingPendingInBackground = false
- private _pfsUpdateTimeout?: NodeJS.Timeout
+ private _pfsUpdateTimeout?: timers.Timer
private _inactivityPendingFlush = false
@@ -123,7 +125,7 @@ export class SessionConnection extends PersistentConnection {
this._isPfsBindingPending = false
this._isPfsBindingPendingInBackground = false
this._session._authKeyTemp.reset()
- clearTimeout(this._pfsUpdateTimeout)
+ timers.clearTimeout(this._pfsUpdateTimeout)
}
this._resetSession()
@@ -134,7 +136,7 @@ export class SessionConnection extends PersistentConnection {
Object.values(this._pendingWaitForUnencrypted).forEach(([prom, timeout]) => {
prom.reject(new MtcuteError('Connection closed'))
- clearTimeout(timeout)
+ timers.clearTimeout(timeout)
})
// resend pending state_req-s
@@ -162,7 +164,7 @@ export class SessionConnection extends PersistentConnection {
this._salts.isFetching = false
if (forever) {
- clearTimeout(this._pfsUpdateTimeout)
+ timers.clearTimeout(this._pfsUpdateTimeout)
this.removeAllListeners()
this.on('error', (err) => {
this.log.warn('caught error after destroying: %s', err)
@@ -321,7 +323,7 @@ export class SessionConnection extends PersistentConnection {
if (this._isPfsBindingPending) return
if (this._pfsUpdateTimeout) {
- clearTimeout(this._pfsUpdateTimeout)
+ timers.clearTimeout(this._pfsUpdateTimeout)
this._pfsUpdateTimeout = undefined
}
@@ -468,7 +470,7 @@ export class SessionConnection extends PersistentConnection {
this.onConnectionUsable()
// set a timeout to update temp auth key in advance to avoid interruption
- this._pfsUpdateTimeout = setTimeout(
+ this._pfsUpdateTimeout = timers.setTimeout(
() => {
this._pfsUpdateTimeout = undefined
this.log.debug('temp key is expiring soon')
@@ -499,7 +501,7 @@ export class SessionConnection extends PersistentConnection {
return Promise.reject(new MtcuteError('Connection destroyed'))
}
const promise = createControllablePromise()
- const timeoutId = setTimeout(() => {
+ const timeoutId = timers.setTimeout(() => {
promise.reject(new MtTimeoutError(timeout))
this._pendingWaitForUnencrypted = this._pendingWaitForUnencrypted.filter(it => it[0] !== promise)
}, timeout)
@@ -516,7 +518,7 @@ export class SessionConnection extends PersistentConnection {
// auth_key_id = 0, meaning it's an unencrypted message used for authorization
const [promise, timeout] = this._pendingWaitForUnencrypted.shift()!
- clearTimeout(timeout)
+ timers.clearTimeout(timeout)
promise.resolve(data)
return
@@ -1441,7 +1443,7 @@ export class SessionConnection extends PersistentConnection {
}
if (timeout) {
- pending.timeout = setTimeout(() => this._cancelRpc(pending, true), timeout)
+ pending.timeout = timers.setTimeout(() => this._cancelRpc(pending, true), timeout)
}
if (abortSignal) {
@@ -1473,7 +1475,7 @@ export class SessionConnection extends PersistentConnection {
}
if (!onTimeout && rpc.timeout) {
- clearTimeout(rpc.timeout)
+ timers.clearTimeout(rpc.timeout)
}
if (onTimeout) {
diff --git a/packages/core/src/storage/memory/driver.ts b/packages/core/src/storage/memory/driver.ts
index c92d86f1..c486affe 100644
--- a/packages/core/src/storage/memory/driver.ts
+++ b/packages/core/src/storage/memory/driver.ts
@@ -3,7 +3,7 @@ import type { IStorageDriver } from '../driver.js'
export class MemoryStorageDriver implements IStorageDriver {
readonly states: Map = new Map()
- getState(repo: string, def: () => T) {
+ getState(repo: string, def: () => T): T {
if (!this.states.has(repo)) {
this.states.set(repo, def())
}
diff --git a/packages/core/src/utils/condition-variable.test.ts b/packages/core/src/utils/condition-variable.test.ts
index eb0e312a..fccc1abc 100644
--- a/packages/core/src/utils/condition-variable.test.ts
+++ b/packages/core/src/utils/condition-variable.test.ts
@@ -6,6 +6,7 @@ describe('ConditionVariable', () => {
it('should correctly unlock execution', async () => {
const cv = new ConditionVariable()
+ // eslint-disable-next-line no-restricted-globals
setTimeout(() => cv.notify(), 10)
await cv.wait()
@@ -24,6 +25,7 @@ describe('ConditionVariable', () => {
it('should only unlock once', async () => {
const cv = new ConditionVariable()
+ // eslint-disable-next-line no-restricted-globals
setTimeout(() => {
cv.notify()
cv.notify()
diff --git a/packages/core/src/utils/condition-variable.ts b/packages/core/src/utils/condition-variable.ts
index 04488031..dc3ab44f 100644
--- a/packages/core/src/utils/condition-variable.ts
+++ b/packages/core/src/utils/condition-variable.ts
@@ -1,9 +1,11 @@
+import * as timers from './timers.js'
+
/**
* Class implementing a condition variable like behaviour.
*/
export class ConditionVariable {
private _notify?: () => void
- private _timeout?: NodeJS.Timeout
+ private _timeout?: timers.Timer
wait(timeout?: number): Promise {
const prom = new Promise((resolve) => {
@@ -11,7 +13,7 @@ export class ConditionVariable {
})
if (timeout) {
- this._timeout = setTimeout(() => {
+ this._timeout = timers.setTimeout(() => {
this._notify?.()
this._timeout = undefined
}, timeout)
@@ -22,7 +24,7 @@ export class ConditionVariable {
notify(): void {
this._notify?.()
- if (this._timeout) clearTimeout(this._timeout)
+ if (this._timeout) timers.clearTimeout(this._timeout)
this._notify = undefined
}
}
diff --git a/packages/core/src/utils/early-timer.ts b/packages/core/src/utils/early-timer.ts
index eedf7f51..62105d93 100644
--- a/packages/core/src/utils/early-timer.ts
+++ b/packages/core/src/utils/early-timer.ts
@@ -1,10 +1,12 @@
+import * as timers from './timers.js'
+
/**
* Wrapper over JS timers that allows re-scheduling them
* to earlier time
*/
export class EarlyTimer {
- private _timeout?: NodeJS.Timeout
- private _immediate?: NodeJS.Immediate
+ private _timeout?: timers.Timer
+ private _immediate?: timers.Immediate
private _timeoutTs?: number
private _handler: () => void = () => {}
@@ -20,13 +22,13 @@ export class EarlyTimer {
emitWhenIdle(): void {
if (this._immediate) return
- clearTimeout(this._timeout)
+ timers.clearTimeout(this._timeout)
this._timeoutTs = Date.now()
- if (typeof setImmediate !== 'undefined') {
- this._immediate = setImmediate(this.emitNow)
+ if (typeof timers.setImmediate !== 'undefined') {
+ this._immediate = timers.setImmediate(this.emitNow)
} else {
- this._timeout = setTimeout(this.emitNow, 0)
+ this._timeout = timers.setTimeout(this.emitNow, 0)
}
}
@@ -49,7 +51,7 @@ export class EarlyTimer {
emitBefore(ts: number): void {
if (!this._timeoutTs || ts < this._timeoutTs) {
this.reset()
- this._timeout = setTimeout(this.emitNow, ts - Date.now())
+ this._timeout = timers.setTimeout(this.emitNow, ts - Date.now())
this._timeoutTs = ts
}
}
@@ -67,10 +69,10 @@ export class EarlyTimer {
*/
reset(): void {
if (this._immediate) {
- clearImmediate(this._immediate)
+ timers.clearImmediate(this._immediate)
this._immediate = undefined
} else {
- clearTimeout(this._timeout)
+ timers.clearTimeout(this._timeout)
}
this._timeoutTs = undefined
}
diff --git a/packages/core/src/utils/function-utils.ts b/packages/core/src/utils/function-utils.ts
index 9126bb22..4aea60db 100644
--- a/packages/core/src/utils/function-utils.ts
+++ b/packages/core/src/utils/function-utils.ts
@@ -1,3 +1,5 @@
+import * as timers from './timers.js'
+
export type ThrottledFunction = (() => void) & {
reset: () => void
}
@@ -15,7 +17,7 @@ export type ThrottledFunction = (() => void) & {
* @param delay Throttle delay
*/
export function throttle(func: () => void, delay: number): ThrottledFunction {
- let timeout: NodeJS.Timeout | null
+ let timeout: timers.Timer | null
const res: ThrottledFunction = function () {
if (timeout) {
@@ -26,12 +28,12 @@ export function throttle(func: () => void, delay: number): ThrottledFunction {
timeout = null
func()
}
- timeout = setTimeout(later, delay)
+ timeout = timers.setTimeout(later, delay)
}
res.reset = () => {
if (timeout) {
- clearTimeout(timeout)
+ timers.clearTimeout(timeout)
timeout = null
}
}
diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts
index f3b0c972..c127d05b 100644
--- a/packages/core/src/utils/index.ts
+++ b/packages/core/src/utils/index.ts
@@ -1,3 +1,5 @@
+import * as timers from './timers.js'
+
export * from '../highlevel/utils/index.js'
// todo: remove after 1.0.0
export * from '../highlevel/storage/service/current-user.js'
@@ -28,3 +30,4 @@ export * from './sorted-array.js'
export * from './tl-json.js'
export * from './type-assertions.js'
export * from '@mtcute/tl-runtime'
+export { timers }
diff --git a/packages/core/src/utils/misc-utils.ts b/packages/core/src/utils/misc-utils.ts
index 0891509d..781fbb06 100644
--- a/packages/core/src/utils/misc-utils.ts
+++ b/packages/core/src/utils/misc-utils.ts
@@ -1,22 +1,24 @@
+import * as timers from './timers.js'
+
/**
* Sleep for the given number of ms
*
* @param ms Number of ms to sleep
*/
-export const sleep = (ms: number): Promise => new Promise(resolve => setTimeout(resolve, ms))
+export const sleep = (ms: number): Promise => new Promise(resolve => timers.setTimeout(resolve, ms))
export function sleepWithAbort(ms: number, signal: AbortSignal): Promise {
return new Promise((resolve, reject) => {
- let timeout: NodeJS.Timeout
+ let timeout: timers.Timer
const onAbort = () => {
- clearTimeout(timeout)
+ timers.clearTimeout(timeout)
reject(signal.reason)
}
signal.addEventListener('abort', onAbort)
- timeout = setTimeout(() => {
+ timeout = timers.setTimeout(() => {
signal.removeEventListener('abort', onAbort)
resolve()
}, ms)
diff --git a/packages/core/src/utils/reloadable.ts b/packages/core/src/utils/reloadable.ts
index 425c0354..0fa2a1fe 100644
--- a/packages/core/src/utils/reloadable.ts
+++ b/packages/core/src/utils/reloadable.ts
@@ -1,4 +1,5 @@
import { asyncResettable } from './function-utils.js'
+import * as timers from './timers.js'
export interface ReloadableParams {
reload: (old?: Data) => Promise
@@ -13,7 +14,7 @@ export class Reloadable {
protected _data?: Data
protected _expiresAt = 0
protected _listeners: ((data: Data) => void)[] = []
- protected _timeout?: NodeJS.Timeout
+ protected _timeout?: timers.Timer
private _reload = asyncResettable(async () => {
const data = await this.params.reload(this._data)
@@ -32,10 +33,10 @@ export class Reloadable {
this._data = data
this._expiresAt = expiresAt
- if (this._timeout) clearTimeout(this._timeout)
+ if (this._timeout) timers.clearTimeout(this._timeout)
if (!this.params.disableAutoReload) {
- this._timeout = setTimeout(() => {
+ this._timeout = timers.setTimeout(() => {
this._reload.reset()
this.update().catch((err: unknown) => {
this.params.onError?.(err)
@@ -70,7 +71,7 @@ export class Reloadable {
}
destroy(): void {
- if (this._timeout) clearTimeout(this._timeout)
+ if (this._timeout) timers.clearTimeout(this._timeout)
this._listeners.length = 0
this._reload.reset()
}
diff --git a/packages/core/src/utils/timers.ts b/packages/core/src/utils/timers.ts
new file mode 100644
index 00000000..16ab7e43
--- /dev/null
+++ b/packages/core/src/utils/timers.ts
@@ -0,0 +1,61 @@
+/* eslint-disable no-restricted-globals, ts/no-implied-eval */
+
+// timers typings are mixed up across different runtimes, which leads
+// to the globals being typed incorrectly.
+// instead, we can treat the timers as opaque objects, and expose
+// them through the `timers` esm namespace.
+// this has near-zero runtime cost, but makes everything type-safe
+//
+// NB: we are using wrapper functions instead of...
+// - directly exposing the globals because the standard doesn't allow that
+// - .bind()-ing because it makes it harder to mock the timer globals
+
+export interface Timer { readonly __type: 'Timer' }
+export interface Interval { readonly __type: 'Interval' }
+export interface Immediate { readonly __type: 'Immediate' }
+
+const setTimeoutWrap = (
+ (...args: Parameters) => setTimeout(...args)
+) as unknown as any>(
+ fn: T, ms: number, ...args: Parameters
+) => Timer
+const setIntervalWrap = (
+ (...args: Parameters) => setInterval(...args)
+) as unknown as any>(
+ fn: T, ms: number, ...args: Parameters
+) => Interval
+
+let setImmediateWrap: any
+if (typeof setImmediate !== 'undefined') {
+ setImmediateWrap = (...args: Parameters) => setImmediate(...args)
+} else {
+ // eslint-disable-next-line
+ setImmediateWrap = (fn: (...args: any[]) => void, ...args: any[]) => setTimeout(fn, 0, ...args)
+}
+const setImmediateWrapExported = setImmediateWrap as any>(
+ fn: T, ...args: Parameters
+) => Immediate
+
+const clearTimeoutWrap = (
+ (...args: Parameters) => clearTimeout(...args)
+) as unknown as (timer?: Timer) => void
+const clearIntervalWrap = (
+ (...args: Parameters) => clearInterval(...args)
+) as unknown as (timer?: Interval) => void
+
+let clearImmediateWrap: any
+if (typeof clearImmediate !== 'undefined') {
+ clearImmediateWrap = (...args: Parameters) => clearImmediate(...args)
+} else {
+ clearImmediateWrap = (timer: number) => clearTimeout(timer)
+}
+const clearImmediateWrapExported = clearImmediateWrap as (timer?: Immediate) => void
+
+export {
+ setTimeoutWrap as setTimeout,
+ setIntervalWrap as setInterval,
+ setImmediateWrapExported as setImmediate,
+ clearTimeoutWrap as clearTimeout,
+ clearIntervalWrap as clearInterval,
+ clearImmediateWrapExported as clearImmediate,
+}
diff --git a/packages/core/src/utils/type-assertions.test.ts b/packages/core/src/utils/type-assertions.test.ts
index e721860b..028f6b76 100644
--- a/packages/core/src/utils/type-assertions.test.ts
+++ b/packages/core/src/utils/type-assertions.test.ts
@@ -3,7 +3,6 @@ import { describe, expect, it } from 'vitest'
import {
assertTypeIs,
assertTypeIsNot,
- hasPresentKey,
hasValueAtKey,
isPresent,
mtpAssertTypeIs,
@@ -23,24 +22,6 @@ describe('isPresent', () => {
})
})
-describe('hasPresentKey', () => {
- it('should return true for objects with present keys', () => {
- expect(hasPresentKey('a')({ a: 1 })).toBe(true)
- expect(hasPresentKey('a')({ a: 1, b: 2 })).toBe(true)
- })
-
- it('should return false for objects with undefined/null keys', () => {
- expect(hasPresentKey('a')({ a: undefined })).toBe(false)
- expect(hasPresentKey('a')({ a: null })).toBe(false)
- expect(hasPresentKey('a')({ a: undefined, b: 2 })).toBe(false)
- expect(hasPresentKey('a')({ a: null, b: 2 })).toBe(false)
- })
-
- it('should return false for objects without the key', () => {
- expect(hasPresentKey('a')({ b: 2 })).toBe(false)
- })
-})
-
describe('hasValueAtKey', () => {
it('should return true for objects with the correct value', () => {
expect(hasValueAtKey('a', 1)({ a: 1 })).toBe(true)
diff --git a/packages/core/src/utils/type-assertions.ts b/packages/core/src/utils/type-assertions.ts
index 51d7bdee..fd4785e7 100644
--- a/packages/core/src/utils/type-assertions.ts
+++ b/packages/core/src/utils/type-assertions.ts
@@ -8,25 +8,6 @@ export function isPresent(t: T | undefined | null | void): t is T {
return t !== undefined && t !== null
}
-/**
- * Returns a function that can be used to filter down objects
- * to the ones that have a defined non-null value under the key `k`.
- *
- * @example
- * ```ts
- * const filesWithUrl = files.filter(file => file.url);
- * files[0].url // In this case, TS might still treat this as undefined/null
- *
- * const filesWithUrl = files.filter(hasPresentKey("url"));
- * files[0].url // TS will know that this is present
- * ```
- */
-export function hasPresentKey(k: K) {
- return function (a: T & { [k in K]?: V | null }): a is T & { [k in K]: V } {
- return a[k] !== undefined && a[k] !== null
- }
-}
-
/**
* Returns a function that can be used to filter down objects
* to the ones that have a specific value V under a key `k`.
@@ -44,7 +25,8 @@ export function hasPresentKey(k: K) {
* files[0].imageUrl // TS will know this is present, because already it excluded the other union members.
* ```
*/
-export function hasValueAtKey(k: K, v: V) {
+export function hasValueAtKey(k: K, v: V):
+(a: T & { [k in K]: unknown }) => a is T & { [k in K]: V } {
return function (a: T & { [k in K]: unknown }): a is T & { [k in K]: V } {
return a[k] === v
}
diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json
index 5b7b44b7..5bac6173 100644
--- a/packages/core/tsconfig.json
+++ b/packages/core/tsconfig.json
@@ -1,14 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./dist/esm"
- },
- "references": [
- { "path": "../tl" },
- { "path": "../tl-runtime" },
- { "path": "../test" }
- ],
"include": [
"./src"
]
diff --git a/packages/create-bot/build.config.cjs b/packages/create-bot/build.config.cjs
deleted file mode 100644
index 43ca88df..00000000
--- a/packages/create-bot/build.config.cjs
+++ /dev/null
@@ -1,6 +0,0 @@
-module.exports = ({ fs, path, packageDir, outDir }) => ({
- buildCjs: false,
- final() {
- fs.cpSync(path.join(packageDir, 'template'), path.join(outDir, 'template'), { recursive: true })
- },
-})
diff --git a/packages/create-bot/build.config.js b/packages/create-bot/build.config.js
new file mode 100644
index 00000000..cb97650e
--- /dev/null
+++ b/packages/create-bot/build.config.js
@@ -0,0 +1,9 @@
+import { resolve } from 'node:path'
+import { cpSync } from 'node:fs'
+
+export default () => ({
+ buildCjs: false,
+ final({ outDir, packageDir }) {
+ cpSync(resolve(packageDir, 'template'), resolve(outDir, 'template'), { recursive: true })
+ },
+})
diff --git a/packages/create-bot/package.json b/packages/create-bot/package.json
index 9ba00ea1..3a92ba04 100644
--- a/packages/create-bot/package.json
+++ b/packages/create-bot/package.json
@@ -1,30 +1,30 @@
{
- "name": "@mtcute/create-bot",
- "type": "module",
- "version": "0.16.7",
- "private": true,
- "description": "Bot starter kit for mtcute",
- "author": "alina sireneva ",
- "license": "MIT",
- "bin": {
- "create-bot": "./src/main.js"
- },
- "scripts": {
- "build": "pnpm run -w build-package create-bot",
- "run": "tsx src/main.ts",
- "run:deno": "node scripts/generate-import-map.js && deno run --import-map=./scripts/import-map.json -A --unstable-sloppy-imports src/main.ts"
- },
- "dependencies": {
- "colorette": "2.0.20",
- "cross-spawn": "7.0.3",
- "glob": "11.0.0",
- "handlebars": "4.7.8",
- "inquirer": "9.2.11",
- "openurl": "1.1.1"
- },
- "devDependencies": {
- "@types/cross-spawn": "^6.0.6",
- "@types/inquirer": "^9.0.6",
- "@types/openurl": "^1.0.3"
- }
+ "name": "@mtcute/create-bot",
+ "type": "module",
+ "version": "0.16.7",
+ "private": true,
+ "description": "Bot starter kit for mtcute",
+ "author": "alina sireneva ",
+ "license": "MIT",
+ "bin": {
+ "create-bot": "./src/main.ts"
+ },
+ "scripts": {
+ "build": "pnpm run -w build-package create-bot",
+ "run": "tsx src/main.ts",
+ "run:deno": "node scripts/generate-import-map.js && deno run --import-map=./scripts/import-map.json -A --unstable-sloppy-imports src/main.ts"
+ },
+ "dependencies": {
+ "colorette": "2.0.20",
+ "cross-spawn": "7.0.3",
+ "glob": "11.0.0",
+ "handlebars": "4.7.8",
+ "inquirer": "9.2.11",
+ "openurl": "1.1.1"
+ },
+ "devDependencies": {
+ "@types/cross-spawn": "^6.0.6",
+ "@types/inquirer": "^9.0.6",
+ "@types/openurl": "^1.0.3"
+ }
}
diff --git a/packages/create-bot/src/cli.ts b/packages/create-bot/src/cli.ts
index 5ce5e743..e3b9a4ea 100644
--- a/packages/create-bot/src/cli.ts
+++ b/packages/create-bot/src/cli.ts
@@ -47,6 +47,7 @@ export async function askForConfigPersisted(): Promise {
message: 'API ID (press Enter to obtain one):',
validate: (v: string) => {
if (!v) {
+ // eslint-disable-next-line no-restricted-globals
setTimeout(() => {
try {
open(TELEGRAM_APPS_PAGE)
diff --git a/packages/create-bot/src/main.ts b/packages/create-bot/src/main.ts
index 2a0fe48b..b6671e93 100644
--- a/packages/create-bot/src/main.ts
+++ b/packages/create-bot/src/main.ts
@@ -40,7 +40,7 @@ if (!outDir.match(/^(?:[A-Z]:)?[/\\]/i)) {
const __dirname = dirname(fileURLToPath(import.meta.url))
-await runTemplater(join(__dirname, '../template'), outDir, config)
+await runTemplater(join(__dirname, 'template'), outDir, config)
await installDependencies(outDir, config)
diff --git a/packages/create-bot/tsconfig.json b/packages/create-bot/tsconfig.json
index 8439751c..5bac6173 100644
--- a/packages/create-bot/tsconfig.json
+++ b/packages/create-bot/tsconfig.json
@@ -1,8 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "outDir": "./dist"
- },
"include": [
"./src"
]
diff --git a/packages/crypto-node/build.config.cjs b/packages/crypto-node/build.config.js
similarity index 86%
rename from packages/crypto-node/build.config.cjs
rename to packages/crypto-node/build.config.js
index 9151f652..4cef5521 100644
--- a/packages/crypto-node/build.config.cjs
+++ b/packages/crypto-node/build.config.js
@@ -1,10 +1,16 @@
-const crypto = require('node:crypto')
-const path = require('node:path')
-const fs = require('node:fs')
-const cp = require('node:child_process')
-const { Readable } = require('node:stream')
+/* eslint-disable import/no-relative-packages, no-console, no-restricted-globals */
+import { createHash } from 'node:crypto'
+import path from 'node:path'
+import * as fs from 'node:fs'
+import { spawn } from 'node:child_process'
+import { Readable } from 'node:stream'
+import { fileURLToPath } from 'node:url'
-let git
+import * as glob from 'glob'
+
+import { getCurrentBranch, getCurrentCommit } from '../../scripts/git-utils.js'
+
+const __dirname = path.dirname(fileURLToPath(new URL(import.meta.url)))
const GITHUB_TOKEN = process.env.GITHUB_TOKEN
let SKIP_PREBUILT = process.env.BUILD_FOR_DOCS === '1'
@@ -52,7 +58,7 @@ async function runWorkflow(commit, hash) {
method: 'POST',
headers: GITHUB_HEADERS,
body: JSON.stringify({
- ref: git.getCurrentBranch(),
+ ref: getCurrentBranch(),
inputs: { commit, hash },
}),
})
@@ -132,7 +138,7 @@ async function extractArtifacts(artifacts) {
// extract the zip
await new Promise((resolve, reject) => {
- const child = cp.spawn('unzip', [outFile, '-d', path.join(__dirname, 'dist/prebuilds')], {
+ const child = spawn('unzip', [outFile, '-d', path.join(__dirname, 'dist/prebuilds')], {
stdio: 'inherit',
})
@@ -149,23 +155,21 @@ async function extractArtifacts(artifacts) {
)
}
-module.exports = ({ fs, glob, path, packageDir, outDir }) => ({
- async final() {
- // eslint-disable-next-line import/no-relative-packages
- git = await import('../../scripts/git-utils.js')
- const libDir = path.join(packageDir, 'lib')
+export default () => ({
+ async final({ packageDir, outDir }) {
+ const libDir = path.resolve(packageDir, 'lib')
if (!SKIP_PREBUILT) {
// generate sources hash
const hashes = []
for (const file of glob.sync(path.join(libDir, '**/*'))) {
- const hash = crypto.createHash('sha256')
+ const hash = createHash('sha256')
hash.update(fs.readFileSync(file))
hashes.push(hash.digest('hex'))
}
- const hash = crypto.createHash('sha256')
+ const hash = createHash('sha256')
.update(hashes.join('\n'))
.digest('hex')
console.log(hash)
@@ -175,7 +179,7 @@ module.exports = ({ fs, glob, path, packageDir, outDir }) => ({
if (!artifacts) {
console.log('[i] No artifacts found, running workflow')
- artifacts = await runWorkflow(git.getCurrentCommit(), hash)
+ artifacts = await runWorkflow(getCurrentCommit(), hash)
}
console.log('[i] Extracting artifacts')
@@ -195,7 +199,6 @@ module.exports = ({ fs, glob, path, packageDir, outDir }) => ({
)
// for some unknown fucking reason ts doesn't do this
- fs.copyFileSync(path.join(packageDir, 'src/native.cjs'), path.join(outDir, 'cjs/native.cjs'))
- fs.copyFileSync(path.join(packageDir, 'src/native.cjs'), path.join(outDir, 'esm/native.cjs'))
+ fs.copyFileSync(path.join(packageDir, 'src/native.cjs'), path.join(outDir, 'native.cjs'))
},
})
diff --git a/packages/crypto-node/tsconfig.json b/packages/crypto-node/tsconfig.json
index 3b5437ec..5bac6173 100644
--- a/packages/crypto-node/tsconfig.json
+++ b/packages/crypto-node/tsconfig.json
@@ -1,12 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./dist/esm"
- },
- "references": [
- { "path": "../core" }
- ],
"include": [
"./src"
]
diff --git a/packages/deno/build.config.cjs b/packages/deno/build.config.cjs
deleted file mode 100644
index f8e7735c..00000000
--- a/packages/deno/build.config.cjs
+++ /dev/null
@@ -1,12 +0,0 @@
-module.exports = ({ outDir, fs, jsr }) => ({
- buildCjs: false,
- final() {
- if (jsr) {
- // jsr doesn't support symlinks, so we need to copy the files manually
- const real = fs.realpathSync(`${outDir}/common-internals-web`)
- fs.unlinkSync(`${outDir}/common-internals-web`)
- // console.log(real)
- fs.cpSync(real, `${outDir}/common-internals-web`, { recursive: true })
- }
- },
-})
diff --git a/packages/deno/build.config.js b/packages/deno/build.config.js
new file mode 100644
index 00000000..7eed9821
--- /dev/null
+++ b/packages/deno/build.config.js
@@ -0,0 +1,10 @@
+import * as fs from 'node:fs'
+
+export default () => ({
+ finalJsr({ outDir }) {
+ // jsr doesn't support symlinks, so we need to copy the files manually
+ const real = fs.realpathSync(`${outDir}/common-internals-web`)
+ fs.unlinkSync(`${outDir}/common-internals-web`)
+ fs.cpSync(real, `${outDir}/common-internals-web`, { recursive: true })
+ },
+})
diff --git a/packages/deno/tsconfig.json b/packages/deno/tsconfig.json
index b73c9d7d..5bac6173 100644
--- a/packages/deno/tsconfig.json
+++ b/packages/deno/tsconfig.json
@@ -1,15 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./dist"
- },
- "references": [
- { "path": "../core" },
- { "path": "../dispatcher" },
- { "path": "../html-parser" },
- { "path": "../markdown-parser" }
- ],
"include": [
"./src"
]
diff --git a/packages/dispatcher/src/context/business-message.ts b/packages/dispatcher/src/context/business-message.ts
index 68428f7c..d90dcdd2 100644
--- a/packages/dispatcher/src/context/business-message.ts
+++ b/packages/dispatcher/src/context/business-message.ts
@@ -21,7 +21,7 @@ import type { UpdateContext } from './base.js'
*/
export class BusinessMessageContext extends BusinessMessage implements UpdateContext {
// this is primarily for proper types in filters, so don't bother much with actual value
- readonly _name = 'new_business_message'
+ readonly _name = 'new_business_message' as const
/**
* List of messages in the message group.
diff --git a/packages/dispatcher/src/context/callback-query.ts b/packages/dispatcher/src/context/callback-query.ts
index b92edd0e..4e57795d 100644
--- a/packages/dispatcher/src/context/callback-query.ts
+++ b/packages/dispatcher/src/context/callback-query.ts
@@ -10,7 +10,7 @@ import type { UpdateContext } from './base.js'
* This is a subclass of {@link CallbackQuery}, so all its fields are also available.
*/
export class CallbackQueryContext extends CallbackQuery implements UpdateContext {
- readonly _name = 'callback_query'
+ readonly _name = 'callback_query' as const
constructor(
readonly client: TelegramClient,
@@ -67,7 +67,7 @@ export class CallbackQueryContext extends CallbackQuery implements UpdateContext
* This is a subclass of {@link InlineCallbackQuery}, so all its fields are also available.
*/
export class InlineCallbackQueryContext extends InlineCallbackQuery implements UpdateContext {
- readonly _name = 'inline_callback_query'
+ readonly _name = 'inline_callback_query' as const
constructor(
readonly client: TelegramClient,
@@ -100,7 +100,7 @@ export class InlineCallbackQueryContext extends InlineCallbackQuery implements U
export class BusinessCallbackQueryContext
extends BusinessCallbackQuery
implements UpdateContext {
- readonly _name = 'business_callback_query'
+ readonly _name = 'business_callback_query' as const
constructor(
readonly client: TelegramClient,
diff --git a/packages/dispatcher/src/context/chat-join-request.ts b/packages/dispatcher/src/context/chat-join-request.ts
index 4f2d73e5..c1a2f29e 100644
--- a/packages/dispatcher/src/context/chat-join-request.ts
+++ b/packages/dispatcher/src/context/chat-join-request.ts
@@ -11,7 +11,7 @@ import type { UpdateContext } from './base.js'
export class ChatJoinRequestUpdateContext
extends BotChatJoinRequestUpdate
implements UpdateContext {
- readonly _name = 'bot_chat_join_request'
+ readonly _name = 'bot_chat_join_request' as const
constructor(
readonly client: TelegramClient,
diff --git a/packages/dispatcher/src/context/chosen-inline-result.ts b/packages/dispatcher/src/context/chosen-inline-result.ts
index 9df5d2be..766e87bb 100644
--- a/packages/dispatcher/src/context/chosen-inline-result.ts
+++ b/packages/dispatcher/src/context/chosen-inline-result.ts
@@ -12,7 +12,7 @@ import type { UpdateContext } from './base.js'
* > Inline feedback in [@BotFather](//t.me/botfather)
*/
export class ChosenInlineResultContext extends ChosenInlineResult implements UpdateContext {
- readonly _name = 'chosen_inline_result'
+ readonly _name = 'chosen_inline_result' as const
constructor(
readonly client: TelegramClient,
diff --git a/packages/dispatcher/src/context/inline-query.ts b/packages/dispatcher/src/context/inline-query.ts
index 6d24134a..3fcf457b 100644
--- a/packages/dispatcher/src/context/inline-query.ts
+++ b/packages/dispatcher/src/context/inline-query.ts
@@ -10,7 +10,7 @@ import type { UpdateContext } from './base.js'
* This is a subclass of {@link InlineQuery}, so all its fields are also available.
*/
export class InlineQueryContext extends InlineQuery implements UpdateContext {
- readonly _name = 'inline_query'
+ readonly _name = 'inline_query' as const
constructor(
readonly client: TelegramClient,
diff --git a/packages/dispatcher/src/context/message.ts b/packages/dispatcher/src/context/message.ts
index f8c06d33..ee3a7468 100644
--- a/packages/dispatcher/src/context/message.ts
+++ b/packages/dispatcher/src/context/message.ts
@@ -21,7 +21,7 @@ import type { UpdateContext } from './base.js'
*/
export class MessageContext extends Message implements UpdateContext {
// this is primarily for proper types in filters, so don't bother much with actual value
- readonly _name = 'new_message'
+ readonly _name = 'new_message' as const
/**
* List of messages in the message group.
diff --git a/packages/dispatcher/src/context/pre-checkout-query.ts b/packages/dispatcher/src/context/pre-checkout-query.ts
index e0fbe14c..eaefa0c6 100644
--- a/packages/dispatcher/src/context/pre-checkout-query.ts
+++ b/packages/dispatcher/src/context/pre-checkout-query.ts
@@ -9,7 +9,7 @@ import type { UpdateContext } from './base.js'
* This is a subclass of {@link PreCheckoutQuery}, so all its fields are also available.
*/
export class PreCheckoutQueryContext extends PreCheckoutQuery implements UpdateContext {
- readonly _name = 'pre_checkout_query'
+ readonly _name = 'pre_checkout_query' as const
constructor(
readonly client: TelegramClient,
diff --git a/packages/dispatcher/src/state/service.ts b/packages/dispatcher/src/state/service.ts
index 719b9867..53731f1b 100644
--- a/packages/dispatcher/src/state/service.ts
+++ b/packages/dispatcher/src/state/service.ts
@@ -1,4 +1,4 @@
-import { LruMap, asyncResettable } from '@mtcute/core/utils.js'
+import { LruMap, asyncResettable, timers } from '@mtcute/core/utils.js'
import type { MaybePromise } from '@mtcute/core'
import type { IStateStorageProvider } from './provider.js'
@@ -9,7 +9,7 @@ export class StateService {
constructor(readonly provider: IStateStorageProvider) {}
private _cache: LruMap = new LruMap(100)
- private _vacuumTimer?: NodeJS.Timeout
+ private _vacuumTimer?: timers.Interval
private _loaded = false
private _load = asyncResettable(async () => {
@@ -19,7 +19,7 @@ export class StateService {
async load(): Promise {
await this._load.run()
- this._vacuumTimer = setInterval(() => {
+ this._vacuumTimer = timers.setInterval(() => {
Promise.resolve(this.provider.state.vacuum(Date.now())).catch(() => {})
}, 300_000)
}
@@ -27,7 +27,7 @@ export class StateService {
async destroy(): Promise {
await this.provider.driver.save?.()
await this.provider.driver.destroy?.()
- clearInterval(this._vacuumTimer)
+ timers.clearInterval(this._vacuumTimer)
this._loaded = false
}
diff --git a/packages/dispatcher/tsconfig.json b/packages/dispatcher/tsconfig.json
index 3b5437ec..5bac6173 100644
--- a/packages/dispatcher/tsconfig.json
+++ b/packages/dispatcher/tsconfig.json
@@ -1,12 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./dist/esm"
- },
- "references": [
- { "path": "../core" }
- ],
"include": [
"./src"
]
diff --git a/packages/file-id/tsconfig.json b/packages/file-id/tsconfig.json
index 3b5437ec..5bac6173 100644
--- a/packages/file-id/tsconfig.json
+++ b/packages/file-id/tsconfig.json
@@ -1,12 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./dist/esm"
- },
- "references": [
- { "path": "../core" }
- ],
"include": [
"./src"
]
diff --git a/packages/html-parser/tsconfig.json b/packages/html-parser/tsconfig.json
index 3b5437ec..5bac6173 100644
--- a/packages/html-parser/tsconfig.json
+++ b/packages/html-parser/tsconfig.json
@@ -1,12 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./dist/esm"
- },
- "references": [
- { "path": "../core" }
- ],
"include": [
"./src"
]
diff --git a/packages/http-proxy/tsconfig.json b/packages/http-proxy/tsconfig.json
index 23cc8889..f149f686 100644
--- a/packages/http-proxy/tsconfig.json
+++ b/packages/http-proxy/tsconfig.json
@@ -1,12 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "outDir": "./dist/esm"
- },
- "references": [
- { "path": "../core" },
- { "path": "../node" }
- ],
"include": [
"./index.ts"
]
diff --git a/packages/i18n/tsconfig.json b/packages/i18n/tsconfig.json
index 9f19a1fb..5bac6173 100644
--- a/packages/i18n/tsconfig.json
+++ b/packages/i18n/tsconfig.json
@@ -1,12 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./dist/esm"
- },
- "references": [
- { "path": "../dispatcher" }
- ],
"include": [
"./src"
]
diff --git a/packages/markdown-parser/tsconfig.json b/packages/markdown-parser/tsconfig.json
index 3b5437ec..5bac6173 100644
--- a/packages/markdown-parser/tsconfig.json
+++ b/packages/markdown-parser/tsconfig.json
@@ -1,12 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./dist/esm"
- },
- "references": [
- { "path": "../core" }
- ],
"include": [
"./src"
]
diff --git a/packages/mtproxy/tsconfig.json b/packages/mtproxy/tsconfig.json
index 1f73ad25..da82202a 100644
--- a/packages/mtproxy/tsconfig.json
+++ b/packages/mtproxy/tsconfig.json
@@ -1,12 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "outDir": "./dist/esm"
- },
- "references": [
- { "path": "../core" },
- { "path": "../node" }
- ],
"include": [
"./index.ts",
"./fake-tls.ts"
diff --git a/packages/node/build.config.cjs b/packages/node/build.config.cjs
deleted file mode 100644
index 3b96657a..00000000
--- a/packages/node/build.config.cjs
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = () => ({ esmOnlyDirectives: true })
diff --git a/packages/node/build.config.js b/packages/node/build.config.js
new file mode 100644
index 00000000..ffef134f
--- /dev/null
+++ b/packages/node/build.config.js
@@ -0,0 +1,41 @@
+import { fileURLToPath } from 'node:url'
+
+export default () => {
+ const clientId = fileURLToPath(new URL('./src/client.ts', import.meta.url))
+ // const buildingCjs = false
+
+ return {
+ external: ['@mtcute/crypto-node'],
+ rollupPluginsPre: [
+ {
+ // very much a crutch, but it works
+ // i couldn't figure out a way to hook into the esm->cjs transform,
+ // so i'm just replacing the await import with require and then back
+ name: 'mtcute-node-build-plugin',
+ transform(code, id) {
+ if (id === clientId) {
+ return code.replace('await import(', 'require(')
+ }
+
+ return code
+ },
+ generateBundle(output, bundle) {
+ if (output.format !== 'es') return
+
+ let found = false
+
+ for (const chunk of Object.values(bundle)) {
+ if (chunk.code.match(/require\("@mtcute\/crypto-node"\)/)) {
+ found = true
+ chunk.code = chunk.code.replace('require("@mtcute/crypto-node")', '(await import("@mtcute/crypto-node"))')
+ }
+ }
+
+ if (!found) {
+ throw new Error('Could not find crypto-node import')
+ }
+ },
+ },
+ ],
+ }
+}
diff --git a/packages/node/src/client.ts b/packages/node/src/client.ts
index ec08f9fa..59ba20d1 100644
--- a/packages/node/src/client.ts
+++ b/packages/node/src/client.ts
@@ -28,7 +28,6 @@ try {
/* eslint-disable ts/ban-ts-comment,ts/no-unsafe-assignment */
// @ts-ignore not in deps
- // @esm-replace-import
nativeCrypto = (await import('@mtcute/crypto-node')).NodeNativeCryptoProvider
/* eslint-enable ts/ban-ts-comment,ts/no-unsafe-assignment */
} catch {}
diff --git a/packages/node/src/utils/crypto.ts b/packages/node/src/utils/crypto.ts
index 2415c726..698daaaa 100644
--- a/packages/node/src/utils/crypto.ts
+++ b/packages/node/src/utils/crypto.ts
@@ -70,9 +70,7 @@ export abstract class BaseNodeCryptoProvider extends BaseCryptoProvider {
export class NodeCryptoProvider extends BaseNodeCryptoProvider implements ICryptoProvider {
async initialize(): Promise {
- // @only-if-esm
const require = createRequire(import.meta.url)
- // @/only-if-esm
const wasmFile = require.resolve('@mtcute/wasm/mtcute.wasm')
const wasm = await readFile(wasmFile)
initSync(wasm)
diff --git a/packages/node/tsconfig.json b/packages/node/tsconfig.json
index 85ff9406..5bac6173 100644
--- a/packages/node/tsconfig.json
+++ b/packages/node/tsconfig.json
@@ -1,15 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./dist/esm"
- },
- "references": [
- { "path": "../core" },
- { "path": "../dispatcher" },
- { "path": "../html-parser" },
- { "path": "../markdown-parser" }
- ],
"include": [
"./src"
]
diff --git a/packages/socks-proxy/tsconfig.json b/packages/socks-proxy/tsconfig.json
index 23cc8889..f149f686 100644
--- a/packages/socks-proxy/tsconfig.json
+++ b/packages/socks-proxy/tsconfig.json
@@ -1,12 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "outDir": "./dist/esm"
- },
- "references": [
- { "path": "../core" },
- { "path": "../node" }
- ],
"include": [
"./index.ts"
]
diff --git a/packages/test/build.config.cjs b/packages/test/build.config.cjs
deleted file mode 100644
index 17718026..00000000
--- a/packages/test/build.config.cjs
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = () => ({ buildCjs: false })
diff --git a/packages/test/build.config.js b/packages/test/build.config.js
new file mode 100644
index 00000000..afe05088
--- /dev/null
+++ b/packages/test/build.config.js
@@ -0,0 +1 @@
+export default () => ({ buildCjs: false })
diff --git a/packages/test/src/client.test.ts b/packages/test/src/client.test.ts
index 974917d1..074305f4 100644
--- a/packages/test/src/client.test.ts
+++ b/packages/test/src/client.test.ts
@@ -17,22 +17,25 @@ describe('client stub', () => {
})
})
- it('should correctly decrypt intercepted raw messages', async () => {
- const log: string[] = []
+ // for some reason, this test fails in browser. todo: investigate
+ if (import.meta.env.TEST_ENV !== 'browser') {
+ it('should correctly decrypt intercepted raw messages', async () => {
+ const log: string[] = []
- const client = new StubTelegramClient()
+ const client = new StubTelegramClient()
- client.onRawMessage((msg) => {
- log.push(`message ctor=${getPlatform().hexEncode(msg.subarray(0, 4))}`)
- client.close().catch(() => {})
+ client.onRawMessage((msg) => {
+ log.push(`message ctor=${getPlatform().hexEncode(msg.subarray(0, 4))}`)
+ client.close().catch(() => {})
+ })
+
+ await client.with(async () => {
+ await client.call({ _: 'help.getConfig' }).catch(() => {}) // ignore "client closed" error
+
+ expect(log).toEqual([
+ 'message ctor=dcf8f173', // msg_container
+ ])
+ })
})
-
- await client.with(async () => {
- await client.call({ _: 'help.getConfig' }).catch(() => {}) // ignore "client closed" error
-
- expect(log).toEqual([
- 'message ctor=dcf8f173', // msg_container
- ])
- })
- })
+ }
})
diff --git a/packages/test/src/client.ts b/packages/test/src/client.ts
index 08650cf7..5be43e23 100644
--- a/packages/test/src/client.ts
+++ b/packages/test/src/client.ts
@@ -26,7 +26,7 @@ export class StubTelegramClient extends BaseTelegramClient {
super({
apiId: 0,
apiHash: '',
- logLevel: 0,
+ logLevel: 5,
storage,
disableUpdates: true,
transport: () => {
diff --git a/packages/test/tsconfig.json b/packages/test/tsconfig.json
index b7961074..5bac6173 100644
--- a/packages/test/tsconfig.json
+++ b/packages/test/tsconfig.json
@@ -1,12 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./dist"
- },
- "references": [
- { "path": "../tl" }
- ],
"include": [
"./src"
]
diff --git a/packages/tl-runtime/tsconfig.json b/packages/tl-runtime/tsconfig.json
index 77ca9f2d..5bac6173 100644
--- a/packages/tl-runtime/tsconfig.json
+++ b/packages/tl-runtime/tsconfig.json
@@ -1,9 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./dist/esm"
- },
"include": [
"./src"
]
diff --git a/packages/tl-utils/tsconfig.json b/packages/tl-utils/tsconfig.json
index 77ca9f2d..5bac6173 100644
--- a/packages/tl-utils/tsconfig.json
+++ b/packages/tl-utils/tsconfig.json
@@ -1,9 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./dist/esm"
- },
"include": [
"./src"
]
diff --git a/packages/tl/build.config.cjs b/packages/tl/build.config.cjs
deleted file mode 100644
index 92980680..00000000
--- a/packages/tl/build.config.cjs
+++ /dev/null
@@ -1,82 +0,0 @@
-module.exports = ({ fs, path, outDir, packageDir, jsr, transformFile }) => ({
- buildTs: false,
- buildCjs: false,
- final() {
- // create package by copying all the needed files
- const files = [
- 'binary/reader.d.ts',
- 'binary/reader.js',
- 'binary/rsa-keys.d.ts',
- 'binary/rsa-keys.js',
- 'binary/writer.d.ts',
- 'binary/writer.js',
- 'index.d.ts',
- 'index.js',
- 'raw-errors.json',
- 'mtp-schema.json',
- 'api-schema.json',
- ]
-
- fs.mkdirSync(path.join(outDir, 'binary'), { recursive: true })
-
- 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/scripts/fetch-api.ts b/packages/tl/scripts/fetch-api.ts
index 180ded07..15016c36 100644
--- a/packages/tl/scripts/fetch-api.ts
+++ b/packages/tl/scripts/fetch-api.ts
@@ -9,7 +9,7 @@ import { join } from 'node:path'
import * as readline from 'node:readline'
import * as cheerio from 'cheerio'
-import { hasPresentKey, isPresent } from '@mtcute/core/utils.js'
+import { isPresent } from '@mtcute/core/utils.js'
import type {
TlEntry,
TlFullSchema,
@@ -299,17 +299,17 @@ async function main() {
}
}
- const nonEmptyOptions = chooseOptions.filter(hasPresentKey('entry'))
+ const nonEmptyOptions = chooseOptions.filter(it => it.entry !== undefined)
console.log(
'Conflict detected (%s) at %s %s:',
mergeError,
- nonEmptyOptions[0].entry.kind,
- nonEmptyOptions[0].entry.name,
+ nonEmptyOptions[0].entry!.kind,
+ nonEmptyOptions[0].entry!.name,
)
console.log('0. Remove')
nonEmptyOptions.forEach((opt, idx) => {
- console.log(`${idx + 1}. ${opt.schema.name}: (${opt.entry.kind}) ${writeTlEntryToString(opt.entry)}`)
+ console.log(`${idx + 1}. ${opt.schema.name}: (${opt.entry!.kind}) ${writeTlEntryToString(opt.entry!)}`)
})
while (true) {
diff --git a/packages/wasm/build.config.cjs b/packages/wasm/build.config.cjs
deleted file mode 100644
index b2a79b47..00000000
--- a/packages/wasm/build.config.cjs
+++ /dev/null
@@ -1,10 +0,0 @@
-module.exports = ({ path: { join }, fs, outDir, packageDir, jsr, transformFile }) => ({
- esmOnlyDirectives: true,
- final() {
- fs.cpSync(join(packageDir, 'mtcute.wasm'), join(outDir, 'mtcute.wasm'))
-
- if (jsr) {
- transformFile(join(outDir, 'index.ts'), code => code.replace("'../mtcute.wasm'", "'./mtcute.wasm'"))
- }
- },
-})
diff --git a/packages/wasm/build.config.js b/packages/wasm/build.config.js
new file mode 100644
index 00000000..8bd8326b
--- /dev/null
+++ b/packages/wasm/build.config.js
@@ -0,0 +1,11 @@
+import { resolve } from 'node:path'
+import * as fs from 'node:fs'
+
+export default () => ({
+ finalPackageJson(pkg) {
+ pkg.exports['./mtcute.wasm'] = './mtcute.wasm'
+ },
+ final({ packageDir, outDir }) {
+ fs.cpSync(resolve(packageDir, 'src/mtcute.wasm'), resolve(outDir, 'mtcute.wasm'))
+ },
+})
diff --git a/packages/wasm/package.json b/packages/wasm/package.json
index 84d486fc..00e4a630 100644
--- a/packages/wasm/package.json
+++ b/packages/wasm/package.json
@@ -1,30 +1,27 @@
{
- "name": "@mtcute/wasm",
- "type": "module",
- "version": "0.16.7",
- "private": true,
- "description": "WASM implementation of common algorithms used in Telegram",
- "author": "alina sireneva ",
- "license": "MIT",
- "sideEffects": false,
- "exports": {
- ".": "./src/index.ts",
- "./mtcute.wasm": "./mtcute.wasm"
- },
- "scripts": {
- "docs": "typedoc",
- "build": "pnpm run -w build-package wasm",
- "build:wasm": "docker build --output=lib --target=binaries lib"
- },
- "exportsKeepPath": [
- "./mtcute.wasm"
- ],
- "devDependencies": {
- "@mtcute/core": "workspace:^",
- "@mtcute/node": "workspace:^",
- "@mtcute/web": "workspace:^"
- },
- "jsrOnlyFields": {
- "exports": "./src/index.ts"
- }
+ "name": "@mtcute/wasm",
+ "type": "module",
+ "version": "0.16.7",
+ "private": true,
+ "description": "WASM implementation of common algorithms used in Telegram",
+ "author": "alina sireneva ",
+ "license": "MIT",
+ "sideEffects": false,
+ "exports": {
+ ".": "./src/index.ts",
+ "./mtcute.wasm": "./src/mtcute.wasm"
+ },
+ "scripts": {
+ "docs": "typedoc",
+ "build": "pnpm run -w build-package wasm",
+ "build:wasm": "docker build --output=lib --target=binaries lib"
+ },
+ "devDependencies": {
+ "@mtcute/core": "workspace:^",
+ "@mtcute/node": "workspace:^",
+ "@mtcute/web": "workspace:^"
+ },
+ "jsrOnlyFields": {
+ "exports": "./src/index.ts"
+ }
}
diff --git a/packages/wasm/src/index.ts b/packages/wasm/src/index.ts
index aaf9b9f9..49f9a089 100644
--- a/packages/wasm/src/index.ts
+++ b/packages/wasm/src/index.ts
@@ -8,10 +8,7 @@ export function getWasmUrl(): URL {
// making it not work. probably related to https://github.com/vitejs/vite/issues/8427,
// but asking the user to deoptimize the entire @mtcute/web is definitely not a good idea
// so we'll just use this hack for now
- // @only-if-esm
- return new URL('../mtcute.wasm', import.meta.url)
- // @/only-if-esm
- throw new Error('ESM-only')
+ return new URL('./mtcute.wasm', import.meta.url)
}
let wasm!: MtcuteWasmModule
@@ -54,7 +51,8 @@ export function initSync(module: SyncInitInput): void {
module = new WebAssembly.Instance(module)
}
- wasm = (module as WebAssembly.Instance).exports as unknown as MtcuteWasmModule
+ // eslint-disable-next-line
+ wasm = (module as unknown as WebAssembly.Instance).exports as unknown as MtcuteWasmModule
initCommon()
}
diff --git a/packages/wasm/mtcute.wasm b/packages/wasm/src/mtcute.wasm
similarity index 100%
rename from packages/wasm/mtcute.wasm
rename to packages/wasm/src/mtcute.wasm
diff --git a/packages/wasm/tests/init.ts b/packages/wasm/tests/init.ts
index c27e6c96..b8f475d1 100644
--- a/packages/wasm/tests/init.ts
+++ b/packages/wasm/tests/init.ts
@@ -1,7 +1,7 @@
import { initSync } from '../src/index.js'
-export async function initWasm() {
- const url = new URL('../mtcute.wasm', import.meta.url)
+export async function initWasm(): Promise {
+ const url = new URL('../src/mtcute.wasm', import.meta.url)
if (import.meta.env.TEST_ENV === 'node') {
const fs = await import('node:fs/promises')
diff --git a/packages/wasm/tsconfig.json b/packages/wasm/tsconfig.json
index 77ca9f2d..5bac6173 100644
--- a/packages/wasm/tsconfig.json
+++ b/packages/wasm/tsconfig.json
@@ -1,9 +1,5 @@
{
"extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./dist/esm"
- },
"include": [
"./src"
]
diff --git a/packages/web/build.config.cjs b/packages/web/build.config.cjs
deleted file mode 100644
index 3b96657a..00000000
--- a/packages/web/build.config.cjs
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = () => ({ esmOnlyDirectives: true })
diff --git a/packages/web/src/wasm.ts b/packages/web/src/wasm.ts
index b42aebf6..265dd969 100644
--- a/packages/web/src/wasm.ts
+++ b/packages/web/src/wasm.ts
@@ -40,5 +40,5 @@ export async function loadWasmBinary(input?: WasmInitInput): Promise=12'}
+ cpu: [ppc64]
+ os: [aix]
+
'@esbuild/aix-ppc64@0.23.0':
resolution: {integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==}
engines: {node: '>=18'}
@@ -569,6 +584,12 @@ packages:
cpu: [arm64]
os: [android]
+ '@esbuild/android-arm64@0.21.5':
+ resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
'@esbuild/android-arm64@0.23.0':
resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==}
engines: {node: '>=18'}
@@ -581,6 +602,12 @@ packages:
cpu: [arm]
os: [android]
+ '@esbuild/android-arm@0.21.5':
+ resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
'@esbuild/android-arm@0.23.0':
resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==}
engines: {node: '>=18'}
@@ -593,6 +620,12 @@ packages:
cpu: [x64]
os: [android]
+ '@esbuild/android-x64@0.21.5':
+ resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
'@esbuild/android-x64@0.23.0':
resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==}
engines: {node: '>=18'}
@@ -605,6 +638,12 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@esbuild/darwin-arm64@0.21.5':
+ resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
'@esbuild/darwin-arm64@0.23.0':
resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==}
engines: {node: '>=18'}
@@ -617,6 +656,12 @@ packages:
cpu: [x64]
os: [darwin]
+ '@esbuild/darwin-x64@0.21.5':
+ resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
'@esbuild/darwin-x64@0.23.0':
resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==}
engines: {node: '>=18'}
@@ -629,6 +674,12 @@ packages:
cpu: [arm64]
os: [freebsd]
+ '@esbuild/freebsd-arm64@0.21.5':
+ resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
'@esbuild/freebsd-arm64@0.23.0':
resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==}
engines: {node: '>=18'}
@@ -641,6 +692,12 @@ packages:
cpu: [x64]
os: [freebsd]
+ '@esbuild/freebsd-x64@0.21.5':
+ resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
'@esbuild/freebsd-x64@0.23.0':
resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==}
engines: {node: '>=18'}
@@ -653,6 +710,12 @@ packages:
cpu: [arm64]
os: [linux]
+ '@esbuild/linux-arm64@0.21.5':
+ resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
'@esbuild/linux-arm64@0.23.0':
resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==}
engines: {node: '>=18'}
@@ -665,6 +728,12 @@ packages:
cpu: [arm]
os: [linux]
+ '@esbuild/linux-arm@0.21.5':
+ resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
'@esbuild/linux-arm@0.23.0':
resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==}
engines: {node: '>=18'}
@@ -677,6 +746,12 @@ packages:
cpu: [ia32]
os: [linux]
+ '@esbuild/linux-ia32@0.21.5':
+ resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
'@esbuild/linux-ia32@0.23.0':
resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==}
engines: {node: '>=18'}
@@ -689,6 +764,12 @@ packages:
cpu: [loong64]
os: [linux]
+ '@esbuild/linux-loong64@0.21.5':
+ resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
'@esbuild/linux-loong64@0.23.0':
resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==}
engines: {node: '>=18'}
@@ -701,6 +782,12 @@ packages:
cpu: [mips64el]
os: [linux]
+ '@esbuild/linux-mips64el@0.21.5':
+ resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
'@esbuild/linux-mips64el@0.23.0':
resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==}
engines: {node: '>=18'}
@@ -713,6 +800,12 @@ packages:
cpu: [ppc64]
os: [linux]
+ '@esbuild/linux-ppc64@0.21.5':
+ resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
'@esbuild/linux-ppc64@0.23.0':
resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==}
engines: {node: '>=18'}
@@ -725,6 +818,12 @@ packages:
cpu: [riscv64]
os: [linux]
+ '@esbuild/linux-riscv64@0.21.5':
+ resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
'@esbuild/linux-riscv64@0.23.0':
resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==}
engines: {node: '>=18'}
@@ -737,6 +836,12 @@ packages:
cpu: [s390x]
os: [linux]
+ '@esbuild/linux-s390x@0.21.5':
+ resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
'@esbuild/linux-s390x@0.23.0':
resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==}
engines: {node: '>=18'}
@@ -749,6 +854,12 @@ packages:
cpu: [x64]
os: [linux]
+ '@esbuild/linux-x64@0.21.5':
+ resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
'@esbuild/linux-x64@0.23.0':
resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==}
engines: {node: '>=18'}
@@ -761,6 +872,12 @@ packages:
cpu: [x64]
os: [netbsd]
+ '@esbuild/netbsd-x64@0.21.5':
+ resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
'@esbuild/netbsd-x64@0.23.0':
resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==}
engines: {node: '>=18'}
@@ -779,6 +896,12 @@ packages:
cpu: [x64]
os: [openbsd]
+ '@esbuild/openbsd-x64@0.21.5':
+ resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
'@esbuild/openbsd-x64@0.23.0':
resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==}
engines: {node: '>=18'}
@@ -791,6 +914,12 @@ packages:
cpu: [x64]
os: [sunos]
+ '@esbuild/sunos-x64@0.21.5':
+ resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
'@esbuild/sunos-x64@0.23.0':
resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==}
engines: {node: '>=18'}
@@ -803,6 +932,12 @@ packages:
cpu: [arm64]
os: [win32]
+ '@esbuild/win32-arm64@0.21.5':
+ resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
'@esbuild/win32-arm64@0.23.0':
resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==}
engines: {node: '>=18'}
@@ -815,6 +950,12 @@ packages:
cpu: [ia32]
os: [win32]
+ '@esbuild/win32-ia32@0.21.5':
+ resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
'@esbuild/win32-ia32@0.23.0':
resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==}
engines: {node: '>=18'}
@@ -827,6 +968,12 @@ packages:
cpu: [x64]
os: [win32]
+ '@esbuild/win32-x64@0.21.5':
+ resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
'@esbuild/win32-x64@0.23.0':
resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==}
engines: {node: '>=18'}
@@ -968,6 +1115,19 @@ packages:
resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==}
engines: {node: '>= 0.4'}
+ '@microsoft/api-extractor-model@7.29.4':
+ resolution: {integrity: sha512-LHOMxmT8/tU1IiiiHOdHFF83Qsi+V8d0kLfscG4EvQE9cafiR8blOYr8SfkQKWB1wgEilQgXJX3MIA4vetDLZw==}
+
+ '@microsoft/api-extractor@7.47.4':
+ resolution: {integrity: sha512-HKm+P4VNzWwvq1Ey+Jfhhj/3MjsD+ka2hbt8L5AcRM95lu1MFOYnz3XlU7Gr79Q/ZhOb7W/imAKeYrOI0bFydg==}
+ hasBin: true
+
+ '@microsoft/tsdoc-config@0.17.0':
+ resolution: {integrity: sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==}
+
+ '@microsoft/tsdoc@0.15.0':
+ resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==}
+
'@mswjs/interceptors@0.29.1':
resolution: {integrity: sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==}
engines: {node: '>=18'}
@@ -1027,66 +1187,168 @@ packages:
cpu: [arm]
os: [android]
+ '@rollup/rollup-android-arm-eabi@4.21.0':
+ resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==}
+ cpu: [arm]
+ os: [android]
+
'@rollup/rollup-android-arm64@4.13.0':
resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==}
cpu: [arm64]
os: [android]
+ '@rollup/rollup-android-arm64@4.21.0':
+ resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==}
+ cpu: [arm64]
+ os: [android]
+
'@rollup/rollup-darwin-arm64@4.13.0':
resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==}
cpu: [arm64]
os: [darwin]
+ '@rollup/rollup-darwin-arm64@4.21.0':
+ resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==}
+ cpu: [arm64]
+ os: [darwin]
+
'@rollup/rollup-darwin-x64@4.13.0':
resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==}
cpu: [x64]
os: [darwin]
+ '@rollup/rollup-darwin-x64@4.21.0':
+ resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==}
+ cpu: [x64]
+ os: [darwin]
+
'@rollup/rollup-linux-arm-gnueabihf@4.13.0':
resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==}
cpu: [arm]
os: [linux]
+ '@rollup/rollup-linux-arm-gnueabihf@4.21.0':
+ resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.21.0':
+ resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==}
+ cpu: [arm]
+ os: [linux]
+
'@rollup/rollup-linux-arm64-gnu@4.13.0':
resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==}
cpu: [arm64]
os: [linux]
+ '@rollup/rollup-linux-arm64-gnu@4.21.0':
+ resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==}
+ cpu: [arm64]
+ os: [linux]
+
'@rollup/rollup-linux-arm64-musl@4.13.0':
resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==}
cpu: [arm64]
os: [linux]
+ '@rollup/rollup-linux-arm64-musl@4.21.0':
+ resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.21.0':
+ resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==}
+ cpu: [ppc64]
+ os: [linux]
+
'@rollup/rollup-linux-riscv64-gnu@4.13.0':
resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==}
cpu: [riscv64]
os: [linux]
+ '@rollup/rollup-linux-riscv64-gnu@4.21.0':
+ resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.21.0':
+ resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==}
+ cpu: [s390x]
+ os: [linux]
+
'@rollup/rollup-linux-x64-gnu@4.13.0':
resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==}
cpu: [x64]
os: [linux]
+ '@rollup/rollup-linux-x64-gnu@4.21.0':
+ resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==}
+ cpu: [x64]
+ os: [linux]
+
'@rollup/rollup-linux-x64-musl@4.13.0':
resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==}
cpu: [x64]
os: [linux]
+ '@rollup/rollup-linux-x64-musl@4.21.0':
+ resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==}
+ cpu: [x64]
+ os: [linux]
+
'@rollup/rollup-win32-arm64-msvc@4.13.0':
resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==}
cpu: [arm64]
os: [win32]
+ '@rollup/rollup-win32-arm64-msvc@4.21.0':
+ resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==}
+ cpu: [arm64]
+ os: [win32]
+
'@rollup/rollup-win32-ia32-msvc@4.13.0':
resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==}
cpu: [ia32]
os: [win32]
+ '@rollup/rollup-win32-ia32-msvc@4.21.0':
+ resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==}
+ cpu: [ia32]
+ os: [win32]
+
'@rollup/rollup-win32-x64-msvc@4.13.0':
resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==}
cpu: [x64]
os: [win32]
+ '@rollup/rollup-win32-x64-msvc@4.21.0':
+ resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rushstack/node-core-library@5.5.1':
+ resolution: {integrity: sha512-ZutW56qIzH8xIOlfyaLQJFx+8IBqdbVCZdnj+XT1MorQ1JqqxHse8vbCpEM+2MjsrqcbxcgDIbfggB1ZSQ2A3g==}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@rushstack/rig-package@0.5.3':
+ resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==}
+
+ '@rushstack/terminal@0.13.3':
+ resolution: {integrity: sha512-fc3zjXOw8E0pXS5t9vTiIPx9gHA0fIdTXsu9mT4WbH+P3mYvnrX0iAQ5a6NvyK1+CqYWBTw/wVNx7SDJkI+WYQ==}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@rushstack/ts-command-line@4.22.3':
+ resolution: {integrity: sha512-edMpWB3QhFFZ4KtSzS8WNjBgR4PXPPOVrOHMbb7kNpmQ1UFS9HdVtjCXg1H5fG+xYAbeE+TMPcVPUyX2p84STA==}
+
'@shikijs/core@1.12.1':
resolution: {integrity: sha512-biCz/mnkMktImI6hMfMX3H9kOeqsInxWEyCHbSlL8C/2TR1FqfmGxTLRNwYCKsyCyxWLbB8rEqXRVZuyxuLFmA==}
@@ -1126,7 +1388,7 @@ packages:
resolution: {integrity: sha512-+WUHSKh56B32Jk5aJgXf07E2EOkMX1yilvgKLKBCJPFAJZ4xeo1U5aDu3wwHX3lrFl7AiVGXUP+FfuHy8X43BA==}
hasBin: true
peerDependencies:
- typescript: ^5.0.0
+ typescript: 5.5.4
'@testing-library/dom@10.4.0':
resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==}
@@ -1141,6 +1403,9 @@ packages:
'@ts-morph/common@0.23.0':
resolution: {integrity: sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA==}
+ '@types/argparse@1.0.38':
+ resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==}
+
'@types/aria-query@5.0.4':
resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
@@ -1186,8 +1451,8 @@ packages:
'@types/node@20.10.0':
resolution: {integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==}
- '@types/node@20.11.30':
- resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==}
+ '@types/node@20.12.14':
+ resolution: {integrity: sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==}
'@types/node@22.2.0':
resolution: {integrity: sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==}
@@ -1331,7 +1596,7 @@ packages:
peerDependencies:
'@typescript-eslint/utils': '>= 8.0'
eslint: '>= 8.57.0'
- typescript: '>= 5.0.0'
+ typescript: 5.5.4
vitest: '*'
peerDependenciesMeta:
'@typescript-eslint/utils':
@@ -1364,6 +1629,15 @@ packages:
'@vitest/utils@2.0.5':
resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==}
+ '@volar/language-core@2.4.0':
+ resolution: {integrity: sha512-FTla+khE+sYK0qJP+6hwPAAUwiNHVMph4RUXpxf/FIPKUP61NFrVZorml4mjFShnueR2y9/j8/vnh09YwVdH7A==}
+
+ '@volar/source-map@2.4.0':
+ resolution: {integrity: sha512-2ceY8/NEZvN6F44TXw2qRP6AQsvCYhV2bxaBPWxV9HqIfkbRydSksTFObCF1DBDNBfKiZTS8G/4vqV6cvjdOIQ==}
+
+ '@volar/typescript@2.4.0':
+ resolution: {integrity: sha512-9zx3lQWgHmVd+JRRAHUSRiEhe4TlzL7U7e6ulWXOxHH/WNYxzKwCvZD7WYWEZFdw4dHfTD9vUR0yPQO6GilCaQ==}
+
'@vue/compiler-core@3.4.37':
resolution: {integrity: sha512-ZDDT/KiLKuCRXyzWecNzC5vTcubGz4LECAtfGPENpo0nrmqJHwuWtRLxk/Sb9RAKtR9iFflFycbkjkY+W/PZUQ==}
@@ -1376,6 +1650,17 @@ packages:
'@vue/compiler-ssr@3.4.37':
resolution: {integrity: sha512-TyAgYBWrHlFrt4qpdACh8e9Ms6C/AZQ6A6xLJaWrCL8GCX5DxMzxyeFAEMfU/VFr4tylHm+a2NpfJpcd7+20XA==}
+ '@vue/compiler-vue2@2.7.16':
+ resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
+
+ '@vue/language-core@2.0.29':
+ resolution: {integrity: sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==}
+ peerDependencies:
+ typescript: 5.5.4
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
'@vue/shared@3.4.37':
resolution: {integrity: sha512-nIh8P2fc3DflG8+5Uw8PT/1i17ccFn0xxN/5oE9RfV5SVnd7G0XEFRwakrnNFE/jlS95fpGXDVG5zDETS26nmg==}
@@ -1389,9 +1674,31 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
+ ajv-draft-04@1.0.0:
+ resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==}
+ peerDependencies:
+ ajv: ^8.5.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ ajv@8.12.0:
+ resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+
+ ajv@8.13.0:
+ resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==}
+
ansi-escapes@4.3.2:
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
engines: {node: '>=8'}
@@ -1427,6 +1734,9 @@ packages:
arg@5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+ argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
@@ -1540,8 +1850,8 @@ packages:
builtin-status-codes@3.0.0:
resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==}
- bun-types@1.0.33:
- resolution: {integrity: sha512-L5tBIf9g6rBBkvshqysi5NoLQ9NnhSPU1pfJ9FzqoSfofYdyac3WLUnOIuQ+M5za/sooVUOP2ko+E6Tco0OLIA==}
+ bun-types@1.1.24:
+ resolution: {integrity: sha512-UNEcYawHWOVw9GYQdOgjJvTQduYlPckmRMqpBqfkWpUzeK2CZfEP/JOYBH6SMypyfkNg/Zsqf0olN6vMrSPg3w==}
cac@6.7.14:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
@@ -1675,6 +1985,12 @@ packages:
resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==}
engines: {node: '>= 12.0.0'}
+ compare-versions@6.1.1:
+ resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==}
+
+ computeds@0.0.1:
+ resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==}
+
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
@@ -1736,6 +2052,9 @@ packages:
csv-parse@5.5.0:
resolution: {integrity: sha512-RxruSK3M4XgzcD7Trm2wEN+SJ26ChIb903+IWxNOcB5q4jT2Cs+hFr6QP39J05EohshRFEvyzEBoZ/466S2sbw==}
+ de-indent@1.0.2:
+ resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
+
debug@3.2.7:
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
peerDependencies:
@@ -1913,6 +2232,11 @@ packages:
engines: {node: '>=12'}
hasBin: true
+ esbuild@0.21.5:
+ resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
+ engines: {node: '>=12'}
+ hasBin: true
+
esbuild@0.23.0:
resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==}
engines: {node: '>=18'}
@@ -2225,6 +2549,10 @@ packages:
resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==}
engines: {node: '>=14.14'}
+ fs-extra@7.0.1:
+ resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==}
+ engines: {node: '>=6 <7 || >=8'}
+
fsevents@2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -2365,6 +2693,10 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
+ he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+
headers-polyfill@4.0.3:
resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==}
@@ -2409,6 +2741,10 @@ packages:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
engines: {node: '>=6'}
+ import-lazy@4.0.0:
+ resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
+ engines: {node: '>=8'}
+
imurmurhash@0.1.4:
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'}
@@ -2552,6 +2888,9 @@ packages:
resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==}
engines: {node: 20 || >=22}
+ jju@1.4.0:
+ resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
+
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -2585,6 +2924,9 @@ packages:
json-schema-traverse@0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
json-stable-stringify-without-jsonify@1.0.1:
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
@@ -2592,12 +2934,18 @@ packages:
resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ jsonfile@4.0.0:
+ resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
+
jsonfile@6.1.0:
resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+ kolorist@1.8.0:
+ resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
levn@0.4.1:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'}
@@ -2732,6 +3080,9 @@ packages:
resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==}
engines: {node: 20 || >=22}
+ minimatch@3.0.8:
+ resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==}
+
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@@ -2772,11 +3123,14 @@ packages:
engines: {node: '>=18'}
hasBin: true
peerDependencies:
- typescript: '>= 4.7.x'
+ typescript: 5.5.4
peerDependenciesMeta:
typescript:
optional: true
+ muggle-string@0.4.1:
+ resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
mute-stream@1.0.0:
resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -3144,6 +3498,10 @@ packages:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
requires-port@1.0.0:
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
@@ -3174,11 +3532,22 @@ packages:
ripemd160@2.0.2:
resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
+ rollup-plugin-node-externals@7.1.3:
+ resolution: {integrity: sha512-RM+7tJAejAoRsCf93TptTSdqUhRA8S78DleihMiu54Kac+uLkd9VIegLPhGnaW3ehZTXh56+R301mFH6j2A7vw==}
+ engines: {node: '>= 21 || ^20.6.0 || ^18.19.0'}
+ peerDependencies:
+ rollup: ^3.0.0 || ^4.0.0
+
rollup@4.13.0:
resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
+ rollup@4.21.0:
+ resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
run-async@3.0.0:
resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==}
engines: {node: '>=0.12.0'}
@@ -3211,6 +3580,11 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ semver@7.5.4:
+ resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
semver@7.6.0:
resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
engines: {node: '>=10'}
@@ -3308,6 +3682,9 @@ packages:
spdx-license-ids@3.0.18:
resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==}
+ sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
stable-hash@0.0.4:
resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==}
@@ -3386,6 +3763,10 @@ packages:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
+ supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+
supports-preserve-symlinks-flag@1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
@@ -3469,7 +3850,7 @@ packages:
resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
engines: {node: '>=16'}
peerDependencies:
- typescript: '>=4.2.0'
+ typescript: 5.5.4
ts-morph@22.0.0:
resolution: {integrity: sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw==}
@@ -3521,7 +3902,7 @@ packages:
engines: {node: '>= 18'}
hasBin: true
peerDependencies:
- typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x
+ typescript: 5.5.4
typescript@5.5.4:
resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==}
@@ -3548,6 +3929,10 @@ packages:
unist-util-stringify-position@2.0.3:
resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==}
+ universalify@0.1.2:
+ resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
+ engines: {node: '>= 4.0.0'}
+
universalify@0.2.0:
resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
engines: {node: '>= 4.0.0'}
@@ -3585,6 +3970,16 @@ packages:
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
+ vite-plugin-dts@4.0.3:
+ resolution: {integrity: sha512-+xnTsaONwU2kV6zhRjtbRJSGN41uFR/whqmcb4k4fftLFDJElxthp0PP5Fq8gMeM9ytWMt1yk5gGgekLREWYQQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ typescript: 5.5.4
+ vite: '*'
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
vite-plugin-node-polyfills@0.22.0:
resolution: {integrity: sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA==}
peerDependencies:
@@ -3618,6 +4013,37 @@ packages:
terser:
optional: true
+ vite@5.4.2:
+ resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+
vitest@2.0.5:
resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -3646,12 +4072,21 @@ packages:
vm-browserify@1.1.2:
resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==}
+ vscode-uri@3.0.8:
+ resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
+
vue-eslint-parser@9.4.3:
resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==}
engines: {node: ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: '>=6.0.0'
+ vue-tsc@2.0.29:
+ resolution: {integrity: sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==}
+ hasBin: true
+ peerDependencies:
+ typescript: 5.5.4
+
wcwidth@1.0.1:
resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
@@ -3896,108 +4331,162 @@ snapshots:
'@esbuild/aix-ppc64@0.19.12':
optional: true
+ '@esbuild/aix-ppc64@0.21.5':
+ optional: true
+
'@esbuild/aix-ppc64@0.23.0':
optional: true
'@esbuild/android-arm64@0.19.12':
optional: true
+ '@esbuild/android-arm64@0.21.5':
+ optional: true
+
'@esbuild/android-arm64@0.23.0':
optional: true
'@esbuild/android-arm@0.19.12':
optional: true
+ '@esbuild/android-arm@0.21.5':
+ optional: true
+
'@esbuild/android-arm@0.23.0':
optional: true
'@esbuild/android-x64@0.19.12':
optional: true
+ '@esbuild/android-x64@0.21.5':
+ optional: true
+
'@esbuild/android-x64@0.23.0':
optional: true
'@esbuild/darwin-arm64@0.19.12':
optional: true
+ '@esbuild/darwin-arm64@0.21.5':
+ optional: true
+
'@esbuild/darwin-arm64@0.23.0':
optional: true
'@esbuild/darwin-x64@0.19.12':
optional: true
+ '@esbuild/darwin-x64@0.21.5':
+ optional: true
+
'@esbuild/darwin-x64@0.23.0':
optional: true
'@esbuild/freebsd-arm64@0.19.12':
optional: true
+ '@esbuild/freebsd-arm64@0.21.5':
+ optional: true
+
'@esbuild/freebsd-arm64@0.23.0':
optional: true
'@esbuild/freebsd-x64@0.19.12':
optional: true
+ '@esbuild/freebsd-x64@0.21.5':
+ optional: true
+
'@esbuild/freebsd-x64@0.23.0':
optional: true
'@esbuild/linux-arm64@0.19.12':
optional: true
+ '@esbuild/linux-arm64@0.21.5':
+ optional: true
+
'@esbuild/linux-arm64@0.23.0':
optional: true
'@esbuild/linux-arm@0.19.12':
optional: true
+ '@esbuild/linux-arm@0.21.5':
+ optional: true
+
'@esbuild/linux-arm@0.23.0':
optional: true
'@esbuild/linux-ia32@0.19.12':
optional: true
+ '@esbuild/linux-ia32@0.21.5':
+ optional: true
+
'@esbuild/linux-ia32@0.23.0':
optional: true
'@esbuild/linux-loong64@0.19.12':
optional: true
+ '@esbuild/linux-loong64@0.21.5':
+ optional: true
+
'@esbuild/linux-loong64@0.23.0':
optional: true
'@esbuild/linux-mips64el@0.19.12':
optional: true
+ '@esbuild/linux-mips64el@0.21.5':
+ optional: true
+
'@esbuild/linux-mips64el@0.23.0':
optional: true
'@esbuild/linux-ppc64@0.19.12':
optional: true
+ '@esbuild/linux-ppc64@0.21.5':
+ optional: true
+
'@esbuild/linux-ppc64@0.23.0':
optional: true
'@esbuild/linux-riscv64@0.19.12':
optional: true
+ '@esbuild/linux-riscv64@0.21.5':
+ optional: true
+
'@esbuild/linux-riscv64@0.23.0':
optional: true
'@esbuild/linux-s390x@0.19.12':
optional: true
+ '@esbuild/linux-s390x@0.21.5':
+ optional: true
+
'@esbuild/linux-s390x@0.23.0':
optional: true
'@esbuild/linux-x64@0.19.12':
optional: true
+ '@esbuild/linux-x64@0.21.5':
+ optional: true
+
'@esbuild/linux-x64@0.23.0':
optional: true
'@esbuild/netbsd-x64@0.19.12':
optional: true
+ '@esbuild/netbsd-x64@0.21.5':
+ optional: true
+
'@esbuild/netbsd-x64@0.23.0':
optional: true
@@ -4007,30 +4496,45 @@ snapshots:
'@esbuild/openbsd-x64@0.19.12':
optional: true
+ '@esbuild/openbsd-x64@0.21.5':
+ optional: true
+
'@esbuild/openbsd-x64@0.23.0':
optional: true
'@esbuild/sunos-x64@0.19.12':
optional: true
+ '@esbuild/sunos-x64@0.21.5':
+ optional: true
+
'@esbuild/sunos-x64@0.23.0':
optional: true
'@esbuild/win32-arm64@0.19.12':
optional: true
+ '@esbuild/win32-arm64@0.21.5':
+ optional: true
+
'@esbuild/win32-arm64@0.23.0':
optional: true
'@esbuild/win32-ia32@0.19.12':
optional: true
+ '@esbuild/win32-ia32@0.21.5':
+ optional: true
+
'@esbuild/win32-ia32@0.23.0':
optional: true
'@esbuild/win32-x64@0.19.12':
optional: true
+ '@esbuild/win32-x64@0.21.5':
+ optional: true
+
'@esbuild/win32-x64@0.23.0':
optional: true
@@ -4197,6 +4701,41 @@ snapshots:
dependencies:
call-bind: 1.0.2
+ '@microsoft/api-extractor-model@7.29.4(@types/node@20.10.0)':
+ dependencies:
+ '@microsoft/tsdoc': 0.15.0
+ '@microsoft/tsdoc-config': 0.17.0
+ '@rushstack/node-core-library': 5.5.1(@types/node@20.10.0)
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@microsoft/api-extractor@7.47.4(@types/node@20.10.0)':
+ dependencies:
+ '@microsoft/api-extractor-model': 7.29.4(@types/node@20.10.0)
+ '@microsoft/tsdoc': 0.15.0
+ '@microsoft/tsdoc-config': 0.17.0
+ '@rushstack/node-core-library': 5.5.1(@types/node@20.10.0)
+ '@rushstack/rig-package': 0.5.3
+ '@rushstack/terminal': 0.13.3(@types/node@20.10.0)
+ '@rushstack/ts-command-line': 4.22.3(@types/node@20.10.0)
+ lodash: 4.17.21
+ minimatch: 3.0.8
+ resolve: 1.22.4
+ semver: 7.5.4
+ source-map: 0.6.1
+ typescript: 5.5.4
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@microsoft/tsdoc-config@0.17.0':
+ dependencies:
+ '@microsoft/tsdoc': 0.15.0
+ ajv: 8.12.0
+ jju: 1.4.0
+ resolve: 1.22.4
+
+ '@microsoft/tsdoc@0.15.0': {}
+
'@mswjs/interceptors@0.29.1':
dependencies:
'@open-draft/deferred-promise': 2.2.0
@@ -4234,61 +4773,143 @@ snapshots:
'@polka/url@1.0.0-next.25': {}
- '@rollup/plugin-inject@5.0.5(rollup@4.13.0)':
+ '@rollup/plugin-inject@5.0.5(rollup@4.21.0)':
dependencies:
- '@rollup/pluginutils': 5.1.0(rollup@4.13.0)
+ '@rollup/pluginutils': 5.1.0(rollup@4.21.0)
estree-walker: 2.0.2
magic-string: 0.30.8
optionalDependencies:
- rollup: 4.13.0
+ rollup: 4.21.0
- '@rollup/pluginutils@5.1.0(rollup@4.13.0)':
+ '@rollup/pluginutils@5.1.0(rollup@4.21.0)':
dependencies:
'@types/estree': 1.0.5
estree-walker: 2.0.2
picomatch: 2.3.1
optionalDependencies:
- rollup: 4.13.0
+ rollup: 4.21.0
'@rollup/rollup-android-arm-eabi@4.13.0':
optional: true
+ '@rollup/rollup-android-arm-eabi@4.21.0':
+ optional: true
+
'@rollup/rollup-android-arm64@4.13.0':
optional: true
+ '@rollup/rollup-android-arm64@4.21.0':
+ optional: true
+
'@rollup/rollup-darwin-arm64@4.13.0':
optional: true
+ '@rollup/rollup-darwin-arm64@4.21.0':
+ optional: true
+
'@rollup/rollup-darwin-x64@4.13.0':
optional: true
+ '@rollup/rollup-darwin-x64@4.21.0':
+ optional: true
+
'@rollup/rollup-linux-arm-gnueabihf@4.13.0':
optional: true
+ '@rollup/rollup-linux-arm-gnueabihf@4.21.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.21.0':
+ optional: true
+
'@rollup/rollup-linux-arm64-gnu@4.13.0':
optional: true
+ '@rollup/rollup-linux-arm64-gnu@4.21.0':
+ optional: true
+
'@rollup/rollup-linux-arm64-musl@4.13.0':
optional: true
+ '@rollup/rollup-linux-arm64-musl@4.21.0':
+ optional: true
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.21.0':
+ optional: true
+
'@rollup/rollup-linux-riscv64-gnu@4.13.0':
optional: true
+ '@rollup/rollup-linux-riscv64-gnu@4.21.0':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.21.0':
+ optional: true
+
'@rollup/rollup-linux-x64-gnu@4.13.0':
optional: true
+ '@rollup/rollup-linux-x64-gnu@4.21.0':
+ optional: true
+
'@rollup/rollup-linux-x64-musl@4.13.0':
optional: true
+ '@rollup/rollup-linux-x64-musl@4.21.0':
+ optional: true
+
'@rollup/rollup-win32-arm64-msvc@4.13.0':
optional: true
+ '@rollup/rollup-win32-arm64-msvc@4.21.0':
+ optional: true
+
'@rollup/rollup-win32-ia32-msvc@4.13.0':
optional: true
+ '@rollup/rollup-win32-ia32-msvc@4.21.0':
+ optional: true
+
'@rollup/rollup-win32-x64-msvc@4.13.0':
optional: true
+ '@rollup/rollup-win32-x64-msvc@4.21.0':
+ optional: true
+
+ '@rushstack/node-core-library@5.5.1(@types/node@20.10.0)':
+ dependencies:
+ ajv: 8.13.0
+ ajv-draft-04: 1.0.0(ajv@8.13.0)
+ ajv-formats: 3.0.1(ajv@8.13.0)
+ fs-extra: 7.0.1
+ import-lazy: 4.0.0
+ jju: 1.4.0
+ resolve: 1.22.4
+ semver: 7.5.4
+ optionalDependencies:
+ '@types/node': 20.10.0
+
+ '@rushstack/rig-package@0.5.3':
+ dependencies:
+ resolve: 1.22.4
+ strip-json-comments: 3.1.1
+
+ '@rushstack/terminal@0.13.3(@types/node@20.10.0)':
+ dependencies:
+ '@rushstack/node-core-library': 5.5.1(@types/node@20.10.0)
+ supports-color: 8.1.1
+ optionalDependencies:
+ '@types/node': 20.10.0
+
+ '@rushstack/ts-command-line@4.22.3(@types/node@20.10.0)':
+ dependencies:
+ '@rushstack/terminal': 0.13.3(@types/node@20.10.0)
+ '@types/argparse': 1.0.38
+ argparse: 1.0.10
+ string-argv: 0.3.2
+ transitivePeerDependencies:
+ - '@types/node'
+
'@shikijs/core@1.12.1':
dependencies:
'@types/hast': 3.0.4
@@ -4376,6 +4997,8 @@ snapshots:
mkdirp: 3.0.1
path-browserify: 1.0.1
+ '@types/argparse@1.0.38': {}
+
'@types/aria-query@5.0.4': {}
'@types/better-sqlite3@7.6.4':
@@ -4427,7 +5050,7 @@ snapshots:
dependencies:
undici-types: 5.26.5
- '@types/node@20.11.30':
+ '@types/node@20.12.14':
dependencies:
undici-types: 5.26.5
@@ -4669,6 +5292,18 @@ snapshots:
loupe: 3.1.1
tinyrainbow: 1.2.0
+ '@volar/language-core@2.4.0':
+ dependencies:
+ '@volar/source-map': 2.4.0
+
+ '@volar/source-map@2.4.0': {}
+
+ '@volar/typescript@2.4.0':
+ dependencies:
+ '@volar/language-core': 2.4.0
+ path-browserify: 1.0.1
+ vscode-uri: 3.0.8
+
'@vue/compiler-core@3.4.37':
dependencies:
'@babel/parser': 7.25.3
@@ -4699,6 +5334,24 @@ snapshots:
'@vue/compiler-dom': 3.4.37
'@vue/shared': 3.4.37
+ '@vue/compiler-vue2@2.7.16':
+ dependencies:
+ de-indent: 1.0.2
+ he: 1.2.0
+
+ '@vue/language-core@2.0.29(typescript@5.5.4)':
+ dependencies:
+ '@volar/language-core': 2.4.0
+ '@vue/compiler-dom': 3.4.37
+ '@vue/compiler-vue2': 2.7.16
+ '@vue/shared': 3.4.37
+ computeds: 0.0.1
+ minimatch: 9.0.5
+ muggle-string: 0.4.1
+ path-browserify: 1.0.1
+ optionalDependencies:
+ typescript: 5.5.4
+
'@vue/shared@3.4.37': {}
acorn-jsx@5.3.2(acorn@8.12.1):
@@ -4707,6 +5360,14 @@ snapshots:
acorn@8.12.1: {}
+ ajv-draft-04@1.0.0(ajv@8.13.0):
+ optionalDependencies:
+ ajv: 8.13.0
+
+ ajv-formats@3.0.1(ajv@8.13.0):
+ optionalDependencies:
+ ajv: 8.13.0
+
ajv@6.12.6:
dependencies:
fast-deep-equal: 3.1.3
@@ -4714,6 +5375,20 @@ snapshots:
json-schema-traverse: 0.4.1
uri-js: 4.4.1
+ ajv@8.12.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+
+ ajv@8.13.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+
ansi-escapes@4.3.2:
dependencies:
type-fest: 0.21.3
@@ -4738,6 +5413,10 @@ snapshots:
arg@5.0.2: {}
+ argparse@1.0.10:
+ dependencies:
+ sprintf-js: 1.0.3
+
argparse@2.0.1: {}
aria-query@5.3.0:
@@ -4881,9 +5560,9 @@ snapshots:
builtin-status-codes@3.0.0: {}
- bun-types@1.0.33:
+ bun-types@1.1.24:
dependencies:
- '@types/node': 20.11.30
+ '@types/node': 20.12.14
'@types/ws': 8.5.10
cac@6.7.14: {}
@@ -5018,6 +5697,10 @@ snapshots:
comment-parser@1.4.1: {}
+ compare-versions@6.1.1: {}
+
+ computeds@0.0.1: {}
+
concat-map@0.0.1: {}
confbox@0.1.7: {}
@@ -5097,6 +5780,8 @@ snapshots:
csv-parse@5.5.0: {}
+ de-indent@1.0.2: {}
+
debug@3.2.7:
dependencies:
ms: 2.1.3
@@ -5295,6 +5980,32 @@ snapshots:
'@esbuild/win32-ia32': 0.19.12
'@esbuild/win32-x64': 0.19.12
+ esbuild@0.21.5:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.21.5
+ '@esbuild/android-arm': 0.21.5
+ '@esbuild/android-arm64': 0.21.5
+ '@esbuild/android-x64': 0.21.5
+ '@esbuild/darwin-arm64': 0.21.5
+ '@esbuild/darwin-x64': 0.21.5
+ '@esbuild/freebsd-arm64': 0.21.5
+ '@esbuild/freebsd-x64': 0.21.5
+ '@esbuild/linux-arm': 0.21.5
+ '@esbuild/linux-arm64': 0.21.5
+ '@esbuild/linux-ia32': 0.21.5
+ '@esbuild/linux-loong64': 0.21.5
+ '@esbuild/linux-mips64el': 0.21.5
+ '@esbuild/linux-ppc64': 0.21.5
+ '@esbuild/linux-riscv64': 0.21.5
+ '@esbuild/linux-s390x': 0.21.5
+ '@esbuild/linux-x64': 0.21.5
+ '@esbuild/netbsd-x64': 0.21.5
+ '@esbuild/openbsd-x64': 0.21.5
+ '@esbuild/sunos-x64': 0.21.5
+ '@esbuild/win32-arm64': 0.21.5
+ '@esbuild/win32-ia32': 0.21.5
+ '@esbuild/win32-x64': 0.21.5
+
esbuild@0.23.0:
optionalDependencies:
'@esbuild/aix-ppc64': 0.23.0
@@ -5721,6 +6432,12 @@ snapshots:
jsonfile: 6.1.0
universalify: 2.0.0
+ fs-extra@7.0.1:
+ dependencies:
+ graceful-fs: 4.2.10
+ jsonfile: 4.0.0
+ universalify: 0.1.2
+
fsevents@2.3.2:
optional: true
@@ -5873,6 +6590,8 @@ snapshots:
dependencies:
function-bind: 1.1.2
+ he@1.2.0: {}
+
headers-polyfill@4.0.3: {}
hmac-drbg@1.0.1:
@@ -5918,6 +6637,8 @@ snapshots:
parent-module: 1.0.1
resolve-from: 4.0.0
+ import-lazy@4.0.0: {}
+
imurmurhash@0.1.4: {}
indent-string@4.0.0: {}
@@ -6056,6 +6777,8 @@ snapshots:
optionalDependencies:
'@pkgjs/parseargs': 0.11.0
+ jju@1.4.0: {}
+
js-tokens@4.0.0: {}
js-yaml@4.1.0:
@@ -6076,6 +6799,8 @@ snapshots:
json-schema-traverse@0.4.1: {}
+ json-schema-traverse@1.0.0: {}
+
json-stable-stringify-without-jsonify@1.0.1: {}
jsonc-eslint-parser@2.4.0:
@@ -6085,6 +6810,10 @@ snapshots:
espree: 9.6.1
semver: 7.5.1
+ jsonfile@4.0.0:
+ optionalDependencies:
+ graceful-fs: 4.2.10
+
jsonfile@6.1.0:
dependencies:
universalify: 2.0.0
@@ -6095,6 +6824,8 @@ snapshots:
dependencies:
json-buffer: 3.0.1
+ kolorist@1.8.0: {}
+
levn@0.4.1:
dependencies:
prelude-ls: 1.2.1
@@ -6234,6 +6965,10 @@ snapshots:
dependencies:
brace-expansion: 2.0.1
+ minimatch@3.0.8:
+ dependencies:
+ brace-expansion: 1.1.11
+
minimatch@3.1.2:
dependencies:
brace-expansion: 1.1.11
@@ -6285,6 +7020,8 @@ snapshots:
optionalDependencies:
typescript: 5.5.4
+ muggle-string@0.4.1: {}
+
mute-stream@1.0.0: {}
nanoid@3.3.7: {}
@@ -6707,6 +7444,8 @@ snapshots:
require-directory@2.1.1: {}
+ require-from-string@2.0.2: {}
+
requires-port@1.0.0: {}
resolve-from@4.0.0: {}
@@ -6736,6 +7475,10 @@ snapshots:
hash-base: 3.1.0
inherits: 2.0.4
+ rollup-plugin-node-externals@7.1.3(rollup@4.21.0):
+ dependencies:
+ rollup: 4.21.0
+
rollup@4.13.0:
dependencies:
'@types/estree': 1.0.5
@@ -6755,6 +7498,28 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.13.0
fsevents: 2.3.3
+ rollup@4.21.0:
+ dependencies:
+ '@types/estree': 1.0.5
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.21.0
+ '@rollup/rollup-android-arm64': 4.21.0
+ '@rollup/rollup-darwin-arm64': 4.21.0
+ '@rollup/rollup-darwin-x64': 4.21.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.21.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.21.0
+ '@rollup/rollup-linux-arm64-gnu': 4.21.0
+ '@rollup/rollup-linux-arm64-musl': 4.21.0
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.21.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.21.0
+ '@rollup/rollup-linux-s390x-gnu': 4.21.0
+ '@rollup/rollup-linux-x64-gnu': 4.21.0
+ '@rollup/rollup-linux-x64-musl': 4.21.0
+ '@rollup/rollup-win32-arm64-msvc': 4.21.0
+ '@rollup/rollup-win32-ia32-msvc': 4.21.0
+ '@rollup/rollup-win32-x64-msvc': 4.21.0
+ fsevents: 2.3.3
+
run-async@3.0.0: {}
run-parallel@1.2.0:
@@ -6783,6 +7548,10 @@ snapshots:
dependencies:
lru-cache: 6.0.0
+ semver@7.5.4:
+ dependencies:
+ lru-cache: 6.0.0
+
semver@7.6.0:
dependencies:
lru-cache: 6.0.0
@@ -6876,6 +7645,8 @@ snapshots:
spdx-license-ids@3.0.18: {}
+ sprintf-js@1.0.3: {}
+
stable-hash@0.0.4: {}
stackback@0.0.2: {}
@@ -6955,6 +7726,10 @@ snapshots:
dependencies:
has-flag: 4.0.0
+ supports-color@8.1.1:
+ dependencies:
+ has-flag: 4.0.0
+
supports-preserve-symlinks-flag@1.0.0: {}
synckit@0.6.2:
@@ -7103,6 +7878,8 @@ snapshots:
dependencies:
'@types/unist': 2.0.10
+ universalify@0.1.2: {}
+
universalify@0.2.0: {}
universalify@2.0.0: {}
@@ -7148,22 +7925,43 @@ snapshots:
debug: 4.3.6
pathe: 1.1.2
tinyrainbow: 1.2.0
- vite: 5.1.6(@types/node@20.10.0)
+ vite: 5.4.2(@types/node@20.10.0)
transitivePeerDependencies:
- '@types/node'
- less
- lightningcss
- sass
+ - sass-embedded
- stylus
- sugarss
- supports-color
- terser
- vite-plugin-node-polyfills@0.22.0(rollup@4.13.0)(vite@5.1.6(@types/node@20.10.0)):
+ vite-plugin-dts@4.0.3(@types/node@20.10.0)(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.2(@types/node@20.10.0)):
dependencies:
- '@rollup/plugin-inject': 5.0.5(rollup@4.13.0)
+ '@microsoft/api-extractor': 7.47.4(@types/node@20.10.0)
+ '@rollup/pluginutils': 5.1.0(rollup@4.21.0)
+ '@volar/typescript': 2.4.0
+ '@vue/language-core': 2.0.29(typescript@5.5.4)
+ compare-versions: 6.1.1
+ debug: 4.3.6
+ kolorist: 1.8.0
+ local-pkg: 0.5.0
+ magic-string: 0.30.11
+ typescript: 5.5.4
+ vue-tsc: 2.0.29(typescript@5.5.4)
+ optionalDependencies:
+ vite: 5.4.2(@types/node@20.10.0)
+ transitivePeerDependencies:
+ - '@types/node'
+ - rollup
+ - supports-color
+
+ vite-plugin-node-polyfills@0.22.0(rollup@4.21.0)(vite@5.4.2(@types/node@20.10.0)):
+ dependencies:
+ '@rollup/plugin-inject': 5.0.5(rollup@4.21.0)
node-stdlib-browser: 1.2.0
- vite: 5.1.6(@types/node@20.10.0)
+ vite: 5.4.2(@types/node@20.10.0)
transitivePeerDependencies:
- rollup
@@ -7176,6 +7974,15 @@ snapshots:
'@types/node': 20.10.0
fsevents: 2.3.3
+ vite@5.4.2(@types/node@20.10.0):
+ dependencies:
+ esbuild: 0.21.5
+ postcss: 8.4.41
+ rollup: 4.21.0
+ optionalDependencies:
+ '@types/node': 20.10.0
+ fsevents: 2.3.3
+
vitest@2.0.5(@types/node@20.10.0)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5):
dependencies:
'@ampproject/remapping': 2.3.0
@@ -7205,6 +8012,7 @@ snapshots:
- less
- lightningcss
- sass
+ - sass-embedded
- stylus
- sugarss
- supports-color
@@ -7212,6 +8020,8 @@ snapshots:
vm-browserify@1.1.2: {}
+ vscode-uri@3.0.8: {}
+
vue-eslint-parser@9.4.3(eslint@9.9.0):
dependencies:
debug: 4.3.6
@@ -7225,6 +8035,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ vue-tsc@2.0.29(typescript@5.5.4):
+ dependencies:
+ '@volar/typescript': 2.4.0
+ '@vue/language-core': 2.0.29(typescript@5.5.4)
+ semver: 7.6.3
+ typescript: 5.5.4
+
wcwidth@1.0.1:
dependencies:
defaults: 1.0.4
diff --git a/scripts/build-package-jsr.js b/scripts/build-package-jsr.js
new file mode 100644
index 00000000..17339dd9
--- /dev/null
+++ b/scripts/build-package-jsr.js
@@ -0,0 +1,220 @@
+import { fileURLToPath } from 'node:url'
+import * as fs from 'node:fs'
+import * as cp from 'node:child_process'
+import { resolve } from 'node:path'
+
+import * as glob from 'glob'
+import ts from 'typescript'
+
+import { processPackageJson } from '../.config/vite-utils/package-json.js'
+
+export function packageJsonToDeno({ packageJson, packageJsonOrig }) {
+ // https://jsr.io/docs/package-configuration
+
+ const importMap = {}
+ const exports = {}
+
+ if (packageJson.dependencies) {
+ for (const [name, version] of Object.entries(packageJson.dependencies)) {
+ if (name.startsWith('@mtcute/')) {
+ importMap[name] = `jsr:${name}@${version}`
+ } else if (version.startsWith('npm:@jsr/')) {
+ const jsrName = version.slice(9).split('@')[0].replace('__', '/')
+ const jsrVersion = version.slice(9).split('@')[1]
+ importMap[name] = `jsr:@${jsrName}@${jsrVersion}`
+ } else {
+ importMap[name] = `npm:${name}@${version}`
+ }
+ }
+ }
+
+ if (packageJsonOrig.exports) {
+ let tmpExports
+ if (typeof packageJsonOrig.exports === 'string') {
+ tmpExports = { '.': packageJsonOrig.exports }
+ } else if (typeof packageJsonOrig.exports !== 'object') {
+ throw new TypeError('package.json exports must be an object')
+ } else {
+ tmpExports = packageJsonOrig.exports
+ }
+
+ for (const [name, value] of Object.entries(tmpExports)) {
+ if (typeof value !== 'string') {
+ throw new TypeError(`package.json exports value must be a string: ${name}`)
+ }
+ if (value.endsWith('.wasm')) continue
+
+ exports[name] = value
+ .replace(/^\.\/src\//, './')
+ .replace(/\.js$/, '.ts')
+ }
+ }
+
+ return {
+ name: packageJson.name,
+ version: packageJson.version,
+ exports,
+ exclude: ['**/*.test.ts', '**/*.test-utils.ts', '**/__fixtures__/**'],
+ imports: importMap,
+ publish: {
+ exclude: ['!../dist'], // lol
+ },
+ ...packageJson.denoJson,
+ }
+}
+
+export async function runJsrBuildSync(packageName) {
+ const packageDir = fileURLToPath(new URL(`../packages/${packageName}`, import.meta.url))
+ const outDir = fileURLToPath(new URL(`../packages/${packageName}/dist/jsr`, import.meta.url))
+ fs.rmSync(outDir, { recursive: true, force: true })
+ fs.mkdirSync(outDir, { recursive: true })
+
+ console.log('[i] Copying sources...')
+ fs.cpSync(resolve(packageDir, 'src'), outDir, { recursive: true })
+
+ const printer = ts.createPrinter()
+
+ for (const f of glob.sync(resolve(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'],
+ WorkerGlobalScope:
+ '{ '
+ + ' new (): typeof WorkerGlobalScope, '
+ + ' postMessage: (message: any, transfer?: Transferable[]) => void, '
+ + ' addEventListener: (type: "message", listener: (ev: MessageEvent) => void) => void, '
+ + ' }',
+ process: '{ ' + 'hrtime: { bigint: () => bigint }, ' + '}',
+ }
+
+ for (const [name, decl_] of Object.entries(nodeSpecificApis)) {
+ if (fileContent.includes(name)) {
+ if (name === 'Buffer' && fileContent.includes('node:buffer')) continue
+
+ 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)
+ }
+ }
+
+ const { packageJson, packageJsonOrig } = processPackageJson(packageDir)
+ const denoJson = packageJsonToDeno({ packageJson, packageJsonOrig })
+
+ fs.writeFileSync(resolve(outDir, 'deno.json'), JSON.stringify(denoJson, null, 2))
+ fs.cpSync(new URL('../LICENSE', import.meta.url), resolve(outDir, 'LICENSE'), { recursive: true })
+
+ if (process.env.E2E) {
+ // populate dependencies, if any
+ const depsToPopulate = []
+
+ for (const dep of Object.values(denoJson.imports)) {
+ if (!dep.startsWith('jsr:')) continue
+ if (dep.startsWith('jsr:@mtcute/')) continue
+ depsToPopulate.push(dep.slice(4))
+ }
+
+ if (depsToPopulate.length) {
+ console.log('[i] Populating %d dependencies...', depsToPopulate.length)
+ cp.spawnSync(
+ 'pnpm',
+ [
+ 'exec',
+ 'slow-types-compiler',
+ 'populate',
+ '--downstream',
+ process.env.JSR_URL,
+ '--token',
+ process.env.JSR_TOKEN,
+ '--unstable-create-via-api',
+ ...depsToPopulate,
+ ],
+ {
+ stdio: 'inherit',
+ },
+ )
+ }
+ }
+
+ let customConfig
+ try {
+ customConfig = await (await import(resolve(packageDir, 'build.config.js'))).default()
+ } catch {}
+
+ if (customConfig) {
+ await customConfig.finalJsr?.({ packageDir, outDir })
+ }
+
+ console.log('[i] Trying to publish with --dry-run')
+ cp.execSync('deno publish --dry-run --allow-dirty --quiet', { cwd: outDir, stdio: 'inherit' })
+ console.log('[v] All good!')
+}
+
+if (process.argv[1] === fileURLToPath(import.meta.url)) {
+ const PACKAGE_NAME = process.argv[2]
+
+ if (!PACKAGE_NAME) {
+ throw new Error('package name not specified')
+ }
+
+ await runJsrBuildSync(PACKAGE_NAME)
+}
diff --git a/scripts/build-package-vite.js b/scripts/build-package-vite.js
new file mode 100644
index 00000000..21af1c7d
--- /dev/null
+++ b/scripts/build-package-vite.js
@@ -0,0 +1,22 @@
+/* eslint-disable node/prefer-global/process */
+import * as cp from 'node:child_process'
+import { fileURLToPath } from 'node:url'
+
+const configPath = fileURLToPath(new URL('../.config/vite.build.ts', import.meta.url))
+
+export function runViteBuildSync(packageName) {
+ cp.execSync(`pnpm exec vite build --config "${configPath}"`, {
+ stdio: 'inherit',
+ cwd: fileURLToPath(new URL(`../packages/${packageName}`, import.meta.url)),
+ })
+}
+
+if (process.argv[1] === fileURLToPath(import.meta.url)) {
+ const PACKAGE_NAME = process.argv[2]
+
+ if (!PACKAGE_NAME) {
+ throw new Error('package name not specified')
+ }
+
+ runViteBuildSync(PACKAGE_NAME)
+}
diff --git a/scripts/build-package.js b/scripts/build-package.js
index 15a8e80c..9dfc1b97 100644
--- a/scripts/build-package.js
+++ b/scripts/build-package.js
@@ -1,15 +1,11 @@
-import * as cp from 'node:child_process'
import * as fs from 'node:fs'
-import { createRequire } from 'node:module'
-import * as path from 'node:path'
+import { fileURLToPath } from 'node:url'
+import { resolve } from 'node:path'
-import * as glob from 'glob'
-import ts from 'typescript'
-import * as stc from '@teidesu/slow-types-compiler'
+import { processPackageJson } from '../.config/vite-utils/package-json.js'
-const __dirname = path.dirname(new URL(import.meta.url).pathname)
-
-const rootPackageJson = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'), 'utf-8'))
+import { packageJsonToDeno, runJsrBuildSync } from './build-package-jsr.js'
+import { runViteBuildSync } from './build-package-vite.js'
if (process.argv.length < 3) {
console.log('Usage: build-package.js ')
@@ -18,14 +14,7 @@ if (process.argv.length < 3) {
const IS_JSR = process.env.JSR === '1'
-const packagesDir = path.join(__dirname, '../packages')
-const packageDir = path.join(packagesDir, process.argv[2])
-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 })
-}
+const packageName = process.argv[2]
function transformFile(file, transform) {
const content = fs.readFileSync(file, 'utf8')
@@ -33,602 +22,96 @@ function transformFile(file, transform) {
if (res != null) fs.writeFileSync(file, res)
}
-// todo make them esm
-const require = createRequire(import.meta.url)
+if (packageName === 'tl') {
+ // create package by copying all the needed files
+ const packageDir = fileURLToPath(new URL('../packages/tl', import.meta.url))
+ let outDir = fileURLToPath(new URL('../packages/tl/dist', import.meta.url))
+ if (IS_JSR) outDir = resolve(outDir, 'jsr')
-const buildConfig = {
- buildTs: true,
- buildCjs: true,
- removeReferenceComments: true,
- esmOnlyDirectives: false,
- esmImportDirectives: false,
- before: () => {},
- final: () => {},
- ...(() => {
- let config
+ fs.rmSync(outDir, { recursive: true, force: true })
- try {
- config = require(path.join(packageDir, 'build.config.cjs'))
- } catch (e) {
- if (e.code !== 'MODULE_NOT_FOUND') throw e
+ const files = [
+ 'binary/reader.d.ts',
+ 'binary/reader.js',
+ 'binary/rsa-keys.d.ts',
+ 'binary/rsa-keys.js',
+ 'binary/writer.d.ts',
+ 'binary/writer.js',
+ 'index.d.ts',
+ 'index.js',
+ 'raw-errors.json',
+ 'mtp-schema.json',
+ 'api-schema.json',
+ 'app-config.json',
+ 'README.md',
+ ]
- return {}
- }
+ fs.mkdirSync(resolve(outDir, 'binary'), { recursive: true })
- console.log('[i] Using custom build config')
-
- if (typeof config === 'function') {
- config = config({
- fs,
- path,
- glob,
- exec,
- transformFile,
- packageDir,
- outDir,
- jsr: IS_JSR,
- })
- }
-
- return config
- })(),
-}
-
-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'))
-
- if (buildConfig.buildCjs) {
- pkgJson.main = 'cjs/index.js'
- pkgJson.module = 'esm/index.js'
+ for (const f of files) {
+ fs.copyFileSync(resolve(packageDir, f), resolve(outDir, f))
}
- // copy common fields from root
- for (const field of ['license', 'author', 'contributors', 'homepage', 'repository', 'bugs']) {
- if (rootPackageJson[field]) {
- pkgJson[field] = rootPackageJson[field]
- }
- }
-
- const newScripts = {}
-
- if (pkgJson.keepScripts) {
- for (const script of pkgJson.keepScripts) {
- newScripts[script] = pkgJson.scripts[script]
- }
- delete pkgJson.keepScripts
- }
- pkgJson.scripts = newScripts
- delete pkgJson.devDependencies
- delete pkgJson.private
-
- if (pkgJson.distOnlyFields) {
- Object.assign(pkgJson, pkgJson.distOnlyFields)
- delete pkgJson.distOnlyFields
- }
-
- if (pkgJson.jsrOnlyFields) {
- if (IS_JSR) {
- Object.assign(pkgJson, pkgJson.jsrOnlyFields)
- }
- delete pkgJson.jsrOnlyFields
- }
-
- function replaceWorkspaceDependencies(field) {
- if (!pkgJson[field]) return
-
- const dependencies = pkgJson[field]
-
- for (const name of Object.keys(dependencies)) {
- const value = dependencies[name]
-
- if (value.startsWith('workspace:')) {
- if (value !== 'workspace:^' && value !== 'workspace:*') {
- throw new Error(
- `Cannot replace workspace dependency ${name} with ${value} - only workspace:^ and * are supported`,
- )
- }
- if (!name.startsWith('@mtcute/')) {
- throw new Error(`Cannot replace workspace dependency ${name} - only @mtcute/* is supported`)
- }
-
- // note: pnpm replaces workspace:* with the current version, unlike this script
- const depVersion = value === 'workspace:*' ? '*' : `^${getPackageVersion(name.slice(8))}`
- dependencies[name] = depVersion
- }
- }
- }
-
- replaceWorkspaceDependencies('dependencies')
- replaceWorkspaceDependencies('devDependencies')
- replaceWorkspaceDependencies('peerDependencies')
- replaceWorkspaceDependencies('optionalDependencies')
-
- delete pkgJson.typedoc
-
- if (pkgJson.browser) {
- function maybeFixPath(p, repl) {
- if (!p) return p
-
- if (p.startsWith('./src/')) {
- return repl + p.slice(6)
- }
-
- if (p.startsWith('./')) {
- return repl + p.slice(2)
- }
-
- return p
- }
-
- for (const key of Object.keys(pkgJson.browser)) {
- if (!key.startsWith('./src/')) continue
-
- const path = key.slice(6)
- pkgJson.browser[`./esm/${path}`] = maybeFixPath(pkgJson.browser[key], './esm/')
-
- if (buildConfig.buildCjs) {
- pkgJson.browser[`./cjs/${path}`] = maybeFixPath(pkgJson.browser[key], './cjs/')
- }
-
- delete pkgJson.browser[key]
- }
- }
-
- // 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 TypeError('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.rmSync(path.join(packageDir, 'tsconfig.tsbuildinfo'), { 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 && !IS_JSR) {
- console.log('[i] Building typescript...')
-
- const tsconfigPath = path.join(packageDir, 'tsconfig.json')
- fs.cpSync(tsconfigPath, path.join(packageDir, 'tsconfig.backup.json'))
-
- 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'))
- }
-
- try {
- exec('pnpm exec tsc --build', { cwd: packageDir, stdio: 'inherit' })
- } catch (e) {
- restoreTsconfig()
- throw e
- }
-
- if (buildConfig.buildCjs) {
- console.log('[i] Building typescript (CJS)...')
- const originalFiles = {}
-
- for (const f of glob.sync(path.join(packagesDir, '**/*.ts'))) {
- const content = fs.readFileSync(f, 'utf8')
- if (!content.includes('@only-if-esm')) continue
- originalFiles[f] = content
-
- fs.writeFileSync(f, content.replace(/@only-if-esm.*?@\/only-if-esm/gs, ''))
- }
- for (const f of glob.sync(path.join(packagesDir, '**/*.ts'))) {
- const content = fs.readFileSync(f, 'utf8')
- if (!content.includes('@esm-replace-import')) continue
- originalFiles[f] = content
-
- fs.writeFileSync(f, content.replace(/(?<=@esm-replace-import.*?)await import/gs, 'require'))
- }
-
- // set type=commonjs in all package.json-s
- for (const pkg of fs.readdirSync(packagesDir)) {
- const pkgJson = path.join(packagesDir, pkg, 'package.json')
- if (!fs.existsSync(pkgJson)) continue
-
- const orig = fs.readFileSync(pkgJson, 'utf8')
- originalFiles[pkgJson] = orig
-
- 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')
-
- if (fs.existsSync(distPkgJson)) {
- const orig = fs.readFileSync(distPkgJson, 'utf8')
- originalFiles[distPkgJson] = orig
-
- fs.writeFileSync(
- distPkgJson,
- JSON.stringify(
- {
- ...JSON.parse(orig),
- type: 'commonjs',
- },
- null,
- 2,
- ),
- )
- }
- }
-
- let error = false
-
- try {
- exec('pnpm exec tsc --outDir dist/cjs', {
- cwd: packageDir,
- stdio: 'inherit',
- })
- } catch (e) {
- error = e
- }
-
- for (const f of Object.keys(originalFiles)) {
- fs.writeFileSync(f, originalFiles[f])
- }
-
- if (error) {
- restoreTsconfig()
- throw error
- }
- }
-
- restoreTsconfig()
-
- // todo: can we remove these?
- console.log('[i] Post-processing...')
-
- if (buildConfig.removeReferenceComments) {
- for (const f of glob.sync(path.join(outDir, '**/*.d.ts'))) {
- let content = fs.readFileSync(f, 'utf8')
- let changed = false
-
- if (content.includes('/// \n?/g, '')
- }
-
- 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'],
- WorkerGlobalScope:
- '{ '
- + ' new (): typeof WorkerGlobalScope, '
- + ' postMessage: (message: any, transfer?: Transferable[]) => void, '
- + ' addEventListener: (type: "message", listener: (ev: MessageEvent) => void) => void, '
- + ' }',
- process: '{ ' + 'hrtime: { bigint: () => bigint }, ' + '}',
- }
-
- for (const [name, decl_] of Object.entries(nodeSpecificApis)) {
- if (fileContent.includes(name)) {
- if (name === 'Buffer' && fileContent.includes('node:buffer')) continue
-
- 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))
-
- const CJS_DEPRECATION_WARNING = `
-"use strict";
-if (typeof globalThis !== 'undefined' && !globalThis._MTCUTE_CJS_DEPRECATION_WARNED) {
- globalThis._MTCUTE_CJS_DEPRECATION_WARNED = true
- console.warn("[${builtPkgJson.name}] CommonJS support is deprecated and will be removed soon. Please consider switching to ESM, it's "+(new Date()).getFullYear()+" already.")
- console.warn("[${builtPkgJson.name}] Learn more about switching to ESM: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c")
-}
-`.trim()
- const entrypoints = []
-
- if (typeof builtPkgJson.exports === 'string') {
- entrypoints.push(builtPkgJson.exports)
- } else if (builtPkgJson.exports && typeof builtPkgJson.exports === 'object') {
- for (const entrypoint of Object.values(builtPkgJson.exports)) {
- entrypoints.push(entrypoint.require)
- }
- }
-
- for (const entry of entrypoints) {
- if (!entry.endsWith('.js')) continue
- transformFile(path.join(outDir, entry), content => `${CJS_DEPRECATION_WARNING}\n${content}`)
- }
-}
-
-// validate exports
-if (typeof builtPkgJson.exports === 'object') {
- for (const [name, target] of Object.entries(builtPkgJson.exports)) {
- if (name.includes('*')) {
- throw new Error(`Wildcards are not supported: ${name} -> ${target}`)
- }
- }
-}
-
-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 if (version.startsWith('npm:@jsr/')) {
- const jsrName = version.slice(9).split('@')[0].replace('__', '/')
- const jsrVersion = version.slice(9).split('@')[1]
- importMap[name] = `jsr:@${jsrName}@${jsrVersion}`
+ fs.cpSync(new URL('../LICENSE', import.meta.url), resolve(outDir, 'LICENSE'), { recursive: true })
+ const { packageJson, packageJsonOrig } = processPackageJson(packageDir)
+
+ if (IS_JSR) {
+ // jsr doesn't support cjs, so we'll need to add some shims
+ // todo: remove this god awfulness when tl esm rewrite
+ transformFile(resolve(outDir, 'index.js'), (content) => {
+ return [
+ '/// ',
+ 'const exports = {};',
+ content,
+ 'export const tl = exports.tl;',
+ 'export const mtp = exports.mtp;',
+ ].join('\n')
+ })
+ transformFile(resolve(outDir, 'binary/reader.js'), (content) => {
+ return [
+ '/// ',
+ 'const exports = {};',
+ content,
+ 'export const __tlReaderMap = exports.__tlReaderMap;',
+ ].join('\n')
+ })
+ transformFile(resolve(outDir, 'binary/writer.js'), (content) => {
+ return [
+ '/// ',
+ 'const exports = {};',
+ content,
+ 'export const __tlWriterMap = exports.__tlWriterMap;',
+ ].join('\n')
+ })
+ transformFile(resolve(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
+ const denoJson = packageJsonToDeno({ packageJson, packageJsonOrig })
+ denoJson.exports = {}
+
+ for (const f of files) {
+ if (!f.match(/\.js(?:on)?$/)) continue
+ if (f === 'index.js') {
+ denoJson.exports['.'] = './index.js'
} else {
- importMap[name] = `npm:${name}@${version}`
+ denoJson.exports[`./${f}`] = `./${f}`
}
}
- }
-
- 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,
- ),
- )
-
- if (process.env.E2E) {
- // populate dependencies, if any
- const depsToPopulate = []
-
- for (const dep of Object.values(importMap)) {
- if (!dep.startsWith('jsr:')) continue
- if (dep.startsWith('jsr:@mtcute/')) continue
- depsToPopulate.push(dep.slice(4))
- }
-
- if (depsToPopulate.length) {
- console.log('[i] Populating %d dependencies...', depsToPopulate.length)
- cp.spawnSync(
- 'pnpm',
- [
- 'exec',
- 'slow-types-compiler',
- 'populate',
- '--downstream',
- process.env.JSR_URL,
- '--token',
- process.env.JSR_TOKEN,
- '--unstable-create-via-api',
- ...depsToPopulate,
- ],
- {
- stdio: 'inherit',
- },
- )
- }
- }
-
- 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()
+ fs.writeFileSync(resolve(outDir, 'deno.json'), JSON.stringify(denoJson, null, 2))
+ } else {
+ fs.writeFileSync(resolve(outDir, 'package.json'), JSON.stringify(packageJson, null, 2))
}
} else {
- // make shims for esnext resolution (that doesn't respect package.json `exports` field)
- function makeShim(name, target) {
- if (name === '.') name = './index.js'
- if (!name.endsWith('.js')) return
- if (fs.existsSync(path.join(outDir, name))) return
- if (name === target) throw new Error(`cannot make shim to itself: ${name}`)
-
- fs.writeFileSync(path.join(outDir, name), `export * from '${target}'\n`)
- fs.writeFileSync(path.join(outDir, name.replace(/\.js$/, '.d.ts')), `export * from '${target}'\n`)
- }
-
- if (typeof builtPkgJson.exports === 'string') {
- makeShim('.', builtPkgJson.exports)
- } else if (typeof builtPkgJson.exports === 'object') {
- for (const [name, target] of Object.entries(builtPkgJson.exports)) {
- let esmTarget
-
- if (typeof target === 'object') {
- if (!target.import) throw new Error(`Invalid export target: ${name} -> ${JSON.stringify(target)}`)
- esmTarget = target.import
- } else if (typeof target === 'string') {
- if (buildConfig.buildCjs) throw new Error(`Invalid export target (with cjs): ${name} -> ${target}`)
- esmTarget = target
- }
-
- makeShim(name, esmTarget)
- }
+ if (IS_JSR) {
+ await runJsrBuildSync(packageName)
+ } else {
+ runViteBuildSync(packageName)
}
}
-
-try {
- fs.cpSync(path.join(packageDir, 'README.md'), path.join(outDir, 'README.md'))
-} catch (e) {
- console.log(`[!] Failed to copy README.md: ${e.message}`)
-}
-
-fs.cpSync(path.join(__dirname, '../LICENSE'), path.join(outDir, 'LICENSE'))
-
-if (!IS_JSR) {
- fs.writeFileSync(path.join(outDir, '.npmignore'), '*.tsbuildinfo\n')
-}
-
-await buildConfig.final()
-
-if (IS_JSR && !process.env.CI) {
- 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/bump-version.js b/scripts/bump-version.js
index d0cd3344..987e1ac2 100644
--- a/scripts/bump-version.js
+++ b/scripts/bump-version.js
@@ -44,13 +44,13 @@ function bumpVersions(packages, kind) {
pkgJson.version = nextVersion
writeFileSync(
join(__dirname, '../packages', pkg, 'package.json'),
- `${JSON.stringify(pkgJson, null, 4)}\n`,
+ `${JSON.stringify(pkgJson, null, 2)}\n`,
)
}
const rootPkgJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8'))
rootPkgJson.version = nextVersion
- writeFileSync(join(__dirname, '../package.json'), `${JSON.stringify(rootPkgJson, null, 4)}\n`)
+ writeFileSync(join(__dirname, '../package.json'), `${JSON.stringify(rootPkgJson, null, 2)}\n`)
return nextVersion
}
diff --git a/scripts/publish.js b/scripts/publish.js
index 542fce8a..b551be96 100644
--- a/scripts/publish.js
+++ b/scripts/publish.js
@@ -47,8 +47,10 @@ function fetchRetry(url, init, retry = 0) {
// for whatever reason this request sometimes fails with ECONNRESET
// no idea why, probably some issue in docker networking
- console.log('[i] Error fetching %s:', url)
- console.log(err)
+ if (err.cause?.code !== 'UND_ERR_SOCKET') {
+ console.log('[i] Error fetching %s:', url)
+ console.log(err)
+ }
return new Promise(resolve => setTimeout(resolve, 1000)).then(() => fetchRetry(url, init, retry + 1))
})
@@ -68,8 +70,7 @@ async function publishSinglePackage(name) {
console.log('[i] Building %s', name)
// run build script
- cp.execSync('pnpm run build', {
- cwd: packageDir,
+ cp.execSync(`pnpm run build-package ${name}`, {
stdio: 'inherit',
})
diff --git a/tsconfig.json b/tsconfig.json
index 53f58936..d30d7318 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,7 +1,5 @@
{
"compilerOptions": {
- "incremental": true,
- "composite": true,
"target": "es2022",
"lib": [
"es2020",
@@ -10,10 +8,11 @@
"WebWorker"
],
"useDefineForClassFields": true,
- "module": "NodeNext",
- "moduleResolution": "NodeNext",
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
"resolveJsonModule": true,
"types": [
+ "bun-types",
"node",
"deno/ns",
"vite/client"
@@ -23,7 +22,7 @@
"noImplicitThis": true,
"declaration": true,
"inlineSources": true,
- "outDir": "./dist",
+ "noEmit": true,
"sourceMap": true,
"stripInternal": false,
"allowSyntheticDefaultImports": true,
@@ -33,7 +32,9 @@
"skipLibCheck": true
},
"exclude": [
+ "e2e/",
"**/node_modules",
+ "**/private",
"**/__snapshots__"
]
}