@adminiumjs/manifest 0.3.5 → 0.3.7
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/capacity.d.ts +786 -0
- package/dist/capacity.d.ts.map +1 -0
- package/dist/capacity.js +717 -0
- package/dist/capacity.js.map +1 -0
- package/dist/documents.d.ts +91 -5
- package/dist/documents.d.ts.map +1 -1
- package/dist/documents.js +129 -32
- package/dist/documents.js.map +1 -1
- package/dist/formula.d.ts +114 -2
- package/dist/formula.d.ts.map +1 -1
- package/dist/formula.js +291 -5
- package/dist/formula.js.map +1 -1
- package/dist/index.d.ts +12 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/dist/marketplace-wire.d.ts +230 -0
- package/dist/marketplace-wire.d.ts.map +1 -0
- package/dist/marketplace-wire.js +138 -0
- package/dist/marketplace-wire.js.map +1 -0
- package/dist/outbox.d.ts +242 -27
- package/dist/outbox.d.ts.map +1 -1
- package/dist/outbox.js +553 -27
- package/dist/outbox.js.map +1 -1
- package/dist/plan-context.d.ts +28 -3
- package/dist/plan-context.d.ts.map +1 -1
- package/dist/plan-context.js +291 -14
- package/dist/plan-context.js.map +1 -1
- package/dist/plan-model.d.ts +58 -3
- package/dist/plan-model.d.ts.map +1 -1
- package/dist/public-access.d.ts +637 -0
- package/dist/public-access.d.ts.map +1 -1
- package/dist/public-access.js +1593 -12
- package/dist/public-access.js.map +1 -1
- package/dist/refs.d.ts +86 -0
- package/dist/refs.d.ts.map +1 -1
- package/dist/refs.js +186 -0
- package/dist/refs.js.map +1 -1
- package/dist/roles.d.ts +10 -2
- package/dist/roles.d.ts.map +1 -1
- package/dist/roles.js +27 -5
- package/dist/roles.js.map +1 -1
- package/dist/sample.d.ts +218 -2
- package/dist/sample.d.ts.map +1 -1
- package/dist/sample.js +145 -7
- package/dist/sample.js.map +1 -1
- package/dist/schema.d.ts +2860 -360
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +1002 -54
- package/dist/schema.js.map +1 -1
- package/dist/shapes.d.ts +5 -1
- package/dist/shapes.d.ts.map +1 -1
- package/dist/shapes.js +13 -3
- package/dist/shapes.js.map +1 -1
- package/dist/states.d.ts +342 -2
- package/dist/states.d.ts.map +1 -1
- package/dist/states.js +566 -7
- package/dist/states.js.map +1 -1
- package/dist/table-shapes.d.ts +47 -0
- package/dist/table-shapes.d.ts.map +1 -0
- package/dist/table-shapes.js +159 -0
- package/dist/table-shapes.js.map +1 -0
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +80 -2
- package/dist/validate.js.map +1 -1
- package/package.json +2 -2
package/dist/refs.js
CHANGED
|
@@ -50,6 +50,8 @@ export function tableIndex(tables) {
|
|
|
50
50
|
const column = (table, ref) => byRef.get(table)?.columns.find((c) => c.ref === ref);
|
|
51
51
|
return {
|
|
52
52
|
table: (ref) => byRef.get(ref),
|
|
53
|
+
/** Every table, in the manifest's order. */
|
|
54
|
+
tables: () => tables,
|
|
53
55
|
column,
|
|
54
56
|
has: (table, ref) => column(table, ref) !== undefined,
|
|
55
57
|
/** The table's primary key column, when it declares one. */
|
|
@@ -79,4 +81,188 @@ export function valueFits(column, value) {
|
|
|
79
81
|
return typeof value === 'string';
|
|
80
82
|
}
|
|
81
83
|
}
|
|
84
|
+
// ── moments ───────────────────────────────────────────────────────────────────
|
|
85
|
+
//
|
|
86
|
+
// One shape for every rule that reads a point in time: a move allowed only
|
|
87
|
+
// after or before a time, a move made on its own when a time passes, a
|
|
88
|
+
// deadline a stamp writes, a public change allowed only inside a window, a
|
|
89
|
+
// hold that lasts until a time. A moment is a date or a timestamp column of
|
|
90
|
+
// the row — or of the row one of its links points at — at a wall time of the
|
|
91
|
+
// venue's day, shifted by an amount, and may fall back to another moment when
|
|
92
|
+
// its column is empty.
|
|
93
|
+
//
|
|
94
|
+
// Minutes and hours are elapsed time (48 hours before 15:00 is 48 real
|
|
95
|
+
// hours); days are calendar days on the venue's clock at the same wall time
|
|
96
|
+
// (7 days before 20:00 is 20:00, whatever the clocks did in between). A
|
|
97
|
+
// moment whose column is empty, whose linked row is missing or whose setting
|
|
98
|
+
// cannot be read is no moment at all, and the rule reading it says what that
|
|
99
|
+
// means (a move waiting for it is refused).
|
|
100
|
+
/** A wall time on the venue's clock, `HH:MM`. */
|
|
101
|
+
const clockTextSchema = z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/, 'a time of day is HH:MM');
|
|
102
|
+
/** A whole number the manifest states, or one the app's settings row holds, bounded. */
|
|
103
|
+
const momentAmount = (max) => z.union([z.number().int().min(0).max(max), settingRefSchema]);
|
|
104
|
+
/** The longest shifts a moment takes: about a hundred years of days, a million minutes. */
|
|
105
|
+
export const MOMENT_LIMITS = { minutes: 1_000_000, hours: 16_666, days: 36_600 };
|
|
106
|
+
/**
|
|
107
|
+
* Written as a named type rather than inferred: every rule that holds a
|
|
108
|
+
* moment would otherwise spell the whole shape out again in the package's
|
|
109
|
+
* declarations, deep enough for the compiler to cut it short.
|
|
110
|
+
*/
|
|
111
|
+
export const momentOffsetSchema = z
|
|
112
|
+
.object({
|
|
113
|
+
minutes: momentAmount(MOMENT_LIMITS.minutes).optional(),
|
|
114
|
+
hours: momentAmount(MOMENT_LIMITS.hours).optional(),
|
|
115
|
+
days: momentAmount(MOMENT_LIMITS.days).optional(),
|
|
116
|
+
})
|
|
117
|
+
.strict()
|
|
118
|
+
.refine((o) => [o.minutes, o.hours, o.days].filter((part) => part !== undefined).length === 1, {
|
|
119
|
+
message: 'a shift is one of minutes, hours or days',
|
|
120
|
+
});
|
|
121
|
+
/** A time of day: `HH:MM`, or a text setting holding one. */
|
|
122
|
+
export const clockTimeSchema = z.union([clockTextSchema, settingRefSchema]);
|
|
123
|
+
/**
|
|
124
|
+
* The hour the venue opens or closes on the moment's own weekday, read from a
|
|
125
|
+
* weekly hours table (one row per weekday, `HH:MM` text times). A day that is
|
|
126
|
+
* closed, or has no row, ends at midnight.
|
|
127
|
+
*/
|
|
128
|
+
export const hoursEdgeSchema = z
|
|
129
|
+
.object({
|
|
130
|
+
hours: z
|
|
131
|
+
.object({
|
|
132
|
+
table: refSchema,
|
|
133
|
+
/** An enum of mon, tue, wed, thu, fri, sat, sun. */
|
|
134
|
+
weekday: refSchema,
|
|
135
|
+
/** A bool: false means the venue is closed that day. */
|
|
136
|
+
open: refSchema.optional(),
|
|
137
|
+
opens: refSchema.optional(),
|
|
138
|
+
closes: refSchema,
|
|
139
|
+
})
|
|
140
|
+
.strict(),
|
|
141
|
+
edge: z.enum(['opens', 'closes']),
|
|
142
|
+
})
|
|
143
|
+
.strict();
|
|
144
|
+
/**
|
|
145
|
+
* A time of day kept on the row itself: a column of the row the moment's own
|
|
146
|
+
* column is read from (the linked row's, with `via`) holding `HH:MM` — a
|
|
147
|
+
* guest's arrival time on their stay.
|
|
148
|
+
*/
|
|
149
|
+
export const rowTimeSchema = z.object({ column: refSchema }).strict();
|
|
150
|
+
export const wallTimeSchema = z.union([clockTimeSchema, hoursEdgeSchema, rowTimeSchema]);
|
|
151
|
+
const momentFields = {
|
|
152
|
+
/** A `date` or `timestamptz` column: this row's own, or the linked row's when `via` is given. */
|
|
153
|
+
column: refSchema,
|
|
154
|
+
/** This row's foreign key: the moment is read from the row it points at (one link, never two). */
|
|
155
|
+
via: refSchema.optional(),
|
|
156
|
+
/** The venue's wall time on the column's day; a date column needs one to be a moment. */
|
|
157
|
+
time: wallTimeSchema.optional(),
|
|
158
|
+
plus: momentOffsetSchema.optional(),
|
|
159
|
+
minus: momentOffsetSchema.optional(),
|
|
160
|
+
};
|
|
161
|
+
const oneShift = (m) => m.plus === undefined || m.minus === undefined;
|
|
162
|
+
const ONE_SHIFT = { message: 'a moment is shifted forward (plus) or back (minus), not both' };
|
|
163
|
+
export const plainMomentSchema = z.object(momentFields).strict().refine(oneShift, ONE_SHIFT);
|
|
164
|
+
export const momentSchema = z
|
|
165
|
+
.object({ ...momentFields, or: z.array(plainMomentSchema).min(1).max(3).optional() })
|
|
166
|
+
.strict()
|
|
167
|
+
.refine(oneShift, ONE_SHIFT);
|
|
168
|
+
/** The weekday values a weekly hours table's weekday enum holds, in this order. */
|
|
169
|
+
const WEEKDAY_VALUES = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'];
|
|
170
|
+
/**
|
|
171
|
+
* Everything wrong with one moment read from a row of `table`: its link, its
|
|
172
|
+
* column, the settings and hours it reads. The same checks for every rule
|
|
173
|
+
* that holds a moment, so each says "not a date" the same way.
|
|
174
|
+
*/
|
|
175
|
+
export function momentIssues(table, moment, index, path) {
|
|
176
|
+
const out = [];
|
|
177
|
+
const want = (tableRef, column, types, at, what) => {
|
|
178
|
+
if (index.table(tableRef) === undefined) {
|
|
179
|
+
out.push({ path: at, message: `"${tableRef}" is not a table of this manifest` });
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
const found = index.column(tableRef, column);
|
|
183
|
+
if (found === undefined) {
|
|
184
|
+
out.push({ path: at, message: `"${tableRef}" has no column "${column}"` });
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
if (!types.includes(found.type)) {
|
|
188
|
+
out.push({ path: at, message: `"${tableRef}.${column}" is not ${what}` });
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
return found;
|
|
192
|
+
};
|
|
193
|
+
let owner = table;
|
|
194
|
+
if (moment.via !== undefined) {
|
|
195
|
+
const via = index.column(table, moment.via);
|
|
196
|
+
if (via === undefined) {
|
|
197
|
+
out.push({ path: [...path, 'via'], message: `"${table}" has no column "${moment.via}"` });
|
|
198
|
+
owner = undefined;
|
|
199
|
+
}
|
|
200
|
+
else if (via.role === 'pk') {
|
|
201
|
+
out.push({ path: [...path, 'via'], message: `"${table}.${moment.via}" is the key, and points at no other row` });
|
|
202
|
+
owner = undefined;
|
|
203
|
+
}
|
|
204
|
+
else if (via.type !== 'fk' || via.references === undefined || index.table(via.references) === undefined) {
|
|
205
|
+
out.push({ path: [...path, 'via'], message: `"${table}.${moment.via}" does not point at a table of this manifest` });
|
|
206
|
+
owner = undefined;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
owner = via.references;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (owner !== undefined) {
|
|
213
|
+
const column = want(owner, moment.column, ['date', 'timestamptz'], [...path, 'column'], 'a date or a timestamptz');
|
|
214
|
+
if (column?.type === 'date' && moment.time === undefined) {
|
|
215
|
+
out.push({ path: [...path, 'time'], message: `"${owner}.${moment.column}" is a date, so the moment names a time of day on it` });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const time = moment.time;
|
|
219
|
+
if (time !== undefined && typeof time === 'object' && !('edge' in time) && !('table' in time)) {
|
|
220
|
+
// A time kept on the row the moment's column is read from.
|
|
221
|
+
if (owner !== undefined) {
|
|
222
|
+
const found = want(owner, time.column, ['text'], [...path, 'time', 'column'], 'a text column holding HH:MM');
|
|
223
|
+
if (found?.maxLength !== undefined && found.maxLength < 5) {
|
|
224
|
+
out.push({ path: [...path, 'time', 'column'], message: `"${owner}.${time.column}" holds fewer than the 5 characters of HH:MM` });
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
else if (time !== undefined && typeof time === 'object') {
|
|
229
|
+
if ('edge' in time) {
|
|
230
|
+
const hours = time.hours;
|
|
231
|
+
const at = [...path, 'time', 'hours'];
|
|
232
|
+
const weekday = want(hours.table, hours.weekday, ['enum'], [...at, 'weekday'], `an enum of ${WEEKDAY_VALUES.join(', ')}`);
|
|
233
|
+
if (weekday !== undefined && (weekday.enum ?? []).join(',') !== WEEKDAY_VALUES.join(',')) {
|
|
234
|
+
out.push({ path: [...at, 'weekday'], message: `"${hours.table}.${hours.weekday}" is not an enum of ${WEEKDAY_VALUES.join(', ')}` });
|
|
235
|
+
}
|
|
236
|
+
if (hours.open !== undefined)
|
|
237
|
+
want(hours.table, hours.open, ['bool'], [...at, 'open'], 'a bool');
|
|
238
|
+
if (hours.opens !== undefined)
|
|
239
|
+
want(hours.table, hours.opens, ['text'], [...at, 'opens'], 'a text column holding HH:MM');
|
|
240
|
+
want(hours.table, hours.closes, ['text'], [...at, 'closes'], 'a text column holding HH:MM');
|
|
241
|
+
if (time.edge === 'opens' && hours.opens === undefined) {
|
|
242
|
+
out.push({ path: [...path, 'time', 'edge'], message: 'the opening hour is read from a column: name it (hours.opens)' });
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
const found = want(time.table, time.column, ['text'], [...path, 'time'], 'a text column holding HH:MM');
|
|
247
|
+
if (found?.maxLength !== undefined && found.maxLength < 5) {
|
|
248
|
+
out.push({ path: [...path, 'time'], message: `"${time.table}.${time.column}" holds fewer than the 5 characters of HH:MM` });
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
for (const side of ['plus', 'minus']) {
|
|
253
|
+
const shift = moment[side];
|
|
254
|
+
if (shift === undefined)
|
|
255
|
+
continue;
|
|
256
|
+
for (const unit of ['minutes', 'hours', 'days']) {
|
|
257
|
+
const amount = shift[unit];
|
|
258
|
+
if (amount !== undefined && typeof amount === 'object') {
|
|
259
|
+
want(amount.table, amount.column, ['int', 'bigint'], [...path, side, unit], 'a whole number');
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if ('or' in moment && moment.or !== undefined) {
|
|
264
|
+
moment.or.forEach((fallback, i) => out.push(...momentIssues(table, fallback, index, [...path, 'or', i])));
|
|
265
|
+
}
|
|
266
|
+
return out;
|
|
267
|
+
}
|
|
82
268
|
//# sourceMappingURL=refs.js.map
|
package/dist/refs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"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"}
|
package/dist/roles.d.ts
CHANGED
|
@@ -18,19 +18,27 @@
|
|
|
18
18
|
* that update (itself or through `cloneFrom`) for a limit on the table to
|
|
19
19
|
* mean anything. Roles add up: someone who also holds a role with a plain
|
|
20
20
|
* update on the table is not held to the limit. Creating rows is not limited.
|
|
21
|
+
*
|
|
22
|
+
* `readable` limits the role's READ of the table to some columns, the same
|
|
23
|
+
* way: housekeeping reads a stay's room and dates, and none of its guest or
|
|
24
|
+
* its money. The key and the table's links to other rows are always read (a
|
|
25
|
+
* screen moves through them). A column the role may not read is not written
|
|
26
|
+
* through it either, unless `writable` names it.
|
|
21
27
|
*/
|
|
22
28
|
import { z } from 'zod';
|
|
23
29
|
import { type ColumnShape, type ReferenceIssue, type TableIndex } from './refs.js';
|
|
24
30
|
/** One table's limit. */
|
|
25
31
|
export declare const roleLimitSchema: z.ZodObject<{
|
|
26
|
-
writable: z.ZodArray<z.ZodString
|
|
32
|
+
writable: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
27
33
|
writableValues: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>>;
|
|
34
|
+
readable: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
28
35
|
}, z.core.$strict>;
|
|
29
36
|
export type RoleLimit = z.infer<typeof roleLimitSchema>;
|
|
30
37
|
/** Per table ref, the limit on the role's update there. */
|
|
31
38
|
export declare const roleLimitsSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
32
|
-
writable: z.ZodArray<z.ZodString
|
|
39
|
+
writable: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
33
40
|
writableValues: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>>;
|
|
41
|
+
readable: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
34
42
|
}, z.core.$strict>>;
|
|
35
43
|
/** What the checks read of a role. */
|
|
36
44
|
export interface RoleShape {
|
package/dist/roles.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../src/roles.ts"],"names":[],"mappings":"AACA
|
|
1
|
+
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../src/roles.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAsC,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvH,yBAAyB;AACzB,eAAO,MAAM,eAAe;;;;kBAU0I,CAAC;AACvK,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB;;;;mBAAuC,CAAC;AAErE,sCAAsC;AACtC,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5C,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC;CAC1D;AAQD,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,cAAc,EAAE,CAsC1H"}
|
package/dist/roles.js
CHANGED
|
@@ -19,6 +19,12 @@
|
|
|
19
19
|
* that update (itself or through `cloneFrom`) for a limit on the table to
|
|
20
20
|
* mean anything. Roles add up: someone who also holds a role with a plain
|
|
21
21
|
* update on the table is not held to the limit. Creating rows is not limited.
|
|
22
|
+
*
|
|
23
|
+
* `readable` limits the role's READ of the table to some columns, the same
|
|
24
|
+
* way: housekeeping reads a stay's room and dates, and none of its guest or
|
|
25
|
+
* its money. The key and the table's links to other rows are always read (a
|
|
26
|
+
* screen moves through them). A column the role may not read is not written
|
|
27
|
+
* through it either, unless `writable` names it.
|
|
22
28
|
*/
|
|
23
29
|
import { z } from 'zod';
|
|
24
30
|
import { refSchema, scalarSchema, valueFits } from './refs.js';
|
|
@@ -26,11 +32,14 @@ import { refSchema, scalarSchema, valueFits } from './refs.js';
|
|
|
26
32
|
export const roleLimitSchema = z
|
|
27
33
|
.object({
|
|
28
34
|
/** The only columns the update may change. */
|
|
29
|
-
writable: z.array(refSchema).min(1),
|
|
35
|
+
writable: z.array(refSchema).min(1).optional(),
|
|
30
36
|
/** For some of those columns, the only values it may set. */
|
|
31
37
|
writableValues: z.record(refSchema, z.array(scalarSchema).min(1).max(32)).optional(),
|
|
38
|
+
/** The only columns the read shows (with the key and the links to other rows). */
|
|
39
|
+
readable: z.array(refSchema).min(1).max(200).optional(),
|
|
32
40
|
})
|
|
33
|
-
.strict()
|
|
41
|
+
.strict()
|
|
42
|
+
.refine((limit) => limit.writable !== undefined || limit.readable !== undefined, { message: 'a limit names what the role may write (writable) or read (readable)' });
|
|
34
43
|
/** Per table ref, the limit on the role's update there. */
|
|
35
44
|
export const roleLimitsSchema = z.record(refSchema, roleLimitSchema);
|
|
36
45
|
/** The grants a role ends up with: its own and the ones of the role it clones. */
|
|
@@ -49,14 +58,27 @@ export function roleLimitIssues(roles, index) {
|
|
|
49
58
|
out.push({ path: at(), message: `"${ref}" is not a table of this app` });
|
|
50
59
|
continue;
|
|
51
60
|
}
|
|
52
|
-
if (!grants.has(`table:@${ref}:update`)) {
|
|
61
|
+
if (limit.writable !== undefined && !grants.has(`table:@${ref}:update`)) {
|
|
53
62
|
out.push({ path: at(), message: `the role does not grant table:@${ref}:update, so there is nothing to limit` });
|
|
54
63
|
}
|
|
55
|
-
|
|
56
|
-
|
|
64
|
+
if (limit.writable === undefined && limit.writableValues !== undefined) {
|
|
65
|
+
out.push({ path: at('writableValues'), message: 'values are limited for the columns the role may write: name them (writable)' });
|
|
66
|
+
}
|
|
67
|
+
const writable = new Set(limit.writable ?? []);
|
|
68
|
+
for (const column of limit.writable ?? []) {
|
|
57
69
|
if (index.column(ref, column) === undefined)
|
|
58
70
|
out.push({ path: at('writable'), message: `"${ref}" has no column "${column}"` });
|
|
59
71
|
}
|
|
72
|
+
if (limit.readable !== undefined) {
|
|
73
|
+
if (!grants.has(`table:@${ref}:read`))
|
|
74
|
+
out.push({ path: at('readable'), message: `the role does not grant table:@${ref}:read, so there is nothing to limit` });
|
|
75
|
+
limit.readable.forEach((column, c) => {
|
|
76
|
+
if (index.column(ref, column) === undefined)
|
|
77
|
+
out.push({ path: at('readable', c), message: `"${ref}" has no column "${column}"` });
|
|
78
|
+
else if (limit.readable.indexOf(column) !== c)
|
|
79
|
+
out.push({ path: at('readable', c), message: `"${column}" is listed twice` });
|
|
80
|
+
});
|
|
81
|
+
}
|
|
60
82
|
for (const [column, values] of Object.entries(limit.writableValues ?? {})) {
|
|
61
83
|
if (!writable.has(column))
|
|
62
84
|
out.push({ path: at('writableValues', column), message: `"${column}" is not writable` });
|
package/dist/roles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../src/roles.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC
|
|
1
|
+
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../src/roles.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAA0D,MAAM,WAAW,CAAC;AAEvH,yBAAyB;AACzB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,8CAA8C;IAC9C,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9C,6DAA6D;IAC7D,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpF,kFAAkF;IAClF,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACxD,CAAC;KACD,MAAM,EAAE;KACR,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,EAAE,OAAO,EAAE,qEAAqE,EAAE,CAAC,CAAC;AAGvK,2DAA2D;AAC3D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;AAUrE,kFAAkF;AAClF,SAAS,QAAQ,CAAC,IAAe,EAAE,KAA2B;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5G,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,eAAe,CAAwB,KAA2B,EAAE,KAAoB;IACtG,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;YAC7D,MAAM,EAAE,GAAG,CAAC,GAAG,IAAyB,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAClF,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;gBACnC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,8BAA8B,EAAE,CAAC,CAAC;gBACzE,SAAS;YACX,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC,EAAE,CAAC;gBACxE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,kCAAkC,GAAG,uCAAuC,EAAE,CAAC,CAAC;YAClH,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;gBACvE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,6EAA6E,EAAE,CAAC,CAAC;YACnI,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YAC/C,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;gBAC1C,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,SAAS;oBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,oBAAoB,MAAM,GAAG,EAAE,CAAC,CAAC;YACjI,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,kCAAkC,GAAG,qCAAqC,EAAE,CAAC,CAAC;gBAC/J,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACnC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,SAAS;wBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,oBAAoB,MAAM,GAAG,EAAE,CAAC,CAAC;yBAC7H,IAAI,KAAK,CAAC,QAAS,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;wBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,MAAM,mBAAmB,EAAE,CAAC,CAAC;gBAChI,CAAC,CAAC,CAAC;YACL,CAAC;YACD,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC1E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,MAAM,mBAAmB,EAAE,CAAC,CAAC;gBACpH,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACxC,IAAI,KAAK,KAAK,SAAS;oBAAE,SAAS;gBAClC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;wBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,uBAAuB,GAAG,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;gBAC3J,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC"}
|