diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee924ff..835bfba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,10 +36,10 @@ jobs: - name: JSDoc completeness (hard fail) run: pnpm run lint:jsdoc - # Type declarations: tsd assertions plus a strict/node16 consumer - # compile, then a regeneration diff proving the committed .d.ts files - # match the JSDoc and the hand-written declarations. No native build - # is involved — gen-types only typechecks lib/*.js. + # Type declarations: type-identity assertions plus a strict/node16 + # consumer compile, then a regeneration diff proving the committed .d.ts + # files match the JSDoc and the hand-written declarations. No native + # build is involved — gen-types only typechecks lib/*.js. types: runs-on: ubuntu-22.04 timeout-minutes: 10 @@ -53,7 +53,7 @@ jobs: scope: '@appthreat' - name: Install dependencies run: pnpm install --frozen-lockfile --ignore-scripts - - name: Type tests (tsd + strict/node16 consumer) + - name: Type tests (type-identity + strict/node16 consumer) run: pnpm run test:types - name: Regenerated declarations must match the committed ones run: | @@ -315,7 +315,8 @@ jobs: # The packaged-ASAR cases: slow (packages Electron twice from a real # packed-tarball install), so ubuntu-only and not on every push — - # post-merge on release/v9 and on demand. + # post-merge on release/v9 and on demand. PRs touching test/electron/** + # get the same suite from electron-asar.yml instead. electron-asar: needs: build # Tags included: publish depends on this job, so it has to actually diff --git a/.github/workflows/electron-asar.yml b/.github/workflows/electron-asar.yml new file mode 100644 index 0000000..2e9daf0 --- /dev/null +++ b/.github/workflows/electron-asar.yml @@ -0,0 +1,56 @@ +name: electron-asar +# PR-side coverage for the packaged-ASAR tests. In ci.yml these cases +# are slow (packages Electron twice from a real packed-tarball install), +# so they only run post-merge on release/ branches, on tags and on +# demand — which meant a break in the test's own code (for example a +# wrong tarball-name derivation) surfaced at the release gate instead of +# on the PR that introduced it. This workflow runs the same suite on the +# PRs that can break it: the test's own sources, and package.json — the +# tarball name is derived from the package identity. It builds the +# prebuild locally instead of downloading the build job's artifact, +# because the build matrix does not run on these path-filtered events. +on: + workflow_dispatch: + pull_request: + paths: + - 'test/electron/**' + - 'package.json' + - '.github/workflows/electron-asar.yml' +env: + FORCE_COLOR: 1 +concurrency: + group: electron-asar-${{ github.head_ref || github.run_id }} + cancel-in-progress: true +jobs: + asar: + runs-on: ubuntu-22.04 + timeout-minutes: 30 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - name: Setup pnpm + uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: 24 + scope: '@appthreat' + - name: Set up Python + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + with: + python-version: 3.12 + - name: Install dependencies + run: pnpm install --frozen-lockfile --ignore-scripts + # Mirrors the ci.yml build job's Linux flags and --tag-libc so the + # prebuild this packs is laid out and built the same way as the + # artifact the release-branch job consumes. + - name: Add Linux env vars + run: | + echo "CFLAGS=${CFLAGS:-} -include ../src/gcc-preinclude.h" >> $GITHUB_ENV + echo "CXXFLAGS=${CXXFLAGS:-} -include ../src/gcc-preinclude.h" >> $GITHUB_ENV + - name: Build the shipped prebuild + run: pnpm run prebuild --tag-libc + - name: Install xvfb + run: sudo apt-get update && sudo apt-get install -y xvfb + - name: Packaged-ASAR tests (unpacked + sealed-in-archive) + env: + ELECTRON_DISABLE_SANDBOX: '1' + run: xvfb-run -a pnpm run test:electron:asar diff --git a/README.md b/README.md index 553ca96..da7cab0 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ your workload is synchronous and fits `node:sqlite`, use `node:sqlite`** — nothing needs installing and nothing needs compiling. This package exists for the parts it does not cover. -Verified against `@appthreat/sqlite3` 9.0.0 on **Node v24.18.0 and +Verified against `@appthreat/sqlite3` 9.0.1 on **Node v24.18.0 and v26.7.0**, which expose an identical `node:sqlite` surface and behave identically on every point below — so this table holds across the whole range this package supports. `node:sqlite` did grow quickly during 24.x diff --git a/docs/install.md b/docs/install.md index dc63459..923f9ad 100644 --- a/docs/install.md +++ b/docs/install.md @@ -42,7 +42,7 @@ dependent allowlists it. This package declares `"install": "node-gyp-build"`, so pnpm prints a notice like: ``` -[ERR_PNPM_IGNORED_BUILDS] Ignored build scripts: @appthreat/sqlite3@9.0.0 +[ERR_PNPM_IGNORED_BUILDS] Ignored build scripts: @appthreat/sqlite3@9.0.1 ``` **You can ignore that notice.** Verified empirically (pnpm 11.23.0, macOS, diff --git a/package.json b/package.json index 4a3a779..eab24db 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@appthreat/sqlite3", "description": "Asynchronous, non-blocking SQLite3 bindings. Modern rewrite of TryGhost/node-sqlite3", - "version": "9.0.0", + "version": "9.0.1", "homepage": "https://github.com/AppThreat/node-sqlite3", "author": "Team AppThreat ", "binary": { @@ -32,7 +32,6 @@ "electron": "43.4.1", "prebuildify": "^6.0.1", "semver": "^7.8.5", - "tsd": "^0.33.0", "typescript": "~5.9.3" }, "peerDependencies": { @@ -68,7 +67,7 @@ "bench:compare": "node --expose-gc bench/index.js --compare --baseline bench/baseline.json", "bench:update": "node --expose-gc bench/index.js --write-baseline", "gen-types": "node tools/gen-types.js", - "test:types": "tsd && tsc --noEmit -p tsconfig.check.json", + "test:types": "tsc --noEmit -p tsconfig.check.json", "test:matrix": "node tools/test-matrix.mjs" }, "license": "BSD-3-Clause", @@ -80,8 +79,5 @@ ], "type": "module", "main": "./lib/sqlite3.js", - "types": "./lib/sqlite3.d.ts", - "tsd": { - "directory": "types" - } + "types": "./lib/sqlite3.d.ts" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c6f74fa..5f134af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,9 +33,6 @@ importers: semver: specifier: ^7.8.5 version: 7.8.5 - tsd: - specifier: ^0.33.0 - version: 0.33.0 typescript: specifier: ~5.9.3 version: 5.9.3 @@ -46,14 +43,6 @@ importers: packages: - '@babel/code-frame@7.29.7': - resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==, tarball: https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.29.7': - resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==, tarball: https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz} - engines: {node: '>=6.9.0'} - '@biomejs/biome@2.5.10': resolution: {integrity: sha512-WRKXARA3kTuiV5sxqTpobJ/I0MVd4vk3pOL6wnp5az4LntFIhWTj1RWZq3DI9PCEN3lXcqy7p5aqUHzvq8AXyQ==, tarball: https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.10.tgz} engines: {node: '>=14.21.3'} @@ -151,51 +140,13 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==, tarball: https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz} engines: {node: '>=18.0.0'} - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, tarball: https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@malept/cross-spawn-promise@2.0.0': resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==, tarball: https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz} engines: {node: '>= 12.13.0'} - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, tarball: https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, tarball: https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, tarball: https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz} - engines: {node: '>= 8'} - - '@sinclair/typebox@0.27.12': - resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==, tarball: https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz} - - '@tsd/typescript@5.9.3': - resolution: {integrity: sha512-JSSdNiS0wgd8GHhBwnMAI18Y8XPhLVN+dNelPfZCXFhy9Lb3NbnFyp9JKxxr54jSUkEJPk3cidvCoHducSaRMQ==, tarball: https://registry.npmjs.org/@tsd/typescript/-/typescript-5.9.3.tgz} - engines: {node: '>=14.17'} - - '@types/eslint@7.29.0': - resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==, tarball: https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz} - - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==, tarball: https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, tarball: https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz} - - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==, tarball: https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz} - '@types/node@24.13.3': resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==, tarball: https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, tarball: https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz} - '@xmldom/xmldom@0.9.12': resolution: {integrity: sha512-5AXjrcMClTryPe9LgZrygpB1lj7s0S9E0+W+AHaVKAVyHanafK86iPSvG5xHVSp/jC+VH1UXu0TAEmY279xH7A==, tarball: https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.12.tgz} engines: {node: '>=14.6'} @@ -204,30 +155,6 @@ packages: resolution: {integrity: sha512-/XrFJgzQQQHpti1raDJC6m4ws6aNktmjBlhk8Fdlk7LwCEuDoieEJJY9OFHjfiFJFFRM2tK+Ky/IsfbbmlMu1w==, tarball: https://registry.npmjs.org/abbrev/-/abbrev-5.0.0.tgz} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, tarball: https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz} - engines: {node: '>=8'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, tarball: https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, tarball: https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, tarball: https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz} - engines: {node: '>=10'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, tarball: https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz} - engines: {node: '>=8'} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, tarball: https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz} - engines: {node: '>=0.10.0'} - balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==, tarball: https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz} engines: {node: 18 || 20 || >=22} @@ -242,25 +169,9 @@ packages: resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==, tarball: https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz} engines: {node: 20 || >=22} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, tarball: https://registry.npmjs.org/braces/-/braces-3.0.3.tgz} - engines: {node: '>=8'} - buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, tarball: https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz} - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, tarball: https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz} - engines: {node: '>=8'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, tarball: https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz} - engines: {node: '>=6'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, tarball: https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz} - engines: {node: '>=10'} - chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, tarball: https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz} @@ -268,13 +179,6 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==, tarball: https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz} engines: {node: '>=18'} - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, tarball: https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, tarball: https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz} - commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, tarball: https://registry.npmjs.org/commander/-/commander-9.5.0.tgz} engines: {node: ^12.20.0 || >=14} @@ -292,30 +196,11 @@ packages: supports-color: optional: true - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, tarball: https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz} - engines: {node: '>=0.10.0'} - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, tarball: https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz} - engines: {node: '>=0.10.0'} - - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==, tarball: https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, tarball: https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz} - engines: {node: '>=8'} - electron@43.4.1: resolution: {integrity: sha512-5b+EuiwkgG5iRcsEL34rimgRpkYp15SsfZOa0pC5kXs0Tb82TH4n95rpQzTZa7yRCbA7tm0WoEbuBL6NaAhAcA==, tarball: https://registry.npmjs.org/electron/-/electron-43.4.1.tgz} engines: {node: '>= 22.12.0'} hasBin: true - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, tarball: https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz} - end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==, tarball: https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz} @@ -330,30 +215,9 @@ packages: err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==, tarball: https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz} - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==, tarball: https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, tarball: https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz} - engines: {node: '>= 0.4'} - - eslint-formatter-pretty@4.1.0: - resolution: {integrity: sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==, tarball: https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz} - engines: {node: '>=10'} - - eslint-rule-docs@1.1.235: - resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==, tarball: https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz} - exponential-backoff@3.1.3: resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==, tarball: https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, tarball: https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz} - engines: {node: '>=8.6.0'} - - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==, tarball: https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, tarball: https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz} engines: {node: '>=12.0.0'} @@ -371,14 +235,6 @@ packages: resolution: {integrity: sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ==, tarball: https://registry.npmjs.org/filenamify/-/filenamify-6.0.0.tgz} engines: {node: '>=16'} - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, tarball: https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz} - engines: {node: '>=8'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, tarball: https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz} - engines: {node: '>=8'} - flora-colossus@3.0.2: resolution: {integrity: sha512-Jk78K/Tzt6saxQPGChlJw69xuFGpWyTSAS8EdU0h/FyXwD2K46yNOXmo6nRHcZ9ooekyBAzMkwmiGNt7wOC5zg==, tarball: https://registry.npmjs.org/flora-colossus/-/flora-colossus-3.0.2.tgz} engines: {node: '>=22.12.0'} @@ -386,96 +242,27 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, tarball: https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz} - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, tarball: https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz} - galactus@2.0.2: resolution: {integrity: sha512-HmKyTFGomdAchz4umx8MwBnrnfFmdpwiTyGA4ZOF7rya2Lmgbc9qate4yweInL+0gUBVImhaz12SBGpW3SY4Yg==, tarball: https://registry.npmjs.org/galactus/-/galactus-2.0.2.tgz} engines: {node: '>=22.12.0'} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, tarball: https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz} - engines: {node: '>= 6'} - glob@13.0.6: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==, tarball: https://registry.npmjs.org/glob/-/glob-13.0.6.tgz} engines: {node: 18 || 20 || >=22} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, tarball: https://registry.npmjs.org/globby/-/globby-11.1.0.tgz} - engines: {node: '>=10'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, tarball: https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz} - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, tarball: https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz} - engines: {node: '>=6'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, tarball: https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz} engines: {node: '>=8'} - hasown@2.0.4: - resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==, tarball: https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz} - engines: {node: '>= 0.4'} - - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, tarball: https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz} - - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, tarball: https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz} - engines: {node: '>=10'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, tarball: https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz} - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, tarball: https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz} - engines: {node: '>= 4'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, tarball: https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz} - engines: {node: '>=8'} - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, tarball: https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz} - irregular-plurals@3.5.0: - resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==, tarball: https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz} - engines: {node: '>=8'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, tarball: https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz} - - is-core-module@2.16.2: - resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==, tarball: https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, tarball: https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, tarball: https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, tarball: https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, tarball: https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz} - engines: {node: '>=0.12.0'} - - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, tarball: https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz} - engines: {node: '>=0.10.0'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, tarball: https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz} - engines: {node: '>=10'} - isbinaryfile@4.0.10: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==, tarball: https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz} engines: {node: '>= 8.0.0'} @@ -487,79 +274,18 @@ packages: resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==, tarball: https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz} engines: {node: '>=20'} - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==, tarball: https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==, tarball: https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, tarball: https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, tarball: https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz} - junk@4.0.1: resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==, tarball: https://registry.npmjs.org/junk/-/junk-4.0.1.tgz} engines: {node: '>=12.20'} - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, tarball: https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz} - engines: {node: '>=0.10.0'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, tarball: https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, tarball: https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz} - engines: {node: '>=8'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, tarball: https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz} - engines: {node: '>=10'} - lru-cache@11.5.2: resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz} engines: {node: 20 || >=22} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz} - engines: {node: '>=10'} - - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, tarball: https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, tarball: https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz} - engines: {node: '>=8'} - - meow@9.0.0: - resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==, tarball: https://registry.npmjs.org/meow/-/meow-9.0.0.tgz} - engines: {node: '>=10'} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, tarball: https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, tarball: https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz} - engines: {node: '>=8.6'} - - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, tarball: https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz} - engines: {node: '>=4'} - minimatch@10.2.6: resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==, tarball: https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz} engines: {node: 18 || 20 || >=22} - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, tarball: https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz} - engines: {node: '>= 6'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, tarball: https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz} @@ -599,13 +325,6 @@ packages: engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} hasBin: true - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, tarball: https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz} - - normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, tarball: https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz} - engines: {node: '>=10'} - npm-run-path@3.1.0: resolution: {integrity: sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==, tarball: https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz} engines: {node: '>=8'} @@ -613,52 +332,18 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, tarball: https://registry.npmjs.org/once/-/once-1.4.0.tgz} - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, tarball: https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz} - engines: {node: '>=6'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, tarball: https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz} - engines: {node: '>=8'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, tarball: https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz} - engines: {node: '>=6'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, tarball: https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz} - engines: {node: '>=8'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, tarball: https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz} - engines: {node: '>=8'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, tarball: https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz} engines: {node: '>=8'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, tarball: https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz} - path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==, tarball: https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz} engines: {node: 18 || 20 || >=22} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, tarball: https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz} - engines: {node: '>=8'} - pe-library@1.0.1: resolution: {integrity: sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==, tarball: https://registry.npmjs.org/pe-library/-/pe-library-1.0.1.tgz} engines: {node: '>=14', npm: '>=7'} - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, tarball: https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz} - - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==, tarball: https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz} - engines: {node: '>=8.6'} - picomatch@4.0.5: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==, tarball: https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz} engines: {node: '>=12'} @@ -667,10 +352,6 @@ packages: resolution: {integrity: sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==, tarball: https://registry.npmjs.org/plist/-/plist-3.1.1.tgz} engines: {node: '>=10.4.0'} - plur@4.0.0: - resolution: {integrity: sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==, tarball: https://registry.npmjs.org/plur/-/plur-4.0.0.tgz} - engines: {node: '>=10'} - postject@1.0.0-alpha.6: resolution: {integrity: sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==, tarball: https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz} engines: {node: '>=14.0.0'} @@ -680,10 +361,6 @@ packages: resolution: {integrity: sha512-8Y2oOOateom/s8dNBsGIcnm6AxPmLH4/nanQzL5lQMU+sC0CMhzARZHizwr36pUPLdvBnOkCNQzxg4djuFSgIw==, tarball: https://registry.npmjs.org/prebuildify/-/prebuildify-6.0.1.tgz} hasBin: true - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, tarball: https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - proc-log@7.0.0: resolution: {integrity: sha512-FYgfaA69XZ93zaXLoMNQ+ViDXGGBgR8aLh03txzcFhV+9xOXx7+8DLCULrKKpR9+GsH9ZfHm82aSUPpozX0Ztg==, tarball: https://registry.npmjs.org/proc-log/-/proc-log-7.0.0.tgz} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} @@ -699,59 +376,21 @@ packages: pump@3.0.4: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==, tarball: https://registry.npmjs.org/pump/-/pump-3.0.4.tgz} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, tarball: https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz} - - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, tarball: https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz} - engines: {node: '>=8'} - - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==, tarball: https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz} - - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, tarball: https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz} - engines: {node: '>=8'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, tarball: https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz} - engines: {node: '>=8'} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, tarball: https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz} engines: {node: '>= 6'} - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, tarball: https://registry.npmjs.org/redent/-/redent-3.0.0.tgz} - engines: {node: '>=8'} - resedit@2.0.3: resolution: {integrity: sha512-oTeemxwoMuxxTYxXUwjkrOPfngTQehlv0/HoYFNkB4uzsP1Un1A9nI8JQKGOFkxpqkC7qkMs0lUsGrvUlbLNUA==, tarball: https://registry.npmjs.org/resedit/-/resedit-2.0.3.tgz} engines: {node: '>=14', npm: '>=7'} - resolve@1.22.12: - resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==, tarball: https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz} - engines: {node: '>= 0.4'} - hasBin: true - retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==, tarball: https://registry.npmjs.org/retry/-/retry-0.12.0.tgz} engines: {node: '>= 4'} - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, tarball: https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, tarball: https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, tarball: https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz} - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, tarball: https://registry.npmjs.org/semver/-/semver-5.7.2.tgz} - hasBin: true - semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==, tarball: https://registry.npmjs.org/semver/-/semver-7.8.5.tgz} engines: {node: '>=10'} @@ -765,37 +404,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, tarball: https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz} engines: {node: '>=8'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, tarball: https://registry.npmjs.org/slash/-/slash-3.0.0.tgz} - engines: {node: '>=8'} - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, tarball: https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==, tarball: https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, tarball: https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz} - - spdx-license-ids@3.0.23: - resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==, tarball: https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, tarball: https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz} - engines: {node: '>=8'} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, tarball: https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz} - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, tarball: https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz} - engines: {node: '>=8'} - - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, tarball: https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz} - engines: {node: '>=8'} - sumchecker@3.0.1: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==, tarball: https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz} engines: {node: '>= 8.0'} @@ -804,14 +415,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, tarball: https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz} engines: {node: '>=8'} - supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, tarball: https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz} - engines: {node: '>=8'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, tarball: https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz} - engines: {node: '>= 0.4'} - tar-fs@2.1.5: resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==, tarball: https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.5.tgz} @@ -827,35 +430,6 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==, tarball: https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz} engines: {node: '>=12.0.0'} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, tarball: https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz} - engines: {node: '>=8.0'} - - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, tarball: https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz} - engines: {node: '>=8'} - - tsd@0.33.0: - resolution: {integrity: sha512-/PQtykJFVw90QICG7zyPDMIyueOXKL7jOJVoX5pILnb3Ux+7QqynOxfVvarE+K+yi7BZyOSY4r+OZNWSWRiEwQ==, tarball: https://registry.npmjs.org/tsd/-/tsd-0.33.0.tgz} - engines: {node: '>=14.16'} - hasBin: true - - type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, tarball: https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz} - engines: {node: '>=10'} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, tarball: https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz} - engines: {node: '>=10'} - - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, tarball: https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, tarball: https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz} - engines: {node: '>=8'} - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==, tarball: https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz} engines: {node: '>=14.17'} @@ -875,9 +449,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, tarball: https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, tarball: https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, tarball: https://registry.npmjs.org/which/-/which-2.0.2.tgz} engines: {node: '>= 8'} @@ -895,31 +466,16 @@ packages: resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==, tarball: https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz} engines: {node: '>=8.0'} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, tarball: https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz} - yallist@5.0.0: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==, tarball: https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz} engines: {node: '>=18'} - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, tarball: https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz} - engines: {node: '>=10'} - yargs-parser@22.0.0: resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==, tarball: https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz} engines: {node: ^20.19.0 || ^22.12.0 || >=23} snapshots: - '@babel/code-frame@7.29.7': - dependencies: - '@babel/helper-validator-identifier': 7.29.7 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/helper-validator-identifier@7.29.7': {} - '@biomejs/biome@2.5.10': optionalDependencies: '@biomejs/cli-darwin-arm64': 2.5.10 @@ -1034,68 +590,19 @@ snapshots: minipass: 7.1.3 optional: true - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.12 - '@malept/cross-spawn-promise@2.0.0': dependencies: cross-spawn: 7.0.6 - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 - - '@sinclair/typebox@0.27.12': {} - - '@tsd/typescript@5.9.3': {} - - '@types/eslint@7.29.0': - dependencies: - '@types/estree': 1.0.9 - '@types/json-schema': 7.0.15 - - '@types/estree@1.0.9': {} - - '@types/json-schema@7.0.15': {} - - '@types/minimist@1.2.5': {} - '@types/node@24.13.3': dependencies: undici-types: 7.18.2 - '@types/normalize-package-data@2.4.4': {} - '@xmldom/xmldom@0.9.12': {} abbrev@5.0.0: optional: true - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@5.2.0: {} - - array-union@2.1.0: {} - - arrify@1.0.1: {} - balanced-match@4.0.4: {} base64-js@1.5.1: {} @@ -1110,39 +617,16 @@ snapshots: dependencies: balanced-match: 4.0.4 - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - camelcase-keys@6.2.2: - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - - camelcase@5.3.1: {} - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - chownr@1.1.4: {} chownr@3.0.0: optional: true - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - commander@9.5.0: {} cross-spawn@7.0.6: @@ -1157,19 +641,6 @@ snapshots: optionalDependencies: supports-color: 7.2.0 - decamelize-keys@1.1.1: - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - - decamelize@1.2.0: {} - - diff-sequences@29.6.3: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - electron@43.4.1(supports-color@7.2.0): dependencies: '@electron-internal/extract-zip': 1.0.5 @@ -1178,8 +649,6 @@ snapshots: transitivePeerDependencies: - supports-color - emoji-regex@8.0.0: {} - end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -1191,40 +660,9 @@ snapshots: err-code@2.0.3: {} - error-ex@1.3.4: - dependencies: - is-arrayish: 0.2.1 - - es-errors@1.3.0: {} - - eslint-formatter-pretty@4.1.0: - dependencies: - '@types/eslint': 7.29.0 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - eslint-rule-docs: 1.1.235 - log-symbols: 4.1.0 - plur: 4.0.0 - string-width: 4.2.3 - supports-hyperlinks: 2.3.0 - - eslint-rule-docs@1.1.235: {} - exponential-backoff@3.1.3: optional: true - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fastq@1.20.1: - dependencies: - reusify: 1.1.0 - fdir@6.5.0(picomatch@4.0.5): optionalDependencies: picomatch: 4.0.5 @@ -1236,15 +674,6 @@ snapshots: dependencies: filename-reserved-regex: 3.0.0 - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - flora-colossus@3.0.2(supports-color@7.2.0): dependencies: debug: 4.4.3(supports-color@7.2.0) @@ -1253,8 +682,6 @@ snapshots: fs-constants@1.0.0: {} - function-bind@1.1.2: {} - galactus@2.0.2(supports-color@7.2.0): dependencies: debug: 4.4.3(supports-color@7.2.0) @@ -1262,71 +689,21 @@ snapshots: transitivePeerDependencies: - supports-color - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - glob@13.0.6: dependencies: minimatch: 10.2.6 minipass: 7.1.3 path-scurry: 2.0.2 - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - graceful-fs@4.2.11: {} - hard-rejection@2.1.0: {} - - has-flag@4.0.0: {} - - hasown@2.0.4: - dependencies: - function-bind: 1.1.2 - - hosted-git-info@2.8.9: {} - - hosted-git-info@4.1.0: - dependencies: - lru-cache: 6.0.0 + has-flag@4.0.0: + optional: true ieee754@1.2.1: {} - ignore@5.3.2: {} - - indent-string@4.0.0: {} - inherits@2.0.4: {} - irregular-plurals@3.5.0: {} - - is-arrayish@0.2.1: {} - - is-core-module@2.16.2: - dependencies: - hasown: 2.0.4 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@1.1.0: {} - - is-unicode-supported@0.1.0: {} - isbinaryfile@4.0.10: {} isexe@2.0.0: {} @@ -1334,78 +711,14 @@ snapshots: isexe@4.0.0: optional: true - jest-diff@29.7.0: - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-get-type@29.6.3: {} - - js-tokens@4.0.0: {} - - json-parse-even-better-errors@2.3.1: {} - junk@4.0.1: {} - kind-of@6.0.3: {} - - lines-and-columns@1.2.4: {} - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - lru-cache@11.5.2: {} - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - map-obj@1.0.1: {} - - map-obj@4.3.0: {} - - meow@9.0.0: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize: 1.2.0 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.2 - - min-indent@1.0.1: {} - minimatch@10.2.6: dependencies: brace-expansion: 5.0.9 - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - minimist@1.2.8: {} minipass@7.1.3: {} @@ -1446,20 +759,6 @@ snapshots: abbrev: 5.0.0 optional: true - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.12 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - - normalize-package-data@3.0.3: - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.16.2 - semver: 7.8.5 - validate-npm-package-license: 3.0.4 - npm-run-path@3.1.0: dependencies: path-key: 3.1.1 @@ -1468,42 +767,15 @@ snapshots: dependencies: wrappy: 1.0.2 - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-try@2.2.0: {} - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.29.7 - error-ex: 1.3.4 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - path-exists@4.0.0: {} - path-key@3.1.1: {} - path-parse@1.0.7: {} - path-scurry@2.0.2: dependencies: lru-cache: 11.5.2 minipass: 7.1.3 - path-type@4.0.0: {} - pe-library@1.0.1: {} - picocolors@1.1.1: {} - - picomatch@2.3.2: {} - picomatch@4.0.5: optional: true @@ -1513,10 +785,6 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 - plur@4.0.0: - dependencies: - irregular-plurals: 3.5.0 - postject@1.0.0-alpha.6: dependencies: commander: 9.5.0 @@ -1530,12 +798,6 @@ snapshots: pump: 3.0.4 tar-fs: 2.1.5 - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - proc-log@7.0.0: optional: true @@ -1551,59 +813,20 @@ snapshots: end-of-stream: 1.4.5 once: 1.4.0 - queue-microtask@1.2.3: {} - - quick-lru@4.0.1: {} - - react-is@18.3.1: {} - - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - resedit@2.0.3: dependencies: pe-library: 1.0.1 - resolve@1.22.12: - dependencies: - es-errors: 1.3.0 - is-core-module: 2.16.2 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - retry@0.12.0: {} - reusify@1.1.0: {} - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - safe-buffer@5.2.1: {} - semver@5.7.2: {} - semver@7.8.5: {} shebang-command@2.0.0: @@ -1612,40 +835,10 @@ snapshots: shebang-regex@3.0.0: {} - slash@3.0.0: {} - - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.23 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.23 - - spdx-license-ids@3.0.23: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - sumchecker@3.0.1(supports-color@7.2.0): dependencies: debug: 4.4.3(supports-color@7.2.0) @@ -1655,13 +848,7 @@ snapshots: supports-color@7.2.0: dependencies: has-flag: 4.0.0 - - supports-hyperlinks@2.3.0: - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - - supports-preserve-symlinks-flag@1.0.0: {} + optional: true tar-fs@2.1.5: dependencies: @@ -1693,30 +880,6 @@ snapshots: picomatch: 4.0.5 optional: true - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - trim-newlines@3.0.1: {} - - tsd@0.33.0: - dependencies: - '@tsd/typescript': 5.9.3 - eslint-formatter-pretty: 4.1.0 - globby: 11.1.0 - jest-diff: 29.7.0 - meow: 9.0.0 - path-exists: 4.0.0 - read-pkg-up: 7.0.1 - - type-fest@0.18.1: {} - - type-fest@0.21.3: {} - - type-fest@0.6.0: {} - - type-fest@0.8.1: {} - typescript@5.9.3: {} undici-types@7.18.2: {} @@ -1729,11 +892,6 @@ snapshots: util-deprecate@1.0.2: {} - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -1747,11 +905,7 @@ snapshots: xmlbuilder@15.1.1: {} - yallist@4.0.0: {} - yallist@5.0.0: optional: true - yargs-parser@20.2.9: {} - yargs-parser@22.0.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d2fb6f7..d8c4918 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,8 +1,6 @@ blockExoticSubdeps: true lockfileIncludeTarballUrl: true minimumReleaseAge: '4320' # 3 days, in hours — supply-chain control -minimumReleaseAgeExclude: - - '@appthreat/*' optimisticRepeatInstall: true preferSymlinkedExecutables: false strictDepBuilds: true @@ -10,17 +8,6 @@ strictDepBuilds: true # trustPolicyIgnoreAfter window that D15 added for mocha's chokidar went # away with mocha in Deliverable 12. trustPolicy: no-downgrade -# Exact-version exceptions for tsd's (Deliverable 04) legacy jest-era -# dependency chain: these four predate npm provenance and their publishers -# never adopted it, so no-downgrade flags them forever. Pinned to -# package@version — each is the latest release inside the range tsd -# resolves, so any drift to a different version re-triggers the block -# rather than being silently covered. -trustPolicyExclude: - - 'read-pkg-up@7.0.1' - - 'read-pkg@5.2.0' - - 'normalize-package-data@2.5.0' - - 'semver@5.7.2' # pnpm 11 no longer reads the `pnpm` field in package.json; overrides and # built-dependency policy live here instead, even in a single-package repo. diff --git a/test/electron/asar.mjs b/test/electron/asar.mjs index 6f943cd..8267a55 100644 --- a/test/electron/asar.mjs +++ b/test/electron/asar.mjs @@ -57,7 +57,13 @@ function buildFixture() { cwd: root, stdio: 'pipe', }); - const tarball = join(work, 'appthreat-sqlite3-9.0.0.tgz'); + const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')); + // pnpm pack flattens the scope, keeping it: @appthreat/sqlite3 -> + // appthreat-sqlite3-.tgz + const tarball = join( + work, + `${pkg.name.replace(/^@/, '').replace('/', '-')}-${pkg.version}.tgz`, + ); if (!existsSync(tarball)) { throw new Error(`pnpm pack did not produce ${tarball}`); } diff --git a/types/consumer.check.ts b/types/consumer.check.ts index 05d8b49..5dd661d 100644 --- a/types/consumer.check.ts +++ b/types/consumer.check.ts @@ -1,5 +1,6 @@ // Consumer-side compile checks under strict + node16 resolution, -// complementing the tsd assertions: `await using` disposal, async +// complementing the type-identity assertions in sqlite3.check.ts: +// `await using` disposal, async // iteration, generic propagation, and the negatives the marshalling // rules promise (unsupported bind types, invalid configure literals). // Any line marked @ts-expect-error MUST fail; the file fails to compile diff --git a/types/sqlite3.check.ts b/types/sqlite3.check.ts new file mode 100644 index 0000000..44738ba --- /dev/null +++ b/types/sqlite3.check.ts @@ -0,0 +1,537 @@ +// Type-identity tests for the generated declarations, compiled by +// `tsc --noEmit` via `pnpm run test:types`. Callbacks are written +// contextually: their parameter types come from the declarations, so a +// signature change anywhere in the pipeline fails here. +// +// expectTypeOf(expr).toEqualTypeOf() is a strict identity check — +// literal vs widened, any vs concrete, mutable vs readonly all mismatch — +// expressed entirely in the type system. It replaces the tsd runner this +// file used, which vendored its own compiler and dragged a jest-era +// dependency chain (read-pkg-up -> normalize-package-data -> semver@5). + +import type { Readable } from 'node:stream'; + +import type { + Backup, + Database, + FetchCallback, + IntegerMode, + PromiseRunResult, + Row, + SignalOptions, + sqlite3 as Sqlite3Namespace, + SqliteError, + Statement, + StatementRunSyncResult, + TransactionOptions, +} from '../lib/sqlite3.js'; +import sqlite3 from '../lib/sqlite3.js'; + +// The classic deferred-conditional identity test: two types are equal +// only if their naked conditional probes are mutually assignable. +type Equals = + (() => T extends A ? 1 : 2) extends () => T extends B ? 1 : 2 + ? true + : false; + +declare function expectTypeOf(value: Actual): { + // A mismatch makes the rest parameter required, so the bare call + // fails with "Expected 1 arguments, but got 0" on the assertion's + // own line. Actual is inferred by the outer call — a single + // expectType(expr) shape cannot work, because an explicitly + // given type argument makes every other parameter fall back to its + // default instead of inferring. + toEqualTypeOf( + ...mismatch: Equals extends true + ? [] + : [ + 'type mismatch: expression type is not identical to the type argument', + ] + ): void; +}; + +declare const db: Database; +declare const stmt: Statement; +declare const err: SqliteError; +declare const signal: AbortSignal; + +// --- Namespace object ----------------------------------------------------- + +// Constants carry their literal values, so flag arithmetic is checkable. +expectTypeOf(sqlite3.OPEN_READONLY).toEqualTypeOf<1>(); +expectTypeOf(sqlite3.OPEN_READWRITE).toEqualTypeOf<2>(); +expectTypeOf(sqlite3.OPEN_CREATE).toEqualTypeOf<4>(); +expectTypeOf(sqlite3.CONSTRAINT_PRIMARYKEY).toEqualTypeOf<1555>(); +expectTypeOf(sqlite3.VERSION).toEqualTypeOf<'3.53.4'>(); +expectTypeOf(sqlite3.VERSION_NUMBER).toEqualTypeOf<3053004>(); +expectTypeOf(sqlite3.LIMIT_WORKER_THREADS).toEqualTypeOf<11>(); + +// verbose() returns the same namespace shape. +expectTypeOf(sqlite3.verbose()).toEqualTypeOf(); + +// cached.Database reuses or opens connections; the registry is public. +expectTypeOf(sqlite3.cached.Database('file.db')).toEqualTypeOf(); +expectTypeOf(sqlite3.cached.objects).toEqualTypeOf>(); + +// open is the promise-native constructor form. +expectTypeOf(sqlite3.open('file.db')).toEqualTypeOf>(); +expectTypeOf(sqlite3.open('file.db', sqlite3.OPEN_READONLY)).toEqualTypeOf< + Promise +>(); + +// --- Database: callback mode --------------------------------------------- + +expectTypeOf( + db.run('INSERT INTO t VALUES (?)', 1, (e) => { + expectTypeOf(e).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf( + db.run('INSERT INTO t VALUES (?)', [1], (e) => { + expectTypeOf(e).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf( + db.get('SELECT 1', (e, row) => { + expectTypeOf(e).toEqualTypeOf(); + expectTypeOf(row).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf( + db.all('SELECT 1', (e, rows) => { + expectTypeOf(e).toEqualTypeOf(); + expectTypeOf(rows).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf( + db.each( + 'SELECT 1', + (e, row) => { + expectTypeOf(e).toEqualTypeOf(); + expectTypeOf(row).toEqualTypeOf(); + }, + (e, count) => { + expectTypeOf(e).toEqualTypeOf(); + expectTypeOf(count).toEqualTypeOf(); + }, + ), +).toEqualTypeOf(); +expectTypeOf( + db.exec('CREATE TABLE t (a)', (e) => { + expectTypeOf(e).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf(db.prepare('SELECT 1')).toEqualTypeOf(); +expectTypeOf( + db.prepare('SELECT ?', 1, () => undefined), +).toEqualTypeOf(); + +// --- Database: promise mode with bound parameters (D03 follow-up) -------- + +expectTypeOf(db.run('INSERT INTO t VALUES (?)')).toEqualTypeOf< + Promise +>(); +expectTypeOf(db.run('INSERT INTO t VALUES (?)', 1)).toEqualTypeOf< + Promise +>(); +expectTypeOf(db.run('INSERT INTO t VALUES (?)', [1])).toEqualTypeOf< + Promise +>(); +expectTypeOf(db.run('INSERT INTO t VALUES (?)', 1, { signal })).toEqualTypeOf< + Promise +>(); +expectTypeOf(db.run('INSERT INTO t VALUES (?)', [1], { signal })).toEqualTypeOf< + Promise +>(); + +expectTypeOf(db.get('SELECT 1')).toEqualTypeOf>(); +expectTypeOf(db.get('SELECT 1', 1)).toEqualTypeOf>(); +expectTypeOf(db.get('SELECT 1', [1])).toEqualTypeOf>(); +expectTypeOf(db.get('SELECT 1', 1, { signal })).toEqualTypeOf< + Promise +>(); + +expectTypeOf(db.all('SELECT 1')).toEqualTypeOf>(); +expectTypeOf(db.all('SELECT 1', 1)).toEqualTypeOf>(); +expectTypeOf(db.all('SELECT 1', [1], { signal })).toEqualTypeOf< + Promise +>(); + +expectTypeOf(db.map('SELECT 1')).toEqualTypeOf< + Promise> +>(); +expectTypeOf(db.map('SELECT 1', 1, { signal })).toEqualTypeOf< + Promise> +>(); + +expectTypeOf(db.exec('CREATE TABLE t (a)')).toEqualTypeOf>(); +expectTypeOf(db.exec('CREATE TABLE t (a)', { signal })).toEqualTypeOf< + Promise +>(); +expectTypeOf(db.close()).toEqualTypeOf>(); +expectTypeOf(db.wait()).toEqualTypeOf>(); +expectTypeOf(db.loadExtension('ext.so')).toEqualTypeOf>(); + +// Generic propagation: the type argument flows through every promise form. +expectTypeOf(db.get<{ a: number }>('SELECT a')).toEqualTypeOf< + Promise<{ a: number } | undefined> +>(); +expectTypeOf(db.get<{ a: number }>('SELECT a', 1)).toEqualTypeOf< + Promise<{ a: number } | undefined> +>(); +expectTypeOf(db.all<{ a: number }>('SELECT a')).toEqualTypeOf< + Promise<{ a: number }[]> +>(); +expectTypeOf(db.all<{ a: number }>('SELECT a', 1, { signal })).toEqualTypeOf< + Promise<{ a: number }[]> +>(); +// and through the callback forms. +expectTypeOf( + db.get<{ a: number }>('SELECT a', (e, row) => { + expectTypeOf(e).toEqualTypeOf(); + expectTypeOf(row).toEqualTypeOf<{ a: number } | undefined>(); + }), +).toEqualTypeOf(); + +// --- Database: sync fast path -------------------------------------------- + +expectTypeOf(db.getSync('SELECT 1')).toEqualTypeOf(); +expectTypeOf(db.getSync<{ a: number }>('SELECT a')).toEqualTypeOf< + { a: number } | undefined +>(); +// lastID is number | bigint: it applies the connection's integer mode. +expectTypeOf(db.runSync('SELECT 1')).toEqualTypeOf(); +expectTypeOf(db.allSync('SELECT 1')).toEqualTypeOf(); +expectTypeOf(db.allSync<{ a: number }>('SELECT a')).toEqualTypeOf< + { a: number }[] +>(); +expectTypeOf(db.prepareSync('SELECT 1')).toEqualTypeOf(); +// rowMode: 'array' opts into the bulk-reader row shape (arrays). +expectTypeOf(db.getSync('SELECT 1', { rowMode: 'array' })).toEqualTypeOf< + unknown[] | undefined +>(); +expectTypeOf(db.allSync('SELECT 1', { rowMode: 'array' })).toEqualTypeOf< + unknown[][] +>(); +expectTypeOf( + db.allSync('SELECT a FROM t WHERE b = ?', 5, { rowMode: 'array' }), +).toEqualTypeOf(); + +// --- Database: statement cache, backup, transactions, iteration ---------- + +expectTypeOf(db.cacheStatements()).toEqualTypeOf(); +expectTypeOf(db.cacheStatements(128)).toEqualTypeOf(); +expectTypeOf(db.backup('copy.db')).toEqualTypeOf(); +expectTypeOf( + db.backup('copy.db', 'main', 'main', true, () => undefined), +).toEqualTypeOf(); + +expectTypeOf(db.iterate('SELECT 1')).toEqualTypeOf< + AsyncIterableIterator +>(); +expectTypeOf(db.iterate('SELECT 1', 1)).toEqualTypeOf< + AsyncIterableIterator +>(); +expectTypeOf(db.iterate('SELECT 1', [1])).toEqualTypeOf< + AsyncIterableIterator +>(); +expectTypeOf(db.iterate('SELECT 1', 1, { signal })).toEqualTypeOf< + AsyncIterableIterator +>(); + +expectTypeOf(db.stream('SELECT 1')).toEqualTypeOf(); +expectTypeOf(db.stream('SELECT 1', 1, { signal })).toEqualTypeOf(); + +expectTypeOf( + db.transaction(async (tx) => { + expectTypeOf(tx).toEqualTypeOf(); + return { a: 1 }; + }), +).toEqualTypeOf>(); +expectTypeOf(db.transaction(async () => undefined)).toEqualTypeOf< + Promise +>(); +const txOptions: TransactionOptions = { + mode: 'immediate', + savepoint: true, + serialize: false, + signal, +}; +expectTypeOf(db.transaction(async () => undefined, txOptions)).toEqualTypeOf< + Promise +>(); +const signalOptions: SignalOptions = { signal }; +expectTypeOf(signalOptions).toEqualTypeOf(); + +// --- Database: events, accessors, disposal ------------------------------- + +expectTypeOf( + db.on('trace', (sql) => { + expectTypeOf(sql).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf( + db.on('profile', (sql, time) => { + expectTypeOf(sql).toEqualTypeOf(); + expectTypeOf(time).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf( + db.on('change', (type, database, table, rowid) => { + expectTypeOf(type).toEqualTypeOf(); + expectTypeOf(database).toEqualTypeOf(); + expectTypeOf(table).toEqualTypeOf(); + expectTypeOf(rowid).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf( + db.on('error', (e) => { + expectTypeOf(e).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf(db.on('open', () => undefined)).toEqualTypeOf(); + +expectTypeOf(db.open).toEqualTypeOf(); +expectTypeOf(db.filename).toEqualTypeOf(); +expectTypeOf(db.mode).toEqualTypeOf(); +expectTypeOf(db.integerMode).toEqualTypeOf(); +expectTypeOf(db.configure('integerMode', 'mixed')).toEqualTypeOf(); +expectTypeOf(db.configure('busyTimeout', 1000)).toEqualTypeOf(); +expectTypeOf( + db.configure('limit', sqlite3.LIMIT_LENGTH, 1 << 30), +).toEqualTypeOf(); +expectTypeOf(db.interrupt()).toEqualTypeOf(); +expectTypeOf(db.serialize()).toEqualTypeOf(); +expectTypeOf(db.parallelize()).toEqualTypeOf(); +expectTypeOf(db[Symbol.asyncDispose]()).toEqualTypeOf>(); + +// --- Statement: callback mode (contextual) -------------------------------- + +expectTypeOf( + stmt.bind(1, (e) => { + expectTypeOf(e).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf( + stmt.run(1, (e) => { + expectTypeOf(e).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf( + stmt.get(1, (e, row) => { + expectTypeOf(e).toEqualTypeOf(); + expectTypeOf(row).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf( + stmt.all(1, (e, rows) => { + expectTypeOf(e).toEqualTypeOf(); + expectTypeOf(rows).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf( + // biome-ignore lint/suspicious/useIterableCallbackReturn: Statement#map is the row-mapping SQL method, not Array#map + stmt.map((e, map) => { + expectTypeOf(e).toEqualTypeOf(); + expectTypeOf(map).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf( + stmt.reset((e) => { + expectTypeOf(e).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf(stmt.finalize(() => undefined)).toEqualTypeOf(); + +// --- Statement: promise mode with bound parameters ----------------------- + +expectTypeOf(stmt.bind()).toEqualTypeOf>(); +expectTypeOf(stmt.bind(1)).toEqualTypeOf>(); +expectTypeOf(stmt.bind([1])).toEqualTypeOf>(); +expectTypeOf(stmt.run()).toEqualTypeOf>(); +expectTypeOf(stmt.run(1)).toEqualTypeOf>(); +expectTypeOf(stmt.run([1])).toEqualTypeOf>(); +expectTypeOf(stmt.run(1, { signal })).toEqualTypeOf< + Promise +>(); +expectTypeOf(stmt.get()).toEqualTypeOf>(); +expectTypeOf(stmt.get(1)).toEqualTypeOf>(); +expectTypeOf(stmt.get(1, { signal })).toEqualTypeOf>(); +expectTypeOf(stmt.all()).toEqualTypeOf>(); +expectTypeOf(stmt.all(1, { signal })).toEqualTypeOf>(); +expectTypeOf(stmt.map(1, { signal })).toEqualTypeOf< + Promise> +>(); +expectTypeOf(stmt.reset()).toEqualTypeOf>(); +expectTypeOf(stmt.finalize()).toEqualTypeOf>(); + +// fetch, iteration, sync, accessors +expectTypeOf( + stmt.fetch(100, (e, rows, done) => { + expectTypeOf(e).toEqualTypeOf(); + expectTypeOf(rows).toEqualTypeOf(); + expectTypeOf(done).toEqualTypeOf(); + }), +).toEqualTypeOf(); +const fetchCallback: FetchCallback = (e, rows, done) => { + expectTypeOf(e).toEqualTypeOf(); + expectTypeOf(rows).toEqualTypeOf(); + expectTypeOf(done).toEqualTypeOf(); +}; +void fetchCallback; +expectTypeOf( + stmt.fetch(100, 1, (e, rows, done) => { + expectTypeOf(e).toEqualTypeOf(); + expectTypeOf(rows).toEqualTypeOf(); + expectTypeOf(done).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf(stmt.iterate()).toEqualTypeOf>(); +expectTypeOf(stmt.iterate(1)).toEqualTypeOf>(); +expectTypeOf(stmt.iterate(1, { signal })).toEqualTypeOf< + AsyncIterableIterator +>(); +expectTypeOf(stmt.getSync(1)).toEqualTypeOf(); +expectTypeOf(stmt.allSync(1)).toEqualTypeOf(); +expectTypeOf(stmt.getSync(1, { rowMode: 'array' })).toEqualTypeOf< + unknown[] | undefined +>(); +expectTypeOf(stmt.allSync({ rowMode: 'array' })).toEqualTypeOf(); +expectTypeOf(stmt.runSync(1)).toEqualTypeOf(); +expectTypeOf(stmt.sql).toEqualTypeOf(); +expectTypeOf(stmt.lastID).toEqualTypeOf(); +expectTypeOf(stmt.lastIDBigInt).toEqualTypeOf(); +expectTypeOf(stmt.changes).toEqualTypeOf(); +expectTypeOf(stmt[Symbol.asyncDispose]()).toEqualTypeOf>(); +expectTypeOf(stmt[Symbol.dispose]()).toEqualTypeOf(); + +// --- Backup --------------------------------------------------------------- + +declare const backup: Backup; +expectTypeOf( + backup.step(1, (e, completed) => { + expectTypeOf(e).toEqualTypeOf(); + expectTypeOf(completed).toEqualTypeOf(); + }), +).toEqualTypeOf(); +expectTypeOf(backup.finish(() => undefined)).toEqualTypeOf(); +expectTypeOf(backup.step(1)).toEqualTypeOf>(); +expectTypeOf(backup.finish()).toEqualTypeOf>(); +expectTypeOf(backup.idle).toEqualTypeOf(); +expectTypeOf(backup.completed).toEqualTypeOf(); +expectTypeOf(backup.failed).toEqualTypeOf(); +expectTypeOf(backup.remaining).toEqualTypeOf(); +expectTypeOf(backup.pageCount).toEqualTypeOf(); +expectTypeOf(backup.retryErrors).toEqualTypeOf(); +expectTypeOf(backup.filename).toEqualTypeOf(); +expectTypeOf(backup.sourceName).toEqualTypeOf(); +expectTypeOf(backup.destName).toEqualTypeOf(); +expectTypeOf(backup.filenameIsDest).toEqualTypeOf(); +expectTypeOf(backup[Symbol.asyncDispose]()).toEqualTypeOf>(); + +// --- User-defined functions, aggregates, collations ------------------------ + +import type { AggregateDefinition, FunctionOptions } from '../lib/sqlite3.js'; + +expectTypeOf( + db.function('regexp', (_pattern, _value) => 1), +).toEqualTypeOf(); +expectTypeOf( + db.function('regexp', { deterministic: true }, (_p) => 1), +).toEqualTypeOf(); +expectTypeOf( + db.function('seventh', { varargs: true }, (..._args: unknown[]) => 1), +).toEqualTypeOf(); +expectTypeOf( + db.aggregate('median', { + start: () => [], + step: (acc, _v) => acc, + result: (acc) => acc, + inverse: (acc, _v) => acc, + }), +).toEqualTypeOf(); +expectTypeOf( + db.collation('german', (a, b) => a.localeCompare(b, 'de')), +).toEqualTypeOf(); +expectTypeOf(db.removeFunction('regexp')).toEqualTypeOf(); +expectTypeOf(db.removeCollation('german')).toEqualTypeOf(); + +// The option and aggregate types are exported from the package root. +declare const opts: FunctionOptions; +expectTypeOf(opts.deterministic).toEqualTypeOf(); +expectTypeOf(opts.directOnly).toEqualTypeOf(); +expectTypeOf(opts.innocuous).toEqualTypeOf(); +expectTypeOf(opts.varargs).toEqualTypeOf(); +declare const spec: AggregateDefinition; +// Assignability (not invocation: the implementations are `this: undefined`). +const aggStart: (this: undefined) => unknown = spec.start; +const aggStep: (this: undefined, acc: unknown, ...args: unknown[]) => unknown = + spec.step; +const aggResult: (this: undefined, acc: unknown) => unknown = spec.result; +type InverseFn = (this: undefined, acc: unknown, ...args: unknown[]) => unknown; +const aggInverse: InverseFn | undefined = spec.inverse; +void aggStart; +void aggStep; +void aggResult; +void aggInverse; +// The aggregate definition carries the function options. +declare const asOptions: FunctionOptions; +const withFlags: AggregateDefinition = { + deterministic: true, + ...asOptions, + start: () => 0, + step: (acc) => acc, + result: (acc) => acc, +}; +void withFlags; + +// --- Errors ---------------------------------------------------------------- + +expectTypeOf(err.code).toEqualTypeOf(); +expectTypeOf(err.primaryCode).toEqualTypeOf(); +expectTypeOf(err.errno).toEqualTypeOf(); +expectTypeOf(err.message).toEqualTypeOf(); + +// --- Worker pool (Deliverable 09) ------------------------------------------- + +import type { + PoolOptions, + PoolQueryOptions, + SqlitePool, +} from '../lib/sqlite3.js'; + +// The factory resolves a fully-typed pool. +declare const poolPromise: Promise; +expectTypeOf(sqlite3.pool('app.db')).toEqualTypeOf>(); +expectTypeOf(sqlite3.pool('app.db', { readers: 2 })).toEqualTypeOf< + Promise +>(); +expectTypeOf(poolPromise).toEqualTypeOf>(); + +// The option surface is closed over the declared keys. +declare const poolOpts: PoolOptions; +expectTypeOf(poolOpts.readers).toEqualTypeOf(); +expectTypeOf(poolOpts.walMode).toEqualTypeOf(); +expectTypeOf(poolOpts.busyTimeout).toEqualTypeOf(); +expectTypeOf(poolOpts.integerMode).toEqualTypeOf< + 'number' | 'bigint' | 'mixed' | undefined +>(); + +// Query options carry the signal. +declare const queryOpts: PoolQueryOptions; +expectTypeOf(queryOpts.signal).toEqualTypeOf(); + +// The query surface. +declare const p: SqlitePool; +expectTypeOf(p.read('SELECT a')).toEqualTypeOf>(); +expectTypeOf(p.get('SELECT a')).toEqualTypeOf>(); +expectTypeOf(p.write('INSERT')).toEqualTypeOf< + Promise +>(); +expectTypeOf(p.exec('VACUUM')).toEqualTypeOf>(); +expectTypeOf(p.transaction(async () => 42)).toEqualTypeOf>(); +expectTypeOf(p.filename).toEqualTypeOf(); +expectTypeOf(p.readers).toEqualTypeOf(); +expectTypeOf(p.closed).toEqualTypeOf(); +expectTypeOf(p.close()).toEqualTypeOf>(); +expectTypeOf(p[Symbol.asyncDispose]()).toEqualTypeOf>(); diff --git a/types/sqlite3.test-d.ts b/types/sqlite3.test-d.ts deleted file mode 100644 index ea4228b..0000000 --- a/types/sqlite3.test-d.ts +++ /dev/null @@ -1,450 +0,0 @@ -// Type tests for the generated declarations, run by tsd via -// `pnpm run test:types`. Callbacks are written contextually: their -// parameter types come from the declarations, so a signature change -// anywhere in the pipeline fails here. - -import type { Readable } from 'node:stream'; - -import { expectType } from 'tsd'; - -import type { - Backup, - Database, - FetchCallback, - IntegerMode, - PromiseRunResult, - Row, - SignalOptions, - sqlite3 as Sqlite3Namespace, - SqliteError, - Statement, - StatementRunSyncResult, - TransactionOptions, -} from '../lib/sqlite3.js'; -import sqlite3 from '../lib/sqlite3.js'; - -declare const db: Database; -declare const stmt: Statement; -declare const err: SqliteError; -declare const signal: AbortSignal; - -// --- Namespace object ----------------------------------------------------- - -// Constants carry their literal values, so flag arithmetic is checkable. -expectType<1>(sqlite3.OPEN_READONLY); -expectType<2>(sqlite3.OPEN_READWRITE); -expectType<4>(sqlite3.OPEN_CREATE); -expectType<1555>(sqlite3.CONSTRAINT_PRIMARYKEY); -expectType<'3.53.4'>(sqlite3.VERSION); -expectType<3053004>(sqlite3.VERSION_NUMBER); -expectType<11>(sqlite3.LIMIT_WORKER_THREADS); - -// verbose() returns the same namespace shape. -expectType(sqlite3.verbose()); - -// cached.Database reuses or opens connections; the registry is public. -expectType(sqlite3.cached.Database('file.db')); -expectType>(sqlite3.cached.objects); - -// open is the promise-native constructor form. -expectType>(sqlite3.open('file.db')); -expectType>(sqlite3.open('file.db', sqlite3.OPEN_READONLY)); - -// --- Database: callback mode --------------------------------------------- - -expectType( - db.run('INSERT INTO t VALUES (?)', 1, (e) => { - expectType(e); - }), -); -expectType( - db.run('INSERT INTO t VALUES (?)', [1], (e) => { - expectType(e); - }), -); -expectType( - db.get('SELECT 1', (e, row) => { - expectType(e); - expectType(row); - }), -); -expectType( - db.all('SELECT 1', (e, rows) => { - expectType(e); - expectType(rows); - }), -); -expectType( - db.each( - 'SELECT 1', - (e, row) => { - expectType(e); - expectType(row); - }, - (e, count) => { - expectType(e); - expectType(count); - }, - ), -); -expectType( - db.exec('CREATE TABLE t (a)', (e) => { - expectType(e); - }), -); -expectType(db.prepare('SELECT 1')); -expectType(db.prepare('SELECT ?', 1, () => undefined)); - -// --- Database: promise mode with bound parameters (D03 follow-up) -------- - -expectType>(db.run('INSERT INTO t VALUES (?)')); -expectType>(db.run('INSERT INTO t VALUES (?)', 1)); -expectType>(db.run('INSERT INTO t VALUES (?)', [1])); -expectType>( - db.run('INSERT INTO t VALUES (?)', 1, { signal }), -); -expectType>( - db.run('INSERT INTO t VALUES (?)', [1], { signal }), -); - -expectType>(db.get('SELECT 1')); -expectType>(db.get('SELECT 1', 1)); -expectType>(db.get('SELECT 1', [1])); -expectType>(db.get('SELECT 1', 1, { signal })); - -expectType>(db.all('SELECT 1')); -expectType>(db.all('SELECT 1', 1)); -expectType>(db.all('SELECT 1', [1], { signal })); - -expectType>>(db.map('SELECT 1')); -expectType>>(db.map('SELECT 1', 1, { signal })); - -expectType>(db.exec('CREATE TABLE t (a)')); -expectType>(db.exec('CREATE TABLE t (a)', { signal })); -expectType>(db.close()); -expectType>(db.wait()); -expectType>(db.loadExtension('ext.so')); - -// Generic propagation: the type argument flows through every promise form. -expectType>( - db.get<{ a: number }>('SELECT a'), -); -expectType>( - db.get<{ a: number }>('SELECT a', 1), -); -expectType>(db.all<{ a: number }>('SELECT a')); -expectType>( - db.all<{ a: number }>('SELECT a', 1, { signal }), -); -// and through the callback forms. -expectType( - db.get<{ a: number }>('SELECT a', (e, row) => { - expectType(e); - expectType<{ a: number } | undefined>(row); - }), -); - -// --- Database: sync fast path -------------------------------------------- - -expectType(db.getSync('SELECT 1')); -expectType<{ a: number } | undefined>(db.getSync<{ a: number }>('SELECT a')); -// lastID is number | bigint: it applies the connection's integer mode. -expectType(db.runSync('SELECT 1')); -expectType(db.allSync('SELECT 1')); -expectType<{ a: number }[]>(db.allSync<{ a: number }>('SELECT a')); -expectType(db.prepareSync('SELECT 1')); -// rowMode: 'array' opts into the bulk-reader row shape (arrays). -expectType(db.getSync('SELECT 1', { rowMode: 'array' })); -expectType(db.allSync('SELECT 1', { rowMode: 'array' })); -expectType( - db.allSync('SELECT a FROM t WHERE b = ?', 5, { rowMode: 'array' }), -); - -// --- Database: statement cache, backup, transactions, iteration ---------- - -expectType(db.cacheStatements()); -expectType(db.cacheStatements(128)); -expectType(db.backup('copy.db')); -expectType(db.backup('copy.db', 'main', 'main', true, () => undefined)); - -expectType>(db.iterate('SELECT 1')); -expectType>(db.iterate('SELECT 1', 1)); -expectType>(db.iterate('SELECT 1', [1])); -expectType>(db.iterate('SELECT 1', 1, { signal })); - -expectType(db.stream('SELECT 1')); -expectType(db.stream('SELECT 1', 1, { signal })); - -expectType>( - db.transaction(async (tx) => { - expectType(tx); - return { a: 1 }; - }), -); -expectType>(db.transaction(async () => undefined)); -const txOptions: TransactionOptions = { - mode: 'immediate', - savepoint: true, - serialize: false, - signal, -}; -expectType>( - db.transaction(async () => undefined, txOptions), -); -const signalOptions: SignalOptions = { signal }; -expectType(signalOptions); - -// --- Database: events, accessors, disposal ------------------------------- - -expectType( - db.on('trace', (sql) => { - expectType(sql); - }), -); -expectType( - db.on('profile', (sql, time) => { - expectType(sql); - expectType(time); - }), -); -expectType( - db.on('change', (type, database, table, rowid) => { - expectType(type); - expectType(database); - expectType(table); - expectType(rowid); - }), -); -expectType( - db.on('error', (e) => { - expectType(e); - }), -); -expectType(db.on('open', () => undefined)); - -expectType(db.open); -expectType(db.filename); -expectType(db.mode); -expectType(db.integerMode); -expectType(db.configure('integerMode', 'mixed')); -expectType(db.configure('busyTimeout', 1000)); -expectType(db.configure('limit', sqlite3.LIMIT_LENGTH, 1 << 30)); -expectType(db.interrupt()); -expectType(db.serialize()); -expectType(db.parallelize()); -expectType>(db[Symbol.asyncDispose]()); - -// --- Statement: callback mode (contextual) -------------------------------- - -expectType( - stmt.bind(1, (e) => { - expectType(e); - }), -); -expectType( - stmt.run(1, (e) => { - expectType(e); - }), -); -expectType( - stmt.get(1, (e, row) => { - expectType(e); - expectType(row); - }), -); -expectType( - stmt.all(1, (e, rows) => { - expectType(e); - expectType(rows); - }), -); -expectType( - // biome-ignore lint/suspicious/useIterableCallbackReturn: Statement#map is the row-mapping SQL method, not Array#map - stmt.map((e, map) => { - expectType(e); - expectType(map); - }), -); -expectType( - stmt.reset((e) => { - expectType(e); - }), -); -expectType(stmt.finalize(() => undefined)); - -// --- Statement: promise mode with bound parameters ----------------------- - -expectType>(stmt.bind()); -expectType>(stmt.bind(1)); -expectType>(stmt.bind([1])); -expectType>(stmt.run()); -expectType>(stmt.run(1)); -expectType>(stmt.run([1])); -expectType>(stmt.run(1, { signal })); -expectType>(stmt.get()); -expectType>(stmt.get(1)); -expectType>(stmt.get(1, { signal })); -expectType>(stmt.all()); -expectType>(stmt.all(1, { signal })); -expectType>>(stmt.map(1, { signal })); -expectType>(stmt.reset()); -expectType>(stmt.finalize()); - -// fetch, iteration, sync, accessors -expectType( - stmt.fetch(100, (e, rows, done) => { - expectType(e); - expectType(rows); - expectType(done); - }), -); -const fetchCallback: FetchCallback = (e, rows, done) => { - expectType(e); - expectType(rows); - expectType(done); -}; -void fetchCallback; -expectType( - stmt.fetch(100, 1, (e, rows, done) => { - expectType(e); - expectType(rows); - expectType(done); - }), -); -expectType>(stmt.iterate()); -expectType>(stmt.iterate(1)); -expectType>(stmt.iterate(1, { signal })); -expectType(stmt.getSync(1)); -expectType(stmt.allSync(1)); -expectType(stmt.getSync(1, { rowMode: 'array' })); -expectType(stmt.allSync({ rowMode: 'array' })); -expectType(stmt.runSync(1)); -expectType(stmt.sql); -expectType(stmt.lastID); -expectType(stmt.lastIDBigInt); -expectType(stmt.changes); -expectType>(stmt[Symbol.asyncDispose]()); -expectType(stmt[Symbol.dispose]()); - -// --- Backup --------------------------------------------------------------- - -declare const backup: Backup; -expectType( - backup.step(1, (e, completed) => { - expectType(e); - expectType(completed); - }), -); -expectType(backup.finish(() => undefined)); -expectType>(backup.step(1)); -expectType>(backup.finish()); -expectType(backup.idle); -expectType(backup.completed); -expectType(backup.failed); -expectType(backup.remaining); -expectType(backup.pageCount); -expectType(backup.retryErrors); -expectType(backup.filename); -expectType(backup.sourceName); -expectType(backup.destName); -expectType(backup.filenameIsDest); -expectType>(backup[Symbol.asyncDispose]()); - -// --- User-defined functions, aggregates, collations ------------------------ - -import type { AggregateDefinition, FunctionOptions } from '../lib/sqlite3.js'; - -expectType(db.function('regexp', (_pattern, _value) => 1)); -expectType(db.function('regexp', { deterministic: true }, (_p) => 1)); -expectType( - db.function('seventh', { varargs: true }, (..._args: unknown[]) => 1), -); -expectType( - db.aggregate('median', { - start: () => [], - step: (acc, _v) => acc, - result: (acc) => acc, - inverse: (acc, _v) => acc, - }), -); -expectType( - db.collation('german', (a, b) => a.localeCompare(b, 'de')), -); -expectType(db.removeFunction('regexp')); -expectType(db.removeCollation('german')); - -// The option and aggregate types are exported from the package root. -declare const opts: FunctionOptions; -expectType(opts.deterministic); -expectType(opts.directOnly); -expectType(opts.innocuous); -expectType(opts.varargs); -declare const spec: AggregateDefinition; -// Assignability (not invocation: the implementations are `this: undefined`). -const aggStart: (this: undefined) => unknown = spec.start; -const aggStep: (this: undefined, acc: unknown, ...args: unknown[]) => unknown = - spec.step; -const aggResult: (this: undefined, acc: unknown) => unknown = spec.result; -type InverseFn = (this: undefined, acc: unknown, ...args: unknown[]) => unknown; -const aggInverse: InverseFn | undefined = spec.inverse; -void aggStart; -void aggStep; -void aggResult; -void aggInverse; -// The aggregate definition carries the function options. -declare const asOptions: FunctionOptions; -const withFlags: AggregateDefinition = { - deterministic: true, - ...asOptions, - start: () => 0, - step: (acc) => acc, - result: (acc) => acc, -}; -void withFlags; - -// --- Errors ---------------------------------------------------------------- - -expectType(err.code); -expectType(err.primaryCode); -expectType(err.errno); -expectType(err.message); - -// --- Worker pool (Deliverable 09) ------------------------------------------- - -import type { - PoolOptions, - PoolQueryOptions, - SqlitePool, -} from '../lib/sqlite3.js'; - -// The factory resolves a fully-typed pool. -declare const poolPromise: Promise; -expectType>(sqlite3.pool('app.db')); -expectType>(sqlite3.pool('app.db', { readers: 2 })); -expectType>(poolPromise); - -// The option surface is closed over the declared keys. -declare const poolOpts: PoolOptions; -expectType(poolOpts.readers); -expectType(poolOpts.walMode); -expectType(poolOpts.busyTimeout); -expectType<'number' | 'bigint' | 'mixed' | undefined>(poolOpts.integerMode); - -// Query options carry the signal. -declare const queryOpts: PoolQueryOptions; -expectType(queryOpts.signal); - -// The query surface. -declare const p: SqlitePool; -expectType>(p.read('SELECT a')); -expectType>(p.get('SELECT a')); -expectType>( - p.write('INSERT'), -); -expectType>(p.exec('VACUUM')); -expectType>(p.transaction(async () => 42)); -expectType(p.filename); -expectType(p.readers); -expectType(p.closed); -expectType>(p.close()); -expectType>(p[Symbol.asyncDispose]());