intelligent-system-design-language 0.3.13

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