diff --git a/.config/eslint.ci.js b/.config/eslint.ci.cjs similarity index 100% rename from .config/eslint.ci.js rename to .config/eslint.ci.cjs diff --git a/.config/eslint.cjs b/.config/eslint.cjs index 03b4c66b..ea738b9f 100644 --- a/.config/eslint.cjs +++ b/.config/eslint.cjs @@ -167,6 +167,7 @@ module.exports = { 'import/no-relative-packages': 'error', 'import/no-mutable-exports': 'error', 'import/no-default-export': 'error', + 'import/no-unresolved': 'off', 'no-console': ['error', { allow: ['warn', 'error'] }], }, ignorePatterns: [ @@ -281,17 +282,10 @@ module.exports = { { files: ['packages/bun/**', 'packages/deno/**'], rules: { - 'import/no-unresolved': 'off', 'no-restricted-imports': 'off', 'import/no-relative-packages': 'off', // common-internals is symlinked from node } }, - { - files: ['e2e/deno/**'], - rules: { - 'import/no-unresolved': 'off', - } - }, ], settings: { 'import/resolver': { diff --git a/.config/vite-utils/test-setup-plugin.ts b/.config/vite-utils/test-setup-plugin.ts index 4e638511..b3c94452 100644 --- a/.config/vite-utils/test-setup-plugin.ts +++ b/.config/vite-utils/test-setup-plugin.ts @@ -1,7 +1,7 @@ import { Plugin } from 'vite' import { fileURLToPath } from 'url' -const setupFile = fileURLToPath(new URL('./test-setup.mts', import.meta.url)) +const setupFile = fileURLToPath(new URL('./test-setup.ts', import.meta.url)) export function testSetup(params?: { additionalCode?: string }): Plugin { const { additionalCode = '' } = params || {} diff --git a/.config/vite-utils/test-setup.mts b/.config/vite-utils/test-setup.ts similarity index 100% rename from .config/vite-utils/test-setup.mts rename to .config/vite-utils/test-setup.ts diff --git a/.config/vite.browser.mts b/.config/vite.browser.ts similarity index 97% rename from .config/vite.browser.mts rename to .config/vite.browser.ts index dfda1eea..b06c7b57 100644 --- a/.config/vite.browser.mts +++ b/.config/vite.browser.ts @@ -2,7 +2,7 @@ import { mergeConfig } from 'vite' import { nodePolyfills } from 'vite-plugin-node-polyfills' -import baseConfig from './vite.mjs' +import baseConfig from './vite.js' import { fixupCjs } from './vite-utils/fixup-cjs' export default mergeConfig(baseConfig, { diff --git a/.config/vite.bun.mts b/.config/vite.bun.ts similarity index 100% rename from .config/vite.bun.mts rename to .config/vite.bun.ts diff --git a/.config/vite.deno.mts b/.config/vite.deno.ts similarity index 100% rename from .config/vite.deno.mts rename to .config/vite.deno.ts diff --git a/.config/vite.mts b/.config/vite.ts similarity index 94% rename from .config/vite.mts rename to .config/vite.ts index 5bc69261..355a2d0c 100644 --- a/.config/vite.mts +++ b/.config/vite.ts @@ -20,7 +20,7 @@ export default defineConfig({ ] }, setupFiles: [ - './.config/vite-utils/test-setup.mts' + './.config/vite-utils/test-setup.ts' ] }, define: { diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 1ae23c58..5a328454 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -52,7 +52,7 @@ jobs: with: bun-version: '1.1.4' - name: 'Build tests' - run: pnpm exec vite build -c .config/vite.bun.mts + run: pnpm exec vite build -c .config/vite.bun.ts - name: 'Run tests' run: cd dist/tests && bun test @@ -65,7 +65,7 @@ jobs: with: deno-version: '1.43.1' - name: 'Build tests' - run: pnpm exec vite build -c .config/vite.deno.mts + run: pnpm exec vite build -c .config/vite.deno.ts - name: 'Run tests' run: cd dist/tests && deno test -A --unstable-ffi diff --git a/e2e/deno/init-server.js b/e2e/deno/init-server.js index 429a2e9e..40ce6f58 100644 --- a/e2e/deno/init-server.js +++ b/e2e/deno/init-server.js @@ -1,5 +1,5 @@ /* eslint-disable no-console */ -const { execSync } = require('child_process') +import { execSync } from 'child_process' function getDockerContainerIp(name) { const containerId = execSync(`docker compose ps -q ${name}`).toString().trim() @@ -41,27 +41,25 @@ async function createBucket(name) { } } -(async () => { - for (const bucket of ['modules', 'docs', 'publishing', 'npm']) { - const ok = await createBucket(bucket) - console.log(`[i] Created bucket ${bucket}: ${ok}`) - } +for (const bucket of ['modules', 'docs', 'publishing', 'npm']) { + const ok = await createBucket(bucket) + console.log(`[i] Created bucket ${bucket}: ${ok}`) +} - // create @mtcute scope if it doesn't exist - const resp = await fetch(`${API_URL}api/scopes`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Cookie: 'token=token', - }, - body: JSON.stringify({ scope: 'mtcute' }), - }) +// create @mtcute scope if it doesn't exist +const resp = await fetch(`${API_URL}api/scopes`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Cookie: 'token=token', + }, + body: JSON.stringify({ scope: 'mtcute' }), +}) - if (resp.status !== 200 && resp.status !== 409) { - throw new Error(`Failed to create scope: ${resp.statusText} ${await resp.text()}`) - } +if (resp.status !== 200 && resp.status !== 409) { + throw new Error(`Failed to create scope: ${resp.statusText} ${await resp.text()}`) +} - if (resp.status === 200) { - console.log('[i] Created scope mtcute') - } -})() +if (resp.status === 200) { + console.log('[i] Created scope mtcute') +} diff --git a/package.json b/package.json index 6c53bcab..3d57ca76 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "description": "Type-safe library for MTProto (Telegram API) for browser and NodeJS", "license": "MIT", "author": "alina sireneva ", + "type": "module", "keywords": [ "telegram", "telegram-api", @@ -24,16 +25,16 @@ "packages/*" ], "scripts": { - "postinstall": "node scripts/validate-deps-versions.mjs && node scripts/remove-jsr-sourcefiles.mjs", - "test": "pnpm run -r test && vitest --config .config/vite.mts run", - "test:dev": "vitest --config .config/vite.mts watch", - "test:ui": "vitest --config .config/vite.mts --ui", - "test:coverage": "vitest --config .config/vite.mts run --coverage", - "test:ci": "vitest --config .config/vite.mts run --coverage.enabled --coverage.reporter=json", - "test:browser": "vitest --config .config/vite.browser.mts run", - "test:browser:dev": "vitest --config .config/vite.browser.mts watch", + "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": "NODE_OPTIONS=\\\"--max_old_space_size=8192\\\" eslint --config .config/eslint.ci.js .", + "lint:ci": "NODE_OPTIONS=\\\"--max_old_space_size=8192\\\" eslint --config .config/eslint.ci.cjs .", "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/*", diff --git a/packages/crypto-node/build.config.cjs b/packages/crypto-node/build.config.cjs index fa1e79df..dc8b949e 100644 --- a/packages/crypto-node/build.config.cjs +++ b/packages/crypto-node/build.config.cjs @@ -4,7 +4,7 @@ const fs = require('fs') const cp = require('child_process') const { Readable } = require('stream') -const git = require('../../scripts/git-utils') +let git const GITHUB_TOKEN = process.env.GITHUB_TOKEN let SKIP_PREBUILT = process.env.BUILD_FOR_DOCS === '1' @@ -151,6 +151,8 @@ 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') if (!SKIP_PREBUILT) { diff --git a/scripts/build-package.js b/scripts/build-package.js index 72b7487f..b31b2698 100644 --- a/scripts/build-package.js +++ b/scripts/build-package.js @@ -1,12 +1,15 @@ /* eslint-disable no-inner-declarations */ -const cp = require('child_process') -const path = require('path') -const fs = require('fs') -const glob = require('glob') -const ts = require('typescript') -const stc = require('@teidesu/slow-types-compiler') -// @ts-ignore -const rootPackageJson = require('../package.json') +import * as cp from 'child_process' +import * as fs from 'fs' +import * as glob from 'glob' +import { createRequire } from 'module' +import * as path from 'path' +import ts from 'typescript' + +import * as stc from '@teidesu/slow-types-compiler' +const __dirname = path.dirname(new URL(import.meta.url).pathname) + +const rootPackageJson = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'), 'utf-8')) if (process.argv.length < 3) { console.log('Usage: build-package.js ') @@ -30,6 +33,9 @@ function transformFile(file, transform) { if (res != null) fs.writeFileSync(file, res) } +// todo make them esm +const require = createRequire(import.meta.url) + const buildConfig = { buildTs: true, buildCjs: true, @@ -617,12 +623,12 @@ if (!IS_JSR) { fs.writeFileSync(path.join(outDir, '.npmignore'), '*.tsbuildinfo\n') } -Promise.resolve(buildConfig.final()).then(() => { - 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!') - } -}) +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 7b3ab98f..3479f649 100644 --- a/scripts/bump-version.js +++ b/scripts/bump-version.js @@ -1,14 +1,17 @@ -const fs = require('fs') -const path = require('path') -const semver = require('semver') +import { appendFileSync, readdirSync, readFileSync, writeFileSync } from 'fs' +import { EOL } from 'os' +import { dirname, join } from 'path' +import { inc, rcompare } from 'semver' +import { fileURLToPath } from 'url' + +const __dirname = dirname(new URL(import.meta.url).pathname) function collectPackageJsons() { - return fs - .readdirSync(path.join(__dirname, '../packages')) + return readdirSync(join(__dirname, '../packages')) .filter((s) => !s.startsWith('.')) .map((name) => { try { - return JSON.parse(fs.readFileSync(path.join(__dirname, '../packages', name, 'package.json'), 'utf-8')) + return JSON.parse(readFileSync(join(__dirname, '../packages', name, 'package.json'), 'utf-8')) } catch (e) { if (e.code !== 'ENOENT') throw e @@ -23,9 +26,9 @@ function bumpVersions(packages, kind) { const maxVersion = pkgJsons .filter((it) => it.name !== '@mtcute/tl') .map((it) => it.version) - .sort(semver.rcompare)[0] + .sort(rcompare)[0] - const nextVersion = semver.inc(maxVersion, kind) + const nextVersion = inc(maxVersion, kind) console.log('[i] Bumping versions to %s', nextVersion) for (const pkg of packages) { @@ -38,20 +41,20 @@ function bumpVersions(packages, kind) { } pkgJson.version = nextVersion - fs.writeFileSync( - path.join(__dirname, '../packages', pkg, 'package.json'), + writeFileSync( + join(__dirname, '../packages', pkg, 'package.json'), JSON.stringify(pkgJson, null, 4) + '\n', ) } - const rootPkgJson = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'), 'utf-8')) + const rootPkgJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8')) rootPkgJson.version = nextVersion - fs.writeFileSync(path.join(__dirname, '../package.json'), JSON.stringify(rootPkgJson, null, 4) + '\n') + writeFileSync(join(__dirname, '../package.json'), JSON.stringify(rootPkgJson, null, 4) + '\n') return nextVersion } -if (require.main === module) { +if (process.argv[1] === fileURLToPath(import.meta.url)) { const kind = process.argv[2] const packages = process.argv[3] @@ -75,8 +78,8 @@ if (require.main === module) { const ver = bumpVersions(packagesList, kind) if (process.env.GITHUB_OUTPUT) { - fs.appendFileSync(process.env.GITHUB_OUTPUT, `version=${ver}${require('os').EOL}`) + appendFileSync(process.env.GITHUB_OUTPUT, `version=${ver}${EOL}`) } } -module.exports = { bumpVersions } +export { bumpVersions } diff --git a/scripts/find-updated-packages.js b/scripts/find-updated-packages.js index f8a68552..eb2f56ea 100644 --- a/scripts/find-updated-packages.js +++ b/scripts/find-updated-packages.js @@ -1,22 +1,27 @@ -const cp = require('child_process') -const fs = require('fs') -const path = require('path') -const { listPackages } = require('./publish') -const { getLatestTag, findChangedFilesSince } = require('./git-utils') +import { execSync } from 'child_process' +import { appendFileSync, existsSync } from 'fs' +import { EOL } from 'os' +import { dirname, join } from 'path' +import { fileURLToPath } from 'url' + +import { findChangedFilesSince, getLatestTag } from './git-utils.js' +import { listPackages } from './publish.js' getTsconfigFiles.cache = {} +const __dirname = dirname(new URL(import.meta.url).pathname) + function getTsconfigFiles(pkg) { - if (!fs.existsSync(path.join(__dirname, `../packages/${pkg}/tsconfig.json`))) { + if (!existsSync(join(__dirname, `../packages/${pkg}/tsconfig.json`))) { throw new Error(`[!] ${pkg} does not have a tsconfig.json`) } if (pkg in getTsconfigFiles.cache) return getTsconfigFiles.cache[pkg] console.log('[i] Getting tsconfig files for %s', pkg) - const res = cp.execSync('pnpm exec tsc --showConfig', { + const res = execSync('pnpm exec tsc --showConfig', { encoding: 'utf8', stdio: 'pipe', - cwd: path.join(__dirname, `../packages/${pkg}`), + cwd: join(__dirname, `../packages/${pkg}`), }) const json = JSON.parse(res) @@ -68,9 +73,9 @@ function findChangedPackagesSince(tag, until) { return Array.from(changedPackages) } -module.exports = { findChangedPackagesSince, getLatestTag } +export { findChangedPackagesSince, getLatestTag } -if (require.main === module && process.env.CI && process.env.GITHUB_OUTPUT) { +if (process.argv[1] === fileURLToPath(import.meta.url) && process.env.CI && process.env.GITHUB_OUTPUT) { const kind = process.argv[2] const input = process.argv[3] @@ -102,5 +107,5 @@ if (require.main === module && process.env.CI && process.env.GITHUB_OUTPUT) { } console.log('[i] Will publish:', res) - fs.appendFileSync(process.env.GITHUB_OUTPUT, `modified=${res.join(',')}${require('os').EOL}`) + appendFileSync(process.env.GITHUB_OUTPUT, `modified=${res.join(',')}${EOL}`) } diff --git a/scripts/gen-deps-graph.mjs b/scripts/gen-deps-graph.js similarity index 88% rename from scripts/gen-deps-graph.mjs rename to scripts/gen-deps-graph.js index 5072beec..b6e0a57a 100644 --- a/scripts/gen-deps-graph.mjs +++ b/scripts/gen-deps-graph.js @@ -1,5 +1,5 @@ -// node scripts/gen-deps-graph.mjs | dot -Tsvg > deps.svg -import { getPackageJsons } from './utils.mjs' +// node scripts/gen-deps-graph.js | dot -Tsvg > deps.svg +import { getPackageJsons } from './utils.js' const packageJsons = await getPackageJsons() diff --git a/scripts/generate-changelog.js b/scripts/generate-changelog.js index b301fbdf..607e04e9 100644 --- a/scripts/generate-changelog.js +++ b/scripts/generate-changelog.js @@ -1,5 +1,9 @@ -const fs = require('fs') -const { getLatestTag, getCommitsSince, parseConventionalCommit, findChangedFilesSince } = require('./git-utils') +import { randomUUID } from 'crypto' +import { appendFileSync } from 'fs' +import { EOL } from 'os' +import { fileURLToPath } from 'url' + +import { findChangedFilesSince, getCommitsSince, getLatestTag, parseConventionalCommit } from './git-utils.js' function generateChangelog(onlyPackages) { const byPackage = {} @@ -52,7 +56,7 @@ function generateChangelog(onlyPackages) { return ret } -if (require.main === module) { +if (process.argv[1] === fileURLToPath(import.meta.url)) { let onlyPackages = null if (process.argv[2]) { @@ -62,8 +66,8 @@ if (require.main === module) { const res = generateChangelog(onlyPackages) if (process.env.CI && process.env.GITHUB_OUTPUT) { - const delim = `---${require('crypto').randomUUID()}---${require('os').EOL}` - fs.appendFileSync(process.env.GITHUB_OUTPUT, `changelog<<${delim}${res}${delim}`) + const delim = `---${randomUUID()}---${EOL}` + appendFileSync(process.env.GITHUB_OUTPUT, `changelog<<${delim}${res}${delim}`) } else { console.log(res) } diff --git a/scripts/git-utils.js b/scripts/git-utils.js index 2c2185ce..dac25fe5 100644 --- a/scripts/git-utils.js +++ b/scripts/git-utils.js @@ -1,14 +1,14 @@ -const cp = require('child_process') +import { execSync } from 'child_process' function getLatestTag() { try { - const res = cp.execSync('git describe --abbrev=0 --tags', { encoding: 'utf8', stdio: 'pipe' }).trim() + const res = execSync('git describe --abbrev=0 --tags', { encoding: 'utf8', stdio: 'pipe' }).trim() return res } catch (e) { if (e.stderr.match(/^fatal: (No names found|No tags can describe)/i)) { // no tags found, let's just return the first commit - return cp.execSync('git rev-list --max-parents=0 HEAD', { encoding: 'utf8' }).trim() + return execSync('git rev-list --max-parents=0 HEAD', { encoding: 'utf8' }).trim() } throw e @@ -16,14 +16,13 @@ function getLatestTag() { } function findChangedFilesSince(tag, until = 'HEAD') { - return cp.execSync(`git diff --name-only ${tag} ${until}`, { encoding: 'utf8', stdio: 'pipe' }).trim().split('\n') + return execSync(`git diff --name-only ${tag} ${until}`, { encoding: 'utf8', stdio: 'pipe' }).trim().split('\n') } function getCommitsSince(tag, until = 'HEAD') { const delim = `---${Math.random().toString(36).slice(2)}---` - const lines = cp - .execSync(`git log --pretty="format:%H %s%n%b%n${delim}" ${tag}..${until}`, { encoding: 'utf8', stdio: 'pipe' }) + const lines = execSync(`git log --pretty="format:%H %s%n%b%n${delim}" ${tag}..${until}`, { encoding: 'utf8', stdio: 'pipe' }) .trim() .split('\n') @@ -50,11 +49,11 @@ function getCommitsSince(tag, until = 'HEAD') { } function getCurrentCommit() { - return cp.execSync('git rev-parse HEAD', { encoding: 'utf8', stdio: 'pipe' }).trim() + return execSync('git rev-parse HEAD', { encoding: 'utf8', stdio: 'pipe' }).trim() } function getCurrentBranch() { - return cp.execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf8', stdio: 'pipe' }).trim() + return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf8', stdio: 'pipe' }).trim() } function parseConventionalCommit(msg) { @@ -67,11 +66,11 @@ function parseConventionalCommit(msg) { return { type, scope, breaking: Boolean(breaking), subject } } -module.exports = { - getLatestTag, +export { findChangedFilesSince, getCommitsSince, - parseConventionalCommit, - getCurrentCommit, getCurrentBranch, + getCurrentCommit, + getLatestTag, + parseConventionalCommit, } diff --git a/scripts/publish.js b/scripts/publish.js index ecdd7dd5..ee7696b8 100644 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -1,12 +1,18 @@ -const fs = require('fs') -const path = require('path') -const cp = require('child_process') -const stc = require('@teidesu/slow-types-compiler') +import * as cp from 'child_process' +import * as fs from 'fs' +import { createRequire } from 'module' +import * as path from 'path' +import { fileURLToPath } from 'url' +import * as stc from '@teidesu/slow-types-compiler' const IS_JSR = process.env.JSR === '1' const MAIN_REGISTRY = IS_JSR ? 'https://jsr.io/' : 'https://registry.npmjs.org' let REGISTRY = process.env.REGISTRY || MAIN_REGISTRY -exports.REGISTRY = REGISTRY +const EXPORTED_REGISTRY = REGISTRY + +const __dirname = path.dirname(new URL(import.meta.url).pathname) +const require = createRequire(import.meta.url) + if (!REGISTRY.endsWith('/')) REGISTRY += '/' if (process.env.E2E && IS_JSR) { @@ -148,8 +154,6 @@ function listPackages(all = false) { return packages } -exports.listPackages = listPackages - async function main(arg = process.argv[2]) { if (!arg) { console.log('Usage: publish.js ') @@ -248,11 +252,8 @@ async function main(arg = process.argv[2]) { process.exit(0) // idk why but it sometimes hangs indefinitely } -exports.main = main +export { listPackages, main, EXPORTED_REGISTRY as REGISTRY } -if (require.main === module) { - main().catch((e) => { - console.error(e) - process.exit(1) - }) +if (process.argv[1] === fileURLToPath(import.meta.url)) { + await main() } diff --git a/scripts/remove-jsr-sourcefiles.mjs b/scripts/remove-jsr-sourcefiles.js similarity index 100% rename from scripts/remove-jsr-sourcefiles.mjs rename to scripts/remove-jsr-sourcefiles.js diff --git a/scripts/utils.mjs b/scripts/utils.js similarity index 100% rename from scripts/utils.mjs rename to scripts/utils.js diff --git a/scripts/validate-deps-versions.mjs b/scripts/validate-deps-versions.js similarity index 97% rename from scripts/validate-deps-versions.mjs rename to scripts/validate-deps-versions.js index 0a54ae30..2efcb060 100644 --- a/scripts/validate-deps-versions.mjs +++ b/scripts/validate-deps-versions.js @@ -1,7 +1,7 @@ import semver from 'semver' import { fileURLToPath } from 'url' -import { getPackageJsons } from './utils.mjs' +import { getPackageJsons } from './utils.js' export async function validateDepsVersions() { const packageJsons = await getPackageJsons(true)