@ontrails/store 1.0.0-beta.14 → 1.0.0-beta.15
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/.turbo/turbo-lint.log +1 -1
- package/CHANGELOG.md +7 -0
- package/README.md +126 -61
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/signal-identity.d.ts +17 -0
- package/dist/internal/signal-identity.d.ts.map +1 -0
- package/dist/internal/signal-identity.js +81 -0
- package/dist/internal/signal-identity.js.map +1 -0
- package/dist/jsonfile/index.d.ts +3 -0
- package/dist/jsonfile/index.d.ts.map +1 -0
- package/dist/jsonfile/index.js +2 -0
- package/dist/jsonfile/index.js.map +1 -0
- package/dist/jsonfile/runtime.d.ts +19 -0
- package/dist/jsonfile/runtime.d.ts.map +1 -0
- package/dist/jsonfile/runtime.js +403 -0
- package/dist/jsonfile/runtime.js.map +1 -0
- package/dist/jsonfile/types.d.ts +40 -0
- package/dist/jsonfile/types.d.ts.map +1 -0
- package/dist/{drizzle → jsonfile}/types.js.map +1 -1
- package/dist/store.d.ts +8 -18
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +152 -94
- package/dist/store.js.map +1 -1
- package/dist/testing.d.ts +28 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +90 -0
- package/dist/testing.js.map +1 -0
- package/dist/trails/crud.d.ts +38 -0
- package/dist/trails/crud.d.ts.map +1 -0
- package/dist/trails/crud.js +112 -0
- package/dist/trails/crud.js.map +1 -0
- package/dist/trails/index.d.ts +7 -0
- package/dist/trails/index.d.ts.map +1 -0
- package/dist/trails/index.js +4 -0
- package/dist/trails/index.js.map +1 -0
- package/dist/trails/reconcile.d.ts +36 -0
- package/dist/trails/reconcile.d.ts.map +1 -0
- package/dist/trails/reconcile.js +142 -0
- package/dist/trails/reconcile.js.map +1 -0
- package/dist/trails/sync.d.ts +25 -0
- package/dist/trails/sync.d.ts.map +1 -0
- package/dist/trails/sync.js +96 -0
- package/dist/trails/sync.js.map +1 -0
- package/dist/trails/utils.d.ts +51 -0
- package/dist/trails/utils.d.ts.map +1 -0
- package/dist/trails/utils.js +65 -0
- package/dist/trails/utils.js.map +1 -0
- package/dist/types.d.ts +205 -35
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -9
- package/src/__tests__/crud.test.ts +346 -0
- package/src/__tests__/jsonfile.test.ts +502 -0
- package/src/__tests__/store.test.ts +239 -33
- package/src/__tests__/sync-reconcile.test.ts +646 -0
- package/src/index.ts +12 -8
- package/src/internal/signal-identity.ts +162 -0
- package/src/jsonfile/index.ts +6 -0
- package/src/jsonfile/runtime.ts +702 -0
- package/src/jsonfile/types.ts +50 -0
- package/src/store.ts +296 -134
- package/src/testing.ts +175 -0
- package/src/trails/crud.ts +355 -0
- package/src/trails/index.ts +10 -0
- package/src/trails/reconcile.ts +281 -0
- package/src/trails/sync.ts +251 -0
- package/src/trails/utils.ts +96 -0
- package/src/types.ts +355 -63
- package/tsconfig.tests.json +10 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/drizzle/index.d.ts +0 -3
- package/dist/drizzle/index.d.ts.map +0 -1
- package/dist/drizzle/index.js +0 -2
- package/dist/drizzle/index.js.map +0 -1
- package/dist/drizzle/runtime.d.ts +0 -21
- package/dist/drizzle/runtime.d.ts.map +0 -1
- package/dist/drizzle/runtime.js +0 -458
- package/dist/drizzle/runtime.js.map +0 -1
- package/dist/drizzle/schema.d.ts +0 -15
- package/dist/drizzle/schema.d.ts.map +0 -1
- package/dist/drizzle/schema.js +0 -322
- package/dist/drizzle/schema.js.map +0 -1
- package/dist/drizzle/types.d.ts +0 -40
- package/dist/drizzle/types.d.ts.map +0 -1
- package/src/drizzle/__tests__/drizzle.test.ts +0 -469
- package/src/drizzle/index.ts +0 -17
- package/src/drizzle/runtime.ts +0 -853
- package/src/drizzle/schema.ts +0 -577
- package/src/drizzle/types.ts +0 -70
- /package/dist/{drizzle → jsonfile}/types.js +0 -0
package/dist/store.js
CHANGED
|
@@ -1,7 +1,21 @@
|
|
|
1
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';
|
|
2
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();
|
|
3
13
|
const uniqueStrings = (values) => Object.freeze([...(values === undefined ? [] : new Set(values))]);
|
|
14
|
+
const uniqueMergedStrings = (...groups) => uniqueStrings(groups.flatMap((group) => [...(group ?? [])]));
|
|
4
15
|
const hasField = (schema, field) => Object.hasOwn(schema.shape, field);
|
|
16
|
+
const versionedSchema = (schema) => schema.extend({
|
|
17
|
+
[versionFieldName]: versionFieldSchema,
|
|
18
|
+
});
|
|
5
19
|
const validateFieldList = (tableName, schema, fields, label) => {
|
|
6
20
|
for (const field of fields) {
|
|
7
21
|
if (hasField(schema, field)) {
|
|
@@ -36,48 +50,20 @@ const partialFields = (schema, fields) => {
|
|
|
36
50
|
};
|
|
37
51
|
const deriveInsertSchema = (schema, generated) => omitFields(schema, generated);
|
|
38
52
|
const deriveFixtureSchema = (schema, generated) => partialFields(schema, generated);
|
|
39
|
-
|
|
40
|
-
* Strip `default` wrappers from a Zod type so that partial update schemas
|
|
41
|
-
* do not silently re-materialize defaults. Walks through all wrapper layers
|
|
42
|
-
* (default, optional, nullable), strips defaults, and re-applies non-default
|
|
43
|
-
* wrappers to preserve the nullable constraint.
|
|
44
|
-
*/
|
|
45
|
-
const stripDefaultWrappers = (schema) => {
|
|
46
|
-
const wrappers = [];
|
|
47
|
-
let current = schema;
|
|
48
|
-
while (current.def.type === 'default' ||
|
|
49
|
-
current.def.type === 'optional' ||
|
|
50
|
-
current.def.type === 'nullable') {
|
|
51
|
-
const type = current.def.type;
|
|
52
|
-
if (type !== 'default') {
|
|
53
|
-
wrappers.push(type);
|
|
54
|
-
}
|
|
55
|
-
current = current.def['innerType'];
|
|
56
|
-
}
|
|
57
|
-
// Re-apply nullable wrappers (optional is dropped — .partial() re-adds it)
|
|
58
|
-
return wrappers.includes('nullable') ? current.nullable() : current;
|
|
59
|
-
};
|
|
60
|
-
const stripDefaultsFromShape = (schema) => {
|
|
61
|
-
const stripped = {};
|
|
62
|
-
for (const [field, value] of Object.entries(schema.shape)) {
|
|
63
|
-
stripped[field] = stripDefaultWrappers(value);
|
|
64
|
-
}
|
|
65
|
-
return stripped;
|
|
66
|
-
};
|
|
67
|
-
const deriveUpdateSchema = (schema, primaryKey) => {
|
|
53
|
+
const deriveUpdateSchema = (schema, identity) => {
|
|
68
54
|
const partial = schema
|
|
69
55
|
.extend(stripDefaultsFromShape(schema))
|
|
70
56
|
.partial();
|
|
71
|
-
// Only omit the
|
|
72
|
-
return hasField(partial,
|
|
73
|
-
? omitFields(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])
|
|
74
60
|
: partial;
|
|
75
61
|
};
|
|
76
62
|
const formatFixtureIssues = (issues) => issues.map((issue) => issue.message).join('; ');
|
|
77
|
-
const validateFixturePrimaryKeys = (tableName,
|
|
63
|
+
const validateFixturePrimaryKeys = (tableName, identity, fixtures) => {
|
|
78
64
|
const seen = new Set();
|
|
79
65
|
for (const [index, fixture] of fixtures.entries()) {
|
|
80
|
-
const identifier = fixture[
|
|
66
|
+
const identifier = fixture[identity];
|
|
81
67
|
if (identifier === undefined) {
|
|
82
68
|
continue;
|
|
83
69
|
}
|
|
@@ -96,58 +82,149 @@ const normalizeReferences = (references) => {
|
|
|
96
82
|
}
|
|
97
83
|
return Object.freeze(normalized);
|
|
98
84
|
};
|
|
99
|
-
const validatePrimaryKey = (tableName, schema,
|
|
100
|
-
if (hasField(schema,
|
|
85
|
+
const validatePrimaryKey = (tableName, schema, identity) => {
|
|
86
|
+
if (hasField(schema, identity)) {
|
|
101
87
|
return;
|
|
102
88
|
}
|
|
103
|
-
throw new ValidationError(`Store table "${tableName}" declares
|
|
89
|
+
throw new ValidationError(`Store table "${tableName}" declares identity "${identity}" that is not present on the schema`);
|
|
104
90
|
};
|
|
105
|
-
const
|
|
106
|
-
|
|
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);
|
|
107
119
|
validateFieldList(tableName, schema, generated, 'generated');
|
|
108
|
-
validateFieldList(tableName, schema,
|
|
120
|
+
validateFieldList(tableName, schema, indexed, 'indexed');
|
|
109
121
|
validateReferences(tableName, schema, references, tableNames);
|
|
110
122
|
};
|
|
111
|
-
const
|
|
112
|
-
|
|
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) {
|
|
113
134
|
return Object.freeze([]);
|
|
114
135
|
}
|
|
115
136
|
const normalized = [];
|
|
116
|
-
for (const [index, fixture] of
|
|
117
|
-
|
|
118
|
-
if (!parsed.success) {
|
|
119
|
-
throw new ValidationError(`Store table "${tableName}" fixture ${index + 1} is invalid: ${formatFixtureIssues(parsed.error.issues)}`);
|
|
120
|
-
}
|
|
121
|
-
normalized.push(Object.freeze(parsed.data));
|
|
137
|
+
for (const [index, fixture] of fixtureList.entries()) {
|
|
138
|
+
normalized.push(parseFixture(tableName, fixtureSchema, fixture, index));
|
|
122
139
|
}
|
|
123
|
-
validateFixturePrimaryKeys(tableName,
|
|
140
|
+
validateFixturePrimaryKeys(tableName, identity, normalized);
|
|
124
141
|
return Object.freeze(normalized);
|
|
125
142
|
};
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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);
|
|
132
177
|
const references = normalizeReferences(input.references);
|
|
133
|
-
validateTableInput(name,
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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 {
|
|
138
194
|
fixtureSchema,
|
|
139
195
|
fixtures,
|
|
140
|
-
generated,
|
|
141
|
-
|
|
196
|
+
generated: resolved.generated,
|
|
197
|
+
identity: resolved.identity,
|
|
198
|
+
indexed: resolved.indexed,
|
|
142
199
|
insertSchema,
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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,
|
|
149
210
|
});
|
|
150
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
|
+
}));
|
|
151
228
|
/**
|
|
152
229
|
* Declare a connector-agnostic store definition from entity schemas and
|
|
153
230
|
* persistence metadata.
|
|
@@ -155,38 +232,19 @@ const normalizeTable = (name, input, tableNames) => {
|
|
|
155
232
|
* The returned value is a normalized, read-only contract that connectors can
|
|
156
233
|
* bind to a concrete runtime later.
|
|
157
234
|
*/
|
|
158
|
-
export const store = (tables) => {
|
|
235
|
+
export const store = (tables, options = {}) => {
|
|
236
|
+
const kind = options.kind ?? 'tabular';
|
|
159
237
|
const tableNames = Object.freeze(Object.keys(tables).toSorted());
|
|
160
|
-
const normalized =
|
|
161
|
-
for (const name of tableNames) {
|
|
162
|
-
const input = tables[name];
|
|
163
|
-
if (input === undefined) {
|
|
164
|
-
continue;
|
|
165
|
-
}
|
|
166
|
-
normalized[name] = normalizeTable(name, input, tableNames);
|
|
167
|
-
}
|
|
238
|
+
const normalized = normalizeTables(tables, tableNames);
|
|
168
239
|
const get = (name) => normalized[name];
|
|
240
|
+
const signals = collectStoreSignals(normalized, tableNames);
|
|
169
241
|
return Object.freeze({
|
|
170
242
|
get,
|
|
171
|
-
kind
|
|
243
|
+
kind,
|
|
244
|
+
signals,
|
|
172
245
|
tableNames,
|
|
173
246
|
tables: Object.freeze(normalized),
|
|
247
|
+
type: 'store',
|
|
174
248
|
});
|
|
175
249
|
};
|
|
176
|
-
/**
|
|
177
|
-
* Read the full entity schema from a normalized store table.
|
|
178
|
-
*/
|
|
179
|
-
export const entitySchemaOf = (table) => table.schema;
|
|
180
|
-
/**
|
|
181
|
-
* Read the fixture schema from a normalized store table.
|
|
182
|
-
*/
|
|
183
|
-
export const fixtureSchemaOf = (table) => table.fixtureSchema;
|
|
184
|
-
/**
|
|
185
|
-
* Read the insert schema from a normalized store table.
|
|
186
|
-
*/
|
|
187
|
-
export const insertSchemaOf = (table) => table.insertSchema;
|
|
188
|
-
/**
|
|
189
|
-
* Read the update schema from a normalized store table.
|
|
190
|
-
*/
|
|
191
|
-
export const updateSchemaOf = (table) => table.updateSchema;
|
|
192
250
|
//# sourceMappingURL=store.js.map
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../src/trails/crud.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
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
|