@almadar/ui 4.27.0 → 4.29.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.
@@ -50433,6 +50433,11 @@ function formatPayloadTooltip(fields) {
50433
50433
  );
50434
50434
  return `{ ${parts.join(", ")} }`;
50435
50435
  }
50436
+ function entityNameOf(ref) {
50437
+ if (!ref) return void 0;
50438
+ if (typeof ref === "string") return ref;
50439
+ return "name" in ref ? ref.name : void 0;
50440
+ }
50436
50441
  var ScreenSizeContext = React118.createContext("tablet");
50437
50442
  var PatternSelectionContext = React118.createContext({ selected: null, select: () => {
50438
50443
  } });
@@ -50473,19 +50478,116 @@ function buildOrbitalSchema(fullSchema, orbitalName) {
50473
50478
  if (!orbital) return fullSchema;
50474
50479
  return { ...fullSchema, name: `${fullSchema.name}__${orbitalName}`, orbitals: [orbital] };
50475
50480
  }
50476
- function buildTransitionSchema(fullSchema, orbitalName, traitName, transitionEvent, fromState, toState) {
50481
+ function generateMockPayload(payloadSchema, schema, linkedEntity, mockData) {
50482
+ const payload = {};
50483
+ if (!payloadSchema || payloadSchema.length === 0) return payload;
50484
+ const entityNames = /* @__PURE__ */ new Set();
50485
+ for (const orb of schema.orbitals ?? []) {
50486
+ const name = entityNameOf(orb.entity);
50487
+ if (name) entityNames.add(name);
50488
+ }
50489
+ const linkedRows = linkedEntity ? mockData?.[linkedEntity] ?? [] : [];
50490
+ const linkedFirstRow = linkedRows[0];
50491
+ const valueForType = (rawType, entityType) => {
50492
+ const type = rawType.replace(/!$/, "").trim();
50493
+ const arrayMatch = /^\[\s*(\w+)\s*\]$/.exec(type);
50494
+ if (arrayMatch) {
50495
+ return mockData?.[arrayMatch[1]] ?? linkedRows;
50496
+ }
50497
+ if (type === "array") return linkedRows;
50498
+ if (type === "entity") {
50499
+ const target = entityType && mockData?.[entityType] ? entityType : linkedEntity;
50500
+ return (target && mockData?.[target]?.[0]) ?? linkedFirstRow ?? {};
50501
+ }
50502
+ if (entityNames.has(type)) {
50503
+ return mockData?.[type]?.[0] ?? linkedFirstRow ?? {};
50504
+ }
50505
+ switch (type) {
50506
+ case "string":
50507
+ return "Sample";
50508
+ case "number":
50509
+ return 1;
50510
+ case "boolean":
50511
+ return false;
50512
+ case "object":
50513
+ return {};
50514
+ case "date":
50515
+ case "datetime":
50516
+ case "timestamp":
50517
+ return (/* @__PURE__ */ new Date()).toISOString();
50518
+ default:
50519
+ return void 0;
50520
+ }
50521
+ };
50522
+ const setByPath = (target, path, value) => {
50523
+ const parts = path.split(".");
50524
+ let cur = target;
50525
+ for (let i = 0; i < parts.length - 1; i++) {
50526
+ const k = parts[i];
50527
+ const next = cur[k];
50528
+ if (next === null || typeof next !== "object" || Array.isArray(next)) {
50529
+ cur[k] = {};
50530
+ }
50531
+ cur = cur[k];
50532
+ }
50533
+ cur[parts[parts.length - 1]] = value;
50534
+ };
50535
+ for (const field of payloadSchema) {
50536
+ let value = valueForType(field.type, field.entityType);
50537
+ if (linkedFirstRow !== void 0 && field.name.includes(".") && (typeof value === "string" || typeof value === "number" || typeof value === "boolean")) {
50538
+ const tail = field.name.split(".").pop();
50539
+ const fromRow = linkedFirstRow[tail];
50540
+ if (fromRow !== void 0) value = fromRow;
50541
+ }
50542
+ setByPath(payload, field.name, value);
50543
+ }
50544
+ return payload;
50545
+ }
50546
+ function substitutePayloadBindings(effects, payload) {
50547
+ const isPayloadObject = (v) => v !== null && typeof v === "object" && !Array.isArray(v) && !(v instanceof Date);
50548
+ const getByPath = (path) => {
50549
+ let cur = payload;
50550
+ for (const k of path.split(".")) {
50551
+ if (!isPayloadObject(cur)) return void 0;
50552
+ cur = cur[k];
50553
+ }
50554
+ return cur;
50555
+ };
50556
+ const replaceValue = (v) => {
50557
+ if (typeof v === "string" && v.startsWith("@payload.")) {
50558
+ const resolved = getByPath(v.slice("@payload.".length));
50559
+ return resolved === void 0 ? v : resolved;
50560
+ }
50561
+ if (Array.isArray(v)) return v.map(replaceValue);
50562
+ if (v && typeof v === "object" && !(v instanceof Date)) {
50563
+ const out = {};
50564
+ for (const [k, inner] of Object.entries(v)) {
50565
+ out[k] = replaceValue(inner);
50566
+ }
50567
+ return out;
50568
+ }
50569
+ return v;
50570
+ };
50571
+ const tree = JSON.parse(JSON.stringify(effects));
50572
+ const substituted = replaceValue(tree);
50573
+ return substituted;
50574
+ }
50575
+ function findEmitContract(trait, event) {
50576
+ return trait.emits?.find((e) => e.event === event);
50577
+ }
50578
+ function buildTransitionSchema(fullSchema, orbitalName, traitName, transitionEvent, fromState, toState, mockData) {
50477
50579
  const orbital = (fullSchema.orbitals ?? []).find((o) => o.name === orbitalName);
50478
50580
  if (!orbital) return fullSchema;
50479
50581
  const clonedOrbital = JSON.parse(JSON.stringify(orbital));
50480
50582
  const traits2 = clonedOrbital.traits ?? [];
50481
50583
  for (let ti = 0; ti < traits2.length; ti++) {
50482
50584
  const trait = traits2[ti];
50483
- if (typeof trait === "string" || !("stateMachine" in trait)) continue;
50585
+ if (!core.isInlineTrait(trait)) continue;
50484
50586
  const traitObj = trait;
50485
50587
  if (traitObj.name !== traitName) continue;
50486
50588
  const sm = traitObj.stateMachine;
50487
50589
  if (!sm) continue;
50488
- const allTransitions = sm.transitions;
50590
+ const allTransitions = sm.transitions ?? [];
50489
50591
  const targetTransition = fromState && toState ? allTransitions.find((t) => t.event === transitionEvent && t.from === fromState && t.to === toState) ?? allTransitions.find((t) => t.event === transitionEvent) : allTransitions.find((t) => t.event === transitionEvent);
50490
50592
  if (!targetTransition?.effects) continue;
50491
50593
  const renderUIEffects = [];
@@ -50495,14 +50597,22 @@ function buildTransitionSchema(fullSchema, orbitalName, traitName, transitionEve
50495
50597
  }
50496
50598
  }
50497
50599
  if (renderUIEffects.length === 0) continue;
50498
- const rewrittenSm = {
50600
+ const linkedEntity = traitObj.linkedEntity ?? entityNameOf(clonedOrbital.entity);
50601
+ const emitContract = findEmitContract(traitObj, transitionEvent);
50602
+ const mockPayload = generateMockPayload(
50603
+ emitContract?.payloadSchema,
50604
+ fullSchema,
50605
+ linkedEntity,
50606
+ mockData
50607
+ );
50608
+ const seededEffects = substitutePayloadBindings(renderUIEffects, mockPayload);
50609
+ traitObj.stateMachine = {
50499
50610
  states: [{ name: "preview", isInitial: true }],
50500
50611
  events: [{ key: "INIT", name: "INIT" }],
50501
- transitions: [{ from: "preview", to: "preview", event: "INIT", effects: renderUIEffects }]
50612
+ transitions: [{ from: "preview", to: "preview", event: "INIT", effects: seededEffects }]
50502
50613
  };
50503
- traits2[ti].stateMachine = rewrittenSm;
50504
- traits2[ti].emits = [];
50505
- traits2[ti].listens = [];
50614
+ traitObj.emits = [];
50615
+ traitObj.listens = [];
50506
50616
  break;
50507
50617
  }
50508
50618
  const targetTrait = traits2.find((t) => {
@@ -50568,11 +50678,12 @@ var OrbPreviewNodeInner = (props) => {
50568
50678
  data.traitName,
50569
50679
  data.transitionEvent,
50570
50680
  data.fromState,
50571
- data.toState
50681
+ data.toState,
50682
+ data._mockData
50572
50683
  );
50573
50684
  }
50574
50685
  return buildOrbitalSchema(fullSchema, data.orbitalName);
50575
- }, [data._fullSchema, data.orbitalName, data.traitName, data.transitionEvent, data.fromState, data.toState, isExpanded]);
50686
+ }, [data._fullSchema, data._mockData, data.orbitalName, data.traitName, data.transitionEvent, data.fromState, data.toState, isExpanded]);
50576
50687
  const handleContentClick = React118.useCallback((e) => {
50577
50688
  e.stopPropagation();
50578
50689
  const target = e.target;
package/dist/avl/index.js CHANGED
@@ -30,7 +30,7 @@ import langDiff from 'react-syntax-highlighter/dist/esm/languages/prism/diff.js'
30
30
  import langToml from 'react-syntax-highlighter/dist/esm/languages/prism/toml.js';
31
31
  import langGo from 'react-syntax-highlighter/dist/esm/languages/prism/go.js';
32
32
  import langGraphql from 'react-syntax-highlighter/dist/esm/languages/prism/graphql.js';
33
- import { FieldTypeSchema, isEntityCall, schemaToIR, getPage, isCircuitEvent, isInlineTrait } from '@almadar/core';
33
+ import { FieldTypeSchema, isInlineTrait, isEntityCall, schemaToIR, getPage, isCircuitEvent } from '@almadar/core';
34
34
  import { useThree, useFrame, Canvas } from '@react-three/fiber';
35
35
  import * as THREE6 from 'three';
36
36
  import { Vector3, QuadraticBezierCurve3, MathUtils, Quaternion } from 'three';
@@ -50387,6 +50387,11 @@ function formatPayloadTooltip(fields) {
50387
50387
  );
50388
50388
  return `{ ${parts.join(", ")} }`;
50389
50389
  }
50390
+ function entityNameOf(ref) {
50391
+ if (!ref) return void 0;
50392
+ if (typeof ref === "string") return ref;
50393
+ return "name" in ref ? ref.name : void 0;
50394
+ }
50390
50395
  var ScreenSizeContext = createContext("tablet");
50391
50396
  var PatternSelectionContext = createContext({ selected: null, select: () => {
50392
50397
  } });
@@ -50427,19 +50432,116 @@ function buildOrbitalSchema(fullSchema, orbitalName) {
50427
50432
  if (!orbital) return fullSchema;
50428
50433
  return { ...fullSchema, name: `${fullSchema.name}__${orbitalName}`, orbitals: [orbital] };
50429
50434
  }
50430
- function buildTransitionSchema(fullSchema, orbitalName, traitName, transitionEvent, fromState, toState) {
50435
+ function generateMockPayload(payloadSchema, schema, linkedEntity, mockData) {
50436
+ const payload = {};
50437
+ if (!payloadSchema || payloadSchema.length === 0) return payload;
50438
+ const entityNames = /* @__PURE__ */ new Set();
50439
+ for (const orb of schema.orbitals ?? []) {
50440
+ const name = entityNameOf(orb.entity);
50441
+ if (name) entityNames.add(name);
50442
+ }
50443
+ const linkedRows = linkedEntity ? mockData?.[linkedEntity] ?? [] : [];
50444
+ const linkedFirstRow = linkedRows[0];
50445
+ const valueForType = (rawType, entityType) => {
50446
+ const type = rawType.replace(/!$/, "").trim();
50447
+ const arrayMatch = /^\[\s*(\w+)\s*\]$/.exec(type);
50448
+ if (arrayMatch) {
50449
+ return mockData?.[arrayMatch[1]] ?? linkedRows;
50450
+ }
50451
+ if (type === "array") return linkedRows;
50452
+ if (type === "entity") {
50453
+ const target = entityType && mockData?.[entityType] ? entityType : linkedEntity;
50454
+ return (target && mockData?.[target]?.[0]) ?? linkedFirstRow ?? {};
50455
+ }
50456
+ if (entityNames.has(type)) {
50457
+ return mockData?.[type]?.[0] ?? linkedFirstRow ?? {};
50458
+ }
50459
+ switch (type) {
50460
+ case "string":
50461
+ return "Sample";
50462
+ case "number":
50463
+ return 1;
50464
+ case "boolean":
50465
+ return false;
50466
+ case "object":
50467
+ return {};
50468
+ case "date":
50469
+ case "datetime":
50470
+ case "timestamp":
50471
+ return (/* @__PURE__ */ new Date()).toISOString();
50472
+ default:
50473
+ return void 0;
50474
+ }
50475
+ };
50476
+ const setByPath = (target, path, value) => {
50477
+ const parts = path.split(".");
50478
+ let cur = target;
50479
+ for (let i = 0; i < parts.length - 1; i++) {
50480
+ const k = parts[i];
50481
+ const next = cur[k];
50482
+ if (next === null || typeof next !== "object" || Array.isArray(next)) {
50483
+ cur[k] = {};
50484
+ }
50485
+ cur = cur[k];
50486
+ }
50487
+ cur[parts[parts.length - 1]] = value;
50488
+ };
50489
+ for (const field of payloadSchema) {
50490
+ let value = valueForType(field.type, field.entityType);
50491
+ if (linkedFirstRow !== void 0 && field.name.includes(".") && (typeof value === "string" || typeof value === "number" || typeof value === "boolean")) {
50492
+ const tail = field.name.split(".").pop();
50493
+ const fromRow = linkedFirstRow[tail];
50494
+ if (fromRow !== void 0) value = fromRow;
50495
+ }
50496
+ setByPath(payload, field.name, value);
50497
+ }
50498
+ return payload;
50499
+ }
50500
+ function substitutePayloadBindings(effects, payload) {
50501
+ const isPayloadObject = (v) => v !== null && typeof v === "object" && !Array.isArray(v) && !(v instanceof Date);
50502
+ const getByPath = (path) => {
50503
+ let cur = payload;
50504
+ for (const k of path.split(".")) {
50505
+ if (!isPayloadObject(cur)) return void 0;
50506
+ cur = cur[k];
50507
+ }
50508
+ return cur;
50509
+ };
50510
+ const replaceValue = (v) => {
50511
+ if (typeof v === "string" && v.startsWith("@payload.")) {
50512
+ const resolved = getByPath(v.slice("@payload.".length));
50513
+ return resolved === void 0 ? v : resolved;
50514
+ }
50515
+ if (Array.isArray(v)) return v.map(replaceValue);
50516
+ if (v && typeof v === "object" && !(v instanceof Date)) {
50517
+ const out = {};
50518
+ for (const [k, inner] of Object.entries(v)) {
50519
+ out[k] = replaceValue(inner);
50520
+ }
50521
+ return out;
50522
+ }
50523
+ return v;
50524
+ };
50525
+ const tree = JSON.parse(JSON.stringify(effects));
50526
+ const substituted = replaceValue(tree);
50527
+ return substituted;
50528
+ }
50529
+ function findEmitContract(trait, event) {
50530
+ return trait.emits?.find((e) => e.event === event);
50531
+ }
50532
+ function buildTransitionSchema(fullSchema, orbitalName, traitName, transitionEvent, fromState, toState, mockData) {
50431
50533
  const orbital = (fullSchema.orbitals ?? []).find((o) => o.name === orbitalName);
50432
50534
  if (!orbital) return fullSchema;
50433
50535
  const clonedOrbital = JSON.parse(JSON.stringify(orbital));
50434
50536
  const traits2 = clonedOrbital.traits ?? [];
50435
50537
  for (let ti = 0; ti < traits2.length; ti++) {
50436
50538
  const trait = traits2[ti];
50437
- if (typeof trait === "string" || !("stateMachine" in trait)) continue;
50539
+ if (!isInlineTrait(trait)) continue;
50438
50540
  const traitObj = trait;
50439
50541
  if (traitObj.name !== traitName) continue;
50440
50542
  const sm = traitObj.stateMachine;
50441
50543
  if (!sm) continue;
50442
- const allTransitions = sm.transitions;
50544
+ const allTransitions = sm.transitions ?? [];
50443
50545
  const targetTransition = fromState && toState ? allTransitions.find((t) => t.event === transitionEvent && t.from === fromState && t.to === toState) ?? allTransitions.find((t) => t.event === transitionEvent) : allTransitions.find((t) => t.event === transitionEvent);
50444
50546
  if (!targetTransition?.effects) continue;
50445
50547
  const renderUIEffects = [];
@@ -50449,14 +50551,22 @@ function buildTransitionSchema(fullSchema, orbitalName, traitName, transitionEve
50449
50551
  }
50450
50552
  }
50451
50553
  if (renderUIEffects.length === 0) continue;
50452
- const rewrittenSm = {
50554
+ const linkedEntity = traitObj.linkedEntity ?? entityNameOf(clonedOrbital.entity);
50555
+ const emitContract = findEmitContract(traitObj, transitionEvent);
50556
+ const mockPayload = generateMockPayload(
50557
+ emitContract?.payloadSchema,
50558
+ fullSchema,
50559
+ linkedEntity,
50560
+ mockData
50561
+ );
50562
+ const seededEffects = substitutePayloadBindings(renderUIEffects, mockPayload);
50563
+ traitObj.stateMachine = {
50453
50564
  states: [{ name: "preview", isInitial: true }],
50454
50565
  events: [{ key: "INIT", name: "INIT" }],
50455
- transitions: [{ from: "preview", to: "preview", event: "INIT", effects: renderUIEffects }]
50566
+ transitions: [{ from: "preview", to: "preview", event: "INIT", effects: seededEffects }]
50456
50567
  };
50457
- traits2[ti].stateMachine = rewrittenSm;
50458
- traits2[ti].emits = [];
50459
- traits2[ti].listens = [];
50568
+ traitObj.emits = [];
50569
+ traitObj.listens = [];
50460
50570
  break;
50461
50571
  }
50462
50572
  const targetTrait = traits2.find((t) => {
@@ -50522,11 +50632,12 @@ var OrbPreviewNodeInner = (props) => {
50522
50632
  data.traitName,
50523
50633
  data.transitionEvent,
50524
50634
  data.fromState,
50525
- data.toState
50635
+ data.toState,
50636
+ data._mockData
50526
50637
  );
50527
50638
  }
50528
50639
  return buildOrbitalSchema(fullSchema, data.orbitalName);
50529
- }, [data._fullSchema, data.orbitalName, data.traitName, data.transitionEvent, data.fromState, data.toState, isExpanded]);
50640
+ }, [data._fullSchema, data._mockData, data.orbitalName, data.traitName, data.transitionEvent, data.fromState, data.toState, isExpanded]);
50530
50641
  const handleContentClick = useCallback((e) => {
50531
50642
  e.stopPropagation();
50532
50643
  const target = e.target;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "4.27.0",
3
+ "version": "4.29.0",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -131,7 +131,7 @@
131
131
  "dependencies": {
132
132
  "@almadar/core": ">=7.12.0",
133
133
  "@almadar/evaluator": ">=2.9.2",
134
- "@almadar/patterns": "^2.20.2",
134
+ "@almadar/patterns": "^2.21.0",
135
135
  "@almadar/runtime": "^6.0.0",
136
136
  "@almadar/std": ">=6.4.1",
137
137
  "@almadar/syntax": ">=1.3.1",