@duckcodeailabs/dql-core 1.3.6 → 1.4.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.
@@ -0,0 +1,128 @@
1
+ /**
2
+ * App documents — `apps/<id>/dql.app.json`.
3
+ *
4
+ * An App is the consumption surface for stakeholders/CXO/teams. It bundles
5
+ * dashboards, notebooks, members, roles, access policies, RLS bindings,
6
+ * schedules, and a homepage into a single git-versioned artifact.
7
+ *
8
+ * Identity stays single-user in OSS; roles and policies are programmable and
9
+ * enforced via the existing dql-governance PolicyEngine + the @rls compiler
10
+ * decorator. Real SSO is layered separately in closed product.
11
+ */
12
+ export type AppRole = {
13
+ id: string;
14
+ displayName?: string;
15
+ description?: string;
16
+ };
17
+ export type AppMember = {
18
+ /** Stable user identifier. In OSS this is a free-form string (e.g. email). */
19
+ userId: string;
20
+ /** Optional display name shown in the persona switcher. */
21
+ displayName?: string;
22
+ /** Roles assigned to this member within the App. */
23
+ roles: string[];
24
+ /** Free-form attributes used to resolve RLS template variables (e.g. `region`). */
25
+ attributes?: Record<string, string | number | boolean>;
26
+ };
27
+ export type AppPolicy = {
28
+ id: string;
29
+ description?: string;
30
+ /** Domain this policy applies to, or '*' for all. */
31
+ domain: string;
32
+ /** Minimum data classification this policy permits. */
33
+ minClassification: 'public' | 'internal' | 'confidential' | 'restricted';
34
+ /** Roles granted access. */
35
+ allowedRoles: string[];
36
+ /** Specific user IDs granted access (overrides roles). */
37
+ allowedUsers?: string[];
38
+ /** Access level granted by this policy. */
39
+ accessLevel: 'read' | 'write' | 'execute' | 'admin';
40
+ enabled?: boolean;
41
+ };
42
+ export type AppRlsBinding = {
43
+ /** Role this binding applies to. */
44
+ role: string;
45
+ /** RLS template variable name (matches `{user.<variable>}` in @rls templates). */
46
+ variable: string;
47
+ /** Member attribute key whose value populates the variable for that role. */
48
+ from: string;
49
+ };
50
+ export type AppScheduleDelivery = {
51
+ kind: 'slack';
52
+ channel: string;
53
+ } | {
54
+ kind: 'email';
55
+ to: string[];
56
+ } | {
57
+ kind: 'webhook';
58
+ url: string;
59
+ };
60
+ export type AppSchedule = {
61
+ id: string;
62
+ cron: string;
63
+ /** Dashboard id (within this App) to render and deliver. */
64
+ dashboard: string;
65
+ deliver: AppScheduleDelivery[];
66
+ /** Optional human-readable description. */
67
+ description?: string;
68
+ enabled?: boolean;
69
+ };
70
+ export type AppHomepage = {
71
+ type: 'dashboard';
72
+ id: string;
73
+ } | {
74
+ type: 'notebook';
75
+ path: string;
76
+ };
77
+ export interface AppDocument {
78
+ /** Schema version for forward compatibility. */
79
+ version: 1;
80
+ id: string;
81
+ name: string;
82
+ description?: string;
83
+ domain: string;
84
+ owners: string[];
85
+ tags?: string[];
86
+ members: AppMember[];
87
+ roles: AppRole[];
88
+ policies: AppPolicy[];
89
+ rlsBindings?: AppRlsBinding[];
90
+ schedules?: AppSchedule[];
91
+ /** What stakeholders see when they open the App. */
92
+ homepage?: AppHomepage;
93
+ }
94
+ export interface AppDocumentParseError {
95
+ path: string;
96
+ message: string;
97
+ }
98
+ export interface AppDocumentLoadResult {
99
+ document: AppDocument | null;
100
+ errors: AppDocumentParseError[];
101
+ }
102
+ /** Parse a `dql.app.json` from raw text. */
103
+ export declare function parseAppDocument(text: string, path?: string): AppDocumentLoadResult;
104
+ /**
105
+ * Load and validate an App document by file path.
106
+ * Returns errors instead of throwing so callers can surface them as diagnostics.
107
+ */
108
+ export declare function loadAppDocument(filePath: string): AppDocumentLoadResult;
109
+ /**
110
+ * Discover all `dql.app.json` files under `<projectRoot>/apps/`.
111
+ * Returns absolute paths, sorted for deterministic manifest output.
112
+ */
113
+ export declare function findAppDocuments(projectRoot: string): string[];
114
+ /** Normalize a member's attributes for RLS resolution. Always returns a plain object. */
115
+ export declare function memberAttributes(member: AppMember): Record<string, string | number | boolean>;
116
+ /**
117
+ * Resolve `{user.<var>}` RLS templates for a given member by walking
118
+ * `rlsBindings` matching any of the member's roles.
119
+ *
120
+ * The first matching binding wins for each variable — bindings are
121
+ * declared in role-priority order in `dql.app.json`.
122
+ */
123
+ export declare function resolveRlsContext(app: AppDocument, member: AppMember): Record<string, string | number | boolean>;
124
+ /** Relative path of the App folder from the project root. */
125
+ export declare function appFolderRelPath(projectRoot: string, appJsonPath: string): string;
126
+ /** Synthesize a folder-safe id when scaffolding a new App. Public for CLI use. */
127
+ export declare function suggestAppId(name: string): string;
128
+ //# sourceMappingURL=app-document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-document.d.ts","sourceRoot":"","sources":["../../src/apps/app-document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,446 @@
1
+ /**
2
+ * App documents — `apps/<id>/dql.app.json`.
3
+ *
4
+ * An App is the consumption surface for stakeholders/CXO/teams. It bundles
5
+ * dashboards, notebooks, members, roles, access policies, RLS bindings,
6
+ * schedules, and a homepage into a single git-versioned artifact.
7
+ *
8
+ * Identity stays single-user in OSS; roles and policies are programmable and
9
+ * enforced via the existing dql-governance PolicyEngine + the @rls compiler
10
+ * decorator. Real SSO is layered separately in closed product.
11
+ */
12
+ import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';
13
+ import { join, basename, relative } from 'node:path';
14
+ /** Parse a `dql.app.json` from raw text. */
15
+ export function parseAppDocument(text, path = 'dql.app.json') {
16
+ let raw;
17
+ try {
18
+ raw = JSON.parse(text);
19
+ }
20
+ catch (err) {
21
+ return {
22
+ document: null,
23
+ errors: [{ path, message: `invalid JSON: ${err.message}` }],
24
+ };
25
+ }
26
+ return validateAppDocument(raw, path);
27
+ }
28
+ /**
29
+ * Load and validate an App document by file path.
30
+ * Returns errors instead of throwing so callers can surface them as diagnostics.
31
+ */
32
+ export function loadAppDocument(filePath) {
33
+ if (!existsSync(filePath)) {
34
+ return {
35
+ document: null,
36
+ errors: [{ path: filePath, message: 'file not found' }],
37
+ };
38
+ }
39
+ const text = readFileSync(filePath, 'utf-8');
40
+ return parseAppDocument(text, filePath);
41
+ }
42
+ /**
43
+ * Discover all `dql.app.json` files under `<projectRoot>/apps/`.
44
+ * Returns absolute paths, sorted for deterministic manifest output.
45
+ */
46
+ export function findAppDocuments(projectRoot) {
47
+ const appsDir = join(projectRoot, 'apps');
48
+ if (!existsSync(appsDir))
49
+ return [];
50
+ const out = [];
51
+ for (const entry of readdirSync(appsDir, { withFileTypes: true })) {
52
+ if (!entry.isDirectory())
53
+ continue;
54
+ if (entry.name.startsWith('.') || entry.name === 'node_modules')
55
+ continue;
56
+ const manifestPath = join(appsDir, entry.name, 'dql.app.json');
57
+ if (existsSync(manifestPath) && statSync(manifestPath).isFile()) {
58
+ out.push(manifestPath);
59
+ }
60
+ }
61
+ return out.sort();
62
+ }
63
+ /** Normalize a member's attributes for RLS resolution. Always returns a plain object. */
64
+ export function memberAttributes(member) {
65
+ return member.attributes ?? {};
66
+ }
67
+ /**
68
+ * Resolve `{user.<var>}` RLS templates for a given member by walking
69
+ * `rlsBindings` matching any of the member's roles.
70
+ *
71
+ * The first matching binding wins for each variable — bindings are
72
+ * declared in role-priority order in `dql.app.json`.
73
+ */
74
+ export function resolveRlsContext(app, member) {
75
+ const ctx = {};
76
+ const attrs = memberAttributes(member);
77
+ for (const binding of app.rlsBindings ?? []) {
78
+ if (!member.roles.includes(binding.role))
79
+ continue;
80
+ if (ctx[binding.variable] !== undefined)
81
+ continue;
82
+ const value = attrs[binding.from];
83
+ if (value !== undefined)
84
+ ctx[binding.variable] = value;
85
+ }
86
+ return ctx;
87
+ }
88
+ /** Relative path of the App folder from the project root. */
89
+ export function appFolderRelPath(projectRoot, appJsonPath) {
90
+ // appJsonPath = <projectRoot>/apps/<id>/dql.app.json
91
+ const dir = appJsonPath.endsWith('dql.app.json')
92
+ ? appJsonPath.slice(0, -'/dql.app.json'.length)
93
+ : appJsonPath;
94
+ return relative(projectRoot, dir);
95
+ }
96
+ // ---- Validation ----
97
+ function validateAppDocument(raw, path) {
98
+ const errors = [];
99
+ const err = (msg) => errors.push({ path, message: msg });
100
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
101
+ err('expected a JSON object at the top level');
102
+ return { document: null, errors };
103
+ }
104
+ const obj = raw;
105
+ // version: optional, default to 1
106
+ const version = obj.version ?? 1;
107
+ if (version !== 1)
108
+ err(`unsupported version ${String(version)} (expected 1)`);
109
+ const id = stringField(obj, 'id', err);
110
+ const name = stringField(obj, 'name', err);
111
+ const domain = stringField(obj, 'domain', err);
112
+ if (!id || !name || !domain) {
113
+ return { document: null, errors };
114
+ }
115
+ // Validate id shape — folder-safe
116
+ if (!/^[a-z0-9][a-z0-9_-]*$/i.test(id)) {
117
+ err(`id "${id}" must match /^[a-z0-9][a-z0-9_-]*$/i (folder-safe)`);
118
+ }
119
+ const owners = stringArray(obj, 'owners', err);
120
+ if (owners.length === 0)
121
+ err('at least one owner is required');
122
+ const description = optionalString(obj, 'description', err);
123
+ const tags = obj.tags === undefined ? [] : stringArray(obj, 'tags', err);
124
+ const members = readMembers(obj.members, err);
125
+ const roles = readRoles(obj.roles, err);
126
+ const policies = readPolicies(obj.policies, err);
127
+ const rlsBindings = readRlsBindings(obj.rlsBindings, err);
128
+ const schedules = readSchedules(obj.schedules, err);
129
+ const homepage = readHomepage(obj.homepage, err);
130
+ // Cross-checks: every member role must be defined; every policy role must be defined
131
+ const declaredRoles = new Set(roles.map((r) => r.id));
132
+ for (const m of members) {
133
+ for (const r of m.roles) {
134
+ if (!declaredRoles.has(r))
135
+ err(`member ${m.userId} references undeclared role "${r}"`);
136
+ }
137
+ }
138
+ for (const p of policies) {
139
+ for (const r of p.allowedRoles) {
140
+ if (!declaredRoles.has(r))
141
+ err(`policy ${p.id} references undeclared role "${r}"`);
142
+ }
143
+ }
144
+ for (const b of rlsBindings) {
145
+ if (!declaredRoles.has(b.role))
146
+ err(`rlsBinding references undeclared role "${b.role}"`);
147
+ }
148
+ if (errors.length > 0) {
149
+ return { document: null, errors };
150
+ }
151
+ const doc = {
152
+ version: 1,
153
+ id,
154
+ name,
155
+ description,
156
+ domain,
157
+ owners,
158
+ tags,
159
+ members,
160
+ roles,
161
+ policies,
162
+ rlsBindings: rlsBindings.length > 0 ? rlsBindings : undefined,
163
+ schedules: schedules.length > 0 ? schedules : undefined,
164
+ homepage,
165
+ };
166
+ return { document: doc, errors: [] };
167
+ }
168
+ function stringField(obj, key, err) {
169
+ const v = obj[key];
170
+ if (typeof v !== 'string' || v.length === 0) {
171
+ err(`field "${key}" must be a non-empty string`);
172
+ return '';
173
+ }
174
+ return v;
175
+ }
176
+ function optionalString(obj, key, err) {
177
+ const v = obj[key];
178
+ if (v === undefined)
179
+ return undefined;
180
+ if (typeof v !== 'string') {
181
+ err(`field "${key}" must be a string when present`);
182
+ return undefined;
183
+ }
184
+ return v;
185
+ }
186
+ function stringArray(obj, key, err) {
187
+ const v = obj[key];
188
+ if (v === undefined)
189
+ return [];
190
+ if (!Array.isArray(v) || !v.every((x) => typeof x === 'string')) {
191
+ err(`field "${key}" must be an array of strings`);
192
+ return [];
193
+ }
194
+ return v;
195
+ }
196
+ function readMembers(raw, err) {
197
+ if (raw === undefined)
198
+ return [];
199
+ if (!Array.isArray(raw)) {
200
+ err('members must be an array');
201
+ return [];
202
+ }
203
+ const out = [];
204
+ for (let i = 0; i < raw.length; i++) {
205
+ const m = raw[i];
206
+ if (typeof m !== 'object' || m === null) {
207
+ err(`members[${i}] must be an object`);
208
+ continue;
209
+ }
210
+ const mo = m;
211
+ const userId = mo.userId;
212
+ const roles = mo.roles;
213
+ if (typeof userId !== 'string' || userId.length === 0) {
214
+ err(`members[${i}].userId must be a non-empty string`);
215
+ continue;
216
+ }
217
+ if (!Array.isArray(roles) || !roles.every((x) => typeof x === 'string')) {
218
+ err(`members[${i}].roles must be an array of strings`);
219
+ continue;
220
+ }
221
+ const attrs = mo.attributes;
222
+ let attributes;
223
+ if (attrs !== undefined) {
224
+ if (typeof attrs !== 'object' || attrs === null || Array.isArray(attrs)) {
225
+ err(`members[${i}].attributes must be an object`);
226
+ }
227
+ else {
228
+ attributes = {};
229
+ for (const [k, v] of Object.entries(attrs)) {
230
+ if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {
231
+ attributes[k] = v;
232
+ }
233
+ else {
234
+ err(`members[${i}].attributes.${k} must be string|number|boolean`);
235
+ }
236
+ }
237
+ }
238
+ }
239
+ out.push({
240
+ userId,
241
+ displayName: typeof mo.displayName === 'string' ? mo.displayName : undefined,
242
+ roles: roles,
243
+ attributes,
244
+ });
245
+ }
246
+ return out;
247
+ }
248
+ function readRoles(raw, err) {
249
+ if (raw === undefined)
250
+ return [];
251
+ if (!Array.isArray(raw)) {
252
+ err('roles must be an array');
253
+ return [];
254
+ }
255
+ const out = [];
256
+ for (let i = 0; i < raw.length; i++) {
257
+ const r = raw[i];
258
+ if (typeof r !== 'object' || r === null) {
259
+ err(`roles[${i}] must be an object`);
260
+ continue;
261
+ }
262
+ const ro = r;
263
+ if (typeof ro.id !== 'string' || ro.id.length === 0) {
264
+ err(`roles[${i}].id must be a non-empty string`);
265
+ continue;
266
+ }
267
+ out.push({
268
+ id: ro.id,
269
+ displayName: typeof ro.displayName === 'string' ? ro.displayName : undefined,
270
+ description: typeof ro.description === 'string' ? ro.description : undefined,
271
+ });
272
+ }
273
+ return out;
274
+ }
275
+ function readPolicies(raw, err) {
276
+ if (raw === undefined)
277
+ return [];
278
+ if (!Array.isArray(raw)) {
279
+ err('policies must be an array');
280
+ return [];
281
+ }
282
+ const allowedClassifications = ['public', 'internal', 'confidential', 'restricted'];
283
+ const allowedLevels = ['read', 'write', 'execute', 'admin'];
284
+ const out = [];
285
+ for (let i = 0; i < raw.length; i++) {
286
+ const p = raw[i];
287
+ if (typeof p !== 'object' || p === null) {
288
+ err(`policies[${i}] must be an object`);
289
+ continue;
290
+ }
291
+ const po = p;
292
+ const id = po.id;
293
+ const domain = po.domain;
294
+ const minClassification = po.minClassification;
295
+ const allowedRoles = po.allowedRoles;
296
+ const accessLevel = po.accessLevel;
297
+ if (typeof id !== 'string' || id.length === 0) {
298
+ err(`policies[${i}].id must be a non-empty string`);
299
+ continue;
300
+ }
301
+ if (typeof domain !== 'string' || domain.length === 0) {
302
+ err(`policies[${id}].domain must be a non-empty string`);
303
+ continue;
304
+ }
305
+ if (typeof minClassification !== 'string'
306
+ || !allowedClassifications.includes(minClassification)) {
307
+ err(`policies[${id}].minClassification must be one of ${allowedClassifications.join('|')}`);
308
+ continue;
309
+ }
310
+ if (!Array.isArray(allowedRoles) || !allowedRoles.every((x) => typeof x === 'string')) {
311
+ err(`policies[${id}].allowedRoles must be an array of strings`);
312
+ continue;
313
+ }
314
+ if (typeof accessLevel !== 'string'
315
+ || !allowedLevels.includes(accessLevel)) {
316
+ err(`policies[${id}].accessLevel must be one of ${allowedLevels.join('|')}`);
317
+ continue;
318
+ }
319
+ const allowedUsers = po.allowedUsers;
320
+ let allowedUsersTyped;
321
+ if (allowedUsers !== undefined) {
322
+ if (!Array.isArray(allowedUsers) || !allowedUsers.every((x) => typeof x === 'string')) {
323
+ err(`policies[${id}].allowedUsers must be an array of strings when present`);
324
+ }
325
+ else {
326
+ allowedUsersTyped = allowedUsers;
327
+ }
328
+ }
329
+ out.push({
330
+ id,
331
+ description: typeof po.description === 'string' ? po.description : undefined,
332
+ domain,
333
+ minClassification: minClassification,
334
+ allowedRoles: allowedRoles,
335
+ allowedUsers: allowedUsersTyped,
336
+ accessLevel: accessLevel,
337
+ enabled: po.enabled === undefined ? true : Boolean(po.enabled),
338
+ });
339
+ }
340
+ return out;
341
+ }
342
+ function readRlsBindings(raw, err) {
343
+ if (raw === undefined)
344
+ return [];
345
+ if (!Array.isArray(raw)) {
346
+ err('rlsBindings must be an array');
347
+ return [];
348
+ }
349
+ const out = [];
350
+ for (let i = 0; i < raw.length; i++) {
351
+ const b = raw[i];
352
+ if (typeof b !== 'object' || b === null) {
353
+ err(`rlsBindings[${i}] must be an object`);
354
+ continue;
355
+ }
356
+ const bo = b;
357
+ if (typeof bo.role !== 'string' || typeof bo.variable !== 'string' || typeof bo.from !== 'string') {
358
+ err(`rlsBindings[${i}] must have string role, variable, from`);
359
+ continue;
360
+ }
361
+ out.push({ role: bo.role, variable: bo.variable, from: bo.from });
362
+ }
363
+ return out;
364
+ }
365
+ function readSchedules(raw, err) {
366
+ if (raw === undefined)
367
+ return [];
368
+ if (!Array.isArray(raw)) {
369
+ err('schedules must be an array');
370
+ return [];
371
+ }
372
+ const out = [];
373
+ for (let i = 0; i < raw.length; i++) {
374
+ const s = raw[i];
375
+ if (typeof s !== 'object' || s === null) {
376
+ err(`schedules[${i}] must be an object`);
377
+ continue;
378
+ }
379
+ const so = s;
380
+ if (typeof so.id !== 'string' || typeof so.cron !== 'string' || typeof so.dashboard !== 'string') {
381
+ err(`schedules[${i}] must have string id, cron, dashboard`);
382
+ continue;
383
+ }
384
+ const deliver = readDelivery(so.deliver, `schedules[${so.id}]`, err);
385
+ out.push({
386
+ id: so.id,
387
+ cron: so.cron,
388
+ dashboard: so.dashboard,
389
+ deliver,
390
+ description: typeof so.description === 'string' ? so.description : undefined,
391
+ enabled: so.enabled === undefined ? true : Boolean(so.enabled),
392
+ });
393
+ }
394
+ return out;
395
+ }
396
+ function readDelivery(raw, ctx, err) {
397
+ if (!Array.isArray(raw)) {
398
+ err(`${ctx}.deliver must be an array`);
399
+ return [];
400
+ }
401
+ const out = [];
402
+ for (let i = 0; i < raw.length; i++) {
403
+ const d = raw[i];
404
+ if (typeof d !== 'object' || d === null) {
405
+ err(`${ctx}.deliver[${i}] must be an object`);
406
+ continue;
407
+ }
408
+ const dobj = d;
409
+ const kind = dobj.kind;
410
+ if (kind === 'slack' && typeof dobj.channel === 'string') {
411
+ out.push({ kind: 'slack', channel: dobj.channel });
412
+ }
413
+ else if (kind === 'email' && Array.isArray(dobj.to) && dobj.to.every((x) => typeof x === 'string')) {
414
+ out.push({ kind: 'email', to: dobj.to });
415
+ }
416
+ else if (kind === 'webhook' && typeof dobj.url === 'string') {
417
+ out.push({ kind: 'webhook', url: dobj.url });
418
+ }
419
+ else {
420
+ err(`${ctx}.deliver[${i}] has unknown shape (kind=${String(kind)})`);
421
+ }
422
+ }
423
+ return out;
424
+ }
425
+ function readHomepage(raw, err) {
426
+ if (raw === undefined)
427
+ return undefined;
428
+ if (typeof raw !== 'object' || raw === null) {
429
+ err('homepage must be an object');
430
+ return undefined;
431
+ }
432
+ const ho = raw;
433
+ if (ho.type === 'dashboard' && typeof ho.id === 'string') {
434
+ return { type: 'dashboard', id: ho.id };
435
+ }
436
+ if (ho.type === 'notebook' && typeof ho.path === 'string') {
437
+ return { type: 'notebook', path: ho.path };
438
+ }
439
+ err(`homepage must be { type: "dashboard", id } or { type: "notebook", path }`);
440
+ return undefined;
441
+ }
442
+ /** Synthesize a folder-safe id when scaffolding a new App. Public for CLI use. */
443
+ export function suggestAppId(name) {
444
+ return basename(name).toLowerCase().replace(/[^a-z0-9_-]+/g, '-').replace(/^-+|-+$/g, '') || 'app';
445
+ }
446
+ //# sourceMappingURL=app-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-document.js","sourceRoot":"","sources":["../../src/apps/app-document.ts"],"names":[],"mappings":"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"}