a collection of lightweight TypeScript packages for AT Protocol, the protocol powering Bluesky
atproto bluesky typescript npm
101
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: command to get package size info (#20)

* meta: command to get package size info

* chore: make pkg-size its own internal package

code quality improved by a factor of roughly 874 quintillion

* doc: add note about building before trying to get size report

authored by

Cynthia and committed by
GitHub
ac62c808 4f6e12ac

+673 -10
+2
.gitignore
··· 14 14 15 15 .idea 16 16 .DS_Store 17 + 18 + .pkgsize
+34
README.md
··· 67 67 pnpm run pull 68 68 pnpm run -r generate 69 69 ``` 70 + 71 + ### checking package sizes 72 + 73 + to observe the size of packages (both install size and bundled size), there is a `pkg-size-report` 74 + tool doing just that. you can also save the package sizes at a given time and inspect the impact of 75 + changes to the final bundle size. the tool uses `esbuild` to produce a minified bundle to get the 76 + size of each entrypoint. 77 + 78 + <!-- prettier-ignore-start --> 79 + <!-- Otherwise it wrecks the gfm alertbox ugh --> 80 + 81 + > [!WARNING] 82 + > run `pnpm run -r build` before running the command. otherwise, the command **may not run**, or **give bad measurements**. 83 + 84 + <!-- prettier-ignore-end --> 85 + 86 + ```sh 87 + # See the size of packages. 88 + # If package sizes were saved previously, will also show the diff. 89 + pnpm pkg-size-report 90 + 91 + # Save esbuild metafiles and package size information. 92 + pnpm pkg-size-report --save 93 + 94 + # Save just esbuild metafiles. 95 + pnpm pkg-size-report --save-meta 96 + 97 + # Show only the packages whose size have changed. 98 + pnpm pkg-size-report --compare 99 + 100 + # Keep the result bundle produced by esbuild. 101 + # Will be left in /tmp/[...]--[pkgname]--[random] 102 + pnpm pkg-size-report --keep-builds 103 + ```
+3
package.json
··· 1 1 { 2 + "private": true, 2 3 "type": "module", 3 4 "scripts": { 4 5 "pull": "node ./scripts/pull-lexicons.js", ··· 8 9 }, 9 10 "devDependencies": { 10 11 "@mary/tar": "npm:@jsr/mary__tar@^0.2.4", 12 + "mitata": "^1.0.23", 13 + "pkg-size-report": "workspace:^", 11 14 "prettier": "^3.4.2", 12 15 "typescript": "5.7.2" 13 16 }
+1 -2
packages/bluesky/richtext-segmenter/package.json
··· 30 30 "devDependencies": { 31 31 "@atcute/bluesky": "workspace:^", 32 32 "@atcute/client": "workspace:^", 33 - "@types/bun": "^1.1.14", 34 - "mitata": "^1.0.23" 33 + "@types/bun": "^1.1.14" 35 34 } 36 35 }
+2
packages/internal/pkg-size-report/cli.mjs
··· 1 + #!/usr/bin/env node 2 + import './dist/index.js';
+25
packages/internal/pkg-size-report/package.json
··· 1 + { 2 + "private": true, 3 + "type": "module", 4 + "name": "pkg-size-report", 5 + "version": "1.0.1", 6 + "description": "cli tool to compute and analyze package sizes", 7 + "license": "MIT", 8 + "repository": { 9 + "url": "https://github.com/mary-ext/atcute", 10 + "directory": "packages/internal/pkg-size-report" 11 + }, 12 + "bin": "./cli.mjs", 13 + "scripts": { 14 + "build": "tsc" 15 + }, 16 + "dependencies": { 17 + "esbuild": "^0.24.2", 18 + "js-yaml": "^4.1.0", 19 + "picocolors": "^1.1.1" 20 + }, 21 + "devDependencies": { 22 + "@types/js-yaml": "^4.0.9", 23 + "@types/node": "^22.10.2" 24 + } 25 + }
+34
packages/internal/pkg-size-report/src/bundle.ts
··· 1 + import * as path from 'node:path'; 2 + import * as os from 'node:os'; 3 + import * as fs from 'node:fs'; 4 + import * as url from 'node:url'; 5 + import * as esbuild from 'esbuild'; 6 + 7 + import { computeFolderSize } from './fs.js'; 8 + 9 + export function computeBundleInformation(entry: URL, entryQualifier: string, keepBuild = false) { 10 + const tmpDirPrefix = path.join( 11 + os.tmpdir(), 12 + `atcute-pkg-size-build--${entryQualifier.replaceAll('/', '__')}--`, 13 + ); 14 + 15 + const tmpDir = fs.mkdtempSync(tmpDirPrefix); 16 + 17 + const { metafile } = esbuild.buildSync({ 18 + bundle: true, 19 + minify: true, 20 + outdir: tmpDir, 21 + metafile: true, 22 + entryPoints: [url.fileURLToPath(entry)], 23 + }); 24 + 25 + const tmpDirUrl = url.pathToFileURL(tmpDir); 26 + const bundledSize = computeFolderSize(tmpDirUrl, true); 27 + 28 + if (!keepBuild) fs.rmSync(tmpDir, { recursive: true }); 29 + 30 + return { 31 + metafile, 32 + ...bundledSize, 33 + }; 34 + }
+3
packages/internal/pkg-size-report/src/consts.ts
··· 1 + export const WORKSPACE_ROOT = new URL('../../../../', import.meta.url); 2 + 3 + export const PKGSIZE_FOLDER = new URL('.pkgsize/', WORKSPACE_ROOT);
+42
packages/internal/pkg-size-report/src/data.ts
··· 1 + import type { Metafile } from 'esbuild'; 2 + 3 + import * as fs from 'node:fs'; 4 + import { PKGSIZE_FOLDER } from './consts.js'; 5 + 6 + const PKGSIZE_DATA = new URL(`data.json`, PKGSIZE_FOLDER); 7 + 8 + export interface EntrypointSizeInformation { 9 + name: string; 10 + size: number; 11 + gzip: number; 12 + brotli: number; 13 + metafile: Metafile; 14 + } 15 + 16 + export interface PackageSizeInformation { 17 + name: string; 18 + installSize: number; 19 + entries: EntrypointSizeInformation[]; 20 + } 21 + 22 + export function saveSizeData(data: PackageSizeInformation[]): void { 23 + const json = JSON.stringify(data, (k, v) => (k === 'metafile' ? void 0 : v), '\t'); 24 + fs.writeFileSync(PKGSIZE_DATA, json); 25 + } 26 + 27 + export function readSizeData(): PackageSizeInformation[] | null { 28 + if (!fs.existsSync(PKGSIZE_DATA)) return null; 29 + 30 + const json = fs.readFileSync(PKGSIZE_DATA, 'utf8'); 31 + return JSON.parse(json); 32 + } 33 + 34 + export function saveEsbuildMetafiles(data: PackageSizeInformation[]): void { 35 + for (const pkg of data) { 36 + for (const { name, metafile } of pkg.entries) { 37 + const path = new URL(`${name.replaceAll('/', '__')}-esbuild-metafile.json`, PKGSIZE_FOLDER); 38 + const json = JSON.stringify(metafile, null, '\t'); 39 + fs.writeFileSync(path, json); 40 + } 41 + } 42 + }
+35
packages/internal/pkg-size-report/src/diff.ts
··· 1 + import type { PackageSizeInformation } from './data.js'; 2 + 3 + export interface DiffInformation { 4 + [key: string]: { 5 + diff: number; 6 + entries: { 7 + [key: string]: { diff: number; gzip: number; brotli: number }; 8 + }; 9 + }; 10 + } 11 + 12 + export function computeSizeDiff( 13 + data: PackageSizeInformation[], 14 + old: PackageSizeInformation[], 15 + ): DiffInformation { 16 + const diff: DiffInformation = {}; 17 + for (const pkg of data) { 18 + const oldPkg = old.find((p) => p.name == pkg.name); 19 + if (!oldPkg) continue; 20 + 21 + diff[pkg.name] = { diff: pkg.installSize - oldPkg.installSize, entries: {} }; 22 + for (const entry of pkg.entries) { 23 + const oldEntry = oldPkg.entries.find((e) => e.name === entry.name); 24 + if (!oldEntry) continue; 25 + 26 + diff[pkg.name].entries[entry.name] = { 27 + diff: entry.size - oldEntry.size, 28 + gzip: entry.gzip - oldEntry.gzip, 29 + brotli: entry.brotli - oldEntry.brotli, 30 + }; 31 + } 32 + } 33 + 34 + return diff; 35 + }
+32
packages/internal/pkg-size-report/src/fs.ts
··· 1 + import * as fs from 'node:fs'; 2 + import * as zlib from 'node:zlib'; 3 + 4 + export function computeFolderSize(folder: URL, detailed = false) { 5 + folder.pathname += '/'; 6 + let res = { size: 0, gzip: 0, brotli: 0 }; 7 + 8 + for (const entry of fs.readdirSync(folder)) { 9 + const path = new URL(entry, folder); 10 + const stat = fs.statSync(path); 11 + 12 + if (stat.isDirectory()) { 13 + const nested = computeFolderSize(path); 14 + res.size += nested.size; 15 + res.gzip += nested.gzip; 16 + res.brotli += nested.brotli; 17 + } 18 + 19 + if (stat.isFile()) { 20 + res.size += stat.size; 21 + if (detailed) { 22 + const buf = fs.readFileSync(path); 23 + const gzipBuf = zlib.gzipSync(buf); 24 + const brotliBuf = zlib.brotliCompressSync(buf); 25 + res.gzip += gzipBuf.length; 26 + res.brotli += brotliBuf.length; 27 + } 28 + } 29 + } 30 + 31 + return res; 32 + }
+66
packages/internal/pkg-size-report/src/index.ts
··· 1 + import pc from 'picocolors'; 2 + import { computePackageSizeInformation, getAllWorkspacePackages } from './package.js'; 3 + import { readSizeData, saveEsbuildMetafiles, saveSizeData } from './data.js'; 4 + import { computeSizeDiff } from './diff.js'; 5 + 6 + const TREE_SYM_HAS_NEXT = '├'; 7 + const TREE_SYM_FINAL = '└'; 8 + 9 + const FLAG_SAVE = process.argv.includes('--save'); 10 + const FLAG_SAVE_META = process.argv.includes('--save-meta'); 11 + const FLAG_COMPARE = process.argv.includes('--compare'); 12 + const FLAG_KEEP_BUILDS = process.argv.includes('--keep-builds'); 13 + 14 + function formatSize(size: number) { 15 + return `${(size / 1000).toFixed(2)}kB`.padEnd(7, ' '); 16 + } 17 + 18 + function formatDiffSize(size: number) { 19 + const str = Math.abs(size) < 1000 ? `${size}B` : `${(size / 1000).toFixed(3)}kB`; 20 + return size < 0 ? pc.green(str) : pc.red(`+${str}`); 21 + } 22 + 23 + // Get package info 24 + const packages = getAllWorkspacePackages(); 25 + const sizeData = packages.map((pkg) => computePackageSizeInformation(pkg, FLAG_KEEP_BUILDS)); 26 + 27 + // Compute diff if applicable 28 + const prevData = readSizeData(); 29 + const diff = prevData && computeSizeDiff(sizeData, prevData); 30 + 31 + // Save files 32 + if (FLAG_SAVE) saveSizeData(sizeData); 33 + if (FLAG_SAVE || FLAG_SAVE_META) saveEsbuildMetafiles(sizeData); 34 + 35 + // Print to stdout. 36 + for (const pkg of sizeData) { 37 + const pkgDiff = diff?.[pkg.name]; 38 + if (FLAG_COMPARE && pkgDiff?.diff === 0) continue; 39 + 40 + let pkgInfo = `${pkg.name.padEnd(34, ' ')}\t${formatSize(pkg.installSize).padEnd(8, ' ')} ${pc.gray('install size')}`; 41 + if (pkgDiff?.diff) pkgInfo += ` ${formatDiffSize(pkgDiff.diff)}`; 42 + 43 + console.log(pkgInfo); 44 + 45 + for (let i = 0; i < pkg.entries.length; i++) { 46 + const entry = pkg.entries[i]; 47 + const entryDiff = pkgDiff?.entries[entry.name]; 48 + 49 + const size = formatSize(entry.size); 50 + const gzip = `${formatSize(entry.gzip)} ${pc.gray('gzip')}`; 51 + const brotli = `${formatSize(entry.brotli)} ${pc.gray('brotli')}`; 52 + 53 + const treeSym = i === pkg.entries.length - 1 ? TREE_SYM_FINAL : TREE_SYM_HAS_NEXT; 54 + let entryInfo = `${treeSym}── ${entry.name.padEnd(30, ' ')}\t${treeSym}── ${size}\t${gzip}\t${brotli}`; 55 + if (entryDiff?.diff) { 56 + const size = formatDiffSize(entryDiff.diff); 57 + const gzip = formatDiffSize(entryDiff.gzip); 58 + const brotli = formatDiffSize(entryDiff.brotli); 59 + entryInfo += ` ${size}/${gzip}/${brotli}`; 60 + } 61 + 62 + console.log(entryInfo); 63 + } 64 + 65 + console.log(); 66 + }
+70
packages/internal/pkg-size-report/src/package.ts
··· 1 + import type { PackageSizeInformation } from './data.js'; 2 + 3 + import * as fs from 'node:fs'; 4 + import { load as parseYaml } from 'js-yaml'; 5 + import { WORKSPACE_ROOT } from './consts.js'; 6 + import { computeFolderSize } from './fs.js'; 7 + import { computeBundleInformation } from './bundle.js'; 8 + 9 + interface PackageJsonData { 10 + folder: URL; 11 + relpath: string; 12 + name: string; 13 + private: boolean; 14 + exports: Record<string, string> | null; // let's pretend the export map doesn't exist for now shall we :) 15 + } 16 + 17 + const PNPM_LOCKFILE = new URL('pnpm-lock.yaml', WORKSPACE_ROOT); 18 + 19 + export function getAllWorkspacePackages(): PackageJsonData[] { 20 + const pnpmLockfileYaml = fs.readFileSync(PNPM_LOCKFILE, 'utf8'); 21 + const pnpmLockfile = parseYaml(pnpmLockfileYaml) as any; 22 + const packages = Object.keys(pnpmLockfile.importers); 23 + 24 + return packages 25 + .map((p) => { 26 + const packageFolder = new URL(`${p}/`, WORKSPACE_ROOT); 27 + const packageJsonFile = new URL('package.json', packageFolder); 28 + const packageJson = fs.readFileSync(packageJsonFile, 'utf8'); 29 + return Object.assign({}, JSON.parse(packageJson), { 30 + folder: packageFolder, 31 + relpath: p, 32 + }) as PackageJsonData; 33 + }) 34 + .filter((p) => !p.private); 35 + } 36 + 37 + export function computePackageSizeInformation( 38 + pkg: PackageJsonData, 39 + keepBuilds = false, 40 + ): PackageSizeInformation { 41 + const dist = new URL('dist/', pkg.folder); 42 + const { size: installSize } = computeFolderSize(dist); 43 + 44 + const pkgSizeInformation: PackageSizeInformation = { 45 + name: pkg.name, 46 + installSize, 47 + entries: [], 48 + }; 49 + 50 + // Those are just declaration packages with no useful payload. 51 + if (pkg.relpath.includes('definitions')) return pkgSizeInformation; 52 + 53 + // CLI & what not 54 + if (!pkg.exports) return pkgSizeInformation; 55 + 56 + for (const entry in pkg.exports) { 57 + if (!Object.hasOwn(pkg.exports, entry)) continue; 58 + 59 + const entryQualifier = pkg.name + entry.slice(1); 60 + const entryFile = new URL(pkg.exports[entry], pkg.folder); 61 + 62 + const data = computeBundleInformation(entryFile, entryQualifier, keepBuilds); 63 + pkgSizeInformation.entries.push({ 64 + name: entryQualifier, 65 + ...data, 66 + }); 67 + } 68 + 69 + return pkgSizeInformation; 70 + }
+22
packages/internal/pkg-size-report/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "outDir": "dist/", 4 + "esModuleInterop": true, 5 + "skipLibCheck": true, 6 + "target": "ESNext", 7 + "allowJs": true, 8 + "resolveJsonModule": true, 9 + "moduleDetection": "force", 10 + "isolatedModules": true, 11 + "verbatimModuleSyntax": true, 12 + "strict": true, 13 + "noImplicitOverride": true, 14 + "noUnusedLocals": true, 15 + "noUnusedParameters": true, 16 + "noFallthroughCasesInSwitch": true, 17 + "module": "NodeNext", 18 + "sourceMap": true, 19 + "declaration": true, 20 + }, 21 + "include": ["src"], 22 + }
+1 -2
packages/utilities/cbor/package.json
··· 30 30 }, 31 31 "devDependencies": { 32 32 "@ipld/dag-cbor": "^9.2.2", 33 - "@types/bun": "^1.1.14", 34 - "mitata": "^1.0.23" 33 + "@types/bun": "^1.1.14" 35 34 }, 36 35 "dependencies": { 37 36 "@atcute/cid": "workspace:^",
+301 -6
pnpm-lock.yaml
··· 11 11 '@mary/tar': 12 12 specifier: npm:@jsr/mary__tar@^0.2.4 13 13 version: '@jsr/mary__tar@0.2.4' 14 + mitata: 15 + specifier: ^1.0.23 16 + version: 1.0.23 17 + pkg-size-report: 18 + specifier: workspace:^ 19 + version: link:packages/internal/pkg-size-report 14 20 prettier: 15 21 specifier: ^3.4.2 16 22 version: 3.4.2 ··· 47 53 '@types/bun': 48 54 specifier: ^1.1.14 49 55 version: 1.1.14 50 - mitata: 51 - specifier: ^1.0.23 52 - version: 1.0.23 53 56 54 57 packages/bluesky/threading: 55 58 dependencies: ··· 176 179 specifier: ^5.1.0 177 180 version: 5.1.0 178 181 182 + packages/internal/pkg-size-report: 183 + dependencies: 184 + esbuild: 185 + specifier: ^0.24.2 186 + version: 0.24.2 187 + js-yaml: 188 + specifier: ^4.1.0 189 + version: 4.1.0 190 + picocolors: 191 + specifier: ^1.1.1 192 + version: 1.1.1 193 + devDependencies: 194 + '@types/js-yaml': 195 + specifier: ^4.0.9 196 + version: 4.0.9 197 + '@types/node': 198 + specifier: ^22.10.2 199 + version: 22.10.2 200 + 179 201 packages/oauth/browser-client: 180 202 dependencies: 181 203 '@atcute/client': ··· 217 239 '@types/bun': 218 240 specifier: ^1.1.14 219 241 version: 1.1.14 220 - mitata: 221 - specifier: ^1.0.23 222 - version: 1.0.23 223 242 224 243 packages/utilities/cid: 225 244 dependencies: ··· 593 612 cpu: [ppc64] 594 613 os: [aix] 595 614 615 + '@esbuild/aix-ppc64@0.24.2': 616 + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 617 + engines: {node: '>=18'} 618 + cpu: [ppc64] 619 + os: [aix] 620 + 596 621 '@esbuild/android-arm64@0.21.5': 597 622 resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 598 623 engines: {node: '>=12'} 624 + cpu: [arm64] 625 + os: [android] 626 + 627 + '@esbuild/android-arm64@0.24.2': 628 + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 629 + engines: {node: '>=18'} 599 630 cpu: [arm64] 600 631 os: [android] 601 632 ··· 605 636 cpu: [arm] 606 637 os: [android] 607 638 639 + '@esbuild/android-arm@0.24.2': 640 + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 641 + engines: {node: '>=18'} 642 + cpu: [arm] 643 + os: [android] 644 + 608 645 '@esbuild/android-x64@0.21.5': 609 646 resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 610 647 engines: {node: '>=12'} 611 648 cpu: [x64] 612 649 os: [android] 613 650 651 + '@esbuild/android-x64@0.24.2': 652 + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 653 + engines: {node: '>=18'} 654 + cpu: [x64] 655 + os: [android] 656 + 614 657 '@esbuild/darwin-arm64@0.21.5': 615 658 resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 616 659 engines: {node: '>=12'} 617 660 cpu: [arm64] 618 661 os: [darwin] 619 662 663 + '@esbuild/darwin-arm64@0.24.2': 664 + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 665 + engines: {node: '>=18'} 666 + cpu: [arm64] 667 + os: [darwin] 668 + 620 669 '@esbuild/darwin-x64@0.21.5': 621 670 resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 622 671 engines: {node: '>=12'} 623 672 cpu: [x64] 624 673 os: [darwin] 625 674 675 + '@esbuild/darwin-x64@0.24.2': 676 + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 677 + engines: {node: '>=18'} 678 + cpu: [x64] 679 + os: [darwin] 680 + 626 681 '@esbuild/freebsd-arm64@0.21.5': 627 682 resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 628 683 engines: {node: '>=12'} 629 684 cpu: [arm64] 630 685 os: [freebsd] 631 686 687 + '@esbuild/freebsd-arm64@0.24.2': 688 + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 689 + engines: {node: '>=18'} 690 + cpu: [arm64] 691 + os: [freebsd] 692 + 632 693 '@esbuild/freebsd-x64@0.21.5': 633 694 resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 634 695 engines: {node: '>=12'} 635 696 cpu: [x64] 636 697 os: [freebsd] 637 698 699 + '@esbuild/freebsd-x64@0.24.2': 700 + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 701 + engines: {node: '>=18'} 702 + cpu: [x64] 703 + os: [freebsd] 704 + 638 705 '@esbuild/linux-arm64@0.21.5': 639 706 resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 640 707 engines: {node: '>=12'} 641 708 cpu: [arm64] 642 709 os: [linux] 643 710 711 + '@esbuild/linux-arm64@0.24.2': 712 + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 713 + engines: {node: '>=18'} 714 + cpu: [arm64] 715 + os: [linux] 716 + 644 717 '@esbuild/linux-arm@0.21.5': 645 718 resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 646 719 engines: {node: '>=12'} 647 720 cpu: [arm] 648 721 os: [linux] 649 722 723 + '@esbuild/linux-arm@0.24.2': 724 + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 725 + engines: {node: '>=18'} 726 + cpu: [arm] 727 + os: [linux] 728 + 650 729 '@esbuild/linux-ia32@0.21.5': 651 730 resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 652 731 engines: {node: '>=12'} 732 + cpu: [ia32] 733 + os: [linux] 734 + 735 + '@esbuild/linux-ia32@0.24.2': 736 + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 737 + engines: {node: '>=18'} 653 738 cpu: [ia32] 654 739 os: [linux] 655 740 ··· 659 744 cpu: [loong64] 660 745 os: [linux] 661 746 747 + '@esbuild/linux-loong64@0.24.2': 748 + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 749 + engines: {node: '>=18'} 750 + cpu: [loong64] 751 + os: [linux] 752 + 662 753 '@esbuild/linux-mips64el@0.21.5': 663 754 resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 664 755 engines: {node: '>=12'} 665 756 cpu: [mips64el] 666 757 os: [linux] 667 758 759 + '@esbuild/linux-mips64el@0.24.2': 760 + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 761 + engines: {node: '>=18'} 762 + cpu: [mips64el] 763 + os: [linux] 764 + 668 765 '@esbuild/linux-ppc64@0.21.5': 669 766 resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 670 767 engines: {node: '>=12'} 671 768 cpu: [ppc64] 672 769 os: [linux] 673 770 771 + '@esbuild/linux-ppc64@0.24.2': 772 + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 773 + engines: {node: '>=18'} 774 + cpu: [ppc64] 775 + os: [linux] 776 + 674 777 '@esbuild/linux-riscv64@0.21.5': 675 778 resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 676 779 engines: {node: '>=12'} 677 780 cpu: [riscv64] 678 781 os: [linux] 679 782 783 + '@esbuild/linux-riscv64@0.24.2': 784 + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 785 + engines: {node: '>=18'} 786 + cpu: [riscv64] 787 + os: [linux] 788 + 680 789 '@esbuild/linux-s390x@0.21.5': 681 790 resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 682 791 engines: {node: '>=12'} 683 792 cpu: [s390x] 684 793 os: [linux] 685 794 795 + '@esbuild/linux-s390x@0.24.2': 796 + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 797 + engines: {node: '>=18'} 798 + cpu: [s390x] 799 + os: [linux] 800 + 686 801 '@esbuild/linux-x64@0.21.5': 687 802 resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 688 803 engines: {node: '>=12'} 689 804 cpu: [x64] 690 805 os: [linux] 691 806 807 + '@esbuild/linux-x64@0.24.2': 808 + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 809 + engines: {node: '>=18'} 810 + cpu: [x64] 811 + os: [linux] 812 + 813 + '@esbuild/netbsd-arm64@0.24.2': 814 + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 815 + engines: {node: '>=18'} 816 + cpu: [arm64] 817 + os: [netbsd] 818 + 692 819 '@esbuild/netbsd-x64@0.21.5': 693 820 resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 694 821 engines: {node: '>=12'} 695 822 cpu: [x64] 696 823 os: [netbsd] 697 824 825 + '@esbuild/netbsd-x64@0.24.2': 826 + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 827 + engines: {node: '>=18'} 828 + cpu: [x64] 829 + os: [netbsd] 830 + 831 + '@esbuild/openbsd-arm64@0.24.2': 832 + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 833 + engines: {node: '>=18'} 834 + cpu: [arm64] 835 + os: [openbsd] 836 + 698 837 '@esbuild/openbsd-x64@0.21.5': 699 838 resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 700 839 engines: {node: '>=12'} 701 840 cpu: [x64] 702 841 os: [openbsd] 703 842 843 + '@esbuild/openbsd-x64@0.24.2': 844 + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 845 + engines: {node: '>=18'} 846 + cpu: [x64] 847 + os: [openbsd] 848 + 704 849 '@esbuild/sunos-x64@0.21.5': 705 850 resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 706 851 engines: {node: '>=12'} 707 852 cpu: [x64] 708 853 os: [sunos] 709 854 855 + '@esbuild/sunos-x64@0.24.2': 856 + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 857 + engines: {node: '>=18'} 858 + cpu: [x64] 859 + os: [sunos] 860 + 710 861 '@esbuild/win32-arm64@0.21.5': 711 862 resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 712 863 engines: {node: '>=12'} 713 864 cpu: [arm64] 714 865 os: [win32] 715 866 867 + '@esbuild/win32-arm64@0.24.2': 868 + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 869 + engines: {node: '>=18'} 870 + cpu: [arm64] 871 + os: [win32] 872 + 716 873 '@esbuild/win32-ia32@0.21.5': 717 874 resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 718 875 engines: {node: '>=12'} 876 + cpu: [ia32] 877 + os: [win32] 878 + 879 + '@esbuild/win32-ia32@0.24.2': 880 + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 881 + engines: {node: '>=18'} 719 882 cpu: [ia32] 720 883 os: [win32] 721 884 ··· 725 888 cpu: [x64] 726 889 os: [win32] 727 890 891 + '@esbuild/win32-x64@0.24.2': 892 + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 893 + engines: {node: '>=18'} 894 + cpu: [x64] 895 + os: [win32] 896 + 728 897 '@externdefs/collider@0.1.0': 729 898 resolution: {integrity: sha512-vmFJEKHhftREiuhhK3WIMKk6bGfm7kM9c5HeVElFCbtqajXqCfwY/GR3f1G0qYWCvbtcoBhIZ2O8ia3A2/pjkw==} 730 899 peerDependencies: ··· 1231 1400 '@types/estree@1.0.6': 1232 1401 resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 1233 1402 1403 + '@types/js-yaml@4.0.9': 1404 + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} 1405 + 1234 1406 '@types/node@20.12.14': 1235 1407 resolution: {integrity: sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==} 1236 1408 ··· 1302 1474 resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 1303 1475 engines: {node: '>=12'} 1304 1476 1477 + argparse@2.0.1: 1478 + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 1479 + 1305 1480 array-flatten@1.1.1: 1306 1481 resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} 1307 1482 ··· 1600 1775 engines: {node: '>=12'} 1601 1776 hasBin: true 1602 1777 1778 + esbuild@0.24.2: 1779 + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 1780 + engines: {node: '>=18'} 1781 + hasBin: true 1782 + 1603 1783 escape-html@1.0.3: 1604 1784 resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 1605 1785 ··· 1828 2008 1829 2009 jose@5.9.6: 1830 2010 resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} 2011 + 2012 + js-yaml@4.1.0: 2013 + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 2014 + hasBin: true 1831 2015 1832 2016 key-encoder@2.0.3: 1833 2017 resolution: {integrity: sha512-fgBtpAGIr/Fy5/+ZLQZIPPhsZEcbSlYu/Wu96tNDFNSjSACw5lEIOFeaVdQ/iwrb8oxjlWi6wmWdH76hV6GZjg==} ··· 3491 3675 '@esbuild/aix-ppc64@0.21.5': 3492 3676 optional: true 3493 3677 3678 + '@esbuild/aix-ppc64@0.24.2': 3679 + optional: true 3680 + 3494 3681 '@esbuild/android-arm64@0.21.5': 3495 3682 optional: true 3496 3683 3684 + '@esbuild/android-arm64@0.24.2': 3685 + optional: true 3686 + 3497 3687 '@esbuild/android-arm@0.21.5': 3688 + optional: true 3689 + 3690 + '@esbuild/android-arm@0.24.2': 3498 3691 optional: true 3499 3692 3500 3693 '@esbuild/android-x64@0.21.5': 3501 3694 optional: true 3502 3695 3696 + '@esbuild/android-x64@0.24.2': 3697 + optional: true 3698 + 3503 3699 '@esbuild/darwin-arm64@0.21.5': 3504 3700 optional: true 3505 3701 3702 + '@esbuild/darwin-arm64@0.24.2': 3703 + optional: true 3704 + 3506 3705 '@esbuild/darwin-x64@0.21.5': 3706 + optional: true 3707 + 3708 + '@esbuild/darwin-x64@0.24.2': 3507 3709 optional: true 3508 3710 3509 3711 '@esbuild/freebsd-arm64@0.21.5': 3510 3712 optional: true 3511 3713 3714 + '@esbuild/freebsd-arm64@0.24.2': 3715 + optional: true 3716 + 3512 3717 '@esbuild/freebsd-x64@0.21.5': 3513 3718 optional: true 3514 3719 3720 + '@esbuild/freebsd-x64@0.24.2': 3721 + optional: true 3722 + 3515 3723 '@esbuild/linux-arm64@0.21.5': 3724 + optional: true 3725 + 3726 + '@esbuild/linux-arm64@0.24.2': 3516 3727 optional: true 3517 3728 3518 3729 '@esbuild/linux-arm@0.21.5': 3519 3730 optional: true 3520 3731 3732 + '@esbuild/linux-arm@0.24.2': 3733 + optional: true 3734 + 3521 3735 '@esbuild/linux-ia32@0.21.5': 3522 3736 optional: true 3523 3737 3738 + '@esbuild/linux-ia32@0.24.2': 3739 + optional: true 3740 + 3524 3741 '@esbuild/linux-loong64@0.21.5': 3525 3742 optional: true 3526 3743 3744 + '@esbuild/linux-loong64@0.24.2': 3745 + optional: true 3746 + 3527 3747 '@esbuild/linux-mips64el@0.21.5': 3528 3748 optional: true 3529 3749 3750 + '@esbuild/linux-mips64el@0.24.2': 3751 + optional: true 3752 + 3530 3753 '@esbuild/linux-ppc64@0.21.5': 3531 3754 optional: true 3532 3755 3756 + '@esbuild/linux-ppc64@0.24.2': 3757 + optional: true 3758 + 3533 3759 '@esbuild/linux-riscv64@0.21.5': 3760 + optional: true 3761 + 3762 + '@esbuild/linux-riscv64@0.24.2': 3534 3763 optional: true 3535 3764 3536 3765 '@esbuild/linux-s390x@0.21.5': 3537 3766 optional: true 3538 3767 3768 + '@esbuild/linux-s390x@0.24.2': 3769 + optional: true 3770 + 3539 3771 '@esbuild/linux-x64@0.21.5': 3772 + optional: true 3773 + 3774 + '@esbuild/linux-x64@0.24.2': 3775 + optional: true 3776 + 3777 + '@esbuild/netbsd-arm64@0.24.2': 3540 3778 optional: true 3541 3779 3542 3780 '@esbuild/netbsd-x64@0.21.5': 3543 3781 optional: true 3544 3782 3783 + '@esbuild/netbsd-x64@0.24.2': 3784 + optional: true 3785 + 3786 + '@esbuild/openbsd-arm64@0.24.2': 3787 + optional: true 3788 + 3545 3789 '@esbuild/openbsd-x64@0.21.5': 3546 3790 optional: true 3547 3791 3792 + '@esbuild/openbsd-x64@0.24.2': 3793 + optional: true 3794 + 3548 3795 '@esbuild/sunos-x64@0.21.5': 3549 3796 optional: true 3550 3797 3798 + '@esbuild/sunos-x64@0.24.2': 3799 + optional: true 3800 + 3551 3801 '@esbuild/win32-arm64@0.21.5': 3802 + optional: true 3803 + 3804 + '@esbuild/win32-arm64@0.24.2': 3552 3805 optional: true 3553 3806 3554 3807 '@esbuild/win32-ia32@0.21.5': 3555 3808 optional: true 3556 3809 3810 + '@esbuild/win32-ia32@0.24.2': 3811 + optional: true 3812 + 3557 3813 '@esbuild/win32-x64@0.21.5': 3558 3814 optional: true 3559 3815 3816 + '@esbuild/win32-x64@0.24.2': 3817 + optional: true 3818 + 3560 3819 '@externdefs/collider@0.1.0(@badrap/valita@0.3.16)': 3561 3820 dependencies: 3562 3821 '@badrap/valita': 0.3.16 ··· 4124 4383 4125 4384 '@types/estree@1.0.6': {} 4126 4385 4386 + '@types/js-yaml@4.0.9': {} 4387 + 4127 4388 '@types/node@20.12.14': 4128 4389 dependencies: 4129 4390 undici-types: 5.26.5 ··· 4212 4473 color-convert: 2.0.1 4213 4474 4214 4475 ansi-styles@6.2.1: {} 4476 + 4477 + argparse@2.0.1: {} 4215 4478 4216 4479 array-flatten@1.1.1: {} 4217 4480 ··· 4540 4803 '@esbuild/win32-ia32': 0.21.5 4541 4804 '@esbuild/win32-x64': 0.21.5 4542 4805 4806 + esbuild@0.24.2: 4807 + optionalDependencies: 4808 + '@esbuild/aix-ppc64': 0.24.2 4809 + '@esbuild/android-arm': 0.24.2 4810 + '@esbuild/android-arm64': 0.24.2 4811 + '@esbuild/android-x64': 0.24.2 4812 + '@esbuild/darwin-arm64': 0.24.2 4813 + '@esbuild/darwin-x64': 0.24.2 4814 + '@esbuild/freebsd-arm64': 0.24.2 4815 + '@esbuild/freebsd-x64': 0.24.2 4816 + '@esbuild/linux-arm': 0.24.2 4817 + '@esbuild/linux-arm64': 0.24.2 4818 + '@esbuild/linux-ia32': 0.24.2 4819 + '@esbuild/linux-loong64': 0.24.2 4820 + '@esbuild/linux-mips64el': 0.24.2 4821 + '@esbuild/linux-ppc64': 0.24.2 4822 + '@esbuild/linux-riscv64': 0.24.2 4823 + '@esbuild/linux-s390x': 0.24.2 4824 + '@esbuild/linux-x64': 0.24.2 4825 + '@esbuild/netbsd-arm64': 0.24.2 4826 + '@esbuild/netbsd-x64': 0.24.2 4827 + '@esbuild/openbsd-arm64': 0.24.2 4828 + '@esbuild/openbsd-x64': 0.24.2 4829 + '@esbuild/sunos-x64': 0.24.2 4830 + '@esbuild/win32-arm64': 0.24.2 4831 + '@esbuild/win32-ia32': 0.24.2 4832 + '@esbuild/win32-x64': 0.24.2 4833 + 4543 4834 escape-html@1.0.3: {} 4544 4835 4545 4836 estree-walker@3.0.3: ··· 4807 5098 '@pkgjs/parseargs': 0.11.0 4808 5099 4809 5100 jose@5.9.6: {} 5101 + 5102 + js-yaml@4.1.0: 5103 + dependencies: 5104 + argparse: 2.0.1 4810 5105 4811 5106 key-encoder@2.0.3: 4812 5107 dependencies: