@ontrails/store 1.0.0-beta.15 → 1.0.0-beta.16

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.
Files changed (78) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +31 -15
  3. package/package.json +11 -3
  4. package/src/{internal/signal-identity.ts → adapter-support.ts} +15 -14
  5. package/src/crud-doctrine.ts +43 -0
  6. package/src/index.ts +6 -1
  7. package/src/jsonfile/runtime.ts +3 -5
  8. package/src/jsonfile/types.ts +2 -2
  9. package/src/store.ts +5 -6
  10. package/src/testing.ts +2 -2
  11. package/src/trails/crud.ts +4 -3
  12. package/src/trails/index.ts +5 -0
  13. package/src/trails/reconcile.ts +2 -2
  14. package/src/trails/utils.ts +1 -1
  15. package/src/types.ts +27 -26
  16. package/.agents/notes/2026-04-04/handoff-202604032309-9e85a104.md +0 -38
  17. package/.turbo/turbo-build.log +0 -1
  18. package/.turbo/turbo-lint.log +0 -3
  19. package/.turbo/turbo-typecheck.log +0 -1
  20. package/dist/index.d.ts +0 -3
  21. package/dist/index.d.ts.map +0 -1
  22. package/dist/index.js +0 -2
  23. package/dist/index.js.map +0 -1
  24. package/dist/internal/signal-identity.d.ts +0 -17
  25. package/dist/internal/signal-identity.d.ts.map +0 -1
  26. package/dist/internal/signal-identity.js +0 -81
  27. package/dist/internal/signal-identity.js.map +0 -1
  28. package/dist/jsonfile/index.d.ts +0 -3
  29. package/dist/jsonfile/index.d.ts.map +0 -1
  30. package/dist/jsonfile/index.js +0 -2
  31. package/dist/jsonfile/index.js.map +0 -1
  32. package/dist/jsonfile/runtime.d.ts +0 -19
  33. package/dist/jsonfile/runtime.d.ts.map +0 -1
  34. package/dist/jsonfile/runtime.js +0 -403
  35. package/dist/jsonfile/runtime.js.map +0 -1
  36. package/dist/jsonfile/types.d.ts +0 -40
  37. package/dist/jsonfile/types.d.ts.map +0 -1
  38. package/dist/jsonfile/types.js +0 -2
  39. package/dist/jsonfile/types.js.map +0 -1
  40. package/dist/store.d.ts +0 -16
  41. package/dist/store.d.ts.map +0 -1
  42. package/dist/store.js +0 -250
  43. package/dist/store.js.map +0 -1
  44. package/dist/testing.d.ts +0 -28
  45. package/dist/testing.d.ts.map +0 -1
  46. package/dist/testing.js +0 -90
  47. package/dist/testing.js.map +0 -1
  48. package/dist/trails/crud.d.ts +0 -38
  49. package/dist/trails/crud.d.ts.map +0 -1
  50. package/dist/trails/crud.js +0 -112
  51. package/dist/trails/crud.js.map +0 -1
  52. package/dist/trails/index.d.ts +0 -7
  53. package/dist/trails/index.d.ts.map +0 -1
  54. package/dist/trails/index.js +0 -4
  55. package/dist/trails/index.js.map +0 -1
  56. package/dist/trails/reconcile.d.ts +0 -36
  57. package/dist/trails/reconcile.d.ts.map +0 -1
  58. package/dist/trails/reconcile.js +0 -142
  59. package/dist/trails/reconcile.js.map +0 -1
  60. package/dist/trails/sync.d.ts +0 -25
  61. package/dist/trails/sync.d.ts.map +0 -1
  62. package/dist/trails/sync.js +0 -96
  63. package/dist/trails/sync.js.map +0 -1
  64. package/dist/trails/utils.d.ts +0 -51
  65. package/dist/trails/utils.d.ts.map +0 -1
  66. package/dist/trails/utils.js +0 -65
  67. package/dist/trails/utils.js.map +0 -1
  68. package/dist/types.d.ts +0 -394
  69. package/dist/types.d.ts.map +0 -1
  70. package/dist/types.js +0 -2
  71. package/dist/types.js.map +0 -1
  72. package/src/__tests__/crud.test.ts +0 -346
  73. package/src/__tests__/jsonfile.test.ts +0 -502
  74. package/src/__tests__/store.test.ts +0 -539
  75. package/src/__tests__/sync-reconcile.test.ts +0 -646
  76. package/tsconfig.json +0 -9
  77. package/tsconfig.tests.json +0 -10
  78. package/tsconfig.tsbuildinfo +0 -1
package/dist/store.js DELETED
@@ -1,250 +0,0 @@
1
- import { ValidationError } from '@ontrails/core';
2
- import { stripDefaultsFromShape } from '@ontrails/core/internal/zod-wrappers';
3
- import { z } from 'zod';
4
- import { createStoreTableSignals } from './internal/signal-identity.js';
5
- const isStoreObjectSchema = (schema) => schema.def.type === 'object' && 'shape' in schema.def;
6
- /**
7
- * Name of the framework-managed version column used by versioned tables for
8
- * optimistic concurrency control. Exported so connectors can gate their own
9
- * version-handling logic without duplicating the literal.
10
- */
11
- export const versionFieldName = 'version';
12
- const versionFieldSchema = z.number().int().positive();
13
- const uniqueStrings = (values) => Object.freeze([...(values === undefined ? [] : new Set(values))]);
14
- const uniqueMergedStrings = (...groups) => uniqueStrings(groups.flatMap((group) => [...(group ?? [])]));
15
- const hasField = (schema, field) => Object.hasOwn(schema.shape, field);
16
- const versionedSchema = (schema) => schema.extend({
17
- [versionFieldName]: versionFieldSchema,
18
- });
19
- const validateFieldList = (tableName, schema, fields, label) => {
20
- for (const field of fields) {
21
- if (hasField(schema, field)) {
22
- continue;
23
- }
24
- throw new ValidationError(`Store table "${tableName}" declares ${label} field "${field}" that is not present on the schema`);
25
- }
26
- };
27
- const validateReferences = (tableName, schema, references, tableNames) => {
28
- for (const [field, target] of Object.entries(references)) {
29
- if (!hasField(schema, field)) {
30
- throw new ValidationError(`Store table "${tableName}" declares reference field "${field}" that is not present on the schema`);
31
- }
32
- if (target !== undefined && tableNames.includes(target)) {
33
- continue;
34
- }
35
- throw new ValidationError(`Store table "${tableName}" references unknown table "${target}"`);
36
- }
37
- };
38
- const buildFieldMask = (fields) => Object.fromEntries(fields.map((field) => [field, true]));
39
- const omitFields = (schema, fields) => {
40
- if (fields.length === 0) {
41
- return schema;
42
- }
43
- return schema.omit(buildFieldMask(fields));
44
- };
45
- const partialFields = (schema, fields) => {
46
- if (fields.length === 0) {
47
- return schema;
48
- }
49
- return schema.partial(buildFieldMask(fields));
50
- };
51
- const deriveInsertSchema = (schema, generated) => omitFields(schema, generated);
52
- const deriveFixtureSchema = (schema, generated) => partialFields(schema, generated);
53
- const deriveUpdateSchema = (schema, identity) => {
54
- const partial = schema
55
- .extend(stripDefaultsFromShape(schema))
56
- .partial();
57
- // Only omit the identity field if it's still present (it may already be in `generated`)
58
- return hasField(partial, identity)
59
- ? omitFields(partial, [identity])
60
- : partial;
61
- };
62
- const formatFixtureIssues = (issues) => issues.map((issue) => issue.message).join('; ');
63
- const validateFixturePrimaryKeys = (tableName, identity, fixtures) => {
64
- const seen = new Set();
65
- for (const [index, fixture] of fixtures.entries()) {
66
- const identifier = fixture[identity];
67
- if (identifier === undefined) {
68
- continue;
69
- }
70
- if (seen.has(identifier)) {
71
- throw new ValidationError(`Store table "${tableName}" fixture ${index + 1} duplicates primary key "${String(identifier)}"`);
72
- }
73
- seen.add(identifier);
74
- }
75
- };
76
- const normalizeReferences = (references) => {
77
- const normalized = {};
78
- for (const [field, target] of Object.entries(references ?? {})) {
79
- if (target !== undefined) {
80
- normalized[field] = target;
81
- }
82
- }
83
- return Object.freeze(normalized);
84
- };
85
- const validatePrimaryKey = (tableName, schema, identity) => {
86
- if (hasField(schema, identity)) {
87
- return;
88
- }
89
- throw new ValidationError(`Store table "${tableName}" declares identity "${identity}" that is not present on the schema`);
90
- };
91
- const validateVersioning = (tableName, schema, versioned) => {
92
- if (!versioned || !hasField(schema, versionFieldName)) {
93
- return;
94
- }
95
- throw new ValidationError(`Store table "${tableName}" cannot declare a "${versionFieldName}" field when versioned storage is enabled because the framework manages that field.`);
96
- };
97
- const resolveStoreObjectSchema = (tableName, schema) => {
98
- if (isStoreObjectSchema(schema)) {
99
- return schema;
100
- }
101
- throw new ValidationError(`Store table "${tableName}" must use a Zod object schema`);
102
- };
103
- const resolveIdentity = (tableName, input) => {
104
- if (input.identity !== undefined &&
105
- input.primaryKey !== undefined &&
106
- input.identity !== input.primaryKey) {
107
- throw new ValidationError(`Store table "${tableName}" declares conflicting identity "${input.identity}" and primaryKey "${input.primaryKey}"`);
108
- }
109
- const identity = input.identity ?? input.primaryKey;
110
- if (identity !== undefined) {
111
- return identity;
112
- }
113
- throw new ValidationError(`Store table "${tableName}" must declare identity`);
114
- };
115
- const resolveIndexed = (input) => uniqueMergedStrings(input.indexed, input.indexes);
116
- const resolveVersioned = (input) => input.versioned === true;
117
- const validateTableInput = (tableName, schema, identity, generated, indexed, references, tableNames) => {
118
- validatePrimaryKey(tableName, schema, identity);
119
- validateFieldList(tableName, schema, generated, 'generated');
120
- validateFieldList(tableName, schema, indexed, 'indexed');
121
- validateReferences(tableName, schema, references, tableNames);
122
- };
123
- const fixtureListFrom = (fixtures) => (Array.isArray(fixtures) ? fixtures : []);
124
- const parseFixture = (tableName, fixtureSchema, fixture, index) => {
125
- const parsed = fixtureSchema.safeParse(fixture);
126
- if (!parsed.success) {
127
- throw new ValidationError(`Store table "${tableName}" fixture ${index + 1} is invalid: ${formatFixtureIssues(parsed.error.issues)}`);
128
- }
129
- return Object.freeze(parsed.data);
130
- };
131
- const normalizeFixtures = (tableName, identity, fixtureSchema, fixtures) => {
132
- const fixtureList = fixtureListFrom(fixtures);
133
- if (fixtureList.length === 0) {
134
- return Object.freeze([]);
135
- }
136
- const normalized = [];
137
- for (const [index, fixture] of fixtureList.entries()) {
138
- normalized.push(parseFixture(tableName, fixtureSchema, fixture, index));
139
- }
140
- validateFixturePrimaryKeys(tableName, identity, normalized);
141
- return Object.freeze(normalized);
142
- };
143
- const resolveTableSchema = (tableName, input) => {
144
- const authoredSchema = resolveStoreObjectSchema(tableName, input.schema);
145
- const versioned = resolveVersioned(input);
146
- validateVersioning(tableName, authoredSchema, versioned);
147
- return {
148
- schema: versioned ? versionedSchema(authoredSchema) : authoredSchema,
149
- versioned,
150
- };
151
- };
152
- const resolveGeneratedFields = (input, versioned) => versioned
153
- ? uniqueMergedStrings(input.generated, [versionFieldName])
154
- : uniqueStrings(input.generated);
155
- const freezeNormalizedTable = (name, input, resolved) => Object.freeze({
156
- fixtureSchema: resolved.fixtureSchema,
157
- fixtures: resolved.fixtures,
158
- generated: resolved.generated,
159
- identity: resolved.identity,
160
- indexed: resolved.indexed,
161
- indexes: resolved.indexed,
162
- insertSchema: resolved.insertSchema,
163
- name,
164
- primaryKey: resolved.identity,
165
- references: resolved.references,
166
- schema: resolved.schema,
167
- ...(input.search === undefined ? {} : { search: input.search }),
168
- signals: resolved.signals,
169
- updateSchema: deriveUpdateSchema(resolved.insertSchema, resolved.identity),
170
- versioned: resolved.versioned,
171
- });
172
- const resolveNormalizedTableState = (name, input, tableNames) => {
173
- const { schema, versioned } = resolveTableSchema(name, input);
174
- const identity = resolveIdentity(name, input);
175
- const generated = resolveGeneratedFields(input, versioned);
176
- const indexed = resolveIndexed(input);
177
- const references = normalizeReferences(input.references);
178
- validateTableInput(name, schema, identity, generated, indexed, references, tableNames);
179
- return {
180
- generated,
181
- identity,
182
- indexed,
183
- references,
184
- schema,
185
- versioned,
186
- };
187
- };
188
- const resolveNormalizedTableArtifacts = (name, input, resolved) => {
189
- const insertSchema = deriveInsertSchema(resolved.schema, resolved.generated);
190
- const fixtureSchema = deriveFixtureSchema(resolved.schema, resolved.generated);
191
- const fixtures = normalizeFixtures(name, resolved.identity, fixtureSchema, input.fixtures);
192
- const signals = createStoreTableSignals(name, resolved.schema);
193
- return {
194
- fixtureSchema,
195
- fixtures,
196
- generated: resolved.generated,
197
- identity: resolved.identity,
198
- indexed: resolved.indexed,
199
- insertSchema,
200
- references: resolved.references,
201
- schema: resolved.schema,
202
- signals,
203
- };
204
- };
205
- const normalizeTable = (name, input, tableNames) => {
206
- const resolved = resolveNormalizedTableState(name, input, tableNames);
207
- return freezeNormalizedTable(name, input, {
208
- ...resolveNormalizedTableArtifacts(name, input, resolved),
209
- versioned: resolved.versioned,
210
- });
211
- };
212
- const normalizeTables = (tables, tableNames) => {
213
- const normalized = {};
214
- for (const name of tableNames) {
215
- const input = tables[name];
216
- if (input !== undefined) {
217
- normalized[name] = normalizeTable(name, input, tableNames);
218
- }
219
- }
220
- return normalized;
221
- };
222
- const collectStoreSignals = (normalized, tableNames) => Object.freeze(tableNames.flatMap((name) => {
223
- const table = normalized[name];
224
- return table === undefined
225
- ? []
226
- : [table.signals.created, table.signals.updated, table.signals.removed];
227
- }));
228
- /**
229
- * Declare a connector-agnostic store definition from entity schemas and
230
- * persistence metadata.
231
- *
232
- * The returned value is a normalized, read-only contract that connectors can
233
- * bind to a concrete runtime later.
234
- */
235
- export const store = (tables, options = {}) => {
236
- const kind = options.kind ?? 'tabular';
237
- const tableNames = Object.freeze(Object.keys(tables).toSorted());
238
- const normalized = normalizeTables(tables, tableNames);
239
- const get = (name) => normalized[name];
240
- const signals = collectStoreSignals(normalized, tableNames);
241
- return Object.freeze({
242
- get,
243
- kind,
244
- signals,
245
- tableNames,
246
- tables: Object.freeze(normalized),
247
- type: 'store',
248
- });
249
- };
250
- //# sourceMappingURL=store.js.map
package/dist/store.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/testing.d.ts DELETED
@@ -1,28 +0,0 @@
1
- import type { AnyStoreTable, EntityOf, StoreAccessor, StoreIdentifierOf, UpsertOf } from './types.js';
2
- export interface StoreAccessorContractSubject<TTable extends AnyStoreTable> {
3
- readonly accessor: StoreAccessor<TTable>;
4
- readonly dispose?: () => Promise<void> | void;
5
- }
6
- export interface StoreAccessorContractOptions<TTable extends AnyStoreTable> {
7
- readonly createInput: () => UpsertOf<TTable>;
8
- readonly createSubject: (() => StoreAccessorContractSubject<TTable>) | (() => Promise<StoreAccessorContractSubject<TTable>>);
9
- readonly expectCreated: ((entity: EntityOf<TTable>, input: UpsertOf<TTable>) => void) | ((entity: EntityOf<TTable>, input: UpsertOf<TTable>) => Promise<void>);
10
- readonly expectUpdated: ((entity: EntityOf<TTable>, previous: EntityOf<TTable>, input: UpsertOf<TTable>) => void) | ((entity: EntityOf<TTable>, previous: EntityOf<TTable>, input: UpsertOf<TTable>) => Promise<void>);
11
- readonly missingId: StoreIdentifierOf<TTable>;
12
- readonly seedExisting?: ((accessor: StoreAccessor<TTable>) => Promise<EntityOf<TTable>>) | ((accessor: StoreAccessor<TTable>) => EntityOf<TTable>);
13
- readonly table: TTable;
14
- readonly updateInput: (existing: EntityOf<TTable>) => UpsertOf<TTable>;
15
- }
16
- export interface StoreAccessorContractCase {
17
- readonly name: string;
18
- readonly run: () => Promise<void>;
19
- }
20
- /**
21
- * Shared contract cases for connector-agnostic writable store accessors.
22
- *
23
- * Connectors can register these with their own `test(...)` wrappers so the
24
- * baseline `get/list/upsert/remove` contract stays aligned across runtimes
25
- * without fighting repository-specific test-lint rules.
26
- */
27
- export declare const createStoreAccessorContractCases: <TTable extends AnyStoreTable>(options: StoreAccessorContractOptions<TTable>) => readonly StoreAccessorContractCase[];
28
- //# sourceMappingURL=testing.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,QAAQ,EAER,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACT,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,4BAA4B,CAAC,MAAM,SAAS,aAAa;IACxE,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,4BAA4B,CAAC,MAAM,SAAS,aAAa;IACxE,QAAQ,CAAC,WAAW,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAClB,CAAC,MAAM,4BAA4B,CAAC,MAAM,CAAC,CAAC,GAC5C,CAAC,MAAM,OAAO,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,aAAa,EAClB,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,GAC7D,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,QAAQ,CAAC,aAAa,EAClB,CAAC,CACC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EACxB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC1B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KACpB,IAAI,CAAC,GACV,CAAC,CACC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EACxB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC1B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,YAAY,CAAC,EAClB,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAChE,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAuCD;;;;;;GAMG;AACH,eAAO,MAAM,gCAAgC,GAAI,MAAM,SAAS,aAAa,EAC3E,SAAS,4BAA4B,CAAC,MAAM,CAAC,KAC5C,SAAS,yBAAyB,EAgFzB,CAAC"}
package/dist/testing.js DELETED
@@ -1,90 +0,0 @@
1
- import { expect } from 'bun:test';
2
- const listByIdentity = async (table, accessor, entity) => {
3
- const identity = table.identity;
4
- const filters = {
5
- [identity]: entity[identity],
6
- };
7
- return await accessor.list(filters);
8
- };
9
- const withSubject = async (createSubject, run) => {
10
- const subject = await createSubject();
11
- try {
12
- return await run(subject);
13
- }
14
- finally {
15
- await subject.dispose?.();
16
- }
17
- };
18
- const seedExistingEntity = async (options, accessor) => {
19
- if (options.seedExisting !== undefined) {
20
- return await options.seedExisting(accessor);
21
- }
22
- return await accessor.upsert(options.createInput());
23
- };
24
- /**
25
- * Shared contract cases for connector-agnostic writable store accessors.
26
- *
27
- * Connectors can register these with their own `test(...)` wrappers so the
28
- * baseline `get/list/upsert/remove` contract stays aligned across runtimes
29
- * without fighting repository-specific test-lint rules.
30
- */
31
- export const createStoreAccessorContractCases = (options) => [
32
- {
33
- name: 'upsert creates an entity and exposes it through get/list',
34
- run: async () => {
35
- await withSubject(options.createSubject, async ({ accessor }) => {
36
- const input = options.createInput();
37
- const created = await accessor.upsert(input);
38
- await options.expectCreated(created, input);
39
- expect(await accessor.get(created[options.table.identity])).toEqual(created);
40
- expect(await listByIdentity(options.table, accessor, created)).toEqual([created]);
41
- });
42
- },
43
- },
44
- {
45
- name: 'upsert updates an existing entity in place when the identity matches',
46
- run: async () => {
47
- await withSubject(options.createSubject, async ({ accessor }) => {
48
- const existing = await seedExistingEntity(options, accessor);
49
- const input = options.updateInput(existing);
50
- const updated = await accessor.upsert(input);
51
- const identity = options.table.identity;
52
- expect(updated[identity]).toBe(existing[identity]);
53
- await options.expectUpdated(updated, existing, input);
54
- expect(await accessor.get(updated[identity])).toEqual(updated);
55
- expect(await listByIdentity(options.table, accessor, updated)).toEqual([updated]);
56
- });
57
- },
58
- },
59
- {
60
- name: 'remove deletes an existing entity',
61
- run: async () => {
62
- await withSubject(options.createSubject, async ({ accessor }) => {
63
- const existing = await seedExistingEntity(options, accessor);
64
- const identity = options.table.identity;
65
- const removed = await accessor.remove(existing[identity]);
66
- expect(removed).toEqual({ deleted: true });
67
- expect(await accessor.get(existing[identity])).toBeNull();
68
- });
69
- },
70
- },
71
- {
72
- name: 'get returns null for a missing identity',
73
- run: async () => {
74
- await withSubject(options.createSubject, async ({ accessor }) => {
75
- expect(await accessor.get(options.missingId)).toBeNull();
76
- });
77
- },
78
- },
79
- {
80
- name: 'remove reports false when the identity is missing',
81
- run: async () => {
82
- await withSubject(options.createSubject, async ({ accessor }) => {
83
- expect(await accessor.remove(options.missingId)).toEqual({
84
- deleted: false,
85
- });
86
- });
87
- },
88
- },
89
- ];
90
- //# sourceMappingURL=testing.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAgDlC,MAAM,cAAc,GAAG,KAAK,EAC1B,KAAa,EACb,QAA+B,EAC/B,MAAwB,EACc,EAAE;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAA2C,CAAC;IACnE,MAAM,OAAO,GAAG;QACd,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;KACR,CAAC;IAEvB,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,KAAK,EACvB,aAAoE,EACpE,GAAwE,EACtD,EAAE;IACpB,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;IAEtC,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,KAAK,EAC9B,OAA6C,EAC7C,QAA+B,EACJ,EAAE;IAC7B,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,MAAM,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC9C,OAA6C,EACP,EAAE,CACxC;IACE;QACE,IAAI,EAAE,0DAA0D;QAChE,GAAG,EAAE,KAAK,IAAI,EAAE;YACd,MAAM,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAE7C,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC5C,MAAM,CACJ,MAAM,QAAQ,CAAC,GAAG,CAChB,OAAO,CACL,OAAO,CAAC,KAAK,CAAC,QAA2C,CAC7B,CAC/B,CACF,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACnB,MAAM,CACJ,MAAM,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CACvD,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,IAAI,EAAE,sEAAsE;QAC5E,GAAG,EAAE,KAAK,IAAI,EAAE;YACd,MAAM,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBAC9D,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAC5C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QACvB,CAAC;gBAET,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACnD,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;gBACtD,MAAM,CACJ,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAA8B,CAAC,CACnE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACnB,MAAM,CACJ,MAAM,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CACvD,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,IAAI,EAAE,mCAAmC;QACzC,GAAG,EAAE,KAAK,IAAI,EAAE;YACd,MAAM,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBAC9D,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QACvB,CAAC;gBACT,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CACnC,QAAQ,CAAC,QAAQ,CAA8B,CAChD,CAAC;gBAEF,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3C,MAAM,CACJ,MAAM,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAA8B,CAAC,CACpE,CAAC,QAAQ,EAAE,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,IAAI,EAAE,yCAAyC;QAC/C,GAAG,EAAE,KAAK,IAAI,EAAE;YACd,MAAM,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBAC9D,MAAM,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC3D,CAAC,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,IAAI,EAAE,mDAAmD;QACzD,GAAG,EAAE,KAAK,IAAI,EAAE;YACd,MAAM,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBAC9D,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;oBACvD,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;KACF;CACO,CAAC"}
@@ -1,38 +0,0 @@
1
- import type { Implementation, Resource, Trail } from '@ontrails/core';
2
- import type { AnyStoreTable, EntityOf, FiltersOf, InsertOf, StoreAccessor, StoreIdentifierOf, UpdateOf } from '../types.js';
3
- type IdentityInputOf<TTable extends AnyStoreTable> = Readonly<Record<Extract<TTable['identity'], string>, StoreIdentifierOf<TTable>>>;
4
- type CrudConnection<TTable extends AnyStoreTable> = Readonly<Record<TTable['name'], StoreAccessor<TTable>>>;
5
- type CreateTrailOf<TTable extends AnyStoreTable> = Trail<InsertOf<TTable>, EntityOf<TTable>>;
6
- type ReadTrailOf<TTable extends AnyStoreTable> = Trail<IdentityInputOf<TTable>, EntityOf<TTable>>;
7
- type UpdateTrailOf<TTable extends AnyStoreTable> = Trail<IdentityInputOf<TTable> & UpdateOf<TTable>, EntityOf<TTable>>;
8
- type DeleteTrailOf<TTable extends AnyStoreTable> = Trail<IdentityInputOf<TTable>, undefined>;
9
- type ListTrailOf<TTable extends AnyStoreTable> = Trail<FiltersOf<TTable>, EntityOf<TTable>[]>;
10
- export type CrudTrails<TTable extends AnyStoreTable> = readonly [
11
- create: CreateTrailOf<TTable>,
12
- read: ReadTrailOf<TTable>,
13
- update: UpdateTrailOf<TTable>,
14
- remove: DeleteTrailOf<TTable>,
15
- list: ListTrailOf<TTable>
16
- ];
17
- export interface CrudBlazeOverrides<TTable extends AnyStoreTable> {
18
- readonly create?: Implementation<InsertOf<TTable>, EntityOf<TTable>>;
19
- readonly read?: Implementation<IdentityInputOf<TTable>, EntityOf<TTable>>;
20
- readonly update?: Implementation<IdentityInputOf<TTable> & UpdateOf<TTable>, EntityOf<TTable>>;
21
- readonly delete?: Implementation<IdentityInputOf<TTable>, undefined>;
22
- readonly list?: Implementation<FiltersOf<TTable>, EntityOf<TTable>[]>;
23
- }
24
- export interface CrudOptions<TTable extends AnyStoreTable> {
25
- readonly blaze?: CrudBlazeOverrides<TTable>;
26
- }
27
- /**
28
- * Produce the standard CRUD trail tuple for one normalized store table.
29
- *
30
- * The factory derives schemas, examples, resources, and contour linkage from
31
- * the table metadata. Blazes default to the connector-agnostic store accessor
32
- * contract via `deriveTrail()`'s single-resource synthesis path. Per-operation
33
- * blaze overrides stay available for callers that need custom persistence
34
- * behavior and are layered onto the derived trails in a single pass.
35
- */
36
- export declare function crud<TTable extends AnyStoreTable, TConnection extends CrudConnection<TTable>>(table: TTable, resource: Resource<TConnection>, options?: CrudOptions<TTable>): CrudTrails<TTable>;
37
- export {};
38
- //# sourceMappingURL=crud.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../src/trails/crud.ts"],"names":[],"mappings":"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"}
@@ -1,112 +0,0 @@
1
- import { deriveTrail } from '@ontrails/core/trails';
2
- import { createTableContour } from './utils.js';
3
- const normalizeExampleForOutput = (example, output) => {
4
- if (example.expected === undefined) {
5
- return example;
6
- }
7
- const parsed = output.safeParse(example.expected);
8
- return parsed.success
9
- ? {
10
- ...example,
11
- expected: parsed.data,
12
- }
13
- : undefined;
14
- };
15
- const normalizeExamplesForOutput = (base, output) => {
16
- const { examples } = base;
17
- if (examples === undefined || examples.length === 0) {
18
- return undefined;
19
- }
20
- const next = examples
21
- .map((example) => normalizeExampleForOutput(example, output))
22
- .filter((example) => example !== undefined);
23
- return next.length === 0
24
- ? undefined
25
- : Object.freeze(next);
26
- };
27
- const finalizeTrail = (base, options = {}) => Object.freeze({
28
- ...base,
29
- ...(options.blaze === undefined ? {} : { blaze: options.blaze }),
30
- ...(options.output === undefined
31
- ? {}
32
- : {
33
- examples: normalizeExamplesForOutput(base, options.output),
34
- output: options.output,
35
- }),
36
- ...(options.pattern === undefined ? {} : { pattern: options.pattern }),
37
- });
38
- const deriveCrudBaseTrails = (table, resource) => {
39
- const entityContour = createTableContour(table);
40
- // Narrow the store's `readonly string[]` to the contour's typed field-key
41
- // array so `deriveTrail`'s `TGenerated` generic picks up the precise
42
- // key-of shape that `CreateInputOf<Contour, TGenerated>` expects. The
43
- // runtime value is unchanged — the names in `table.generated` are already
44
- // keys of `table.schema.shape` by construction in `store()`.
45
- const generated = table.generated;
46
- return {
47
- createBase: deriveTrail(entityContour, 'create', {
48
- generated,
49
- resource,
50
- }),
51
- deleteBase: deriveTrail(entityContour, 'delete', {
52
- resource,
53
- }),
54
- listBase: deriveTrail(entityContour, 'list', {
55
- resource,
56
- }),
57
- readBase: deriveTrail(entityContour, 'read', {
58
- resource,
59
- }),
60
- // The `update` blaze synthesized by `deriveTrail` handles the partial-patch
61
- // concern: when the accessor lacks a native `update`, the fallback path in
62
- // `derive-trail.ts` (`updateViaReadAndUpsert`) reads the current entity,
63
- // merges the patch, strips the `version` field, then calls `upsert` with
64
- // the full merged payload — so no fields are silently lost.
65
- updateBase: deriveTrail(entityContour, 'update', {
66
- generated,
67
- resource,
68
- }),
69
- };
70
- };
71
- const buildCrudTrails = (baseTrails, overrides, entityOutput, listOutput) => Object.freeze([
72
- finalizeTrail(baseTrails.createBase, {
73
- ...(overrides.create === undefined ? {} : { blaze: overrides.create }),
74
- output: entityOutput,
75
- pattern: 'crud',
76
- }),
77
- finalizeTrail(baseTrails.readBase, {
78
- ...(overrides.read === undefined ? {} : { blaze: overrides.read }),
79
- output: entityOutput,
80
- pattern: 'crud',
81
- }),
82
- finalizeTrail(baseTrails.updateBase, {
83
- ...(overrides.update === undefined ? {} : { blaze: overrides.update }),
84
- output: entityOutput,
85
- pattern: 'crud',
86
- }),
87
- overrides.delete === undefined
88
- ? finalizeTrail(baseTrails.deleteBase, { pattern: 'crud' })
89
- : finalizeTrail(baseTrails.deleteBase, {
90
- blaze: overrides.delete,
91
- pattern: 'crud',
92
- }),
93
- finalizeTrail(baseTrails.listBase, {
94
- ...(overrides.list === undefined ? {} : { blaze: overrides.list }),
95
- output: listOutput,
96
- pattern: 'crud',
97
- }),
98
- ]);
99
- export function crud(table, resource, options = {}) {
100
- const overrides = options.blaze ?? {};
101
- const baseTrails = deriveCrudBaseTrails(table, resource);
102
- // Narrow `table.schema` (typed `StoreObjectSchema`, which is
103
- // `z.ZodObject<Record<string, z.ZodType>>`) to a ZodObject keyed by the
104
- // concrete shape so its `z.output` unifies with the contour-derived
105
- // output. Structurally `table.schema` already has `shape:
106
- // TTable['schema']['shape']` — this only refines the generic parameter.
107
- const entitySchema = table.schema;
108
- const entityOutput = entitySchema;
109
- const listOutput = entitySchema.array();
110
- return buildCrudTrails(baseTrails, overrides, entityOutput, listOutput);
111
- }
112
- //# sourceMappingURL=crud.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"crud.js","sourceRoot":"","sources":["../../src/trails/crud.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAgBpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAqKhD,MAAM,yBAAyB,GAAG,CAChC,OAAwC,EACxC,MAA0B,EACmB,EAAE;IAC/C,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,OAAO;QACnB,CAAC,CAAC;YACE,GAAG,OAAO;YACV,QAAQ,EAAE,MAAM,CAAC,IAAI;SACtB;QACH,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CACjC,IAA4B,EAC5B,MAA0B,EACU,EAAE;IACtC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC1B,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ;SAClB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;SAC5D,MAAM,CACL,CAAC,OAAO,EAA8C,EAAE,CACtD,OAAO,KAAK,SAAS,CACxB,CAAC;IAEJ,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC;QACtB,CAAC,CAAC,SAAS;QACX,CAAC,CAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAwC,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CACpB,IAA4B,EAC5B,UAII,EAAE,EACkB,EAAE,CAC1B,MAAM,CAAC,MAAM,CAAC;IACZ,GAAG,IAAI;IACP,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;IAChE,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS;QAC9B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACE,QAAQ,EAAE,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC;YAC1D,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;IACN,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;CACvE,CAA2B,CAAC;AAE/B,MAAM,oBAAoB,GAAG,CAI3B,KAAa,EACb,QAA+B,EACC,EAAE;IAClC,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAChD,0EAA0E;IAC1E,qEAAqE;IACrE,sEAAsE;IACtE,0EAA0E;IAC1E,6DAA6D;IAC7D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAsC,CAAC;IAE/D,OAAO;QACL,UAAU,EAAE,WAAW,CAAC,aAAa,EAAE,QAAQ,EAAE;YAC/C,SAAS;YACT,QAAQ;SACT,CAAC;QACF,UAAU,EAAE,WAAW,CAAC,aAAa,EAAE,QAAQ,EAAE;YAC/C,QAAQ;SACT,CAAC;QACF,QAAQ,EAAE,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE;YAC3C,QAAQ;SACT,CAAC;QACF,QAAQ,EAAE,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE;YAC3C,QAAQ;SACT,CAAC;QACF,4EAA4E;QAC5E,2EAA2E;QAC3E,yEAAyE;QACzE,yEAAyE;QACzE,4DAA4D;QAC5D,UAAU,EAAE,WAAW,CAAC,aAAa,EAAE,QAAQ,EAAE;YAC/C,SAAS;YACT,QAAQ;SACT,CAAC;KACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACtB,UAA0C,EAC1C,SAA6C,EAC7C,YAAwD,EACxD,UAAoD,EACxB,EAAE,CAC9B,MAAM,CAAC,MAAM,CAAC;IACZ,aAAa,CAAC,UAAU,CAAC,UAAU,EAAE;QACnC,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;QACtE,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,MAAM;KAChB,CAAC;IACF,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE;QACjC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;QAClE,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,MAAM;KAChB,CAAC;IACF,aAAa,CAAC,UAAU,CAAC,UAAU,EAAE;QACnC,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;QACtE,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,MAAM;KAChB,CAAC;IACF,SAAS,CAAC,MAAM,KAAK,SAAS;QAC5B,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC3D,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,UAAU,EAAE;YACnC,KAAK,EAAE,SAAS,CAAC,MAAM;YACvB,OAAO,EAAE,MAAM;SAChB,CAAC;IACN,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE;QACjC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;QAClE,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,MAAM;KAChB,CAAC;CACH,CAA+B,CAAC;AAmBnC,MAAM,UAAU,IAAI,CAIlB,KAAa,EACb,QAA+B,EAC/B,UAAuC,EAAE;IAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACzD,6DAA6D;IAC7D,wEAAwE;IACxE,oEAAoE;IACpE,0DAA0D;IAC1D,wEAAwE;IACxE,MAAM,YAAY,GAAG,KAAK,CAAC,MAAgD,CAAC;IAC5E,MAAM,YAAY,GAA+C,YAAY,CAAC;IAC9E,MAAM,UAAU,GACd,YAAY,CAAC,KAAK,EAAE,CAAC;IAEvB,OAAO,eAAe,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAC1E,CAAC"}
@@ -1,7 +0,0 @@
1
- export { crud } from './crud.js';
2
- export type { CrudBlazeOverrides, CrudOptions, CrudTrails } from './crud.js';
3
- export { reconcile } from './reconcile.js';
4
- export type { ReconcileConflict, ReconcileOptions, ReconcileStrategy, } from './reconcile.js';
5
- export { sync } from './sync.js';
6
- export type { SyncEndpoint, SyncOptions, SyncTransform } from './sync.js';
7
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trails/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
@@ -1,4 +0,0 @@
1
- export { crud } from './crud.js';
2
- export { reconcile } from './reconcile.js';
3
- export { sync } from './sync.js';
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/trails/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAM3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC"}
@@ -1,36 +0,0 @@
1
- import type { AnySignal, Resource, Trail, TrailContext } from '@ontrails/core';
2
- import type { AnyStoreTable, EntityOf, StoreAccessor, UpsertOf } from '../types.js';
3
- type ReconcileConnection<TTable extends AnyStoreTable> = Readonly<Record<TTable['name'], StoreAccessor<TTable>>>;
4
- export interface ReconcileConflict<TTable extends AnyStoreTable> {
5
- readonly current: EntityOf<TTable>;
6
- readonly incoming: UpsertOf<TTable>;
7
- }
8
- export type ReconcileStrategy<TTable extends AnyStoreTable> = 'last-write-wins' | ((conflict: ReconcileConflict<TTable>, ctx: TrailContext) => Promise<UpsertOf<TTable>> | UpsertOf<TTable>);
9
- export interface ReconcileOptions<TTable extends AnyStoreTable, TConnection extends ReconcileConnection<TTable>> {
10
- readonly description?: string;
11
- readonly id?: string;
12
- readonly on?: readonly (AnySignal | string)[];
13
- readonly resource: Resource<TConnection>;
14
- readonly strategy?: ReconcileStrategy<TTable>;
15
- readonly table: TTable;
16
- }
17
- /**
18
- * Produce one trail that retries a versioned upsert with a conflict strategy
19
- * when the incoming entity is stale.
20
- *
21
- * Reconcile is bounded to a single retry via a declarative `detour`. If a
22
- * concurrent writer races the retry and produces a second `ConflictError`,
23
- * the detour loop wraps it in `RetryExhaustedError<ConflictError>` so
24
- * callers can distinguish "retry reconcile at a higher level" from
25
- * "reconcile tried and lost the race".
26
- *
27
- * @remarks
28
- * For versioned tables, the derived input schema requires an explicit
29
- * `version` field so callers cannot sidestep optimistic concurrency at the
30
- * input boundary. `fixtureSchema` alone makes `version` optional because
31
- * connectors populate it for writes; reconcile must reject that relaxed
32
- * shape.
33
- */
34
- export declare const reconcile: <TTable extends AnyStoreTable, TConnection extends ReconcileConnection<TTable>>(options: ReconcileOptions<TTable, TConnection>) => Trail<UpsertOf<TTable>, EntityOf<TTable>>;
35
- export {};
36
- //# sourceMappingURL=reconcile.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../src/trails/reconcile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EAET,QAAQ,EACR,KAAK,EACL,YAAY,EAGb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EACV,aAAa,EACb,QAAQ,EACR,aAAa,EACb,QAAQ,EACT,MAAM,aAAa,CAAC;AAIrB,KAAK,mBAAmB,CAAC,MAAM,SAAS,aAAa,IAAI,QAAQ,CAC/D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAC9C,CAAC;AAEF,MAAM,WAAW,iBAAiB,CAAC,MAAM,SAAS,aAAa;IAC7D,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,MAAM,iBAAiB,CAAC,MAAM,SAAS,aAAa,IACtD,iBAAiB,GACjB,CAAC,CACC,QAAQ,EAAE,iBAAiB,CAAC,MAAM,CAAC,EACnC,GAAG,EAAE,YAAY,KACd,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAEvD,MAAM,WAAW,gBAAgB,CAC/B,MAAM,SAAS,aAAa,EAC5B,WAAW,SAAS,mBAAmB,CAAC,MAAM,CAAC;IAE/C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAyLD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,SAAS,GACpB,MAAM,SAAS,aAAa,EAC5B,WAAW,SAAS,mBAAmB,CAAC,MAAM,CAAC,EAE/C,SAAS,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,KAC7C,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CA0B1C,CAAC"}