From fbc38f81344b42ff6fd80fd253ff9ec4c9195cd9 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 26 Oct 2026 20:34:07 +0000 Subject: [PATCH 1/2] fix(packages): declare the ESM-only subpaths' types under import, retire driver-memory's default export metadata-core/testing, service-cluster/testing and create-objectstack/created-summary already refused require() at runtime; their unconditional `types` still let TypeScript resolve them for a CommonJS caller. Nest `types` inside `import` so both agree, and say ESM-only in each README. driver-memory's default export was the legacy onEnable plugin object no kernel calls, and sat on `.default` under require(); nothing imports it, so it retires (ADR-0087 runtime-export-retired). Claude-Session: https://claude.ai/code/session_01WTCPNVkuDk7DNaZSdM3DZv Co-authored-by: Claude --- .changeset/26206-cjs-entry-points.md | 22 +++++++++++++++ packages/create-objectstack/README.md | 7 +++++ packages/create-objectstack/package.json | 6 +++-- packages/drivers/driver-memory/README.md | 1 - packages/drivers/driver-memory/src/index.ts | 27 +++++-------------- packages/metadata-core/README.md | 5 ++++ packages/metadata-core/package.json | 6 +++-- packages/services/service-cluster/README.md | 2 ++ .../services/service-cluster/package.json | 6 +++-- 9 files changed, 54 insertions(+), 28 deletions(-) create mode 100644 .changeset/26206-cjs-entry-points.md diff --git a/.changeset/26206-cjs-entry-points.md b/.changeset/26206-cjs-entry-points.md new file mode 100644 index 00000000000..9e7682f1f7e --- /dev/null +++ b/.changeset/26206-cjs-entry-points.md @@ -0,0 +1,22 @@ +--- +'@objectstack/driver-memory': patch +'@objectstack/metadata-core': patch +'@objectstack/service-cluster': patch +'create-objectstack': patch +--- + +fix(driver-memory,metadata-core,service-cluster,create-objectstack)!: ESM-only subpaths declare their types under `import`, and driver-memory retires its legacy default export + +Clause-②: no (narrowing: retires `@objectstack/driver-memory#default` under ADR-0087's `runtime-export-retired` marker) +Metadata-protocol: none + + + +**BREAKING** (an export retirement), shipped as `patch`: no metadata protocol kind moves. + +- **`@objectstack/driver-memory`.** The default export is gone; every named export stays. It was the pre-kernel plugin shape (`onEnable(context)`), which the kernel never calls. Under `require()` it also sat on a `.default` property, so a CommonJS caller never got it as the module value (attw `FalseExportDefault`). +- **`@objectstack/metadata-core/testing`, `@objectstack/service-cluster/testing`, `create-objectstack/created-summary`** are ESM-only, and now say so in their export maps: the subpath's `types` moved inside its `import` condition. `require()` of these subpaths already failed at runtime with `ERR_PACKAGE_PATH_NOT_EXPORTED`. Before this change, TypeScript under `node16`/`nodenext` resolved their declarations for a CommonJS caller anyway (attw `CJSResolvesToESM`). Now it resolves them for `import` only, which is what Node does. ESM callers see no change. Each README says the subpath is ESM-only. + +Migration, for a caller of the retired default export: + +- FROM `default` (`import memoryDriver from '@objectstack/driver-memory'`) TO `InMemoryDriver`: construct `new InMemoryDriver(config)` and compose it through `DriverPlugin` from `@objectstack/runtime`. diff --git a/packages/create-objectstack/README.md b/packages/create-objectstack/README.md index daec9ff5339..61aa29d20a7 100644 --- a/packages/create-objectstack/README.md +++ b/packages/create-objectstack/README.md @@ -105,6 +105,13 @@ npm run validate # verify metadata: schema + predicates + bindings See the docs: [Your First Project](https://objectstack.ai/docs/getting-started/your-first-project). +## Library subpath + +`create-objectstack/created-summary` (the "what was written" tree summary that +`objectstack init` reuses) is **ESM-only**: the package is `"type": "module"` +and the subpath declares only an `import` condition. Load it with `import`; +`require()` is refused with `ERR_PACKAGE_PATH_NOT_EXPORTED`. + ## License Apache-2.0. See [LICENSING.md](../../LICENSING.md). diff --git a/packages/create-objectstack/package.json b/packages/create-objectstack/package.json index 9cb07297038..6458af2738a 100644 --- a/packages/create-objectstack/package.json +++ b/packages/create-objectstack/package.json @@ -10,8 +10,10 @@ ], "exports": { "./created-summary": { - "types": "./dist/created-summary.d.ts", - "import": "./dist/created-summary.js" + "import": { + "types": "./dist/created-summary.d.ts", + "default": "./dist/created-summary.js" + } } }, "scripts": { diff --git a/packages/drivers/driver-memory/README.md b/packages/drivers/driver-memory/README.md index 3d88c71ef54..4c2a25ef5d9 100644 --- a/packages/drivers/driver-memory/README.md +++ b/packages/drivers/driver-memory/README.md @@ -61,7 +61,6 @@ const driver = new InMemoryDriver({ | Export | Kind | Description | |:---|:---|:---| -| `default` | legacy plugin object | Legacy `onEnable` shape — not a kernel `Plugin`; register through `DriverPlugin`. | | `InMemoryDriver` | class | Driver instance for direct use. | | `InMemoryStrategy` | class | Query execution strategy used by ObjectQL. | | `FileSystemPersistenceAdapter` | class | Node-only persistence. | diff --git a/packages/drivers/driver-memory/src/index.ts b/packages/drivers/driver-memory/src/index.ts index 1b09e989e8a..6a2d7387850 100644 --- a/packages/drivers/driver-memory/src/index.ts +++ b/packages/drivers/driver-memory/src/index.ts @@ -1,8 +1,11 @@ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. -import { InMemoryDriver } from './memory-driver.js'; - -export { InMemoryDriver }; // Export class for direct usage +// No default export, on purpose (#26206). The package used to default-export a +// legacy `{ id, version, onEnable }` object that no kernel ever calls (the +// plugin contract is `init`/`start`/`destroy`), and under `require()` it sat on +// a `.default` property the CommonJS caller never sees. Compose the driver +// through `DriverPlugin` with the named `InMemoryDriver` export instead. +export { InMemoryDriver } from './memory-driver.js'; export type { InMemoryDriverConfig, PersistenceAdapterInterface } from './memory-driver.js'; export { FileSystemPersistenceAdapter } from './persistence/file-adapter.js'; @@ -60,21 +63,3 @@ export type { TenantOptOutRecord, UniqueAwareSchema, } from './memory-unique-constraint.js'; - -export default { - id: 'com.objectstack.driver.memory', - version: '1.0.0', - - onEnable: async (context: any) => { - const { logger, config, drivers } = context; - logger.info('[Memory Driver] Initializing...'); - - if (drivers) { - const driver = new InMemoryDriver(config); - drivers.register(driver); - logger.info(`[Memory Driver] Registered driver: ${driver.name}`); - } else { - logger.warn('[Memory Driver] No driver registry found in context.'); - } - } -}; diff --git a/packages/metadata-core/README.md b/packages/metadata-core/README.md index 1309bf0f860..d35595a036d 100644 --- a/packages/metadata-core/README.md +++ b/packages/metadata-core/README.md @@ -38,3 +38,8 @@ import { ``` See ADR-0008 §2 for the full architectural rationale. + +`@objectstack/metadata-core/testing` (the repository contract suites) is +**ESM-only**: it imports `vitest`, whose own `require()` entry throws, so +the subpath declares only an `import` condition. Load it with `import`; +`require()` is refused with `ERR_PACKAGE_PATH_NOT_EXPORTED`. diff --git a/packages/metadata-core/package.json b/packages/metadata-core/package.json index fe060b71b67..ea81d3ffdef 100644 --- a/packages/metadata-core/package.json +++ b/packages/metadata-core/package.json @@ -19,8 +19,10 @@ } }, "./testing": { - "types": "./dist/testing.d.ts", - "import": "./dist/testing.js" + "import": { + "types": "./dist/testing.d.ts", + "default": "./dist/testing.js" + } } }, "files": [ diff --git a/packages/services/service-cluster/README.md b/packages/services/service-cluster/README.md index 27f3410061c..7727585e1aa 100644 --- a/packages/services/service-cluster/README.md +++ b/packages/services/service-cluster/README.md @@ -7,3 +7,5 @@ import { ClusterServicePlugin } from '@objectstack/service-cluster'; ``` Documentation: [Cluster](https://objectstack.ai/docs/kernel/cluster) + +`@objectstack/service-cluster/testing` (the pub/sub, lock, KV and counter contract suites) is **ESM-only**: it imports `vitest`, whose own `require()` entry throws, so the subpath declares only an `import` condition. Load it with `import`; `require()` is refused with `ERR_PACKAGE_PATH_NOT_EXPORTED`. diff --git a/packages/services/service-cluster/package.json b/packages/services/service-cluster/package.json index cd93fafb207..1cb6da3fa1d 100644 --- a/packages/services/service-cluster/package.json +++ b/packages/services/service-cluster/package.json @@ -19,8 +19,10 @@ } }, "./testing": { - "types": "./dist/testing.d.ts", - "import": "./dist/testing.js" + "import": { + "types": "./dist/testing.d.ts", + "default": "./dist/testing.js" + } } }, "scripts": { From 6412826387717be8b3d18b62ba66f7e15bc9511a Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 26 Oct 2026 20:41:27 +0000 Subject: [PATCH 2/2] fix(packages): leave driver-memory's default export for its own change The ADR-0087 runtime-export-retired disposition cannot certify an operand named `default` (its no-metadata-surface word scan hits every `default:` key in an object definition), so the retirement waits on that gate. This change keeps only the three ESM-only subpath declarations, which are non-breaking. Claude-Session: https://claude.ai/code/session_01WTCPNVkuDk7DNaZSdM3DZv Co-authored-by: Claude --- .changeset/26206-cjs-entry-points.md | 16 +++--------- packages/drivers/driver-memory/README.md | 1 + packages/drivers/driver-memory/src/index.ts | 27 ++++++++++++++++----- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/.changeset/26206-cjs-entry-points.md b/.changeset/26206-cjs-entry-points.md index 9e7682f1f7e..1643e18338e 100644 --- a/.changeset/26206-cjs-entry-points.md +++ b/.changeset/26206-cjs-entry-points.md @@ -1,22 +1,12 @@ --- -'@objectstack/driver-memory': patch '@objectstack/metadata-core': patch '@objectstack/service-cluster': patch 'create-objectstack': patch --- -fix(driver-memory,metadata-core,service-cluster,create-objectstack)!: ESM-only subpaths declare their types under `import`, and driver-memory retires its legacy default export +fix(metadata-core,service-cluster,create-objectstack): ESM-only subpaths declare their types under `import` -Clause-②: no (narrowing: retires `@objectstack/driver-memory#default` under ADR-0087's `runtime-export-retired` marker) +Clause-②: no Metadata-protocol: none - - -**BREAKING** (an export retirement), shipped as `patch`: no metadata protocol kind moves. - -- **`@objectstack/driver-memory`.** The default export is gone; every named export stays. It was the pre-kernel plugin shape (`onEnable(context)`), which the kernel never calls. Under `require()` it also sat on a `.default` property, so a CommonJS caller never got it as the module value (attw `FalseExportDefault`). -- **`@objectstack/metadata-core/testing`, `@objectstack/service-cluster/testing`, `create-objectstack/created-summary`** are ESM-only, and now say so in their export maps: the subpath's `types` moved inside its `import` condition. `require()` of these subpaths already failed at runtime with `ERR_PACKAGE_PATH_NOT_EXPORTED`. Before this change, TypeScript under `node16`/`nodenext` resolved their declarations for a CommonJS caller anyway (attw `CJSResolvesToESM`). Now it resolves them for `import` only, which is what Node does. ESM callers see no change. Each README says the subpath is ESM-only. - -Migration, for a caller of the retired default export: - -- FROM `default` (`import memoryDriver from '@objectstack/driver-memory'`) TO `InMemoryDriver`: construct `new InMemoryDriver(config)` and compose it through `DriverPlugin` from `@objectstack/runtime`. +`@objectstack/metadata-core/testing`, `@objectstack/service-cluster/testing` and `create-objectstack/created-summary` are ESM-only, and now say so in their export maps: the subpath's `types` moved inside its `import` condition. `require()` of these subpaths already failed at runtime with `ERR_PACKAGE_PATH_NOT_EXPORTED`. Before this change, TypeScript under `node16`/`nodenext` resolved their declarations for a CommonJS caller anyway (attw `CJSResolvesToESM`). Now it resolves them for `import` only, which is what Node does. ESM callers, and every resolution mode that reads the `import` condition, see no change. Each package's README now says the subpath is ESM-only. diff --git a/packages/drivers/driver-memory/README.md b/packages/drivers/driver-memory/README.md index 4c2a25ef5d9..3d88c71ef54 100644 --- a/packages/drivers/driver-memory/README.md +++ b/packages/drivers/driver-memory/README.md @@ -61,6 +61,7 @@ const driver = new InMemoryDriver({ | Export | Kind | Description | |:---|:---|:---| +| `default` | legacy plugin object | Legacy `onEnable` shape — not a kernel `Plugin`; register through `DriverPlugin`. | | `InMemoryDriver` | class | Driver instance for direct use. | | `InMemoryStrategy` | class | Query execution strategy used by ObjectQL. | | `FileSystemPersistenceAdapter` | class | Node-only persistence. | diff --git a/packages/drivers/driver-memory/src/index.ts b/packages/drivers/driver-memory/src/index.ts index 6a2d7387850..1b09e989e8a 100644 --- a/packages/drivers/driver-memory/src/index.ts +++ b/packages/drivers/driver-memory/src/index.ts @@ -1,11 +1,8 @@ // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. -// No default export, on purpose (#26206). The package used to default-export a -// legacy `{ id, version, onEnable }` object that no kernel ever calls (the -// plugin contract is `init`/`start`/`destroy`), and under `require()` it sat on -// a `.default` property the CommonJS caller never sees. Compose the driver -// through `DriverPlugin` with the named `InMemoryDriver` export instead. -export { InMemoryDriver } from './memory-driver.js'; +import { InMemoryDriver } from './memory-driver.js'; + +export { InMemoryDriver }; // Export class for direct usage export type { InMemoryDriverConfig, PersistenceAdapterInterface } from './memory-driver.js'; export { FileSystemPersistenceAdapter } from './persistence/file-adapter.js'; @@ -63,3 +60,21 @@ export type { TenantOptOutRecord, UniqueAwareSchema, } from './memory-unique-constraint.js'; + +export default { + id: 'com.objectstack.driver.memory', + version: '1.0.0', + + onEnable: async (context: any) => { + const { logger, config, drivers } = context; + logger.info('[Memory Driver] Initializing...'); + + if (drivers) { + const driver = new InMemoryDriver(config); + drivers.register(driver); + logger.info(`[Memory Driver] Registered driver: ${driver.name}`); + } else { + logger.warn('[Memory Driver] No driver registry found in context.'); + } + } +};