@adminiumjs/manifest 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/add-ons.d.ts +63 -0
- package/dist/add-ons.d.ts.map +1 -0
- package/dist/add-ons.js +100 -0
- package/dist/add-ons.js.map +1 -0
- package/dist/documents.d.ts +115 -0
- package/dist/documents.d.ts.map +1 -0
- package/dist/documents.js +171 -0
- package/dist/documents.js.map +1 -0
- package/dist/formula.d.ts +124 -0
- package/dist/formula.d.ts.map +1 -0
- package/dist/formula.js +428 -0
- package/dist/formula.js.map +1 -0
- package/dist/index.d.ts +10 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/outbox.d.ts +354 -9
- package/dist/outbox.d.ts.map +1 -1
- package/dist/outbox.js +223 -9
- package/dist/outbox.js.map +1 -1
- package/dist/plan-model.d.ts +1 -1
- package/dist/plan-model.d.ts.map +1 -1
- package/dist/public-access.d.ts +48 -7
- package/dist/public-access.d.ts.map +1 -1
- package/dist/public-access.js +235 -28
- package/dist/public-access.js.map +1 -1
- package/dist/refs.d.ts +17 -0
- package/dist/refs.d.ts.map +1 -1
- package/dist/refs.js +12 -0
- package/dist/refs.js.map +1 -1
- package/dist/sample.d.ts +49 -1
- package/dist/sample.d.ts.map +1 -1
- package/dist/sample.js +39 -2
- package/dist/sample.js.map +1 -1
- package/dist/schema.d.ts +2501 -158
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +518 -26
- package/dist/schema.js.map +1 -1
- package/dist/shapes.d.ts +97 -0
- package/dist/shapes.d.ts.map +1 -0
- package/dist/shapes.js +190 -0
- package/dist/shapes.js.map +1 -0
- package/dist/states.d.ts +134 -0
- package/dist/states.d.ts.map +1 -0
- package/dist/states.js +244 -0
- package/dist/states.js.map +1 -0
- package/dist/validate.d.ts +14 -0
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +29 -2
- package/dist/validate.js.map +1 -1
- package/package.json +2 -2
package/dist/states.d.ts
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `table.states` — the life of a document, kept by Adminium for every writer.
|
|
3
|
+
*
|
|
4
|
+
* ```json
|
|
5
|
+
* "states": {
|
|
6
|
+
* "column": "status", "initial": "draft",
|
|
7
|
+
* "moves": {
|
|
8
|
+
* "draft": [{ "to": "sent", "requires": { "children": { "invoice_lines": 1 }, "where": [{ "column": "total", "gt": 0 }] } }, "void"],
|
|
9
|
+
* "sent": [{ "to": "void", "requires": { "where": [{ "column": "paid", "eq": 0 }] }, "roles": ["studio-manager"] }]
|
|
10
|
+
* },
|
|
11
|
+
* "lock": { "when": ["sent", "void"], "except": ["due_on", "ladder"] },
|
|
12
|
+
* "children": {
|
|
13
|
+
* "invoice_lines": { "via": "document_id", "lock": true },
|
|
14
|
+
* "payments": { "via": "document_id", "parentIn": ["sent"], "clearOnCreate": ["client_paid_at"] }
|
|
15
|
+
* },
|
|
16
|
+
* "noDelete": { "when": "numbered" },
|
|
17
|
+
* "onlyLater": ["valid_until"]
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* - `moves`: from each state, the states a write may move a row to. A move
|
|
22
|
+
* may ask for something first — child rows, a column's value — and may be
|
|
23
|
+
* kept for some of the app's roles. A move not listed is refused.
|
|
24
|
+
* - `lock`: while a row is in one of `when`, only `except` (and the state
|
|
25
|
+
* itself, through a move) may change. Adminium's own columns (totals,
|
|
26
|
+
* stamps) keep being written by Adminium.
|
|
27
|
+
* - `children`: child tables tied to this row's state. `lock` refuses their
|
|
28
|
+
* writes while the row is locked; `parentIn` allows them only while the row
|
|
29
|
+
* is in those states (payments on a sent invoice); `clearOnCreate` empties
|
|
30
|
+
* columns of this row when one of them is created (a recorded payment
|
|
31
|
+
* clears the client's "I've sent it").
|
|
32
|
+
* - `lockedWhenReferencedBy`: this row locks once a row of another table in
|
|
33
|
+
* one of the states points at it (a terms version once a proposal naming it
|
|
34
|
+
* is sent).
|
|
35
|
+
* - `noDelete`: rows in these states, or any row with a number
|
|
36
|
+
* (`"numbered"`), are never deleted — voided instead.
|
|
37
|
+
* - `onlyLater`: date columns that may move later and never earlier.
|
|
38
|
+
*
|
|
39
|
+
* Adding sample data and importing past records are history: they write any
|
|
40
|
+
* state their rows were in.
|
|
41
|
+
*/
|
|
42
|
+
import { z } from 'zod';
|
|
43
|
+
import { type ColumnShape, type ReferenceIssue, type TableIndex } from './refs.js';
|
|
44
|
+
/** A condition on the row itself, checked in the same statement that changes it. */
|
|
45
|
+
export declare const stateConditionSchema: z.ZodObject<{
|
|
46
|
+
column: z.ZodString;
|
|
47
|
+
eq: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
|
|
48
|
+
in: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
|
|
49
|
+
isNull: z.ZodOptional<z.ZodBoolean>;
|
|
50
|
+
gt: z.ZodOptional<z.ZodNumber>;
|
|
51
|
+
gte: z.ZodOptional<z.ZodNumber>;
|
|
52
|
+
lt: z.ZodOptional<z.ZodNumber>;
|
|
53
|
+
lte: z.ZodOptional<z.ZodNumber>;
|
|
54
|
+
}, z.core.$strict>;
|
|
55
|
+
export type StateCondition = z.infer<typeof stateConditionSchema>;
|
|
56
|
+
export declare const stateMoveSchema: z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
57
|
+
to: z.ZodString;
|
|
58
|
+
requires: z.ZodOptional<z.ZodObject<{
|
|
59
|
+
children: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
|
|
60
|
+
where: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
61
|
+
column: z.ZodString;
|
|
62
|
+
eq: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
|
|
63
|
+
in: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
|
|
64
|
+
isNull: z.ZodOptional<z.ZodBoolean>;
|
|
65
|
+
gt: z.ZodOptional<z.ZodNumber>;
|
|
66
|
+
gte: z.ZodOptional<z.ZodNumber>;
|
|
67
|
+
lt: z.ZodOptional<z.ZodNumber>;
|
|
68
|
+
lte: z.ZodOptional<z.ZodNumber>;
|
|
69
|
+
}, z.core.$strict>>>;
|
|
70
|
+
}, z.core.$strict>>;
|
|
71
|
+
roles: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
72
|
+
}, z.core.$strict>]>;
|
|
73
|
+
export type StateMove = z.infer<typeof stateMoveSchema>;
|
|
74
|
+
export declare const stateChildSchema: z.ZodObject<{
|
|
75
|
+
via: z.ZodString;
|
|
76
|
+
lock: z.ZodOptional<z.ZodLiteral<true>>;
|
|
77
|
+
parentIn: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
78
|
+
clearOnCreate: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
79
|
+
}, z.core.$strict>;
|
|
80
|
+
export type StateChild = z.infer<typeof stateChildSchema>;
|
|
81
|
+
export declare const statesSchema: z.ZodObject<{
|
|
82
|
+
column: z.ZodString;
|
|
83
|
+
initial: z.ZodString;
|
|
84
|
+
moves: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
85
|
+
to: z.ZodString;
|
|
86
|
+
requires: z.ZodOptional<z.ZodObject<{
|
|
87
|
+
children: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
|
|
88
|
+
where: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
89
|
+
column: z.ZodString;
|
|
90
|
+
eq: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
|
|
91
|
+
in: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
|
|
92
|
+
isNull: z.ZodOptional<z.ZodBoolean>;
|
|
93
|
+
gt: z.ZodOptional<z.ZodNumber>;
|
|
94
|
+
gte: z.ZodOptional<z.ZodNumber>;
|
|
95
|
+
lt: z.ZodOptional<z.ZodNumber>;
|
|
96
|
+
lte: z.ZodOptional<z.ZodNumber>;
|
|
97
|
+
}, z.core.$strict>>>;
|
|
98
|
+
}, z.core.$strict>>;
|
|
99
|
+
roles: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
100
|
+
}, z.core.$strict>]>>>;
|
|
101
|
+
lock: z.ZodOptional<z.ZodObject<{
|
|
102
|
+
when: z.ZodArray<z.ZodString>;
|
|
103
|
+
except: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
104
|
+
}, z.core.$strict>>;
|
|
105
|
+
children: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
106
|
+
via: z.ZodString;
|
|
107
|
+
lock: z.ZodOptional<z.ZodLiteral<true>>;
|
|
108
|
+
parentIn: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
109
|
+
clearOnCreate: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
110
|
+
}, z.core.$strict>>>;
|
|
111
|
+
lockedWhenReferencedBy: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
112
|
+
table: z.ZodString;
|
|
113
|
+
via: z.ZodString;
|
|
114
|
+
in: z.ZodArray<z.ZodString>;
|
|
115
|
+
}, z.core.$strict>>>;
|
|
116
|
+
noDelete: z.ZodOptional<z.ZodObject<{
|
|
117
|
+
when: z.ZodUnion<readonly [z.ZodLiteral<"numbered">, z.ZodArray<z.ZodString>]>;
|
|
118
|
+
}, z.core.$strict>>;
|
|
119
|
+
onlyLater: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
120
|
+
}, z.core.$strict>;
|
|
121
|
+
export type States = z.infer<typeof statesSchema>;
|
|
122
|
+
/** A move written as a bare state is a move with nothing asked first. */
|
|
123
|
+
export declare function moveTarget(move: StateMove): string;
|
|
124
|
+
interface StatesContext<C extends ColumnShape> {
|
|
125
|
+
index: TableIndex<C>;
|
|
126
|
+
/** The app's role keys, when the manifest declares roles (an add-on's shape has none to name). */
|
|
127
|
+
roles?: readonly string[] | undefined;
|
|
128
|
+
/** A column of this table decides "numbered": a gapless running number. */
|
|
129
|
+
numbered: boolean;
|
|
130
|
+
}
|
|
131
|
+
/** Everything wrong with one table's `states` against the manifest's tables. */
|
|
132
|
+
export declare function statesIssues<C extends ColumnShape>(table: string, states: States, ctx: StatesContext<C>, at: (...rest: (string | number)[]) => (string | number)[]): ReferenceIssue[];
|
|
133
|
+
export {};
|
|
134
|
+
//# sourceMappingURL=states.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../src/states.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAsC,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAKvH,oFAAoF;AACpF,eAAO,MAAM,oBAAoB;;;;;;;;;kBAc7B,CAAC;AACL,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;oBAiB1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,gBAAgB;;;;;kBAWzB,CAAC;AACL,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAqBd,CAAC;AACZ,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAElD;AAED,UAAU,aAAa,CAAC,CAAC,SAAS,WAAW;IAC3C,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACrB,kGAAkG;IAClG,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACtC,2EAA2E;IAC3E,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,EAChD,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EACrB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GACxD,cAAc,EAAE,CAyFlB"}
|
package/dist/states.js
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
/**
|
|
3
|
+
* `table.states` — the life of a document, kept by Adminium for every writer.
|
|
4
|
+
*
|
|
5
|
+
* ```json
|
|
6
|
+
* "states": {
|
|
7
|
+
* "column": "status", "initial": "draft",
|
|
8
|
+
* "moves": {
|
|
9
|
+
* "draft": [{ "to": "sent", "requires": { "children": { "invoice_lines": 1 }, "where": [{ "column": "total", "gt": 0 }] } }, "void"],
|
|
10
|
+
* "sent": [{ "to": "void", "requires": { "where": [{ "column": "paid", "eq": 0 }] }, "roles": ["studio-manager"] }]
|
|
11
|
+
* },
|
|
12
|
+
* "lock": { "when": ["sent", "void"], "except": ["due_on", "ladder"] },
|
|
13
|
+
* "children": {
|
|
14
|
+
* "invoice_lines": { "via": "document_id", "lock": true },
|
|
15
|
+
* "payments": { "via": "document_id", "parentIn": ["sent"], "clearOnCreate": ["client_paid_at"] }
|
|
16
|
+
* },
|
|
17
|
+
* "noDelete": { "when": "numbered" },
|
|
18
|
+
* "onlyLater": ["valid_until"]
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* - `moves`: from each state, the states a write may move a row to. A move
|
|
23
|
+
* may ask for something first — child rows, a column's value — and may be
|
|
24
|
+
* kept for some of the app's roles. A move not listed is refused.
|
|
25
|
+
* - `lock`: while a row is in one of `when`, only `except` (and the state
|
|
26
|
+
* itself, through a move) may change. Adminium's own columns (totals,
|
|
27
|
+
* stamps) keep being written by Adminium.
|
|
28
|
+
* - `children`: child tables tied to this row's state. `lock` refuses their
|
|
29
|
+
* writes while the row is locked; `parentIn` allows them only while the row
|
|
30
|
+
* is in those states (payments on a sent invoice); `clearOnCreate` empties
|
|
31
|
+
* columns of this row when one of them is created (a recorded payment
|
|
32
|
+
* clears the client's "I've sent it").
|
|
33
|
+
* - `lockedWhenReferencedBy`: this row locks once a row of another table in
|
|
34
|
+
* one of the states points at it (a terms version once a proposal naming it
|
|
35
|
+
* is sent).
|
|
36
|
+
* - `noDelete`: rows in these states, or any row with a number
|
|
37
|
+
* (`"numbered"`), are never deleted — voided instead.
|
|
38
|
+
* - `onlyLater`: date columns that may move later and never earlier.
|
|
39
|
+
*
|
|
40
|
+
* Adding sample data and importing past records are history: they write any
|
|
41
|
+
* state their rows were in.
|
|
42
|
+
*/
|
|
43
|
+
import { z } from 'zod';
|
|
44
|
+
import { refSchema, scalarSchema, valueFits } from './refs.js';
|
|
45
|
+
const stateName = z.string().min(1).max(64);
|
|
46
|
+
const roleKey = z.string().regex(/^[a-z][a-z0-9-]*$/, 'a role key');
|
|
47
|
+
/** A condition on the row itself, checked in the same statement that changes it. */
|
|
48
|
+
export const stateConditionSchema = z
|
|
49
|
+
.object({
|
|
50
|
+
column: refSchema,
|
|
51
|
+
eq: scalarSchema.optional(),
|
|
52
|
+
in: z.array(scalarSchema).min(1).max(32).optional(),
|
|
53
|
+
isNull: z.boolean().optional(),
|
|
54
|
+
gt: z.number().finite().optional(),
|
|
55
|
+
gte: z.number().finite().optional(),
|
|
56
|
+
lt: z.number().finite().optional(),
|
|
57
|
+
lte: z.number().finite().optional(),
|
|
58
|
+
})
|
|
59
|
+
.strict()
|
|
60
|
+
.refine((c) => [c.eq, c.in, c.isNull, c.gt, c.gte, c.lt, c.lte].filter((part) => part !== undefined).length === 1, {
|
|
61
|
+
message: 'a condition says one of eq, in, isNull, gt, gte, lt or lte',
|
|
62
|
+
});
|
|
63
|
+
export const stateMoveSchema = z.union([
|
|
64
|
+
stateName,
|
|
65
|
+
z
|
|
66
|
+
.object({
|
|
67
|
+
to: stateName,
|
|
68
|
+
/** What must be true first: at least n child rows of a table, and conditions on the row. */
|
|
69
|
+
requires: z
|
|
70
|
+
.object({
|
|
71
|
+
children: z.record(refSchema, z.number().int().min(1).max(1000)).optional(),
|
|
72
|
+
where: z.array(stateConditionSchema).min(1).max(8).optional(),
|
|
73
|
+
})
|
|
74
|
+
.strict()
|
|
75
|
+
.optional(),
|
|
76
|
+
/** Only people holding one of these app roles may make this move. */
|
|
77
|
+
roles: z.array(roleKey).min(1).max(8).optional(),
|
|
78
|
+
})
|
|
79
|
+
.strict(),
|
|
80
|
+
]);
|
|
81
|
+
export const stateChildSchema = z
|
|
82
|
+
.object({
|
|
83
|
+
/** The child's foreign key to this row. */
|
|
84
|
+
via: refSchema,
|
|
85
|
+
lock: z.literal(true).optional(),
|
|
86
|
+
parentIn: z.array(stateName).min(1).max(16).optional(),
|
|
87
|
+
clearOnCreate: z.array(refSchema).min(1).max(8).optional(),
|
|
88
|
+
})
|
|
89
|
+
.strict()
|
|
90
|
+
.refine((c) => c.lock === undefined || c.parentIn === undefined, {
|
|
91
|
+
message: 'a child is locked with its parent, or writable only in some of its states — not both',
|
|
92
|
+
});
|
|
93
|
+
export const statesSchema = z
|
|
94
|
+
.object({
|
|
95
|
+
column: refSchema,
|
|
96
|
+
initial: stateName,
|
|
97
|
+
moves: z.record(stateName, z.array(stateMoveSchema).max(16)),
|
|
98
|
+
lock: z
|
|
99
|
+
.object({
|
|
100
|
+
when: z.array(stateName).min(1).max(16),
|
|
101
|
+
except: z.array(refSchema).max(32).optional(),
|
|
102
|
+
})
|
|
103
|
+
.strict()
|
|
104
|
+
.optional(),
|
|
105
|
+
children: z.record(refSchema, stateChildSchema).optional(),
|
|
106
|
+
lockedWhenReferencedBy: z
|
|
107
|
+
.array(z.object({ table: refSchema, via: refSchema, in: z.array(stateName).min(1).max(16) }).strict())
|
|
108
|
+
.min(1)
|
|
109
|
+
.max(4)
|
|
110
|
+
.optional(),
|
|
111
|
+
noDelete: z.object({ when: z.union([z.literal('numbered'), z.array(stateName).min(1).max(16)]) }).strict().optional(),
|
|
112
|
+
onlyLater: z.array(refSchema).min(1).max(8).optional(),
|
|
113
|
+
})
|
|
114
|
+
.strict();
|
|
115
|
+
/** A move written as a bare state is a move with nothing asked first. */
|
|
116
|
+
export function moveTarget(move) {
|
|
117
|
+
return typeof move === 'string' ? move : move.to;
|
|
118
|
+
}
|
|
119
|
+
/** Everything wrong with one table's `states` against the manifest's tables. */
|
|
120
|
+
export function statesIssues(table, states, ctx, at) {
|
|
121
|
+
const out = [];
|
|
122
|
+
const { index } = ctx;
|
|
123
|
+
const column = index.column(table, states.column);
|
|
124
|
+
let values = [];
|
|
125
|
+
if (column === undefined) {
|
|
126
|
+
out.push({ path: at('column'), message: `"${table}" has no column "${states.column}"` });
|
|
127
|
+
}
|
|
128
|
+
else if (column.type !== 'enum') {
|
|
129
|
+
out.push({ path: at('column'), message: `"${table}.${states.column}" is not an enum, so it cannot hold a state` });
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
values = column.enum ?? [];
|
|
133
|
+
}
|
|
134
|
+
const isState = (value) => values.length === 0 || values.includes(value);
|
|
135
|
+
const known = (value, path) => {
|
|
136
|
+
if (!isState(value))
|
|
137
|
+
out.push({ path, message: `"${value}" is not a value of "${table}.${states.column}"` });
|
|
138
|
+
};
|
|
139
|
+
known(states.initial, at('initial'));
|
|
140
|
+
for (const [from, moves] of Object.entries(states.moves)) {
|
|
141
|
+
known(from, at('moves', from));
|
|
142
|
+
moves.forEach((move, m) => {
|
|
143
|
+
const to = moveTarget(move);
|
|
144
|
+
known(to, at('moves', from, m));
|
|
145
|
+
if (to === from)
|
|
146
|
+
out.push({ path: at('moves', from, m), message: 'a move goes to another state' });
|
|
147
|
+
if (typeof move === 'string')
|
|
148
|
+
return;
|
|
149
|
+
for (const child of Object.keys(move.requires?.children ?? {})) {
|
|
150
|
+
if (states.children?.[child] === undefined) {
|
|
151
|
+
out.push({ path: at('moves', from, m, 'requires', 'children', child), message: `"${child}" is not one of this table's children` });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
(move.requires?.where ?? []).forEach((condition, w) => {
|
|
155
|
+
out.push(...conditionIssues(table, condition, index, at('moves', from, m, 'requires', 'where', w)));
|
|
156
|
+
});
|
|
157
|
+
for (const role of move.roles ?? []) {
|
|
158
|
+
if (ctx.roles !== undefined && !ctx.roles.includes(role)) {
|
|
159
|
+
out.push({ path: at('moves', from, m, 'roles'), message: `"${role}" is not one of the app's roles` });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
if (states.lock !== undefined) {
|
|
165
|
+
states.lock.when.forEach((value, i) => known(value, at('lock', 'when', i)));
|
|
166
|
+
for (const ref of states.lock.except ?? []) {
|
|
167
|
+
if (index.column(table, ref) === undefined)
|
|
168
|
+
out.push({ path: at('lock', 'except'), message: `"${table}" has no column "${ref}"` });
|
|
169
|
+
if (ref === states.column)
|
|
170
|
+
out.push({ path: at('lock', 'except'), message: 'the state moves by its moves, never by the lock' });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
for (const [child, rule] of Object.entries(states.children ?? {})) {
|
|
174
|
+
const here = (...rest) => at('children', child, ...rest);
|
|
175
|
+
if (index.table(child) === undefined) {
|
|
176
|
+
out.push({ path: here(), message: `"${child}" is not a table of this manifest` });
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const via = index.column(child, rule.via);
|
|
180
|
+
if (via === undefined)
|
|
181
|
+
out.push({ path: here('via'), message: `"${child}" has no column "${rule.via}"` });
|
|
182
|
+
else if (via.type !== 'fk' || via.references !== table)
|
|
183
|
+
out.push({ path: here('via'), message: `"${child}.${rule.via}" does not point at "${table}"` });
|
|
184
|
+
if (rule.lock === true && states.lock === undefined)
|
|
185
|
+
out.push({ path: here('lock'), message: 'a child is locked with its parent, and the parent has no lock' });
|
|
186
|
+
(rule.parentIn ?? []).forEach((value, i) => known(value, here('parentIn', i)));
|
|
187
|
+
for (const ref of rule.clearOnCreate ?? []) {
|
|
188
|
+
const found = index.column(table, ref);
|
|
189
|
+
if (found === undefined)
|
|
190
|
+
out.push({ path: here('clearOnCreate'), message: `"${table}" has no column "${ref}"` });
|
|
191
|
+
else if (found.nullable !== true)
|
|
192
|
+
out.push({ path: here('clearOnCreate'), message: `"${table}.${ref}" is not nullable, so it cannot be emptied` });
|
|
193
|
+
}
|
|
194
|
+
if (rule.lock === undefined && rule.parentIn === undefined && rule.clearOnCreate === undefined) {
|
|
195
|
+
out.push({ path: here(), message: 'a child says lock, parentIn or clearOnCreate' });
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
(states.lockedWhenReferencedBy ?? []).forEach((ref, r) => {
|
|
199
|
+
const here = (...rest) => at('lockedWhenReferencedBy', r, ...rest);
|
|
200
|
+
if (index.table(ref.table) === undefined) {
|
|
201
|
+
out.push({ path: here('table'), message: `"${ref.table}" is not a table of this manifest` });
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const via = index.column(ref.table, ref.via);
|
|
205
|
+
if (via?.type !== 'fk' || via.references !== table)
|
|
206
|
+
out.push({ path: here('via'), message: `"${ref.table}.${ref.via}" does not point at "${table}"` });
|
|
207
|
+
if (states.lock === undefined)
|
|
208
|
+
out.push({ path: here(), message: 'a row locked by a reference needs a lock to say what stays open' });
|
|
209
|
+
});
|
|
210
|
+
if (states.noDelete !== undefined) {
|
|
211
|
+
if (states.noDelete.when === 'numbered') {
|
|
212
|
+
if (!ctx.numbered)
|
|
213
|
+
out.push({ path: at('noDelete', 'when'), message: '"numbered" needs a column numbered without gaps (sequence.gapless)' });
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
states.noDelete.when.forEach((value, i) => known(value, at('noDelete', 'when', i)));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
for (const ref of states.onlyLater ?? []) {
|
|
220
|
+
const found = index.column(table, ref);
|
|
221
|
+
if (found === undefined)
|
|
222
|
+
out.push({ path: at('onlyLater'), message: `"${table}" has no column "${ref}"` });
|
|
223
|
+
else if (found.type !== 'date' && found.type !== 'timestamptz')
|
|
224
|
+
out.push({ path: at('onlyLater'), message: `"${table}.${ref}" is not a date` });
|
|
225
|
+
}
|
|
226
|
+
return out;
|
|
227
|
+
}
|
|
228
|
+
function conditionIssues(table, condition, index, path) {
|
|
229
|
+
const found = index.column(table, condition.column);
|
|
230
|
+
if (found === undefined)
|
|
231
|
+
return [{ path, message: `"${table}" has no column "${condition.column}"` }];
|
|
232
|
+
const out = [];
|
|
233
|
+
const values = condition.eq !== undefined ? [condition.eq] : (condition.in ?? []);
|
|
234
|
+
for (const value of values) {
|
|
235
|
+
if (!valueFits(found, value))
|
|
236
|
+
out.push({ path, message: `${JSON.stringify(value)} is not a value of "${table}.${condition.column}"` });
|
|
237
|
+
}
|
|
238
|
+
const ordered = [condition.gt, condition.gte, condition.lt, condition.lte].some((part) => part !== undefined);
|
|
239
|
+
if (ordered && !['int', 'bigint', 'decimal', 'money', 'float'].includes(found.type)) {
|
|
240
|
+
out.push({ path, message: `"${table}.${condition.column}" is not a number, so it cannot be compared` });
|
|
241
|
+
}
|
|
242
|
+
return out;
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=states.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"states.js","sourceRoot":"","sources":["../src/states.ts"],"names":[],"mappings":"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"}
|
package/dist/validate.d.ts
CHANGED
|
@@ -28,13 +28,27 @@ export interface ValidateManifestOptions {
|
|
|
28
28
|
/** The host app's table refs, so an add-on's `scopes` can be bounded. */
|
|
29
29
|
hostTables?: readonly string[];
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* A warning is advice, never a refusal: a manifest with warnings validates.
|
|
33
|
+
* Kept apart from `issues` on purpose — every app repo compares its vendored
|
|
34
|
+
* validator's issues with Adminium's, and a warning reported as an issue
|
|
35
|
+
* would fail them all on their next push.
|
|
36
|
+
*/
|
|
31
37
|
export type ValidateManifestResult = {
|
|
32
38
|
ok: true;
|
|
33
39
|
manifest: Manifest;
|
|
40
|
+
warnings: ManifestIssue[];
|
|
34
41
|
} | {
|
|
35
42
|
ok: false;
|
|
36
43
|
issues: ManifestIssue[];
|
|
44
|
+
warnings: ManifestIssue[];
|
|
37
45
|
};
|
|
46
|
+
/**
|
|
47
|
+
* Advice about an app that validates: a column with no default that is not
|
|
48
|
+
* nullable is NOT NULL once installed, so every insert must give it a value —
|
|
49
|
+
* a draft saved half-filled is refused. Every app round has hit this once.
|
|
50
|
+
*/
|
|
51
|
+
export declare function manifestWarnings(manifest: Manifest): ManifestIssue[];
|
|
38
52
|
/**
|
|
39
53
|
* Validate an untrusted manifest document. Returns the typed manifest on
|
|
40
54
|
* success, or every issue found (schema + policy) on failure — never throws.
|
package/dist/validate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;;;;;OAQG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,oEAAoE;IACpE,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,yEAAyE;IACzE,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;;;;;OAQG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,oEAAoE;IACpE,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,yEAAyE;IACzE,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,GAC3D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC;AAKtE;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,aAAa,EAAE,CAcpE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,IAAI,GAAE,uBAA4B,GACjC,sBAAsB,CA0CxB;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE,uBAA4B,GAAG,QAAQ,CAO1F"}
|
package/dist/validate.js
CHANGED
|
@@ -6,6 +6,31 @@
|
|
|
6
6
|
* in v1). Pure — safe in the browser storefront.
|
|
7
7
|
*/
|
|
8
8
|
import { FIRST_PARTY_PUBLISHER_ID, RESERVED_KEYS, addOnIssues, manifestSchema, } from './schema.js';
|
|
9
|
+
/** Rules that fill a column, so an insert may leave it out. */
|
|
10
|
+
const FILLING_RULES = ['copy', 'sequence', 'code', 'rollup', 'stamp', 'formula', 'format', 'default'];
|
|
11
|
+
/**
|
|
12
|
+
* Advice about an app that validates: a column with no default that is not
|
|
13
|
+
* nullable is NOT NULL once installed, so every insert must give it a value —
|
|
14
|
+
* a draft saved half-filled is refused. Every app round has hit this once.
|
|
15
|
+
*/
|
|
16
|
+
export function manifestWarnings(manifest) {
|
|
17
|
+
if (manifest.kind !== 'app')
|
|
18
|
+
return [];
|
|
19
|
+
const out = [];
|
|
20
|
+
(manifest.requiredSchema?.tables ?? []).forEach((table, t) => {
|
|
21
|
+
table.columns.forEach((column, c) => {
|
|
22
|
+
if (column.nullable === true || column.default !== undefined || column.role !== undefined)
|
|
23
|
+
return;
|
|
24
|
+
if (FILLING_RULES.some((rule) => column.rules?.[rule] !== undefined))
|
|
25
|
+
return;
|
|
26
|
+
out.push({
|
|
27
|
+
path: `requiredSchema.tables.${String(t)}.columns.${String(c)}`,
|
|
28
|
+
message: `"${table.ref}.${column.ref}" has no default and is not nullable, so it will be required at install: every new row must give it a value`,
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
9
34
|
/**
|
|
10
35
|
* Validate an untrusted manifest document. Returns the typed manifest on
|
|
11
36
|
* success, or every issue found (schema + policy) on failure — never throws.
|
|
@@ -19,6 +44,7 @@ export function validateManifest(input, opts = {}) {
|
|
|
19
44
|
path: issue.path.map(String).join('.'),
|
|
20
45
|
message: issue.message,
|
|
21
46
|
})),
|
|
47
|
+
warnings: [],
|
|
22
48
|
};
|
|
23
49
|
}
|
|
24
50
|
const manifest = parsed.data;
|
|
@@ -41,9 +67,10 @@ export function validateManifest(input, opts = {}) {
|
|
|
41
67
|
...(opts.knownAppKeys !== undefined ? { knownAppKeys: opts.knownAppKeys } : {}),
|
|
42
68
|
...(opts.hostTables !== undefined ? { hostTables: opts.hostTables } : {}),
|
|
43
69
|
}));
|
|
70
|
+
const warnings = manifestWarnings(manifest);
|
|
44
71
|
if (issues.length > 0)
|
|
45
|
-
return { ok: false, issues };
|
|
46
|
-
return { ok: true, manifest };
|
|
72
|
+
return { ok: false, issues, warnings };
|
|
73
|
+
return { ok: true, manifest, warnings };
|
|
47
74
|
}
|
|
48
75
|
/** Throwing variant for trusted callers (build tooling); use the safe form at runtime. */
|
|
49
76
|
export function parseManifest(input, opts = {}) {
|
package/dist/validate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC;;;;;GAKG;AAEH,OAAO,EACL,wBAAwB,EACxB,aAAa,EACb,WAAW,EACX,cAAc,GAEf,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminiumjs/manifest",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"license": "AGPL-3.0-only",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@adminium/add-on-contracts": "npm:@adminiumjs/add-on-contracts@0.3.
|
|
23
|
+
"@adminium/add-on-contracts": "npm:@adminiumjs/add-on-contracts@0.3.2",
|
|
24
24
|
"zod": "^4.4.3"
|
|
25
25
|
},
|
|
26
26
|
"files": [
|