yaml-flow 2.6.0 → 2.6.1
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/browser/card-compute.js +100 -0
- package/dist/card-compute/index.cjs +132 -0
- package/dist/card-compute/index.cjs.map +1 -1
- package/dist/card-compute/index.d.cts +18 -1
- package/dist/card-compute/index.d.ts +18 -1
- package/dist/card-compute/index.js +132 -0
- package/dist/card-compute/index.js.map +1 -1
- package/dist/index.cjs +132 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +132 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/schema/live-cards.schema.json +246 -0
package/browser/card-compute.js
CHANGED
|
@@ -426,6 +426,105 @@
|
|
|
426
426
|
_customFns[name] = fn;
|
|
427
427
|
}
|
|
428
428
|
|
|
429
|
+
// ===========================================================================
|
|
430
|
+
// validate — lightweight structural validator for LiveCards nodes
|
|
431
|
+
// ===========================================================================
|
|
432
|
+
|
|
433
|
+
var VALID_ELEMENT_KINDS = ['metric','table','chart','form','filter','list','notes','todo','alert','narrative','badge','text','markdown','custom'];
|
|
434
|
+
var VALID_SOURCE_KINDS = ['api','websocket','static','llm'];
|
|
435
|
+
var VALID_STATUSES = ['fresh','stale','loading','error'];
|
|
436
|
+
var CARD_KEYS = ['id','type','meta','data','view','state','compute'];
|
|
437
|
+
var SOURCE_KEYS = ['id','type','meta','data','source','state','compute'];
|
|
438
|
+
|
|
439
|
+
function validateNode(node) {
|
|
440
|
+
var errors = [];
|
|
441
|
+
if (!node || typeof node !== 'object' || Array.isArray(node)) {
|
|
442
|
+
return { ok: false, errors: ['Node must be a non-null object'] };
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
if (typeof node.id !== 'string' || !node.id) errors.push('id: required, must be a non-empty string');
|
|
446
|
+
|
|
447
|
+
if (node.type !== 'card' && node.type !== 'source') {
|
|
448
|
+
errors.push('type: must be "card" or "source"');
|
|
449
|
+
return { ok: false, errors: errors };
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
var allowed = node.type === 'card' ? CARD_KEYS : SOURCE_KEYS;
|
|
453
|
+
Object.keys(node).forEach(function (k) {
|
|
454
|
+
if (allowed.indexOf(k) === -1) errors.push('Unknown top-level key: "' + k + '"');
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
// state
|
|
458
|
+
if (node.state == null || typeof node.state !== 'object' || Array.isArray(node.state)) {
|
|
459
|
+
errors.push('state: required, must be an object');
|
|
460
|
+
} else if (node.state.status != null && VALID_STATUSES.indexOf(node.state.status) === -1) {
|
|
461
|
+
errors.push('state.status: must be one of: ' + VALID_STATUSES.join(', '));
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// meta
|
|
465
|
+
if (node.meta != null) {
|
|
466
|
+
if (typeof node.meta !== 'object' || Array.isArray(node.meta)) errors.push('meta: must be an object');
|
|
467
|
+
else {
|
|
468
|
+
if (node.meta.title != null && typeof node.meta.title !== 'string') errors.push('meta.title: must be a string');
|
|
469
|
+
if (node.meta.tags != null && !Array.isArray(node.meta.tags)) errors.push('meta.tags: must be an array');
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// data
|
|
474
|
+
if (node.data != null) {
|
|
475
|
+
if (typeof node.data !== 'object' || Array.isArray(node.data)) errors.push('data: must be an object');
|
|
476
|
+
else {
|
|
477
|
+
if (node.data.requires != null && !Array.isArray(node.data.requires)) errors.push('data.requires: must be an array');
|
|
478
|
+
if (node.data.provides != null && (typeof node.data.provides !== 'object' || Array.isArray(node.data.provides))) errors.push('data.provides: must be an object');
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// compute
|
|
483
|
+
if (node.compute != null) {
|
|
484
|
+
if (typeof node.compute !== 'object' || Array.isArray(node.compute)) errors.push('compute: must be an object');
|
|
485
|
+
else {
|
|
486
|
+
Object.keys(node.compute).forEach(function (key) {
|
|
487
|
+
var expr = node.compute[key];
|
|
488
|
+
if (!expr || typeof expr !== 'object' || Array.isArray(expr)) errors.push('compute.' + key + ': must be a compute expression object');
|
|
489
|
+
else if (!expr.fn) errors.push('compute.' + key + ': missing required "fn" property');
|
|
490
|
+
else if (!_fns[expr.fn] && !_customFns[expr.fn]) errors.push('compute.' + key + ': unknown function "' + expr.fn + '"');
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// Card-specific
|
|
496
|
+
if (node.type === 'card') {
|
|
497
|
+
if (node.source != null) errors.push('Card nodes must not have "source"');
|
|
498
|
+
if (node.view == null || typeof node.view !== 'object' || Array.isArray(node.view)) {
|
|
499
|
+
errors.push('view: required for card nodes, must be an object');
|
|
500
|
+
} else {
|
|
501
|
+
if (!Array.isArray(node.view.elements) || node.view.elements.length === 0) {
|
|
502
|
+
errors.push('view.elements: required, must be a non-empty array');
|
|
503
|
+
} else {
|
|
504
|
+
node.view.elements.forEach(function (elem, i) {
|
|
505
|
+
if (!elem || typeof elem !== 'object') { errors.push('view.elements[' + i + ']: must be an object'); return; }
|
|
506
|
+
if (!elem.kind || typeof elem.kind !== 'string') errors.push('view.elements[' + i + '].kind: required');
|
|
507
|
+
else if (VALID_ELEMENT_KINDS.indexOf(elem.kind) === -1) errors.push('view.elements[' + i + '].kind: unknown "' + elem.kind + '"');
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// Source-specific
|
|
514
|
+
if (node.type === 'source') {
|
|
515
|
+
if (node.view != null) errors.push('Source nodes must not have "view"');
|
|
516
|
+
if (node.source == null || typeof node.source !== 'object' || Array.isArray(node.source)) {
|
|
517
|
+
errors.push('source: required for source nodes, must be an object');
|
|
518
|
+
} else {
|
|
519
|
+
if (!node.source.kind || VALID_SOURCE_KINDS.indexOf(node.source.kind) === -1) errors.push('source.kind: required, must be one of: ' + VALID_SOURCE_KINDS.join(', '));
|
|
520
|
+
if (typeof node.source.bindTo !== 'string' || !node.source.bindTo) errors.push('source.bindTo: required, must be a state path string');
|
|
521
|
+
else if (node.source.bindTo.indexOf('state.') !== 0) errors.push('source.bindTo: must start with "state."');
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
return { ok: errors.length === 0, errors: errors };
|
|
526
|
+
}
|
|
527
|
+
|
|
429
528
|
// ===========================================================================
|
|
430
529
|
// Export
|
|
431
530
|
// ===========================================================================
|
|
@@ -434,6 +533,7 @@
|
|
|
434
533
|
run: run,
|
|
435
534
|
eval: evalExpr,
|
|
436
535
|
resolve: resolve,
|
|
536
|
+
validate: validateNode,
|
|
437
537
|
registerFunction: registerFunction,
|
|
438
538
|
get functions() {
|
|
439
539
|
var all = {};
|
|
@@ -304,10 +304,142 @@ function resolve(node, path) {
|
|
|
304
304
|
function registerFunction(name, fn) {
|
|
305
305
|
_customFns[name] = fn;
|
|
306
306
|
}
|
|
307
|
+
var VALID_ELEMENT_KINDS = /* @__PURE__ */ new Set([
|
|
308
|
+
"metric",
|
|
309
|
+
"table",
|
|
310
|
+
"chart",
|
|
311
|
+
"form",
|
|
312
|
+
"filter",
|
|
313
|
+
"list",
|
|
314
|
+
"notes",
|
|
315
|
+
"todo",
|
|
316
|
+
"alert",
|
|
317
|
+
"narrative",
|
|
318
|
+
"badge",
|
|
319
|
+
"text",
|
|
320
|
+
"markdown",
|
|
321
|
+
"custom"
|
|
322
|
+
]);
|
|
323
|
+
var VALID_SOURCE_KINDS = /* @__PURE__ */ new Set(["api", "websocket", "static", "llm"]);
|
|
324
|
+
var VALID_STATUSES = /* @__PURE__ */ new Set(["fresh", "stale", "loading", "error"]);
|
|
325
|
+
var CARD_ALLOWED_KEYS = /* @__PURE__ */ new Set(["id", "type", "meta", "data", "view", "state", "compute"]);
|
|
326
|
+
var SOURCE_ALLOWED_KEYS = /* @__PURE__ */ new Set(["id", "type", "meta", "data", "source", "state", "compute"]);
|
|
327
|
+
function validateNode(node) {
|
|
328
|
+
const errors = [];
|
|
329
|
+
if (!node || typeof node !== "object" || Array.isArray(node)) {
|
|
330
|
+
return { ok: false, errors: ["Node must be a non-null object"] };
|
|
331
|
+
}
|
|
332
|
+
const n = node;
|
|
333
|
+
if (typeof n.id !== "string" || !n.id) {
|
|
334
|
+
errors.push("id: required, must be a non-empty string");
|
|
335
|
+
}
|
|
336
|
+
if (n.type !== "card" && n.type !== "source") {
|
|
337
|
+
errors.push('type: must be "card" or "source"');
|
|
338
|
+
return { ok: false, errors };
|
|
339
|
+
}
|
|
340
|
+
const allowed = n.type === "card" ? CARD_ALLOWED_KEYS : SOURCE_ALLOWED_KEYS;
|
|
341
|
+
for (const key of Object.keys(n)) {
|
|
342
|
+
if (!allowed.has(key)) errors.push(`Unknown top-level key: "${key}"`);
|
|
343
|
+
}
|
|
344
|
+
if (n.state == null || typeof n.state !== "object" || Array.isArray(n.state)) {
|
|
345
|
+
errors.push("state: required, must be an object");
|
|
346
|
+
} else {
|
|
347
|
+
const state = n.state;
|
|
348
|
+
if (state.status != null && !VALID_STATUSES.has(state.status)) {
|
|
349
|
+
errors.push(`state.status: must be one of: ${[...VALID_STATUSES].join(", ")}`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
if (n.meta != null) {
|
|
353
|
+
if (typeof n.meta !== "object" || Array.isArray(n.meta)) {
|
|
354
|
+
errors.push("meta: must be an object");
|
|
355
|
+
} else {
|
|
356
|
+
const meta = n.meta;
|
|
357
|
+
if (meta.title != null && typeof meta.title !== "string") errors.push("meta.title: must be a string");
|
|
358
|
+
if (meta.tags != null && !Array.isArray(meta.tags)) errors.push("meta.tags: must be an array");
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (n.data != null) {
|
|
362
|
+
if (typeof n.data !== "object" || Array.isArray(n.data)) {
|
|
363
|
+
errors.push("data: must be an object");
|
|
364
|
+
} else {
|
|
365
|
+
const data = n.data;
|
|
366
|
+
if (data.requires != null && !Array.isArray(data.requires)) errors.push("data.requires: must be an array of strings");
|
|
367
|
+
if (data.provides != null && (typeof data.provides !== "object" || Array.isArray(data.provides))) errors.push("data.provides: must be an object");
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
if (n.compute != null) {
|
|
371
|
+
if (typeof n.compute !== "object" || Array.isArray(n.compute)) {
|
|
372
|
+
errors.push("compute: must be an object");
|
|
373
|
+
} else {
|
|
374
|
+
for (const [key, expr] of Object.entries(n.compute)) {
|
|
375
|
+
if (!expr || typeof expr !== "object" || Array.isArray(expr)) {
|
|
376
|
+
errors.push(`compute.${key}: must be a compute expression object`);
|
|
377
|
+
} else if (!expr.fn) {
|
|
378
|
+
errors.push(`compute.${key}: missing required "fn" property`);
|
|
379
|
+
} else {
|
|
380
|
+
const fn = expr.fn;
|
|
381
|
+
if (!_fns[fn] && !_customFns[fn]) {
|
|
382
|
+
errors.push(`compute.${key}: unknown function "${fn}"`);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (n.type === "card") {
|
|
389
|
+
if (n.source != null) errors.push('Card nodes must not have "source" \u2014 use type "source" instead');
|
|
390
|
+
if (n.view == null || typeof n.view !== "object" || Array.isArray(n.view)) {
|
|
391
|
+
errors.push("view: required for card nodes, must be an object");
|
|
392
|
+
} else {
|
|
393
|
+
const view = n.view;
|
|
394
|
+
if (!Array.isArray(view.elements) || view.elements.length === 0) {
|
|
395
|
+
errors.push("view.elements: required, must be a non-empty array");
|
|
396
|
+
} else {
|
|
397
|
+
view.elements.forEach((elem, i) => {
|
|
398
|
+
if (!elem || typeof elem !== "object") {
|
|
399
|
+
errors.push(`view.elements[${i}]: must be an object`);
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
if (!elem.kind || typeof elem.kind !== "string") {
|
|
403
|
+
errors.push(`view.elements[${i}].kind: required, must be a string`);
|
|
404
|
+
} else if (!VALID_ELEMENT_KINDS.has(elem.kind)) {
|
|
405
|
+
errors.push(`view.elements[${i}].kind: unknown kind "${elem.kind}". Valid: ${[...VALID_ELEMENT_KINDS].join(", ")}`);
|
|
406
|
+
}
|
|
407
|
+
if (elem.data != null && (typeof elem.data !== "object" || Array.isArray(elem.data))) {
|
|
408
|
+
errors.push(`view.elements[${i}].data: must be an object`);
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
if (view.layout != null && (typeof view.layout !== "object" || Array.isArray(view.layout))) {
|
|
413
|
+
errors.push("view.layout: must be an object");
|
|
414
|
+
}
|
|
415
|
+
if (view.features != null && (typeof view.features !== "object" || Array.isArray(view.features))) {
|
|
416
|
+
errors.push("view.features: must be an object");
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
if (n.type === "source") {
|
|
421
|
+
if (n.view != null) errors.push('Source nodes must not have "view" \u2014 use type "card" instead');
|
|
422
|
+
if (n.source == null || typeof n.source !== "object" || Array.isArray(n.source)) {
|
|
423
|
+
errors.push("source: required for source nodes, must be an object");
|
|
424
|
+
} else {
|
|
425
|
+
const src = n.source;
|
|
426
|
+
if (!src.kind || !VALID_SOURCE_KINDS.has(src.kind)) {
|
|
427
|
+
errors.push(`source.kind: required, must be one of: ${[...VALID_SOURCE_KINDS].join(", ")}`);
|
|
428
|
+
}
|
|
429
|
+
if (typeof src.bindTo !== "string" || !src.bindTo) {
|
|
430
|
+
errors.push("source.bindTo: required, must be a state path string");
|
|
431
|
+
} else if (!src.bindTo.startsWith("state.")) {
|
|
432
|
+
errors.push('source.bindTo: must start with "state."');
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
return { ok: errors.length === 0, errors };
|
|
437
|
+
}
|
|
307
438
|
var CardCompute = {
|
|
308
439
|
run,
|
|
309
440
|
eval: evalExpr,
|
|
310
441
|
resolve,
|
|
442
|
+
validate: validateNode,
|
|
311
443
|
registerFunction,
|
|
312
444
|
get functions() {
|
|
313
445
|
const all = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/card-compute/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * card-compute — Pure JSON expression evaluator for node-based cards.\n *\n * Isomorphic: works in browser, Node.js, and bundlers.\n * No DOM dependency. No eval(). Pure declarative JSON expressions.\n *\n * @example\n * ```typescript\n * import { CardCompute } from 'yaml-flow/card-compute';\n *\n * const node = {\n * id: 'sales',\n * state: { data: [{ revenue: 100 }, { revenue: 200 }] },\n * compute: {\n * total: { fn: 'sum', input: 'state.data', field: 'revenue' },\n * avg: { fn: 'avg', input: 'state.data', field: 'revenue' },\n * },\n * };\n * CardCompute.run(node);\n * // node.state.total === 300\n * // node.state.avg === 150\n * ```\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A compute expression — pure JSON, arbitrarily nestable. */\nexport interface ComputeExpr {\n fn: string;\n input?: string | number | boolean | ComputeExpr | (string | number | boolean | ComputeExpr)[];\n field?: string;\n where?: ComputeExpr;\n apply?: ComputeExpr;\n cond?: ComputeExpr;\n then?: unknown;\n else?: unknown;\n format?: string;\n decimals?: number;\n separator?: string;\n direction?: 'asc' | 'desc';\n start?: number;\n end?: number;\n depth?: number;\n path?: string;\n value?: unknown;\n [key: string]: unknown;\n}\n\n/** Minimal node shape expected by CardCompute. */\nexport interface ComputeNode {\n id?: string;\n state?: Record<string, unknown>;\n compute?: Record<string, ComputeExpr>;\n [key: string]: unknown;\n}\n\n/** Internal evaluator signature passed to compute functions. */\nexport type EvalFn = (expr: unknown, node: ComputeNode) => unknown;\n\n/** A compute function implementation. */\nexport type ComputeFn = (input: unknown, evalFn: EvalFn, opts: ComputeExpr) => unknown;\n\n// ---------------------------------------------------------------------------\n// Deep path utilities\n// ---------------------------------------------------------------------------\n\nfunction deepGet(obj: unknown, path: string): unknown {\n if (!path || !obj) return undefined;\n const parts = path.split('.');\n let cur: unknown = obj;\n for (let i = 0; i < parts.length; i++) {\n if (cur == null) return undefined;\n cur = (cur as Record<string, unknown>)[parts[i]];\n }\n return cur;\n}\n\nfunction deepSet(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let cur: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n if (cur[parts[i]] == null || typeof cur[parts[i]] !== 'object') cur[parts[i]] = {};\n cur = cur[parts[i]] as Record<string, unknown>;\n }\n cur[parts[parts.length - 1]] = value;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in functions (53)\n// ---------------------------------------------------------------------------\n\nconst _fns: Record<string, ComputeFn> = {};\n\n// ---- Aggregates ----\n\n_fns.sum = (input, _e, opts) => {\n const a = Array.isArray(input) ? input : [];\n return opts.field\n ? a.reduce((s, r) => s + (Number(r[opts.field!]) || 0), 0)\n : a.reduce((s, v) => s + (Number(v) || 0), 0);\n};\n\n_fns.avg = (input, _e, opts) => {\n const s = _fns.sum(input, _e, opts) as number;\n const n = Array.isArray(input) ? input.length : 1;\n return n ? s / n : 0;\n};\n\n_fns.min = (input, _e, opts) => {\n const a = Array.isArray(input) ? input : [];\n const vals = opts.field ? a.map(r => Number(r[opts.field!])) : a.map(Number);\n return vals.length ? Math.min(...vals) : 0;\n};\n\n_fns.max = (input, _e, opts) => {\n const a = Array.isArray(input) ? input : [];\n const vals = opts.field ? a.map(r => Number(r[opts.field!])) : a.map(Number);\n return vals.length ? Math.max(...vals) : 0;\n};\n\n_fns.count = (input) => Array.isArray(input) ? input.length : (input != null ? 1 : 0);\n_fns.first = (input) => Array.isArray(input) ? input[0] : input;\n_fns.last = (input) => Array.isArray(input) ? input[input.length - 1] : input;\n\n// ---- Math ----\n\n_fns.add = (input) => { const a = Array.isArray(input) ? input : []; return a.reduce((s, v) => s + Number(v), 0); };\n_fns.sub = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 ? Number(a[0]) - Number(a[1]) : 0; };\n_fns.mul = (input) => { const a = Array.isArray(input) ? input : []; return a.reduce((s, v) => s * Number(v), 1); };\n_fns.div = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 && Number(a[1]) !== 0 ? Number(a[0]) / Number(a[1]) : 0; };\n\n_fns.round = (input, _e, opts) => {\n const decimals = opts.decimals != null ? (opts.decimals as number) : 0;\n const factor = Math.pow(10, decimals);\n return Math.round(Number(input) * factor) / factor;\n};\n\n_fns.abs = (input) => Math.abs(Number(input));\n_fns.mod = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 ? Number(a[0]) % Number(a[1]) : 0; };\n\n// ---- Compare ----\n\n_fns.gt = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 && Number(a[0]) > Number(a[1]); };\n_fns.gte = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 && Number(a[0]) >= Number(a[1]); };\n_fns.lt = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 && Number(a[0]) < Number(a[1]); };\n_fns.lte = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 && Number(a[0]) <= Number(a[1]); };\n_fns.eq = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 && a[0] === a[1]; };\n_fns.neq = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 && a[0] !== a[1]; };\n\n// ---- Logic ----\n\n_fns.and = (input) => { const a = Array.isArray(input) ? input : []; return a.every(Boolean); };\n_fns.or = (input) => { const a = Array.isArray(input) ? input : []; return a.some(Boolean); };\n_fns.not = (input) => !input;\n// \"if\" is handled in evalExpr\n\n// ---- String ----\n\n_fns.concat = (input) => {\n const a = Array.isArray(input) ? input : [];\n return a.map(v => v != null ? String(v) : '').join('');\n};\n\n_fns.upper = (input) => String(input || '').toUpperCase();\n_fns.lower = (input) => String(input || '').toLowerCase();\n\n_fns.template = (input, _e, opts) => {\n let t = String(opts.format || '');\n if (input && typeof input === 'object' && !Array.isArray(input)) {\n for (const k of Object.keys(input as Record<string, unknown>)) {\n const v = (input as Record<string, unknown>)[k];\n t = t.split('{{' + k + '}}').join(v != null ? String(v) : '');\n }\n }\n return t;\n};\n\n_fns.join = (input, _e, opts) => {\n const a = Array.isArray(input) ? input : [];\n const sep = opts.separator != null ? String(opts.separator) : ', ';\n return a.map(v => v != null ? String(v) : '').join(sep);\n};\n\n_fns.split = (input, _e, opts) => {\n const sep = opts.separator != null ? String(opts.separator) : ',';\n return String(input || '').split(sep).map(s => s.trim());\n};\n\n_fns.trim = (input) => String(input || '').trim();\n\n// ---- Collection ----\n\n_fns.pluck = (input, _e, opts) => Array.isArray(input) ? input.map(r => r[opts.field!]) : [];\n\n_fns.filter = (input, _e, opts) => {\n if (!Array.isArray(input)) return [];\n if (opts.field) return input.filter(r => !!r[opts.field!]);\n return input.filter(Boolean);\n};\n\n_fns.map = (input) => Array.isArray(input) ? input.slice() : [];\n\n_fns.sort = (input, _e, opts) => {\n const a = Array.isArray(input) ? input.slice() : [];\n const f = opts.field;\n const dir = opts.direction === 'desc' ? -1 : 1;\n if (f) return a.sort((x, y) => x[f] > y[f] ? dir : x[f] < y[f] ? -dir : 0);\n return a.sort((x, y) => x > y ? dir : x < y ? -dir : 0);\n};\n\n_fns.slice = (input, _e, opts) => Array.isArray(input) ? input.slice(opts.start || 0, opts.end as number | undefined) : input;\n_fns.flat = (input, _e, opts) => {\n const depth = opts.depth != null ? (opts.depth as number) : 1;\n return Array.isArray(input) ? input.flat(depth) : [input];\n};\n\n_fns.unique = (input) => {\n if (!Array.isArray(input)) return [input];\n const seen = new Set<unknown>();\n return input.filter(v => {\n const key = typeof v === 'object' ? JSON.stringify(v) : v;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n};\n\n_fns.group = (input, _e, opts) => {\n const a = Array.isArray(input) ? input : [];\n const g: Record<string, unknown[]> = {};\n a.forEach(r => { const k = String(r[opts.field!] || ''); if (!g[k]) g[k] = []; g[k].push(r); });\n return g;\n};\n\n_fns.flatten_keys = (input) => {\n if (!input || typeof input !== 'object' || Array.isArray(input)) return [];\n const result: { key: string; value: unknown }[] = [];\n for (const k of Object.keys(input as Record<string, unknown>)) {\n const vals = Array.isArray((input as Record<string, unknown>)[k])\n ? (input as Record<string, unknown>)[k] as unknown[]\n : [(input as Record<string, unknown>)[k]];\n vals.forEach(v => result.push({ key: k, value: v }));\n }\n return result;\n};\n\n_fns.entries = (input) => {\n if (!input || typeof input !== 'object' || Array.isArray(input)) return [];\n return Object.keys(input as Record<string, unknown>).map(k => ({ key: k, value: (input as Record<string, unknown>)[k] }));\n};\n\n_fns.from_entries = (input) => {\n if (!Array.isArray(input)) return {};\n const obj: Record<string, unknown> = {};\n input.forEach(item => { if (item.key != null) obj[item.key] = item.value; });\n return obj;\n};\n\n_fns.length = (input) => {\n if (Array.isArray(input)) return input.length;\n if (typeof input === 'string') return input.length;\n if (input && typeof input === 'object') return Object.keys(input).length;\n return 0;\n};\n\n// ---- Lookup ----\n\n_fns.get = (input, _e, opts) => deepGet(input, opts.field || opts.path || '');\n_fns.default = (input, _e, opts) => input != null ? input : opts.value;\n_fns.coalesce = (input) => {\n const a = Array.isArray(input) ? input : [];\n for (let i = 0; i < a.length; i++) { if (a[i] != null) return a[i]; }\n return null;\n};\n\n// ---- Date ----\n\n_fns.now = () => new Date().toISOString();\n_fns.diff_days = (input) => {\n const a = Array.isArray(input) ? input : [];\n return a.length >= 2 ? Math.floor((new Date(a[0]).getTime() - new Date(a[1]).getTime()) / 86400000) : 0;\n};\n\n_fns.format_date = (input, _e, opts) => {\n try {\n const d = new Date(input as string);\n if (opts.format === 'iso') return d.toISOString();\n if (opts.format === 'date') return d.toLocaleDateString();\n if (opts.format === 'time') return d.toLocaleTimeString();\n return d.toLocaleDateString();\n } catch { return String(input); }\n};\n\n_fns.parse_date = (input) => {\n try { return new Date(input as string).toISOString(); } catch { return null; }\n};\n\n// ---- Type ----\n\n_fns.to_number = (input) => Number(input) || 0;\n_fns.to_string = (input) => input != null ? String(input) : '';\n_fns.to_bool = (input) => !!input;\n_fns.type_of = (input) => Array.isArray(input) ? 'array' : typeof input;\n_fns.is_null = (input) => input == null;\n_fns.is_empty = (input) => {\n if (input == null) return true;\n if (Array.isArray(input)) return input.length === 0;\n if (typeof input === 'string') return input.length === 0;\n if (typeof input === 'object') return Object.keys(input).length === 0;\n return false;\n};\n\n// ---------------------------------------------------------------------------\n// Custom function registry\n// ---------------------------------------------------------------------------\n\nconst _customFns: Record<string, ComputeFn> = {};\n\n// ---------------------------------------------------------------------------\n// Expression evaluator\n// ---------------------------------------------------------------------------\n\nfunction evalExpr(expr: unknown, node: ComputeNode): unknown {\n if (expr == null) return expr;\n if (typeof expr !== 'object' || Array.isArray(expr)) return expr;\n\n const e = expr as ComputeExpr;\n if (!e.fn) return expr;\n\n // Resolve input\n let input: unknown = e.input;\n if (typeof input === 'string' && input.startsWith('state.')) {\n input = deepGet(node, input);\n } else if (Array.isArray(input)) {\n input = input.map(v => {\n if (typeof v === 'string' && (v as string).startsWith('state.')) return deepGet(node, v as string);\n if (v && typeof v === 'object' && (v as ComputeExpr).fn) return evalExpr(v, node);\n return v;\n });\n } else if (input && typeof input === 'object' && (input as ComputeExpr).fn) {\n input = evalExpr(input, node);\n }\n\n // Special: if\n if (e.fn === 'if') {\n const cond = evalExpr(e.cond, node);\n if (cond) {\n return (e.then && typeof e.then === 'object' && (e.then as ComputeExpr).fn) ? evalExpr(e.then, node) : e.then;\n } else {\n return (e.else && typeof e.else === 'object' && (e.else as ComputeExpr).fn) ? evalExpr(e.else, node) : e.else;\n }\n }\n\n // Special: filter with where\n if (e.fn === 'filter' && Array.isArray(input) && e.where) {\n return (input as unknown[]).filter(item => {\n const tmp: ComputeNode = { state: { ...node.state, $: item } };\n return evalExpr(e.where, tmp);\n });\n }\n\n // Special: map with apply\n if (e.fn === 'map' && Array.isArray(input) && e.apply) {\n return (input as unknown[]).map(item => {\n const tmp: ComputeNode = { state: { ...node.state, $: item } };\n return evalExpr(e.apply as ComputeExpr, tmp);\n });\n }\n\n const fn = _customFns[e.fn] || _fns[e.fn];\n if (!fn) {\n console.warn('CardCompute: unknown function \"' + e.fn + '\"');\n return undefined;\n }\n\n return fn(input, evalExpr, e);\n}\n\n// ---------------------------------------------------------------------------\n// run — evaluate all node.compute declarations\n// ---------------------------------------------------------------------------\n\nfunction run(node: ComputeNode): ComputeNode {\n if (!node || !node.compute) return node;\n if (!node.state) node.state = {};\n\n for (const key of Object.keys(node.compute)) {\n try {\n const val = evalExpr(node.compute[key], node);\n deepSet(node.state, key, val);\n } catch (err) {\n console.error(`CardCompute.run error on \"${node.id || '?'}.${key}\":`, err);\n }\n }\n\n return node;\n}\n\n// ---------------------------------------------------------------------------\n// resolve — deep get from node\n// ---------------------------------------------------------------------------\n\nfunction resolve(node: ComputeNode, path: string): unknown {\n return deepGet(node, path);\n}\n\n// ---------------------------------------------------------------------------\n// registerFunction — extend the vocabulary\n// ---------------------------------------------------------------------------\n\nfunction registerFunction(name: string, fn: ComputeFn): void {\n _customFns[name] = fn;\n}\n\n// ---------------------------------------------------------------------------\n// Export\n// ---------------------------------------------------------------------------\n\nexport const CardCompute = {\n run,\n eval: evalExpr,\n resolve,\n registerFunction,\n get functions(): Record<string, ComputeFn> {\n const all: Record<string, ComputeFn> = {};\n for (const k of Object.keys(_fns)) all[k] = _fns[k];\n for (const k of Object.keys(_customFns)) all[k] = _customFns[k];\n return all;\n },\n};\n\nexport default CardCompute;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/card-compute/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * card-compute — Pure JSON expression evaluator for node-based cards.\n *\n * Isomorphic: works in browser, Node.js, and bundlers.\n * No DOM dependency. No eval(). Pure declarative JSON expressions.\n *\n * @example\n * ```typescript\n * import { CardCompute } from 'yaml-flow/card-compute';\n *\n * const node = {\n * id: 'sales',\n * state: { data: [{ revenue: 100 }, { revenue: 200 }] },\n * compute: {\n * total: { fn: 'sum', input: 'state.data', field: 'revenue' },\n * avg: { fn: 'avg', input: 'state.data', field: 'revenue' },\n * },\n * };\n * CardCompute.run(node);\n * // node.state.total === 300\n * // node.state.avg === 150\n * ```\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A compute expression — pure JSON, arbitrarily nestable. */\nexport interface ComputeExpr {\n fn: string;\n input?: string | number | boolean | ComputeExpr | (string | number | boolean | ComputeExpr)[];\n field?: string;\n where?: ComputeExpr;\n apply?: ComputeExpr;\n cond?: ComputeExpr;\n then?: unknown;\n else?: unknown;\n format?: string;\n decimals?: number;\n separator?: string;\n direction?: 'asc' | 'desc';\n start?: number;\n end?: number;\n depth?: number;\n path?: string;\n value?: unknown;\n [key: string]: unknown;\n}\n\n/** Minimal node shape expected by CardCompute. */\nexport interface ComputeNode {\n id?: string;\n state?: Record<string, unknown>;\n compute?: Record<string, ComputeExpr>;\n [key: string]: unknown;\n}\n\n/** Internal evaluator signature passed to compute functions. */\nexport type EvalFn = (expr: unknown, node: ComputeNode) => unknown;\n\n/** A compute function implementation. */\nexport type ComputeFn = (input: unknown, evalFn: EvalFn, opts: ComputeExpr) => unknown;\n\n// ---------------------------------------------------------------------------\n// Deep path utilities\n// ---------------------------------------------------------------------------\n\nfunction deepGet(obj: unknown, path: string): unknown {\n if (!path || !obj) return undefined;\n const parts = path.split('.');\n let cur: unknown = obj;\n for (let i = 0; i < parts.length; i++) {\n if (cur == null) return undefined;\n cur = (cur as Record<string, unknown>)[parts[i]];\n }\n return cur;\n}\n\nfunction deepSet(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let cur: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n if (cur[parts[i]] == null || typeof cur[parts[i]] !== 'object') cur[parts[i]] = {};\n cur = cur[parts[i]] as Record<string, unknown>;\n }\n cur[parts[parts.length - 1]] = value;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in functions (53)\n// ---------------------------------------------------------------------------\n\nconst _fns: Record<string, ComputeFn> = {};\n\n// ---- Aggregates ----\n\n_fns.sum = (input, _e, opts) => {\n const a = Array.isArray(input) ? input : [];\n return opts.field\n ? a.reduce((s, r) => s + (Number(r[opts.field!]) || 0), 0)\n : a.reduce((s, v) => s + (Number(v) || 0), 0);\n};\n\n_fns.avg = (input, _e, opts) => {\n const s = _fns.sum(input, _e, opts) as number;\n const n = Array.isArray(input) ? input.length : 1;\n return n ? s / n : 0;\n};\n\n_fns.min = (input, _e, opts) => {\n const a = Array.isArray(input) ? input : [];\n const vals = opts.field ? a.map(r => Number(r[opts.field!])) : a.map(Number);\n return vals.length ? Math.min(...vals) : 0;\n};\n\n_fns.max = (input, _e, opts) => {\n const a = Array.isArray(input) ? input : [];\n const vals = opts.field ? a.map(r => Number(r[opts.field!])) : a.map(Number);\n return vals.length ? Math.max(...vals) : 0;\n};\n\n_fns.count = (input) => Array.isArray(input) ? input.length : (input != null ? 1 : 0);\n_fns.first = (input) => Array.isArray(input) ? input[0] : input;\n_fns.last = (input) => Array.isArray(input) ? input[input.length - 1] : input;\n\n// ---- Math ----\n\n_fns.add = (input) => { const a = Array.isArray(input) ? input : []; return a.reduce((s, v) => s + Number(v), 0); };\n_fns.sub = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 ? Number(a[0]) - Number(a[1]) : 0; };\n_fns.mul = (input) => { const a = Array.isArray(input) ? input : []; return a.reduce((s, v) => s * Number(v), 1); };\n_fns.div = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 && Number(a[1]) !== 0 ? Number(a[0]) / Number(a[1]) : 0; };\n\n_fns.round = (input, _e, opts) => {\n const decimals = opts.decimals != null ? (opts.decimals as number) : 0;\n const factor = Math.pow(10, decimals);\n return Math.round(Number(input) * factor) / factor;\n};\n\n_fns.abs = (input) => Math.abs(Number(input));\n_fns.mod = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 ? Number(a[0]) % Number(a[1]) : 0; };\n\n// ---- Compare ----\n\n_fns.gt = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 && Number(a[0]) > Number(a[1]); };\n_fns.gte = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 && Number(a[0]) >= Number(a[1]); };\n_fns.lt = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 && Number(a[0]) < Number(a[1]); };\n_fns.lte = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 && Number(a[0]) <= Number(a[1]); };\n_fns.eq = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 && a[0] === a[1]; };\n_fns.neq = (input) => { const a = Array.isArray(input) ? input : []; return a.length >= 2 && a[0] !== a[1]; };\n\n// ---- Logic ----\n\n_fns.and = (input) => { const a = Array.isArray(input) ? input : []; return a.every(Boolean); };\n_fns.or = (input) => { const a = Array.isArray(input) ? input : []; return a.some(Boolean); };\n_fns.not = (input) => !input;\n// \"if\" is handled in evalExpr\n\n// ---- String ----\n\n_fns.concat = (input) => {\n const a = Array.isArray(input) ? input : [];\n return a.map(v => v != null ? String(v) : '').join('');\n};\n\n_fns.upper = (input) => String(input || '').toUpperCase();\n_fns.lower = (input) => String(input || '').toLowerCase();\n\n_fns.template = (input, _e, opts) => {\n let t = String(opts.format || '');\n if (input && typeof input === 'object' && !Array.isArray(input)) {\n for (const k of Object.keys(input as Record<string, unknown>)) {\n const v = (input as Record<string, unknown>)[k];\n t = t.split('{{' + k + '}}').join(v != null ? String(v) : '');\n }\n }\n return t;\n};\n\n_fns.join = (input, _e, opts) => {\n const a = Array.isArray(input) ? input : [];\n const sep = opts.separator != null ? String(opts.separator) : ', ';\n return a.map(v => v != null ? String(v) : '').join(sep);\n};\n\n_fns.split = (input, _e, opts) => {\n const sep = opts.separator != null ? String(opts.separator) : ',';\n return String(input || '').split(sep).map(s => s.trim());\n};\n\n_fns.trim = (input) => String(input || '').trim();\n\n// ---- Collection ----\n\n_fns.pluck = (input, _e, opts) => Array.isArray(input) ? input.map(r => r[opts.field!]) : [];\n\n_fns.filter = (input, _e, opts) => {\n if (!Array.isArray(input)) return [];\n if (opts.field) return input.filter(r => !!r[opts.field!]);\n return input.filter(Boolean);\n};\n\n_fns.map = (input) => Array.isArray(input) ? input.slice() : [];\n\n_fns.sort = (input, _e, opts) => {\n const a = Array.isArray(input) ? input.slice() : [];\n const f = opts.field;\n const dir = opts.direction === 'desc' ? -1 : 1;\n if (f) return a.sort((x, y) => x[f] > y[f] ? dir : x[f] < y[f] ? -dir : 0);\n return a.sort((x, y) => x > y ? dir : x < y ? -dir : 0);\n};\n\n_fns.slice = (input, _e, opts) => Array.isArray(input) ? input.slice(opts.start || 0, opts.end as number | undefined) : input;\n_fns.flat = (input, _e, opts) => {\n const depth = opts.depth != null ? (opts.depth as number) : 1;\n return Array.isArray(input) ? input.flat(depth) : [input];\n};\n\n_fns.unique = (input) => {\n if (!Array.isArray(input)) return [input];\n const seen = new Set<unknown>();\n return input.filter(v => {\n const key = typeof v === 'object' ? JSON.stringify(v) : v;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n};\n\n_fns.group = (input, _e, opts) => {\n const a = Array.isArray(input) ? input : [];\n const g: Record<string, unknown[]> = {};\n a.forEach(r => { const k = String(r[opts.field!] || ''); if (!g[k]) g[k] = []; g[k].push(r); });\n return g;\n};\n\n_fns.flatten_keys = (input) => {\n if (!input || typeof input !== 'object' || Array.isArray(input)) return [];\n const result: { key: string; value: unknown }[] = [];\n for (const k of Object.keys(input as Record<string, unknown>)) {\n const vals = Array.isArray((input as Record<string, unknown>)[k])\n ? (input as Record<string, unknown>)[k] as unknown[]\n : [(input as Record<string, unknown>)[k]];\n vals.forEach(v => result.push({ key: k, value: v }));\n }\n return result;\n};\n\n_fns.entries = (input) => {\n if (!input || typeof input !== 'object' || Array.isArray(input)) return [];\n return Object.keys(input as Record<string, unknown>).map(k => ({ key: k, value: (input as Record<string, unknown>)[k] }));\n};\n\n_fns.from_entries = (input) => {\n if (!Array.isArray(input)) return {};\n const obj: Record<string, unknown> = {};\n input.forEach(item => { if (item.key != null) obj[item.key] = item.value; });\n return obj;\n};\n\n_fns.length = (input) => {\n if (Array.isArray(input)) return input.length;\n if (typeof input === 'string') return input.length;\n if (input && typeof input === 'object') return Object.keys(input).length;\n return 0;\n};\n\n// ---- Lookup ----\n\n_fns.get = (input, _e, opts) => deepGet(input, opts.field || opts.path || '');\n_fns.default = (input, _e, opts) => input != null ? input : opts.value;\n_fns.coalesce = (input) => {\n const a = Array.isArray(input) ? input : [];\n for (let i = 0; i < a.length; i++) { if (a[i] != null) return a[i]; }\n return null;\n};\n\n// ---- Date ----\n\n_fns.now = () => new Date().toISOString();\n_fns.diff_days = (input) => {\n const a = Array.isArray(input) ? input : [];\n return a.length >= 2 ? Math.floor((new Date(a[0]).getTime() - new Date(a[1]).getTime()) / 86400000) : 0;\n};\n\n_fns.format_date = (input, _e, opts) => {\n try {\n const d = new Date(input as string);\n if (opts.format === 'iso') return d.toISOString();\n if (opts.format === 'date') return d.toLocaleDateString();\n if (opts.format === 'time') return d.toLocaleTimeString();\n return d.toLocaleDateString();\n } catch { return String(input); }\n};\n\n_fns.parse_date = (input) => {\n try { return new Date(input as string).toISOString(); } catch { return null; }\n};\n\n// ---- Type ----\n\n_fns.to_number = (input) => Number(input) || 0;\n_fns.to_string = (input) => input != null ? String(input) : '';\n_fns.to_bool = (input) => !!input;\n_fns.type_of = (input) => Array.isArray(input) ? 'array' : typeof input;\n_fns.is_null = (input) => input == null;\n_fns.is_empty = (input) => {\n if (input == null) return true;\n if (Array.isArray(input)) return input.length === 0;\n if (typeof input === 'string') return input.length === 0;\n if (typeof input === 'object') return Object.keys(input).length === 0;\n return false;\n};\n\n// ---------------------------------------------------------------------------\n// Custom function registry\n// ---------------------------------------------------------------------------\n\nconst _customFns: Record<string, ComputeFn> = {};\n\n// ---------------------------------------------------------------------------\n// Expression evaluator\n// ---------------------------------------------------------------------------\n\nfunction evalExpr(expr: unknown, node: ComputeNode): unknown {\n if (expr == null) return expr;\n if (typeof expr !== 'object' || Array.isArray(expr)) return expr;\n\n const e = expr as ComputeExpr;\n if (!e.fn) return expr;\n\n // Resolve input\n let input: unknown = e.input;\n if (typeof input === 'string' && input.startsWith('state.')) {\n input = deepGet(node, input);\n } else if (Array.isArray(input)) {\n input = input.map(v => {\n if (typeof v === 'string' && (v as string).startsWith('state.')) return deepGet(node, v as string);\n if (v && typeof v === 'object' && (v as ComputeExpr).fn) return evalExpr(v, node);\n return v;\n });\n } else if (input && typeof input === 'object' && (input as ComputeExpr).fn) {\n input = evalExpr(input, node);\n }\n\n // Special: if\n if (e.fn === 'if') {\n const cond = evalExpr(e.cond, node);\n if (cond) {\n return (e.then && typeof e.then === 'object' && (e.then as ComputeExpr).fn) ? evalExpr(e.then, node) : e.then;\n } else {\n return (e.else && typeof e.else === 'object' && (e.else as ComputeExpr).fn) ? evalExpr(e.else, node) : e.else;\n }\n }\n\n // Special: filter with where\n if (e.fn === 'filter' && Array.isArray(input) && e.where) {\n return (input as unknown[]).filter(item => {\n const tmp: ComputeNode = { state: { ...node.state, $: item } };\n return evalExpr(e.where, tmp);\n });\n }\n\n // Special: map with apply\n if (e.fn === 'map' && Array.isArray(input) && e.apply) {\n return (input as unknown[]).map(item => {\n const tmp: ComputeNode = { state: { ...node.state, $: item } };\n return evalExpr(e.apply as ComputeExpr, tmp);\n });\n }\n\n const fn = _customFns[e.fn] || _fns[e.fn];\n if (!fn) {\n console.warn('CardCompute: unknown function \"' + e.fn + '\"');\n return undefined;\n }\n\n return fn(input, evalExpr, e);\n}\n\n// ---------------------------------------------------------------------------\n// run — evaluate all node.compute declarations\n// ---------------------------------------------------------------------------\n\nfunction run(node: ComputeNode): ComputeNode {\n if (!node || !node.compute) return node;\n if (!node.state) node.state = {};\n\n for (const key of Object.keys(node.compute)) {\n try {\n const val = evalExpr(node.compute[key], node);\n deepSet(node.state, key, val);\n } catch (err) {\n console.error(`CardCompute.run error on \"${node.id || '?'}.${key}\":`, err);\n }\n }\n\n return node;\n}\n\n// ---------------------------------------------------------------------------\n// resolve — deep get from node\n// ---------------------------------------------------------------------------\n\nfunction resolve(node: ComputeNode, path: string): unknown {\n return deepGet(node, path);\n}\n\n// ---------------------------------------------------------------------------\n// registerFunction — extend the vocabulary\n// ---------------------------------------------------------------------------\n\nfunction registerFunction(name: string, fn: ComputeFn): void {\n _customFns[name] = fn;\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\n/** Result of validateNode — ok: true means valid, ok: false has errors[]. */\nexport interface ValidationResult {\n ok: boolean;\n errors: string[];\n}\n\nconst VALID_ELEMENT_KINDS = new Set([\n 'metric', 'table', 'chart', 'form', 'filter', 'list',\n 'notes', 'todo', 'alert', 'narrative', 'badge', 'text',\n 'markdown', 'custom',\n]);\n\nconst VALID_SOURCE_KINDS = new Set(['api', 'websocket', 'static', 'llm']);\nconst VALID_STATUSES = new Set(['fresh', 'stale', 'loading', 'error']);\n\nconst CARD_ALLOWED_KEYS = new Set(['id', 'type', 'meta', 'data', 'view', 'state', 'compute']);\nconst SOURCE_ALLOWED_KEYS = new Set(['id', 'type', 'meta', 'data', 'source', 'state', 'compute']);\n\n/**\n * Validate a node against the LiveCards schema.\n * Lightweight structural check — no external dependencies.\n *\n * @example\n * ```typescript\n * const result = CardCompute.validate(node);\n * if (!result.ok) console.error(result.errors);\n * ```\n */\nfunction validateNode(node: unknown): ValidationResult {\n const errors: string[] = [];\n\n if (!node || typeof node !== 'object' || Array.isArray(node)) {\n return { ok: false, errors: ['Node must be a non-null object'] };\n }\n\n const n = node as Record<string, unknown>;\n\n // id\n if (typeof n.id !== 'string' || !n.id) {\n errors.push('id: required, must be a non-empty string');\n }\n\n // type\n if (n.type !== 'card' && n.type !== 'source') {\n errors.push('type: must be \"card\" or \"source\"');\n return { ok: false, errors }; // Can't validate further without type\n }\n\n // Check for unknown top-level keys\n const allowed = n.type === 'card' ? CARD_ALLOWED_KEYS : SOURCE_ALLOWED_KEYS;\n for (const key of Object.keys(n)) {\n if (!allowed.has(key)) errors.push(`Unknown top-level key: \"${key}\"`);\n }\n\n // state (required)\n if (n.state == null || typeof n.state !== 'object' || Array.isArray(n.state)) {\n errors.push('state: required, must be an object');\n } else {\n const state = n.state as Record<string, unknown>;\n if (state.status != null && !VALID_STATUSES.has(state.status as string)) {\n errors.push(`state.status: must be one of: ${[...VALID_STATUSES].join(', ')}`);\n }\n }\n\n // meta (optional)\n if (n.meta != null) {\n if (typeof n.meta !== 'object' || Array.isArray(n.meta)) {\n errors.push('meta: must be an object');\n } else {\n const meta = n.meta as Record<string, unknown>;\n if (meta.title != null && typeof meta.title !== 'string') errors.push('meta.title: must be a string');\n if (meta.tags != null && !Array.isArray(meta.tags)) errors.push('meta.tags: must be an array');\n }\n }\n\n // data (optional)\n if (n.data != null) {\n if (typeof n.data !== 'object' || Array.isArray(n.data)) {\n errors.push('data: must be an object');\n } else {\n const data = n.data as Record<string, unknown>;\n if (data.requires != null && !Array.isArray(data.requires)) errors.push('data.requires: must be an array of strings');\n if (data.provides != null && (typeof data.provides !== 'object' || Array.isArray(data.provides))) errors.push('data.provides: must be an object');\n }\n }\n\n // compute (optional)\n if (n.compute != null) {\n if (typeof n.compute !== 'object' || Array.isArray(n.compute)) {\n errors.push('compute: must be an object');\n } else {\n for (const [key, expr] of Object.entries(n.compute as Record<string, unknown>)) {\n if (!expr || typeof expr !== 'object' || Array.isArray(expr)) {\n errors.push(`compute.${key}: must be a compute expression object`);\n } else if (!(expr as Record<string, unknown>).fn) {\n errors.push(`compute.${key}: missing required \"fn\" property`);\n } else {\n const fn = (expr as Record<string, unknown>).fn as string;\n if (!_fns[fn] && !_customFns[fn]) {\n errors.push(`compute.${key}: unknown function \"${fn}\"`);\n }\n }\n }\n }\n }\n\n // ---- Card-specific ----\n if (n.type === 'card') {\n if (n.source != null) errors.push('Card nodes must not have \"source\" — use type \"source\" instead');\n\n // view (required for cards)\n if (n.view == null || typeof n.view !== 'object' || Array.isArray(n.view)) {\n errors.push('view: required for card nodes, must be an object');\n } else {\n const view = n.view as Record<string, unknown>;\n\n // view.elements\n if (!Array.isArray(view.elements) || view.elements.length === 0) {\n errors.push('view.elements: required, must be a non-empty array');\n } else {\n (view.elements as Record<string, unknown>[]).forEach((elem, i) => {\n if (!elem || typeof elem !== 'object') {\n errors.push(`view.elements[${i}]: must be an object`);\n return;\n }\n if (!elem.kind || typeof elem.kind !== 'string') {\n errors.push(`view.elements[${i}].kind: required, must be a string`);\n } else if (!VALID_ELEMENT_KINDS.has(elem.kind as string)) {\n errors.push(`view.elements[${i}].kind: unknown kind \"${elem.kind}\". Valid: ${[...VALID_ELEMENT_KINDS].join(', ')}`);\n }\n if (elem.data != null && (typeof elem.data !== 'object' || Array.isArray(elem.data))) {\n errors.push(`view.elements[${i}].data: must be an object`);\n }\n });\n }\n\n // view.layout (optional)\n if (view.layout != null && (typeof view.layout !== 'object' || Array.isArray(view.layout))) {\n errors.push('view.layout: must be an object');\n }\n\n // view.features (optional)\n if (view.features != null && (typeof view.features !== 'object' || Array.isArray(view.features))) {\n errors.push('view.features: must be an object');\n }\n }\n }\n\n // ---- Source-specific ----\n if (n.type === 'source') {\n if (n.view != null) errors.push('Source nodes must not have \"view\" — use type \"card\" instead');\n\n // source (required for source nodes)\n if (n.source == null || typeof n.source !== 'object' || Array.isArray(n.source)) {\n errors.push('source: required for source nodes, must be an object');\n } else {\n const src = n.source as Record<string, unknown>;\n if (!src.kind || !VALID_SOURCE_KINDS.has(src.kind as string)) {\n errors.push(`source.kind: required, must be one of: ${[...VALID_SOURCE_KINDS].join(', ')}`);\n }\n if (typeof src.bindTo !== 'string' || !src.bindTo) {\n errors.push('source.bindTo: required, must be a state path string');\n } else if (!(src.bindTo as string).startsWith('state.')) {\n errors.push('source.bindTo: must start with \"state.\"');\n }\n }\n }\n\n return { ok: errors.length === 0, errors };\n}\n\nexport const CardCompute = {\n run,\n eval: evalExpr,\n resolve,\n validate: validateNode,\n registerFunction,\n get functions(): Record<string, ComputeFn> {\n const all: Record<string, ComputeFn> = {};\n for (const k of Object.keys(_fns)) all[k] = _fns[k];\n for (const k of Object.keys(_customFns)) all[k] = _customFns[k];\n return all;\n },\n};\n\nexport default CardCompute;\n"]}
|
|
@@ -57,12 +57,29 @@ declare function evalExpr(expr: unknown, node: ComputeNode): unknown;
|
|
|
57
57
|
declare function run(node: ComputeNode): ComputeNode;
|
|
58
58
|
declare function resolve(node: ComputeNode, path: string): unknown;
|
|
59
59
|
declare function registerFunction(name: string, fn: ComputeFn): void;
|
|
60
|
+
/** Result of validateNode — ok: true means valid, ok: false has errors[]. */
|
|
61
|
+
interface ValidationResult {
|
|
62
|
+
ok: boolean;
|
|
63
|
+
errors: string[];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Validate a node against the LiveCards schema.
|
|
67
|
+
* Lightweight structural check — no external dependencies.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const result = CardCompute.validate(node);
|
|
72
|
+
* if (!result.ok) console.error(result.errors);
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
declare function validateNode(node: unknown): ValidationResult;
|
|
60
76
|
declare const CardCompute: {
|
|
61
77
|
run: typeof run;
|
|
62
78
|
eval: typeof evalExpr;
|
|
63
79
|
resolve: typeof resolve;
|
|
80
|
+
validate: typeof validateNode;
|
|
64
81
|
registerFunction: typeof registerFunction;
|
|
65
82
|
readonly functions: Record<string, ComputeFn>;
|
|
66
83
|
};
|
|
67
84
|
|
|
68
|
-
export { CardCompute, type ComputeExpr, type ComputeFn, type ComputeNode, type EvalFn, CardCompute as default };
|
|
85
|
+
export { CardCompute, type ComputeExpr, type ComputeFn, type ComputeNode, type EvalFn, type ValidationResult, CardCompute as default };
|
|
@@ -57,12 +57,29 @@ declare function evalExpr(expr: unknown, node: ComputeNode): unknown;
|
|
|
57
57
|
declare function run(node: ComputeNode): ComputeNode;
|
|
58
58
|
declare function resolve(node: ComputeNode, path: string): unknown;
|
|
59
59
|
declare function registerFunction(name: string, fn: ComputeFn): void;
|
|
60
|
+
/** Result of validateNode — ok: true means valid, ok: false has errors[]. */
|
|
61
|
+
interface ValidationResult {
|
|
62
|
+
ok: boolean;
|
|
63
|
+
errors: string[];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Validate a node against the LiveCards schema.
|
|
67
|
+
* Lightweight structural check — no external dependencies.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const result = CardCompute.validate(node);
|
|
72
|
+
* if (!result.ok) console.error(result.errors);
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
declare function validateNode(node: unknown): ValidationResult;
|
|
60
76
|
declare const CardCompute: {
|
|
61
77
|
run: typeof run;
|
|
62
78
|
eval: typeof evalExpr;
|
|
63
79
|
resolve: typeof resolve;
|
|
80
|
+
validate: typeof validateNode;
|
|
64
81
|
registerFunction: typeof registerFunction;
|
|
65
82
|
readonly functions: Record<string, ComputeFn>;
|
|
66
83
|
};
|
|
67
84
|
|
|
68
|
-
export { CardCompute, type ComputeExpr, type ComputeFn, type ComputeNode, type EvalFn, CardCompute as default };
|
|
85
|
+
export { CardCompute, type ComputeExpr, type ComputeFn, type ComputeNode, type EvalFn, type ValidationResult, CardCompute as default };
|