diff --git a/.changeset/config.json b/.changeset/config.json index ec21fa401..4326f1a13 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -60,7 +60,7 @@ "@objectstack/service-cache", "@objectstack/service-cluster", "@objectstack/service-cluster-redis", - "@objectstack/service-external-datasource", + "@objectstack/service-datasource", "@objectstack/service-feed", "@objectstack/service-i18n", "@objectstack/service-job", diff --git a/packages/cli/package.json b/packages/cli/package.json index ec8f8b966..2f8d8a541 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -70,8 +70,7 @@ "@objectstack/service-analytics": "workspace:*", "@objectstack/service-automation": "workspace:*", "@objectstack/service-cache": "workspace:*", - "@objectstack/service-datasource-admin": "workspace:*", - "@objectstack/service-external-datasource": "workspace:*", + "@objectstack/service-datasource": "workspace:*", "@objectstack/service-feed": "workspace:*", "@objectstack/service-job": "workspace:*", "@objectstack/service-messaging": "workspace:*", diff --git a/packages/cli/src/commands/serve.ts b/packages/cli/src/commands/serve.ts index be492aba8..4410e9bed 100644 --- a/packages/cli/src/commands/serve.ts +++ b/packages/cli/src/commands/serve.ts @@ -1611,7 +1611,7 @@ export default class Serve extends Command { // Federation (introspect / draft / import / validate of external // tables) ships in the open framework. try { - const dsMod: any = await import('@objectstack/service-external-datasource'); + const dsMod: any = await import('@objectstack/service-datasource'); const { ExternalDatasourceServicePlugin } = dsMod; if ( @@ -1644,7 +1644,7 @@ export default class Serve extends Command { // ── Runtime Datasource Admin (ADR-0015 Addendum) ────────────── // The "Add Datasource" wizard backend: list / test / create / update / // remove datasources defined in the UI at runtime. This is open-source - // *mechanism* (`@objectstack/service-datasource-admin`); the tier line + // *mechanism* (`@objectstack/service-datasource`); the tier line // falls on which ICryptoProvider / driver factory a host injects, not on // whether the UI can manage datasources. Mounted by default so a // self-host runtime is a complete low-code platform out of the box. @@ -1655,7 +1655,7 @@ export default class Serve extends Command { // key. Wired BEFORE runtime.start() so the plugin's kernel:ready boot // rehydration (which decrypts persisted creds) has its binder ready. try { - const adminMod: any = await import('@objectstack/service-datasource-admin'); + const adminMod: any = await import('@objectstack/service-datasource'); const { DatasourceAdminServicePlugin, createDefaultDatasourceDriverFactory, diff --git a/packages/services/service-datasource-admin/README.md b/packages/services/service-datasource-admin/README.md deleted file mode 100644 index 668bba2c8..000000000 --- a/packages/services/service-datasource-admin/README.md +++ /dev/null @@ -1,85 +0,0 @@ -# @objectstack/service-datasource-admin - -Runtime **UI-created datasource lifecycle** — the "Add Datasource" wizard backend -from **ADR-0015 Addendum**. This package is the open-source **mechanism**: -list / test-connection / create / update / remove datasources that an admin -defines *in the UI* at runtime (as opposed to code-defined `*.datasource.ts`). - -It deliberately ships **no managed credential vault and no multi-tenant overlay**. -Both are injected through stable seams, so a private host can layer enterprise -behaviour on without forking: - -- **credentials** → a host-provided `SecretBinder` over any `ICryptoProvider`. - The framework default uses `InMemoryCryptoProvider` (dev / self-host, single - node). A managed host swaps in a KMS/Vault-backed `ICryptoProvider` for - rotation, per-tenant isolation and compliance. -- **drivers** → a swappable `IDatasourceDriverFactory`. The default factory - covers `postgres` / `sqlite` / `mongodb` / `memory`; a host can register a - factory that adds premium drivers (Salesforce / SAP / Oracle / …). - -The tier line therefore falls on *which `ICryptoProvider` / driver factory you -inject* — a neutral, technical seam — not on whether the UI can manage -datasources at all. - -## Scope - -Two orthogonal axes of "datasource": - -| Axis | `origin: 'code'` | `origin: 'runtime'` | -|------|------------------|---------------------| -| Defined by | `*.datasource.ts` (GitOps) | the UI wizard, at runtime | -| Mutable at runtime | no (read-only) | yes | -| Stored in | code / artefacts | `sys_metadata` + secret in `sys_secret` | - -**This package owns only the `origin: 'runtime'` lifecycle.** *Federation* -(introspect / draft / import / validate of external tables, ADR-0015 main body) -lives in `@objectstack/service-external-datasource`. - -## Contents - -- `DatasourceAdminService` + `DatasourceAdminServicePlugin` — registers the - `'datasource-admin'` kernel service. -- `createDefaultDatasourceDriverFactory` — postgres / sqlite / mongodb / memory - factory used to probe a connection and hot-register a pool. -- `createDatasourceSecretBinder` — fail-closed `sys_secret` binder over an - `ICryptoProvider`; only an opaque `credentialsRef` is ever persisted, never - cleartext. With no binder wired, secret-bearing create/update throws. -- `registerDatasourceAdminRoutes` — REST routes under `/api/v1/datasources`. -- `contracts/` — `IDatasourceAdminService`, `IDatasourceDriverFactory` + DTOs. - -## Host wiring - -```ts -import { - DatasourceAdminServicePlugin, - createDefaultDatasourceDriverFactory, - createDatasourceSecretBinder, - registerDatasourceAdminRoutes, -} from '@objectstack/service-datasource-admin'; -import { InMemoryCryptoProvider } from '@objectstack/service-settings'; - -// 1. secret binder (fail-closed: no crypto provider ⇒ secret-bearing -// create/update throws instead of persisting cleartext). -// A managed host swaps InMemoryCryptoProvider for a KMS/Vault provider. -const cryptoProvider = new InMemoryCryptoProvider(); -const lazyEngine = { - insert: (o, d, opt) => kernel.getService('data').insert(o, d, opt), - delete: (o, opt) => kernel.getService('data').delete(o, opt), - find: (o, q) => kernel.getService('data').find(o, q), -}; -const secrets = createDatasourceSecretBinder({ engine: lazyEngine, cryptoProvider }); - -// 2. plugin (driverFactory + secrets are the enterprise injection points) -await kernel.use( - new DatasourceAdminServicePlugin({ - driverFactory: createDefaultDatasourceDriverFactory(), - secrets, - }), -); - -// 3. REST routes (mount alongside the federation routes) -registerDatasourceAdminRoutes(httpServer, pluginContext, '/api/v1'); -``` - -`@objectstack/core` and `@objectstack/spec` are required deps; the driver -packages are optional peers (imported lazily only for the drivers you use). diff --git a/packages/services/service-datasource-admin/src/index.ts b/packages/services/service-datasource-admin/src/index.ts deleted file mode 100644 index 33eb41cf6..000000000 --- a/packages/services/service-datasource-admin/src/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. - -/** - * @objectstack/service-datasource-admin — runtime UI-created datasource - * lifecycle (ADR-0015 Addendum). Open-source mechanism: list / test / create / - * update / remove datasources defined in the UI. Credential storage is - * delegated to a host-provided {@link SecretBinder} (over an `ICryptoProvider`) - * and drivers to a swappable factory, so a managed credential vault / - * multi-tenant overlay can be layered on by a private host without forking. - * See README for host wiring. - */ - -// Contracts (the canonical datasource-admin DTOs; re-exported here). -export type { - DatasourceOrigin, - SecretInput, - DatasourceDraft, - TestConnectionResult, - DatasourceSummary, - IDatasourceAdminService, - DatasourceConnectionSpec, - DatasourceDriverHandle, - IDatasourceDriverFactory, -} from './contracts/index.js'; - -// Decoupled lifecycle service + injected-config shape. -export { DatasourceAdminService } from './datasource-admin-service.js'; -export type { - DatasourceAdminServiceConfig, - StoredDatasource, - ProbeInput, -} from './datasource-admin-service.js'; - -// Kernel plugin (registers the `'datasource-admin'` service). -export { DatasourceAdminServicePlugin } from './datasource-admin-plugin.js'; -export type { - DatasourceAdminServicePluginOptions, - SecretBinder, -} from './datasource-admin-plugin.js'; - -// Host glue: dev driver factory + fail-closed secret binder. -export { createDefaultDatasourceDriverFactory } from './default-datasource-driver-factory.js'; -export { - createDatasourceSecretBinder, - toCredentialsRef, - parseCredentialsRef, -} from './datasource-secret-binder.js'; -export type { - DatasourceSecretBinder, - DatasourceSecretBinderDeps, - SecretStoreEngineLike, -} from './datasource-secret-binder.js'; - -// REST routes. -export { registerDatasourceAdminRoutes } from './admin-routes.js'; - -// Inlined Logger surface (severs dependency on the federation service). -export type { Logger } from './logger.js'; diff --git a/packages/services/service-datasource-admin/src/logger.ts b/packages/services/service-datasource-admin/src/logger.ts deleted file mode 100644 index 2b38044c6..000000000 --- a/packages/services/service-datasource-admin/src/logger.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. - -/** - * Minimal logger surface. Inlined here (rather than imported from the - * federation service) so this package has no dependency on - * `@objectstack/service-external-datasource`. - */ -export interface Logger { - warn: (message: string, meta?: unknown) => void; - info?: (message: string, meta?: unknown) => void; -} diff --git a/packages/services/service-datasource-admin/tsconfig.json b/packages/services/service-datasource-admin/tsconfig.json deleted file mode 100644 index b25dd285c..000000000 --- a/packages/services/service-datasource-admin/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "outDir": "dist", - "rootDir": "src", - "types": ["node"] - }, - "include": ["src"], - "exclude": ["node_modules", "dist"] -} diff --git a/packages/services/service-external-datasource/CHANGELOG.md b/packages/services/service-datasource/CHANGELOG.md similarity index 100% rename from packages/services/service-external-datasource/CHANGELOG.md rename to packages/services/service-datasource/CHANGELOG.md diff --git a/packages/services/service-datasource/README.md b/packages/services/service-datasource/README.md new file mode 100644 index 000000000..364ff71f4 --- /dev/null +++ b/packages/services/service-datasource/README.md @@ -0,0 +1,50 @@ +# @objectstack/service-datasource + +The datasource service (ADR-0015). One package, two cohesive halves of the same +capability: + +| Half | ADR-0015 | What it does | Plugin | +|------|----------|--------------|--------| +| **Federation** | main body | introspect / draft / import / validate external tables | `ExternalDatasourceServicePlugin` | +| **Runtime admin** | Addendum | the "Add Datasource" wizard backend — list / test / create / update / remove datasources defined in the UI at runtime, + REST routes under `/api/v1/datasources` | `DatasourceAdminServicePlugin` | + +(Previously shipped as the separate `@objectstack/service-external-datasource` +and `@objectstack/service-datasource-admin` packages. The split existed only +because the runtime admin was once private; now that both are open-source, they +are one package. The two plugins still mount independently — merging the package +did not couple them.) + +## Open-source mechanism, injectable tier line + +This package is mechanism only. Credential storage is delegated to a +host-provided `SecretBinder` over any `ICryptoProvider` (framework default: +`InMemoryCryptoProvider`), and drivers to a swappable factory. The tier line +falls on *which crypto provider / driver factory a host injects* — a neutral, +technical seam — so a managed credential vault + multi-tenant overlay can be +layered on by a private host **without forking**. + +## Two axes of "datasource" + +| Axis | `origin: 'code'` | `origin: 'runtime'` | +|------|------------------|---------------------| +| Defined by | `*.datasource.ts` (GitOps) | the UI wizard, at runtime | +| Mutable at runtime | no (read-only) | yes | +| Stored in | code / artefacts | `sys_metadata` + secret in `sys_secret` | + +The runtime admin owns only the `origin: 'runtime'` lifecycle. + +## Exports + +- Federation: `ExternalDatasourceService`, `ExternalDatasourceServicePlugin`. +- Runtime admin: `DatasourceAdminService`, `DatasourceAdminServicePlugin`, + `createDefaultDatasourceDriverFactory`, `createDatasourceSecretBinder`, + `registerDatasourceAdminRoutes`. +- `@objectstack/service-datasource/contracts` — `IDatasourceAdminService`, + `IDatasourceDriverFactory` + DTOs. + +`os serve` wires both by default. For manual host wiring of the admin half +(secret binder over a crypto provider, driver factory, REST routes), see the +serve composition root in `@objectstack/cli`. + +`@objectstack/core` and `@objectstack/spec` are required deps; the driver +packages are optional peers (imported lazily only for the drivers you use). diff --git a/packages/services/service-datasource-admin/package.json b/packages/services/service-datasource/package.json similarity index 72% rename from packages/services/service-datasource-admin/package.json rename to packages/services/service-datasource/package.json index acb86e7df..ff3978aef 100644 --- a/packages/services/service-datasource-admin/package.json +++ b/packages/services/service-datasource/package.json @@ -1,8 +1,8 @@ { - "name": "@objectstack/service-datasource-admin", + "name": "@objectstack/service-datasource", "version": "7.5.0", "license": "Apache-2.0", - "description": "Runtime UI-created datasource lifecycle (ADR-0015 Addendum) — list/test/create/update/remove datasources defined in the UI. Mechanism only: credential storage is delegated to a host-provided SecretBinder (CryptoProvider) and drivers to a swappable factory, so a managed credential vault / multi-tenant overlay can be layered on without forking.", + "description": "The datasource service (ADR-0015): external-table federation (introspect/draft/import/validate) + runtime UI datasource lifecycle (list/test/create/update/remove + REST routes). Open-source mechanism; the tier line falls on which ICryptoProvider / driver factory a host injects.", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -51,6 +51,8 @@ "keywords": [ "objectstack", "datasource", + "federation", + "introspection", "datasource-admin", "runtime-datasource" ], @@ -58,6 +60,11 @@ "repository": { "type": "git", "url": "https://github.com/objectstack-ai/framework.git", - "directory": "packages/services/service-datasource-admin" + "directory": "packages/services/service-datasource" + }, + "homepage": "https://objectstack.ai/docs", + "bugs": "https://github.com/objectstack-ai/framework/issues", + "publishConfig": { + "access": "public" } } diff --git a/packages/services/service-datasource-admin/src/__tests__/admin-routes.test.ts b/packages/services/service-datasource/src/__tests__/admin-routes.test.ts similarity index 100% rename from packages/services/service-datasource-admin/src/__tests__/admin-routes.test.ts rename to packages/services/service-datasource/src/__tests__/admin-routes.test.ts diff --git a/packages/services/service-datasource-admin/src/__tests__/datasource-admin-plugin.test.ts b/packages/services/service-datasource/src/__tests__/datasource-admin-plugin.test.ts similarity index 100% rename from packages/services/service-datasource-admin/src/__tests__/datasource-admin-plugin.test.ts rename to packages/services/service-datasource/src/__tests__/datasource-admin-plugin.test.ts diff --git a/packages/services/service-datasource-admin/src/__tests__/datasource-admin-service.test.ts b/packages/services/service-datasource/src/__tests__/datasource-admin-service.test.ts similarity index 100% rename from packages/services/service-datasource-admin/src/__tests__/datasource-admin-service.test.ts rename to packages/services/service-datasource/src/__tests__/datasource-admin-service.test.ts diff --git a/packages/services/service-datasource-admin/src/__tests__/datasource-secret-binder.test.ts b/packages/services/service-datasource/src/__tests__/datasource-secret-binder.test.ts similarity index 100% rename from packages/services/service-datasource-admin/src/__tests__/datasource-secret-binder.test.ts rename to packages/services/service-datasource/src/__tests__/datasource-secret-binder.test.ts diff --git a/packages/services/service-external-datasource/src/__tests__/external-datasource-service.test.ts b/packages/services/service-datasource/src/__tests__/external-datasource-service.test.ts similarity index 100% rename from packages/services/service-external-datasource/src/__tests__/external-datasource-service.test.ts rename to packages/services/service-datasource/src/__tests__/external-datasource-service.test.ts diff --git a/packages/services/service-datasource-admin/src/admin-routes.ts b/packages/services/service-datasource/src/admin-routes.ts similarity index 100% rename from packages/services/service-datasource-admin/src/admin-routes.ts rename to packages/services/service-datasource/src/admin-routes.ts diff --git a/packages/services/service-datasource-admin/src/contracts/datasource-admin-service.ts b/packages/services/service-datasource/src/contracts/datasource-admin-service.ts similarity index 100% rename from packages/services/service-datasource-admin/src/contracts/datasource-admin-service.ts rename to packages/services/service-datasource/src/contracts/datasource-admin-service.ts diff --git a/packages/services/service-datasource-admin/src/contracts/datasource-driver-factory.ts b/packages/services/service-datasource/src/contracts/datasource-driver-factory.ts similarity index 100% rename from packages/services/service-datasource-admin/src/contracts/datasource-driver-factory.ts rename to packages/services/service-datasource/src/contracts/datasource-driver-factory.ts diff --git a/packages/services/service-datasource-admin/src/contracts/index.ts b/packages/services/service-datasource/src/contracts/index.ts similarity index 100% rename from packages/services/service-datasource-admin/src/contracts/index.ts rename to packages/services/service-datasource/src/contracts/index.ts diff --git a/packages/services/service-datasource-admin/src/datasource-admin-plugin.ts b/packages/services/service-datasource/src/datasource-admin-plugin.ts similarity index 100% rename from packages/services/service-datasource-admin/src/datasource-admin-plugin.ts rename to packages/services/service-datasource/src/datasource-admin-plugin.ts diff --git a/packages/services/service-datasource-admin/src/datasource-admin-service.ts b/packages/services/service-datasource/src/datasource-admin-service.ts similarity index 100% rename from packages/services/service-datasource-admin/src/datasource-admin-service.ts rename to packages/services/service-datasource/src/datasource-admin-service.ts diff --git a/packages/services/service-datasource-admin/src/datasource-secret-binder.ts b/packages/services/service-datasource/src/datasource-secret-binder.ts similarity index 100% rename from packages/services/service-datasource-admin/src/datasource-secret-binder.ts rename to packages/services/service-datasource/src/datasource-secret-binder.ts diff --git a/packages/services/service-datasource-admin/src/default-datasource-driver-factory.ts b/packages/services/service-datasource/src/default-datasource-driver-factory.ts similarity index 100% rename from packages/services/service-datasource-admin/src/default-datasource-driver-factory.ts rename to packages/services/service-datasource/src/default-datasource-driver-factory.ts diff --git a/packages/services/service-external-datasource/src/external-datasource-service.ts b/packages/services/service-datasource/src/external-datasource-service.ts similarity index 100% rename from packages/services/service-external-datasource/src/external-datasource-service.ts rename to packages/services/service-datasource/src/external-datasource-service.ts diff --git a/packages/services/service-datasource/src/index.ts b/packages/services/service-datasource/src/index.ts new file mode 100644 index 000000000..b54ee4f57 --- /dev/null +++ b/packages/services/service-datasource/src/index.ts @@ -0,0 +1,73 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * @objectstack/service-datasource — the datasource service (ADR-0015). + * + * Two cohesive halves of one capability: + * - **Federation** (ADR-0015 main body): introspect / draft / import / + * validate external tables — {@link ExternalDatasourceServicePlugin}. + * - **Runtime admin** (ADR-0015 Addendum): the "Add Datasource" wizard + * backend — list / test / create / update / remove datasources defined in + * the UI at runtime, plus its REST routes — {@link DatasourceAdminServicePlugin}. + * + * Open-source mechanism throughout. The tier line falls on which + * `ICryptoProvider` / driver factory a host injects into the admin plugin, not + * on whether the UI can manage datasources. + */ + +// ── Federation (ADR-0015 main body) ─────────────────────────────────── +export { ExternalDatasourceService } from './external-datasource-service.js'; +export type { + ExternalDatasourceServiceConfig, + DatasourceLike, + ObjectLike, + // Canonical minimal logger surface for the whole package. + Logger, +} from './external-datasource-service.js'; +export { ExternalDatasourceServicePlugin } from './plugin.js'; +export type { ExternalDatasourceServicePluginOptions } from './plugin.js'; + +// ── Runtime admin (ADR-0015 Addendum) ───────────────────────────────── +// Contracts (the canonical datasource-admin DTOs). +export type { + DatasourceOrigin, + SecretInput, + DatasourceDraft, + TestConnectionResult, + DatasourceSummary, + IDatasourceAdminService, + DatasourceConnectionSpec, + DatasourceDriverHandle, + IDatasourceDriverFactory, +} from './contracts/index.js'; + +// Decoupled lifecycle service + injected-config shape. +export { DatasourceAdminService } from './datasource-admin-service.js'; +export type { + DatasourceAdminServiceConfig, + StoredDatasource, + ProbeInput, +} from './datasource-admin-service.js'; + +// Kernel plugin (registers the `'datasource-admin'` service). +export { DatasourceAdminServicePlugin } from './datasource-admin-plugin.js'; +export type { + DatasourceAdminServicePluginOptions, + SecretBinder, +} from './datasource-admin-plugin.js'; + +// Host glue: dev driver factory + fail-closed secret binder. +export { createDefaultDatasourceDriverFactory } from './default-datasource-driver-factory.js'; +export { + createDatasourceSecretBinder, + toCredentialsRef, + parseCredentialsRef, +} from './datasource-secret-binder.js'; +export type { + DatasourceSecretBinder, + DatasourceSecretBinderDeps, + SecretStoreEngineLike, +} from './datasource-secret-binder.js'; + +// REST routes. +export { registerDatasourceAdminRoutes } from './admin-routes.js'; diff --git a/packages/services/service-datasource/src/logger.ts b/packages/services/service-datasource/src/logger.ts new file mode 100644 index 000000000..d6292e8bb --- /dev/null +++ b/packages/services/service-datasource/src/logger.ts @@ -0,0 +1,11 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Minimal logger surface used by the runtime-admin half of this package. + * (Structurally identical to the federation service's own `Logger`; kept + * separate so the admin modules carry no internal import coupling.) + */ +export interface Logger { + warn: (message: string, meta?: unknown) => void; + info?: (message: string, meta?: unknown) => void; +} diff --git a/packages/services/service-external-datasource/src/plugin.ts b/packages/services/service-datasource/src/plugin.ts similarity index 100% rename from packages/services/service-external-datasource/src/plugin.ts rename to packages/services/service-datasource/src/plugin.ts diff --git a/packages/services/service-external-datasource/tsconfig.json b/packages/services/service-datasource/tsconfig.json similarity index 100% rename from packages/services/service-external-datasource/tsconfig.json rename to packages/services/service-datasource/tsconfig.json diff --git a/packages/services/service-datasource-admin/tsup.config.ts b/packages/services/service-datasource/tsup.config.ts similarity index 100% rename from packages/services/service-datasource-admin/tsup.config.ts rename to packages/services/service-datasource/tsup.config.ts diff --git a/packages/services/service-external-datasource/package.json b/packages/services/service-external-datasource/package.json deleted file mode 100644 index a3efa84fa..000000000 --- a/packages/services/service-external-datasource/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "@objectstack/service-external-datasource", - "version": "7.5.0", - "license": "Apache-2.0", - "description": "External Datasource Federation service for ObjectStack — implements IExternalDatasourceService (introspect, draft, validate) per ADR-0015", - "type": "module", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "require": "./dist/index.cjs" - } - }, - "scripts": { - "build": "tsup --config ../../../tsup.config.ts", - "test": "vitest run" - }, - "dependencies": { - "@objectstack/core": "workspace:*", - "@objectstack/spec": "workspace:*" - }, - "devDependencies": { - "@types/node": "^25.9.1", - "typescript": "^6.0.3", - "vitest": "^4.1.8" - }, - "keywords": [ - "objectstack", - "service", - "external-datasource", - "federation", - "introspection" - ], - "author": "ObjectStack", - "repository": { - "type": "git", - "url": "https://github.com/objectstack-ai/framework.git", - "directory": "packages/services/service-external-datasource" - }, - "homepage": "https://objectstack.ai/docs", - "bugs": "https://github.com/objectstack-ai/framework/issues", - "publishConfig": { - "access": "public" - } -} diff --git a/packages/services/service-external-datasource/src/index.ts b/packages/services/service-external-datasource/src/index.ts deleted file mode 100644 index 1d2b9299f..000000000 --- a/packages/services/service-external-datasource/src/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license. - -// Core service -export { ExternalDatasourceService } from './external-datasource-service.js'; -export type { - ExternalDatasourceServiceConfig, - DatasourceLike, - ObjectLike, - Logger, -} from './external-datasource-service.js'; - -// NOTE: the runtime datasource *lifecycle* (DatasourceAdminService / -// DatasourceAdminServicePlugin, ADR-0015 Addendum) was extracted into the -// private `@objectstack/datasource-admin` package. This package keeps only -// *federation* (introspect / draft / import / validate) — ADR-0015 main body. - -// Kernel plugin -export { ExternalDatasourceServicePlugin } from './plugin.js'; -export type { ExternalDatasourceServicePluginOptions } from './plugin.js'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ce2a44c3..38699077b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -536,12 +536,9 @@ importers: '@objectstack/service-cache': specifier: workspace:* version: link:../services/service-cache - '@objectstack/service-datasource-admin': + '@objectstack/service-datasource': specifier: workspace:* - version: link:../services/service-datasource-admin - '@objectstack/service-external-datasource': - specifier: workspace:* - version: link:../services/service-external-datasource + version: link:../services/service-datasource '@objectstack/service-feed': specifier: workspace:* version: link:../services/service-feed @@ -1823,7 +1820,7 @@ importers: specifier: ^4.1.8 version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(happy-dom@20.9.0)(msw@2.14.6(@types/node@25.9.1)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) - packages/services/service-datasource-admin: + packages/services/service-datasource: dependencies: '@objectstack/core': specifier: workspace:* @@ -1857,25 +1854,6 @@ importers: specifier: ^4.1.8 version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(happy-dom@20.9.0)(msw@2.14.6(@types/node@25.9.1)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) - packages/services/service-external-datasource: - dependencies: - '@objectstack/core': - specifier: workspace:* - version: link:../../core - '@objectstack/spec': - specifier: workspace:* - version: link:../../spec - devDependencies: - '@types/node': - specifier: ^25.9.1 - version: 25.9.1 - typescript: - specifier: ^6.0.3 - version: 6.0.3 - vitest: - specifier: ^4.1.8 - version: 4.1.8(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(@vitest/coverage-v8@4.1.8)(happy-dom@20.9.0)(msw@2.14.6(@types/node@25.9.1)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.22.4)(yaml@2.9.0)) - packages/services/service-feed: dependencies: '@objectstack/core':