@fugood/bricks-project 2.24.0-beta.0 → 2.24.0-beta.10
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/compile/action-name-map.ts +26 -14
- package/compile/index.ts +351 -130
- package/package.json +6 -3
- package/skills/bricks-project/rules/automations.md +74 -28
- package/tools/deploy.ts +39 -10
- package/tools/mcp-server.ts +21 -13
- package/tools/postinstall.ts +53 -6
- package/tools/preview-main.mjs +11 -7
- package/tsconfig.json +16 -0
- package/types/bricks/Camera.ts +1 -1
- package/types/bricks/Chart.ts +1 -1
- package/types/bricks/GenerativeMedia.ts +1 -1
- package/types/bricks/Icon.ts +1 -1
- package/types/bricks/Image.ts +1 -1
- package/types/bricks/Items.ts +1 -1
- package/types/bricks/Lottie.ts +1 -1
- package/types/bricks/Maps.ts +1 -1
- package/types/bricks/QrCode.ts +1 -1
- package/types/bricks/Rect.ts +1 -1
- package/types/bricks/RichText.ts +1 -1
- package/types/bricks/Rive.ts +1 -1
- package/types/bricks/Slideshow.ts +1 -1
- package/types/bricks/Svg.ts +1 -1
- package/types/bricks/Text.ts +1 -1
- package/types/bricks/TextInput.ts +1 -1
- package/types/bricks/Video.ts +1 -1
- package/types/bricks/VideoStreaming.ts +1 -1
- package/types/bricks/WebRtcStream.ts +1 -1
- package/types/bricks/WebView.ts +1 -1
- package/types/canvas.ts +2 -2
- package/types/common.ts +4 -4
- package/types/generators/AlarmClock.ts +1 -1
- package/types/generators/Assistant.ts +1 -1
- package/types/generators/BleCentral.ts +1 -1
- package/types/generators/BlePeripheral.ts +1 -1
- package/types/generators/CanvasMap.ts +1 -1
- package/types/generators/CastlesPay.ts +1 -1
- package/types/generators/DataBank.ts +1 -1
- package/types/generators/File.ts +1 -1
- package/types/generators/GraphQl.ts +1 -1
- package/types/generators/Http.ts +1 -1
- package/types/generators/HttpServer.ts +1 -1
- package/types/generators/Information.ts +1 -1
- package/types/generators/Intent.ts +1 -1
- package/types/generators/Iterator.ts +1 -1
- package/types/generators/Keyboard.ts +1 -1
- package/types/generators/LlmAnthropicCompat.ts +1 -1
- package/types/generators/LlmAppleBuiltin.ts +1 -1
- package/types/generators/LlmGgml.ts +1 -1
- package/types/generators/LlmOnnx.ts +1 -1
- package/types/generators/LlmOpenAiCompat.ts +1 -1
- package/types/generators/LlmQualcommAiEngine.ts +1 -1
- package/types/generators/Mcp.ts +1 -1
- package/types/generators/McpServer.ts +1 -1
- package/types/generators/MediaFlow.ts +1 -1
- package/types/generators/MqttBroker.ts +1 -1
- package/types/generators/MqttClient.ts +1 -1
- package/types/generators/Question.ts +1 -1
- package/types/generators/RealtimeTranscription.ts +15 -7
- package/types/generators/RerankerGgml.ts +1 -1
- package/types/generators/SerialPort.ts +1 -1
- package/types/generators/SoundPlayer.ts +1 -1
- package/types/generators/SoundRecorder.ts +1 -1
- package/types/generators/SpeechToTextGgml.ts +5 -96
- package/types/generators/SpeechToTextOnnx.ts +1 -1
- package/types/generators/SpeechToTextPlatform.ts +1 -1
- package/types/generators/SqLite.ts +1 -1
- package/types/generators/Step.ts +1 -1
- package/types/generators/SttAppleBuiltin.ts +1 -1
- package/types/generators/Tcp.ts +1 -1
- package/types/generators/TcpServer.ts +1 -1
- package/types/generators/TextToSpeechAppleBuiltin.ts +1 -1
- package/types/generators/TextToSpeechGgml.ts +1 -1
- package/types/generators/TextToSpeechOnnx.ts +1 -1
- package/types/generators/TextToSpeechOpenAiLike.ts +1 -1
- package/types/generators/ThermalPrinter.ts +1 -1
- package/types/generators/Tick.ts +1 -1
- package/types/generators/Udp.ts +1 -1
- package/types/generators/VadGgml.ts +1 -1
- package/types/generators/VadOnnx.ts +201 -0
- package/types/generators/VadTraditional.ts +123 -0
- package/types/generators/VectorStore.ts +1 -1
- package/types/generators/Watchdog.ts +1 -1
- package/types/generators/WebCrawler.ts +1 -1
- package/types/generators/WebRtc.ts +1 -1
- package/types/generators/WebSocket.ts +1 -1
- package/types/generators/index.ts +2 -0
- package/utils/calc.ts +12 -8
- package/utils/event-props.ts +27 -0
- package/utils/id.ts +4 -0
- package/api/index.ts +0 -1
- package/api/instance.ts +0 -213
package/compile/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* eslint-disable no-underscore-dangle -- Uses __typename, __actionName, etc. for type system */
|
|
2
|
-
import
|
|
2
|
+
import snakeCase from 'lodash/snakeCase'
|
|
3
|
+
import omit from 'lodash/omit'
|
|
3
4
|
import { parse as parseAST } from 'acorn'
|
|
4
5
|
import type { ExportNamedDeclaration, FunctionDeclaration } from 'acorn'
|
|
5
6
|
import escodegen from 'escodegen'
|
|
@@ -33,6 +34,40 @@ import type {
|
|
|
33
34
|
TestVariable,
|
|
34
35
|
} from '../types'
|
|
35
36
|
|
|
37
|
+
const uuidPattern = '[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}'
|
|
38
|
+
|
|
39
|
+
const entryIdPatterns = {
|
|
40
|
+
SUBSPACE: new RegExp(`^SUBSPACE_${uuidPattern}$`),
|
|
41
|
+
CANVAS: new RegExp(`^CANVAS_${uuidPattern}$`),
|
|
42
|
+
BRICK: new RegExp(`^BRICK_${uuidPattern}$`),
|
|
43
|
+
GENERATOR: new RegExp(`^(GENERATOR|AUTO_GENERATOR)_${uuidPattern}$`),
|
|
44
|
+
ANIMATION: new RegExp(`^ANIMATION_${uuidPattern}$`),
|
|
45
|
+
PROPERTY_BANK_DATA_NODE: new RegExp(`^PROPERTY_BANK_DATA_NODE_${uuidPattern}$`),
|
|
46
|
+
PROPERTY_BANK_COMMAND_NODE: new RegExp(`^PROPERTY_BANK_COMMAND_NODE_${uuidPattern}$`),
|
|
47
|
+
PROPERTY_BANK_COMMAND_MAP: new RegExp(`^PROPERTY_BANK_COMMAND_MAP_${uuidPattern}$`),
|
|
48
|
+
BRICK_STATE_GROUP: new RegExp(`^BRICK_STATE_GROUP_${uuidPattern}$`),
|
|
49
|
+
TEST: new RegExp(`^TEST_${uuidPattern}$`),
|
|
50
|
+
TEST_CASE: new RegExp(`^TEST_CASE_${uuidPattern}$`),
|
|
51
|
+
TEST_VAR: new RegExp(`^TEST_VAR_${uuidPattern}$`),
|
|
52
|
+
AUTOMATION_MAP: /^AUTOMATION_MAP_.*/,
|
|
53
|
+
} as const
|
|
54
|
+
|
|
55
|
+
type EntryIdPatternKey = keyof typeof entryIdPatterns
|
|
56
|
+
|
|
57
|
+
const assertEntryId = (
|
|
58
|
+
id: unknown,
|
|
59
|
+
patternKey: EntryIdPatternKey,
|
|
60
|
+
errorReference: string = '',
|
|
61
|
+
): string => {
|
|
62
|
+
const pattern = entryIdPatterns[patternKey]
|
|
63
|
+
if (typeof id !== 'string' || !pattern.test(id)) {
|
|
64
|
+
throw new Error(
|
|
65
|
+
`Invalid ${patternKey} id${errorReference ? ` ${errorReference}` : ''}: ${String(id)}`,
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
return id
|
|
69
|
+
}
|
|
70
|
+
|
|
36
71
|
const compileProperty = (property, errorReference: string, result = {}) => {
|
|
37
72
|
if (Array.isArray(property)) {
|
|
38
73
|
return property.map((p) => compileProperty(p, errorReference))
|
|
@@ -70,7 +105,7 @@ const compileEventActionValue = (templateKey, eventKey, value, errorReference) =
|
|
|
70
105
|
}
|
|
71
106
|
|
|
72
107
|
const convertOutletKey = (templateKey: string, key: string) =>
|
|
73
|
-
`${templateKey}_${
|
|
108
|
+
`${templateKey}_${snakeCase(key).toUpperCase()}`
|
|
74
109
|
|
|
75
110
|
const compileOutlets = (
|
|
76
111
|
templateKey: string,
|
|
@@ -78,13 +113,14 @@ const compileOutlets = (
|
|
|
78
113
|
errorReference: string,
|
|
79
114
|
) =>
|
|
80
115
|
Object.entries(outlets).reduce((acc, [key, data]) => {
|
|
81
|
-
|
|
82
|
-
|
|
116
|
+
const dataInstance = data?.()
|
|
117
|
+
const dataId = assertEntryId(dataInstance?.id, 'PROPERTY_BANK_DATA_NODE', errorReference)
|
|
118
|
+
acc[convertOutletKey(templateKey, key)] = dataId
|
|
83
119
|
return acc
|
|
84
120
|
}, {})
|
|
85
121
|
|
|
86
122
|
const convertEventKey = (templateKey: string, key: string) =>
|
|
87
|
-
`${templateKey ? `${templateKey}_` : ''}${
|
|
123
|
+
`${templateKey ? `${templateKey}_` : ''}${snakeCase(key).toUpperCase()}`
|
|
88
124
|
|
|
89
125
|
const basicAnimationEvents = ['show', 'standby', 'breatheStart']
|
|
90
126
|
|
|
@@ -94,9 +130,9 @@ const compileAnimations = (
|
|
|
94
130
|
errorReference: string,
|
|
95
131
|
) =>
|
|
96
132
|
Object.entries(animations).reduce((acc, [key, animation]) => {
|
|
97
|
-
|
|
133
|
+
const animationId = assertEntryId(animation?.id, 'ANIMATION', errorReference)
|
|
98
134
|
acc[convertEventKey(basicAnimationEvents.includes(key) ? 'BRICK' : templateKey, key)] =
|
|
99
|
-
`ANIMATION#${
|
|
135
|
+
`ANIMATION#${animationId}`
|
|
100
136
|
return acc
|
|
101
137
|
}, {})
|
|
102
138
|
|
|
@@ -380,59 +416,120 @@ const compileTestVariable = (variable: TestVariable) => ({
|
|
|
380
416
|
*/
|
|
381
417
|
const arrayToIdMap = <T extends { id: string }, R>(
|
|
382
418
|
items: T[],
|
|
383
|
-
transform: (item: T) => R,
|
|
384
|
-
|
|
419
|
+
transform: (item: T, index: number) => R,
|
|
420
|
+
options: {
|
|
421
|
+
patternKey: EntryIdPatternKey
|
|
422
|
+
getErrorReference: (item: T, index: number) => string
|
|
423
|
+
},
|
|
424
|
+
): Record<string, R> =>
|
|
425
|
+
Object.fromEntries(
|
|
426
|
+
items.map((item, index) => {
|
|
427
|
+
const itemId = assertEntryId(
|
|
428
|
+
item.id,
|
|
429
|
+
options.patternKey,
|
|
430
|
+
options.getErrorReference(item, index),
|
|
431
|
+
)
|
|
432
|
+
return [itemId, transform(item, index)]
|
|
433
|
+
}),
|
|
434
|
+
)
|
|
385
435
|
|
|
386
436
|
/**
|
|
387
437
|
* Compile typed AutomationTest to raw format
|
|
388
438
|
*/
|
|
389
|
-
const compileAutomationTest = (
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
439
|
+
const compileAutomationTest = (
|
|
440
|
+
test: AutomationTest,
|
|
441
|
+
options: { mapId: string; testIndex: number },
|
|
442
|
+
) => {
|
|
443
|
+
const testId = assertEntryId(
|
|
444
|
+
test.id,
|
|
445
|
+
'TEST',
|
|
446
|
+
`(automation map: ${options.mapId}, test index: ${options.testIndex})`,
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
return {
|
|
450
|
+
id: testId,
|
|
451
|
+
title: test.title,
|
|
452
|
+
timeout: test.timeout,
|
|
453
|
+
trigger_type: test.trigger_type,
|
|
454
|
+
cron: test.cron,
|
|
455
|
+
skip_trigger_type_check: test.skip_trigger_type_check,
|
|
456
|
+
local_sync: test.local_sync,
|
|
457
|
+
meta: test.meta,
|
|
458
|
+
case_map: arrayToIdMap(test.cases, compileTestCase, {
|
|
459
|
+
patternKey: 'TEST_CASE',
|
|
460
|
+
getErrorReference: (_, index) =>
|
|
461
|
+
`(automation map: ${options.mapId}, test: ${testId}, case index: ${index})`,
|
|
462
|
+
}),
|
|
463
|
+
var_map: arrayToIdMap(test.variables, compileTestVariable, {
|
|
464
|
+
patternKey: 'TEST_VAR',
|
|
465
|
+
getErrorReference: (_, index) =>
|
|
466
|
+
`(automation map: ${options.mapId}, test: ${testId}, variable index: ${index})`,
|
|
467
|
+
}),
|
|
468
|
+
}
|
|
469
|
+
}
|
|
401
470
|
|
|
402
471
|
/**
|
|
403
472
|
* Compile typed AutomationTestMap to raw format
|
|
404
473
|
*/
|
|
405
|
-
const compileAutomationTestMap = (testMap: AutomationTestMap) =>
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
474
|
+
const compileAutomationTestMap = (testMap: AutomationTestMap, mapId: string) => {
|
|
475
|
+
assertEntryId(testMap.id, 'AUTOMATION_MAP', `(automation map id field: ${mapId})`)
|
|
476
|
+
|
|
477
|
+
return {
|
|
478
|
+
title: testMap.title,
|
|
479
|
+
createdAt: testMap.createdAt,
|
|
480
|
+
map: arrayToIdMap(
|
|
481
|
+
testMap.tests,
|
|
482
|
+
(test, index) => compileAutomationTest(test, { mapId, testIndex: index }),
|
|
483
|
+
{
|
|
484
|
+
patternKey: 'TEST',
|
|
485
|
+
getErrorReference: (_, index) => `(automation map: ${mapId}, test index: ${index})`,
|
|
486
|
+
},
|
|
487
|
+
),
|
|
488
|
+
}
|
|
489
|
+
}
|
|
410
490
|
|
|
411
491
|
/**
|
|
412
492
|
* Compile typed AutomationMap to raw automation_map format
|
|
413
493
|
*/
|
|
414
494
|
const compileAutomation = (automationMap: AutomationMap) =>
|
|
415
495
|
Object.fromEntries(
|
|
416
|
-
Object.entries(automationMap).map(([mapId, testMap]) =>
|
|
417
|
-
mapId,
|
|
418
|
-
compileAutomationTestMap(testMap)
|
|
419
|
-
|
|
496
|
+
Object.entries(automationMap).map(([mapId, testMap]) => {
|
|
497
|
+
const automationMapId = assertEntryId(mapId, 'AUTOMATION_MAP', '(automation map key)')
|
|
498
|
+
return [automationMapId, compileAutomationTestMap(testMap, automationMapId)]
|
|
499
|
+
}),
|
|
420
500
|
)
|
|
421
501
|
|
|
422
502
|
export const compile = async (app: Application) => {
|
|
423
503
|
await new Promise((resolve) => setImmediate(resolve, 0))
|
|
504
|
+
const timestamp = Date.now()
|
|
424
505
|
const config = {
|
|
425
|
-
title: app.name
|
|
426
|
-
subspace_map: app.subspaces.reduce((subspaceMap, subspace) => {
|
|
427
|
-
|
|
506
|
+
title: `${app.name || 'Unknown'}(${timestamp})`,
|
|
507
|
+
subspace_map: app.subspaces.reduce((subspaceMap, subspace, subspaceIndex) => {
|
|
508
|
+
const subspaceId = assertEntryId(
|
|
509
|
+
subspace.id,
|
|
510
|
+
'SUBSPACE',
|
|
511
|
+
`(subspace index: ${subspaceIndex})`,
|
|
512
|
+
)
|
|
513
|
+
const rootCanvasId = assertEntryId(
|
|
514
|
+
subspace.rootCanvas?.id,
|
|
515
|
+
'CANVAS',
|
|
516
|
+
`(subspace: ${subspaceId}, root canvas)`,
|
|
517
|
+
)
|
|
518
|
+
|
|
519
|
+
subspaceMap[subspaceId] = {
|
|
428
520
|
title: subspace.title,
|
|
429
521
|
description: subspace.description,
|
|
430
522
|
_expanded: subspace.unexpanded
|
|
431
523
|
? {
|
|
432
524
|
brick: !subspace.unexpanded.brick,
|
|
433
525
|
generator: !subspace.unexpanded.generator,
|
|
434
|
-
canvas: subspace.unexpanded.canvas?.reduce((acc, canvas) => {
|
|
435
|
-
|
|
526
|
+
canvas: subspace.unexpanded.canvas?.reduce((acc, canvas, canvasIndex) => {
|
|
527
|
+
const unexpandedCanvasId = assertEntryId(
|
|
528
|
+
canvas?.id,
|
|
529
|
+
'CANVAS',
|
|
530
|
+
`(subspace: ${subspaceId}, unexpanded canvas index: ${canvasIndex})`,
|
|
531
|
+
)
|
|
532
|
+
acc[unexpandedCanvasId] = !canvas?.id
|
|
436
533
|
return acc
|
|
437
534
|
}, {}),
|
|
438
535
|
property_bank: !subspace.unexpanded.data,
|
|
@@ -449,23 +546,29 @@ export const compile = async (app: Application) => {
|
|
|
449
546
|
change_canvas: subspace.localSyncChangeCanvas,
|
|
450
547
|
}
|
|
451
548
|
: undefined,
|
|
452
|
-
animation_map: subspace.animations.reduce((map, animation) => {
|
|
549
|
+
animation_map: subspace.animations.reduce((map, animation, animationIndex) => {
|
|
550
|
+
const animationId = assertEntryId(
|
|
551
|
+
animation?.id,
|
|
552
|
+
'ANIMATION',
|
|
553
|
+
`(animation index: ${animationIndex}, subspace: ${subspaceId})`,
|
|
554
|
+
)
|
|
555
|
+
|
|
453
556
|
if (animation.__typename === 'Animation') {
|
|
454
557
|
const animationDef = animation as AnimationDef
|
|
455
|
-
map[
|
|
558
|
+
map[animationId] = {
|
|
456
559
|
title: animationDef.title,
|
|
457
560
|
description: animationDef.description,
|
|
458
561
|
animationRunType: animationDef.runType,
|
|
459
562
|
property: animationDef.property,
|
|
460
563
|
type: animationTypeMap[animationDef.config.__type],
|
|
461
564
|
config: compileProperty(
|
|
462
|
-
|
|
463
|
-
`(animation: ${
|
|
565
|
+
omit(animationDef.config, '__type'),
|
|
566
|
+
`(animation: ${animationId}, subspace ${subspaceId})`,
|
|
464
567
|
),
|
|
465
568
|
}
|
|
466
569
|
} else if (animation.__typename === 'AnimationCompose') {
|
|
467
570
|
const animationDef = animation as AnimationComposeDef
|
|
468
|
-
map[
|
|
571
|
+
map[animationId] = {
|
|
469
572
|
title: animationDef.title,
|
|
470
573
|
description: animationDef.description,
|
|
471
574
|
animationRunType: animationDef.runType,
|
|
@@ -474,7 +577,7 @@ export const compile = async (app: Application) => {
|
|
|
474
577
|
const innerAnimation = item()
|
|
475
578
|
if (!innerAnimation?.id)
|
|
476
579
|
throw new Error(
|
|
477
|
-
`Invalid animation index: ${index} (animation: ${innerAnimation.id}, subspace ${
|
|
580
|
+
`Invalid animation index: ${index} (animation: ${innerAnimation.id}, subspace ${subspaceId})`,
|
|
478
581
|
)
|
|
479
582
|
return { animation_id: innerAnimation.id }
|
|
480
583
|
}),
|
|
@@ -482,10 +585,15 @@ export const compile = async (app: Application) => {
|
|
|
482
585
|
}
|
|
483
586
|
return map
|
|
484
587
|
}, {}),
|
|
485
|
-
brick_map: subspace.bricks.reduce((map, brick) => {
|
|
588
|
+
brick_map: subspace.bricks.reduce((map, brick, brickIndex) => {
|
|
589
|
+
const brickId = assertEntryId(
|
|
590
|
+
brick.id,
|
|
591
|
+
'BRICK',
|
|
592
|
+
`(brick index: ${brickIndex}, subspace: ${subspaceId})`,
|
|
593
|
+
)
|
|
486
594
|
const property = compileProperty(
|
|
487
595
|
brick.property || {},
|
|
488
|
-
`(brick: ${
|
|
596
|
+
`(brick: ${brickId}, subspace ${subspaceId})`,
|
|
489
597
|
)
|
|
490
598
|
if (brick.templateKey === 'BRICK_ITEMS') {
|
|
491
599
|
const brickItems = brick as BrickItems
|
|
@@ -497,25 +605,31 @@ export const compile = async (app: Application) => {
|
|
|
497
605
|
frame: itemBrick.frame,
|
|
498
606
|
property: compileProperty(
|
|
499
607
|
itemBrick.property,
|
|
500
|
-
`(brick: ${
|
|
608
|
+
`(brick: ${brickId}, ${key}: ${index}, subspace ${subspaceId})`,
|
|
501
609
|
),
|
|
502
610
|
propertyMapping: itemBrick.propertyMapping,
|
|
503
611
|
animation: compileAnimations(
|
|
504
612
|
itemBrick.templateKey,
|
|
505
613
|
itemBrick.animation || {},
|
|
506
|
-
`(brick: ${
|
|
614
|
+
`(brick: ${brickId}, ${key}: ${index}, subspace ${subspaceId})`,
|
|
507
615
|
),
|
|
508
616
|
outlet: compileOutlets(
|
|
509
617
|
itemBrick.templateKey,
|
|
510
618
|
itemBrick.outlets || {},
|
|
511
|
-
`(brick: ${
|
|
619
|
+
`(brick: ${brickId}, ${key}: ${index}, subspace ${subspaceId})`,
|
|
512
620
|
),
|
|
513
621
|
eventMap: compileEvents(itemBrick.templateKey, itemBrick.eventMap || {}, {
|
|
514
622
|
camelCase: true,
|
|
515
|
-
errorReference: `(brick: ${
|
|
623
|
+
errorReference: `(brick: ${brickId}, ${key}: ${index}, subspace ${subspaceId})`,
|
|
516
624
|
}),
|
|
517
|
-
stateGroup: itemBrick.stateGroup.reduce((acc, stateGroup) => {
|
|
518
|
-
|
|
625
|
+
stateGroup: itemBrick.stateGroup.reduce((acc, stateGroup, stateGroupIndex) => {
|
|
626
|
+
const stateGroupId = assertEntryId(
|
|
627
|
+
stateGroup.id,
|
|
628
|
+
'BRICK_STATE_GROUP',
|
|
629
|
+
`(brick: ${brickId}, ${key}: ${index}, switch index: ${stateGroupIndex}, subspace ${subspaceId})`,
|
|
630
|
+
)
|
|
631
|
+
|
|
632
|
+
acc[stateGroupId] = {
|
|
519
633
|
title: stateGroup.title,
|
|
520
634
|
description: stateGroup.description,
|
|
521
635
|
override: stateGroup.override,
|
|
@@ -524,29 +638,32 @@ export const compile = async (app: Application) => {
|
|
|
524
638
|
conds: compileSwitchConds(
|
|
525
639
|
itemBrick.templateKey,
|
|
526
640
|
stateGroup.conds || [],
|
|
527
|
-
`(brick: ${
|
|
641
|
+
`(brick: ${brickId}, ${key}: ${index}, switch: ${stateGroupId}, subspace ${subspaceId})`,
|
|
528
642
|
),
|
|
529
643
|
property: compileProperty(
|
|
530
644
|
stateGroup.property,
|
|
531
|
-
`(brick: ${
|
|
645
|
+
`(brick: ${brickId}, ${key}: ${index}, switch: ${stateGroupId}, subspace ${subspaceId})`,
|
|
532
646
|
),
|
|
533
647
|
animation: compileAnimations(
|
|
534
648
|
itemBrick.templateKey,
|
|
535
649
|
stateGroup.animation || {},
|
|
536
|
-
`(brick: ${
|
|
650
|
+
`(brick: ${brickId}, ${key}: ${index}, switch: ${stateGroupId}, subspace ${subspaceId})`,
|
|
537
651
|
),
|
|
538
652
|
outlet: compileOutlets(
|
|
539
653
|
itemBrick.templateKey,
|
|
540
654
|
stateGroup.outlets || {},
|
|
541
|
-
`(brick: ${
|
|
655
|
+
`(brick: ${brickId}, ${key}: ${index}, switch: ${stateGroupId}, subspace ${subspaceId})`,
|
|
542
656
|
),
|
|
543
657
|
eventMap: compileEvents(itemBrick.templateKey, stateGroup.eventMap || {}, {
|
|
544
658
|
camelCase: true,
|
|
545
|
-
errorReference: `(brick: ${
|
|
659
|
+
errorReference: `(brick: ${brickId}, ${key}: ${index}, switch: ${stateGroupId}, subspace ${subspaceId})`,
|
|
546
660
|
}),
|
|
547
661
|
}
|
|
548
662
|
return acc
|
|
549
663
|
}, {}),
|
|
664
|
+
show: itemBrick.show,
|
|
665
|
+
pressToOpenDetail: itemBrick.pressToOpenDetail,
|
|
666
|
+
pressToBackList: itemBrick.pressToBackList,
|
|
550
667
|
})
|
|
551
668
|
if (Array.isArray(brickItems.brickList)) {
|
|
552
669
|
const brickList = (brickItems.brickList || []).map((item, index) =>
|
|
@@ -567,7 +684,7 @@ export const compile = async (app: Application) => {
|
|
|
567
684
|
throw new TypeError('Not supported Data for brickList directly')
|
|
568
685
|
}
|
|
569
686
|
}
|
|
570
|
-
map[
|
|
687
|
+
map[brickId] = {
|
|
571
688
|
template_key: brick.templateKey,
|
|
572
689
|
title: brick.title,
|
|
573
690
|
description: brick.description,
|
|
@@ -575,19 +692,25 @@ export const compile = async (app: Application) => {
|
|
|
575
692
|
animation: compileAnimations(
|
|
576
693
|
brick.templateKey,
|
|
577
694
|
brick.animation || {},
|
|
578
|
-
`(brick: ${
|
|
695
|
+
`(brick: ${brickId}, subspace ${subspaceId})`,
|
|
579
696
|
),
|
|
580
697
|
event_map: compileEvents(brick.templateKey, brick.events || {}, {
|
|
581
698
|
camelCase: false,
|
|
582
|
-
errorReference: `(brick: ${
|
|
699
|
+
errorReference: `(brick: ${brickId}, subspace ${subspaceId})`,
|
|
583
700
|
}),
|
|
584
701
|
outlet: compileOutlets(
|
|
585
702
|
brick.templateKey,
|
|
586
703
|
brick.outlets || {},
|
|
587
|
-
`(brick: ${
|
|
704
|
+
`(brick: ${brickId}, subspace ${subspaceId})`,
|
|
588
705
|
),
|
|
589
|
-
state_group: brick.switches?.reduce((acc, switchCase) => {
|
|
590
|
-
|
|
706
|
+
state_group: brick.switches?.reduce((acc, switchCase, switchIndex) => {
|
|
707
|
+
const switchId = assertEntryId(
|
|
708
|
+
switchCase.id,
|
|
709
|
+
'BRICK_STATE_GROUP',
|
|
710
|
+
`(brick: ${brickId}, switch index: ${switchIndex}, subspace ${subspaceId})`,
|
|
711
|
+
)
|
|
712
|
+
|
|
713
|
+
acc[switchId] = {
|
|
591
714
|
title: switchCase.title,
|
|
592
715
|
description: switchCase.description,
|
|
593
716
|
break: switchCase.break,
|
|
@@ -596,25 +719,25 @@ export const compile = async (app: Application) => {
|
|
|
596
719
|
conds: compileSwitchConds(
|
|
597
720
|
brick.templateKey,
|
|
598
721
|
switchCase.conds || [],
|
|
599
|
-
`(brick: ${
|
|
722
|
+
`(brick: ${brickId}, switch: ${switchId}, subspace ${subspaceId})`,
|
|
600
723
|
),
|
|
601
724
|
property: compileProperty(
|
|
602
725
|
switchCase.property,
|
|
603
|
-
`(brick: ${
|
|
726
|
+
`(brick: ${brickId}, switch: ${switchId}, subspace ${subspaceId})`,
|
|
604
727
|
),
|
|
605
728
|
outlet: compileOutlets(
|
|
606
729
|
brick.templateKey,
|
|
607
730
|
switchCase.outlets || {},
|
|
608
|
-
`(brick: ${
|
|
731
|
+
`(brick: ${brickId}, switch: ${switchId}, subspace ${subspaceId})`,
|
|
609
732
|
),
|
|
610
733
|
event_map: compileEvents(brick.templateKey, switchCase.events || {}, {
|
|
611
734
|
camelCase: false,
|
|
612
|
-
errorReference: `(brick: ${
|
|
735
|
+
errorReference: `(brick: ${brickId}, switch: ${switchId}, subspace ${subspaceId})`,
|
|
613
736
|
}),
|
|
614
737
|
animation: compileAnimations(
|
|
615
738
|
brick.templateKey,
|
|
616
739
|
switchCase.animation || {},
|
|
617
|
-
`(brick: ${
|
|
740
|
+
`(brick: ${brickId}, switch: ${switchId}, subspace ${subspaceId})`,
|
|
618
741
|
),
|
|
619
742
|
}
|
|
620
743
|
return acc
|
|
@@ -622,21 +745,33 @@ export const compile = async (app: Application) => {
|
|
|
622
745
|
}
|
|
623
746
|
return map
|
|
624
747
|
}, {}),
|
|
625
|
-
root_canvas_id:
|
|
626
|
-
canvas_map: subspace.canvases.reduce((map, canvas) => {
|
|
627
|
-
|
|
748
|
+
root_canvas_id: rootCanvasId,
|
|
749
|
+
canvas_map: subspace.canvases.reduce((map, canvas, canvasIndex) => {
|
|
750
|
+
const canvasId = assertEntryId(
|
|
751
|
+
canvas.id,
|
|
752
|
+
'CANVAS',
|
|
753
|
+
`(canvas index: ${canvasIndex}, subspace: ${subspaceId})`,
|
|
754
|
+
)
|
|
755
|
+
|
|
756
|
+
map[canvasId] = {
|
|
628
757
|
title: canvas.title,
|
|
629
758
|
description: canvas.description,
|
|
630
759
|
property: compileProperty(
|
|
631
760
|
canvas.property,
|
|
632
|
-
`(canvas: ${
|
|
761
|
+
`(canvas: ${canvasId}, subspace ${subspaceId})`,
|
|
633
762
|
),
|
|
634
763
|
event_map: compileEvents('CANVAS', canvas.events || {}, {
|
|
635
764
|
camelCase: false,
|
|
636
|
-
errorReference: `(canvas: ${
|
|
765
|
+
errorReference: `(canvas: ${canvasId}, subspace ${subspaceId})`,
|
|
637
766
|
}),
|
|
638
|
-
state_group: canvas.switches?.reduce((acc, switchCase) => {
|
|
639
|
-
|
|
767
|
+
state_group: canvas.switches?.reduce((acc, switchCase, switchIndex) => {
|
|
768
|
+
const switchId = assertEntryId(
|
|
769
|
+
switchCase.id,
|
|
770
|
+
'BRICK_STATE_GROUP',
|
|
771
|
+
`(canvas: ${canvasId}, switch index: ${switchIndex}, subspace ${subspaceId})`,
|
|
772
|
+
)
|
|
773
|
+
|
|
774
|
+
acc[switchId] = {
|
|
640
775
|
title: switchCase.title,
|
|
641
776
|
description: switchCase.description,
|
|
642
777
|
break: switchCase.break,
|
|
@@ -645,20 +780,20 @@ export const compile = async (app: Application) => {
|
|
|
645
780
|
conds: compileSwitchConds(
|
|
646
781
|
'CANVAS',
|
|
647
782
|
switchCase.conds || [],
|
|
648
|
-
`(canvas: ${
|
|
783
|
+
`(canvas: ${canvasId}, switch: ${switchId}, subspace ${subspaceId})`,
|
|
649
784
|
),
|
|
650
785
|
property: compileProperty(
|
|
651
786
|
switchCase.property,
|
|
652
|
-
`(canvas: ${
|
|
787
|
+
`(canvas: ${canvasId}, switch: ${switchId}, subspace ${subspaceId})`,
|
|
653
788
|
),
|
|
654
789
|
event_map: compileEvents('CANVAS', switchCase.events || {}, {
|
|
655
790
|
camelCase: false,
|
|
656
|
-
errorReference: `(canvas: ${
|
|
791
|
+
errorReference: `(canvas: ${canvasId}, switch: ${switchId}, subspace ${subspaceId})`,
|
|
657
792
|
}),
|
|
658
793
|
animation: compileAnimations(
|
|
659
794
|
'CANVAS',
|
|
660
795
|
switchCase.animation || {},
|
|
661
|
-
`(canvas: ${
|
|
796
|
+
`(canvas: ${canvasId}, switch: ${switchId}, subspace ${subspaceId})`,
|
|
662
797
|
),
|
|
663
798
|
}
|
|
664
799
|
return acc
|
|
@@ -669,16 +804,16 @@ export const compile = async (app: Application) => {
|
|
|
669
804
|
const brick = (item.item as () => Brick)()
|
|
670
805
|
if (!brick?.id)
|
|
671
806
|
throw new Error(
|
|
672
|
-
`Invalid canvas item index: ${index}, brick not found (canvas: ${
|
|
807
|
+
`Invalid canvas item index: ${index}, brick not found (canvas: ${canvasId}, subspace ${subspaceId})`,
|
|
673
808
|
)
|
|
674
809
|
itemPayload = { brick_id: brick.id }
|
|
675
810
|
} else {
|
|
676
|
-
const
|
|
677
|
-
if (!app.subspaces.some((s) => s.id ===
|
|
811
|
+
const targetSubspaceId = item.item
|
|
812
|
+
if (!app.subspaces.some((s) => s.id === targetSubspaceId))
|
|
678
813
|
throw new Error(
|
|
679
|
-
`Invalid canvas item index: ${index}, subspace not found (canvas: ${
|
|
814
|
+
`Invalid canvas item index: ${index}, subspace not found (canvas: ${canvasId}, subspace ${subspaceId})`,
|
|
680
815
|
)
|
|
681
|
-
itemPayload = { subspace_id:
|
|
816
|
+
itemPayload = { subspace_id: targetSubspaceId }
|
|
682
817
|
}
|
|
683
818
|
return {
|
|
684
819
|
type: typeof item.item === 'function' ? 'brick' : 'subspace',
|
|
@@ -690,8 +825,14 @@ export const compile = async (app: Application) => {
|
|
|
690
825
|
}
|
|
691
826
|
return map
|
|
692
827
|
}, {}),
|
|
693
|
-
generator_map: subspace.generators.reduce((map, generator) => {
|
|
694
|
-
|
|
828
|
+
generator_map: subspace.generators.reduce((map, generator, generatorIndex) => {
|
|
829
|
+
const generatorId = assertEntryId(
|
|
830
|
+
generator.id,
|
|
831
|
+
'GENERATOR',
|
|
832
|
+
`(generator index: ${generatorIndex}, subspace: ${subspaceId})`,
|
|
833
|
+
)
|
|
834
|
+
|
|
835
|
+
map[generatorId] = {
|
|
695
836
|
template_key: generator.templateKey,
|
|
696
837
|
title: generator.title,
|
|
697
838
|
description: generator.description,
|
|
@@ -702,19 +843,25 @@ export const compile = async (app: Application) => {
|
|
|
702
843
|
: undefined,
|
|
703
844
|
property: compileProperty(
|
|
704
845
|
generator.property || {},
|
|
705
|
-
`(generator: ${
|
|
846
|
+
`(generator: ${generatorId}, subspace ${subspaceId})`,
|
|
706
847
|
),
|
|
707
848
|
event_map: compileEvents(generator.templateKey, generator.events || {}, {
|
|
708
849
|
camelCase: false,
|
|
709
|
-
errorReference: `(generator: ${
|
|
850
|
+
errorReference: `(generator: ${generatorId}, subspace ${subspaceId})`,
|
|
710
851
|
}),
|
|
711
852
|
outlet: compileOutlets(
|
|
712
853
|
generator.templateKey,
|
|
713
854
|
generator.outlets || {},
|
|
714
|
-
`(generator: ${
|
|
855
|
+
`(generator: ${generatorId}, subspace ${subspaceId})`,
|
|
715
856
|
),
|
|
716
|
-
state_group: generator.switches?.reduce((acc, switchCase) => {
|
|
717
|
-
|
|
857
|
+
state_group: generator.switches?.reduce((acc, switchCase, switchIndex) => {
|
|
858
|
+
const switchId = assertEntryId(
|
|
859
|
+
switchCase.id,
|
|
860
|
+
'BRICK_STATE_GROUP',
|
|
861
|
+
`(generator: ${generatorId}, switch index: ${switchIndex}, subspace ${subspaceId})`,
|
|
862
|
+
)
|
|
863
|
+
|
|
864
|
+
acc[switchId] = {
|
|
718
865
|
title: switchCase.title,
|
|
719
866
|
description: switchCase.description,
|
|
720
867
|
break: switchCase.break,
|
|
@@ -723,25 +870,25 @@ export const compile = async (app: Application) => {
|
|
|
723
870
|
conds: compileSwitchConds(
|
|
724
871
|
generator.templateKey,
|
|
725
872
|
switchCase.conds || [],
|
|
726
|
-
`(generator: ${
|
|
873
|
+
`(generator: ${generatorId}, switch: ${switchId}, subspace ${subspaceId})`,
|
|
727
874
|
),
|
|
728
875
|
property: compileProperty(
|
|
729
876
|
switchCase.property,
|
|
730
|
-
`(generator: ${
|
|
877
|
+
`(generator: ${generatorId}, switch: ${switchId}, subspace ${subspaceId})`,
|
|
731
878
|
),
|
|
732
879
|
outlet: compileOutlets(
|
|
733
880
|
generator.templateKey,
|
|
734
881
|
switchCase.outlets || {},
|
|
735
|
-
`(generator: ${
|
|
882
|
+
`(generator: ${generatorId}, switch: ${switchId}, subspace ${subspaceId})`,
|
|
736
883
|
),
|
|
737
884
|
event_map: compileEvents(generator.templateKey, switchCase.events || {}, {
|
|
738
885
|
camelCase: false,
|
|
739
|
-
errorReference: `(generator: ${
|
|
886
|
+
errorReference: `(generator: ${generatorId}, switch: ${switchId}, subspace ${subspaceId})`,
|
|
740
887
|
}),
|
|
741
888
|
animation: compileAnimations(
|
|
742
889
|
generator.templateKey,
|
|
743
890
|
switchCase.animation || {},
|
|
744
|
-
`(generator: ${
|
|
891
|
+
`(generator: ${generatorId}, switch: ${switchId}, subspace ${subspaceId})`,
|
|
745
892
|
),
|
|
746
893
|
}
|
|
747
894
|
return acc
|
|
@@ -749,8 +896,14 @@ export const compile = async (app: Application) => {
|
|
|
749
896
|
}
|
|
750
897
|
return map
|
|
751
898
|
}, {}),
|
|
752
|
-
property_bank_map: subspace.data.reduce((map, data) => {
|
|
753
|
-
|
|
899
|
+
property_bank_map: subspace.data.reduce((map, data, dataIndex) => {
|
|
900
|
+
const dataId = assertEntryId(
|
|
901
|
+
data.id,
|
|
902
|
+
'PROPERTY_BANK_DATA_NODE',
|
|
903
|
+
`(data index: ${dataIndex}, subspace: ${subspaceId})`,
|
|
904
|
+
)
|
|
905
|
+
|
|
906
|
+
map[dataId] = {
|
|
754
907
|
title: data.title,
|
|
755
908
|
description: data.description,
|
|
756
909
|
linked: data.metadata?.linked,
|
|
@@ -766,17 +919,23 @@ export const compile = async (app: Application) => {
|
|
|
766
919
|
schema: data.schema,
|
|
767
920
|
type: data.type,
|
|
768
921
|
...compileKind(data.kind),
|
|
769
|
-
value: compileProperty(data.value, `(data: ${
|
|
922
|
+
value: compileProperty(data.value, `(data: ${dataId}, subspace ${subspaceId})`),
|
|
770
923
|
event_map: compileEvents('PROPERTY_BANK', data.events || {}, {
|
|
771
924
|
camelCase: false,
|
|
772
|
-
errorReference: `(data: ${
|
|
925
|
+
errorReference: `(data: ${dataId}, subspace ${subspaceId})`,
|
|
773
926
|
}),
|
|
774
927
|
hit_equal: data.hit_equal,
|
|
775
928
|
hit_regex: data.hit_regex,
|
|
776
929
|
}
|
|
777
930
|
return map
|
|
778
931
|
}, {}),
|
|
779
|
-
property_bank_calc_map: subspace.dataCalculation.reduce((map, dataCalc) => {
|
|
932
|
+
property_bank_calc_map: subspace.dataCalculation.reduce((map, dataCalc, dataCalcIndex) => {
|
|
933
|
+
const dataCalcId = assertEntryId(
|
|
934
|
+
dataCalc.id,
|
|
935
|
+
'PROPERTY_BANK_COMMAND_MAP',
|
|
936
|
+
`(data calc index: ${dataCalcIndex}, subspace: ${subspaceId})`,
|
|
937
|
+
)
|
|
938
|
+
|
|
780
939
|
const calc: any = {
|
|
781
940
|
title: dataCalc.title,
|
|
782
941
|
description: dataCalc.description,
|
|
@@ -786,15 +945,45 @@ export const compile = async (app: Application) => {
|
|
|
786
945
|
calc.type = 'general'
|
|
787
946
|
const mapCalc = dataCalc as DataCalculationMap
|
|
788
947
|
|
|
948
|
+
const getNodeId = (
|
|
949
|
+
node: DataCalculationData | DataCommand,
|
|
950
|
+
reference = '',
|
|
951
|
+
nodeIndex?: number,
|
|
952
|
+
) => {
|
|
953
|
+
const nodeReference = [
|
|
954
|
+
`data calc: ${dataCalcId}`,
|
|
955
|
+
`subspace: ${subspaceId}`,
|
|
956
|
+
typeof nodeIndex === 'number' ? `node index: ${nodeIndex}` : undefined,
|
|
957
|
+
reference || undefined,
|
|
958
|
+
]
|
|
959
|
+
.filter(Boolean)
|
|
960
|
+
.join(', ')
|
|
961
|
+
|
|
962
|
+
if (node.__typename === 'DataCalculationData') {
|
|
963
|
+
return assertEntryId(
|
|
964
|
+
node.data()?.id,
|
|
965
|
+
'PROPERTY_BANK_DATA_NODE',
|
|
966
|
+
`(${nodeReference})`,
|
|
967
|
+
)
|
|
968
|
+
}
|
|
969
|
+
if (node.__typename === 'DataCommand') {
|
|
970
|
+
return assertEntryId(node.id, 'PROPERTY_BANK_COMMAND_NODE', `(${nodeReference})`)
|
|
971
|
+
}
|
|
972
|
+
throw new Error(`Invalid node: ${JSON.stringify(node)}`)
|
|
973
|
+
}
|
|
974
|
+
|
|
789
975
|
const generateInputPorts = (inputs) =>
|
|
790
|
-
inputs.reduce((acc, port) => {
|
|
976
|
+
inputs.reduce((acc, port, portIndex) => {
|
|
791
977
|
if (!acc[port.key]) acc[port.key] = null
|
|
792
978
|
|
|
793
979
|
let sourceId
|
|
794
980
|
const sourceNode = port.source()
|
|
795
|
-
if (
|
|
796
|
-
|
|
797
|
-
|
|
981
|
+
if (
|
|
982
|
+
sourceNode?.__typename === 'DataCalculationData' ||
|
|
983
|
+
sourceNode?.__typename === 'DataCommand'
|
|
984
|
+
) {
|
|
985
|
+
sourceId = getNodeId(sourceNode, `input port index: ${portIndex}`)
|
|
986
|
+
}
|
|
798
987
|
|
|
799
988
|
if (!sourceId) return acc
|
|
800
989
|
if (!acc[port.key]) acc[port.key] = []
|
|
@@ -808,14 +997,17 @@ export const compile = async (app: Application) => {
|
|
|
808
997
|
}, {})
|
|
809
998
|
|
|
810
999
|
const generateOutputPorts = (outputs) =>
|
|
811
|
-
outputs.reduce((acc, port) => {
|
|
1000
|
+
outputs.reduce((acc, port, portIndex) => {
|
|
812
1001
|
if (!acc[port.key]) acc[port.key] = null
|
|
813
1002
|
|
|
814
1003
|
let targetId
|
|
815
1004
|
const targetNode = port.target()
|
|
816
|
-
if (
|
|
817
|
-
|
|
818
|
-
|
|
1005
|
+
if (
|
|
1006
|
+
targetNode?.__typename === 'DataCalculationData' ||
|
|
1007
|
+
targetNode?.__typename === 'DataCommand'
|
|
1008
|
+
) {
|
|
1009
|
+
targetId = getNodeId(targetNode, `output port index: ${portIndex}`)
|
|
1010
|
+
}
|
|
819
1011
|
|
|
820
1012
|
if (!targetId) return acc
|
|
821
1013
|
if (!acc[port.key]) acc[port.key] = []
|
|
@@ -827,16 +1019,10 @@ export const compile = async (app: Application) => {
|
|
|
827
1019
|
return acc
|
|
828
1020
|
}, {})
|
|
829
1021
|
|
|
830
|
-
|
|
831
|
-
if (node.__typename === 'DataCalculationData') return node.data().id
|
|
832
|
-
if (node.__typename === 'DataCommand') return node.id
|
|
833
|
-
throw new Error(`Invalid node: ${JSON.stringify(node)}`)
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
calc.map = mapCalc.nodes.reduce((acc, node) => {
|
|
1022
|
+
calc.map = mapCalc.nodes.reduce((acc, node, nodeIndex) => {
|
|
837
1023
|
if (node.__typename === 'DataCalculationData') {
|
|
838
1024
|
const dataNode = node as DataCalculationData
|
|
839
|
-
acc[getNodeId(dataNode)] = {
|
|
1025
|
+
acc[getNodeId(dataNode, 'data node', nodeIndex)] = {
|
|
840
1026
|
title: dataNode.title,
|
|
841
1027
|
description: dataNode.description,
|
|
842
1028
|
type: 'data-node',
|
|
@@ -861,7 +1047,7 @@ export const compile = async (app: Application) => {
|
|
|
861
1047
|
(input.source()?.__typename === 'DataCalculationData' ||
|
|
862
1048
|
input.source()?.__typename === 'DataCommand'),
|
|
863
1049
|
)
|
|
864
|
-
acc[getNodeId(commandNode)] = {
|
|
1050
|
+
acc[getNodeId(commandNode, 'command node', nodeIndex)] = {
|
|
865
1051
|
title: commandNode.title,
|
|
866
1052
|
description: commandNode.description,
|
|
867
1053
|
type: `command-node-${type}`,
|
|
@@ -879,11 +1065,11 @@ export const compile = async (app: Application) => {
|
|
|
879
1065
|
return acc
|
|
880
1066
|
}, {})
|
|
881
1067
|
calc.editor_info = mapCalc.editorInfo.reduce((acc, editorInfo) => {
|
|
882
|
-
acc[getNodeId(editorInfo.node)] = {
|
|
1068
|
+
acc[getNodeId(editorInfo.node, 'editor info node')] = {
|
|
883
1069
|
position: editorInfo.position,
|
|
884
1070
|
points: editorInfo.points.reduce((pointsAcc, point) => {
|
|
885
|
-
const sourceId = getNodeId(point.source)
|
|
886
|
-
const targetId = getNodeId(point.target)
|
|
1071
|
+
const sourceId = getNodeId(point.source, 'editor info point source')
|
|
1072
|
+
const targetId = getNodeId(point.target, 'editor info point target')
|
|
887
1073
|
const key = `${sourceId}-${point.sourceOutputKey}-${targetId}-${point.targetInputKey}`
|
|
888
1074
|
pointsAcc[key] = point.positions
|
|
889
1075
|
return pointsAcc
|
|
@@ -909,7 +1095,7 @@ export const compile = async (app: Application) => {
|
|
|
909
1095
|
},
|
|
910
1096
|
comment: true,
|
|
911
1097
|
})
|
|
912
|
-
} catch
|
|
1098
|
+
} catch {
|
|
913
1099
|
code = scriptCalc.code || ''
|
|
914
1100
|
}
|
|
915
1101
|
calc.script_config = {
|
|
@@ -918,20 +1104,47 @@ export const compile = async (app: Application) => {
|
|
|
918
1104
|
enable_async: scriptCalc.enableAsync,
|
|
919
1105
|
trigger_mode: scriptCalc.triggerMode,
|
|
920
1106
|
inputs: scriptCalc.inputs.reduce((acc, input) => {
|
|
921
|
-
|
|
1107
|
+
const inputId = assertEntryId(
|
|
1108
|
+
input.data()?.id,
|
|
1109
|
+
'PROPERTY_BANK_DATA_NODE',
|
|
1110
|
+
`(data calc: ${dataCalcId}, script input: ${input.key}, subspace: ${subspaceId})`,
|
|
1111
|
+
)
|
|
1112
|
+
acc[inputId] = input.key
|
|
922
1113
|
return acc
|
|
923
1114
|
}, {}),
|
|
924
1115
|
disabled_triggers: scriptCalc.inputs.reduce((acc, input) => {
|
|
925
|
-
|
|
1116
|
+
const inputId = assertEntryId(
|
|
1117
|
+
input.data()?.id,
|
|
1118
|
+
'PROPERTY_BANK_DATA_NODE',
|
|
1119
|
+
`(data calc: ${dataCalcId}, script trigger input: ${input.key}, subspace: ${subspaceId})`,
|
|
1120
|
+
)
|
|
1121
|
+
acc[inputId] = !input.trigger
|
|
926
1122
|
return acc
|
|
927
1123
|
}, {}),
|
|
928
|
-
output: scriptCalc.output
|
|
1124
|
+
output: scriptCalc.output
|
|
1125
|
+
? assertEntryId(
|
|
1126
|
+
scriptCalc.output()?.id,
|
|
1127
|
+
'PROPERTY_BANK_DATA_NODE',
|
|
1128
|
+
`(data calc: ${dataCalcId}, script output, subspace: ${subspaceId})`,
|
|
1129
|
+
)
|
|
1130
|
+
: undefined,
|
|
929
1131
|
outputs: scriptCalc.outputs.reduce((acc, output) => {
|
|
930
1132
|
if (!acc[output.key]) acc[output.key] = []
|
|
931
|
-
|
|
1133
|
+
const outputId = assertEntryId(
|
|
1134
|
+
output.data()?.id,
|
|
1135
|
+
'PROPERTY_BANK_DATA_NODE',
|
|
1136
|
+
`(data calc: ${dataCalcId}, script outputs key: ${output.key}, subspace: ${subspaceId})`,
|
|
1137
|
+
)
|
|
1138
|
+
acc[output.key].push(outputId)
|
|
932
1139
|
return acc
|
|
933
1140
|
}, {}),
|
|
934
|
-
error: scriptCalc.error
|
|
1141
|
+
error: scriptCalc.error
|
|
1142
|
+
? assertEntryId(
|
|
1143
|
+
scriptCalc.error()?.id,
|
|
1144
|
+
'PROPERTY_BANK_DATA_NODE',
|
|
1145
|
+
`(data calc: ${dataCalcId}, script error output, subspace: ${subspaceId})`,
|
|
1146
|
+
)
|
|
1147
|
+
: undefined,
|
|
935
1148
|
}
|
|
936
1149
|
|
|
937
1150
|
Object.assign(
|
|
@@ -941,25 +1154,32 @@ export const compile = async (app: Application) => {
|
|
|
941
1154
|
}),
|
|
942
1155
|
)
|
|
943
1156
|
}
|
|
944
|
-
map[
|
|
1157
|
+
map[dataCalcId] = calc
|
|
945
1158
|
return map
|
|
946
1159
|
}, {}),
|
|
947
1160
|
action_map: subspace.actions || undefined,
|
|
948
1161
|
event_map: compileEvents('', subspace.events || {}, {
|
|
949
1162
|
camelCase: false,
|
|
950
|
-
errorReference: `(subspace ${
|
|
1163
|
+
errorReference: `(subspace ${subspaceId})`,
|
|
951
1164
|
}),
|
|
952
1165
|
routing: subspace.dataRouting.reduce((acc, data, index) => {
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
1166
|
+
const dataId = assertEntryId(
|
|
1167
|
+
data?.id,
|
|
1168
|
+
'PROPERTY_BANK_DATA_NODE',
|
|
1169
|
+
`(data routing index: ${index}, subspace ${subspaceId})`,
|
|
1170
|
+
)
|
|
1171
|
+
acc[dataId] = { enabled_routing: true }
|
|
956
1172
|
return acc
|
|
957
1173
|
}, {}),
|
|
958
1174
|
...compileModule(subspace),
|
|
959
1175
|
}
|
|
960
1176
|
return subspaceMap
|
|
961
1177
|
}, {}),
|
|
962
|
-
root_subspace_id:
|
|
1178
|
+
root_subspace_id: assertEntryId(
|
|
1179
|
+
app.rootSubspace?.id,
|
|
1180
|
+
'SUBSPACE',
|
|
1181
|
+
'(application root subspace)',
|
|
1182
|
+
),
|
|
963
1183
|
fonts: app.fonts,
|
|
964
1184
|
...compileApplicationSettings(app.settings),
|
|
965
1185
|
// Use typed automationMap if available, otherwise fall back to TEMP metadata
|
|
@@ -969,6 +1189,7 @@ export const compile = async (app: Application) => {
|
|
|
969
1189
|
automation_map: app.automationMap
|
|
970
1190
|
? compileAutomation(app.automationMap)
|
|
971
1191
|
: app.metadata?.TEMP_automation_map || {},
|
|
1192
|
+
update_timestamp: timestamp,
|
|
972
1193
|
}
|
|
973
1194
|
return config
|
|
974
1195
|
}
|