@sixb/core 0.1.9 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/index.js +8 -8
- package/dist/agents/index.js +16 -15
- package/dist/agents/index.js.map +1 -1
- package/dist/bootstrap/index.js +20 -19
- package/dist/bootstrap/index.js.map +1 -1
- package/dist/broker/in-memory.d.ts +8 -2
- package/dist/broker/in-memory.d.ts.map +1 -1
- package/dist/broker/index.d.ts +4 -2
- package/dist/broker/index.d.ts.map +1 -1
- package/dist/broker/index.js +7 -3
- package/dist/broker/index.js.map +1 -1
- package/dist/broker/retention.d.ts +4 -0
- package/dist/broker/retention.d.ts.map +1 -0
- package/dist/broker/subscriber.d.ts +10 -0
- package/dist/broker/subscriber.d.ts.map +1 -0
- package/dist/broker/types.d.ts +14 -1
- package/dist/broker/types.d.ts.map +1 -1
- package/dist/{chunk-k3cqkkn2.js → chunk-1824gssz.js} +30 -65
- package/dist/chunk-1824gssz.js.map +12 -0
- package/dist/{chunk-h1gfhhbh.js → chunk-28ja2cjs.js} +1 -1
- package/dist/chunk-2c4j899j.js.map +1 -1
- package/dist/{chunk-ppytyr6w.js → chunk-358caqf5.js} +4 -4
- package/dist/chunk-358caqf5.js.map +12 -0
- package/dist/{chunk-kxwa347f.js → chunk-3qms4nax.js} +2 -2
- package/dist/{chunk-kxwa347f.js.map → chunk-3qms4nax.js.map} +3 -3
- package/dist/{chunk-emyyk7dx.js → chunk-5c7ga8zz.js} +22 -145
- package/dist/chunk-5c7ga8zz.js.map +12 -0
- package/dist/{chunk-hpr1r6av.js → chunk-5p1v802y.js} +46 -39
- package/dist/{chunk-hpr1r6av.js.map → chunk-5p1v802y.js.map} +4 -4
- package/dist/{chunk-zcnq6105.js → chunk-85cd7e8c.js} +2 -1
- package/dist/chunk-85cd7e8c.js.map +10 -0
- package/dist/{chunk-1enhpacz.js → chunk-976rxdpx.js} +5 -5
- package/dist/{chunk-3f7veca0.js → chunk-9x8dybsb.js} +3 -3
- package/dist/chunk-9x8dybsb.js.map +10 -0
- package/dist/{chunk-r29fxdhn.js → chunk-aa6z4a19.js} +160 -44
- package/dist/chunk-aa6z4a19.js.map +12 -0
- package/dist/{chunk-r4tfx1sf.js → chunk-agbbygvh.js} +4 -4
- package/dist/{chunk-jjy0fhrn.js → chunk-b0ec55a1.js} +20 -3
- package/dist/chunk-b0ec55a1.js.map +12 -0
- package/dist/{chunk-xfbydgzy.js → chunk-bn138h9w.js} +7 -8
- package/dist/{chunk-xfbydgzy.js.map → chunk-bn138h9w.js.map} +3 -3
- package/dist/{chunk-an5tt9y0.js → chunk-ftv470j8.js} +42 -4
- package/dist/{chunk-an5tt9y0.js.map → chunk-ftv470j8.js.map} +7 -7
- package/dist/{chunk-0w35wavj.js → chunk-g7knyczr.js} +1 -1
- package/dist/{chunk-x57ycxq0.js → chunk-gqh45d2n.js} +42 -3
- package/dist/{chunk-x57ycxq0.js.map → chunk-gqh45d2n.js.map} +3 -3
- package/dist/{chunk-0rdrecsb.js → chunk-kfee1h52.js} +116 -32
- package/dist/chunk-kfee1h52.js.map +13 -0
- package/dist/{chunk-ypbtykv6.js → chunk-nmbxcaqx.js} +1 -1
- package/dist/{chunk-3tgwrcyh.js → chunk-nt99sxd6.js} +2 -2
- package/dist/{chunk-3tgwrcyh.js.map → chunk-nt99sxd6.js.map} +3 -3
- package/dist/{chunk-vf691g1r.js → chunk-p5vcsw9c.js} +2 -2
- package/dist/{chunk-mjbk2djy.js → chunk-p6a4npdx.js} +211 -106
- package/dist/{chunk-mjbk2djy.js.map → chunk-p6a4npdx.js.map} +9 -8
- package/dist/{chunk-3frsnm7x.js → chunk-qma80ych.js} +4 -6
- package/dist/chunk-qma80ych.js.map +11 -0
- package/dist/{chunk-qhcpj9wc.js → chunk-qyeptdyv.js} +96 -2
- package/dist/chunk-qyeptdyv.js.map +15 -0
- package/dist/{chunk-52hbv0ak.js → chunk-r7fj830t.js} +101 -48
- package/dist/chunk-r7fj830t.js.map +36 -0
- package/dist/{chunk-xyr8kppc.js → chunk-rtk71jzp.js} +1 -1
- package/dist/{chunk-m3z3x9v0.js → chunk-t1f4f1ve.js} +1 -1
- package/dist/chunk-v2vcg0w6.js +151 -0
- package/dist/chunk-v2vcg0w6.js.map +11 -0
- package/dist/connectors/connections/authorizations.d.ts.map +1 -1
- package/dist/connectors/connections/contracts.d.ts +3 -0
- package/dist/connectors/connections/contracts.d.ts.map +1 -1
- package/dist/connectors/connections/internal.js +1 -1
- package/dist/connectors/connections/request.d.ts +3 -1
- package/dist/connectors/connections/request.d.ts.map +1 -1
- package/dist/connectors/connections/runs.d.ts.map +1 -1
- package/dist/connectors/connections/tokens.d.ts.map +1 -1
- package/dist/connectors/connections/validation.d.ts +5 -1
- package/dist/connectors/connections/validation.d.ts.map +1 -1
- package/dist/connectors/types.d.ts +19 -4
- package/dist/connectors/types.d.ts.map +1 -1
- package/dist/events/execution.d.ts +1 -1
- package/dist/events/execution.d.ts.map +1 -1
- package/dist/events/index.js +1 -1
- package/dist/events/service.d.ts +2 -2
- package/dist/events/service.d.ts.map +1 -1
- package/dist/execution/agent.js +16 -15
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/primitive.js +16 -15
- package/dist/execution/primitive.js.map +2 -2
- package/dist/execution/request.js +16 -15
- package/dist/execution/request.js.map +2 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -28
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/changes.d.ts +5 -0
- package/dist/lake-storage/changes.d.ts.map +1 -0
- package/dist/lake-storage/in-memory.d.ts +2 -1
- package/dist/lake-storage/in-memory.d.ts.map +1 -1
- package/dist/lake-storage/index.d.ts +2 -1
- package/dist/lake-storage/index.d.ts.map +1 -1
- package/dist/lake-storage/index.js +4 -2
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/lake-storage/types.d.ts +36 -0
- package/dist/lake-storage/types.d.ts.map +1 -1
- package/dist/logging/internal.js +1 -1
- package/dist/materialization/index.d.ts +1 -1
- package/dist/materialization/index.d.ts.map +1 -1
- package/dist/materialization/model.d.ts +12 -1
- package/dist/materialization/model.d.ts.map +1 -1
- package/dist/materializer/index.d.ts +1 -1
- package/dist/materializer/index.d.ts.map +1 -1
- package/dist/materializer/index.js +5 -5
- package/dist/materializer/materializer.d.ts +5 -1
- package/dist/materializer/materializer.d.ts.map +1 -1
- package/dist/materializer/projections/entry-validator.d.ts +2 -1
- package/dist/materializer/projections/entry-validator.d.ts.map +1 -1
- package/dist/materializer/projections/replace.d.ts.map +1 -1
- package/dist/materializer/projections/source-materialization.d.ts +4 -3
- package/dist/materializer/projections/source-materialization.d.ts.map +1 -1
- package/dist/materializer/shared/normalize.d.ts +2 -1
- package/dist/materializer/shared/normalize.d.ts.map +1 -1
- package/dist/models/execution/index.js +5 -5
- package/dist/objects/index.js +9 -9
- package/dist/objects/query/index.js +5 -5
- package/dist/pipelines/index.js +6 -6
- package/dist/pipelines/run-dispatch.d.ts.map +1 -1
- package/dist/projections/internal.js +6 -8
- package/dist/projections/internal.js.map +1 -1
- package/dist/projections/run-dispatch.d.ts.map +1 -1
- package/dist/queues/in-memory.d.ts +7 -3
- package/dist/queues/in-memory.d.ts.map +1 -1
- package/dist/queues/index.js +1 -1
- package/dist/queues/indexed-heap.d.ts +15 -0
- package/dist/queues/indexed-heap.d.ts.map +1 -0
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/internal.js +1 -1
- package/dist/runtime/ontology-mutations.d.ts +3 -1
- package/dist/runtime/ontology-mutations.d.ts.map +1 -1
- package/dist/shares/internal.js +4 -4
- package/dist/storage/connector-connections/in-memory.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider/runs.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.js +2 -2
- package/dist/storage/connector-connections/provider.js.map +3 -3
- package/dist/storage/connector-connections/types.d.ts +3 -2
- package/dist/storage/connector-connections/types.d.ts.map +1 -1
- package/dist/storage/index.d.ts +1 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +4 -4
- package/dist/storage/internal.js +1 -1
- package/dist/storage/ontology/in-memory/materializations-state.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts +1 -1
- package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/shared-state.d.ts +15 -2
- package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -1
- package/dist/storage/ontology/in-memory/source-roots.d.ts +6 -0
- package/dist/storage/ontology/in-memory/source-roots.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/sources.d.ts.map +1 -1
- package/dist/storage/ontology/index.d.ts +1 -1
- package/dist/storage/ontology/index.d.ts.map +1 -1
- package/dist/storage/ontology/provider.d.ts +16 -0
- package/dist/storage/ontology/provider.d.ts.map +1 -1
- package/dist/storage/ontology/provider.js +4 -2
- package/dist/storage/ontology/provider.js.map +1 -1
- package/dist/storage/ontology/sources.d.ts +13 -4
- package/dist/storage/ontology/sources.d.ts.map +1 -1
- package/dist/storage/projection-runs/lifecycle.d.ts.map +1 -1
- package/dist/storage/projection-runs/provider.js +2 -2
- package/dist/storage/projection-runs/types.d.ts +2 -0
- package/dist/storage/projection-runs/types.d.ts.map +1 -1
- package/dist/syncs/index.js +8 -7
- package/dist/syncs/index.js.map +1 -1
- package/dist/syncs/run-dispatch.d.ts.map +1 -1
- package/dist/testing/broker-contract.d.ts.map +1 -1
- package/dist/testing/connector-connection-storage-contract.d.ts.map +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1459 -951
- package/dist/testing/index.js.map +9 -8
- package/dist/testing/lake-changes-contract.d.ts +6 -0
- package/dist/testing/lake-changes-contract.d.ts.map +1 -0
- package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
- package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
- package/dist/testing/projection-run-storage-contract.d.ts.map +1 -1
- package/dist/webhooks/connections.d.ts +6 -0
- package/dist/webhooks/connections.d.ts.map +1 -0
- package/dist/webhooks/index.d.ts +1 -1
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/internal.d.ts +2 -0
- package/dist/webhooks/internal.d.ts.map +1 -1
- package/dist/webhooks/internal.js +54 -9
- package/dist/webhooks/internal.js.map +4 -3
- package/dist/webhooks/registry.d.ts +1 -1
- package/dist/webhooks/registry.d.ts.map +1 -1
- package/dist/webhooks/types.d.ts +15 -4
- package/dist/webhooks/types.d.ts.map +1 -1
- package/dist/workflows/index.js +17 -16
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/run-dispatch.d.ts +3 -1
- package/dist/workflows/run-dispatch.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/broker/in-memory.ts +104 -39
- package/src/broker/index.ts +4 -1
- package/src/broker/retention.ts +28 -0
- package/src/broker/subscriber.ts +21 -0
- package/src/broker/types.ts +15 -1
- package/src/connectors/builders.ts +0 -6
- package/src/connectors/connections/authorizations.ts +11 -5
- package/src/connectors/connections/contracts.ts +3 -0
- package/src/connectors/connections/request.ts +56 -22
- package/src/connectors/connections/runs.ts +1 -0
- package/src/connectors/connections/tokens.ts +4 -0
- package/src/connectors/connections/validation.ts +91 -5
- package/src/connectors/types.ts +19 -4
- package/src/events/execution.ts +2 -2
- package/src/events/service.ts +3 -3
- package/src/index.ts +10 -2
- package/src/lake-storage/changes.ts +43 -0
- package/src/lake-storage/in-memory.ts +73 -0
- package/src/lake-storage/index.ts +4 -0
- package/src/lake-storage/types.ts +40 -0
- package/src/logging/service.ts +1 -1
- package/src/materialization/index.ts +2 -0
- package/src/materialization/model.ts +14 -1
- package/src/materializer/index.ts +2 -0
- package/src/materializer/materializer.ts +10 -0
- package/src/materializer/projections/entry-validator.ts +19 -1
- package/src/materializer/projections/replace.ts +36 -1
- package/src/materializer/projections/source-materialization.ts +26 -6
- package/src/materializer/shared/normalize.ts +1 -1
- package/src/pipelines/run-dispatch.ts +21 -1
- package/src/projections/run-dispatch.ts +30 -68
- package/src/queues/in-memory.ts +105 -62
- package/src/queues/indexed-heap.ts +74 -0
- package/src/runtime/host.ts +0 -14
- package/src/runtime/ontology-mutations.ts +4 -0
- package/src/storage/connector-connections/in-memory.ts +3 -1
- package/src/storage/connector-connections/provider/runs.ts +3 -1
- package/src/storage/connector-connections/types.ts +3 -2
- package/src/storage/index.ts +1 -0
- package/src/storage/ontology/in-memory/materializations-state.ts +5 -18
- package/src/storage/ontology/in-memory/materializations.ts +73 -92
- package/src/storage/ontology/in-memory/shared-state.ts +26 -1
- package/src/storage/ontology/in-memory/source-roots.ts +123 -0
- package/src/storage/ontology/in-memory/sources.ts +78 -23
- package/src/storage/ontology/index.ts +1 -0
- package/src/storage/ontology/provider.ts +70 -0
- package/src/storage/ontology/sources.ts +14 -3
- package/src/storage/projection-runs/lifecycle.ts +5 -2
- package/src/storage/projection-runs/types.ts +4 -3
- package/src/syncs/run-dispatch.ts +19 -1
- package/src/testing/broker-contract.ts +95 -0
- package/src/testing/connector-connection-storage-contract.ts +18 -1
- package/src/testing/index.ts +1 -0
- package/src/testing/lake-changes-contract.ts +240 -0
- package/src/testing/materializer-storage-contract.ts +172 -1
- package/src/testing/ontology-storage-contract.ts +7 -0
- package/src/testing/projection-run-storage-contract.ts +34 -0
- package/src/webhooks/connections.ts +56 -0
- package/src/webhooks/index.ts +2 -0
- package/src/webhooks/internal.ts +2 -0
- package/src/webhooks/registry.ts +3 -4
- package/src/webhooks/types.ts +17 -4
- package/src/workflows/run-dispatch.ts +42 -29
- package/dist/chunk-0rdrecsb.js.map +0 -11
- package/dist/chunk-3f7veca0.js.map +0 -10
- package/dist/chunk-3frsnm7x.js.map +0 -11
- package/dist/chunk-52hbv0ak.js.map +0 -36
- package/dist/chunk-emyyk7dx.js.map +0 -14
- package/dist/chunk-jjy0fhrn.js.map +0 -12
- package/dist/chunk-k3cqkkn2.js.map +0 -12
- package/dist/chunk-ppytyr6w.js.map +0 -12
- package/dist/chunk-qhcpj9wc.js.map +0 -14
- package/dist/chunk-r29fxdhn.js.map +0 -11
- package/dist/chunk-zcnq6105.js.map +0 -10
- /package/dist/{chunk-h1gfhhbh.js.map → chunk-28ja2cjs.js.map} +0 -0
- /package/dist/{chunk-1enhpacz.js.map → chunk-976rxdpx.js.map} +0 -0
- /package/dist/{chunk-r4tfx1sf.js.map → chunk-agbbygvh.js.map} +0 -0
- /package/dist/{chunk-0w35wavj.js.map → chunk-g7knyczr.js.map} +0 -0
- /package/dist/{chunk-ypbtykv6.js.map → chunk-nmbxcaqx.js.map} +0 -0
- /package/dist/{chunk-vf691g1r.js.map → chunk-p5vcsw9c.js.map} +0 -0
- /package/dist/{chunk-xyr8kppc.js.map → chunk-rtk71jzp.js.map} +0 -0
- /package/dist/{chunk-m3z3x9v0.js.map → chunk-t1f4f1ve.js.map} +0 -0
|
@@ -6,16 +6,18 @@ import {
|
|
|
6
6
|
import {
|
|
7
7
|
ConnectorError2,
|
|
8
8
|
createConnectorCodedError,
|
|
9
|
-
getConnectorExecutionSourceResolver
|
|
10
|
-
|
|
11
|
-
} from "./chunk-emyyk7dx.js";
|
|
9
|
+
getConnectorExecutionSourceResolver
|
|
10
|
+
} from "./chunk-v2vcg0w6.js";
|
|
12
11
|
import {
|
|
13
12
|
isDatasetDefinition2
|
|
14
13
|
} from "./chunk-860dwwy0.js";
|
|
14
|
+
import {
|
|
15
|
+
SyncValidationError2
|
|
16
|
+
} from "./chunk-5c7ga8zz.js";
|
|
15
17
|
import {
|
|
16
18
|
isOAuthConnectorAdapter,
|
|
17
19
|
isConnectorDefinition
|
|
18
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-9x8dybsb.js";
|
|
19
21
|
|
|
20
22
|
// src/syncs/builders.ts
|
|
21
23
|
function assertNonEmpty(value, field) {
|
|
@@ -103,9 +105,6 @@ function defineConnector2(id, adapter) {
|
|
|
103
105
|
if (!isOAuthConnectorAdapter(adapter) || typeof adapter.authentication.authorizationUrl !== "function" || typeof adapter.authentication.exchangeCode !== "function" || typeof adapter.authentication.refresh !== "function" || typeof adapter.discoverAccounts !== "function") {
|
|
104
106
|
throw createConnectorCodedError("connector.configuration_invalid", "OAuth connector adapters must define oauth2 authentication and implement authorizationUrl, exchangeCode, refresh, and discoverAccounts.");
|
|
105
107
|
}
|
|
106
|
-
if (adapter.webhooks !== undefined) {
|
|
107
|
-
throw createConnectorCodedError("connector.configuration_invalid", "OAuth connector adapters cannot register webhooks until connection routing is defined.");
|
|
108
|
-
}
|
|
109
108
|
}
|
|
110
109
|
return {
|
|
111
110
|
kind: "connector",
|
|
@@ -125,4 +124,4 @@ function isRecord(value) {
|
|
|
125
124
|
}
|
|
126
125
|
export { defineConnector2, defineSync2, resolveSyncConnectorSources2, isSyncDefinition2 };
|
|
127
126
|
|
|
128
|
-
//# debugId=
|
|
127
|
+
//# debugId=99DD47F6247AC4A364756E2164756E21
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import type { AnyConnectorAdapter, ConnectorDefinition } from \"../connectors\"\nimport type { DatasetDefinition } from \"../datasets\"\nimport type { ScheduleDefinition, ScheduleReference } from \"../schedules\"\nimport { isScheduleDefinition } from \"../schedules\"\nimport { SyncValidationError } from \"./errors\"\nimport type {\n BatchSyncConfig,\n BatchSyncDefinitionConfig,\n SyncBuilder,\n SyncDefinition,\n SyncMode,\n SyncReadBuilder,\n SyncTargetBuilder,\n} from \"./types\"\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (!value.trim()) {\n throw new SyncValidationError(`Sync ${field} must not be empty.`)\n }\n}\n\nfunction assertDataset(dataset: DatasetDefinition, mode: SyncMode): void {\n assertNonEmpty(dataset.id, \"dataset id\")\n if (mode === \"merge\" && dataset.primaryKey === undefined) {\n throw new SyncValidationError(`Merge sync dataset '${dataset.id}' must define a primaryKey.`)\n }\n}\n\nfunction normalizeBatchSyncConfig(options: BatchSyncConfig | undefined): BatchSyncDefinitionConfig {\n const mode = options?.mode ?? \"snapshot\"\n\n if (mode !== \"snapshot\" && mode !== \"append\" && mode !== \"merge\") {\n throw new SyncValidationError(\n `Invalid sync mode '${String(mode)}'. Expected 'snapshot', 'append', or 'merge'.`\n )\n }\n\n return {\n kind: \"batch\",\n mode,\n }\n}\n\ntype DefaultBatchSyncConfig = Omit<BatchSyncConfig, \"mode\"> & { readonly mode?: undefined }\n\n/**\n * Define a batch sync that reads from one connector and writes into one dataset.\n *\n * The returned definition is inert and safe to export from `syncs/` modules.\n * Supports `snapshot`, `append`, and keyed `merge` modes with optional triggers and checkpoints.\n */\nexport function defineSync<TId extends string>(\n id: TId,\n options?: DefaultBatchSyncConfig\n): SyncBuilder<TId, never, \"snapshot\">\nexport function defineSync<TId extends string, const TMode extends SyncMode>(\n id: TId,\n options: BatchSyncConfig<TMode> & { readonly mode: TMode }\n): SyncBuilder<TId, never, TMode>\nexport function defineSync<TId extends string>(\n id: TId,\n options: BatchSyncConfig\n): SyncBuilder<TId, never, SyncMode>\nexport function defineSync<TId extends string>(\n id: TId,\n options?: BatchSyncConfig\n): SyncBuilder<TId, never, SyncMode> {\n assertNonEmpty(id, \"id\")\n\n const config = normalizeBatchSyncConfig(options)\n const triggers: ScheduleReference[] = []\n\n function createBuilder<TCheckpoint>(): SyncBuilder<TId, TCheckpoint, SyncMode> {\n const builder: SyncBuilder<TId, TCheckpoint, SyncMode> = {\n when(schedule: ScheduleDefinition): SyncBuilder<TId, TCheckpoint, SyncMode> {\n if (!isScheduleDefinition(schedule)) {\n throw new SyncValidationError(\"Sync .when(...) only accepts schedules.\")\n }\n triggers.push({ type: \"schedule\", scheduleId: schedule.id })\n return builder\n },\n checkpoint<TNextCheckpoint>(): SyncBuilder<TId, TNextCheckpoint, SyncMode> {\n return createBuilder<TNextCheckpoint>()\n },\n from<TConnector extends ConnectorDefinition<string, AnyConnectorAdapter>>(\n connector: TConnector\n ): SyncReadBuilder<TId, TConnector, TCheckpoint, SyncMode> {\n return {\n read(handler): SyncTargetBuilder<TId, TConnector, TCheckpoint, SyncMode> {\n return {\n intoDataset(\n dataset: DatasetDefinition\n ): SyncDefinition<TId, TConnector, TCheckpoint, SyncMode> {\n assertDataset(dataset, config.mode)\n\n return {\n kind: \"sync\",\n id,\n config,\n triggers,\n connector,\n read: handler,\n target: {\n kind: \"dataset\",\n dataset,\n },\n }\n },\n }\n },\n }\n },\n }\n\n return builder\n }\n\n return createBuilder<never>()\n}\n",
|
|
6
6
|
"import type { AnyConnectorAdapter, ConnectorDefinition, ConnectorRuntime } from \"../connectors\"\nimport {\n type ConnectorExecutionSource,\n type ConnectorExecutionSourceResolver,\n getConnectorExecutionSourceResolver,\n} from \"../connectors/execution\"\n\n/** One connector client invocation contributing values to a Sync run. */\nexport type SyncConnectorSource<TAdapter extends AnyConnectorAdapter = AnyConnectorAdapter> =\n ConnectorExecutionSource<TAdapter>\n\nexport type SyncConnectorSourceResolver = ConnectorExecutionSourceResolver\n\n/** Resolve the source invocations owned by one connector definition for a Sync execution. */\nexport function resolveSyncConnectorSources<TAdapter extends AnyConnectorAdapter>(\n connector: ConnectorRuntime,\n definition: ConnectorDefinition<string, TAdapter>\n): Promise<readonly SyncConnectorSource<TAdapter>[]> {\n return getConnectorExecutionSourceResolver(connector).list(definition)\n}\n",
|
|
7
|
-
"import { ConnectorError, createConnectorCodedError } from \"./errors\"\nimport type {\n AnyConnectorAdapter,\n ConnectorAdapter,\n ConnectorDefinition,\n OAuthConnectorAdapter,\n} from \"./types\"\nimport { isOAuthConnectorAdapter } from \"./types\"\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (!value.trim()) {\n throw new ConnectorError(`Connector ${field} must not be empty.`)\n }\n}\n\n/**\n * Define a connector instance for an external system.\n *\n * The returned definition is inert and can be exported from a project-level\n * `connectors/` module. Use `await sixb.connector(definition)` at runtime to\n * resolve it to a connected client.\n */\nexport function defineConnector<TId extends string, TAdapter extends OAuthConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter>\nexport function defineConnector<TId extends string, TAdapter extends ConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter>\nexport function defineConnector<TId extends string, TAdapter extends AnyConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter> {\n assertNonEmpty(id, \"id\")\n assertNonEmpty(adapter.type, \"type\")\n\n if (typeof adapter.connect !== \"function\") {\n throw new ConnectorError(\"Connector adapter connect must be a function.\")\n }\n\n if (adapter.authentication !== undefined) {\n if (\n !isOAuthConnectorAdapter(adapter) ||\n typeof adapter.authentication.authorizationUrl !== \"function\" ||\n typeof adapter.authentication.exchangeCode !== \"function\" ||\n typeof adapter.authentication.refresh !== \"function\" ||\n typeof adapter.discoverAccounts !== \"function\"\n ) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"OAuth connector adapters must define oauth2 authentication and implement authorizationUrl, exchangeCode, refresh, and discoverAccounts.\"\n )\n }\n
|
|
7
|
+
"import { ConnectorError, createConnectorCodedError } from \"./errors\"\nimport type {\n AnyConnectorAdapter,\n ConnectorAdapter,\n ConnectorDefinition,\n OAuthConnectorAdapter,\n} from \"./types\"\nimport { isOAuthConnectorAdapter } from \"./types\"\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (!value.trim()) {\n throw new ConnectorError(`Connector ${field} must not be empty.`)\n }\n}\n\n/**\n * Define a connector instance for an external system.\n *\n * The returned definition is inert and can be exported from a project-level\n * `connectors/` module. Use `await sixb.connector(definition)` at runtime to\n * resolve it to a connected client.\n */\nexport function defineConnector<TId extends string, TAdapter extends OAuthConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter>\nexport function defineConnector<TId extends string, TAdapter extends ConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter>\nexport function defineConnector<TId extends string, TAdapter extends AnyConnectorAdapter>(\n id: TId,\n adapter: TAdapter\n): ConnectorDefinition<TId, TAdapter> {\n assertNonEmpty(id, \"id\")\n assertNonEmpty(adapter.type, \"type\")\n\n if (typeof adapter.connect !== \"function\") {\n throw new ConnectorError(\"Connector adapter connect must be a function.\")\n }\n\n if (adapter.authentication !== undefined) {\n if (\n !isOAuthConnectorAdapter(adapter) ||\n typeof adapter.authentication.authorizationUrl !== \"function\" ||\n typeof adapter.authentication.exchangeCode !== \"function\" ||\n typeof adapter.authentication.refresh !== \"function\" ||\n typeof adapter.discoverAccounts !== \"function\"\n ) {\n throw createConnectorCodedError(\n \"connector.configuration_invalid\",\n \"OAuth connector adapters must define oauth2 authentication and implement authorizationUrl, exchangeCode, refresh, and discoverAccounts.\"\n )\n }\n }\n\n return {\n kind: \"connector\",\n id,\n adapter,\n }\n}\n",
|
|
8
8
|
"import type { BlobStorage } from \"../blob-storage\"\nimport {\n type AnyConnectorAdapter,\n type ConnectorAdapter,\n type ConnectorClient,\n type ConnectorConnectionMetadata,\n type ConnectorDefinition,\n isConnectorDefinition,\n type OAuthConnectorAdapter,\n} from \"../connectors\"\nimport type { DatasetDefinition, DatasetPrimaryKey, MergeChange } from \"../datasets\"\nimport { isDatasetDefinition } from \"../datasets\"\nimport type { Logger } from \"../logging\"\nimport type { ScheduleDefinition, ScheduleReference } from \"../schedules\"\nimport { isScheduleReference } from \"../schedules\"\n\n/** Blob operations available to sync read handlers. */\nexport type SyncBlobContext = Pick<BlobStorage, \"put\" | \"open\" | \"stat\">\n\n/** Non-secret connector connection metadata available to OAuth-backed Sync handlers. */\nexport type SyncConnectorConnection = ConnectorConnectionMetadata\n\ntype SyncConnectionContext<TAdapter extends AnyConnectorAdapter> =\n TAdapter extends OAuthConnectorAdapter\n ? { readonly connection: SyncConnectorConnection }\n : { readonly connection?: undefined }\n\n/** Context passed to a sync read handler. */\nexport type SyncReadContext<\n TCheckpoint = never,\n TAdapter extends AnyConnectorAdapter = ConnectorAdapter,\n> = {\n readonly projectId: string\n readonly syncId: string\n readonly signal: AbortSignal\n readonly blobs: SyncBlobContext\n readonly logger: Logger\n} & ([TCheckpoint] extends [never]\n ? { readonly checkpoint?: undefined }\n : {\n readonly checkpoint?: TCheckpoint\n setCheckpoint(next: TCheckpoint): void\n }) &\n SyncConnectionContext<TAdapter>\n\nexport type SyncMode = \"snapshot\" | \"append\" | \"merge\"\n\ntype MergeSyncChange = MergeChange<\n Readonly<Record<string, unknown>>,\n Readonly<Record<string, unknown>>\n>\n\n/** A sync read handler may return one item, a sync iterable, or an async iterable. */\nexport type SyncReadResult<TMode extends SyncMode = SyncMode> = TMode extends \"merge\"\n ? MergeSyncChange | Iterable<MergeSyncChange> | AsyncIterable<MergeSyncChange>\n : unknown | Iterable<unknown> | AsyncIterable<unknown>\n\n/** User-facing batch sync options accepted by `defineSync(...)`. */\nexport interface BatchSyncConfig<TMode extends SyncMode = SyncMode> {\n readonly mode?: TMode\n}\n\n/** Normalized batch sync config stored on the final sync definition. */\nexport interface BatchSyncDefinitionConfig<TMode extends SyncMode = SyncMode> {\n readonly kind: \"batch\"\n readonly mode: TMode\n}\n\n/** V1 syncs always target a named raw dataset. */\nexport interface DatasetSyncTarget {\n readonly kind: \"dataset\"\n readonly dataset: DatasetDefinition\n}\n\n/**\n * Connector-scoped read handler used by batch sync definitions.\n *\n * This intentionally uses TypeScript's method-parameter bivariance behavior so syncs with\n * different checkpoint types can still be stored as general `SyncDefinition[]` values. The\n * builder still gives users precise `context.checkpoint` and `setCheckpoint(...)` types when\n * they author a sync.\n */\nexport type SyncReadHandler<\n TAdapter extends AnyConnectorAdapter,\n TCheckpoint = never,\n TMode extends SyncMode = SyncMode,\n> = {\n bivarianceHack(\n client: ConnectorClient<TAdapter>,\n context: SyncReadContext<TCheckpoint, TAdapter>\n ): SyncReadResult<TMode> | Promise<SyncReadResult<TMode>>\n}[\"bivarianceHack\"]\n\n/**\n * Inert sync definition registered with Sixb.\n *\n * V1 supports batch syncs only. Definitions are declarative metadata and do not\n * start any background work on their own.\n */\nexport interface SyncDefinition<\n TId extends string = string,\n TConnector extends ConnectorDefinition<string, AnyConnectorAdapter> = ConnectorDefinition<\n string,\n AnyConnectorAdapter\n >,\n TCheckpoint = unknown,\n TMode extends SyncMode = SyncMode,\n> {\n readonly kind: \"sync\"\n readonly id: TId\n readonly config: BatchSyncDefinitionConfig<TMode>\n readonly triggers: readonly ScheduleReference[]\n readonly connector: TConnector\n readonly read: SyncReadHandler<TConnector[\"adapter\"], TCheckpoint, TMode>\n readonly target: DatasetSyncTarget\n}\n\nexport interface SyncTargetBuilder<\n TId extends string = string,\n TConnector extends ConnectorDefinition<string, AnyConnectorAdapter> = ConnectorDefinition<\n string,\n AnyConnectorAdapter\n >,\n TCheckpoint = never,\n TMode extends SyncMode = SyncMode,\n> {\n intoDataset<TDataset extends DatasetDefinition>(\n dataset: TMode extends \"merge\"\n ? TDataset & { readonly primaryKey: DatasetPrimaryKey }\n : TDataset\n ): SyncDefinition<TId, TConnector, TCheckpoint, TMode>\n}\n\nexport interface SyncReadBuilder<\n TId extends string = string,\n TConnector extends ConnectorDefinition<string, AnyConnectorAdapter> = ConnectorDefinition<\n string,\n AnyConnectorAdapter\n >,\n TCheckpoint = never,\n TMode extends SyncMode = SyncMode,\n> {\n read(\n handler: SyncReadHandler<TConnector[\"adapter\"], TCheckpoint, TMode>\n ): SyncTargetBuilder<TId, TConnector, TCheckpoint, TMode>\n}\n\nexport interface SyncBuilder<\n TId extends string = string,\n TCheckpoint = never,\n TMode extends SyncMode = SyncMode,\n> {\n when(schedule: ScheduleDefinition): SyncBuilder<TId, TCheckpoint, TMode>\n checkpoint<TNextCheckpoint>(): SyncBuilder<TId, TNextCheckpoint, TMode>\n from<TConnector extends ConnectorDefinition<string, AnyConnectorAdapter>>(\n connector: TConnector\n ): SyncReadBuilder<TId, TConnector, TCheckpoint, TMode>\n}\n\n/** Runtime type guard for values discovered from `syncs/` modules. */\nexport function isSyncDefinition(value: unknown): value is SyncDefinition {\n if (!isRecord(value)) {\n return false\n }\n\n return (\n value.kind === \"sync\" &&\n typeof value.id === \"string\" &&\n isRecord(value.config) &&\n value.config.kind === \"batch\" &&\n (value.config.mode === \"snapshot\" ||\n value.config.mode === \"append\" ||\n value.config.mode === \"merge\") &&\n Array.isArray(value.triggers) &&\n (value.triggers as unknown[]).every((reference) => isScheduleReference(reference)) &&\n isConnectorDefinition(value.connector) &&\n typeof value.read === \"function\" &&\n isRecord(value.target) &&\n value.target.kind === \"dataset\" &&\n isDatasetDefinition(value.target.dataset)\n )\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": "
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "99DD47F6247AC4A364756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|
|
@@ -34,7 +34,7 @@ import {
|
|
|
34
34
|
createCommitId2,
|
|
35
35
|
createEventId2,
|
|
36
36
|
materializationApplyPhase
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-gqh45d2n.js";
|
|
38
38
|
import {
|
|
39
39
|
ProjectionValidationError2,
|
|
40
40
|
validateProjectionsAtStartup,
|
|
@@ -3122,6 +3122,12 @@ function createProjectionEntryValidator(ontology, resolved) {
|
|
|
3122
3122
|
const policy = createValidationPolicy(resolved);
|
|
3123
3123
|
return (entry) => validateProjectionEntry(ontology, resolved, policy, entry);
|
|
3124
3124
|
}
|
|
3125
|
+
function validateProjectionRootRef(resolved, root) {
|
|
3126
|
+
const definition = resolved.definition;
|
|
3127
|
+
const owned = definition._tag === "ObjectProjectionDefinition" ? root.kind === "object" && root.ref.objectTypeId === definition.objectTypeId : root.kind === "link" && root.ref.source.objectTypeId === definition.sourceObjectTypeId && root.ref.target.objectTypeId === definition.targetObjectTypeId && root.ref.linkId === definition.linkId;
|
|
3128
|
+
if (!owned)
|
|
3129
|
+
throw new MaterializationValidationError2("Projection root is outside its owned type or link scope.");
|
|
3130
|
+
}
|
|
3125
3131
|
function createValidationPolicy(resolved) {
|
|
3126
3132
|
const ownedProperties = new Map(resolved.ownership.objects.map((object) => [object.objectTypeId, new Set(object.propertyIds)]));
|
|
3127
3133
|
const ownedLinks = new Set(resolved.ownership.links.map((link) => linkOwnershipKey(link.sourceObjectTypeId, link.linkId)));
|
|
@@ -3478,13 +3484,23 @@ async function stageProjectionMaterialization(context, input) {
|
|
|
3478
3484
|
projectionRevision: input.projectionRevision,
|
|
3479
3485
|
ownershipHash: input.ownershipHash,
|
|
3480
3486
|
ontologyRevision: context.projectionRegistry.ontologyRevision,
|
|
3481
|
-
createdAt: input.createdAt
|
|
3487
|
+
createdAt: input.createdAt,
|
|
3488
|
+
...input.base ? { base: input.base } : {}
|
|
3482
3489
|
});
|
|
3483
3490
|
let rootCount = 0;
|
|
3484
3491
|
let assertionCount = 0;
|
|
3485
3492
|
async function* assertions() {
|
|
3486
3493
|
for await (const rawEntry of input.entries) {
|
|
3487
3494
|
throwIfAborted(input.signal);
|
|
3495
|
+
if ("deleted" in rawEntry) {
|
|
3496
|
+
if (!input.base || rawEntry.deleted !== true) {
|
|
3497
|
+
throw new MaterializationValidationError2("Explicit root deletions require a pinned source base.");
|
|
3498
|
+
}
|
|
3499
|
+
const root = normalizeProjectionEntity(rawEntry.root);
|
|
3500
|
+
validateProjectionRootRef(context.projectionRegistry.resolveSource(input.source.projectionId), root);
|
|
3501
|
+
yield { root, stagingOrdinal: rootCount++ };
|
|
3502
|
+
continue;
|
|
3503
|
+
}
|
|
3488
3504
|
const entry = input.validateEntry(normalizeProjectionSourceEntry2(rawEntry));
|
|
3489
3505
|
const stagingOrdinal = rootCount;
|
|
3490
3506
|
for (const assertion of entry.assertions) {
|
|
@@ -3505,7 +3521,8 @@ async function stageProjectionMaterialization(context, input) {
|
|
|
3505
3521
|
source: input.source,
|
|
3506
3522
|
materializationId: input.materializationId,
|
|
3507
3523
|
execution: input.execution,
|
|
3508
|
-
rows
|
|
3524
|
+
rows: rows.filter((row) => ("assertion" in row)),
|
|
3525
|
+
deletions: rows.filter((row) => !("assertion" in row))
|
|
3509
3526
|
});
|
|
3510
3527
|
}
|
|
3511
3528
|
await context.storage.ontology.sources.markReady({
|
|
@@ -3557,6 +3574,7 @@ function prepareProjectionReplacement(context, raw) {
|
|
|
3557
3574
|
datasetVersion,
|
|
3558
3575
|
execution,
|
|
3559
3576
|
entries: raw.input.entries,
|
|
3577
|
+
...raw.input.base ? { base: Object.freeze({ ...raw.input.base }) } : {},
|
|
3560
3578
|
resolved,
|
|
3561
3579
|
projectionKind,
|
|
3562
3580
|
runIdentity,
|
|
@@ -3622,6 +3640,7 @@ async function prepareProjectionCandidate(context, command) {
|
|
|
3622
3640
|
source: command.source
|
|
3623
3641
|
});
|
|
3624
3642
|
validateProjectionWatermark(active, command.datasetVersion);
|
|
3643
|
+
assertDeltaBase(active, command);
|
|
3625
3644
|
return {
|
|
3626
3645
|
materializationId: context.materializationId(),
|
|
3627
3646
|
createdAt: context.clock().toISOString(),
|
|
@@ -3643,6 +3662,7 @@ async function stageProjectionCandidate(context, command, candidate) {
|
|
|
3643
3662
|
ownershipHash: command.resolved.ownershipHash,
|
|
3644
3663
|
createdAt: candidate.createdAt,
|
|
3645
3664
|
entries: command.entries,
|
|
3665
|
+
...command.base ? { base: command.base } : {},
|
|
3646
3666
|
validateEntry: createProjectionEntryValidator(context.ontology, command.resolved)
|
|
3647
3667
|
};
|
|
3648
3668
|
const staged = await stageCandidateEntries(context, input, command.signal);
|
|
@@ -3666,6 +3686,14 @@ async function executeProjectionTransaction(context, storage, command, ready) {
|
|
|
3666
3686
|
const replay = await replayCommitRecord(context, command.identity, command.scopeExecution.executionId, storage);
|
|
3667
3687
|
if (replay)
|
|
3668
3688
|
return projectionReplayResult(replay, command);
|
|
3689
|
+
if (command.base) {
|
|
3690
|
+
const active = await storage.ontology.sources.getActive({
|
|
3691
|
+
projectId: context.projectId,
|
|
3692
|
+
source: command.source
|
|
3693
|
+
});
|
|
3694
|
+
validateProjectionWatermark(active, command.datasetVersion);
|
|
3695
|
+
assertDeltaBase(active, command);
|
|
3696
|
+
}
|
|
3669
3697
|
const origin = projectionOrigin(command);
|
|
3670
3698
|
throwIfAborted(command.signal);
|
|
3671
3699
|
const session = await storage.ontology.materializations.begin({
|
|
@@ -3783,6 +3811,11 @@ function validateProjectionWatermark(active, next) {
|
|
|
3783
3811
|
return;
|
|
3784
3812
|
assertPinnedDatasetWatermark2(active.datasetVersion, next, "Projection replacement");
|
|
3785
3813
|
}
|
|
3814
|
+
function assertDeltaBase(active, command) {
|
|
3815
|
+
if (command.base && (!active || active.materializationId !== command.base.materializationId || active.lastCommitId !== command.base.lastCommitId || active.projectionRevision !== command.runIdentity.projectionRevision || active.ontologyRevision !== command.runIdentity.ontologyRevision || active.ownershipHash !== command.runIdentity.ownershipHash)) {
|
|
3816
|
+
throw new MaterializationConflictError2("source-materialization", "Projection delta no longer matches the active source or its definition.");
|
|
3817
|
+
}
|
|
3818
|
+
}
|
|
3786
3819
|
|
|
3787
3820
|
// src/materializer/telemetry/plan.ts
|
|
3788
3821
|
async function planTelemetryAppend(context, storage, session, input, identity, origin, event) {
|
|
@@ -4292,6 +4325,10 @@ class OntologyMaterializer2 {
|
|
|
4292
4325
|
commit: (command) => commitEdits(this.context, command)
|
|
4293
4326
|
};
|
|
4294
4327
|
projections = {
|
|
4328
|
+
getActive: (source) => this.context.storage.ontology.sources.getActive({
|
|
4329
|
+
projectId: this.context.projectId,
|
|
4330
|
+
source
|
|
4331
|
+
}),
|
|
4295
4332
|
replace: (command) => replaceProjection(this.context, command),
|
|
4296
4333
|
finishRun: (command) => finishProjectionRun(this.context, command)
|
|
4297
4334
|
};
|
|
@@ -4304,6 +4341,7 @@ class OntologyMaterializer2 {
|
|
|
4304
4341
|
commit: (input) => this.edits.commit({ scope, input })
|
|
4305
4342
|
}),
|
|
4306
4343
|
projections: Object.freeze({
|
|
4344
|
+
getActive: (source) => this.projections.getActive(source),
|
|
4307
4345
|
replace: (input) => this.projections.replace({ scope, input }),
|
|
4308
4346
|
finishRun: (input) => this.projections.finishRun({ scope, input })
|
|
4309
4347
|
}),
|
|
@@ -4328,4 +4366,4 @@ function createOntologyMaterializer2(input) {
|
|
|
4328
4366
|
}
|
|
4329
4367
|
export { computeOntologyRevision2, computeProjectionRevision2, computeProjectionOwnershipHash2, ProjectionRegistry2, createActionIdempotencyKey2, createRuntimeIdempotencyKey2, createProjectionIdempotencyKey2, createRuntimeTelemetryIdempotencyKey2, createProjectionTelemetryIdempotencyKey2, createCommitIdentity2, timestampCommitIdentity2, createTimedCommitIdentity2, createProjectionMaterializationId2, createLinkScopeFingerprint2, normalizeJsonProperties2, normalizeOntologyEditCommit2, normalizeProjectionExecution2, normalizeProjectionSourceEntry2, normalizeTelemetryAppend2, OntologyMaterializer2, createOntologyMaterializer2 };
|
|
4330
4368
|
|
|
4331
|
-
//# debugId=
|
|
4369
|
+
//# debugId=45B690D58E462D3C64756E2164756E21
|