intelligent-system-design-language 0.3.21 → 0.3.23

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.
Files changed (116) hide show
  1. package/.claude/agents/langium-language-designer.md +38 -38
  2. package/.claude/agents/typescript-vscode-expert.md +29 -29
  3. package/.claude/agents/ui-ux-designer.md +36 -36
  4. package/.claude/settings.local.json +33 -33
  5. package/.idea/inspectionProfiles/Project_Default.xml +6 -6
  6. package/.idea/isdl.iml +13 -13
  7. package/.idea/modules.xml +8 -8
  8. package/.idea/vcs.xml +6 -6
  9. package/.idea/watcherTasks.xml +3 -3
  10. package/.vscodeignore +18 -18
  11. package/LICENSE +673 -673
  12. package/README.md +86 -86
  13. package/bin/cli.js +4 -4
  14. package/bin/lsp.js +8 -8
  15. package/out/_backgrounds.scss +91 -91
  16. package/out/_handlebars.scss +497 -497
  17. package/out/_isdlStyles.scss +1444 -1381
  18. package/out/_vuetifyOverrides.scss +425 -425
  19. package/out/_vuetifyStyles.scss +31957 -31957
  20. package/out/cli/components/_backgrounds.scss +91 -91
  21. package/out/cli/components/_handlebars.scss +497 -497
  22. package/out/cli/components/_isdlStyles.scss +1444 -1381
  23. package/out/cli/components/_vuetifyOverrides.scss +425 -425
  24. package/out/cli/components/_vuetifyStyles.scss +31957 -31957
  25. package/out/cli/components/active-effect-sheet-generator.js +453 -453
  26. package/out/cli/components/chat-card-generator.js +654 -651
  27. package/out/cli/components/chat-card-generator.js.map +1 -1
  28. package/out/cli/components/css-generator.js +4 -4
  29. package/out/cli/components/damage-roll-generator.js +160 -160
  30. package/out/cli/components/datamodel-generator.js +264 -257
  31. package/out/cli/components/datamodel-generator.js.map +1 -1
  32. package/out/cli/components/derived-data-generator.js +923 -923
  33. package/out/cli/components/hotbar-drop-hook-generator.js +82 -82
  34. package/out/cli/components/init-hook-generator.js +495 -495
  35. package/out/cli/components/language-generator.js +1 -1
  36. package/out/cli/components/language-generator.js.map +1 -1
  37. package/out/cli/components/measured-template-preview.js +221 -221
  38. package/out/cli/components/method-generator.js +979 -887
  39. package/out/cli/components/method-generator.js.map +1 -1
  40. package/out/cli/components/ready-hook-generator.js +404 -404
  41. package/out/cli/components/token-generator.js +116 -116
  42. package/out/cli/components/vue/base-components/vue-attribute.js +138 -138
  43. package/out/cli/components/vue/base-components/vue-boolean.js +64 -64
  44. package/out/cli/components/vue/base-components/vue-calculator.js +93 -93
  45. package/out/cli/components/vue/base-components/vue-damage-application.js +356 -356
  46. package/out/cli/components/vue/base-components/vue-damage-bonuses.js +165 -165
  47. package/out/cli/components/vue/base-components/vue-damage-resistances.js +196 -196
  48. package/out/cli/components/vue/base-components/vue-damage-track.js +121 -121
  49. package/out/cli/components/vue/base-components/vue-date-time.js +42 -42
  50. package/out/cli/components/vue/base-components/vue-dice.js +98 -98
  51. package/out/cli/components/vue/base-components/vue-die.js +73 -73
  52. package/out/cli/components/vue/base-components/vue-document-choice.js +149 -149
  53. package/out/cli/components/vue/base-components/vue-document-choices.js +179 -179
  54. package/out/cli/components/vue/base-components/vue-document-link.js +60 -60
  55. package/out/cli/components/vue/base-components/vue-extended-choice.js +88 -88
  56. package/out/cli/components/vue/base-components/vue-inventory.js +519 -519
  57. package/out/cli/components/vue/base-components/vue-macro-choice.js +138 -138
  58. package/out/cli/components/vue/base-components/vue-measured-template.js +530 -530
  59. package/out/cli/components/vue/base-components/vue-money.js +483 -483
  60. package/out/cli/components/vue/base-components/vue-number.js +174 -174
  61. package/out/cli/components/vue/base-components/vue-paperdoll.js +43 -43
  62. package/out/cli/components/vue/base-components/vue-parent-property-reference.js +76 -76
  63. package/out/cli/components/vue/base-components/vue-prosemirror.js +18 -18
  64. package/out/cli/components/vue/base-components/vue-resource.js +136 -136
  65. package/out/cli/components/vue/base-components/vue-roll-visualizer.js +286 -109
  66. package/out/cli/components/vue/base-components/vue-roll-visualizer.js.map +1 -1
  67. package/out/cli/components/vue/base-components/vue-self-property-reference.js +62 -62
  68. package/out/cli/components/vue/base-components/vue-string-choice.js +98 -98
  69. package/out/cli/components/vue/base-components/vue-string-choices.js +203 -203
  70. package/out/cli/components/vue/base-components/vue-string.js +60 -60
  71. package/out/cli/components/vue/base-components/vue-text-field.js +53 -53
  72. package/out/cli/components/vue/base-components/vue-tracker.js +431 -431
  73. package/out/cli/components/vue/vue-action-component-generator.js +64 -64
  74. package/out/cli/components/vue/vue-active-effect-sheet-generator.js +856 -856
  75. package/out/cli/components/vue/vue-datatable-sheet-class-generator.js +292 -292
  76. package/out/cli/components/vue/vue-datatable2-component-generator.js +824 -824
  77. package/out/cli/components/vue/vue-document-creation-app.js +121 -121
  78. package/out/cli/components/vue/vue-document-creation-sheet.js +94 -94
  79. package/out/cli/components/vue/vue-generator.js +40 -40
  80. package/out/cli/components/vue/vue-mixin.js +296 -296
  81. package/out/cli/components/vue/vue-pinned-datatable-component-generator.js +260 -260
  82. package/out/cli/components/vue/vue-prompt-generator.js +91 -76
  83. package/out/cli/components/vue/vue-prompt-generator.js.map +1 -1
  84. package/out/cli/components/vue/vue-prompt-sheet-class-generator.js +317 -317
  85. package/out/cli/components/vue/vue-sheet-application-generator.js +1177 -1167
  86. package/out/cli/components/vue/vue-sheet-application-generator.js.map +1 -1
  87. package/out/cli/components/vue/vue-sheet-class-generator.js +510 -510
  88. package/out/cli/generator.js +438 -433
  89. package/out/cli/generator.js.map +1 -1
  90. package/out/extension/github/githubAuthProvider.js +71 -29
  91. package/out/extension/github/githubAuthProvider.js.map +1 -1
  92. package/out/extension/github/githubGistManager.js +4 -3
  93. package/out/extension/github/githubGistManager.js.map +1 -1
  94. package/out/extension/github/githubManager.js +40 -38
  95. package/out/extension/github/githubManager.js.map +1 -1
  96. package/out/extension/github/githubQuickActions.js +120 -120
  97. package/out/extension/github/system-workflow.yml +47 -47
  98. package/out/extension/main.cjs +909 -532
  99. package/out/extension/main.cjs.map +3 -3
  100. package/out/extension/package.json +419 -419
  101. package/out/language/generated/ast.js +51 -2
  102. package/out/language/generated/ast.js.map +1 -1
  103. package/out/language/generated/grammar.js +14240 -13991
  104. package/out/language/generated/grammar.js.map +1 -1
  105. package/out/language/intelligent-system-design-language-validator.js +32 -2
  106. package/out/language/intelligent-system-design-language-validator.js.map +1 -1
  107. package/out/language/isdl-scope-provider.js +14 -1
  108. package/out/language/isdl-scope-provider.js.map +1 -1
  109. package/out/language/main.cjs +913 -569
  110. package/out/language/main.cjs.map +3 -3
  111. package/out/package.json +419 -419
  112. package/out/progressbar.min.js +6 -6
  113. package/out/styles.scss +762 -747
  114. package/out/test/validating/diagnostics.test.js +40 -0
  115. package/out/test/validating/diagnostics.test.js.map +1 -1
  116. package/package.json +419 -419
@@ -1,8 +1,495 @@
1
1
  import { isRollParam, isTypeParam, } from '../../language/generated/ast.js';
2
- import { isReturnExpression, isAssignment, isBinaryExpression, isGroup, isVariableExpression, isLiteral, isRef, isNegExpression, isAccess, isMethodBlock, isIfStatement, isJS, isChatCard, isFleetingAccess, isHtmlExp, isRoll, isDamageRoll, isParentAccess, isParentAssignment, isVariableAssignment, isWhenExpressions, isShorthandComparisonExpression, isItemAccess, isExpression, isResourceExp, isBooleanExp, isSelfMethod, isAttributeExp, isArrayExpression, isEach, isParameter, isPrompt, isLabelParam, isTargetParam, IntelligentSystemDesignLanguageTerminals, isMathExpression, isMathEmptyExpression, isMathSingleExpression, isMathParamExpression, isInitiativeProperty, isStatusProperty, isUpdate, isUpdateParent, isUpdateSelf, isParentTypeCheckExpression, isParentPropertyRefExp, isSelfPropertyRefExp, isLogExpression, isTrackerExp, isVisibilityValue, isFunctionCall, isAction, isDocument, isIncrementDecrementAssignment, isQuickModifyAssignment, isVariableIncrementDecrementAssignment, isVariableQuickModifyAssignment, isParentIncrementDecrementAssignment, isParentQuickModifyAssignment, isLocationParam, isWidthParam, isHeightParam, isNumberRange, isTargetTypeCheckExpression, isTargetAccess, isTargetIncrementDecrementAssignment, isTargetQuickModifyAssignment, isTargetAssignment, isWait, isPlayAudio, isPlayAudioFile, isPlayAudioVolume, isDieField, isTimeLimitParam, isCombatMethods, isCombatProperty, isUserProperty, isMacroExecute, isMeasuredTemplateField, isStringChoiceField, isDamageTypeChoiceField, isDiceField, isDieChoicesParam, isDocumentChoicesExp, isDocumentChoiceExp, isTableField, isInventoryField, isProperty } from "../../language/generated/ast.js";
2
+ import { isReturnExpression, isAssignment, isBinaryExpression, isGroup, isVariableExpression, isLiteral, isRef, isNegExpression, isAccess, isMethodBlock, isIfStatement, isJS, isChatCard, isFleetingAccess, isHtmlExp, isRoll, isDamageRoll, isParentAccess, isParentAssignment, isVariableAssignment, isWhenExpressions, isShorthandComparisonExpression, isItemAccess, isExpression, isResourceExp, isBooleanExp, isSelfMethod, isAttributeExp, isArrayExpression, isEach, isParameter, isPrompt, isLabelParam, isTargetParam, IntelligentSystemDesignLanguageTerminals, isMathExpression, isMathEmptyExpression, isMathSingleExpression, isMathParamExpression, isInitiativeProperty, isStatusProperty, isUpdate, isUpdateParent, isUpdateSelf, isParentTypeCheckExpression, isParentPropertyRefExp, isSelfPropertyRefExp, isLogExpression, isTrackerExp, isVisibilityValue, isFunctionCall, isAction, isDocument, isIncrementDecrementAssignment, isQuickModifyAssignment, isVariableIncrementDecrementAssignment, isVariableQuickModifyAssignment, isParentIncrementDecrementAssignment, isParentQuickModifyAssignment, isLocationParam, isWidthParam, isHeightParam, isNumberRange, isTargetTypeCheckExpression, isTargetAccess, isTargetIncrementDecrementAssignment, isTargetQuickModifyAssignment, isTargetAssignment, isWait, isPlayAudio, isPlayAudioFile, isPlayAudioVolume, isDieField, isTimeLimitParam, isCombatMethods, isCombatProperty, isUserProperty, isMacroExecute, isMeasuredTemplateField, isStringChoiceField, isDamageTypeChoiceField, isDiceField, isDieChoicesParam, isDocumentChoicesExp, isDocumentChoiceExp, isTableField, isInventoryField, isProperty, isRollVisualizerValueParam, isPromptInputAccess } from "../../language/generated/ast.js";
3
3
  import { expandToNode, joinToNode } from 'langium/generate';
4
4
  import { getParentDocument, getPromptRegistryKey, getPromptVariable, getSystemPath, getTargetDocument, toMachineIdentifier } from './utils.js';
5
5
  import { AstUtils } from 'langium';
6
+ // Module-scoped copy used by the lifted translateDiceParts/translateDiceData.
7
+ // (translateExpression keeps its own identical nested humanize for its other call sites.)
8
+ function humanize(string) {
9
+ if (string == undefined) {
10
+ return "";
11
+ }
12
+ // Turn TitleCase into Title Case
13
+ // Ensure first letter of the string is capitalized
14
+ string = string.charAt(0).toUpperCase() + string.slice(1);
15
+ return string.replace(/([a-z])([A-Z])/g, '$1 $2');
16
+ }
17
+ // Build the subproperty key for a fleeting access (e.g. `opts.Boons` -> "Boons" / "boons").
18
+ // Prompt results are resolved with lowercased field-name keys (the datamodel stores prompt
19
+ // fields lowercased), so subproperty access on a prompt-backed fleeting must lowercase to
20
+ // match -- otherwise `opts.Boons` reads `undefined`. Other fleetings (rolls, etc.) expose
21
+ // real JS properties whose case must be preserved (e.g. `amount.total`), so the gate matters.
22
+ function fleetingSubProperty(expression) {
23
+ var _a;
24
+ if (expression.subProperty == undefined)
25
+ return undefined;
26
+ return isPrompt((_a = expression.variable.ref) === null || _a === void 0 ? void 0 : _a.value) ? expression.subProperty.toLowerCase() : expression.subProperty;
27
+ }
28
+ export function translateDiceParts(expression, noLabels = false) {
29
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37;
30
+ console.log("Translating Dice Part: ", expression.$type);
31
+ if (isLiteral(expression)) {
32
+ if (typeof expression.val == "string") {
33
+ return expandToNode `
34
+ "${expression.val}"
35
+ `;
36
+ }
37
+ return expandToNode `
38
+ "${expression.val}"
39
+ `;
40
+ }
41
+ if (isRef(expression)) {
42
+ // If string or number, return the value
43
+ if (typeof expression.val == "string" || typeof expression.val == "number") {
44
+ return expandToNode `
45
+ "${expression.val}"
46
+ `;
47
+ }
48
+ if (expression.val.ref == undefined) {
49
+ return;
50
+ }
51
+ if (expression.subProperties != undefined && expression.subProperties.length > 0) {
52
+ const subLabel = noLabels ? "" : `[${humanize(expression.subProperties[0])}]`;
53
+ return expandToNode `
54
+ "@${(_a = expression.val.ref) === null || _a === void 0 ? void 0 : _a.name}${expression.subProperties[0].toLowerCase()}${subLabel}"
55
+ `;
56
+ }
57
+ console.log("Ref:", `${expression.val.$refText}`);
58
+ if (IntelligentSystemDesignLanguageTerminals.DICE.test(`${expression.val}`)) {
59
+ return expandToNode `
60
+ "${expression.val}"
61
+ `;
62
+ }
63
+ const refLabel = noLabels ? "" : `[${humanize((_c = (_b = expression.val.ref) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : expression.val.$refText)}]`;
64
+ return expandToNode `
65
+ "@${(_f = (_e = (_d = expression.val.ref) === null || _d === void 0 ? void 0 : _d.name) === null || _e === void 0 ? void 0 : _e.toLowerCase()) !== null && _f !== void 0 ? _f : expression.val.$refText}${refLabel}"
66
+ `;
67
+ }
68
+ if (isParentAccess(expression)) {
69
+ let path = (_j = (_h = (_g = expression.property) === null || _g === void 0 ? void 0 : _g.ref) === null || _h === void 0 ? void 0 : _h.name) !== null && _j !== void 0 ? _j : "";
70
+ let label = humanize((_m = (_l = (_k = expression.property) === null || _k === void 0 ? void 0 : _k.ref) === null || _l === void 0 ? void 0 : _l.name) !== null && _m !== void 0 ? _m : "");
71
+ const document = getParentDocument(expression);
72
+ if (document != undefined) {
73
+ path = `${document.name.toLowerCase()}${path}`;
74
+ label = `${humanize(document.name)} ${label}`;
75
+ }
76
+ // else if ( expression.propertyLookup != undefined ) {
77
+ // path = `${path}${expression.propertyLookup.ref?.name.toLowerCase()}`;
78
+ // label = `${label} \${context.object.system.${expression.propertyLookup.ref?.name.toLowerCase()}\}`;
79
+ // }
80
+ else {
81
+ path = `${path}${(_p = (_o = expression.property) === null || _o === void 0 ? void 0 : _o.ref) === null || _p === void 0 ? void 0 : _p.name.toLowerCase()}`;
82
+ label = `${label} ${humanize((_s = (_r = (_q = expression.property) === null || _q === void 0 ? void 0 : _q.ref) === null || _r === void 0 ? void 0 : _r.name) !== null && _s !== void 0 ? _s : "")}`;
83
+ }
84
+ for (const subProperty of (_t = expression.subProperties) !== null && _t !== void 0 ? _t : []) {
85
+ path = `${path}${subProperty}`;
86
+ label = `${label} ${humanize(subProperty)}`;
87
+ }
88
+ label = label.trim();
89
+ const parentLabelSuffix = noLabels ? "" : `[${label}]`;
90
+ return expandToNode `
91
+ \`@${path.replaceAll(".", "").toLowerCase()}${parentLabelSuffix}\`
92
+ `;
93
+ }
94
+ if (isTargetAccess(expression)) {
95
+ let path = (_w = (_v = (_u = expression.property) === null || _u === void 0 ? void 0 : _u.ref) === null || _v === void 0 ? void 0 : _v.name) !== null && _w !== void 0 ? _w : "";
96
+ let label = humanize((_z = (_y = (_x = expression.property) === null || _x === void 0 ? void 0 : _x.ref) === null || _y === void 0 ? void 0 : _y.name) !== null && _z !== void 0 ? _z : "");
97
+ const document = getTargetDocument(expression);
98
+ if (document != undefined) {
99
+ path = `${document.name.toLowerCase()}${path}`;
100
+ label = `${humanize(document.name)} ${label}`;
101
+ }
102
+ // else if ( expression.propertyLookup != undefined ) {
103
+ // path = `${path}${expression.propertyLookup.ref?.name.toLowerCase()}`;
104
+ // label = `${label} \${context.object.system.${expression.propertyLookup.ref?.name.toLowerCase()}\}`;
105
+ // }
106
+ else {
107
+ path = `${path}${(_1 = (_0 = expression.property) === null || _0 === void 0 ? void 0 : _0.ref) === null || _1 === void 0 ? void 0 : _1.name.toLowerCase()}`;
108
+ label = `${label} ${humanize((_4 = (_3 = (_2 = expression.property) === null || _2 === void 0 ? void 0 : _2.ref) === null || _3 === void 0 ? void 0 : _3.name) !== null && _4 !== void 0 ? _4 : "")}`;
109
+ }
110
+ for (const subProperty of (_5 = expression.subProperties) !== null && _5 !== void 0 ? _5 : []) {
111
+ path = `${path}${subProperty}`;
112
+ label = `${label} ${humanize(subProperty)}`;
113
+ }
114
+ label = label.trim();
115
+ const targetLabelSuffix = noLabels ? "" : `[${label}]`;
116
+ return expandToNode `
117
+ \`@${path.replaceAll(".", "").toLowerCase()}${targetLabelSuffix}\`
118
+ `;
119
+ }
120
+ if (isPromptInputAccess(expression)) {
121
+ // `input.X` inside a prompt -> @<field> ref token (resolved at runtime from
122
+ // the live reactive prompt data, see translateDiceData).
123
+ let key = (_9 = (_8 = (_7 = (_6 = expression.property) === null || _6 === void 0 ? void 0 : _6.ref) === null || _7 === void 0 ? void 0 : _7.name) === null || _8 === void 0 ? void 0 : _8.toLowerCase()) !== null && _9 !== void 0 ? _9 : "";
124
+ for (const subProperty of (_10 = expression.subProperties) !== null && _10 !== void 0 ? _10 : []) {
125
+ key = `${key}.${subProperty}`;
126
+ }
127
+ return expandToNode `
128
+ \`@${key.replaceAll(".", "").toLowerCase()}\`
129
+ `;
130
+ }
131
+ if (isAccess(expression)) {
132
+ let path = (_18 = (_14 = (_13 = (_12 = (_11 = expression.property) === null || _11 === void 0 ? void 0 : _11.ref) === null || _12 === void 0 ? void 0 : _12.name) === null || _13 === void 0 ? void 0 : _13.toLowerCase()) !== null && _14 !== void 0 ? _14 : (_17 = (_16 = (_15 = expression.propertyLookup) === null || _15 === void 0 ? void 0 : _15.ref) === null || _16 === void 0 ? void 0 : _16.name) === null || _17 === void 0 ? void 0 : _17.toLowerCase()) !== null && _18 !== void 0 ? _18 : "";
133
+ let label = humanize((_24 = (_21 = (_20 = (_19 = expression.property) === null || _19 === void 0 ? void 0 : _19.ref) === null || _20 === void 0 ? void 0 : _20.name) !== null && _21 !== void 0 ? _21 : (_23 = (_22 = expression.propertyLookup) === null || _22 === void 0 ? void 0 : _22.ref) === null || _23 === void 0 ? void 0 : _23.name) !== null && _24 !== void 0 ? _24 : "");
134
+ // if (isDieField(expression.property?.ref)) {
135
+ // return expandToNode`
136
+ // \'@${path.replaceAll(".", "")}\'
137
+ // `;
138
+ // }
139
+ // Special handling for document choices - expand into individual terms
140
+ if (expression.property && isDocumentChoicesExp(expression.property.ref) && expression.subProperties && expression.subProperties.length > 0) {
141
+ const choicesFieldName = expression.property.ref.name.toLowerCase();
142
+ const subPropertyName = expression.subProperties[0].toLowerCase();
143
+ const subPropertyLabel = humanize(expression.subProperties[0]);
144
+ // Generate dynamic expansion for each document in the choices array
145
+ return expandToNode `
146
+ context.object.system.${choicesFieldName}.map((doc, index) => {
147
+ if (!doc || !doc.system) return '';
148
+ return '@' + doc.uuid.replace(/[^a-zA-Z0-9]/g, '').toLowerCase() + '${subPropertyName}[' + doc.name + ' ${subPropertyLabel}]';
149
+ }).filter(Boolean).join(' + ')
150
+ `;
151
+ }
152
+ if (isParentPropertyRefExp((_25 = expression.property) === null || _25 === void 0 ? void 0 : _25.ref)) {
153
+ label = `${label} - \${context.object.system.${(_27 = (_26 = expression.property) === null || _26 === void 0 ? void 0 : _26.ref) === null || _27 === void 0 ? void 0 : _27.name.toLowerCase()}.replace("system.", "").replaceAll(".", " ").titleCase()\}`;
154
+ }
155
+ else if (isSelfPropertyRefExp((_28 = expression.property) === null || _28 === void 0 ? void 0 : _28.ref)) {
156
+ label = `${label} - \${context.object.system.${(_30 = (_29 = expression.property) === null || _29 === void 0 ? void 0 : _29.ref) === null || _30 === void 0 ? void 0 : _30.name.toLowerCase()}.replace("system.", "").replaceAll(".", " ").titleCase()\}`;
157
+ }
158
+ else {
159
+ for (const subProperty of (_31 = expression.subProperties) !== null && _31 !== void 0 ? _31 : []) {
160
+ path = `${path}.${subProperty}`;
161
+ label = `${label} ${humanize(subProperty)}`;
162
+ }
163
+ }
164
+ console.log("Access:", path, label);
165
+ const accessLabelSuffix = noLabels ? "" : `[${label}]`;
166
+ return expandToNode `
167
+ \`@${path.replaceAll(".", "").toLowerCase()}${accessLabelSuffix}\`
168
+ `;
169
+ }
170
+ if (isFleetingAccess(expression)) {
171
+ // If this is a roll expression, just output it directly
172
+ if (isRoll((_32 = expression.variable.ref) === null || _32 === void 0 ? void 0 : _32.value)) {
173
+ return expandToNode `
174
+ ${(_33 = expression.variable.ref) === null || _33 === void 0 ? void 0 : _33.name}
175
+ `;
176
+ }
177
+ let path = (_35 = (_34 = expression.variable.ref) === null || _34 === void 0 ? void 0 : _34.name) !== null && _35 !== void 0 ? _35 : "";
178
+ let label = humanize((_37 = (_36 = expression.variable.ref) === null || _36 === void 0 ? void 0 : _36.name) !== null && _37 !== void 0 ? _37 : "");
179
+ if (expression.subProperty != undefined) {
180
+ path = `${path}.${fleetingSubProperty(expression)}`;
181
+ label = `${label} ${humanize(expression.subProperty)}`;
182
+ }
183
+ const fleetingLabelSuffix = noLabels ? "" : `[${label}]`;
184
+ return expandToNode `
185
+ \`@${path.replaceAll(".", "").toLowerCase()}${fleetingLabelSuffix}\`
186
+ `;
187
+ }
188
+ if (isBinaryExpression(expression)) {
189
+ return expandToNode `
190
+ ${translateDiceParts(expression.e1, noLabels)} + "${expression.op}" + ${translateDiceParts(expression.e2, noLabels)}
191
+ `;
192
+ }
193
+ if (isGroup(expression)) {
194
+ return expandToNode `
195
+ "(" + ${translateDiceParts(expression.ge, noLabels)} + ")"
196
+ `;
197
+ }
198
+ return;
199
+ }
200
+ function translateDisplayFormula(expression) {
201
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
202
+ if (isLiteral(expression)) {
203
+ return `${expression.val}`;
204
+ }
205
+ if (isGroup(expression)) {
206
+ const inner = translateDisplayFormula(expression.ge);
207
+ return inner != null ? `(${inner})` : undefined;
208
+ }
209
+ if (isBinaryExpression(expression)) {
210
+ const left = translateDisplayFormula(expression.e1);
211
+ const right = translateDisplayFormula(expression.e2);
212
+ return left != null && right != null ? `${left} ${expression.op} ${right}` : undefined;
213
+ }
214
+ if (isAccess(expression)) {
215
+ if (isParentPropertyRefExp((_a = expression.property) === null || _a === void 0 ? void 0 : _a.ref) || isSelfPropertyRefExp((_b = expression.property) === null || _b === void 0 ? void 0 : _b.ref)) {
216
+ return undefined;
217
+ }
218
+ let label = humanize((_h = (_e = (_d = (_c = expression.property) === null || _c === void 0 ? void 0 : _c.ref) === null || _d === void 0 ? void 0 : _d.name) !== null && _e !== void 0 ? _e : (_g = (_f = expression.propertyLookup) === null || _f === void 0 ? void 0 : _f.ref) === null || _g === void 0 ? void 0 : _g.name) !== null && _h !== void 0 ? _h : "");
219
+ for (const sub of (_j = expression.subProperties) !== null && _j !== void 0 ? _j : []) {
220
+ label += ` ${humanize(sub)}`;
221
+ }
222
+ return label.trim();
223
+ }
224
+ if (isParentAccess(expression)) {
225
+ return humanize((_m = (_l = (_k = expression.property) === null || _k === void 0 ? void 0 : _k.ref) === null || _l === void 0 ? void 0 : _l.name) !== null && _m !== void 0 ? _m : "");
226
+ }
227
+ if (isTargetAccess(expression)) {
228
+ return humanize((_q = (_p = (_o = expression.property) === null || _o === void 0 ? void 0 : _o.ref) === null || _p === void 0 ? void 0 : _p.name) !== null && _q !== void 0 ? _q : "");
229
+ }
230
+ if (isFleetingAccess(expression)) {
231
+ return humanize((_s = (_r = expression.variable.ref) === null || _r === void 0 ? void 0 : _r.name) !== null && _s !== void 0 ? _s : "");
232
+ }
233
+ return undefined;
234
+ }
235
+ export function translateDiceData(expression, entry, id, preDerived, generatingProperty) {
236
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61;
237
+ console.log("Translating Dice Data: ", expression.$type);
238
+ if (isParentAccess(expression)) {
239
+ let path = "context.object.parent.system";
240
+ let label = (_c = (_b = (_a = expression.property) === null || _a === void 0 ? void 0 : _a.ref) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : "";
241
+ console.log("Parent Access:", (_e = (_d = expression.property) === null || _d === void 0 ? void 0 : _d.ref) === null || _e === void 0 ? void 0 : _e.name);
242
+ const document = getParentDocument(expression);
243
+ if (document != undefined) {
244
+ path = `${path}.${(_h = (_g = (_f = expression.property) === null || _f === void 0 ? void 0 : _f.ref) === null || _g === void 0 ? void 0 : _g.name) === null || _h === void 0 ? void 0 : _h.toLowerCase()}`;
245
+ label = `${humanize(document.name)}.${label}`;
246
+ }
247
+ else {
248
+ path = `${path}.${(_l = (_k = (_j = expression.property) === null || _j === void 0 ? void 0 : _j.ref) === null || _k === void 0 ? void 0 : _k.name) === null || _l === void 0 ? void 0 : _l.toLowerCase()}`;
249
+ label = `${label}.${expression.property}`;
250
+ }
251
+ for (const subProperty of (_m = expression.subProperties) !== null && _m !== void 0 ? _m : []) {
252
+ path = `${path}.${subProperty}`;
253
+ label = `${label}.${subProperty}`;
254
+ }
255
+ return expandToNode `
256
+ "${label.replaceAll(".", "").toLowerCase()}": ${path}
257
+ `;
258
+ }
259
+ if (isTargetAccess(expression)) {
260
+ let path = "context.target.system";
261
+ let label = (_q = (_p = (_o = expression.property) === null || _o === void 0 ? void 0 : _o.ref) === null || _p === void 0 ? void 0 : _p.name) !== null && _q !== void 0 ? _q : "";
262
+ console.log("Target Access:", (_s = (_r = expression.property) === null || _r === void 0 ? void 0 : _r.ref) === null || _s === void 0 ? void 0 : _s.name);
263
+ const document = getTargetDocument(expression);
264
+ if (document != undefined) {
265
+ path = `${path}.${(_v = (_u = (_t = expression.property) === null || _t === void 0 ? void 0 : _t.ref) === null || _u === void 0 ? void 0 : _u.name) === null || _v === void 0 ? void 0 : _v.toLowerCase()}`;
266
+ label = `${humanize(document.name)}.${label}`;
267
+ }
268
+ else {
269
+ path = `${path}.${(_y = (_x = (_w = expression.property) === null || _w === void 0 ? void 0 : _w.ref) === null || _x === void 0 ? void 0 : _x.name) === null || _y === void 0 ? void 0 : _y.toLowerCase()}`;
270
+ label = `${label}.${expression.property}`;
271
+ }
272
+ for (const subProperty of (_z = expression.subProperties) !== null && _z !== void 0 ? _z : []) {
273
+ path = `${path}.${subProperty}`;
274
+ label = `${label}.${subProperty}`;
275
+ }
276
+ return expandToNode `
277
+ "${label.replaceAll(".", "").toLowerCase()}": ${path}
278
+ `;
279
+ }
280
+ if (isPromptInputAccess(expression)) {
281
+ // Resolve `input.X` to the LIVE reactive prompt path the input writes to:
282
+ // context.system.<action><variable>.<field>. Editing the input recomputes
283
+ // any binding that reads this (the rollVisualizer's :rollData).
284
+ const prompt = AstUtils.getContainerOfType(expression, isPrompt);
285
+ const variable = AstUtils.getContainerOfType(prompt === null || prompt === void 0 ? void 0 : prompt.$container, isVariableExpression);
286
+ const action = AstUtils.getContainerOfType(prompt === null || prompt === void 0 ? void 0 : prompt.$container, isAction);
287
+ const promptPath = `${(_0 = action === null || action === void 0 ? void 0 : action.name.toLowerCase()) !== null && _0 !== void 0 ? _0 : ""}${(_1 = variable === null || variable === void 0 ? void 0 : variable.name.toLowerCase()) !== null && _1 !== void 0 ? _1 : ""}`;
288
+ const ref = (_2 = expression.property) === null || _2 === void 0 ? void 0 : _2.ref;
289
+ const fieldName = (_4 = (_3 = ref === null || ref === void 0 ? void 0 : ref.name) === null || _3 === void 0 ? void 0 : _3.toLowerCase()) !== null && _4 !== void 0 ? _4 : "";
290
+ const base = `context.system.${promptPath}.${fieldName}`;
291
+ const hasSub = ((_6 = (_5 = expression.subProperties) === null || _5 === void 0 ? void 0 : _5.length) !== null && _6 !== void 0 ? _6 : 0) > 0;
292
+ // A dice prompt input is stored as {die, number} (its `.value` formula is derived
293
+ // data, which a prompt doesn't compute). Build the "<number><die>" formula string
294
+ // so it drops into the roll as e.g. "2d6"; reading both keeps it reactive.
295
+ if (isDiceField(ref) && !hasSub) {
296
+ return expandToNode `
297
+ "${fieldName}": \`\${${base}.number}\${${base}.die}\`
298
+ `;
299
+ }
300
+ // A die prompt input is stored as the die string itself (e.g. "d8").
301
+ if (isDieField(ref) && !hasSub) {
302
+ return expandToNode `
303
+ "${fieldName}": ${base}
304
+ `;
305
+ }
306
+ let key = fieldName;
307
+ let dataPath = base;
308
+ for (const subProperty of (_7 = expression.subProperties) !== null && _7 !== void 0 ? _7 : []) {
309
+ key = `${key}.${subProperty}`;
310
+ dataPath = `${dataPath}.${subProperty.toLowerCase()}`;
311
+ }
312
+ return expandToNode `
313
+ "${key.replaceAll(".", "").toLowerCase()}": ${dataPath} ?? 0
314
+ `;
315
+ }
316
+ if (isAccess(expression)) {
317
+ let path = "context.object.system";
318
+ let label = "";
319
+ console.log("Access:", (_9 = (_8 = expression.property) === null || _8 === void 0 ? void 0 : _8.ref) === null || _9 === void 0 ? void 0 : _9.name, (_11 = (_10 = expression.propertyLookup) === null || _10 === void 0 ? void 0 : _10.ref) === null || _11 === void 0 ? void 0 : _11.name);
320
+ if (expression.propertyLookup != undefined) {
321
+ path = `${path}[context.object.${getSystemPath(expression.propertyLookup.ref)}.toLowerCase()]`;
322
+ label = `${(_12 = expression.propertyLookup.ref) === null || _12 === void 0 ? void 0 : _12.name}`;
323
+ }
324
+ else if (isParentPropertyRefExp((_13 = expression.property) === null || _13 === void 0 ? void 0 : _13.ref)) {
325
+ path = `${path}.${(_15 = (_14 = expression.property) === null || _14 === void 0 ? void 0 : _14.ref) === null || _15 === void 0 ? void 0 : _15.name.toLowerCase()}`;
326
+ label = `${(_17 = (_16 = expression.property) === null || _16 === void 0 ? void 0 : _16.ref) === null || _17 === void 0 ? void 0 : _17.name}`;
327
+ let subProperty = "";
328
+ if (((_18 = expression.property) === null || _18 === void 0 ? void 0 : _18.ref.propertyType) == "resource" || ((_19 = expression.property) === null || _19 === void 0 ? void 0 : _19.ref.propertyType) == "tracker" || ((_20 = expression.property) === null || _20 === void 0 ? void 0 : _20.ref.propertyType) == "choice"
329
+ && (expression.subProperties == undefined || expression.subProperties.length == 0 || expression.subProperties[0] !== "value")) {
330
+ subProperty = "?.value";
331
+ }
332
+ if (((_21 = expression.property) === null || _21 === void 0 ? void 0 : _21.ref.propertyType) == "attribute" && (expression.subProperties == undefined || expression.subProperties.length == 0 || expression.subProperties[0] !== "mod")) {
333
+ subProperty = "?.mod";
334
+ }
335
+ console.log(label, path);
336
+ return expandToNode `
337
+ "${label.replaceAll(".", "").replaceAll(" ", "").toLowerCase()}": foundry.utils.getProperty(context.object.parent, ${path}.toLowerCase())${subProperty}
338
+ `;
339
+ }
340
+ else if (isSelfPropertyRefExp((_22 = expression.property) === null || _22 === void 0 ? void 0 : _22.ref)) {
341
+ // For self property references, we dynamically resolve the property path
342
+ let selfPropertyPath = `context.object.system.${(_24 = (_23 = expression.property) === null || _23 === void 0 ? void 0 : _23.ref) === null || _24 === void 0 ? void 0 : _24.name.toLowerCase()}`;
343
+ let subProperty = "";
344
+ label = `${(_26 = (_25 = expression.property) === null || _25 === void 0 ? void 0 : _25.ref) === null || _26 === void 0 ? void 0 : _26.name}`;
345
+ if (((_27 = expression.property) === null || _27 === void 0 ? void 0 : _27.ref.propertyType) == "resource" || ((_28 = expression.property) === null || _28 === void 0 ? void 0 : _28.ref.propertyType) == "tracker" || ((_29 = expression.property) === null || _29 === void 0 ? void 0 : _29.ref.propertyType) == "choice"
346
+ && (expression.subProperties == undefined || expression.subProperties.length == 0 || expression.subProperties[0] !== "value")) {
347
+ subProperty = "?.value";
348
+ }
349
+ if (((_30 = expression.property) === null || _30 === void 0 ? void 0 : _30.ref.propertyType) == "attribute" && (expression.subProperties == undefined || expression.subProperties.length == 0 || expression.subProperties[0] !== "mod")) {
350
+ subProperty = "?.mod";
351
+ }
352
+ console.log(label, selfPropertyPath);
353
+ return expandToNode `
354
+ "${label.replaceAll(".", "").replaceAll(" ", "").toLowerCase()}": foundry.utils.getProperty(context.object, "system." + ${selfPropertyPath}.toLowerCase())${subProperty}
355
+ `;
356
+ }
357
+ else {
358
+ // Special handling for document choices - expand into individual data entries
359
+ if (expression.property && isDocumentChoicesExp(expression.property.ref) && expression.subProperties && expression.subProperties.length > 0) {
360
+ const choicesFieldName = expression.property.ref.name.toLowerCase();
361
+ const subPropertyName = expression.subProperties[0].toLowerCase();
362
+ // Generate data for each document in the choices array
363
+ return expandToNode `
364
+ ...Object.fromEntries(context.object.system.${choicesFieldName}.map((doc, index) => {
365
+ if (!doc || !doc.system) return null;
366
+
367
+ // Determine the accessor based on property type
368
+ let accessor = '.${subPropertyName}';
369
+ ${isResourceExp((_31 = expression.property) === null || _31 === void 0 ? void 0 : _31.ref) || isTrackerExp((_32 = expression.property) === null || _32 === void 0 ? void 0 : _32.ref) ? `
370
+ if (doc.system.${subPropertyName} && typeof doc.system.${subPropertyName} === 'object' && 'value' in doc.system.${subPropertyName}) {
371
+ accessor = '.${subPropertyName}.value';
372
+ }` : ''}
373
+ ${isAttributeExp((_33 = expression.property) === null || _33 === void 0 ? void 0 : _33.ref) ? `
374
+ if (doc.system.${subPropertyName} && typeof doc.system.${subPropertyName} === 'object' && 'mod' in doc.system.${subPropertyName}) {
375
+ accessor = '.${subPropertyName}.mod';
376
+ }` : ''}
377
+
378
+ const key = doc.uuid.replace(/[^a-zA-Z0-9]/g, '').toLowerCase() + '${subPropertyName}';
379
+ const value = foundry.utils.getProperty(doc, 'system' + accessor) ?? 0;
380
+ return [key, value];
381
+ }).filter(Boolean))
382
+ `;
383
+ }
384
+ path = `${path}.${(_35 = (_34 = expression.property) === null || _34 === void 0 ? void 0 : _34.ref) === null || _35 === void 0 ? void 0 : _35.name.toLowerCase()}`;
385
+ label = `${(_37 = (_36 = expression.property) === null || _36 === void 0 ? void 0 : _36.ref) === null || _37 === void 0 ? void 0 : _37.name}`;
386
+ if ((isResourceExp((_38 = expression.property) === null || _38 === void 0 ? void 0 : _38.ref) || isTrackerExp((_39 = expression.property) === null || _39 === void 0 ? void 0 : _39.ref) || isStringChoiceField((_40 = expression.property) === null || _40 === void 0 ? void 0 : _40.ref))
387
+ && (expression.subProperties == undefined || expression.subProperties.length == 0 || expression.subProperties[0] == "value")) {
388
+ path = `${path}.value`;
389
+ }
390
+ if (isDiceField((_41 = expression.property) === null || _41 === void 0 ? void 0 : _41.ref) && (expression.subProperties == undefined || expression.subProperties.length == 0)) {
391
+ // For dice fields without subproperties, use the dice value
392
+ path = `${path}.value`;
393
+ }
394
+ if (isDieField((_42 = expression.property) === null || _42 === void 0 ? void 0 : _42.ref)) {
395
+ // For die fields, the value is just the die size (e.g., "d6"), we want to use the field name as label
396
+ // Don't change the path, just ensure the label is the field name
397
+ }
398
+ if (isAttributeExp((_43 = expression.property) === null || _43 === void 0 ? void 0 : _43.ref) && (expression.subProperties == undefined || expression.subProperties.length == 0 || expression.subProperties[0] !== "mod")) {
399
+ path = `${path}.mod`;
400
+ }
401
+ }
402
+ for (const subProperty of (_44 = expression.subProperties) !== null && _44 !== void 0 ? _44 : []) {
403
+ path = `${path}.${subProperty}`;
404
+ label = `${label} ${humanize(subProperty)}`;
405
+ }
406
+ console.log(label, path);
407
+ return expandToNode `
408
+ "${label.replaceAll(".", "").replaceAll(" ", "").toLowerCase()}": ${path} ?? 0
409
+ `;
410
+ }
411
+ if (isFleetingAccess(expression)) {
412
+ console.log("Fleeting Access:", (_45 = expression.variable.ref) === null || _45 === void 0 ? void 0 : _45.name);
413
+ // If this is a roll expression, just skip it
414
+ if (isRoll((_46 = expression.variable.ref) === null || _46 === void 0 ? void 0 : _46.value)) {
415
+ return;
416
+ }
417
+ let path = (_47 = expression.variable.ref) === null || _47 === void 0 ? void 0 : _47.name;
418
+ // The roll-data key must match the formula's `@`-reference, which collapses the
419
+ // dotted path and lowercases it (see translateDiceParts: `@answer.bonus` -> `@answerbonus`).
420
+ let label = (_50 = (_49 = (_48 = expression.variable.ref) === null || _48 === void 0 ? void 0 : _48.name) === null || _49 === void 0 ? void 0 : _49.toLowerCase()) !== null && _50 !== void 0 ? _50 : "";
421
+ if (expression.subProperty != undefined) {
422
+ path = `${path}.${fleetingSubProperty(expression)}`;
423
+ label = `${label}${expression.subProperty.toLowerCase()}`;
424
+ }
425
+ if (expression.arrayAccess != undefined) {
426
+ console.log("Array Access:", expression.arrayAccess.$type);
427
+ let accessExp = translateExpression(entry, id, expression.arrayAccess, preDerived, generatingProperty);
428
+ path = `${path}[${(_51 = accessExp === null || accessExp === void 0 ? void 0 : accessExp.contents) === null || _51 === void 0 ? void 0 : _51.toString()}]`;
429
+ }
430
+ console.log(label, path);
431
+ return expandToNode `
432
+ "${label}": ${path} ?? 0
433
+ `;
434
+ }
435
+ // if (isVariableAccess(expression)) {
436
+ // console.log("Variable Access:", expression.name);
437
+ // if (isParameter(expression)) {
438
+ // console.log("Parameter:", expression.name);
439
+ // return expandToNode`
440
+ // "${expression.name}": ${expression.name}
441
+ // `;
442
+ // }
443
+ // if (isVariableExpression(expression)) {
444
+ // console.log("Variable Expression:", expression.name);
445
+ // if (isExpression(expression.value)) {
446
+ // console.log("Expression:", expression.name);
447
+ // return translateDiceData(expression.value);
448
+ // }
449
+ // if (isPrompt(expression.value)) {
450
+ // console.log("Prompt:", expression.name);
451
+ // return expandToNode`
452
+ // "${expression.name}": ${expression.name}
453
+ // `;
454
+ // }
455
+ // }
456
+ // throw new Error("Variable Access not implemented");
457
+ // }
458
+ if (isRef(expression)) {
459
+ console.log("Ref:", (_52 = expression.val.ref) === null || _52 === void 0 ? void 0 : _52.name);
460
+ // If string or number, return the value
461
+ if (typeof expression.val == "string" || typeof expression.val == "number") {
462
+ console.log(expression.val);
463
+ return expandToNode `
464
+ "${expression.val}": ${expression.val}
465
+ `;
466
+ }
467
+ if (expression.val.ref == undefined) {
468
+ return;
469
+ }
470
+ if (expression.subProperties != undefined && expression.subProperties.length > 0) {
471
+ return expandToNode `
472
+ "${(_53 = expression.val.ref) === null || _53 === void 0 ? void 0 : _53.name.toLowerCase()}${expression.subProperties[0].toLowerCase()}": ${(_54 = expression.val.ref) === null || _54 === void 0 ? void 0 : _54.name}.${expression.subProperties[0].toLowerCase()} ?? 0
473
+ `;
474
+ }
475
+ console.log((_55 = expression.val.ref) === null || _55 === void 0 ? void 0 : _55.name, (_56 = expression.val.ref) === null || _56 === void 0 ? void 0 : _56.$type);
476
+ return expandToNode `
477
+ "${(_59 = (_58 = (_57 = expression.val.ref) === null || _57 === void 0 ? void 0 : _57.name) === null || _58 === void 0 ? void 0 : _58.toLowerCase()) !== null && _59 !== void 0 ? _59 : expression.val.$refText}": ${(_61 = (_60 = expression.val.ref) === null || _60 === void 0 ? void 0 : _60.name) !== null && _61 !== void 0 ? _61 : expression.val.$refText} ?? 0
478
+ `;
479
+ }
480
+ if (isBinaryExpression(expression)) {
481
+ const expressions = [expression.e1, expression.e2];
482
+ return expandToNode `
483
+ ${joinToNode(expressions, e => translateDiceData(e, entry, id, preDerived, generatingProperty), { separator: ", " })}
484
+ `;
485
+ }
486
+ if (isGroup(expression)) {
487
+ return expandToNode `
488
+ ${translateDiceData(expression.ge, entry, id, preDerived, generatingProperty)}
489
+ `;
490
+ }
491
+ return undefined;
492
+ }
6
493
  export function translateExpression(entry, id, expression, preDerived = false, generatingProperty = undefined) {
7
494
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2;
8
495
  function humanize(string) {
@@ -17,14 +504,14 @@ export function translateExpression(entry, id, expression, preDerived = false, g
17
504
  //console.log(preDerived, generatingProperty);
18
505
  function translateMethodExpression(expression) {
19
506
  //console.log("Translating Method Expression: " + expression.name);
20
- return expandToNode `
21
- ${expression.type == "fleeting" ? "let" : "const"} ${expression.name} = ${translateExpression(entry, id, expression.value, preDerived, generatingProperty)};
507
+ return expandToNode `
508
+ ${expression.type == "fleeting" ? "let" : "const"} ${expression.name} = ${translateExpression(entry, id, expression.value, preDerived, generatingProperty)};
22
509
  `;
23
510
  }
24
511
  function translateReturnExpression(expression) {
25
512
  //console.log("Translating Return Expression: " + expression.value);
26
- return expandToNode `
27
- return ${translateExpression(entry, id, expression.value, preDerived, generatingProperty)};
513
+ return expandToNode `
514
+ return ${translateExpression(entry, id, expression.value, preDerived, generatingProperty)};
28
515
  `;
29
516
  }
30
517
  function translateAssignmentExpression(expression) {
@@ -37,46 +524,46 @@ export function translateExpression(entry, id, expression, preDerived = false, g
37
524
  const fieldName = (_e = (_d = expression.property) === null || _d === void 0 ? void 0 : _d.ref) === null || _e === void 0 ? void 0 : _e.name.toLowerCase();
38
525
  const modifier = expression.term == "++" ? "+ 1" : "- 1";
39
526
  const readPath = getSystemPath((_f = expression.property) === null || _f === void 0 ? void 0 : _f.ref, expression.subProperties, (_g = expression.propertyLookup) === null || _g === void 0 ? void 0 : _g.ref);
40
- return expandToNode `
41
- const ${fieldName}DieChoices = ["d4","d6","d8","d10","d12","d20"];
42
- const ${fieldName}CurrentDieIndex = ${fieldName}DieChoices.indexOf(context.object.${readPath});
43
- if (${fieldName}CurrentDieIndex === -1) {
44
- console.error("Invalid die size: " + context.object.${readPath});
45
- update["${systemPath}"] = 'd4';
46
- return;
47
- }
48
- let ${fieldName}NewDieIndex = ${fieldName}CurrentDieIndex;
49
- ${fieldName}NewDieIndex = Math.max(0, Math.min(${fieldName}DieChoices.length - 1, ${fieldName}CurrentDieIndex ${modifier}));
50
- update["${systemPath}"] = ${fieldName}DieChoices[${fieldName}NewDieIndex];
527
+ return expandToNode `
528
+ const ${fieldName}DieChoices = ["d4","d6","d8","d10","d12","d20"];
529
+ const ${fieldName}CurrentDieIndex = ${fieldName}DieChoices.indexOf(context.object.${readPath});
530
+ if (${fieldName}CurrentDieIndex === -1) {
531
+ console.error("Invalid die size: " + context.object.${readPath});
532
+ update["${systemPath}"] = 'd4';
533
+ return;
534
+ }
535
+ let ${fieldName}NewDieIndex = ${fieldName}CurrentDieIndex;
536
+ ${fieldName}NewDieIndex = Math.max(0, Math.min(${fieldName}DieChoices.length - 1, ${fieldName}CurrentDieIndex ${modifier}));
537
+ update["${systemPath}"] = ${fieldName}DieChoices[${fieldName}NewDieIndex];
51
538
  `;
52
539
  }
53
540
  if ((isResourceExp((_h = expression.property) === null || _h === void 0 ? void 0 : _h.ref) || isTrackerExp((_j = expression.property) === null || _j === void 0 ? void 0 : _j.ref)) && (expression.subProperties == undefined || expression.subProperties.length == 0 || expression.subProperties[0] == "temp")) {
54
541
  // We need to check for temp first when decrementing
55
542
  const tempPath = `system.${(_l = (_k = expression.property) === null || _k === void 0 ? void 0 : _k.ref) === null || _l === void 0 ? void 0 : _l.name.toLowerCase()}.temp`;
56
543
  if (isIncrementDecrementAssignment(expression) && expression.term == "--") {
57
- return expandToNode `
58
- if ( context.object.${tempPath} > 0 ) {
59
- update["${tempPath}"] = context.object.${tempPath} - 1;
60
- }
61
- else {
62
- update["${systemPath}"] = context.object.${systemPath} - 1;
63
- }
544
+ return expandToNode `
545
+ if ( context.object.${tempPath} > 0 ) {
546
+ update["${tempPath}"] = context.object.${tempPath} - 1;
547
+ }
548
+ else {
549
+ update["${systemPath}"] = context.object.${systemPath} - 1;
550
+ }
64
551
  `;
65
552
  }
66
553
  if (isQuickModifyAssignment(expression) && expression.term == "-=") {
67
- return expandToNode `
68
- if ( context.object.${tempPath} > 0 ) {
69
- update["${tempPath}"] = context.object.${tempPath} - ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
70
-
71
- if ( update["${tempPath}"] < 0 ) {
72
- // Apply the remainder to the system property
73
- update["${systemPath}"] = context.object.${systemPath} + update["${tempPath}"];
74
- update["${tempPath}"] = 0;
75
- }
76
- }
77
- else {
78
- update["${systemPath}"] = context.object.${systemPath} - ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
79
- }
554
+ return expandToNode `
555
+ if ( context.object.${tempPath} > 0 ) {
556
+ update["${tempPath}"] = context.object.${tempPath} - ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
557
+
558
+ if ( update["${tempPath}"] < 0 ) {
559
+ // Apply the remainder to the system property
560
+ update["${systemPath}"] = context.object.${systemPath} + update["${tempPath}"];
561
+ update["${tempPath}"] = 0;
562
+ }
563
+ }
564
+ else {
565
+ update["${systemPath}"] = context.object.${systemPath} - ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
566
+ }
80
567
  `;
81
568
  }
82
569
  }
@@ -88,8 +575,8 @@ export function translateExpression(entry, id, expression, preDerived = false, g
88
575
  function generateModification() {
89
576
  if (isIncrementDecrementAssignment(expression)) {
90
577
  const modifier = expression.term == "++" ? "+" : "-";
91
- return expandToNode `
92
- ${propertyName}NewDieIndex = Math.max(0, Math.min(${propertyName}DieChoices.length - 1, ${propertyName}CurrentDieIndex ${modifier} 1));
578
+ return expandToNode `
579
+ ${propertyName}NewDieIndex = Math.max(0, Math.min(${propertyName}DieChoices.length - 1, ${propertyName}CurrentDieIndex ${modifier} 1));
93
580
  `;
94
581
  }
95
582
  if (isQuickModifyAssignment(expression)) {
@@ -111,25 +598,25 @@ export function translateExpression(entry, id, expression, preDerived = false, g
111
598
  modifier = "+";
112
599
  break;
113
600
  }
114
- return expandToNode `
115
- ${propertyName}NewDieIndex = Math.max(0, Math.min(${propertyName}DieChoices.length - 1, ${propertyName}CurrentDieIndex ${modifier} ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)}));
601
+ return expandToNode `
602
+ ${propertyName}NewDieIndex = Math.max(0, Math.min(${propertyName}DieChoices.length - 1, ${propertyName}CurrentDieIndex ${modifier} ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)}));
116
603
  `;
117
604
  }
118
- return expandToNode `
119
- ${propertyName}NewDieIndex = Math.max(0, Math.min(${propertyName}DieChoices.length - 1, ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)}));
605
+ return expandToNode `
606
+ ${propertyName}NewDieIndex = Math.max(0, Math.min(${propertyName}DieChoices.length - 1, ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)}));
120
607
  `;
121
608
  }
122
- return expandToNode `
123
- const ${propertyName}DieChoices = ${JSON.stringify(dieChoices)};
124
- const ${propertyName}CurrentDieIndex = ${propertyName}DieChoices.indexOf(context.object.${systemPath});
125
- if (${propertyName}CurrentDieIndex === -1) {
126
- console.error("Invalid die size: " + context.object.${systemPath});
127
- update["${systemPath}"] = '${dieChoices[0]}';
128
- return;
129
- }
130
- let ${propertyName}NewDieIndex = ${propertyName}CurrentDieIndex;
131
- ${generateModification()}
132
- update["${systemPath}"] = ${propertyName}DieChoices[${propertyName}NewDieIndex];
609
+ return expandToNode `
610
+ const ${propertyName}DieChoices = ${JSON.stringify(dieChoices)};
611
+ const ${propertyName}CurrentDieIndex = ${propertyName}DieChoices.indexOf(context.object.${systemPath});
612
+ if (${propertyName}CurrentDieIndex === -1) {
613
+ console.error("Invalid die size: " + context.object.${systemPath});
614
+ update["${systemPath}"] = '${dieChoices[0]}';
615
+ return;
616
+ }
617
+ let ${propertyName}NewDieIndex = ${propertyName}CurrentDieIndex;
618
+ ${generateModification()}
619
+ update["${systemPath}"] = ${propertyName}DieChoices[${propertyName}NewDieIndex];
133
620
  `;
134
621
  }
135
622
  // Special case for dice fields with .die subproperty - use die choice navigation
@@ -138,23 +625,23 @@ export function translateExpression(entry, id, expression, preDerived = false, g
138
625
  const fieldName = (_v = (_u = expression.property) === null || _u === void 0 ? void 0 : _u.ref) === null || _v === void 0 ? void 0 : _v.name.toLowerCase();
139
626
  const modifier = expression.term == "++" ? "+ 1" : "- 1";
140
627
  const readPath = getSystemPath((_w = expression.property) === null || _w === void 0 ? void 0 : _w.ref, expression.subProperties, (_x = expression.propertyLookup) === null || _x === void 0 ? void 0 : _x.ref);
141
- return expandToNode `
142
- const ${fieldName}DieChoices = ["d4","d6","d8","d10","d12","d20"];
143
- const ${fieldName}CurrentDieIndex = ${fieldName}DieChoices.indexOf(context.object.${readPath});
144
- if (${fieldName}CurrentDieIndex === -1) {
145
- console.error("Invalid die size: " + context.object.${readPath});
146
- update["${systemPath}"] = 'd4';
147
- return;
148
- }
149
- let ${fieldName}NewDieIndex = ${fieldName}CurrentDieIndex;
150
- ${fieldName}NewDieIndex = Math.max(0, Math.min(${fieldName}DieChoices.length - 1, ${fieldName}CurrentDieIndex ${modifier}));
151
- update["${systemPath}"] = ${fieldName}DieChoices[${fieldName}NewDieIndex];
628
+ return expandToNode `
629
+ const ${fieldName}DieChoices = ["d4","d6","d8","d10","d12","d20"];
630
+ const ${fieldName}CurrentDieIndex = ${fieldName}DieChoices.indexOf(context.object.${readPath});
631
+ if (${fieldName}CurrentDieIndex === -1) {
632
+ console.error("Invalid die size: " + context.object.${readPath});
633
+ update["${systemPath}"] = 'd4';
634
+ return;
635
+ }
636
+ let ${fieldName}NewDieIndex = ${fieldName}CurrentDieIndex;
637
+ ${fieldName}NewDieIndex = Math.max(0, Math.min(${fieldName}DieChoices.length - 1, ${fieldName}CurrentDieIndex ${modifier}));
638
+ update["${systemPath}"] = ${fieldName}DieChoices[${fieldName}NewDieIndex];
152
639
  `;
153
640
  }
154
641
  if (isIncrementDecrementAssignment(expression)) {
155
642
  const modifier = expression.term == "++" ? "+" : "-";
156
- return expandToNode `
157
- update["${systemPath}"] = context.object.${systemPath} ${modifier} 1;
643
+ return expandToNode `
644
+ update["${systemPath}"] = context.object.${systemPath} ${modifier} 1;
158
645
  `;
159
646
  }
160
647
  if (isQuickModifyAssignment(expression)) {
@@ -176,12 +663,12 @@ export function translateExpression(entry, id, expression, preDerived = false, g
176
663
  modifier = "+";
177
664
  break;
178
665
  }
179
- return expandToNode `
180
- update["${systemPath}"] = context.object.${systemPath} ${modifier} ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
666
+ return expandToNode `
667
+ update["${systemPath}"] = context.object.${systemPath} ${modifier} ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
181
668
  `;
182
669
  }
183
- return expandToNode `
184
- update["${systemPath}"] = ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
670
+ return expandToNode `
671
+ update["${systemPath}"] = ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
185
672
  `;
186
673
  }
187
674
  function translateVariableAssignment(expression) {
@@ -192,18 +679,18 @@ export function translateExpression(entry, id, expression, preDerived = false, g
192
679
  }
193
680
  // ++ or --
194
681
  if (isVariableIncrementDecrementAssignment(expression)) {
195
- return expandToNode `
196
- ${name}${expression.term};
682
+ return expandToNode `
683
+ ${name}${expression.term};
197
684
  `;
198
685
  }
199
686
  // +=, -=, *=, /=
200
687
  if (isVariableQuickModifyAssignment(expression)) {
201
- return expandToNode `
202
- ${name} ${expression.term} ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
688
+ return expandToNode `
689
+ ${name} ${expression.term} ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
203
690
  `;
204
691
  }
205
- return expandToNode `
206
- ${name} = ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
692
+ return expandToNode `
693
+ ${name} = ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
207
694
  `;
208
695
  }
209
696
  function translateParentAssignmentExpression(expression) {
@@ -212,8 +699,8 @@ export function translateExpression(entry, id, expression, preDerived = false, g
212
699
  let systemPath = getSystemPath((_a = expression.property) === null || _a === void 0 ? void 0 : _a.ref, expression.subProperties, (_b = expression.propertyLookup) === null || _b === void 0 ? void 0 : _b.ref, false, true);
213
700
  if (isParentIncrementDecrementAssignment(expression)) {
214
701
  const modifier = expression.term == "++" ? "+" : "-";
215
- return expandToNode `
216
- parentUpdate["${systemPath}"] = context.object.parent.${systemPath} ${modifier} 1;
702
+ return expandToNode `
703
+ parentUpdate["${systemPath}"] = context.object.parent.${systemPath} ${modifier} 1;
217
704
  `;
218
705
  }
219
706
  if (isParentQuickModifyAssignment(expression)) {
@@ -235,12 +722,12 @@ export function translateExpression(entry, id, expression, preDerived = false, g
235
722
  modifier = "+";
236
723
  break;
237
724
  }
238
- return expandToNode `
239
- parentUpdate["${systemPath}"] = context.object.parent.${systemPath} ${modifier} ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
725
+ return expandToNode `
726
+ parentUpdate["${systemPath}"] = context.object.parent.${systemPath} ${modifier} ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
240
727
  `;
241
728
  }
242
- return expandToNode `
243
- parentUpdate["${systemPath}"] = ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
729
+ return expandToNode `
730
+ parentUpdate["${systemPath}"] = ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
244
731
  `;
245
732
  }
246
733
  function translateTargetAssignmentExpression(expression) {
@@ -248,8 +735,8 @@ export function translateExpression(entry, id, expression, preDerived = false, g
248
735
  let systemPath = getSystemPath((_a = expression.property) === null || _a === void 0 ? void 0 : _a.ref, expression.subProperties, undefined, false, true);
249
736
  if (isTargetIncrementDecrementAssignment(expression)) {
250
737
  const modifier = expression.term == "++" ? "+" : "-";
251
- return expandToNode `
252
- targetUpdate["${systemPath}"] = context.target.${systemPath} ${modifier} 1;
738
+ return expandToNode `
739
+ targetUpdate["${systemPath}"] = context.target.${systemPath} ${modifier} 1;
253
740
  `;
254
741
  }
255
742
  if (isTargetQuickModifyAssignment(expression)) {
@@ -271,12 +758,12 @@ export function translateExpression(entry, id, expression, preDerived = false, g
271
758
  modifier = "+";
272
759
  break;
273
760
  }
274
- return expandToNode `
275
- targetUpdate["${systemPath}"] = context.target.${systemPath} ${modifier} ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
761
+ return expandToNode `
762
+ targetUpdate["${systemPath}"] = context.target.${systemPath} ${modifier} ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
276
763
  `;
277
764
  }
278
- return expandToNode `
279
- targetUpdate["${systemPath}"] = ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
765
+ return expandToNode `
766
+ targetUpdate["${systemPath}"] = ${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)};
280
767
  `;
281
768
  }
282
769
  function translateBinaryExpression(expression) {
@@ -306,26 +793,26 @@ export function translateExpression(entry, id, expression, preDerived = false, g
306
793
  console.log("Translating Literal Expression: " + expression.val);
307
794
  if (typeof expression.val == "string") {
308
795
  if (expression.val == "nothing") {
309
- return expandToNode `
310
- null
796
+ return expandToNode `
797
+ null
311
798
  `;
312
799
  }
313
800
  else if (expression.val == "true" || expression.val == "false") {
314
- return expandToNode `
315
- ${expression.val}
801
+ return expandToNode `
802
+ ${expression.val}
316
803
  `;
317
804
  }
318
805
  if (isInitiativeProperty(generatingProperty)) {
319
- return expandToNode `
320
- ${expression.val}
806
+ return expandToNode `
807
+ ${expression.val}
321
808
  `;
322
809
  }
323
- return expandToNode `
324
- "${expression.val}"
810
+ return expandToNode `
811
+ "${expression.val}"
325
812
  `;
326
813
  }
327
- return expandToNode `
328
- ${expression.val}
814
+ return expandToNode `
815
+ ${expression.val}
329
816
  `;
330
817
  }
331
818
  function translateReferenceExpression(expression) {
@@ -365,14 +852,14 @@ export function translateExpression(entry, id, expression, preDerived = false, g
365
852
  accessPath = `${accessPath}.total`;
366
853
  }
367
854
  console.log("Access Path: ", accessPath);
368
- return expandToNode `
369
- ${accessPath}
855
+ return expandToNode `
856
+ ${accessPath}
370
857
  `;
371
858
  }
372
859
  function translateGroupedExpression(expression) {
373
860
  //console.log("Translating Grouped Expression: " + expression.ge);
374
- return expandToNode `
375
- (${translateExpression(entry, id, expression.ge, preDerived, generatingProperty)})
861
+ return expandToNode `
862
+ (${translateExpression(entry, id, expression.ge, preDerived, generatingProperty)})
376
863
  `;
377
864
  }
378
865
  function translateNegatedExpression(expression) {
@@ -380,12 +867,12 @@ export function translateExpression(entry, id, expression, preDerived = false, g
380
867
  var _a;
381
868
  // If this is a boolean, we need to negate it differently
382
869
  if (isAccess(expression.ne) && isBooleanExp((_a = expression.ne.property) === null || _a === void 0 ? void 0 : _a.ref)) {
383
- return expandToNode `
384
- !${translateExpression(entry, id, expression.ne, preDerived, generatingProperty)}
870
+ return expandToNode `
871
+ !${translateExpression(entry, id, expression.ne, preDerived, generatingProperty)}
385
872
  `;
386
873
  }
387
- return expandToNode `
388
- -(${translateExpression(entry, id, expression.ne, preDerived, generatingProperty)})
874
+ return expandToNode `
875
+ -(${translateExpression(entry, id, expression.ne, preDerived, generatingProperty)})
389
876
  `;
390
877
  }
391
878
  function translateAccessExpression(expression, generatingProperty = undefined) {
@@ -404,8 +891,8 @@ export function translateExpression(entry, id, expression, preDerived = false, g
404
891
  break;
405
892
  }
406
893
  console.log("Access Name: ", accessName);
407
- return expandToNode `
408
- context.object.${accessName}
894
+ return expandToNode `
895
+ context.object.${accessName}
409
896
  `;
410
897
  }
411
898
  if (((_a = expression.property) === null || _a === void 0 ? void 0 : _a.ref) == undefined) {
@@ -416,20 +903,20 @@ export function translateExpression(entry, id, expression, preDerived = false, g
416
903
  if (generatingProperty && ((_c = expression.property) === null || _c === void 0 ? void 0 : _c.ref) == generatingProperty) {
417
904
  console.log("Generating self referencing Property Access: ", (_d = expression.property.ref) === null || _d === void 0 ? void 0 : _d.name);
418
905
  if (isInitiativeProperty(generatingProperty)) {
419
- return expandToNode `
420
- @system.${(_e = expression.property.ref) === null || _e === void 0 ? void 0 : _e.name.toLowerCase()}
906
+ return expandToNode `
907
+ @system.${(_e = expression.property.ref) === null || _e === void 0 ? void 0 : _e.name.toLowerCase()}
421
908
  `;
422
909
  }
423
910
  // Special case: For attribute self-references, use .value instead of .mod to avoid recursion
424
911
  if (isAttributeExp(generatingProperty)) {
425
912
  const systemPath = `system.${(_f = expression.property.ref) === null || _f === void 0 ? void 0 : _f.name.toLowerCase()}.value`;
426
- return expandToNode `
427
- ${systemPath}
913
+ return expandToNode `
914
+ ${systemPath}
428
915
  `;
429
916
  }
430
917
  const systemPath = getSystemPath((_g = expression.property) === null || _g === void 0 ? void 0 : _g.ref, expression.subProperties, generatingProperty);
431
- return expandToNode `
432
- ${systemPath}
918
+ return expandToNode `
919
+ ${systemPath}
433
920
  `;
434
921
  }
435
922
  // Parent/Self property references store a *path* to another property (e.g. a chosen parent
@@ -452,13 +939,13 @@ export function translateExpression(entry, id, expression, preDerived = false, g
452
939
  }
453
940
  if (isParentPropertyRefExp((_l = expression.property) === null || _l === void 0 ? void 0 : _l.ref)) {
454
941
  // Parent refs store a full path (e.g. "system.fight") resolved against the parent.
455
- return expandToNode `
456
- foundry.utils.getProperty(context.object.parent, context.object.system.${refName}.toLowerCase())${accessor}
942
+ return expandToNode `
943
+ foundry.utils.getProperty(context.object.parent, context.object.system.${refName}.toLowerCase())${accessor}
457
944
  `;
458
945
  }
459
946
  // Self refs store a property name resolved against this document under system.
460
- return expandToNode `
461
- foundry.utils.getProperty(context.object, "system." + context.object.system.${refName}.toLowerCase())${accessor}
947
+ return expandToNode `
948
+ foundry.utils.getProperty(context.object, "system." + context.object.system.${refName}.toLowerCase())${accessor}
462
949
  `;
463
950
  }
464
951
  let systemPath = getSystemPath((_m = expression.property) === null || _m === void 0 ? void 0 : _m.ref, expression.subProperties, expression);
@@ -468,24 +955,24 @@ export function translateExpression(entry, id, expression, preDerived = false, g
468
955
  }
469
956
  console.log("System Path: ", systemPath);
470
957
  if (isInitiativeProperty(generatingProperty)) {
471
- return expandToNode `
472
- @${systemPath}
958
+ return expandToNode `
959
+ @${systemPath}
473
960
  `;
474
961
  }
475
962
  if (isAction(generatingProperty)) {
476
- return expandToNode `
477
- context.object.${systemPath}
963
+ return expandToNode `
964
+ context.object.${systemPath}
478
965
  `;
479
966
  }
480
967
  // If accessing a property on a document choice, wrap with ?? 0 to handle missing documents
481
968
  const needsNullCoalescing = isDocumentChoiceExp((_o = expression.property) === null || _o === void 0 ? void 0 : _o.ref) && expression.subProperties && expression.subProperties.length > 0;
482
969
  if (needsNullCoalescing) {
483
- return expandToNode `
484
- (${systemPath} ?? 0)
970
+ return expandToNode `
971
+ (${systemPath} ?? 0)
485
972
  `;
486
973
  }
487
- return expandToNode `
488
- ${systemPath}
974
+ return expandToNode `
975
+ ${systemPath}
489
976
  `;
490
977
  }
491
978
  // function translateResourceAccessExpression(expression: ResourceAccess): CompositeGeneratorNode | undefined {
@@ -504,35 +991,35 @@ export function translateExpression(entry, id, expression, preDerived = false, g
504
991
  //console.log("Translating If Statement: ");
505
992
  var _a;
506
993
  function translateElseIfStatement(elif) {
507
- return expandToNode `
508
- else if (${translateExpression(entry, id, elif.expression, preDerived, generatingProperty)}) {
509
- ${translateBodyExpressionToJavascript(entry, id, elif.method.body, preDerived, generatingProperty)}
510
- }
994
+ return expandToNode `
995
+ else if (${translateExpression(entry, id, elif.expression, preDerived, generatingProperty)}) {
996
+ ${translateBodyExpressionToJavascript(entry, id, elif.method.body, preDerived, generatingProperty)}
997
+ }
511
998
  `;
512
999
  }
513
- return expandToNode `
514
- if (${translateExpression(entry, id, expression.expression, preDerived, generatingProperty)}) {
515
- ${translateBodyExpressionToJavascript(entry, id, expression.method.body, preDerived, generatingProperty)}
516
- }
517
- ${joinToNode(expression.elseIfs, translateElseIfStatement, { appendNewLineIfNotEmpty: true })}
518
- ${expression.elseMethod != undefined ? expandToNode `
519
- else {
520
- ${translateBodyExpressionToJavascript(entry, id, (_a = expression.elseMethod) === null || _a === void 0 ? void 0 : _a.body, preDerived, generatingProperty)}
521
- }
522
- `.appendNewLineIfNotEmpty() : ""}
1000
+ return expandToNode `
1001
+ if (${translateExpression(entry, id, expression.expression, preDerived, generatingProperty)}) {
1002
+ ${translateBodyExpressionToJavascript(entry, id, expression.method.body, preDerived, generatingProperty)}
1003
+ }
1004
+ ${joinToNode(expression.elseIfs, translateElseIfStatement, { appendNewLineIfNotEmpty: true })}
1005
+ ${expression.elseMethod != undefined ? expandToNode `
1006
+ else {
1007
+ ${translateBodyExpressionToJavascript(entry, id, (_a = expression.elseMethod) === null || _a === void 0 ? void 0 : _a.body, preDerived, generatingProperty)}
1008
+ }
1009
+ `.appendNewLineIfNotEmpty() : ""}
523
1010
  `;
524
1011
  }
525
1012
  function translateComparisonExpression(expression) {
526
1013
  var _a, _b, _c, _d, _e, _f;
527
1014
  console.log("Translating Comparison Expression: ");
528
1015
  if (isParentTypeCheckExpression(expression)) {
529
- return expandToNode `
530
- context.object.parent && context.object.parent.type == "${(_b = (_a = expression.document.ref) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.toLowerCase()}"
1016
+ return expandToNode `
1017
+ context.object.parent && context.object.parent.type == "${(_b = (_a = expression.document.ref) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.toLowerCase()}"
531
1018
  `;
532
1019
  }
533
1020
  if (isTargetTypeCheckExpression(expression)) {
534
- return expandToNode `
535
- context.target && context.target.type == "${(_d = (_c = expression.document.ref) === null || _c === void 0 ? void 0 : _c.name) === null || _d === void 0 ? void 0 : _d.toLowerCase()}"
1021
+ return expandToNode `
1022
+ context.target && context.target.type == "${(_d = (_c = expression.document.ref) === null || _c === void 0 ? void 0 : _c.name) === null || _d === void 0 ? void 0 : _d.toLowerCase()}"
536
1023
  `;
537
1024
  }
538
1025
  // If the term is "equals" or "==", we need to translate it to "===" in JavaScript
@@ -543,70 +1030,70 @@ export function translateExpression(entry, id, expression, preDerived = false, g
543
1030
  if (isShorthandComparisonExpression(expression)) {
544
1031
  console.log("Shorthand Comparison Expression: ", term);
545
1032
  if (term == "exists") {
546
- return expandToNode `
547
- ${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)} != undefined
1033
+ return expandToNode `
1034
+ ${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)} != undefined
548
1035
  `;
549
1036
  }
550
1037
  else if (term == "!exists") {
551
- return expandToNode `
552
- ${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)} == undefined
1038
+ return expandToNode `
1039
+ ${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)} == undefined
553
1040
  `;
554
1041
  }
555
1042
  else if (term == "isEmpty") {
556
- return expandToNode `
557
- (${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)})?.length === 0
1043
+ return expandToNode `
1044
+ (${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)})?.length === 0
558
1045
  `;
559
1046
  }
560
1047
  else if (term == "isNotEmpty") {
561
- return expandToNode `
562
- (${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)})?.length > 0
1048
+ return expandToNode `
1049
+ (${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)})?.length > 0
563
1050
  `;
564
1051
  }
565
- return expandToNode `
566
- ${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)} ${term}
1052
+ return expandToNode `
1053
+ ${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)} ${term}
567
1054
  `;
568
1055
  }
569
1056
  console.log("Comparison Expression: ", expression.e1.$type, term, expression.e2.$type);
570
1057
  if (term == "has") {
571
- return expandToNode `
572
- (${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)})?.includes(${translateExpression(entry, id, expression.e2, preDerived, generatingProperty)})
1058
+ return expandToNode `
1059
+ (${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)})?.includes(${translateExpression(entry, id, expression.e2, preDerived, generatingProperty)})
573
1060
  `;
574
1061
  }
575
1062
  if (term == "excludes") {
576
- return expandToNode `
577
- !(${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)})?.includes(${translateExpression(entry, id, expression.e2, preDerived, generatingProperty)})
1063
+ return expandToNode `
1064
+ !(${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)})?.includes(${translateExpression(entry, id, expression.e2, preDerived, generatingProperty)})
578
1065
  `;
579
1066
  }
580
1067
  if (term == "startsWith") {
581
- return expandToNode `
582
- (${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)})?.startsWith(${translateExpression(entry, id, expression.e2, preDerived, generatingProperty)})
1068
+ return expandToNode `
1069
+ (${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)})?.startsWith(${translateExpression(entry, id, expression.e2, preDerived, generatingProperty)})
583
1070
  `;
584
1071
  }
585
1072
  if (term == "endsWith") {
586
- return expandToNode `
587
- (${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)})?.endsWith(${translateExpression(entry, id, expression.e2, preDerived, generatingProperty)})
1073
+ return expandToNode `
1074
+ (${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)})?.endsWith(${translateExpression(entry, id, expression.e2, preDerived, generatingProperty)})
588
1075
  `;
589
1076
  }
590
- return expandToNode `
591
- ${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)} ${term} ${translateExpression(entry, id, expression.e2, preDerived, generatingProperty)}
1077
+ return expandToNode `
1078
+ ${translateExpression(entry, id, expression.e1, preDerived, generatingProperty)} ${term} ${translateExpression(entry, id, expression.e2, preDerived, generatingProperty)}
592
1079
  `;
593
1080
  }
594
1081
  if (expression == undefined) {
595
1082
  return;
596
1083
  }
597
1084
  if (typeof expression == "string" && expression == "nothing") {
598
- return expandToNode `
599
- null
1085
+ return expandToNode `
1086
+ null
600
1087
  `;
601
1088
  }
602
1089
  if (typeof expression == "string") {
603
- return expandToNode `
604
- "${expression}"
1090
+ return expandToNode `
1091
+ "${expression}"
605
1092
  `;
606
1093
  }
607
1094
  if (typeof expression == "number") {
608
- return expandToNode `
609
- ${expression}
1095
+ return expandToNode `
1096
+ ${expression}
610
1097
  `;
611
1098
  }
612
1099
  if (isMethodBlock(expression)) {
@@ -657,8 +1144,8 @@ export function translateExpression(entry, id, expression, preDerived = false, g
657
1144
  let systemPath = getSystemPath((_a = expression.property) === null || _a === void 0 ? void 0 : _a.ref, expression.subProperties, expression, true);
658
1145
  path = `${path}?.${systemPath}`;
659
1146
  console.log("Translating Parent Access Expression: ", path);
660
- return expandToNode `
661
- ${path} ?? 0
1147
+ return expandToNode `
1148
+ ${path} ?? 0
662
1149
  `;
663
1150
  }
664
1151
  if (isTargetAccess(expression)) {
@@ -666,8 +1153,8 @@ export function translateExpression(entry, id, expression, preDerived = false, g
666
1153
  let systemPath = getSystemPath((_b = expression.property) === null || _b === void 0 ? void 0 : _b.ref, expression.subProperties, undefined, true);
667
1154
  path = `${path}?.${systemPath}`;
668
1155
  console.log("Translating Target Access Expression: ", path);
669
- return expandToNode `
670
- ${path}
1156
+ return expandToNode `
1157
+ ${path}
671
1158
  `;
672
1159
  }
673
1160
  if (isItemAccess(expression)) {
@@ -689,8 +1176,8 @@ export function translateExpression(entry, id, expression, preDerived = false, g
689
1176
  }
690
1177
  }
691
1178
  }
692
- return expandToNode `
693
- ${path}
1179
+ return expandToNode `
1180
+ ${path}
694
1181
  `;
695
1182
  }
696
1183
  if (isIfStatement(expression)) {
@@ -702,7 +1189,7 @@ export function translateExpression(entry, id, expression, preDerived = false, g
702
1189
  if (isFleetingAccess(expression)) {
703
1190
  let accessPath = (_h = expression.variable.ref) === null || _h === void 0 ? void 0 : _h.name;
704
1191
  if (expression.subProperty != undefined) {
705
- accessPath = `${accessPath}.${expression.subProperty}`;
1192
+ accessPath = `${accessPath}.${fleetingSubProperty(expression)}`;
706
1193
  }
707
1194
  else if (expression.arrayAccess != undefined) {
708
1195
  accessPath = `${accessPath}[${translateExpression(entry, id, expression.arrayAccess, preDerived, generatingProperty)}]`;
@@ -715,19 +1202,19 @@ export function translateExpression(entry, id, expression, preDerived = false, g
715
1202
  // for dice display, so this does not affect "chat { roll1 }".
716
1203
  accessPath = `${accessPath}.total`;
717
1204
  }
718
- return expandToNode `
719
- ${accessPath}
1205
+ return expandToNode `
1206
+ ${accessPath}
720
1207
  `;
721
1208
  }
722
1209
  if (isParameter(expression)) {
723
- return expandToNode `
724
- ${expression.name}
1210
+ return expandToNode `
1211
+ ${expression.name}
725
1212
  `;
726
1213
  }
727
1214
  if (isJS(expression)) {
728
1215
  // Remove the last "}" from the JS expression
729
- return expandToNode `
730
- ${expression.js.replace("@js{", "").slice(0, -1)}
1216
+ return expandToNode `
1217
+ ${expression.js.replace("@js{", "").slice(0, -1)}
731
1218
  `;
732
1219
  }
733
1220
  if (isChatCard(expression)) {
@@ -744,43 +1231,43 @@ export function translateExpression(entry, id, expression, preDerived = false, g
744
1231
  case "Effects":
745
1232
  return undefined; // Renders in a different way
746
1233
  case "DocumentType":
747
- return expandToNode `
748
- { isRoll: false, label: "Type", value: context.object.type, wide: ${wide}, hasValue: context.object.type != "" },
1234
+ return expandToNode `
1235
+ { isRoll: false, label: "Type", value: context.object.type, wide: ${wide}, hasValue: context.object.type != "" },
749
1236
  `;
750
1237
  case "EditMode":
751
- return expandToNode `
752
- { isRoll: false, label: "Edit Mode", value: context.object.getFlag('${id}', 'editMode') ?? true, wide: ${wide}, hasValue: context.object.getFlag('${id}', 'editMode') != undefined },
1238
+ return expandToNode `
1239
+ { isRoll: false, label: "Edit Mode", value: context.object.getFlag('${id}', 'editMode') ?? true, wide: ${wide}, hasValue: context.object.getFlag('${id}', 'editMode') != undefined },
753
1240
  `;
754
1241
  // Properties on the document
755
1242
  default:
756
- return expandToNode `
757
- { isRoll: false, label: "${expression.access.toString()}", value: context.object.${expression.access.toString().toLowerCase()}, wide: ${wide}, hasValue: context.object.${expression.access.toString().toLowerCase()} != "" },
1243
+ return expandToNode `
1244
+ { isRoll: false, label: "${expression.access.toString()}", value: context.object.${expression.access.toString().toLowerCase()}, wide: ${wide}, hasValue: context.object.${expression.access.toString().toLowerCase()} != "" },
758
1245
  `;
759
1246
  }
760
1247
  }
761
1248
  if (isMeasuredTemplateField((_d = expression.property) === null || _d === void 0 ? void 0 : _d.ref)) {
762
- return expandToNode `
763
- { isRoll: false, isMeasuredTemplate: true, label: "${humanize((_g = (_f = (_e = expression.property) === null || _e === void 0 ? void 0 : _e.ref) === null || _f === void 0 ? void 0 : _f.name) !== null && _g !== void 0 ? _g : "")}", value: context.object.${systemPath}?.summary, wide: true, hasValue: context.object.${systemPath} != undefined, object: context.object.${systemPath} },
1249
+ return expandToNode `
1250
+ { isRoll: false, isMeasuredTemplate: true, label: "${humanize((_g = (_f = (_e = expression.property) === null || _e === void 0 ? void 0 : _e.ref) === null || _f === void 0 ? void 0 : _f.name) !== null && _g !== void 0 ? _g : "")}", value: context.object.${systemPath}?.summary, wide: true, hasValue: context.object.${systemPath} != undefined, object: context.object.${systemPath} },
764
1251
  `;
765
1252
  }
766
1253
  if (isParentPropertyRefExp((_h = expression.property) === null || _h === void 0 ? void 0 : _h.ref)) {
767
- return expandToNode `
768
- { isRoll: false, label: "${humanize((_l = (_k = (_j = expression.property) === null || _j === void 0 ? void 0 : _j.ref) === null || _k === void 0 ? void 0 : _k.name) !== null && _l !== void 0 ? _l : "")}", value: context.object.${systemPath}.replace("system", "").replaceAll(".", "").titleCase(), wide: ${wide}, hasValue: context.object.${systemPath} != "" },
1254
+ return expandToNode `
1255
+ { isRoll: false, label: "${humanize((_l = (_k = (_j = expression.property) === null || _j === void 0 ? void 0 : _j.ref) === null || _k === void 0 ? void 0 : _k.name) !== null && _l !== void 0 ? _l : "")}", value: context.object.${systemPath}.replace("system", "").replaceAll(".", "").titleCase(), wide: ${wide}, hasValue: context.object.${systemPath} != "" },
769
1256
  `;
770
1257
  }
771
1258
  if (isSelfPropertyRefExp((_m = expression.property) === null || _m === void 0 ? void 0 : _m.ref)) {
772
- return expandToNode `
773
- { isRoll: false, label: "${humanize((_q = (_p = (_o = expression.property) === null || _o === void 0 ? void 0 : _o.ref) === null || _p === void 0 ? void 0 : _p.name) !== null && _q !== void 0 ? _q : "")}", value: foundry.utils.getProperty(context.object, context.object.${systemPath}).replace("system", "").replaceAll(".", "").titleCase(), wide: ${wide}, hasValue: context.object.${systemPath} != "" },
1259
+ return expandToNode `
1260
+ { isRoll: false, label: "${humanize((_q = (_p = (_o = expression.property) === null || _o === void 0 ? void 0 : _o.ref) === null || _p === void 0 ? void 0 : _p.name) !== null && _q !== void 0 ? _q : "")}", value: foundry.utils.getProperty(context.object, context.object.${systemPath}).replace("system", "").replaceAll(".", "").titleCase(), wide: ${wide}, hasValue: context.object.${systemPath} != "" },
774
1261
  `;
775
1262
  }
776
- return expandToNode `
777
- { isRoll: false, label: "${humanize((_t = (_s = (_r = expression.property) === null || _r === void 0 ? void 0 : _r.ref) === null || _s === void 0 ? void 0 : _s.name) !== null && _t !== void 0 ? _t : "")}", value: context.object.${systemPath}, wide: ${wide}, hasValue: context.object.${systemPath} != "" },
1263
+ return expandToNode `
1264
+ { isRoll: false, label: "${humanize((_t = (_s = (_r = expression.property) === null || _r === void 0 ? void 0 : _r.ref) === null || _s === void 0 ? void 0 : _s.name) !== null && _t !== void 0 ? _t : "")}", value: context.object.${systemPath}, wide: ${wide}, hasValue: context.object.${systemPath} != "" },
778
1265
  `;
779
1266
  }
780
1267
  if (isFleetingAccess(expression)) {
781
1268
  let accessPath = (_u = expression.variable.ref) === null || _u === void 0 ? void 0 : _u.name;
782
1269
  if (expression.subProperty != undefined) {
783
- accessPath = `${accessPath}.${expression.subProperty}`;
1270
+ accessPath = `${accessPath}.${fleetingSubProperty(expression)}`;
784
1271
  }
785
1272
  let roll = false;
786
1273
  let wide = expression.type == "wide" ? true : false;
@@ -789,49 +1276,49 @@ export function translateExpression(entry, id, expression, preDerived = false, g
789
1276
  if (isDamageRoll((_v = expression.variable.ref) === null || _v === void 0 ? void 0 : _v.value)) {
790
1277
  roll = true;
791
1278
  wide = true;
792
- return expandToNode `
793
- {
794
- isRoll: ${roll},
795
- isDamageRoll: true,
796
- label: "${humanize((_x = (_w = expression.variable.ref) === null || _w === void 0 ? void 0 : _w.name) !== null && _x !== void 0 ? _x : "")}",
797
- value: ${accessPath},
798
- wide: ${wide},
799
- tooltip: await ${accessPath}.getTooltip(),
800
- damageType: ${accessPath}.options.type.value,
801
- damageIcon: ${accessPath}.options.type.icon,
802
- damageColor: ${accessPath}.options.type.color,
803
- damageMetadata: ${accessPath}.options.type
804
- },
1279
+ return expandToNode `
1280
+ {
1281
+ isRoll: ${roll},
1282
+ isDamageRoll: true,
1283
+ label: "${humanize((_x = (_w = expression.variable.ref) === null || _w === void 0 ? void 0 : _w.name) !== null && _x !== void 0 ? _x : "")}",
1284
+ value: ${accessPath},
1285
+ wide: ${wide},
1286
+ tooltip: await ${accessPath}.getTooltip(),
1287
+ damageType: ${accessPath}.options.type.value,
1288
+ damageIcon: ${accessPath}.options.type.icon,
1289
+ damageColor: ${accessPath}.options.type.color,
1290
+ damageMetadata: ${accessPath}.options.type
1291
+ },
805
1292
  `;
806
1293
  }
807
1294
  if (isRoll((_y = expression.variable.ref) === null || _y === void 0 ? void 0 : _y.value)) {
808
1295
  roll = true;
809
1296
  wide = true;
810
- return expandToNode `
811
- { isRoll: ${roll}, label: "${humanize((_0 = (_z = expression.variable.ref) === null || _z === void 0 ? void 0 : _z.name) !== null && _0 !== void 0 ? _0 : "")}", value: ${accessPath}, wide: ${wide}, tooltip: await ${accessPath}.getTooltip() },
1297
+ return expandToNode `
1298
+ { isRoll: ${roll}, label: "${humanize((_0 = (_z = expression.variable.ref) === null || _z === void 0 ? void 0 : _z.name) !== null && _0 !== void 0 ? _0 : "")}", value: ${accessPath}, wide: ${wide}, tooltip: await ${accessPath}.getTooltip() },
812
1299
  `;
813
1300
  }
814
- return expandToNode `
815
- { isRoll: ${roll}, label: "${humanize((_2 = (_1 = expression.variable.ref) === null || _1 === void 0 ? void 0 : _1.name) !== null && _2 !== void 0 ? _2 : "")}", value: ${accessPath}, wide: ${wide}, hasValue: ${accessPath} != "" },
1301
+ return expandToNode `
1302
+ { isRoll: ${roll}, label: "${humanize((_2 = (_1 = expression.variable.ref) === null || _1 === void 0 ? void 0 : _1.name) !== null && _2 !== void 0 ? _2 : "")}", value: ${accessPath}, wide: ${wide}, hasValue: ${accessPath} != "" },
816
1303
  `;
817
1304
  }
818
1305
  if (isParentAccess(expression)) {
819
1306
  let systemPath = getSystemPath((_3 = expression.property) === null || _3 === void 0 ? void 0 : _3.ref, expression.subProperties, undefined, true);
820
1307
  const wide = expression.type == "wide" ? true : false;
821
- return expandToNode `
822
- { isRoll: false, label: "${humanize((_6 = (_5 = (_4 = expression.property) === null || _4 === void 0 ? void 0 : _4.ref) === null || _5 === void 0 ? void 0 : _5.name) !== null && _6 !== void 0 ? _6 : "")}", value: context.object.parent?.${systemPath}, wide: ${wide}, hasValue: context.object.parent?.${systemPath} != "" },
1308
+ return expandToNode `
1309
+ { isRoll: false, label: "${humanize((_6 = (_5 = (_4 = expression.property) === null || _4 === void 0 ? void 0 : _4.ref) === null || _5 === void 0 ? void 0 : _5.name) !== null && _6 !== void 0 ? _6 : "")}", value: context.object.parent?.${systemPath}, wide: ${wide}, hasValue: context.object.parent?.${systemPath} != "" },
823
1310
  `;
824
1311
  }
825
1312
  if (isTargetAccess(expression)) {
826
1313
  let systemPath = getSystemPath((_7 = expression.property) === null || _7 === void 0 ? void 0 : _7.ref, expression.subProperties, undefined, true);
827
1314
  const wide = expression.type == "wide" ? true : false;
828
- return expandToNode `
829
- { isRoll: false, label: "${humanize((_10 = (_9 = (_8 = expression.property) === null || _8 === void 0 ? void 0 : _8.ref) === null || _9 === void 0 ? void 0 : _9.name) !== null && _10 !== void 0 ? _10 : "")}", value: context.target?.${systemPath}, wide: ${wide}, hasValue: context.target?.${systemPath} != "" },
1315
+ return expandToNode `
1316
+ { isRoll: false, label: "${humanize((_10 = (_9 = (_8 = expression.property) === null || _8 === void 0 ? void 0 : _8.ref) === null || _9 === void 0 ? void 0 : _9.name) !== null && _10 !== void 0 ? _10 : "")}", value: context.target?.${systemPath}, wide: ${wide}, hasValue: context.target?.${systemPath} != "" },
830
1317
  `;
831
1318
  }
832
1319
  if (isExpression(expression)) {
833
- return expandToNode `
834
- { isParagraph: true, value: ${translateExpression(entry, id, expression, preDerived, generatingProperty)} },
1320
+ return expandToNode `
1321
+ { isParagraph: true, value: ${translateExpression(entry, id, expression, preDerived, generatingProperty)} },
835
1322
  `;
836
1323
  }
837
1324
  return;
@@ -840,475 +1327,60 @@ export function translateExpression(entry, id, expression, preDerived = false, g
840
1327
  var _a, _b, _c;
841
1328
  if (isAccess(expression)) {
842
1329
  let systemPath = getSystemPath((_a = expression.property) === null || _a === void 0 ? void 0 : _a.ref, expression.subProperties, (_b = expression.propertyLookup) === null || _b === void 0 ? void 0 : _b.ref);
843
- return expandToNode `
844
- context.object.${systemPath}
1330
+ return expandToNode `
1331
+ context.object.${systemPath}
845
1332
  `;
846
1333
  }
847
1334
  if (isFleetingAccess(expression)) {
848
1335
  let accessPath = (_c = expression.variable.ref) === null || _c === void 0 ? void 0 : _c.name;
849
1336
  if (expression.subProperty != undefined) {
850
- accessPath = `${accessPath}.${expression.subProperty}`;
1337
+ accessPath = `${accessPath}.${fleetingSubProperty(expression)}`;
851
1338
  }
852
- return expandToNode `
853
- ${accessPath}
1339
+ return expandToNode `
1340
+ ${accessPath}
854
1341
  `;
855
1342
  }
856
1343
  if (isExpression(expression)) {
857
- return expandToNode `
858
- ${translateExpression(entry, id, expression, preDerived, generatingProperty)}
1344
+ return expandToNode `
1345
+ ${translateExpression(entry, id, expression, preDerived, generatingProperty)}
859
1346
  `;
860
1347
  }
861
1348
  return;
862
1349
  }
863
1350
  const flavorTag = expression.body.chatExp.find(x => x.type == "flavor");
864
1351
  const shouldShowEffects = expression.body.chatExp.some(x => isAccess(x) && x.access === "Effects");
865
- return expandToNode `
866
- // Create the chat message
867
- const ${expression.name}Description = context.object.description ?? context.object.system.description;
868
- const ${expression.name}Context = {
869
- cssClass: "${id} ${toMachineIdentifier(expression.name)}",
870
- document: context.object,
871
- description: ${expression.name}Description,
872
- hasDescription: ${expression.name}Description!= "",
873
- hasEffects: ${shouldShowEffects},
874
- parts: [
875
- ${joinToNode(expression.body.chatExp.filter(x => x.type != "tag"), (expression) => translateChatBodyExpression(expression), { appendNewLineIfNotEmpty: true })}
876
- ],
877
- tags: [
878
- ${joinToNode(expression.body.chatExp.filter(x => x.type == "tag"), (expression) => translateChatBodyExpression(expression), { appendNewLineIfNotEmpty: true })}
879
- ]
880
- };
881
- const ${expression.name}Content = await renderTemplate("systems/${id}/system/templates/chat/standard-card.hbs", ${expression.name}Context);
882
- const ${expression.name}ChatFlavor = (system) => {
883
- return ${flavorTag != undefined ? translateChatBodyExpressionForFlavor(flavorTag) : `""`}
884
- }
885
- await ChatMessage.create({
886
- user: game.user._id,
887
- speaker: ChatMessage.getSpeaker(),
888
- content: ${expression.name}Content,
889
- flavor: ${expression.name}ChatFlavor(context.object.system),
890
- ...(${expression.name}Context.parts.find(x => x.isRoll) ? {} : { style: CONST.CHAT_MESSAGE_STYLES.IC }),
891
- rolls: Array.from(${expression.name}Context.parts.filter(x => x.isRoll).map(x => x.value)),
892
- });
1352
+ return expandToNode `
1353
+ // Create the chat message
1354
+ const ${expression.name}Description = context.object.description ?? context.object.system.description;
1355
+ const ${expression.name}Context = {
1356
+ cssClass: "${id} ${toMachineIdentifier(expression.name)}",
1357
+ document: context.object,
1358
+ description: ${expression.name}Description,
1359
+ hasDescription: ${expression.name}Description!= "",
1360
+ hasEffects: ${shouldShowEffects},
1361
+ parts: [
1362
+ ${joinToNode(expression.body.chatExp.filter(x => x.type != "tag"), (expression) => translateChatBodyExpression(expression), { appendNewLineIfNotEmpty: true })}
1363
+ ],
1364
+ tags: [
1365
+ ${joinToNode(expression.body.chatExp.filter(x => x.type == "tag"), (expression) => translateChatBodyExpression(expression), { appendNewLineIfNotEmpty: true })}
1366
+ ]
1367
+ };
1368
+ const ${expression.name}Content = await renderTemplate("systems/${id}/system/templates/chat/standard-card.hbs", ${expression.name}Context);
1369
+ const ${expression.name}ChatFlavor = (system) => {
1370
+ return ${flavorTag != undefined ? translateChatBodyExpressionForFlavor(flavorTag) : `""`}
1371
+ }
1372
+ await ChatMessage.create({
1373
+ user: game.user._id,
1374
+ speaker: ChatMessage.getSpeaker(),
1375
+ content: ${expression.name}Content,
1376
+ flavor: ${expression.name}ChatFlavor(context.object.system),
1377
+ ...(${expression.name}Context.parts.find(x => x.isRoll) ? {} : { style: CONST.CHAT_MESSAGE_STYLES.IC }),
1378
+ rolls: Array.from(${expression.name}Context.parts.filter(x => x.isRoll).map(x => x.value)),
1379
+ });
893
1380
  `;
894
1381
  }
895
1382
  if (isRoll(expression) || isDamageRoll(expression)) {
896
1383
  console.log("Translating Roll Expression");
897
- function translateDiceParts(expression, noLabels = false) {
898
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32;
899
- console.log("Translating Dice Part: ", expression.$type);
900
- if (isLiteral(expression)) {
901
- if (typeof expression.val == "string") {
902
- return expandToNode `
903
- "${expression.val}"
904
- `;
905
- }
906
- return expandToNode `
907
- "${expression.val}"
908
- `;
909
- }
910
- if (isRef(expression)) {
911
- // If string or number, return the value
912
- if (typeof expression.val == "string" || typeof expression.val == "number") {
913
- return expandToNode `
914
- "${expression.val}"
915
- `;
916
- }
917
- if (expression.val.ref == undefined) {
918
- return;
919
- }
920
- if (expression.subProperties != undefined && expression.subProperties.length > 0) {
921
- const subLabel = noLabels ? "" : `[${humanize(expression.subProperties[0])}]`;
922
- return expandToNode `
923
- "@${(_a = expression.val.ref) === null || _a === void 0 ? void 0 : _a.name}${expression.subProperties[0].toLowerCase()}${subLabel}"
924
- `;
925
- }
926
- console.log("Ref:", `${expression.val.$refText}`);
927
- if (IntelligentSystemDesignLanguageTerminals.DICE.test(`${expression.val}`)) {
928
- return expandToNode `
929
- "${expression.val}"
930
- `;
931
- }
932
- const refLabel = noLabels ? "" : `[${humanize((_c = (_b = expression.val.ref) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : expression.val.$refText)}]`;
933
- return expandToNode `
934
- "@${(_f = (_e = (_d = expression.val.ref) === null || _d === void 0 ? void 0 : _d.name) === null || _e === void 0 ? void 0 : _e.toLowerCase()) !== null && _f !== void 0 ? _f : expression.val.$refText}${refLabel}"
935
- `;
936
- }
937
- if (isParentAccess(expression)) {
938
- let path = (_j = (_h = (_g = expression.property) === null || _g === void 0 ? void 0 : _g.ref) === null || _h === void 0 ? void 0 : _h.name) !== null && _j !== void 0 ? _j : "";
939
- let label = humanize((_m = (_l = (_k = expression.property) === null || _k === void 0 ? void 0 : _k.ref) === null || _l === void 0 ? void 0 : _l.name) !== null && _m !== void 0 ? _m : "");
940
- const document = getParentDocument(expression);
941
- if (document != undefined) {
942
- path = `${document.name.toLowerCase()}${path}`;
943
- label = `${humanize(document.name)} ${label}`;
944
- }
945
- // else if ( expression.propertyLookup != undefined ) {
946
- // path = `${path}${expression.propertyLookup.ref?.name.toLowerCase()}`;
947
- // label = `${label} \${context.object.system.${expression.propertyLookup.ref?.name.toLowerCase()}\}`;
948
- // }
949
- else {
950
- path = `${path}${(_p = (_o = expression.property) === null || _o === void 0 ? void 0 : _o.ref) === null || _p === void 0 ? void 0 : _p.name.toLowerCase()}`;
951
- label = `${label} ${humanize((_s = (_r = (_q = expression.property) === null || _q === void 0 ? void 0 : _q.ref) === null || _r === void 0 ? void 0 : _r.name) !== null && _s !== void 0 ? _s : "")}`;
952
- }
953
- for (const subProperty of (_t = expression.subProperties) !== null && _t !== void 0 ? _t : []) {
954
- path = `${path}${subProperty}`;
955
- label = `${label} ${humanize(subProperty)}`;
956
- }
957
- label = label.trim();
958
- const parentLabelSuffix = noLabels ? "" : `[${label}]`;
959
- return expandToNode `
960
- \`@${path.replaceAll(".", "").toLowerCase()}${parentLabelSuffix}\`
961
- `;
962
- }
963
- if (isTargetAccess(expression)) {
964
- let path = (_w = (_v = (_u = expression.property) === null || _u === void 0 ? void 0 : _u.ref) === null || _v === void 0 ? void 0 : _v.name) !== null && _w !== void 0 ? _w : "";
965
- let label = humanize((_z = (_y = (_x = expression.property) === null || _x === void 0 ? void 0 : _x.ref) === null || _y === void 0 ? void 0 : _y.name) !== null && _z !== void 0 ? _z : "");
966
- const document = getTargetDocument(expression);
967
- if (document != undefined) {
968
- path = `${document.name.toLowerCase()}${path}`;
969
- label = `${humanize(document.name)} ${label}`;
970
- }
971
- // else if ( expression.propertyLookup != undefined ) {
972
- // path = `${path}${expression.propertyLookup.ref?.name.toLowerCase()}`;
973
- // label = `${label} \${context.object.system.${expression.propertyLookup.ref?.name.toLowerCase()}\}`;
974
- // }
975
- else {
976
- path = `${path}${(_1 = (_0 = expression.property) === null || _0 === void 0 ? void 0 : _0.ref) === null || _1 === void 0 ? void 0 : _1.name.toLowerCase()}`;
977
- label = `${label} ${humanize((_4 = (_3 = (_2 = expression.property) === null || _2 === void 0 ? void 0 : _2.ref) === null || _3 === void 0 ? void 0 : _3.name) !== null && _4 !== void 0 ? _4 : "")}`;
978
- }
979
- for (const subProperty of (_5 = expression.subProperties) !== null && _5 !== void 0 ? _5 : []) {
980
- path = `${path}${subProperty}`;
981
- label = `${label} ${humanize(subProperty)}`;
982
- }
983
- label = label.trim();
984
- const targetLabelSuffix = noLabels ? "" : `[${label}]`;
985
- return expandToNode `
986
- \`@${path.replaceAll(".", "").toLowerCase()}${targetLabelSuffix}\`
987
- `;
988
- }
989
- if (isAccess(expression)) {
990
- let path = (_13 = (_9 = (_8 = (_7 = (_6 = expression.property) === null || _6 === void 0 ? void 0 : _6.ref) === null || _7 === void 0 ? void 0 : _7.name) === null || _8 === void 0 ? void 0 : _8.toLowerCase()) !== null && _9 !== void 0 ? _9 : (_12 = (_11 = (_10 = expression.propertyLookup) === null || _10 === void 0 ? void 0 : _10.ref) === null || _11 === void 0 ? void 0 : _11.name) === null || _12 === void 0 ? void 0 : _12.toLowerCase()) !== null && _13 !== void 0 ? _13 : "";
991
- let label = humanize((_19 = (_16 = (_15 = (_14 = expression.property) === null || _14 === void 0 ? void 0 : _14.ref) === null || _15 === void 0 ? void 0 : _15.name) !== null && _16 !== void 0 ? _16 : (_18 = (_17 = expression.propertyLookup) === null || _17 === void 0 ? void 0 : _17.ref) === null || _18 === void 0 ? void 0 : _18.name) !== null && _19 !== void 0 ? _19 : "");
992
- // if (isDieField(expression.property?.ref)) {
993
- // return expandToNode`
994
- // \'@${path.replaceAll(".", "")}\'
995
- // `;
996
- // }
997
- // Special handling for document choices - expand into individual terms
998
- if (expression.property && isDocumentChoicesExp(expression.property.ref) && expression.subProperties && expression.subProperties.length > 0) {
999
- const choicesFieldName = expression.property.ref.name.toLowerCase();
1000
- const subPropertyName = expression.subProperties[0].toLowerCase();
1001
- const subPropertyLabel = humanize(expression.subProperties[0]);
1002
- // Generate dynamic expansion for each document in the choices array
1003
- return expandToNode `
1004
- context.object.system.${choicesFieldName}.map((doc, index) => {
1005
- if (!doc || !doc.system) return '';
1006
- return '@' + doc.uuid.replace(/[^a-zA-Z0-9]/g, '').toLowerCase() + '${subPropertyName}[' + doc.name + ' ${subPropertyLabel}]';
1007
- }).filter(Boolean).join(' + ')
1008
- `;
1009
- }
1010
- if (isParentPropertyRefExp((_20 = expression.property) === null || _20 === void 0 ? void 0 : _20.ref)) {
1011
- label = `${label} - \${context.object.system.${(_22 = (_21 = expression.property) === null || _21 === void 0 ? void 0 : _21.ref) === null || _22 === void 0 ? void 0 : _22.name.toLowerCase()}.replace("system.", "").replaceAll(".", " ").titleCase()\}`;
1012
- }
1013
- else if (isSelfPropertyRefExp((_23 = expression.property) === null || _23 === void 0 ? void 0 : _23.ref)) {
1014
- label = `${label} - \${context.object.system.${(_25 = (_24 = expression.property) === null || _24 === void 0 ? void 0 : _24.ref) === null || _25 === void 0 ? void 0 : _25.name.toLowerCase()}.replace("system.", "").replaceAll(".", " ").titleCase()\}`;
1015
- }
1016
- else {
1017
- for (const subProperty of (_26 = expression.subProperties) !== null && _26 !== void 0 ? _26 : []) {
1018
- path = `${path}.${subProperty}`;
1019
- label = `${label} ${humanize(subProperty)}`;
1020
- }
1021
- }
1022
- console.log("Access:", path, label);
1023
- const accessLabelSuffix = noLabels ? "" : `[${label}]`;
1024
- return expandToNode `
1025
- \`@${path.replaceAll(".", "").toLowerCase()}${accessLabelSuffix}\`
1026
- `;
1027
- }
1028
- if (isFleetingAccess(expression)) {
1029
- // If this is a roll expression, just output it directly
1030
- if (isRoll((_27 = expression.variable.ref) === null || _27 === void 0 ? void 0 : _27.value)) {
1031
- return expandToNode `
1032
- ${(_28 = expression.variable.ref) === null || _28 === void 0 ? void 0 : _28.name}
1033
- `;
1034
- }
1035
- let path = (_30 = (_29 = expression.variable.ref) === null || _29 === void 0 ? void 0 : _29.name) !== null && _30 !== void 0 ? _30 : "";
1036
- let label = humanize((_32 = (_31 = expression.variable.ref) === null || _31 === void 0 ? void 0 : _31.name) !== null && _32 !== void 0 ? _32 : "");
1037
- if (expression.subProperty != undefined) {
1038
- path = `${path}.${expression.subProperty}`;
1039
- label = `${label} ${humanize(expression.subProperty)}`;
1040
- }
1041
- const fleetingLabelSuffix = noLabels ? "" : `[${label}]`;
1042
- return expandToNode `
1043
- \`@${path.replaceAll(".", "").toLowerCase()}${fleetingLabelSuffix}\`
1044
- `;
1045
- }
1046
- if (isBinaryExpression(expression)) {
1047
- return expandToNode `
1048
- ${translateDiceParts(expression.e1, noLabels)} + "${expression.op}" + ${translateDiceParts(expression.e2, noLabels)}
1049
- `;
1050
- }
1051
- if (isGroup(expression)) {
1052
- return expandToNode `
1053
- "(" + ${translateDiceParts(expression.ge, noLabels)} + ")"
1054
- `;
1055
- }
1056
- return;
1057
- }
1058
- function translateDisplayFormula(expression) {
1059
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
1060
- if (isLiteral(expression)) {
1061
- return `${expression.val}`;
1062
- }
1063
- if (isGroup(expression)) {
1064
- const inner = translateDisplayFormula(expression.ge);
1065
- return inner != null ? `(${inner})` : undefined;
1066
- }
1067
- if (isBinaryExpression(expression)) {
1068
- const left = translateDisplayFormula(expression.e1);
1069
- const right = translateDisplayFormula(expression.e2);
1070
- return left != null && right != null ? `${left} ${expression.op} ${right}` : undefined;
1071
- }
1072
- if (isAccess(expression)) {
1073
- if (isParentPropertyRefExp((_a = expression.property) === null || _a === void 0 ? void 0 : _a.ref) || isSelfPropertyRefExp((_b = expression.property) === null || _b === void 0 ? void 0 : _b.ref)) {
1074
- return undefined;
1075
- }
1076
- let label = humanize((_h = (_e = (_d = (_c = expression.property) === null || _c === void 0 ? void 0 : _c.ref) === null || _d === void 0 ? void 0 : _d.name) !== null && _e !== void 0 ? _e : (_g = (_f = expression.propertyLookup) === null || _f === void 0 ? void 0 : _f.ref) === null || _g === void 0 ? void 0 : _g.name) !== null && _h !== void 0 ? _h : "");
1077
- for (const sub of (_j = expression.subProperties) !== null && _j !== void 0 ? _j : []) {
1078
- label += ` ${humanize(sub)}`;
1079
- }
1080
- return label.trim();
1081
- }
1082
- if (isParentAccess(expression)) {
1083
- return humanize((_m = (_l = (_k = expression.property) === null || _k === void 0 ? void 0 : _k.ref) === null || _l === void 0 ? void 0 : _l.name) !== null && _m !== void 0 ? _m : "");
1084
- }
1085
- if (isTargetAccess(expression)) {
1086
- return humanize((_q = (_p = (_o = expression.property) === null || _o === void 0 ? void 0 : _o.ref) === null || _p === void 0 ? void 0 : _p.name) !== null && _q !== void 0 ? _q : "");
1087
- }
1088
- if (isFleetingAccess(expression)) {
1089
- return humanize((_s = (_r = expression.variable.ref) === null || _r === void 0 ? void 0 : _r.name) !== null && _s !== void 0 ? _s : "");
1090
- }
1091
- return undefined;
1092
- }
1093
- function translateDiceData(expression) {
1094
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52;
1095
- console.log("Translating Dice Data: ", expression.$type);
1096
- if (isParentAccess(expression)) {
1097
- let path = "context.object.parent.system";
1098
- let label = (_c = (_b = (_a = expression.property) === null || _a === void 0 ? void 0 : _a.ref) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : "";
1099
- console.log("Parent Access:", (_e = (_d = expression.property) === null || _d === void 0 ? void 0 : _d.ref) === null || _e === void 0 ? void 0 : _e.name);
1100
- const document = getParentDocument(expression);
1101
- if (document != undefined) {
1102
- path = `${path}.${(_h = (_g = (_f = expression.property) === null || _f === void 0 ? void 0 : _f.ref) === null || _g === void 0 ? void 0 : _g.name) === null || _h === void 0 ? void 0 : _h.toLowerCase()}`;
1103
- label = `${humanize(document.name)}.${label}`;
1104
- }
1105
- else {
1106
- path = `${path}.${(_l = (_k = (_j = expression.property) === null || _j === void 0 ? void 0 : _j.ref) === null || _k === void 0 ? void 0 : _k.name) === null || _l === void 0 ? void 0 : _l.toLowerCase()}`;
1107
- label = `${label}.${expression.property}`;
1108
- }
1109
- for (const subProperty of (_m = expression.subProperties) !== null && _m !== void 0 ? _m : []) {
1110
- path = `${path}.${subProperty}`;
1111
- label = `${label}.${subProperty}`;
1112
- }
1113
- return expandToNode `
1114
- "${label.replaceAll(".", "").toLowerCase()}": ${path}
1115
- `;
1116
- }
1117
- if (isTargetAccess(expression)) {
1118
- let path = "context.target.system";
1119
- let label = (_q = (_p = (_o = expression.property) === null || _o === void 0 ? void 0 : _o.ref) === null || _p === void 0 ? void 0 : _p.name) !== null && _q !== void 0 ? _q : "";
1120
- console.log("Target Access:", (_s = (_r = expression.property) === null || _r === void 0 ? void 0 : _r.ref) === null || _s === void 0 ? void 0 : _s.name);
1121
- const document = getTargetDocument(expression);
1122
- if (document != undefined) {
1123
- path = `${path}.${(_v = (_u = (_t = expression.property) === null || _t === void 0 ? void 0 : _t.ref) === null || _u === void 0 ? void 0 : _u.name) === null || _v === void 0 ? void 0 : _v.toLowerCase()}`;
1124
- label = `${humanize(document.name)}.${label}`;
1125
- }
1126
- else {
1127
- path = `${path}.${(_y = (_x = (_w = expression.property) === null || _w === void 0 ? void 0 : _w.ref) === null || _x === void 0 ? void 0 : _x.name) === null || _y === void 0 ? void 0 : _y.toLowerCase()}`;
1128
- label = `${label}.${expression.property}`;
1129
- }
1130
- for (const subProperty of (_z = expression.subProperties) !== null && _z !== void 0 ? _z : []) {
1131
- path = `${path}.${subProperty}`;
1132
- label = `${label}.${subProperty}`;
1133
- }
1134
- return expandToNode `
1135
- "${label.replaceAll(".", "").toLowerCase()}": ${path}
1136
- `;
1137
- }
1138
- if (isAccess(expression)) {
1139
- let path = "context.object.system";
1140
- let label = "";
1141
- console.log("Access:", (_1 = (_0 = expression.property) === null || _0 === void 0 ? void 0 : _0.ref) === null || _1 === void 0 ? void 0 : _1.name, (_3 = (_2 = expression.propertyLookup) === null || _2 === void 0 ? void 0 : _2.ref) === null || _3 === void 0 ? void 0 : _3.name);
1142
- if (expression.propertyLookup != undefined) {
1143
- path = `${path}[context.object.${getSystemPath(expression.propertyLookup.ref)}.toLowerCase()]`;
1144
- label = `${(_4 = expression.propertyLookup.ref) === null || _4 === void 0 ? void 0 : _4.name}`;
1145
- }
1146
- else if (isParentPropertyRefExp((_5 = expression.property) === null || _5 === void 0 ? void 0 : _5.ref)) {
1147
- path = `${path}.${(_7 = (_6 = expression.property) === null || _6 === void 0 ? void 0 : _6.ref) === null || _7 === void 0 ? void 0 : _7.name.toLowerCase()}`;
1148
- label = `${(_9 = (_8 = expression.property) === null || _8 === void 0 ? void 0 : _8.ref) === null || _9 === void 0 ? void 0 : _9.name}`;
1149
- let subProperty = "";
1150
- if (((_10 = expression.property) === null || _10 === void 0 ? void 0 : _10.ref.propertyType) == "resource" || ((_11 = expression.property) === null || _11 === void 0 ? void 0 : _11.ref.propertyType) == "tracker" || ((_12 = expression.property) === null || _12 === void 0 ? void 0 : _12.ref.propertyType) == "choice"
1151
- && (expression.subProperties == undefined || expression.subProperties.length == 0 || expression.subProperties[0] !== "value")) {
1152
- subProperty = "?.value";
1153
- }
1154
- if (((_13 = expression.property) === null || _13 === void 0 ? void 0 : _13.ref.propertyType) == "attribute" && (expression.subProperties == undefined || expression.subProperties.length == 0 || expression.subProperties[0] !== "mod")) {
1155
- subProperty = "?.mod";
1156
- }
1157
- console.log(label, path);
1158
- return expandToNode `
1159
- "${label.replaceAll(".", "").replaceAll(" ", "").toLowerCase()}": foundry.utils.getProperty(context.object.parent, ${path}.toLowerCase())${subProperty}
1160
- `;
1161
- }
1162
- else if (isSelfPropertyRefExp((_14 = expression.property) === null || _14 === void 0 ? void 0 : _14.ref)) {
1163
- // For self property references, we dynamically resolve the property path
1164
- let selfPropertyPath = `context.object.system.${(_16 = (_15 = expression.property) === null || _15 === void 0 ? void 0 : _15.ref) === null || _16 === void 0 ? void 0 : _16.name.toLowerCase()}`;
1165
- let subProperty = "";
1166
- label = `${(_18 = (_17 = expression.property) === null || _17 === void 0 ? void 0 : _17.ref) === null || _18 === void 0 ? void 0 : _18.name}`;
1167
- if (((_19 = expression.property) === null || _19 === void 0 ? void 0 : _19.ref.propertyType) == "resource" || ((_20 = expression.property) === null || _20 === void 0 ? void 0 : _20.ref.propertyType) == "tracker" || ((_21 = expression.property) === null || _21 === void 0 ? void 0 : _21.ref.propertyType) == "choice"
1168
- && (expression.subProperties == undefined || expression.subProperties.length == 0 || expression.subProperties[0] !== "value")) {
1169
- subProperty = "?.value";
1170
- }
1171
- if (((_22 = expression.property) === null || _22 === void 0 ? void 0 : _22.ref.propertyType) == "attribute" && (expression.subProperties == undefined || expression.subProperties.length == 0 || expression.subProperties[0] !== "mod")) {
1172
- subProperty = "?.mod";
1173
- }
1174
- console.log(label, selfPropertyPath);
1175
- return expandToNode `
1176
- "${label.replaceAll(".", "").replaceAll(" ", "").toLowerCase()}": foundry.utils.getProperty(context.object, "system." + ${selfPropertyPath}.toLowerCase())${subProperty}
1177
- `;
1178
- }
1179
- else {
1180
- // Special handling for document choices - expand into individual data entries
1181
- if (expression.property && isDocumentChoicesExp(expression.property.ref) && expression.subProperties && expression.subProperties.length > 0) {
1182
- const choicesFieldName = expression.property.ref.name.toLowerCase();
1183
- const subPropertyName = expression.subProperties[0].toLowerCase();
1184
- // Generate data for each document in the choices array
1185
- return expandToNode `
1186
- ...Object.fromEntries(context.object.system.${choicesFieldName}.map((doc, index) => {
1187
- if (!doc || !doc.system) return null;
1188
-
1189
- // Determine the accessor based on property type
1190
- let accessor = '.${subPropertyName}';
1191
- ${isResourceExp((_23 = expression.property) === null || _23 === void 0 ? void 0 : _23.ref) || isTrackerExp((_24 = expression.property) === null || _24 === void 0 ? void 0 : _24.ref) ? `
1192
- if (doc.system.${subPropertyName} && typeof doc.system.${subPropertyName} === 'object' && 'value' in doc.system.${subPropertyName}) {
1193
- accessor = '.${subPropertyName}.value';
1194
- }` : ''}
1195
- ${isAttributeExp((_25 = expression.property) === null || _25 === void 0 ? void 0 : _25.ref) ? `
1196
- if (doc.system.${subPropertyName} && typeof doc.system.${subPropertyName} === 'object' && 'mod' in doc.system.${subPropertyName}) {
1197
- accessor = '.${subPropertyName}.mod';
1198
- }` : ''}
1199
-
1200
- const key = doc.uuid.replace(/[^a-zA-Z0-9]/g, '').toLowerCase() + '${subPropertyName}';
1201
- const value = foundry.utils.getProperty(doc, 'system' + accessor) ?? 0;
1202
- return [key, value];
1203
- }).filter(Boolean))
1204
- `;
1205
- }
1206
- path = `${path}.${(_27 = (_26 = expression.property) === null || _26 === void 0 ? void 0 : _26.ref) === null || _27 === void 0 ? void 0 : _27.name.toLowerCase()}`;
1207
- label = `${(_29 = (_28 = expression.property) === null || _28 === void 0 ? void 0 : _28.ref) === null || _29 === void 0 ? void 0 : _29.name}`;
1208
- if ((isResourceExp((_30 = expression.property) === null || _30 === void 0 ? void 0 : _30.ref) || isTrackerExp((_31 = expression.property) === null || _31 === void 0 ? void 0 : _31.ref) || isStringChoiceField((_32 = expression.property) === null || _32 === void 0 ? void 0 : _32.ref))
1209
- && (expression.subProperties == undefined || expression.subProperties.length == 0 || expression.subProperties[0] == "value")) {
1210
- path = `${path}.value`;
1211
- }
1212
- if (isDiceField((_33 = expression.property) === null || _33 === void 0 ? void 0 : _33.ref) && (expression.subProperties == undefined || expression.subProperties.length == 0)) {
1213
- // For dice fields without subproperties, use the dice value
1214
- path = `${path}.value`;
1215
- }
1216
- if (isDieField((_34 = expression.property) === null || _34 === void 0 ? void 0 : _34.ref)) {
1217
- // For die fields, the value is just the die size (e.g., "d6"), we want to use the field name as label
1218
- // Don't change the path, just ensure the label is the field name
1219
- }
1220
- if (isAttributeExp((_35 = expression.property) === null || _35 === void 0 ? void 0 : _35.ref) && (expression.subProperties == undefined || expression.subProperties.length == 0 || expression.subProperties[0] !== "mod")) {
1221
- path = `${path}.mod`;
1222
- }
1223
- }
1224
- for (const subProperty of (_36 = expression.subProperties) !== null && _36 !== void 0 ? _36 : []) {
1225
- path = `${path}.${subProperty}`;
1226
- label = `${label} ${humanize(subProperty)}`;
1227
- }
1228
- console.log(label, path);
1229
- return expandToNode `
1230
- "${label.replaceAll(".", "").replaceAll(" ", "").toLowerCase()}": ${path} ?? 0
1231
- `;
1232
- }
1233
- if (isFleetingAccess(expression)) {
1234
- console.log("Fleeting Access:", (_37 = expression.variable.ref) === null || _37 === void 0 ? void 0 : _37.name);
1235
- // If this is a roll expression, just skip it
1236
- if (isRoll((_38 = expression.variable.ref) === null || _38 === void 0 ? void 0 : _38.value)) {
1237
- return;
1238
- }
1239
- let path = (_39 = expression.variable.ref) === null || _39 === void 0 ? void 0 : _39.name;
1240
- if (expression.subProperty != undefined) {
1241
- path = `${path}.${expression.subProperty}`;
1242
- }
1243
- if (expression.arrayAccess != undefined) {
1244
- console.log("Array Access:", expression.arrayAccess.$type);
1245
- let accessExp = translateExpression(entry, id, expression.arrayAccess, preDerived, generatingProperty);
1246
- path = `${path}[${(_40 = accessExp === null || accessExp === void 0 ? void 0 : accessExp.contents) === null || _40 === void 0 ? void 0 : _40.toString()}]`;
1247
- }
1248
- const label = (_42 = (_41 = expression.variable.ref) === null || _41 === void 0 ? void 0 : _41.name.toLowerCase()) !== null && _42 !== void 0 ? _42 : "";
1249
- console.log(label, path);
1250
- return expandToNode `
1251
- "${label}": ${path} ?? 0
1252
- `;
1253
- }
1254
- // if (isVariableAccess(expression)) {
1255
- // console.log("Variable Access:", expression.name);
1256
- // if (isParameter(expression)) {
1257
- // console.log("Parameter:", expression.name);
1258
- // return expandToNode`
1259
- // "${expression.name}": ${expression.name}
1260
- // `;
1261
- // }
1262
- // if (isVariableExpression(expression)) {
1263
- // console.log("Variable Expression:", expression.name);
1264
- // if (isExpression(expression.value)) {
1265
- // console.log("Expression:", expression.name);
1266
- // return translateDiceData(expression.value);
1267
- // }
1268
- // if (isPrompt(expression.value)) {
1269
- // console.log("Prompt:", expression.name);
1270
- // return expandToNode`
1271
- // "${expression.name}": ${expression.name}
1272
- // `;
1273
- // }
1274
- // }
1275
- // throw new Error("Variable Access not implemented");
1276
- // }
1277
- if (isRef(expression)) {
1278
- console.log("Ref:", (_43 = expression.val.ref) === null || _43 === void 0 ? void 0 : _43.name);
1279
- // If string or number, return the value
1280
- if (typeof expression.val == "string" || typeof expression.val == "number") {
1281
- console.log(expression.val);
1282
- return expandToNode `
1283
- "${expression.val}": ${expression.val}
1284
- `;
1285
- }
1286
- if (expression.val.ref == undefined) {
1287
- return;
1288
- }
1289
- if (expression.subProperties != undefined && expression.subProperties.length > 0) {
1290
- return expandToNode `
1291
- "${(_44 = expression.val.ref) === null || _44 === void 0 ? void 0 : _44.name.toLowerCase()}${expression.subProperties[0].toLowerCase()}": ${(_45 = expression.val.ref) === null || _45 === void 0 ? void 0 : _45.name}.${expression.subProperties[0].toLowerCase()} ?? 0
1292
- `;
1293
- }
1294
- console.log((_46 = expression.val.ref) === null || _46 === void 0 ? void 0 : _46.name, (_47 = expression.val.ref) === null || _47 === void 0 ? void 0 : _47.$type);
1295
- return expandToNode `
1296
- "${(_50 = (_49 = (_48 = expression.val.ref) === null || _48 === void 0 ? void 0 : _48.name) === null || _49 === void 0 ? void 0 : _49.toLowerCase()) !== null && _50 !== void 0 ? _50 : expression.val.$refText}": ${(_52 = (_51 = expression.val.ref) === null || _51 === void 0 ? void 0 : _51.name) !== null && _52 !== void 0 ? _52 : expression.val.$refText} ?? 0
1297
- `;
1298
- }
1299
- if (isBinaryExpression(expression)) {
1300
- const expressions = [expression.e1, expression.e2];
1301
- return expandToNode `
1302
- ${joinToNode(expressions, e => translateDiceData(e), { separator: ", " })}
1303
- `;
1304
- }
1305
- if (isGroup(expression)) {
1306
- return expandToNode `
1307
- ${translateDiceData(expression.ge)}
1308
- `;
1309
- }
1310
- return undefined;
1311
- }
1312
1384
  if (isDamageRoll(expression)) {
1313
1385
  const rollParam = expression.params.find(isRollParam);
1314
1386
  const rollExpression = rollParam.value;
@@ -1322,13 +1394,13 @@ export function translateExpression(entry, id, expression, preDerived = false, g
1322
1394
  const parentPath = (_s = (_r = (_q = (_p = typeParam.value.property) === null || _p === void 0 ? void 0 : _p.ref) === null || _q === void 0 ? void 0 : _q.name) === null || _r === void 0 ? void 0 : _r.toLowerCase()) !== null && _s !== void 0 ? _s : '';
1323
1395
  damageTypeDataAccess = `context.object.parent?.system.${parentPath}`;
1324
1396
  }
1325
- return expandToNode `
1326
- await new ${entry.config.name}DamageRoll(
1327
- ${joinToNode(rollExpression.parts, e => translateDiceParts(e), { separator: " + " })},
1328
- {${joinToNode(rollExpression.parts, e => translateDiceData(e), { separator: ", " })},
1329
- actor: context.actor},
1330
- { type: ${damageTypeDataAccess} }
1331
- ).roll()
1397
+ return expandToNode `
1398
+ await new ${entry.config.name}DamageRoll(
1399
+ ${joinToNode(rollExpression.parts, e => translateDiceParts(e), { separator: " + " })},
1400
+ {${joinToNode(rollExpression.parts, e => translateDiceData(e, entry, id, preDerived, generatingProperty), { separator: ", " })},
1401
+ actor: context.actor},
1402
+ { type: ${damageTypeDataAccess} }
1403
+ ).roll()
1332
1404
  `;
1333
1405
  }
1334
1406
  const rollParts = expression.parts;
@@ -1336,32 +1408,32 @@ export function translateExpression(entry, id, expression, preDerived = false, g
1336
1408
  const displayFormula = displayFormulaParts.every(p => p != null)
1337
1409
  ? displayFormulaParts.join("")
1338
1410
  : undefined;
1339
- return expandToNode `
1411
+ return expandToNode `
1340
1412
  Object.assign(await new ${entry.config.name}Roll(${joinToNode(rollParts, (e, idx) => {
1341
1413
  const nextPart = rollParts[idx + 1];
1342
1414
  const nextIsDice = nextPart != null && isLiteral(nextPart) && typeof nextPart.val === 'string' && IntelligentSystemDesignLanguageTerminals.DICE.test(nextPart.val);
1343
1415
  return translateDiceParts(e, nextIsDice);
1344
- }, { separator: " + " })}, {${joinToNode(rollParts, e => translateDiceData(e), { separator: ", " })}}).roll(), ${displayFormula != null ? `{_displayFormula: "${displayFormula}"}` : '{}'})
1416
+ }, { separator: " + " })}, {${joinToNode(rollParts, e => translateDiceData(e, entry, id, preDerived, generatingProperty), { separator: ", " })}}).roll(), ${displayFormula != null ? `{_displayFormula: "${displayFormula}"}` : '{}'})
1345
1417
  `;
1346
1418
  }
1347
1419
  if (isSelfMethod(expression)) {
1348
1420
  switch (expression.method) {
1349
1421
  case "delete()": {
1350
- return expandToNode `
1351
- await document.delete();
1352
- selfDeleted = true;
1422
+ return expandToNode `
1423
+ await document.delete();
1424
+ selfDeleted = true;
1353
1425
  `;
1354
1426
  }
1355
1427
  case "update()": {
1356
- return expandToNode `
1357
- if (selfDeleted) {
1358
- ui.notifications.error("Cannot update a deleted document");
1359
- }
1360
- else if (Object.keys(update).length > 0) {
1361
- await document.update(update);
1362
- context.object.system = document.system;
1363
- }
1364
- update = {};
1428
+ return expandToNode `
1429
+ if (selfDeleted) {
1430
+ ui.notifications.error("Cannot update a deleted document");
1431
+ }
1432
+ else if (Object.keys(update).length > 0) {
1433
+ await document.update(update);
1434
+ context.object.system = document.system;
1435
+ }
1436
+ update = {};
1365
1437
  `.appendNewLine();
1366
1438
  }
1367
1439
  default: {
@@ -1370,8 +1442,8 @@ export function translateExpression(entry, id, expression, preDerived = false, g
1370
1442
  }
1371
1443
  }
1372
1444
  if (isArrayExpression(expression)) {
1373
- return expandToNode `
1374
- [${joinToNode(expression.items, e => translateExpression(entry, id, e, preDerived, generatingProperty), { separator: ", " })}]
1445
+ return expandToNode `
1446
+ [${joinToNode(expression.items, e => translateExpression(entry, id, e, preDerived, generatingProperty), { separator: ", " })}]
1375
1447
  `;
1376
1448
  }
1377
1449
  if (isEach(expression)) {
@@ -1379,10 +1451,10 @@ export function translateExpression(entry, id, expression, preDerived = false, g
1379
1451
  const eachExpression = expression;
1380
1452
  const collection = translateExpression(entry, id, expression.collection, preDerived, generatingProperty);
1381
1453
  if (isNumberRange(expression.collection)) {
1382
- return expandToNode `
1383
- for (const ${translateExpression(entry, id, expression.var, preDerived, generatingProperty)} of ${collection} ?? []) {
1384
- ${translateBodyExpressionToJavascript(entry, id, expression.method.body, preDerived, generatingProperty)}
1385
- }
1454
+ return expandToNode `
1455
+ for (const ${translateExpression(entry, id, expression.var, preDerived, generatingProperty)} of ${collection} ?? []) {
1456
+ ${translateBodyExpressionToJavascript(entry, id, expression.method.body, preDerived, generatingProperty)}
1457
+ }
1386
1458
  `;
1387
1459
  }
1388
1460
  let updateExpression;
@@ -1391,26 +1463,26 @@ export function translateExpression(entry, id, expression, preDerived = false, g
1391
1463
  return isVariableAssignment(x) && x.variable.ref == eachExpression.var;
1392
1464
  })) {
1393
1465
  if (isParentAccess(expression.collection)) {
1394
- updateExpression = expandToNode `
1395
- parentEmbeddedUpdate["${getSystemPath((_t = expression.collection.property) === null || _t === void 0 ? void 0 : _t.ref, [], undefined, false)}"] = ${collection};
1466
+ updateExpression = expandToNode `
1467
+ parentEmbeddedUpdate["${getSystemPath((_t = expression.collection.property) === null || _t === void 0 ? void 0 : _t.ref, [], undefined, false)}"] = ${collection};
1396
1468
  `;
1397
1469
  }
1398
1470
  else if (isTargetAccess(expression.collection)) {
1399
- updateExpression = expandToNode `
1400
- targetEmbeddedUpdate["${getSystemPath((_u = expression.collection.property) === null || _u === void 0 ? void 0 : _u.ref, [], undefined, false)}"] = ${collection};
1471
+ updateExpression = expandToNode `
1472
+ targetEmbeddedUpdate["${getSystemPath((_u = expression.collection.property) === null || _u === void 0 ? void 0 : _u.ref, [], undefined, false)}"] = ${collection};
1401
1473
  `;
1402
1474
  }
1403
1475
  else {
1404
- updateExpression = expandToNode `
1405
- embeddedUpdate["${collection}"] = ${collection};
1476
+ updateExpression = expandToNode `
1477
+ embeddedUpdate["${collection}"] = ${collection};
1406
1478
  `;
1407
1479
  }
1408
1480
  }
1409
- return expandToNode `
1410
- for (const ${translateExpression(entry, id, expression.var, preDerived, generatingProperty)} of ${collection} ?? []) {
1411
- ${translateBodyExpressionToJavascript(entry, id, expression.method.body, preDerived, generatingProperty)}
1412
- }
1413
- ${updateExpression}
1481
+ return expandToNode `
1482
+ for (const ${translateExpression(entry, id, expression.var, preDerived, generatingProperty)} of ${collection} ?? []) {
1483
+ ${translateBodyExpressionToJavascript(entry, id, expression.method.body, preDerived, generatingProperty)}
1484
+ }
1485
+ ${updateExpression}
1414
1486
  `;
1415
1487
  }
1416
1488
  if (isPrompt(expression)) {
@@ -1442,185 +1514,185 @@ export function translateExpression(entry, id, expression, preDerived = false, g
1442
1514
  else if (units === "minutes") {
1443
1515
  durationMod = ` * 60 * 1000`;
1444
1516
  }
1445
- durationExpression = expandToNode `
1446
- ${duration}${durationMod}
1517
+ durationExpression = expandToNode `
1518
+ ${duration}${durationMod}
1447
1519
  `;
1448
1520
  }
1449
1521
  if (target == "gm") {
1450
- return expandToNode `
1451
- await new Promise((resolve, reject) => {
1452
-
1453
- const firstGm = game.users.find(u => u.isGM && u.active);
1454
- const uuid = foundry.utils.randomID();
1455
-
1456
- // Setup a listener that will wait for this response
1457
- game.socket.on("system.${id}", (data) => {
1458
- if (data.type != "promptResponse" || data.uuid != uuid) return;
1459
-
1460
- // Resolve the promise with the data
1461
- resolve(data.data);
1462
- });
1463
-
1464
- game.socket.emit("system.${id}", {
1465
- uuid: uuid,
1466
- type: "prompt",
1467
- userId: game.user.id,
1468
- ${widthParam ? `width: ${widthParam.value},` : ""}
1469
- ${heightParam ? `height: ${heightParam.value},` : ""}
1470
- ${locationParam ? expandToNode `left: ${translateExpression(entry, id, locationParam.x, false, generatingProperty)},
1471
- top: ${translateExpression(entry, id, locationParam.y, false, generatingProperty)},` : ""}
1472
- ${timeLimitParam ? expandToNode `timeLimit: ${durationExpression},` : ""}
1473
- title: "${title}",
1474
- promptKey: "${promptKey}",
1475
- documentUuid: context.object.uuid,
1476
- }, {recipients: [firstGm.id]});
1477
- });
1522
+ return expandToNode `
1523
+ await new Promise((resolve, reject) => {
1524
+
1525
+ const firstGm = game.users.find(u => u.isGM && u.active);
1526
+ const uuid = foundry.utils.randomID();
1527
+
1528
+ // Setup a listener that will wait for this response
1529
+ game.socket.on("system.${id}", (data) => {
1530
+ if (data.type != "promptResponse" || data.uuid != uuid) return;
1531
+
1532
+ // Resolve the promise with the data
1533
+ resolve(data.data);
1534
+ });
1535
+
1536
+ game.socket.emit("system.${id}", {
1537
+ uuid: uuid,
1538
+ type: "prompt",
1539
+ userId: game.user.id,
1540
+ ${widthParam ? `width: ${widthParam.value},` : ""}
1541
+ ${heightParam ? `height: ${heightParam.value},` : ""}
1542
+ ${locationParam ? expandToNode `left: ${translateExpression(entry, id, locationParam.x, false, generatingProperty)},
1543
+ top: ${translateExpression(entry, id, locationParam.y, false, generatingProperty)},` : ""}
1544
+ ${timeLimitParam ? expandToNode `timeLimit: ${durationExpression},` : ""}
1545
+ title: "${title}",
1546
+ promptKey: "${promptKey}",
1547
+ documentUuid: context.object.uuid,
1548
+ }, {recipients: [firstGm.id]});
1549
+ });
1478
1550
  `;
1479
1551
  }
1480
1552
  if (target == "target") {
1481
- return expandToNode `
1482
- await new Promise((resolve, reject) => {
1483
- // Try to find a non-GM owner
1484
- let owner = game.users.find(u => u.active && !u.isGM && u.id != game.user.id && context.target.testUserPermission(u, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER));
1485
-
1486
- // If no owner is found, use the first active user
1487
- if (!owner) {
1488
- owner = game.users.find(u => u.active && u.id != game.user.id && context.target.testUserPermission(u, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER));
1489
- }
1490
-
1491
- // If still no owner is found, default to the current user
1492
- if (!owner) {
1493
- owner = game.user.id;
1494
- }
1495
- let ownerId = owner.id;
1496
- const uuid = foundry.utils.randomID();
1497
-
1498
- // Setup a listener that will wait for this response
1499
- game.socket.on("system.${id}", (data) => {
1500
- if (data.type != "promptResponse" || data.uuid != uuid) return;
1501
-
1502
- // Resolve the promise with the data
1503
- resolve(data.data);
1504
- });
1505
-
1506
- game.socket.emit("system.${id}", {
1507
- uuid: uuid,
1508
- type: "prompt",
1509
- userId: game.user.id,
1510
- ${widthParam ? `width: ${widthParam.value},` : ""}
1511
- ${heightParam ? `height: ${heightParam.value},` : ""}
1512
- ${locationParam ? expandToNode `left: ${translateExpression(entry, id, locationParam.x, false, generatingProperty)},
1513
- top: ${translateExpression(entry, id, locationParam.y, false, generatingProperty)},` : ""}
1514
- ${timeLimitParam ? expandToNode `timeLimit: ${durationExpression},` : ""}
1515
- title: "${title}",
1516
- promptKey: "${promptKey}",
1517
- documentUuid: context.object.uuid,
1518
- }, {recipients: [ownerId]});
1519
- });
1553
+ return expandToNode `
1554
+ await new Promise((resolve, reject) => {
1555
+ // Try to find a non-GM owner
1556
+ let owner = game.users.find(u => u.active && !u.isGM && u.id != game.user.id && context.target.testUserPermission(u, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER));
1557
+
1558
+ // If no owner is found, use the first active user
1559
+ if (!owner) {
1560
+ owner = game.users.find(u => u.active && u.id != game.user.id && context.target.testUserPermission(u, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER));
1561
+ }
1562
+
1563
+ // If still no owner is found, default to the current user
1564
+ if (!owner) {
1565
+ owner = game.user.id;
1566
+ }
1567
+ let ownerId = owner.id;
1568
+ const uuid = foundry.utils.randomID();
1569
+
1570
+ // Setup a listener that will wait for this response
1571
+ game.socket.on("system.${id}", (data) => {
1572
+ if (data.type != "promptResponse" || data.uuid != uuid) return;
1573
+
1574
+ // Resolve the promise with the data
1575
+ resolve(data.data);
1576
+ });
1577
+
1578
+ game.socket.emit("system.${id}", {
1579
+ uuid: uuid,
1580
+ type: "prompt",
1581
+ userId: game.user.id,
1582
+ ${widthParam ? `width: ${widthParam.value},` : ""}
1583
+ ${heightParam ? `height: ${heightParam.value},` : ""}
1584
+ ${locationParam ? expandToNode `left: ${translateExpression(entry, id, locationParam.x, false, generatingProperty)},
1585
+ top: ${translateExpression(entry, id, locationParam.y, false, generatingProperty)},` : ""}
1586
+ ${timeLimitParam ? expandToNode `timeLimit: ${durationExpression},` : ""}
1587
+ title: "${title}",
1588
+ promptKey: "${promptKey}",
1589
+ documentUuid: context.object.uuid,
1590
+ }, {recipients: [ownerId]});
1591
+ });
1520
1592
  `;
1521
1593
  }
1522
1594
  if (target == "user") {
1523
- return expandToNode `
1524
- await new Promise(async (resolve, reject) => {
1525
-
1526
- const allActiveUsers = game.users.filter(u => u.active && u.id != game.user.id);
1527
- const targetedUser = await Dialog.prompt({
1528
- title: "Select User",
1529
- content: \`<form>
1530
- <div class="form-group">
1531
- <label>\${game.i18n.localize("User")}</label>
1532
- <select name="user">
1533
- \${allActiveUsers.map(u => \`<option value="\${u.id}">\${u.name}</option>\`).join("")}
1534
- </select>
1535
- </div>
1536
- </form>\`,
1537
- callback: (html, event) => {
1538
- const formData = new FormDataExtended(html[0].querySelector("form"));
1539
- return formData.get("user");
1540
- },
1541
- options: {
1542
- classes: ["${id}", "dialog"],
1543
- }
1544
- });
1545
- const uuid = foundry.utils.randomID();
1546
-
1547
- // Setup a listener that will wait for this response
1548
- game.socket.on("system.${id}", (data) => {
1549
- if (data.type != "promptResponse" || data.uuid != uuid) return;
1550
-
1551
- // Resolve the promise with the data
1552
- resolve(data.data);
1553
- });
1554
-
1555
- game.socket.emit("system.${id}", {
1556
- uuid: uuid,
1557
- type: "prompt",
1558
- userId: game.user.id,
1559
- title: "${title}",
1560
- promptKey: "${promptKey}",
1561
- documentUuid: context.object.uuid,
1562
- ${widthParam ? expandToNode `width: ${widthParam.value},` : ""}
1563
- ${heightParam ? expandToNode `height: ${heightParam.value},` : ""}
1564
- ${locationParam ? expandToNode `left: ${translateExpression(entry, id, locationParam.x, false, generatingProperty)},
1565
- top: ${translateExpression(entry, id, locationParam.y, false, generatingProperty)},` : ""}
1566
- ${timeLimitParam ? expandToNode `timeLimit: ${durationExpression},` : ""}
1567
- }, {recipients: [targetedUser]});
1568
- });
1595
+ return expandToNode `
1596
+ await new Promise(async (resolve, reject) => {
1597
+
1598
+ const allActiveUsers = game.users.filter(u => u.active && u.id != game.user.id);
1599
+ const targetedUser = await Dialog.prompt({
1600
+ title: "Select User",
1601
+ content: \`<form>
1602
+ <div class="form-group">
1603
+ <label>\${game.i18n.localize("User")}</label>
1604
+ <select name="user">
1605
+ \${allActiveUsers.map(u => \`<option value="\${u.id}">\${u.name}</option>\`).join("")}
1606
+ </select>
1607
+ </div>
1608
+ </form>\`,
1609
+ callback: (html, event) => {
1610
+ const formData = new FormDataExtended(html[0].querySelector("form"));
1611
+ return formData.get("user");
1612
+ },
1613
+ options: {
1614
+ classes: ["${id}", "dialog"],
1615
+ }
1616
+ });
1617
+ const uuid = foundry.utils.randomID();
1618
+
1619
+ // Setup a listener that will wait for this response
1620
+ game.socket.on("system.${id}", (data) => {
1621
+ if (data.type != "promptResponse" || data.uuid != uuid) return;
1622
+
1623
+ // Resolve the promise with the data
1624
+ resolve(data.data);
1625
+ });
1626
+
1627
+ game.socket.emit("system.${id}", {
1628
+ uuid: uuid,
1629
+ type: "prompt",
1630
+ userId: game.user.id,
1631
+ title: "${title}",
1632
+ promptKey: "${promptKey}",
1633
+ documentUuid: context.object.uuid,
1634
+ ${widthParam ? expandToNode `width: ${widthParam.value},` : ""}
1635
+ ${heightParam ? expandToNode `height: ${heightParam.value},` : ""}
1636
+ ${locationParam ? expandToNode `left: ${translateExpression(entry, id, locationParam.x, false, generatingProperty)},
1637
+ top: ${translateExpression(entry, id, locationParam.y, false, generatingProperty)},` : ""}
1638
+ ${timeLimitParam ? expandToNode `timeLimit: ${durationExpression},` : ""}
1639
+ }, {recipients: [targetedUser]});
1640
+ });
1569
1641
  `;
1570
1642
  }
1571
1643
  // Self-target: open the generated Vue prompt app (game.system.prompts.<doc><action>).
1572
1644
  // The app resolves this promise with the user's input (or {} on cancel/close).
1573
- return expandToNode `
1574
- await new Promise(async (resolve, reject) => {
1575
- const promptApp = new game.system.prompts.${promptKey}(context.object, { promptResolve: resolve });
1576
- promptApp.render(true);
1577
- });
1645
+ return expandToNode `
1646
+ await new Promise(async (resolve, reject) => {
1647
+ const promptApp = new game.system.prompts.${promptKey}(context.object, { promptResolve: resolve });
1648
+ promptApp.render(true);
1649
+ });
1578
1650
  `;
1579
1651
  }
1580
1652
  if (isMathExpression(expression)) {
1581
1653
  expression = expression;
1582
1654
  console.log("Translating Math Expression: ", expression.operation);
1583
1655
  if (isMathEmptyExpression(expression)) {
1584
- return expandToNode `
1585
- Math.${expression.operation}()
1656
+ return expandToNode `
1657
+ Math.${expression.operation}()
1586
1658
  `;
1587
1659
  }
1588
1660
  if (isMathSingleExpression(expression)) {
1589
- return expandToNode `
1590
- Math.${expression.operation}(${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)})
1661
+ return expandToNode `
1662
+ Math.${expression.operation}(${translateExpression(entry, id, expression.exp, preDerived, generatingProperty)})
1591
1663
  `;
1592
1664
  }
1593
1665
  if (isMathParamExpression(expression)) {
1594
- return expandToNode `
1595
- Math.${expression.operation}(${joinToNode(expression.params, x => translateExpression(entry, id, x, preDerived, generatingProperty), { separator: ", " })})
1666
+ return expandToNode `
1667
+ Math.${expression.operation}(${joinToNode(expression.params, x => translateExpression(entry, id, x, preDerived, generatingProperty), { separator: ", " })})
1596
1668
  `;
1597
1669
  }
1598
1670
  throw new Error("Unknown Math Expression type encountered while translating to JavaScript ");
1599
1671
  }
1600
1672
  if (isLogExpression(expression)) {
1601
1673
  console.log("Translating Log Expression: ");
1602
- return expandToNode `
1603
- console.log(${joinToNode(expression.params, x => translateExpression(entry, id, x, preDerived, generatingProperty), { separator: ", " })})
1674
+ return expandToNode `
1675
+ console.log(${joinToNode(expression.params, x => translateExpression(entry, id, x, preDerived, generatingProperty), { separator: ", " })})
1604
1676
  `;
1605
1677
  }
1606
1678
  if (isUpdate(expression)) {
1607
1679
  console.log("Translating Update Expression:");
1608
1680
  let systemPath = getSystemPath((_y = expression.property) === null || _y === void 0 ? void 0 : _y.ref, expression.subProperties, (_z = expression.propertyLookup) === null || _z === void 0 ? void 0 : _z.ref, false);
1609
1681
  if (isUpdateParent(expression)) {
1610
- return expandToNode `
1611
- parentUpdate["${systemPath}"] = foundry.utils.getProperty(context.object.parent, "system.${systemPath}");
1682
+ return expandToNode `
1683
+ parentUpdate["${systemPath}"] = foundry.utils.getProperty(context.object.parent, "system.${systemPath}");
1612
1684
  `;
1613
1685
  }
1614
1686
  else if (isUpdateSelf(expression)) {
1615
- return expandToNode `
1616
- update["system.${systemPath}"] = system.${systemPath};
1687
+ return expandToNode `
1688
+ update["system.${systemPath}"] = system.${systemPath};
1617
1689
  `;
1618
1690
  }
1619
1691
  }
1620
1692
  if (isVisibilityValue(expression)) {
1621
1693
  console.log("Translating Visibility Value Expression: ", expression.visibility);
1622
- return expandToNode `
1623
- "${expression.visibility}"
1694
+ return expandToNode `
1695
+ "${expression.visibility}"
1624
1696
  `;
1625
1697
  }
1626
1698
  if (isFunctionCall(expression)) {
@@ -1634,16 +1706,16 @@ export function translateExpression(entry, id, expression, preDerived = false, g
1634
1706
  // closures in the _prepare<Doc>DerivedData scope (see derived-data-generator). They take the
1635
1707
  // in-scope `system` and no update/await — derived values run synchronously and must be pure.
1636
1708
  if (preDerived) {
1637
- return expandToNode `
1638
- function_${(_0 = expression.method.ref) === null || _0 === void 0 ? void 0 : _0.name}(system${expression.params.length ? ", " : ""}${args})
1709
+ return expandToNode `
1710
+ function_${(_0 = expression.method.ref) === null || _0 === void 0 ? void 0 : _0.name}(system${expression.params.length ? ", " : ""}${args})
1639
1711
  `;
1640
1712
  }
1641
1713
  let accessPath = "this";
1642
1714
  if (isTrackerExp(generatingProperty)) {
1643
1715
  accessPath = "document.sheet";
1644
1716
  }
1645
- return expandToNode `
1646
- await ${accessPath}.function_${(_1 = expression.method.ref) === null || _1 === void 0 ? void 0 : _1.name}(context, update, embeddedUpdate, parentUpdate, parentEmbeddedUpdate, targetUpdate, targetEmbeddedUpdate, ${args})
1717
+ return expandToNode `
1718
+ await ${accessPath}.function_${(_1 = expression.method.ref) === null || _1 === void 0 ? void 0 : _1.name}(context, update, embeddedUpdate, parentUpdate, parentEmbeddedUpdate, targetUpdate, targetEmbeddedUpdate, ${args})
1647
1719
  `;
1648
1720
  }
1649
1721
  if (isNumberRange(expression)) {
@@ -1651,8 +1723,8 @@ export function translateExpression(entry, id, expression, preDerived = false, g
1651
1723
  const to = translateExpression(entry, id, expression.end, preDerived, generatingProperty);
1652
1724
  console.log("Translating Number Range Expression: ", from, to);
1653
1725
  // Make a JS array of numbers from from to to
1654
- return expandToNode `
1655
- Array.from({length: ${to} - ${from} + 1}, (_, i) => ${from} + i)
1726
+ return expandToNode `
1727
+ Array.from({length: ${to} - ${from} + 1}, (_, i) => ${from} + i)
1656
1728
  `;
1657
1729
  }
1658
1730
  if (isWait(expression)) {
@@ -1666,8 +1738,8 @@ export function translateExpression(entry, id, expression, preDerived = false, g
1666
1738
  else if (units === "minutes") {
1667
1739
  durationMod = ` * 60 * 1000`;
1668
1740
  }
1669
- return expandToNode `
1670
- await new Promise(resolve => setTimeout(resolve, ${duration}${durationMod})); // Wait for ${expression.duration} ${units}
1741
+ return expandToNode `
1742
+ await new Promise(resolve => setTimeout(resolve, ${duration}${durationMod})); // Wait for ${expression.duration} ${units}
1671
1743
  `;
1672
1744
  }
1673
1745
  if (isPlayAudio(expression)) {
@@ -1676,44 +1748,44 @@ export function translateExpression(entry, id, expression, preDerived = false, g
1676
1748
  return undefined;
1677
1749
  const volumeParam = expression.params.find(x => isPlayAudioVolume(x));
1678
1750
  const volume = (_2 = volumeParam === null || volumeParam === void 0 ? void 0 : volumeParam.value) !== null && _2 !== void 0 ? _2 : 0.5;
1679
- return expandToNode `
1680
- await game.system.utils.playSfx(${translateExpression(entry, id, fileParam.value, false, generatingProperty)}, ${translateExpression(entry, id, volume, false, generatingProperty)});
1751
+ return expandToNode `
1752
+ await game.system.utils.playSfx(${translateExpression(entry, id, fileParam.value, false, generatingProperty)}, ${translateExpression(entry, id, volume, false, generatingProperty)});
1681
1753
  `;
1682
1754
  }
1683
1755
  if (isCombatMethods(expression)) {
1684
1756
  const method = expression.method;
1685
- return expandToNode `
1686
- if (!game.combat) {
1687
- return;
1688
- }
1689
- if (game.combat.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER)) {
1690
- ${method == "nextTurn" ? expandToNode `game.combat.nextTurn();` : ""}
1691
- ${method == "end" ? expandToNode `game.combat.endCombat();` : ""}
1692
- }
1693
- else {
1694
- await new Promise((resolve, reject) => {
1695
- const firstGm = game.users.find(u => u.isGM && u.active);
1696
- if (!firstGm) {
1697
- ui.notifications.error("No active GM found to handle combat method request");
1698
- return;
1699
- }
1700
- const uuid = foundry.utils.randomID();
1701
-
1702
- // Setup a listener that will wait for this response
1703
- game.socket.on("system.${id}", (data) => {
1704
- if (data.type != "combatResponse" || data.uuid != uuid) return;
1705
-
1706
- resolve();
1707
- });
1708
-
1709
- game.socket.emit("system.${id}", {
1710
- uuid: uuid,
1711
- type: "combat",
1712
- userId: game.user.id,
1713
- method: "${method}",
1714
- }, {recipients: [firstGm.id]});
1715
- });
1716
- }
1757
+ return expandToNode `
1758
+ if (!game.combat) {
1759
+ return;
1760
+ }
1761
+ if (game.combat.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER)) {
1762
+ ${method == "nextTurn" ? expandToNode `game.combat.nextTurn();` : ""}
1763
+ ${method == "end" ? expandToNode `game.combat.endCombat();` : ""}
1764
+ }
1765
+ else {
1766
+ await new Promise((resolve, reject) => {
1767
+ const firstGm = game.users.find(u => u.isGM && u.active);
1768
+ if (!firstGm) {
1769
+ ui.notifications.error("No active GM found to handle combat method request");
1770
+ return;
1771
+ }
1772
+ const uuid = foundry.utils.randomID();
1773
+
1774
+ // Setup a listener that will wait for this response
1775
+ game.socket.on("system.${id}", (data) => {
1776
+ if (data.type != "combatResponse" || data.uuid != uuid) return;
1777
+
1778
+ resolve();
1779
+ });
1780
+
1781
+ game.socket.emit("system.${id}", {
1782
+ uuid: uuid,
1783
+ type: "combat",
1784
+ userId: game.user.id,
1785
+ method: "${method}",
1786
+ }, {recipients: [firstGm.id]});
1787
+ });
1788
+ }
1717
1789
  `;
1718
1790
  }
1719
1791
  if (isCombatProperty(expression)) {
@@ -1736,8 +1808,8 @@ export function translateExpression(entry, id, expression, preDerived = false, g
1736
1808
  }
1737
1809
  if (isMacroExecute(expression)) {
1738
1810
  const systemPath = getSystemPath(expression.macro.ref, [], undefined, false);
1739
- return expandToNode `
1740
- await context.object.${systemPath}?.execute();
1811
+ return expandToNode `
1812
+ await context.object.${systemPath}?.execute();
1741
1813
  `;
1742
1814
  }
1743
1815
  console.log(expression.$type);
@@ -1796,4 +1868,24 @@ export function translateBodyExpressionToJavascript(entry, id, body, preDerived
1796
1868
  // */
1797
1869
  return joinToNode(body, (expression) => translateExpression(entry, id, expression, preDerived, generatingProperty), { appendNewLineIfNotEmpty: true });
1798
1870
  }
1871
+ // Compile a rollVisualizer field's value: expression into a Foundry roll formula
1872
+ // string (containing @refs) plus the data object that resolves those refs from the
1873
+ // live, reactive document/prompt context. This mirrors the roll() codegen path but
1874
+ // returns the two pieces separately, so the visualizer component can ANALYZE the
1875
+ // formula (convolve / simulate) rather than evaluate it as a roll.
1876
+ //
1877
+ // Phase 1 supports Expression values (including an explicit roll(...) node). A
1878
+ // MethodBlock value yields an empty formula -- there is nothing to visualize from a
1879
+ // statically-unknown computed string -- and the component renders its empty state.
1880
+ export function compileVisualizerFormula(entry, id, field) {
1881
+ const valueParam = field.params.find(isRollVisualizerValueParam);
1882
+ const value = valueParam === null || valueParam === void 0 ? void 0 : valueParam.value;
1883
+ if (!value || isMethodBlock(value)) {
1884
+ return { formula: expandToNode `""`, data: expandToNode `{}` };
1885
+ }
1886
+ const parts = isRoll(value) ? value.parts : [value];
1887
+ const formula = expandToNode `${joinToNode(parts, e => translateDiceParts(e, true), { separator: " + " })}`;
1888
+ const data = expandToNode `{${joinToNode(parts, e => translateDiceData(e, entry, id, false, undefined), { separator: ", " })}}`;
1889
+ return { formula, data };
1890
+ }
1799
1891
  //# sourceMappingURL=method-generator.js.map