@ultimat3/entity 1.0.0 → 1.2.0
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/package.json +4 -4
- package/src/column.d.ts +0 -28
- package/src/column.d.ts.map +0 -1
- package/src/column.js +0 -75
- package/src/column.js.map +0 -1
- package/src/columns.d.ts +0 -39
- package/src/columns.d.ts.map +0 -1
- package/src/columns.js +0 -136
- package/src/columns.js.map +0 -1
- package/src/database.d.ts +0 -21
- package/src/database.d.ts.map +0 -1
- package/src/database.js +0 -38
- package/src/database.js.map +0 -1
- package/src/describe.d.ts +0 -16
- package/src/describe.d.ts.map +0 -1
- package/src/describe.js +0 -79
- package/src/describe.js.map +0 -1
- package/src/entity.d.ts +0 -58
- package/src/entity.d.ts.map +0 -1
- package/src/entity.js +0 -160
- package/src/entity.js.map +0 -1
- package/src/errors.d.ts +0 -18
- package/src/errors.d.ts.map +0 -1
- package/src/errors.js +0 -59
- package/src/errors.js.map +0 -1
- package/src/expr.d.ts +0 -41
- package/src/expr.d.ts.map +0 -1
- package/src/expr.js +0 -94
- package/src/expr.js.map +0 -1
- package/src/index.d.ts +0 -23
- package/src/index.d.ts.map +0 -1
- package/src/index.js +0 -12
- package/src/index.js.map +0 -1
- package/src/invariants.d.ts +0 -36
- package/src/invariants.d.ts.map +0 -1
- package/src/invariants.js +0 -53
- package/src/invariants.js.map +0 -1
- package/src/query.d.ts +0 -30
- package/src/query.d.ts.map +0 -1
- package/src/query.js +0 -74
- package/src/query.js.map +0 -1
- package/src/registry.d.ts +0 -45
- package/src/registry.d.ts.map +0 -1
- package/src/registry.js +0 -26
- package/src/registry.js.map +0 -1
- package/src/repo.d.ts +0 -54
- package/src/repo.d.ts.map +0 -1
- package/src/repo.js +0 -203
- package/src/repo.js.map +0 -1
- package/src/seed.d.ts +0 -20
- package/src/seed.d.ts.map +0 -1
- package/src/seed.js +0 -43
- package/src/seed.js.map +0 -1
- package/src/tenancy.d.ts +0 -41
- package/src/tenancy.d.ts.map +0 -1
- package/src/tenancy.js +0 -57
- package/src/tenancy.js.map +0 -1
- package/src/types.d.ts +0 -99
- package/src/types.d.ts.map +0 -1
- package/src/types.js +0 -8
- package/src/types.js.map +0 -1
package/src/entity.js
DELETED
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
// `entity(name, { columns })` is the first primitive. The row type is DERIVED from the columns —
|
|
2
|
-
// there is no second declaration of the same shape to keep in sync — and everything downstream
|
|
3
|
-
// (the typed db handle, migrations, cache tags, the admin UI, the manifest) is projected from
|
|
4
|
-
// this one call.
|
|
5
|
-
import { bindColumn, snake } from './column';
|
|
6
|
-
import { newId } from './columns';
|
|
7
|
-
import { describeEntity } from './describe';
|
|
8
|
-
import { invariantViolated } from './errors';
|
|
9
|
-
import { invariantColumns } from './expr';
|
|
10
|
-
import { assertInvariants, bindInvariant, invariantsToSql } from './invariants';
|
|
11
|
-
import { registerEntity } from './registry';
|
|
12
|
-
import { tenantColumnOf } from './tenancy';
|
|
13
|
-
/** Presence of this column is what makes an entity soft-deletable — not a flag. */
|
|
14
|
-
export const SOFT_DELETE_COLUMN = 'deletedAt';
|
|
15
|
-
const MONEY_PARTS = new Set(['minor', 'currency']);
|
|
16
|
-
const indexName = (table, columns, unique) => `${table}_${columns.join('_')}_${unique ? 'key' : 'idx'}`;
|
|
17
|
-
const defaultValue = (meta) => {
|
|
18
|
-
const declared = meta.default;
|
|
19
|
-
if (declared === undefined)
|
|
20
|
-
return undefined;
|
|
21
|
-
if (declared.kind === 'value')
|
|
22
|
-
return declared.value;
|
|
23
|
-
return declared.by === 'uuid-v7' ? newId() : new Date();
|
|
24
|
-
};
|
|
25
|
-
export const entity = (name, init) => {
|
|
26
|
-
const entries = Object.entries(init.columns);
|
|
27
|
-
for (const [property, column] of entries)
|
|
28
|
-
bindColumn(column, name, property);
|
|
29
|
-
const cacheTag = `entity:${name}`;
|
|
30
|
-
const softDelete = Object.hasOwn(init.columns, SOFT_DELETE_COLUMN);
|
|
31
|
-
const tenantColumn = tenantColumnOf(init.columns);
|
|
32
|
-
const primaryKey = init.primaryKey ?? entries.filter(([, column]) => column.$meta.primaryKey).map(([key]) => key);
|
|
33
|
-
if (primaryKey.length === 0) {
|
|
34
|
-
throw invariantViolated(name, 'primary-key', 'no primary key: mark a column .primaryKey() or pass primaryKey: [...] for a composite one');
|
|
35
|
-
}
|
|
36
|
-
// Property path -> physical name. The one place `orgId` becomes `org_id`.
|
|
37
|
-
const resolve = (path) => {
|
|
38
|
-
const [property, part] = path;
|
|
39
|
-
const column = property === undefined ? undefined : init.columns[property];
|
|
40
|
-
if (property === undefined || column === undefined) {
|
|
41
|
-
throw invariantViolated(name, 'invariant', `no column "${String(property)}"`);
|
|
42
|
-
}
|
|
43
|
-
const isMoney = column.$meta.kind === 'money';
|
|
44
|
-
if (part === undefined) {
|
|
45
|
-
if (isMoney) {
|
|
46
|
-
throw invariantViolated(name, property, `${property} is money: name ${property}.minor or ${property}.currency`);
|
|
47
|
-
}
|
|
48
|
-
return snake(property);
|
|
49
|
-
}
|
|
50
|
-
if (!isMoney || !MONEY_PARTS.has(part)) {
|
|
51
|
-
throw invariantViolated(name, property, `${property} has no part "${part}"`);
|
|
52
|
-
}
|
|
53
|
-
return `${snake(property)}_${part}`;
|
|
54
|
-
};
|
|
55
|
-
const columnsExpr = invariantColumns(name, entries.map(([property]) => property));
|
|
56
|
-
const partialWhere = softDelete ? `${snake(SOFT_DELETE_COLUMN)} is null` : undefined;
|
|
57
|
-
const invariants = (init.invariants ?? []).map((def) => bindInvariant(def, columnsExpr, resolve, partialWhere));
|
|
58
|
-
const declared = [
|
|
59
|
-
...entries.flatMap(([property, column]) => {
|
|
60
|
-
const meta = column.$meta;
|
|
61
|
-
if (!meta.unique && !meta.index)
|
|
62
|
-
return [];
|
|
63
|
-
const physical = [meta.kind === 'money' ? `${snake(property)}_minor` : snake(property)];
|
|
64
|
-
return [
|
|
65
|
-
{ name: indexName(name, physical, meta.unique), columns: physical, unique: meta.unique },
|
|
66
|
-
];
|
|
67
|
-
}),
|
|
68
|
-
...(init.indexes ?? []).map((index) => {
|
|
69
|
-
const columns = index.on.map((property) => resolve([property]));
|
|
70
|
-
const unique = index.unique === true;
|
|
71
|
-
const where = index.where?.(columnsExpr).toSql(resolve) ?? null;
|
|
72
|
-
if (index.where !== undefined && where === null) {
|
|
73
|
-
throw invariantViolated(name, 'index', 'a partial index predicate must be expressible in SQL; a JS predicate cannot be one');
|
|
74
|
-
}
|
|
75
|
-
return {
|
|
76
|
-
name: indexName(name, columns, unique),
|
|
77
|
-
columns,
|
|
78
|
-
unique,
|
|
79
|
-
...(index.order === undefined ? {} : { order: index.order }),
|
|
80
|
-
...(where === null ? {} : { where }),
|
|
81
|
-
};
|
|
82
|
-
}),
|
|
83
|
-
];
|
|
84
|
-
// A foreign key already indexes its column; naming it again in `indexes` is not two indexes.
|
|
85
|
-
const indexes = declared.filter((index, position) => declared.findIndex((other) => other.name === index.name) === position);
|
|
86
|
-
const tags = [cacheTag, ...(init.tags ?? [])];
|
|
87
|
-
const describe = () => describeEntity({
|
|
88
|
-
name,
|
|
89
|
-
columns: entries,
|
|
90
|
-
primaryKey,
|
|
91
|
-
invariants,
|
|
92
|
-
indexes,
|
|
93
|
-
tags,
|
|
94
|
-
cacheTag,
|
|
95
|
-
softDelete,
|
|
96
|
-
tenantColumn,
|
|
97
|
-
});
|
|
98
|
-
const parse = (value) => {
|
|
99
|
-
if (typeof value !== 'object' || value === null) {
|
|
100
|
-
throw invariantViolated(name, 'row', `expected an object, got ${String(value)}`);
|
|
101
|
-
}
|
|
102
|
-
const input = value;
|
|
103
|
-
const row = {};
|
|
104
|
-
for (const [property, column] of entries) {
|
|
105
|
-
const given = input[property] ?? defaultValue(column.$meta);
|
|
106
|
-
if (given === undefined || given === null) {
|
|
107
|
-
if (column.$meta.notNull) {
|
|
108
|
-
throw invariantViolated(name, property, 'is required and has no default');
|
|
109
|
-
}
|
|
110
|
-
row[property] = null;
|
|
111
|
-
continue;
|
|
112
|
-
}
|
|
113
|
-
row[property] = column.$parse(given);
|
|
114
|
-
}
|
|
115
|
-
// Every property was validated by its own column above, so the shape is the derived row.
|
|
116
|
-
return row;
|
|
117
|
-
};
|
|
118
|
-
const core = {
|
|
119
|
-
$name: name,
|
|
120
|
-
$table: name,
|
|
121
|
-
$columns: init.columns,
|
|
122
|
-
$primaryKey: primaryKey,
|
|
123
|
-
$indexes: indexes,
|
|
124
|
-
$invariants: invariants,
|
|
125
|
-
$tags: tags,
|
|
126
|
-
$cacheTag: cacheTag,
|
|
127
|
-
$softDelete: softDelete,
|
|
128
|
-
$tenantColumn: tenantColumn,
|
|
129
|
-
$schema: {
|
|
130
|
-
'~standard': {
|
|
131
|
-
version: 1,
|
|
132
|
-
vendor: 'ultimate',
|
|
133
|
-
validate: (value) => {
|
|
134
|
-
try {
|
|
135
|
-
return { value: parse(value) };
|
|
136
|
-
}
|
|
137
|
-
catch (error) {
|
|
138
|
-
return {
|
|
139
|
-
issues: [{ message: error instanceof Error ? error.message : String(error) }],
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
},
|
|
143
|
-
},
|
|
144
|
-
},
|
|
145
|
-
get $row() {
|
|
146
|
-
// Type-only. Reading it means someone expected a value where a type was meant.
|
|
147
|
-
throw invariantViolated(name, '$row', '$row is a type, not a value — use typeof x.$row');
|
|
148
|
-
},
|
|
149
|
-
$tagFor: (id) => `${cacheTag}:${id}`,
|
|
150
|
-
$parse: parse,
|
|
151
|
-
$assert: (row) => assertInvariants(name, invariants, row),
|
|
152
|
-
$migration: () => invariantsToSql(name, invariants),
|
|
153
|
-
$describe: describe,
|
|
154
|
-
};
|
|
155
|
-
registerEntity({ name, tableName: name, describe });
|
|
156
|
-
// The columns land on the entity itself so `orgs.id` is a column reference; every framework
|
|
157
|
-
// member is `$`-prefixed, which is why a column may be called `name`.
|
|
158
|
-
return Object.assign(core, init.columns);
|
|
159
|
-
};
|
|
160
|
-
//# sourceMappingURL=entity.js.map
|
package/src/entity.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entity.js","sourceRoot":"","sources":["entity.ts"],"names":[],"mappings":"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"}
|
package/src/errors.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { UltimateError } from '@ultimat3/core';
|
|
2
|
-
export declare const ENTITY_ERROR_CODES: readonly ['X_ENTITY_DUPLICATE', 'X_INVARIANT_VIOLATED', 'X_TENANCY_UNSCOPED', 'X_DB_DRIFT', 'X_NOT_FOUND'];
|
|
3
|
-
export type EntityErrorCode = (typeof ENTITY_ERROR_CODES)[number];
|
|
4
|
-
export declare const ENTITY_ERROR_TITLES: Readonly<Record<EntityErrorCode, string>>;
|
|
5
|
-
export declare class EntityError extends UltimateError {
|
|
6
|
-
readonly name = "EntityError";
|
|
7
|
-
constructor(init: {
|
|
8
|
-
code: EntityErrorCode;
|
|
9
|
-
cause: string;
|
|
10
|
-
fix: string;
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
export declare const entityDuplicate: (name: string, existingTable: string) => EntityError;
|
|
14
|
-
export declare const invariantViolated: (entityName: string, invariantName: string, message: string) => EntityError;
|
|
15
|
-
export declare const tenancyUnscoped: (entityName: string, operation: string) => EntityError;
|
|
16
|
-
export declare const dbDrift: (tableName: string, columnName: string) => EntityError;
|
|
17
|
-
export declare const notFound: (entityName: string, id: string) => EntityError;
|
|
18
|
-
//# sourceMappingURL=errors.d.ts.map
|
package/src/errors.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["errors.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsB,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEnE,eAAO,MAAM,kBAAkB,YAC7B,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,YAAY,EACZ,aAAa,CACL,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAMzE,CAAC;AASF,qBAAa,WAAY,SAAQ,aAAa;IAC5C,SAAkB,IAAI,iBAAiB;IAEvC,YAAY,IAAI,EAAE;QAAE,IAAI,EAAE,eAAe,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAOtE;CACF;AAED,eAAO,MAAM,eAAe,SAAU,MAAM,iBAAiB,MAAM,KAAG,WAKlE,CAAC;AAEL,eAAO,MAAM,iBAAiB,eAChB,MAAM,iBACH,MAAM,WACZ,MAAM,KACd,WAKC,CAAC;AAEL,eAAO,MAAM,eAAe,eAAgB,MAAM,aAAa,MAAM,KAAG,WAKpE,CAAC;AAEL,eAAO,MAAM,OAAO,cAAe,MAAM,cAAc,MAAM,KAAG,WAK5D,CAAC;AAEL,eAAO,MAAM,QAAQ,eAAgB,MAAM,MAAM,MAAM,KAAG,WAKtD,CAAC"}
|
package/src/errors.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
// The entity layer's stable error codes. Each factory produces the exact command
|
|
2
|
-
// that fixes the situation — `X_DB_DRIFT` is the flagship: it names the table, the
|
|
3
|
-
// column and the generator invocation.
|
|
4
|
-
import { registerErrorCodes, UltimateError } from '@ultimat3/core';
|
|
5
|
-
export const ENTITY_ERROR_CODES = [
|
|
6
|
-
'X_ENTITY_DUPLICATE',
|
|
7
|
-
'X_INVARIANT_VIOLATED',
|
|
8
|
-
'X_TENANCY_UNSCOPED',
|
|
9
|
-
'X_DB_DRIFT',
|
|
10
|
-
'X_NOT_FOUND',
|
|
11
|
-
];
|
|
12
|
-
export const ENTITY_ERROR_TITLES = {
|
|
13
|
-
X_ENTITY_DUPLICATE: 'two entities claim the same name',
|
|
14
|
-
X_INVARIANT_VIOLATED: 'a domain invariant rejected this row',
|
|
15
|
-
X_TENANCY_UNSCOPED: 'a tenant-scoped query has no org predicate',
|
|
16
|
-
X_DB_DRIFT: 'schema differs from migrations',
|
|
17
|
-
X_NOT_FOUND: 'no row for that id',
|
|
18
|
-
};
|
|
19
|
-
// Registered at module load, like every other package's errors.ts. Without this the
|
|
20
|
-
// registry humanises the code (`X_DB_DRIFT` → "db drift") and the terminal, the overlay
|
|
21
|
-
// and `--json` all render a title this package never wrote.
|
|
22
|
-
registerErrorCodes(Object.fromEntries(Object.entries(ENTITY_ERROR_TITLES).map(([code, title]) => [code, { title }])));
|
|
23
|
-
export class EntityError extends UltimateError {
|
|
24
|
-
name = 'EntityError';
|
|
25
|
-
constructor(init) {
|
|
26
|
-
super({
|
|
27
|
-
code: init.code,
|
|
28
|
-
cause: init.cause,
|
|
29
|
-
fix: init.fix,
|
|
30
|
-
docs: `https://ultimate.dev/errors/${init.code}`,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
export const entityDuplicate = (name, existingTable) => new EntityError({
|
|
35
|
-
code: 'X_ENTITY_DUPLICATE',
|
|
36
|
-
cause: `entity "${name}" is already registered for table "${existingTable}"`,
|
|
37
|
-
fix: `x entities list --json # then rename one of the two entity({ name }) declarations`,
|
|
38
|
-
});
|
|
39
|
-
export const invariantViolated = (entityName, invariantName, message) => new EntityError({
|
|
40
|
-
code: 'X_INVARIANT_VIOLATED',
|
|
41
|
-
cause: `${entityName}.${invariantName}: ${message}`,
|
|
42
|
-
fix: `x entity explain ${entityName} --json # shows the invariant and its SQL CHECK`,
|
|
43
|
-
});
|
|
44
|
-
export const tenancyUnscoped = (entityName, operation) => new EntityError({
|
|
45
|
-
code: 'X_TENANCY_UNSCOPED',
|
|
46
|
-
cause: `${entityName}.${operation}() was built without an org predicate but the entity has an orgId column`,
|
|
47
|
-
fix: `pass { orgId } to ${entityName}.${operation}(), or wrap the plan with orgScoped(entity, orgId, plan)`,
|
|
48
|
-
});
|
|
49
|
-
export const dbDrift = (tableName, columnName) => new EntityError({
|
|
50
|
-
code: 'X_DB_DRIFT',
|
|
51
|
-
cause: `table "${tableName}" has column "${columnName}" not present in any migration`,
|
|
52
|
-
fix: `x db gen "add ${columnName}"`,
|
|
53
|
-
});
|
|
54
|
-
export const notFound = (entityName, id) => new EntityError({
|
|
55
|
-
code: 'X_NOT_FOUND',
|
|
56
|
-
cause: `${entityName} ${id} does not exist (or is soft-deleted)`,
|
|
57
|
-
fix: `x db query "select id from ${entityName} limit 5" --json # confirm the id you expect`,
|
|
58
|
-
});
|
|
59
|
-
//# sourceMappingURL=errors.js.map
|
package/src/errors.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["errors.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,mFAAmF;AACnF,uCAAuC;AACvC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEnE,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,oBAAoB;IACpB,sBAAsB;IACtB,oBAAoB;IACpB,YAAY;IACZ,aAAa;CACL,CAAC;AAIX,MAAM,CAAC,MAAM,mBAAmB,GAA8C;IAC5E,kBAAkB,EAAE,kCAAkC;IACtD,oBAAoB,EAAE,sCAAsC;IAC5D,kBAAkB,EAAE,4CAA4C;IAChE,UAAU,EAAE,gCAAgC;IAC5C,WAAW,EAAE,oBAAoB;CAClC,CAAC;AAEF,oFAAoF;AACpF,wFAAwF;AACxF,4DAA4D;AAC5D,kBAAkB,CAChB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAClG,CAAC;AAEF,MAAM,OAAO,WAAY,SAAQ,aAAa;IAC1B,IAAI,GAAG,aAAa,CAAC;IAEvC,YAAY,IAA2D;QACrE,KAAK,CAAC;YACJ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,+BAA+B,IAAI,CAAC,IAAI,EAAE;SACjD,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,aAAqB,EAAe,EAAE,CAClF,IAAI,WAAW,CAAC;IACd,IAAI,EAAE,oBAAoB;IAC1B,KAAK,EAAE,WAAW,IAAI,sCAAsC,aAAa,GAAG;IAC5E,GAAG,EAAE,qFAAqF;CAC3F,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,UAAkB,EAClB,aAAqB,EACrB,OAAe,EACF,EAAE,CACf,IAAI,WAAW,CAAC;IACd,IAAI,EAAE,sBAAsB;IAC5B,KAAK,EAAE,GAAG,UAAU,IAAI,aAAa,KAAK,OAAO,EAAE;IACnD,GAAG,EAAE,oBAAoB,UAAU,mDAAmD;CACvF,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAE,SAAiB,EAAe,EAAE,CACpF,IAAI,WAAW,CAAC;IACd,IAAI,EAAE,oBAAoB;IAC1B,KAAK,EAAE,GAAG,UAAU,IAAI,SAAS,0EAA0E;IAC3G,GAAG,EAAE,qBAAqB,UAAU,IAAI,SAAS,0DAA0D;CAC5G,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,SAAiB,EAAE,UAAkB,EAAe,EAAE,CAC5E,IAAI,WAAW,CAAC;IACd,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,UAAU,SAAS,iBAAiB,UAAU,gCAAgC;IACrF,GAAG,EAAE,iBAAiB,UAAU,GAAG;CACpC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,UAAkB,EAAE,EAAU,EAAe,EAAE,CACtE,IAAI,WAAW,CAAC;IACd,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,GAAG,UAAU,IAAI,EAAE,sCAAsC;IAChE,GAAG,EAAE,8BAA8B,UAAU,gDAAgD;CAC9F,CAAC,CAAC"}
|
package/src/expr.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
export type Row = Readonly<Record<string, unknown>>;
|
|
2
|
-
/** Property path -> physical column name. */
|
|
3
|
-
export type Resolve = (path: readonly string[]) => string;
|
|
4
|
-
export interface Expr {
|
|
5
|
-
readonly kind: 'check' | 'unique';
|
|
6
|
-
readonly paths: readonly (readonly string[])[];
|
|
7
|
-
readonly message: string;
|
|
8
|
-
/** `null` when the rule is a JS predicate the database cannot be told about. */
|
|
9
|
-
toSql(resolve: Resolve): string | null;
|
|
10
|
-
holds(row: Row): boolean;
|
|
11
|
-
}
|
|
12
|
-
export interface ColumnExpr {
|
|
13
|
-
/** `btrim(...)` in SQL, `.trim()` in the app — the same rule, both sides. */
|
|
14
|
-
trimmed(): ColumnExpr;
|
|
15
|
-
minLength(length: number): Expr;
|
|
16
|
-
contains(value: string): Expr;
|
|
17
|
-
/** A `RegExp` reaches the database; a function is app-only. */
|
|
18
|
-
matches(pattern: RegExp | ((value: string) => boolean)): Expr;
|
|
19
|
-
atLeast(value: number | bigint): Expr;
|
|
20
|
-
eq(value: string | number | boolean | bigint | ColumnExpr): Expr;
|
|
21
|
-
isTrue(): Expr;
|
|
22
|
-
/** Money is two physical columns; these are how a rule names one of them. */
|
|
23
|
-
readonly minor: ColumnExpr;
|
|
24
|
-
readonly currency: ColumnExpr;
|
|
25
|
-
}
|
|
26
|
-
type RowPredicate = (...values: never[]) => boolean;
|
|
27
|
-
export type InvariantColumns = {
|
|
28
|
-
readonly [column: string]: ColumnExpr;
|
|
29
|
-
} & {
|
|
30
|
-
/** Decided by the database — a single row cannot see a duplicate. */
|
|
31
|
-
unique(columns: readonly string[]): Expr;
|
|
32
|
-
/** Lifts a domain predicate over several columns. App-only by construction. */
|
|
33
|
-
satisfies(predicate: RowPredicate, columns: readonly string[]): Expr;
|
|
34
|
-
};
|
|
35
|
-
/**
|
|
36
|
-
* The `c` an invariant is written against. A Proxy so a typo in a column name is a
|
|
37
|
-
* declaration-time error naming the columns that do exist, not `undefined is not a function`.
|
|
38
|
-
*/
|
|
39
|
-
export declare const invariantColumns: (entity: string, properties: readonly string[]) => InvariantColumns;
|
|
40
|
-
export {};
|
|
41
|
-
//# sourceMappingURL=expr.d.ts.map
|
package/src/expr.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"expr.d.ts","sourceRoot":"","sources":["expr.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEpD,6CAA6C;AAC7C,MAAM,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC;AAE1D,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gFAAgF;IAChF,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;IACvC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC;CAC1B;AASD,MAAM,WAAW,UAAU;IACzB,6EAA6E;IAC7E,OAAO,IAAI,UAAU,CAAC;IACtB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,+DAA+D;IAC/D,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,IAAI,CAAC;IAC9D,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACtC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACjE,MAAM,IAAI,IAAI,CAAC;IACf,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;CAC/B;AAED,KAAK,YAAY,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CACvC,GAAG;IACF,qEAAqE;IACrE,MAAM,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACzC,+EAA+E;IAC/E,SAAS,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CACtE,CAAC;AAqJF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,WACnB,MAAM,cACF,SAAS,MAAM,EAAE,KAC5B,gBAiBF,CAAC"}
|
package/src/expr.js
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
// The invariant expression language. One declaration compiles to two enforcement points: a
|
|
2
|
-
// predicate the app runs on every write, and the SQL predicate the migration emits.
|
|
3
|
-
//
|
|
4
|
-
// Expressions are written against property keys (`c.likeCount`) and resolved to physical names
|
|
5
|
-
// (`like_count`) by `entity()`, because the author never writes a physical name.
|
|
6
|
-
//
|
|
7
|
-
// A JS predicate (`matches(isValidSlug)`, `satisfies(fn, [...])`) cannot be translated to SQL.
|
|
8
|
-
// It still runs in the app, and reports `sql: null` so `x verify` can warn that the database
|
|
9
|
-
// does not know this rule — silently pretending it reached Postgres would be worse.
|
|
10
|
-
import { invariantViolated } from './errors';
|
|
11
|
-
const terms = new WeakMap();
|
|
12
|
-
const walk = (row, path) => path.reduce((value, key) => (typeof value === 'object' && value !== null ? value[key] : undefined), row);
|
|
13
|
-
const literal = (value) => typeof value === 'string' ? `'${value.replaceAll("'", "''")}'` : String(value);
|
|
14
|
-
const check = (paths, message, sql, holds) => ({ kind: 'check', paths, message, toSql: sql, holds });
|
|
15
|
-
const isColumnExpr = (value) => typeof value === 'object' && value !== null && terms.has(value);
|
|
16
|
-
const expr = (term) => {
|
|
17
|
-
const one = (message, sql, holds) => check([term.path], message, sql, (row) => holds(term.read(row)));
|
|
18
|
-
const built = {
|
|
19
|
-
trimmed: () => expr({
|
|
20
|
-
path: term.path,
|
|
21
|
-
label: `trimmed ${term.label}`,
|
|
22
|
-
sql: (resolve) => `btrim(${term.sql(resolve)})`,
|
|
23
|
-
read: (row) => {
|
|
24
|
-
const value = term.read(row);
|
|
25
|
-
return typeof value === 'string' ? value.trim() : value;
|
|
26
|
-
},
|
|
27
|
-
}),
|
|
28
|
-
minLength: (length) => one(`${term.label} must be at least ${length} character${length === 1 ? '' : 's'}`, (resolve) => `char_length(${term.sql(resolve)}) >= ${length}`, (value) => typeof value === 'string' && value.length >= length),
|
|
29
|
-
contains: (value) => one(`${term.label} must contain ${literal(value)}`, (resolve) => `position(${literal(value)} in ${term.sql(resolve)}) > 0`, (actual) => typeof actual === 'string' && actual.includes(value)),
|
|
30
|
-
matches: (pattern) => one(`${term.label} must match ${pattern instanceof RegExp ? pattern.source : pattern.name || 'the rule'}`, (resolve) => pattern instanceof RegExp ? `${term.sql(resolve)} ~ ${literal(pattern.source)}` : null, (value) => typeof value === 'string' &&
|
|
31
|
-
(pattern instanceof RegExp ? pattern.test(value) : pattern(value))),
|
|
32
|
-
atLeast: (bound) => one(`${term.label} must be at least ${bound}`, (resolve) => `${term.sql(resolve)} >= ${bound}`, (value) => (typeof value === 'number' || typeof value === 'bigint') && value >= bound),
|
|
33
|
-
eq: (other) => isColumnExpr(other)
|
|
34
|
-
? sameAs(term, other)
|
|
35
|
-
: one(`${term.label} must equal ${literal(other)}`, (resolve) => `${term.sql(resolve)} = ${literal(other)}`, (value) => value === other),
|
|
36
|
-
isTrue: () => one(`${term.label} must be true`, (resolve) => term.sql(resolve), (value) => value === true),
|
|
37
|
-
get minor() {
|
|
38
|
-
return part(term, 'minor');
|
|
39
|
-
},
|
|
40
|
-
get currency() {
|
|
41
|
-
return part(term, 'currency');
|
|
42
|
-
},
|
|
43
|
-
};
|
|
44
|
-
terms.set(built, term);
|
|
45
|
-
return built;
|
|
46
|
-
};
|
|
47
|
-
const part = (term, key) => expr({
|
|
48
|
-
path: [...term.path, key],
|
|
49
|
-
label: `${term.label}.${key}`,
|
|
50
|
-
sql: (resolve) => resolve([...term.path, key]),
|
|
51
|
-
read: (row) => walk(row, [...term.path, key]),
|
|
52
|
-
});
|
|
53
|
-
const sameAs = (left, other) => {
|
|
54
|
-
const right = terms.get(other);
|
|
55
|
-
if (right === undefined)
|
|
56
|
-
throw invariantViolated('invariant', 'eq', 'not a column expression');
|
|
57
|
-
return check([left.path, right.path], `${left.label} must equal ${right.label}`, (resolve) => `${left.sql(resolve)} = ${right.sql(resolve)}`, (row) => left.read(row) === right.read(row));
|
|
58
|
-
};
|
|
59
|
-
const columnTerm = (property) => ({
|
|
60
|
-
path: [property],
|
|
61
|
-
label: property,
|
|
62
|
-
sql: (resolve) => resolve([property]),
|
|
63
|
-
read: (row) => row[property],
|
|
64
|
-
});
|
|
65
|
-
const unique = (columns) => ({
|
|
66
|
-
kind: 'unique',
|
|
67
|
-
paths: columns.map((column) => [column]),
|
|
68
|
-
message: `${columns.join(', ')} must be unique`,
|
|
69
|
-
toSql: (resolve) => columns.map((column) => resolve([column])).join(', '),
|
|
70
|
-
// A single row cannot see a duplicate: the unique index is the authority.
|
|
71
|
-
holds: () => true,
|
|
72
|
-
});
|
|
73
|
-
const satisfies = (predicate, columns) => check(columns.map((column) => [column]), `${columns.join(', ')} must satisfy ${predicate.name || 'the rule'}`, () => null, (row) => Reflect.apply(predicate, undefined, columns.map((column) => row[column])) === true);
|
|
74
|
-
/**
|
|
75
|
-
* The `c` an invariant is written against. A Proxy so a typo in a column name is a
|
|
76
|
-
* declaration-time error naming the columns that do exist, not `undefined is not a function`.
|
|
77
|
-
*/
|
|
78
|
-
export const invariantColumns = (entity, properties) => {
|
|
79
|
-
const known = new Set(properties);
|
|
80
|
-
const helpers = { unique, satisfies };
|
|
81
|
-
return new Proxy(helpers, {
|
|
82
|
-
get(target, property) {
|
|
83
|
-
if (property === 'unique' || property === 'satisfies')
|
|
84
|
-
return target[property];
|
|
85
|
-
if (typeof property !== 'string')
|
|
86
|
-
return undefined;
|
|
87
|
-
if (!known.has(property)) {
|
|
88
|
-
throw invariantViolated(entity, 'invariant', `no column "${property}"; declared columns are ${properties.join(', ')}`);
|
|
89
|
-
}
|
|
90
|
-
return expr(columnTerm(property));
|
|
91
|
-
},
|
|
92
|
-
});
|
|
93
|
-
};
|
|
94
|
-
//# sourceMappingURL=expr.js.map
|
package/src/expr.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"expr.js","sourceRoot":"","sources":["expr.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,oFAAoF;AACpF,EAAE;AACF,+FAA+F;AAC/F,iFAAiF;AACjF,EAAE;AACF,+FAA+F;AAC/F,6FAA6F;AAC7F,oFAAoF;AAEpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAiD7C,MAAM,KAAK,GAAG,IAAI,OAAO,EAAoB,CAAC;AAE9C,MAAM,IAAI,GAAG,CAAC,GAAQ,EAAE,IAAuB,EAAW,EAAE,CAC1D,IAAI,CAAC,MAAM,CACT,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAC/F,GAAG,CACJ,CAAC;AAEJ,MAAM,OAAO,GAAG,CAAC,KAAc,EAAU,EAAE,CACzC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEjF,MAAM,KAAK,GAAG,CACZ,KAAqC,EACrC,OAAe,EACf,GAAwC,EACxC,KAA4B,EACtB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;AAElE,MAAM,YAAY,GAAG,CAAC,KAAc,EAAuB,EAAE,CAC3D,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,KAAmB,CAAC,CAAC;AAEhF,MAAM,IAAI,GAAG,CAAC,IAAU,EAAc,EAAE;IACtC,MAAM,GAAG,GAAG,CACV,OAAe,EACf,GAAwC,EACxC,KAAkC,EAC5B,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAE5E,MAAM,KAAK,GAAe;QACxB,OAAO,EAAE,GAAG,EAAE,CACZ,IAAI,CAAC;YACH,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,WAAW,IAAI,CAAC,KAAK,EAAE;YAC9B,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG;YAC/C,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;gBACZ,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YAC1D,CAAC;SACF,CAAC;QAEJ,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CACpB,GAAG,CACD,GAAG,IAAI,CAAC,KAAK,qBAAqB,MAAM,aAAa,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAC9E,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,MAAM,EAAE,EAC7D,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,CAC/D;QAEH,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,GAAG,CACD,GAAG,IAAI,CAAC,KAAK,iBAAiB,OAAO,CAAC,KAAK,CAAC,EAAE,EAC9C,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EACtE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CACjE;QAEH,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACnB,GAAG,CACD,GAAG,IAAI,CAAC,KAAK,eAAe,OAAO,YAAY,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,UAAU,EAAE,EACrG,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,YAAY,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EACxF,CAAC,KAAK,EAAE,EAAE,CACR,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,OAAO,YAAY,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CACrE;QAEH,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,GAAG,CACD,GAAG,IAAI,CAAC,KAAK,qBAAqB,KAAK,EAAE,EACzC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,EAAE,EAC/C,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,IAAI,KAAK,IAAI,KAAK,CACtF;QAEH,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CACZ,YAAY,CAAC,KAAK,CAAC;YACjB,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;YACrB,CAAC,CAAC,GAAG,CACD,GAAG,IAAI,CAAC,KAAK,eAAe,OAAO,CAAC,KAAK,CAAC,EAAE,EAC5C,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,EACvD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAC3B;QAEP,MAAM,EAAE,GAAG,EAAE,CACX,GAAG,CACD,GAAG,IAAI,CAAC,KAAK,eAAe,EAC5B,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAC1B;QAEH,IAAI,KAAK;YACP,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,QAAQ;YACV,OAAO,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAChC,CAAC;KACF,CAAC;IAEF,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,IAAU,EAAE,GAAW,EAAc,EAAE,CACnD,IAAI,CAAC;IACH,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC;IACzB,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE;IAC7B,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9C,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;CAC9C,CAAC,CAAC;AAEL,MAAM,MAAM,GAAG,CAAC,IAAU,EAAE,KAAiB,EAAQ,EAAE;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,iBAAiB,CAAC,WAAW,EAAE,IAAI,EAAE,yBAAyB,CAAC,CAAC;IAC/F,OAAO,KAAK,CACV,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EACvB,GAAG,IAAI,CAAC,KAAK,eAAe,KAAK,CAAC,KAAK,EAAE,EACzC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAC3D,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAC5C,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAQ,EAAE,CAAC,CAAC;IAC9C,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,KAAK,EAAE,QAAQ;IACf,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,CAAC,OAA0B,EAAQ,EAAE,CAAC,CAAC;IACpD,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB;IAC/C,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACzE,0EAA0E;IAC1E,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI;CAClB,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,SAAuB,EAAE,OAA0B,EAAQ,EAAE,CAC9E,KAAK,CACH,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EACjC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,SAAS,CAAC,IAAI,IAAI,UAAU,EAAE,EACpE,GAAG,EAAE,CAAC,IAAI,EACV,CAAC,GAAG,EAAE,EAAE,CACN,OAAO,CAAC,KAAK,CACX,SAAS,EACT,SAAS,EACT,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CACrC,KAAK,IAAI,CACb,CAAC;AAEJ;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,MAAc,EACd,UAA6B,EACX,EAAE;IACpB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACtC,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE;QACxB,GAAG,CAAC,MAAM,EAAE,QAAQ;YAClB,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,WAAW;gBAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC/E,IAAI,OAAO,QAAQ,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YACnD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,MAAM,iBAAiB,CACrB,MAAM,EACN,WAAW,EACX,cAAc,QAAQ,2BAA2B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzE,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpC,CAAC;KACF,CAAqB,CAAC;AACzB,CAAC,CAAC"}
|
package/src/index.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export type { TextOptions } from './columns';
|
|
2
|
-
export { boolean, enumerated, integer, locale, money, newId, text, timestamp, tz, url, uuid, } from './columns';
|
|
3
|
-
export type { Database, DatabaseOptions, Driver, EntitySet } from './database';
|
|
4
|
-
export { database, memoryDriver } from './database';
|
|
5
|
-
export type { Entity, EntityCore, EntityInit, IndexInit } from './entity';
|
|
6
|
-
export { entity, SOFT_DELETE_COLUMN } from './entity';
|
|
7
|
-
export type { EntityErrorCode } from './errors';
|
|
8
|
-
export { dbDrift, ENTITY_ERROR_CODES, ENTITY_ERROR_TITLES, EntityError, entityDuplicate, invariantViolated, notFound, tenancyUnscoped, } from './errors';
|
|
9
|
-
export type { ColumnExpr, Expr, InvariantColumns, Resolve } from './expr';
|
|
10
|
-
export type { Invariant, InvariantDef, InvariantKind } from './invariants';
|
|
11
|
-
export { assertInvariants, constraintName, invariant, invariantsToSql, toSql, } from './invariants';
|
|
12
|
-
export type { ReadBuilder, Table } from './query';
|
|
13
|
-
export { tableFor } from './query';
|
|
14
|
-
export type { ColumnDescription, EntityDescription, InvariantDescription, RegistryEntry, } from './registry';
|
|
15
|
-
export { clearRegistry, describeEntities, entityNames, getEntity, registerEntity, } from './registry';
|
|
16
|
-
export type { FindManyArgs, Page, Repo, RepoOptions, Transactor, Tx } from './repo';
|
|
17
|
-
export { decodeCursor, encodeCursor, memoryRepo, memoryTransactor } from './repo';
|
|
18
|
-
export type { Seed, SeedContext, SeedOptions } from './seed';
|
|
19
|
-
export { defineSeed, seedId } from './seed';
|
|
20
|
-
export type { Operator, Predicate, QueryPlan, SortDirection, SortKey } from './tenancy';
|
|
21
|
-
export { assertScoped, describePlan, emptyPlan, hasOrgPredicate, isOrgScoped, ORG_COLUMN, orgScoped, tenantColumnOf, } from './tenancy';
|
|
22
|
-
export type { AnyColumn, Column, ColumnDefault, ColumnKind, ColumnMap, ColumnMeta, IndexDef, Insertable, MoneyInput, MoneyValue, OnDelete, ReferenceOptions, RowOf, TimestampColumn, TypeOf, UuidColumn, } from './types';
|
|
23
|
-
//# sourceMappingURL=index.d.ts.map
|
package/src/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EACL,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,SAAS,EACT,EAAE,EACF,GAAG,EACH,IAAI,GACL,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACpD,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,QAAQ,EACR,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC1E,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,eAAe,EACf,KAAK,GACN,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAClF,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACxF,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,eAAe,EACf,WAAW,EACX,UAAU,EACV,SAAS,EACT,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,SAAS,EACT,MAAM,EACN,aAAa,EACb,UAAU,EACV,SAAS,EACT,UAAU,EACV,QAAQ,EACR,UAAU,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,KAAK,EACL,eAAe,EACf,MAAM,EACN,UAAU,GACX,MAAM,SAAS,CAAC"}
|
package/src/index.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
// The public surface of @ultimat3/entity. Explicit, never `export *`.
|
|
2
|
-
export { boolean, enumerated, integer, locale, money, newId, text, timestamp, tz, url, uuid, } from './columns';
|
|
3
|
-
export { database, memoryDriver } from './database';
|
|
4
|
-
export { entity, SOFT_DELETE_COLUMN } from './entity';
|
|
5
|
-
export { dbDrift, ENTITY_ERROR_CODES, ENTITY_ERROR_TITLES, EntityError, entityDuplicate, invariantViolated, notFound, tenancyUnscoped, } from './errors';
|
|
6
|
-
export { assertInvariants, constraintName, invariant, invariantsToSql, toSql, } from './invariants';
|
|
7
|
-
export { tableFor } from './query';
|
|
8
|
-
export { clearRegistry, describeEntities, entityNames, getEntity, registerEntity, } from './registry';
|
|
9
|
-
export { decodeCursor, encodeCursor, memoryRepo, memoryTransactor } from './repo';
|
|
10
|
-
export { defineSeed, seedId } from './seed';
|
|
11
|
-
export { assertScoped, describePlan, emptyPlan, hasOrgPredicate, isOrgScoped, ORG_COLUMN, orgScoped, tenantColumnOf, } from './tenancy';
|
|
12
|
-
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAGtE,OAAO,EACL,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,SAAS,EACT,EAAE,EACF,GAAG,EACH,IAAI,GACL,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEtD,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,QAAQ,EACR,eAAe,GAChB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,eAAe,EACf,KAAK,GACN,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOnC,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAElF,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE5C,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,eAAe,EACf,WAAW,EACX,UAAU,EACV,SAAS,EACT,cAAc,GACf,MAAM,WAAW,CAAC"}
|
package/src/invariants.d.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { Expr, InvariantColumns, Resolve } from './expr';
|
|
2
|
-
/** `assert` is a rule only the app can run — a JS predicate with no SQL translation. */
|
|
3
|
-
export type InvariantKind = 'check' | 'unique' | 'assert';
|
|
4
|
-
export interface Invariant<T> {
|
|
5
|
-
/** Becomes the constraint name: `<table>_<name>_check`. Keep it snake_case. */
|
|
6
|
-
readonly name: string;
|
|
7
|
-
readonly kind: InvariantKind;
|
|
8
|
-
/** Safe to log and useful to an agent: says what was expected, not what leaked. */
|
|
9
|
-
readonly message: string;
|
|
10
|
-
/** SQL predicate for `check`, the column list for `unique`, `null` for `assert`. */
|
|
11
|
-
readonly sql: string | null;
|
|
12
|
-
/** Physical column names the rule reads. */
|
|
13
|
-
readonly columns: readonly string[];
|
|
14
|
-
/** Partial-constraint predicate, e.g. `deleted_at is null`. */
|
|
15
|
-
readonly where?: string;
|
|
16
|
-
readonly holds: (row: T) => boolean;
|
|
17
|
-
}
|
|
18
|
-
/** What `invariant()` returns: a rule that does not yet know its physical column names. */
|
|
19
|
-
export interface InvariantDef {
|
|
20
|
-
readonly name: string;
|
|
21
|
-
readonly build: (columns: InvariantColumns) => Expr;
|
|
22
|
-
}
|
|
23
|
-
/** `invariant('post_like_count_non_negative', (c) => c.likeCount.atLeast(0))` */
|
|
24
|
-
export declare const invariant: (name: string, build: (columns: InvariantColumns) => Expr) => InvariantDef;
|
|
25
|
-
/** Called by `entity()`: resolves property paths to physical names and freezes the rule. */
|
|
26
|
-
export declare const bindInvariant: <T>(def: InvariantDef, columns: InvariantColumns, resolve: Resolve, partialWhere: string | undefined) => Invariant<T>;
|
|
27
|
-
export declare const constraintName: (table: string, inv: {
|
|
28
|
-
readonly name: string;
|
|
29
|
-
readonly kind: InvariantKind;
|
|
30
|
-
}) => string;
|
|
31
|
-
/** The DDL the migration emits. One statement, terminated, ready to diff. */
|
|
32
|
-
export declare const toSql: <T>(table: string, inv: Invariant<T>) => string | null;
|
|
33
|
-
export declare const invariantsToSql: <T>(table: string, invariants: readonly Invariant<T>[]) => string;
|
|
34
|
-
/** Runs on every write. Reports every violation at once so one round trip fixes all. */
|
|
35
|
-
export declare const assertInvariants: <T>(entityName: string, invariants: readonly Invariant<T>[], row: T) => void;
|
|
36
|
-
//# sourceMappingURL=invariants.d.ts.map
|
package/src/invariants.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["invariants.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAO,MAAM,QAAQ,CAAC;AAEnE,wFAAwF;AACxF,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE1D,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oFAAoF;IACpF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;CACrC;AAED,2FAA2F;AAC3F,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACrD;AAED,iFAAiF;AACjF,eAAO,MAAM,SAAS,SACd,MAAM,SACL,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,KACzC,YAAiC,CAAC;AAKrC,4FAA4F;AAC5F,eAAO,MAAM,aAAa,GAAI,CAAC,OACxB,YAAY,WACR,gBAAgB,WAChB,OAAO,gBACF,MAAM,GAAG,SAAS,KAC/B,SAAS,CAAC,CAAC,CAcb,CAAC;AAEF,eAAO,MAAM,cAAc,UAClB,MAAM,OACR;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE,KAC3D,MAA2E,CAAC;AAE/E,6EAA6E;AAC7E,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,MAAM,OAAO,SAAS,CAAC,CAAC,CAAC,KAAG,MAAM,GAAG,IASpE,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,MAAM,cAAc,SAAS,SAAS,CAAC,CAAC,CAAC,EAAE,KAAG,MAIzE,CAAC;AAEhB,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,GAAI,CAAC,cACpB,MAAM,cACN,SAAS,SAAS,CAAC,CAAC,CAAC,EAAE,OAC9B,CAAC,KACL,IAKF,CAAC"}
|
package/src/invariants.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
// A domain invariant is written once and enforced twice: in the app on every write, and in
|
|
2
|
-
// Postgres as a CHECK or a unique index emitted into the migration. The database can therefore
|
|
3
|
-
// never disagree with the code — a bulk import, a psql session or a second service all hit the
|
|
4
|
-
// same rule.
|
|
5
|
-
//
|
|
6
|
-
// `invariant()` is unbound on purpose: it is written next to the columns, and `entity()` binds
|
|
7
|
-
// it to their physical names. That is what keeps a physical name from being typed twice.
|
|
8
|
-
import { invariantViolated } from './errors';
|
|
9
|
-
/** `invariant('post_like_count_non_negative', (c) => c.likeCount.atLeast(0))` */
|
|
10
|
-
export const invariant = (name, build) => ({ name, build });
|
|
11
|
-
const asRow = (value) => typeof value === 'object' && value !== null ? value : {};
|
|
12
|
-
/** Called by `entity()`: resolves property paths to physical names and freezes the rule. */
|
|
13
|
-
export const bindInvariant = (def, columns, resolve, partialWhere) => {
|
|
14
|
-
const expr = def.build(columns);
|
|
15
|
-
const sql = expr.toSql(resolve);
|
|
16
|
-
const kind = expr.kind === 'unique' ? 'unique' : sql === null ? 'assert' : 'check';
|
|
17
|
-
return {
|
|
18
|
-
name: def.name,
|
|
19
|
-
kind,
|
|
20
|
-
message: expr.message,
|
|
21
|
-
sql,
|
|
22
|
-
columns: expr.paths.map(resolve),
|
|
23
|
-
// A soft-deleted row must not keep a slug reserved, so uniqueness is partial there.
|
|
24
|
-
...(kind === 'unique' && partialWhere !== undefined ? { where: partialWhere } : {}),
|
|
25
|
-
holds: (row) => expr.holds(asRow(row)),
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
|
-
export const constraintName = (table, inv) => `${table}_${inv.name}_${inv.kind === 'unique' ? 'key' : 'check'}`;
|
|
29
|
-
/** The DDL the migration emits. One statement, terminated, ready to diff. */
|
|
30
|
-
export const toSql = (table, inv) => {
|
|
31
|
-
if (inv.sql === null)
|
|
32
|
-
return null;
|
|
33
|
-
const name = constraintName(table, inv);
|
|
34
|
-
if (inv.kind === 'check') {
|
|
35
|
-
return `ALTER TABLE "${table}" ADD CONSTRAINT "${name}" CHECK (${inv.sql});`;
|
|
36
|
-
}
|
|
37
|
-
const where = inv.where === undefined ? '' : ` WHERE ${inv.where}`;
|
|
38
|
-
const columns = inv.columns.map((column) => `"${column}"`).join(', ');
|
|
39
|
-
return `CREATE UNIQUE INDEX "${name}" ON "${table}" (${columns})${where};`;
|
|
40
|
-
};
|
|
41
|
-
export const invariantsToSql = (table, invariants) => invariants
|
|
42
|
-
.map((inv) => toSql(table, inv))
|
|
43
|
-
.filter((statement) => statement !== null)
|
|
44
|
-
.join('\n');
|
|
45
|
-
/** Runs on every write. Reports every violation at once so one round trip fixes all. */
|
|
46
|
-
export const assertInvariants = (entityName, invariants, row) => {
|
|
47
|
-
const failed = invariants.filter((inv) => !inv.holds(row));
|
|
48
|
-
const first = failed[0];
|
|
49
|
-
if (first === undefined)
|
|
50
|
-
return;
|
|
51
|
-
throw invariantViolated(entityName, first.name, failed.map((inv) => inv.message).join('; '));
|
|
52
|
-
};
|
|
53
|
-
//# sourceMappingURL=invariants.js.map
|
package/src/invariants.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invariants.js","sourceRoot":"","sources":["invariants.ts"],"names":[],"mappings":"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"}
|
package/src/query.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { EntityCore } from './entity';
|
|
2
|
-
import type { Page, Repo, RepoOptions } from './repo';
|
|
3
|
-
import type { Operator, QueryPlan, SortDirection } from './tenancy';
|
|
4
|
-
import type { ColumnMap, Insertable } from './types';
|
|
5
|
-
export interface ReadBuilder<Row> {
|
|
6
|
-
/** Equality on the columns given. `where({ orgId })` is what satisfies the tenancy guard. */
|
|
7
|
-
where(filter: Partial<Row>): ReadBuilder<Row>;
|
|
8
|
-
andWhere(column: keyof Row & string, op: Operator, value: unknown): ReadBuilder<Row>;
|
|
9
|
-
orderBy(column: keyof Row & string, direction?: SortDirection): ReadBuilder<Row>;
|
|
10
|
-
limit(rows: number): ReadBuilder<Row>;
|
|
11
|
-
/** The cursor from the previous page. */
|
|
12
|
-
after(cursor: string | null): ReadBuilder<Row>;
|
|
13
|
-
select<K extends keyof Row & string>(fields: {
|
|
14
|
-
readonly [P in K]: true;
|
|
15
|
-
}): ReadBuilder<Pick<Row, K>>;
|
|
16
|
-
/** The terminal: one bounded page and the cursor that continues it. */
|
|
17
|
-
page(): Promise<Page<Row>>;
|
|
18
|
-
all(): Promise<readonly Row[]>;
|
|
19
|
-
one(): Promise<Row | null>;
|
|
20
|
-
count(): Promise<number>;
|
|
21
|
-
/** The plan this chain describes. Safe to log — `describePlan()` elides values. */
|
|
22
|
-
plan(): QueryPlan;
|
|
23
|
-
}
|
|
24
|
-
export interface Table<Row, C extends ColumnMap = ColumnMap> extends ReadBuilder<Row> {
|
|
25
|
-
insert(values: Insertable<C>, options?: RepoOptions): Promise<Row>;
|
|
26
|
-
update(id: string, patch: Partial<Row>, options?: RepoOptions): Promise<Row>;
|
|
27
|
-
delete(id: string, options?: RepoOptions): Promise<void>;
|
|
28
|
-
}
|
|
29
|
-
export declare const tableFor: <Row, C extends ColumnMap>(entity: EntityCore<Row, C>, repo: Repo<Row>) => Table<Row, C>;
|
|
30
|
-
//# sourceMappingURL=query.d.ts.map
|
package/src/query.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["query.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAa,SAAS,EAAE,aAAa,EAAW,MAAM,WAAW,CAAC;AACxF,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErD,MAAM,WAAW,WAAW,CAAC,GAAG;IAC9B,6FAA6F;IAC7F,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IACrF,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,MAAM,EAAE,SAAS,CAAC,EAAE,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IACjF,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,yCAAyC;IACzC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,MAAM,EACjC,MAAM,EAAE;QAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI;KAAE,GAClC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7B,uEAAuE;IACvE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,IAAI,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;IAC/B,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAC3B,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,mFAAmF;IACnF,IAAI,IAAI,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,SAAS,GAAG,SAAS,CAAE,SAAQ,WAAW,CAAC,GAAG,CAAC;IACnF,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACnE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7E,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAkGD,eAAO,MAAM,QAAQ,GAAI,GAAG,EAAE,CAAC,SAAS,SAAS,UACvC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,QACpB,IAAI,CAAC,GAAG,CAAC,KACd,KAAK,CAAC,GAAG,EAAE,CAAC,CAKb,CAAC"}
|