From 418f058cb52000eab32f0c734d85756397fa03c9 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 15 Aug 2026 18:21:49 +0000 Subject: [PATCH 1/2] build!: bundle sqlite-shared, bump versions, complete the publish surface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Everything needed to publish the coordinated release in #167. sqlite-shared stays unpublished. docs/spec/adapters.md called it "an internal, non-public package", but record-adapter-sqlite declared it as a dependency and tsc emitted the import verbatim, so publishing that adapter would have required publishing sqlite-shared too — or shipped a package that cannot resolve. Bundling makes the documented intent true: - record-adapter-sqlite builds with tsup, inlining sqlite-shared and keeping @haverstack/core external. Inlining core would give the package its own copy of the error classes and break instanceof against the caller's copy. - sqlite-shared moves to devDependencies and is marked private. - SqlExecutor no longer appears in the emitted .d.ts. It was only ever reachable through an internal file that tsc happened to emit; the single-entry bundle drops it, so the public surface is now exactly the six intended symbols. Versions, for the packages already on npm: core 0.8.0 -> 0.9.0, and wire-types, adapter-local, blob-adapter-disk, adapter-api 0.6.0 -> 0.7.0. record-adapter-sqlite, conformance-fixtures and commons stay at 0.1.0 as first publishes. Adds the two missing publish scripts (record-adapter-sqlite, conformance-fixtures) and publish:all, which runs them in dependency order so no package is published before something it depends on. Adds scripts/verify-pack.mjs, run as verify:pack. It packs every publishable package, installs the tarballs into a throwaway project outside the workspace, and imports every entry point. This covers two things a green build cannot: that the subpath exports added in #168 resolve from a real tarball, and that sqlite-shared is absent from an installed tree. Both are silent-until-published failures. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01D5LtyME9WJky9jaB51tpjp --- AGENTS.md | 2 +- CONTRIBUTING.md | 6 +- docs/spec/adapters.md | 2 + package.json | 6 +- packages/adapter-api/package.json | 2 +- packages/adapter-local/package.json | 2 +- packages/blob-adapter-disk/package.json | 2 +- packages/core/package.json | 2 +- packages/record-adapter-sqlite/package.json | 7 +- packages/record-adapter-sqlite/tsup.config.ts | 24 + packages/sqlite-shared/package.json | 6 +- packages/wire-types/package.json | 2 +- pnpm-lock.yaml | 548 +++++++++++++++++- scripts/verify-pack.mjs | 179 ++++++ 14 files changed, 774 insertions(+), 16 deletions(-) create mode 100644 packages/record-adapter-sqlite/tsup.config.ts create mode 100644 scripts/verify-pack.mjs diff --git a/AGENTS.md b/AGENTS.md index 6f3f7be..9497563 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -68,7 +68,7 @@ This is about _our_ history. Genuinely foreign input — a third-party server's - **`Stack` is the invariant layer; adapters are storage engines.** Validation, `_config` protection, ID rules, migration policy, and permission checks live in `packages/core` so every adapter inherits them. Don't reimplement an invariant inside an adapter. (The one documented exception: the `_config` query exclusion must live in each adapter's own query predicate.) - **Package prefixes declare the contract**: `adapter-*` = full `StackAdapter`, `record-adapter-*` = `StackRecordAdapter`, `blob-adapter-*` = `StackBlobAdapter`. - **Optional capabilities are optional methods**, checked for truthiness at the call site with a documented fallback — never a boolean in `capabilities`. -- **Shared SQLite logic goes in `@haverstack/sqlite-shared`**, not duplicated across the two adapters. +- **Shared SQLite logic goes in `@haverstack/sqlite-shared`**, not duplicated across adapters. It is `private` and bundled into its consumers at build time, so it is never a `dependencies` entry and adding an export to it does not widen any package's public API. - **Wire behavior is pinned by `@haverstack/conformance-fixtures`** — pure data, consumed by both `adapter-api` and server implementations. Changing the wire contract means updating fixtures, spec, and implementation together. ## Tests diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 249b947..6c015ae 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -123,7 +123,9 @@ Note that this is about _our_ history, not about inputs we genuinely receive. Ha **Optional adapter capabilities follow one pattern**: an optional interface method, checked for truthiness at the call site, with a described fallback when absent — never a boolean flag in `capabilities`. `combineAdapters()` forwards an optional method only when the underlying part actually implements it. -**Logic shared between the two SQLite adapters goes in `@haverstack/sqlite-shared`**, an internal (unpublished-as-public-API) package. Keeping schema DDL, the cursor codec, and the CRUD logic in one place is what keeps the two engines from silently drifting and keeps a cursor minted by one decodable by the other. Only genuinely engine-specific code (WASM init vs. `DatabaseSync`, pragma setup, lifecycle) belongs in the adapter packages. +**Logic shared between SQLite-backed adapters goes in `@haverstack/sqlite-shared`**, an internal package. Keeping schema DDL, the cursor codec, and the CRUD logic in one place is what keeps engines from silently drifting and keeps a cursor minted by one decodable by another. Only genuinely engine-specific code (database construction, pragma setup, lifecycle) belongs in the adapter packages. + +The package is `private` and **bundled into its consumers at build time** — `record-adapter-sqlite` builds with `tsup` and inlines it, so nothing installing that adapter from the registry resolves `@haverstack/sqlite-shared`. Two consequences when working here: adding an export to `sqlite-shared` does not expand any package's public API, and a new SQLite adapter reuses it by living in this repository rather than by installing it. Adding a `dependencies` entry on it would undo that — it belongs in `devDependencies`. **Wire-format behavior is pinned by shared fixtures.** `@haverstack/conformance-fixtures` is pure data — no test framework, no adapter, no server. Two independent consumers exercise the same fixtures: `adapter-api`'s tests, and any server implementation. A change to the wire contract updates the fixtures, the spec, and the implementation together. @@ -152,7 +154,7 @@ docs/ commons/ # Schema Commons — shared, app-neutral record types packages/ core/ # Stack, ScopedStack, types, schema, validation, MemoryAdapter - sqlite-shared/ # Internal: shared SQL logic for SQLite-backed adapters + sqlite-shared/ # Internal: shared SQL logic, bundled into consumers, not published record-adapter-sqlite/ # Node native SQLite (node:sqlite), FTS5, WAL blob-adapter-disk/ # Content-addressed blobs on disk adapter-local/ # Convenience: SQLite records + disk blobs diff --git a/docs/spec/adapters.md b/docs/spec/adapters.md index 142c150..87fc46e 100644 --- a/docs/spec/adapters.md +++ b/docs/spec/adapters.md @@ -63,6 +63,8 @@ All adapters support the full Record API. Performance guarantees differ; correct **`@haverstack/sqlite-shared`** is an internal, non-public package holding everything a SQLite-backed record adapter needs that isn't specific to one binding — schema DDL, `WHERE`/`ORDER` building, the cursor codec, row mappers, the FTS5 sanitizer and indexing strategy, the storage-ownership lock, and (via a small `SqlExecutor` interface normalizing a binding's call convention) the actual CRUD/query/version/type/association/token logic itself. An adapter implements only what's genuinely engine-specific: database construction, pragma/WAL setup, and lifecycle. `record-adapter-sqlite` is its only consumer today; the split exists so a second SQLite engine inherits the behavior rather than reimplementing it, and so a cursor minted by one is decodable by another. +**It is bundled into its consumers rather than published.** "Non-public" is enforced, not merely intended: the package is `private`, and `record-adapter-sqlite` inlines it at build time, so a consumer installing that adapter from the registry never resolves `@haverstack/sqlite-shared` and cannot depend on it. `SqlExecutor` and the `Shared*Logic` classes are therefore internal collaborators of the adapters in this repository, not an extension point — a second SQLite engine inherits them by living here, not by installing them. Reversing that (publishing it so third-party adapters can build on `SqlExecutor`) is a deliberate decision to make it public API with the stability obligations that implies, not a packaging tweak. + `SqlExecutor` is synchronous. Every SQLite binding in scope executes queries in-process without yielding, and the shared logic's explicit `BEGIN`/`COMMIT` sequences depend on that — an engine reached over a network (D1, libsql over HTTP) does not fit this interface without making it async throughout. SQLite-backed adapters enable foreign-key enforcement (`PRAGMA foreign_keys = ON`) so that operations like `associate()` against a nonexistent record fail loudly (`StackNotFoundError`) instead of silently creating an orphan row. diff --git a/package.json b/package.json index 0208bc4..a115c81 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,11 @@ "publish:blob-adapter-disk": "pnpm --filter @haverstack/blob-adapter-disk publish --access public", "publish:api": "pnpm --filter @haverstack/adapter-api publish --access public", "publish:wire-types": "pnpm --filter @haverstack/wire-types publish --access public", - "publish:commons": "pnpm --filter @haverstack/commons publish --access public" + "publish:commons": "pnpm --filter @haverstack/commons publish --access public", + "publish:record-adapter-sqlite": "pnpm --filter @haverstack/record-adapter-sqlite publish --access public", + "publish:conformance-fixtures": "pnpm --filter @haverstack/conformance-fixtures publish --access public", + "publish:all": "pnpm run publish:core && pnpm run publish:wire-types && pnpm run publish:blob-adapter-disk && pnpm run publish:record-adapter-sqlite && pnpm run publish:commons && pnpm run publish:conformance-fixtures && pnpm run publish:adapter-local && pnpm run publish:api", + "verify:pack": "node scripts/verify-pack.mjs" }, "devDependencies": { "@eslint/js": "^10.0.1", diff --git a/packages/adapter-api/package.json b/packages/adapter-api/package.json index 1cd687a..6573b53 100644 --- a/packages/adapter-api/package.json +++ b/packages/adapter-api/package.json @@ -1,6 +1,6 @@ { "name": "@haverstack/adapter-api", - "version": "0.6.0", + "version": "0.7.0", "description": "Remote server adapter for Haverstack", "type": "module", "exports": { diff --git a/packages/adapter-local/package.json b/packages/adapter-local/package.json index 045b3d3..fed831f 100644 --- a/packages/adapter-local/package.json +++ b/packages/adapter-local/package.json @@ -1,6 +1,6 @@ { "name": "@haverstack/adapter-local", - "version": "0.6.0", + "version": "0.7.0", "description": "Local (SQLite + disk) stack adapter for Haverstack", "type": "module", "engines": { diff --git a/packages/blob-adapter-disk/package.json b/packages/blob-adapter-disk/package.json index 2fcae25..54b8a47 100644 --- a/packages/blob-adapter-disk/package.json +++ b/packages/blob-adapter-disk/package.json @@ -1,6 +1,6 @@ { "name": "@haverstack/blob-adapter-disk", - "version": "0.6.0", + "version": "0.7.0", "description": "Disk blob adapter for Haverstack", "type": "module", "exports": { diff --git a/packages/core/package.json b/packages/core/package.json index 3ff3a00..1391a51 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@haverstack/core", - "version": "0.8.0", + "version": "0.9.0", "description": "Core library for Haverstack — portable personal data stack", "type": "module", "exports": { diff --git a/packages/record-adapter-sqlite/package.json b/packages/record-adapter-sqlite/package.json index 72a5f5c..02986c2 100644 --- a/packages/record-adapter-sqlite/package.json +++ b/packages/record-adapter-sqlite/package.json @@ -34,17 +34,18 @@ ], "scripts": { "prepublishOnly": "pnpm run build", - "build": "tsc -p tsconfig.build.json", + "build": "tsup", "test": "vitest run", "typecheck": "tsc --noEmit", "lint": "eslint src tests" }, "dependencies": { - "@haverstack/core": "workspace:*", - "@haverstack/sqlite-shared": "workspace:*" + "@haverstack/core": "workspace:*" }, "devDependencies": { + "@haverstack/sqlite-shared": "workspace:*", "@types/node": "^22.0.0", + "tsup": "^8.5.1", "typescript": "^5.5.0", "vitest": "^2.0.0" } diff --git a/packages/record-adapter-sqlite/tsup.config.ts b/packages/record-adapter-sqlite/tsup.config.ts new file mode 100644 index 0000000..33a094d --- /dev/null +++ b/packages/record-adapter-sqlite/tsup.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from 'tsup'; + +/** + * @haverstack/sqlite-shared is bundled into this package's output rather + * than shipped as a dependency. It is an internal package — it carries no + * API stability promise and is not published — so a consumer installing + * this adapter from the registry must not need to resolve it. + * + * @haverstack/core stays external: it is a real published peer, and + * inlining it would give this package its own private copy of the error + * classes, breaking `instanceof` against the caller's copy. + */ +export default defineConfig({ + entry: ['src/index.ts'], + format: ['esm'], + target: 'node22', + dts: true, + sourcemap: true, + clean: true, + splitting: false, + treeshake: true, + external: ['@haverstack/core', '@haverstack/core/adapter'], + noExternal: ['@haverstack/sqlite-shared'], +}); diff --git a/packages/sqlite-shared/package.json b/packages/sqlite-shared/package.json index 1054104..4e0a873 100644 --- a/packages/sqlite-shared/package.json +++ b/packages/sqlite-shared/package.json @@ -1,7 +1,7 @@ { "name": "@haverstack/sqlite-shared", "version": "0.1.0", - "description": "Engine-independent SQL building blocks shared between Haverstack's SQLite-backed record adapters. Internal package, not a StackAdapter implementation.", + "description": "Internal shared logic for SQLite-backed Haverstack record adapters. Not published — bundled into its consumers. No API stability promise.", "type": "module", "exports": { ".": { @@ -26,7 +26,6 @@ "internal" ], "scripts": { - "prepublishOnly": "pnpm run build", "build": "tsc -p tsconfig.build.json", "test": "vitest run", "typecheck": "tsc --noEmit", @@ -39,5 +38,6 @@ "@types/node": "^22.0.0", "typescript": "^5.5.0", "vitest": "^2.0.0" - } + }, + "private": true } diff --git a/packages/wire-types/package.json b/packages/wire-types/package.json index 41900a7..c1dc9ca 100644 --- a/packages/wire-types/package.json +++ b/packages/wire-types/package.json @@ -1,6 +1,6 @@ { "name": "@haverstack/wire-types", - "version": "0.6.0", + "version": "0.7.0", "description": "HTTP wire types and serialization for Haverstack", "type": "module", "exports": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1fe902b..21e17fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -139,13 +139,16 @@ importers: '@haverstack/core': specifier: workspace:* version: link:../core + devDependencies: '@haverstack/sqlite-shared': specifier: workspace:* version: link:../sqlite-shared - devDependencies: '@types/node': specifier: ^22.0.0 version: 22.19.17 + tsup: + specifier: ^8.5.1 + version: 8.5.1(postcss@8.5.13)(typescript@5.9.3) typescript: specifier: ^5.5.0 version: 5.9.3 @@ -193,138 +196,294 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -384,9 +543,19 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@rollup/rollup-android-arm-eabi@4.60.2': resolution: {integrity: sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==} cpu: [arm] @@ -638,6 +807,9 @@ packages: ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -650,6 +822,12 @@ packages: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -662,6 +840,21 @@ packages: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -690,6 +883,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -775,6 +973,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -814,6 +1015,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -830,6 +1035,17 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -844,9 +1060,15 @@ packages: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.12: resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -855,6 +1077,10 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -878,6 +1104,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.1: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} @@ -889,6 +1118,31 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss@8.5.13: resolution: {integrity: sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==} engines: {node: ^10 || ^12 || >=14} @@ -906,6 +1160,14 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + rollup@4.60.2: resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -931,12 +1193,28 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -959,12 +1237,38 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -981,6 +1285,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -1071,72 +1378,150 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true + '@esbuild/aix-ppc64@0.27.7': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true + '@esbuild/android-arm64@0.27.7': + optional: true + '@esbuild/android-arm@0.21.5': optional: true + '@esbuild/android-arm@0.27.7': + optional: true + '@esbuild/android-x64@0.21.5': optional: true + '@esbuild/android-x64@0.27.7': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true + '@esbuild/darwin-arm64@0.27.7': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true + '@esbuild/darwin-x64@0.27.7': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true + '@esbuild/freebsd-arm64@0.27.7': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true + '@esbuild/freebsd-x64@0.27.7': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true + '@esbuild/linux-arm64@0.27.7': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true + '@esbuild/linux-arm@0.27.7': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true + '@esbuild/linux-ia32@0.27.7': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true + '@esbuild/linux-loong64@0.27.7': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true + '@esbuild/linux-mips64el@0.27.7': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true + '@esbuild/linux-ppc64@0.27.7': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true + '@esbuild/linux-riscv64@0.27.7': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true + '@esbuild/linux-s390x@0.27.7': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true + '@esbuild/sunos-x64@0.27.7': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true + '@esbuild/win32-arm64@0.27.7': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true + '@esbuild/win32-ia32@0.27.7': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true + '@esbuild/win32-x64@0.27.7': + optional: true + '@eslint-community/eslint-utils@4.9.1(eslint@10.2.1)': dependencies: eslint: 10.2.1 @@ -1187,8 +1572,20 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@rollup/rollup-android-arm-eabi@4.60.2': optional: true @@ -1418,6 +1815,8 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + any-promise@1.3.0: {} + assertion-error@2.0.1: {} balanced-match@4.0.4: {} @@ -1426,6 +1825,11 @@ snapshots: dependencies: balanced-match: 4.0.4 + bundle-require@5.1.0(esbuild@0.27.7): + dependencies: + esbuild: 0.27.7 + load-tsconfig: 0.2.5 + cac@6.7.14: {} chai@5.3.3: @@ -1438,6 +1842,16 @@ snapshots: check-error@2.1.3: {} + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + commander@4.1.1: {} + + confbox@0.1.8: {} + + consola@3.4.2: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -1480,6 +1894,35 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + escape-string-regexp@4.0.0: {} eslint-config-prettier@10.1.8(eslint@10.2.1): @@ -1575,6 +2018,12 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.21 + mlly: 1.8.2 + rollup: 4.60.2 + flat-cache@4.0.1: dependencies: flatted: 3.4.2 @@ -1603,6 +2052,8 @@ snapshots: isexe@2.0.0: {} + joycon@3.1.1: {} + json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} @@ -1618,6 +2069,12 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -1632,12 +2089,27 @@ snapshots: dependencies: brace-expansion: 5.0.5 + mlly@1.8.2: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + ms@2.1.3: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nanoid@3.3.12: {} natural-compare@1.4.0: {} + object-assign@4.1.1: {} + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -1661,12 +2133,28 @@ snapshots: pathe@1.1.2: {} + pathe@2.0.3: {} + pathval@2.0.1: {} picocolors@1.1.1: {} picomatch@4.0.4: {} + pirates@4.0.7: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + postcss-load-config@6.0.1(postcss@8.5.13): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.5.13 + postcss@8.5.13: dependencies: nanoid: 3.3.12 @@ -1679,6 +2167,10 @@ snapshots: punycode@2.3.1: {} + readdirp@4.1.2: {} + + resolve-from@5.0.0: {} + rollup@4.60.2: dependencies: '@types/estree': 1.0.8 @@ -1722,10 +2214,30 @@ snapshots: source-map-js@1.2.1: {} + source-map@0.7.6: {} + stackback@0.0.2: {} std-env@3.10.0: {} + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.16 + ts-interface-checker: 0.1.13 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -1741,10 +2253,42 @@ snapshots: tinyspy@3.0.2: {} + tree-kill@1.2.2: {} + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 + ts-interface-checker@0.1.13: {} + + tsup@8.5.1(postcss@8.5.13)(typescript@5.9.3): + dependencies: + bundle-require: 5.1.0(esbuild@0.27.7) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.27.7 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.5.13) + resolve-from: 5.0.0 + rollup: 4.60.2 + source-map: 0.7.6 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.16 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.13 + typescript: 5.9.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -1762,6 +2306,8 @@ snapshots: typescript@5.9.3: {} + ufo@1.6.4: {} + undici-types@6.21.0: {} uri-js@4.4.1: diff --git a/scripts/verify-pack.mjs b/scripts/verify-pack.mjs new file mode 100644 index 0000000..72b8ddb --- /dev/null +++ b/scripts/verify-pack.mjs @@ -0,0 +1,179 @@ +/** + * Pre-publish verification. + * + * Packs every publishable workspace package, installs the tarballs into a + * throwaway project OUTSIDE the workspace, and imports each entry point. + * This catches the two failure modes that a green `pnpm build` cannot: + * + * 1. A subpath `exports` map that resolves in the workspace but not from + * a published tarball (`files` missing an emitted entry, a stale path). + * 2. A dependency that resolves via the pnpm workspace link but is not + * actually declared — most importantly @haverstack/sqlite-shared, + * which is private and must be bundled into record-adapter-sqlite + * rather than installed. + * + * Run before `pnpm run publish:all`. Exits non-zero on the first failure. + */ + +import { execFileSync } from 'node:child_process'; +import { mkdtempSync, readFileSync, writeFileSync, mkdirSync, readdirSync, rmSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join, resolve, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const packagesDir = join(repoRoot, 'packages'); + +/** Entry points to import, and a symbol each must export. */ +const EXPECTATIONS = { + '@haverstack/core': [ + ['.', ['Stack', 'ScopedStack', 'StackError', 'SYSTEM_TYPES']], + ['/did', ['generateDidKeypair', 'verifyDidSignature', 'isValidDid']], + [ + '/wire', + ['buildAuthChallengePayload', 'verifyAuthChallenge', 'resolveAttachmentDownloadContentType'], + ], + ['/adapter', ['combineAdapters', 'assertQueryCapabilities']], + ['/testing', ['MemoryAdapter']], + ], + '@haverstack/wire-types': [['.', ['serializeRecord', 'serializeError', 'WIRE_PROTOCOL_VERSION']]], + '@haverstack/blob-adapter-disk': [['.', ['DiskBlobAdapter']]], + '@haverstack/record-adapter-sqlite': [['.', ['NativeSQLiteRecordAdapter', 'NativeTokenStore']]], + '@haverstack/adapter-local': [['.', ['LocalAdapter']]], + '@haverstack/adapter-api': [['.', ['APIAdapter']]], + '@haverstack/commons': [['.', ['NOTE', 'defineCommonsTypes']]], + '@haverstack/conformance-fixtures': [['.', ['discoveryFixtures', 'allConformanceFixtures']]], +}; + +/** Packages that must NOT appear in the installed tree at all. */ +const MUST_NOT_INSTALL = ['@haverstack/sqlite-shared']; + +const log = (msg) => process.stdout.write(`${msg}\n`); +const fail = (msg) => { + process.stderr.write(`\n FAIL ${msg}\n`); + process.exitCode = 1; +}; + +// -- collect publishable packages ------------------------------------------ + +const publishable = []; +for (const dir of readdirSync(packagesDir)) { + const manifestPath = join(packagesDir, dir, 'package.json'); + let manifest; + try { + manifest = JSON.parse(readFileSync(manifestPath, 'utf8')); + } catch { + continue; + } + if (manifest.private) { + log(` skip (private) ${manifest.name}`); + continue; + } + publishable.push({ dir, name: manifest.name, version: manifest.version }); +} + +log(`\nPacking ${publishable.length} publishable packages...`); + +// -- pack ------------------------------------------------------------------ + +const work = mkdtempSync(join(tmpdir(), 'haverstack-verify-')); +const tarballDir = join(work, 'tarballs'); +mkdirSync(tarballDir); + +const tarballs = {}; +for (const pkg of publishable) { + execFileSync('pnpm', ['--filter', pkg.name, 'pack', '--pack-destination', tarballDir], { + cwd: repoRoot, + stdio: 'pipe', + }); + const produced = readdirSync(tarballDir).find( + (f) => f.endsWith('.tgz') && !Object.values(tarballs).some((t) => t.endsWith(f)), + ); + if (!produced) { + fail(`no tarball produced for ${pkg.name}`); + continue; + } + tarballs[pkg.name] = join(tarballDir, produced); + log(` packed ${pkg.name}@${pkg.version}`); +} + +// -- install into a throwaway project outside the workspace ---------------- + +const consumer = join(work, 'consumer'); +mkdirSync(consumer); + +// `overrides` forces the internal @haverstack/* dependencies of each tarball +// to resolve to the sibling tarball rather than the public registry, which +// has no build of these versions yet. +const overrides = Object.fromEntries( + Object.entries(tarballs).map(([name, file]) => [name, `file:${file}`]), +); + +writeFileSync( + join(consumer, 'package.json'), + JSON.stringify( + { name: 'verify-consumer', private: true, type: 'module', dependencies: overrides, overrides }, + null, + 2, + ), +); + +log('\nInstalling tarballs into a clean project outside the workspace...'); +try { + execFileSync('npm', ['install', '--no-audit', '--no-fund', '--loglevel=error'], { + cwd: consumer, + stdio: 'pipe', + }); +} catch (err) { + fail(`npm install failed:\n${err.stdout?.toString() ?? ''}${err.stderr?.toString() ?? ''}`); + log(`\nLeft for inspection: ${work}`); + process.exit(1); +} + +// -- assert forbidden packages are absent ---------------------------------- + +log('\nChecking bundled-not-installed packages...'); +for (const name of MUST_NOT_INSTALL) { + const path = join(consumer, 'node_modules', ...name.split('/')); + let present = true; + try { + readFileSync(join(path, 'package.json')); + } catch { + present = false; + } + if (present) fail(`${name} is private and must be bundled, but it was installed`); + else log(` absent (correct) ${name}`); +} + +// -- import every entry point ---------------------------------------------- + +log('\nImporting entry points...'); +for (const [name, entries] of Object.entries(EXPECTATIONS)) { + for (const [subpath, symbols] of entries) { + const specifier = subpath === '.' ? name : `${name}${subpath}`; + const probe = join(consumer, 'probe.mjs'); + writeFileSync( + probe, + `import * as m from ${JSON.stringify(specifier)};\n` + + `const missing = ${JSON.stringify(symbols)}.filter((s) => !(s in m));\n` + + `if (missing.length) { console.error('missing: ' + missing.join(', ')); process.exit(1); }\n`, + ); + try { + execFileSync(process.execPath, [probe], { cwd: consumer, stdio: 'pipe' }); + log(` ok ${specifier}`); + } catch (err) { + const out = `${err.stdout?.toString() ?? ''}${err.stderr?.toString() ?? ''}`.trim(); + fail(`${specifier} — ${out.split('\n')[0] || 'import threw'}`); + } + } +} + +// -- report ---------------------------------------------------------------- + +if (process.exitCode) { + log(`\nLeft for inspection: ${work}`); + log('\nVerification FAILED — do not publish.\n'); +} else { + rmSync(work, { recursive: true, force: true }); + log('\nAll entry points resolve from packed tarballs. Safe to publish.\n'); +} From 288005d84f40b0cbd6ab8b41478b69f7e141af46 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 15 Aug 2026 19:28:47 +0000 Subject: [PATCH 2/2] build: depend on workspace:^ so a patch release doesn't fork core MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pnpm rewrites the workspace protocol at publish time, and workspace:* becomes an exact pin — the tarball for adapter-local@0.7.0 declared "@haverstack/core": "0.9.0", not a range. That bakes in the duplicate-copy hazard #167 documents. Publishing a core 0.9.1 would leave adapter-local demanding exactly 0.9.0, so an app depending on both gets two copies of core in its tree — and errors thrown inside the adapter carry a different class identity than the ones the app tests with instanceof. It is the same failure already visible in haverstack/server's node_modules, and with workspace:* it recurs on every patch release rather than being one-time drift. workspace:^ rewrites to ^0.9.0 instead. In the 0.x range that means >=0.9.0 <0.10.0, so patch releases dedupe to a single copy while a minor bump — which is this project's breaking-change signal — still requires a coordinated release. devDependencies keep workspace:*; they are never published. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01D5LtyME9WJky9jaB51tpjp --- packages/adapter-api/package.json | 4 ++-- packages/adapter-local/package.json | 6 +++--- packages/blob-adapter-disk/package.json | 2 +- packages/commons/package.json | 2 +- packages/conformance-fixtures/package.json | 2 +- packages/record-adapter-sqlite/package.json | 2 +- packages/sqlite-shared/package.json | 2 +- packages/wire-types/package.json | 2 +- pnpm-lock.yaml | 22 ++++++++++----------- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/adapter-api/package.json b/packages/adapter-api/package.json index 6573b53..d38c005 100644 --- a/packages/adapter-api/package.json +++ b/packages/adapter-api/package.json @@ -22,8 +22,8 @@ "lint": "eslint src tests" }, "dependencies": { - "@haverstack/core": "workspace:*", - "@haverstack/wire-types": "workspace:*" + "@haverstack/core": "workspace:^", + "@haverstack/wire-types": "workspace:^" }, "devDependencies": { "@haverstack/conformance-fixtures": "workspace:*", diff --git a/packages/adapter-local/package.json b/packages/adapter-local/package.json index fed831f..a79011e 100644 --- a/packages/adapter-local/package.json +++ b/packages/adapter-local/package.json @@ -39,9 +39,9 @@ "lint": "eslint src tests" }, "dependencies": { - "@haverstack/core": "workspace:*", - "@haverstack/record-adapter-sqlite": "workspace:*", - "@haverstack/blob-adapter-disk": "workspace:*" + "@haverstack/core": "workspace:^", + "@haverstack/record-adapter-sqlite": "workspace:^", + "@haverstack/blob-adapter-disk": "workspace:^" }, "devDependencies": { "@types/node": "^22.0.0", diff --git a/packages/blob-adapter-disk/package.json b/packages/blob-adapter-disk/package.json index 54b8a47..b62e7ff 100644 --- a/packages/blob-adapter-disk/package.json +++ b/packages/blob-adapter-disk/package.json @@ -36,7 +36,7 @@ "lint": "eslint src tests" }, "dependencies": { - "@haverstack/core": "workspace:*" + "@haverstack/core": "workspace:^" }, "devDependencies": { "@types/node": "^22.0.0", diff --git a/packages/commons/package.json b/packages/commons/package.json index 5dc369c..61edf8a 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -34,7 +34,7 @@ "lint": "eslint src tests" }, "dependencies": { - "@haverstack/core": "workspace:*" + "@haverstack/core": "workspace:^" }, "devDependencies": { "@types/node": "^22.0.0", diff --git a/packages/conformance-fixtures/package.json b/packages/conformance-fixtures/package.json index e51b45c..6b92313 100644 --- a/packages/conformance-fixtures/package.json +++ b/packages/conformance-fixtures/package.json @@ -33,7 +33,7 @@ "lint": "eslint src" }, "dependencies": { - "@haverstack/wire-types": "workspace:*" + "@haverstack/wire-types": "workspace:^" }, "devDependencies": { "@types/node": "^22.0.0", diff --git a/packages/record-adapter-sqlite/package.json b/packages/record-adapter-sqlite/package.json index 02986c2..a5c75e7 100644 --- a/packages/record-adapter-sqlite/package.json +++ b/packages/record-adapter-sqlite/package.json @@ -40,7 +40,7 @@ "lint": "eslint src tests" }, "dependencies": { - "@haverstack/core": "workspace:*" + "@haverstack/core": "workspace:^" }, "devDependencies": { "@haverstack/sqlite-shared": "workspace:*", diff --git a/packages/sqlite-shared/package.json b/packages/sqlite-shared/package.json index 4e0a873..7a15e93 100644 --- a/packages/sqlite-shared/package.json +++ b/packages/sqlite-shared/package.json @@ -32,7 +32,7 @@ "lint": "eslint src tests" }, "dependencies": { - "@haverstack/core": "workspace:*" + "@haverstack/core": "workspace:^" }, "devDependencies": { "@types/node": "^22.0.0", diff --git a/packages/wire-types/package.json b/packages/wire-types/package.json index c1dc9ca..c5c4422 100644 --- a/packages/wire-types/package.json +++ b/packages/wire-types/package.json @@ -22,7 +22,7 @@ "lint": "eslint src tests" }, "dependencies": { - "@haverstack/core": "workspace:*" + "@haverstack/core": "workspace:^" }, "devDependencies": { "@types/node": "^22.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 21e17fe..adf00d9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,10 +36,10 @@ importers: packages/adapter-api: dependencies: '@haverstack/core': - specifier: workspace:* + specifier: workspace:^ version: link:../core '@haverstack/wire-types': - specifier: workspace:* + specifier: workspace:^ version: link:../wire-types devDependencies: '@haverstack/conformance-fixtures': @@ -58,13 +58,13 @@ importers: packages/adapter-local: dependencies: '@haverstack/blob-adapter-disk': - specifier: workspace:* + specifier: workspace:^ version: link:../blob-adapter-disk '@haverstack/core': - specifier: workspace:* + specifier: workspace:^ version: link:../core '@haverstack/record-adapter-sqlite': - specifier: workspace:* + specifier: workspace:^ version: link:../record-adapter-sqlite devDependencies: '@types/node': @@ -80,7 +80,7 @@ importers: packages/blob-adapter-disk: dependencies: '@haverstack/core': - specifier: workspace:* + specifier: workspace:^ version: link:../core devDependencies: '@types/node': @@ -96,7 +96,7 @@ importers: packages/commons: dependencies: '@haverstack/core': - specifier: workspace:* + specifier: workspace:^ version: link:../core devDependencies: '@types/node': @@ -112,7 +112,7 @@ importers: packages/conformance-fixtures: dependencies: '@haverstack/wire-types': - specifier: workspace:* + specifier: workspace:^ version: link:../wire-types devDependencies: '@types/node': @@ -137,7 +137,7 @@ importers: packages/record-adapter-sqlite: dependencies: '@haverstack/core': - specifier: workspace:* + specifier: workspace:^ version: link:../core devDependencies: '@haverstack/sqlite-shared': @@ -159,7 +159,7 @@ importers: packages/sqlite-shared: dependencies: '@haverstack/core': - specifier: workspace:* + specifier: workspace:^ version: link:../core devDependencies: '@types/node': @@ -175,7 +175,7 @@ importers: packages/wire-types: dependencies: '@haverstack/core': - specifier: workspace:* + specifier: workspace:^ version: link:../core devDependencies: '@types/node':