pi-apexlang 0.2.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/README.md +22 -5
  2. package/THIRD_PARTY_NOTICES.md +2 -2
  3. package/UPSTREAM.json +2 -2
  4. package/docs/assets/overview.en.png +0 -0
  5. package/docs/assets/overview.en.svg +89 -0
  6. package/docs/assets/overview.uk.png +0 -0
  7. package/docs/assets/overview.uk.svg +89 -0
  8. package/docs/en/README.md +41 -0
  9. package/docs/en/architecture.md +73 -0
  10. package/docs/en/getting-started.md +77 -0
  11. package/docs/en/maintenance.md +83 -0
  12. package/docs/en/tool-reference.md +85 -0
  13. package/docs/uk/README.md +41 -0
  14. package/docs/uk/architecture.md +73 -0
  15. package/docs/uk/getting-started.md +77 -0
  16. package/docs/uk/maintenance.md +83 -0
  17. package/docs/uk/tool-reference.md +85 -0
  18. package/extensions/apexlang/index.ts +19 -10
  19. package/extensions/lib/apexlang-cli.d.mts +1 -2
  20. package/extensions/lib/apexlang-cli.mjs +18 -13
  21. package/extensions/lib/apexlang-local-validate.mjs +83 -0
  22. package/extensions/lib/apexlang-local-validator.py +116 -0
  23. package/extensions/lib/apexlang-runtime-validate.mjs +76 -0
  24. package/package.json +2 -1
  25. package/skills/apexlang/APEXlang Skills and Workflows.md +325 -0
  26. package/skills/apexlang/README.md +6 -6
  27. package/skills/apexlang/RELEASE-NOTES.md +2 -2
  28. package/skills/apexlang/SKILL.md +24 -19
  29. package/skills/apexlang/agents/openai.yaml +4 -3
  30. package/skills/apexlang/assets/apex-generation/components.registry.json +1001 -16
  31. package/skills/apexlang/assets/apexlang/domains-catalog.json +6 -1
  32. package/skills/apexlang/assets/component-attributes.json +1924 -180
  33. package/skills/apexlang/assets/component-policies.json +19 -10
  34. package/skills/apexlang/assets/contracts/grammar-semantic-rules.json +134 -0
  35. package/skills/apexlang/assets/contracts/package-layers.json +56 -0
  36. package/skills/apexlang/assets/contracts/page-construction-packs.json +154 -0
  37. package/skills/apexlang/assets/contracts/page-patterns.json +119 -0
  38. package/skills/apexlang/assets/grammar/apexlang.ebnf +11743 -0
  39. package/skills/apexlang/assets/indexes/font-apex-icon-index.json +1699 -0
  40. package/skills/apexlang/assets/routing-catalog-main.json +11 -10
  41. package/skills/apexlang/assets/routing-load-policy.json +35 -9
  42. package/skills/apexlang/assets/rules-mapping.json +110 -2
  43. package/skills/apexlang/assets/rules.catalog.json +1298 -0
  44. package/skills/apexlang/assets/validator-fix-recipes.json +372 -17
  45. package/skills/apexlang/assets/workspace-intelligence.json +7 -10
  46. package/skills/apexlang/manifest.json +268 -12
  47. package/skills/apexlang/references/domains/README.md +1 -1
  48. package/skills/apexlang/references/domains/page-components/buttons.md +2 -2
  49. package/skills/apexlang/references/domains/page-components/page-items.md +3 -3
  50. package/skills/apexlang/references/domains/page-components/regions/region-display-selector/workflow-region-display-selector.md +69 -0
  51. package/skills/apexlang/references/domains/page-components/regions.md +1 -0
  52. package/skills/apexlang/references/domains/template-components/comments.md +61 -0
  53. package/skills/apexlang/references/domains/template-components/registry.md +2 -0
  54. package/skills/apexlang/references/domains/template-components/templates.md +47 -0
  55. package/skills/apexlang/references/domains/template-components/timeline.md +51 -0
  56. package/skills/apexlang/references/ops/one-message-router-contract.md +2 -2
  57. package/skills/apexlang/references/ops/runtime-gates/01-direct-sqlcl-import.md +1 -1
  58. package/skills/apexlang/references/ops/runtime-gates/02-direct-sqlcl-validate-gate.md +1 -1
  59. package/skills/apexlang/references/ops/runtime-gates.md +17 -16
  60. package/skills/apexlang/references/ops/sqlcl-agents/00-connection-gate.md +7 -7
  61. package/skills/apexlang/references/ops/sqlcl.md +7 -8
  62. package/skills/apexlang/references/policies/compiler-prop-map.md +6 -4
  63. package/skills/apexlang/references/policies/governance/00-governance.md +2 -2
  64. package/skills/apexlang/references/policies/memory-bank/00-guard/ai.guard.md +126 -922
  65. package/skills/apexlang/references/policies/memory-bank/20-data/apex.logic.md +3 -3
  66. package/skills/apexlang/references/policies/memory-bank/20-data/db.connection.md +9 -11
  67. package/skills/apexlang/references/policies/memory-bank/30-pages/apex.cards-page.md +95 -0
  68. package/skills/apexlang/references/policies/memory-bank/30-pages/apex.page.md +2 -2
  69. package/skills/apexlang/references/policies/memory-bank/30-pages/apex.smart-filter-search.md +145 -74
  70. package/skills/apexlang/references/policies/memory-bank/40-components/apex.region-interactions.md +9 -2
  71. package/skills/apexlang/references/policies/memory-bank/40-components/apex.region-media.md +6 -5
  72. package/skills/apexlang/references/policies/memory-bank/systemPatterns.md +9 -1
  73. package/skills/apexlang/references/workflows/apex-generation/agents/20-agent-draft.md +51 -232
  74. package/skills/apexlang/references/workflows/apex-generation/agents/30-agent-critique.md +49 -449
  75. package/skills/apexlang/references/workflows/apex-generation/agents/40-agent-revision.md +38 -238
  76. package/skills/apexlang/references/workflows/apex-generation/nlu/nlu-routing-test-matrix.md +8 -2
  77. package/skills/apexlang/references/workflows/apex-generation/nlu/nlu-routing-validation-notes.md +19 -3
  78. package/skills/apexlang/references/workflows/apex-generation/registry.md +15 -1
  79. package/skills/apexlang/references/workflows/apex-generation/templates.md +1 -1
  80. package/skills/apexlang/references/workflows/apex-generation.md +1 -1
  81. package/skills/apexlang/references/workflows/apexlang/apexlang-execution-model.md +5 -5
  82. package/skills/apexlang/references/workflows/apexlang/prompt-contracts.md +81 -10
  83. package/skills/apexlang/references/workflows/apexlang/workflow-create-app-from-fr-and-model.md +18 -7
  84. package/skills/apexlang/release-notes.json +156 -0
  85. package/skills/apexlang/runtime/grammar_contract.mjs +1166 -0
  86. package/skills/apexlang/runtime/internal/python/format_apexlang.py +210 -0
  87. package/skills/apexlang/runtime/internal/python/validate_apexlang.py +14142 -5843
  88. package/skills/apexlang/runtime/internal/python/validator_common.py +2 -0
  89. package/skills/apexlang/runtime/lib/catalogs.mjs +1026 -0
  90. package/skills/apexlang/runtime/lib/common.mjs +35 -0
  91. package/skills/apexlang/runtime/runtime.bundle.mjs +457 -57
  92. package/skills/apexlang/templates/items/combobox/combobox.explicit-defaults.md +1 -1
  93. package/skills/apexlang/templates/items/date-picker/date-picker._common.md +1 -1
  94. package/skills/apexlang/templates/items/date-picker/date-picker.explicit-defaults.md +1 -1
  95. package/skills/apexlang/templates/items/file-upload/file-upload._common.md +30 -24
  96. package/skills/apexlang/templates/items/file-upload/file-upload.compact-template.md +6 -0
  97. package/skills/apexlang/templates/items/file-upload/file-upload.explicit-defaults.md +23 -8
  98. package/skills/apexlang/templates/items/file-upload/file-upload.minimal.md +6 -0
  99. package/skills/apexlang/templates/items/hidden-item/hidden-item._common.md +1 -1
  100. package/skills/apexlang/templates/items/hidden-item/hidden-item.explicit-defaults.md +1 -1
  101. package/skills/apexlang/templates/items/items._common.md +3 -2
  102. package/skills/apexlang/templates/items/list-manager/list-manager.explicit-defaults.md +1 -1
  103. package/skills/apexlang/templates/items/markdown-editor/markdown-editor._common.md +1 -1
  104. package/skills/apexlang/templates/items/markdown-editor/markdown-editor.explicit-defaults.md +1 -1
  105. package/skills/apexlang/templates/items/number-field/number-field._common.md +8 -6
  106. package/skills/apexlang/templates/items/number-field/number-field.explicit-defaults.md +12 -2
  107. package/skills/apexlang/templates/items/popup-lov/popup-lov.explicit-defaults.md +1 -1
  108. package/skills/apexlang/templates/items/rich-text-editor/rich-text-editor._common.md +1 -1
  109. package/skills/apexlang/templates/items/rich-text-editor/rich-text-editor.explicit-defaults.md +1 -1
  110. package/skills/apexlang/templates/items/select-many/standard.md +1 -1
  111. package/skills/apexlang/templates/items/shuttle/shuttle.explicit-defaults.md +1 -1
  112. package/skills/apexlang/templates/items/switch/switch._common.md +8 -8
  113. package/skills/apexlang/templates/items/switch/switch.explicit-defaults.md +1 -1
  114. package/skills/apexlang/templates/items/text-area/text-area._common.md +2 -3
  115. package/skills/apexlang/templates/items/text-area/text-area.explicit-defaults.md +1 -1
  116. package/skills/apexlang/templates/items/text-area/text-area.required-length.md +1 -3
  117. package/skills/apexlang/templates/items/text-autocomplete/text-autocomplete.explicit-defaults.md +1 -1
  118. package/skills/apexlang/templates/items/text-autocomplete/text-autocomplete.required-length.md +1 -3
  119. package/skills/apexlang/templates/items/text-field/text-field._common.md +2 -3
  120. package/skills/apexlang/templates/items/text-field/text-field.explicit-defaults.md +1 -1
  121. package/skills/apexlang/templates/items/text-field/text-field.required-length.md +1 -3
  122. package/skills/apexlang/templates/page-examples/faceted-search/faceted-search.example.md +0 -5
  123. package/skills/apexlang/templates/page-examples/form-page/form-page.example.md +0 -9
  124. package/skills/apexlang/templates/page-examples/interactive-report-page/interactive-report-page.example.md +2 -2
  125. package/skills/apexlang/templates/page-examples/login-page/login-page.example.md +0 -8
  126. package/skills/apexlang/templates/page-examples/task-definition-initiated-tasks-page/task-definition-initiated-tasks-page.example.md +7 -17
  127. package/skills/apexlang/templates/page-examples/task-definition-my-tasks-page/task-definition-my-tasks-page.example.md +7 -65
  128. package/skills/apexlang/templates/page-examples/task-definition-task-details/task-definition-task-details.example.md +38 -201
  129. package/skills/apexlang/templates/region-components/calendar/calendar.custom-styling.md +3 -1
  130. package/skills/apexlang/templates/region-components/calendar/calendar.faceted-search.md +3 -2
  131. package/skills/apexlang/templates/region-components/cards/README.md +12 -4
  132. package/skills/apexlang/templates/region-components/cards/cards._common.md +176 -37
  133. package/skills/apexlang/templates/region-components/cards/cards._index.md +2 -1
  134. package/skills/apexlang/templates/region-components/cards/cards.refresh-after-dialog.md +46 -0
  135. package/skills/apexlang/templates/region-components/cards/cards.refresh-on-change.md +58 -0
  136. package/skills/apexlang/templates/region-components/cards/cards.rest-source.md +54 -18
  137. package/skills/apexlang/templates/region-components/cards/cards.standard.md +37 -21
  138. package/skills/apexlang/templates/region-components/chart/chart._series._common.md +1 -4
  139. package/skills/apexlang/templates/region-components/chart/chart.pie.md +6 -2
  140. package/skills/apexlang/templates/region-components/chart/chart.status-meter-gauge.md +1 -1
  141. package/skills/apexlang/templates/region-components/chart/chart.stock.md +2 -0
  142. package/skills/apexlang/templates/region-components/chart/features/chart.feature-chart-links.md +9 -7
  143. package/skills/apexlang/templates/region-components/faceted-search/faceted-search._common.md +1 -14
  144. package/skills/apexlang/templates/region-components/form/form._items._common.md +1 -5
  145. package/skills/apexlang/templates/region-components/interactive-report/interactive-report._columns._common.md +2 -6
  146. package/skills/apexlang/templates/region-components/interactive-report/interactive-report.page-header-actions.md +1 -7
  147. package/skills/apexlang/templates/region-components/list/README.md +1 -1
  148. package/skills/apexlang/templates/region-components/list/list._common.md +1 -1
  149. package/skills/apexlang/templates/region-components/map/map.backgrounds.md +12 -10
  150. package/skills/apexlang/templates/region-components/map/map.layer.extruded-polygons.md +16 -12
  151. package/skills/apexlang/templates/region-components/map/map.layer.heat-map.md +10 -7
  152. package/skills/apexlang/templates/region-components/map/map.layer.lines.md +10 -8
  153. package/skills/apexlang/templates/region-components/map/map.layer.polygons.md +21 -18
  154. package/skills/apexlang/templates/region-components/map/map.region.background-custom.md +25 -19
  155. package/skills/apexlang/templates/region-components/map/map.region.background-shared.md +19 -13
  156. package/skills/apexlang/templates/region-components/map/map.region.bbox-sql.md +13 -13
  157. package/skills/apexlang/templates/region-components/map/map.region.bbox-static.md +2 -2
  158. package/skills/apexlang/templates/region-components/map/map.region.browser-location.md +3 -7
  159. package/skills/apexlang/templates/region-components/map/map.region.init-position-sql.md +7 -7
  160. package/skills/apexlang/templates/region-components/region-display-selector/README.md +5 -2
  161. package/skills/apexlang/templates/region-components/region-display-selector/region-display-selector._common.md +60 -7
  162. package/skills/apexlang/templates/region-components/region-display-selector/region-display-selector._index.md +4 -1
  163. package/skills/apexlang/templates/region-components/region-display-selector/region-display-selector.permutations.md +55 -0
  164. package/skills/apexlang/templates/region-components/region-display-selector/region-display-selector.standard.md +91 -5
  165. package/skills/apexlang/templates/region-components/smart-filter-search/README.md +6 -2
  166. package/skills/apexlang/templates/region-components/smart-filter-search/smart-filter-search._common.md +107 -46
  167. package/skills/apexlang/templates/region-components/smart-filter-search/smart-filter-search._index.md +4 -3
  168. package/skills/apexlang/templates/region-components/smart-filter-search/smart-filter-search.standard.md +33 -17
  169. package/skills/apexlang/templates/shared-components/component-settings/component-settings._common.md +1 -0
  170. package/skills/apexlang/templates/shared-components/component-settings.example.md +1 -0
  171. package/skills/apexlang/templates/shared-components/email-templates.example.md +1 -1
  172. package/skills/apexlang/templates/shared-components/rest-data-sources/example_rest_data_source.example.md +40 -46
  173. package/skills/apexlang/templates/shared-components/task-definitions/action-task.example.md +2 -30
  174. package/skills/apexlang/templates/shared-components/task-definitions/approve-request.example.md +3 -31
  175. package/skills/apexlang/templates/template-components/README.md +27 -15
  176. package/skills/apexlang/templates/template-components/avatar/README.md +56 -0
  177. package/skills/apexlang/templates/template-components/avatar/avatar._common.md +149 -0
  178. package/skills/apexlang/templates/template-components/avatar/avatar._index.md +42 -0
  179. package/skills/apexlang/templates/template-components/{avatar._template_options.md → avatar/avatar._template_options.md} +1 -1
  180. package/skills/apexlang/templates/template-components/avatar/avatar.report-icon.md +48 -0
  181. package/skills/apexlang/templates/template-components/avatar/avatar.report-image-url-column.md +62 -0
  182. package/skills/apexlang/templates/template-components/avatar/avatar.report-initials.md +54 -0
  183. package/skills/apexlang/templates/template-components/badge/README.md +38 -0
  184. package/skills/apexlang/templates/template-components/badge/badge._common.md +183 -0
  185. package/skills/apexlang/templates/template-components/badge/badge._index.md +20 -0
  186. package/skills/apexlang/templates/template-components/badge/badge.report-link.md +66 -0
  187. package/skills/apexlang/templates/template-components/badge/badge.report-minimal.md +76 -0
  188. package/skills/apexlang/templates/template-components/comments/README.md +20 -0
  189. package/skills/apexlang/templates/template-components/comments/comments._common.md +43 -0
  190. package/skills/apexlang/templates/template-components/comments/comments._index.md +25 -0
  191. package/skills/apexlang/templates/template-components/{comments._template_options.md → comments/comments._template_options.md} +2 -1
  192. package/skills/apexlang/templates/template-components/comments/comments.apex-task-comments.md +77 -0
  193. package/skills/apexlang/templates/template-components/comments/comments.partial-column.md +120 -0
  194. package/skills/apexlang/templates/template-components/comments/comments.permutations.md +425 -0
  195. package/skills/apexlang/templates/template-components/content-row/README.md +1 -1
  196. package/skills/apexlang/templates/template-components/content-row/content-row._common.md +1 -1
  197. package/skills/apexlang/templates/template-components/content-row/content-row._index.md +1 -1
  198. package/skills/apexlang/templates/template-components/content-row/content-row._template_options.md +1 -1
  199. package/skills/apexlang/templates/template-components/flexbox-container/README.md +9 -0
  200. package/skills/apexlang/templates/template-components/flexbox-container/flexbox-container._index.md +13 -0
  201. package/skills/apexlang/templates/template-components/media-list/README.md +100 -0
  202. package/skills/apexlang/templates/template-components/media-list/media-list._common.md +174 -0
  203. package/skills/apexlang/templates/template-components/media-list/media-list._index.md +50 -0
  204. package/skills/apexlang/templates/template-components/{media-list._template_options.md → media-list/media-list._template_options.md} +8 -2
  205. package/skills/apexlang/templates/template-components/media-list/media-list.partial.md +50 -0
  206. package/skills/apexlang/templates/template-components/media-list/media-list.report-avatar-badge.md +76 -0
  207. package/skills/apexlang/templates/template-components/media-list/media-list.report-base.md +71 -0
  208. package/skills/apexlang/templates/template-components/media-list/media-list.report-grouped.md +40 -0
  209. package/skills/apexlang/templates/template-components/media-list/media-list.report-layouts.md +50 -0
  210. package/skills/apexlang/templates/template-components/media-list/media-list.report-link.md +53 -0
  211. package/skills/apexlang/templates/template-components/metric-card/README.md +19 -4
  212. package/skills/apexlang/templates/template-components/metric-card/metric-card._common.md +122 -29
  213. package/skills/apexlang/templates/template-components/metric-card/metric-card._index.md +6 -0
  214. package/skills/apexlang/templates/template-components/metric-card/metric-card._template_options.md +47 -2
  215. package/skills/apexlang/templates/template-components/metric-card/metric-card.partial-minimal.md +51 -0
  216. package/skills/apexlang/templates/template-components/metric-card/metric-card.permutations.md +56 -0
  217. package/skills/apexlang/templates/template-components/metric-card/metric-card.report-avatar-badge.md +98 -0
  218. package/skills/apexlang/templates/template-components/metric-card/metric-card.report-grouping-selection.md +131 -0
  219. package/skills/apexlang/templates/template-components/metric-card/metric-card.report-link.md +66 -0
  220. package/skills/apexlang/templates/template-components/metric-card/metric-card.report-minimal.md +97 -0
  221. package/skills/apexlang/templates/template-components/template-components.registry.json +90 -1
  222. package/skills/apexlang/templates/template-components/timeline/README.md +19 -0
  223. package/skills/apexlang/templates/template-components/timeline/timeline._common.md +43 -0
  224. package/skills/apexlang/templates/template-components/timeline/timeline._index.md +24 -0
  225. package/skills/apexlang/templates/template-components/{timeline._template_options.md → timeline/timeline._template_options.md} +2 -1
  226. package/skills/apexlang/templates/template-components/timeline/timeline.permutations.md +399 -0
  227. package/skills/apexlang/templates/template-components/timeline/timeline.report-sample-data.md +168 -0
  228. package/skills/apexlang/templates/workspace-components/credentials/credentials-for-open-ai.example.md +1 -1
  229. package/skills/apexlang/templates/workspace-components/generative-ai-services/open-ai.example.md +8 -6
  230. package/skills/apexlang/tools/apexctl.mjs +167 -4
  231. package/skills/apexlang/tools/compiler-truth-audit.mjs +95 -63
  232. package/skills/apexlang/tools/query-valid-props-context.mjs +30 -0
  233. package/skills/apexlang/tools/query-valid-props-normalize.mjs +1 -0
  234. package/skills/apexlang/tools/query-valid-props-runtime.mjs +13 -8
  235. package/skills/apexlang/tools/query-valid-props-semantics.mjs +391 -0
  236. package/skills/apexlang/tools/query-valid-props-template-components.mjs +15 -1
  237. package/skills/apexlang/tools/query-valid-props.mjs +198 -216
  238. /package/skills/apexlang/templates/template-components/{badge._template_options.md → badge/badge._template_options.md} +0 -0
  239. /package/skills/apexlang/templates/template-components/{flexbox-container._template_options.md → flexbox-container/flexbox-container._template_options.md} +0 -0
@@ -0,0 +1,391 @@
1
+ const DOTTED_COMPONENT_ALIASES = new Map([
2
+ ["facetedSearch.facet", { component: "facet", parent: "region", assumes: ["94=NATIVE_FACETED_SEARCH"] }],
3
+ ["smartFilters.filter", { component: "filter", parent: "region", assumes: ["94=NATIVE_SMART_FILTERS"] }],
4
+ ["region.facetedSearch.child", { component: "facet", parent: "region", assumes: ["94=NATIVE_FACETED_SEARCH"] }],
5
+ ["map.region", { component: "region", assumes: ["94=NATIVE_MAP"] }],
6
+ ["map.layer", { component: "layer" }],
7
+ ["map.layer.source", { component: "layer", group: "source" }],
8
+ ["map.layer.columnMapping", { component: "layer", group: "columnMapping" }],
9
+ ["map.layer.tooltip", { component: "layer", group: "tooltip" }],
10
+ ["map.layer.infoWindow", { component: "layer", group: "infoWindow" }],
11
+ ["map.layer.link", { component: "layer", group: "link" }],
12
+ ["chart.region", { component: "region", assumes: ["94=NATIVE_JET_CHART"] }],
13
+ ["chart.series", { component: "series" }],
14
+ ["chart.series.marker", { component: "series", group: "marker" }],
15
+ ["chart.series.line", { component: "series", group: "line" }],
16
+ ["chart.series.label", { component: "series", group: "label" }],
17
+ ["chart.series.tooltip", { component: "series", group: "tooltip" }],
18
+ ["chart.axis", { component: "axis" }],
19
+ ["chart.axis.x", { component: "axis" }],
20
+ ["chart.axis.y", { component: "axis" }],
21
+ ["chart.axis.y2", { component: "axis" }],
22
+ ["interactiveReport.region", { component: "region", assumes: ["94=NATIVE_IR"] }],
23
+ ["interactiveGrid.region", { component: "region", assumes: ["94=NATIVE_IG"] }],
24
+ ["classicReport.region", { component: "region", assumes: ["94=NATIVE_SQL_REPORT"] }],
25
+ ["form.region", { component: "region", assumes: ["94=NATIVE_FORM"] }],
26
+ ["report.column", { component: "column", parent: "region" }],
27
+ ["report.column.heading", { component: "column", parent: "region", group: "heading" }],
28
+ ["report.column.layout", { component: "column", parent: "region", group: "layout" }],
29
+ ["report.column.source", { component: "column", parent: "region", group: "source" }],
30
+ ["report.column.appearance", { component: "column", parent: "region", group: "appearance" }],
31
+ ["report.column.link", { component: "column", parent: "region", group: "link" }],
32
+ ["pageItem.layout", { component: "pageItem", group: "layout" }],
33
+ ["pageItem.source", { component: "pageItem", group: "source" }],
34
+ ["pageItem.validation", { component: "pageItem", group: "validation" }],
35
+ ["displayOnly.source", { component: "pageItem", group: "source", assumes: ["381=DISPLAY_ONLY"] }]
36
+ ]);
37
+
38
+ const COMPILER_METADATA_PROPERTY_ALIASES = new Map([
39
+ ["app.authentication.scheme", "authenticationScheme"]
40
+ ]);
41
+
42
+ const APEXLANG_NATIVE_VALUE_ALIASES = new Map([
43
+ ["true", "Y"],
44
+ ["false", "N"],
45
+ ["normal", "NORMAL"],
46
+ ["modalDialog", "MODAL"],
47
+ ["nonModalDialog", "NON_MODAL"],
48
+ ["breadcrumb", "NATIVE_BREADCRUMB"],
49
+ ["staticContent", "NATIVE_STATIC"],
50
+ ["standard", "STANDARD"],
51
+ ["redirectThisApp", "REDIRECT_PAGE"],
52
+ ["facetedSearch", "NATIVE_FACETED_SEARCH"],
53
+ ["smartFilters", "NATIVE_SMART_FILTERS"],
54
+ ["classicReport", "NATIVE_SQL_REPORT"],
55
+ ["interactiveReport", "NATIVE_IR"],
56
+ ["interactiveGrid", "NATIVE_IG"],
57
+ ["form", "NATIVE_FORM"],
58
+ ["map", "NATIVE_MAP"],
59
+ ["chart", "NATIVE_JET_CHART"],
60
+ ["checkboxGroup", "NATIVE_CHECKBOX"],
61
+ ["radioGroup", "NATIVE_RADIOGROUP"],
62
+ ["selectList", "NATIVE_SELECT_LIST"],
63
+ ["search", "NATIVE_SEARCH"],
64
+ ["range", "NATIVE_RANGE"],
65
+ ["displayOnly", "DISPLAY_ONLY"]
66
+ ]);
67
+
68
+ const NATIVE_TYPE_FEATURES = new Map([
69
+ ["NATIVE_IR", new Set(["COLUMNS"])],
70
+ ["NATIVE_SQL_REPORT", new Set(["COLUMNS"])],
71
+ ["NATIVE_IG", new Set(["COLUMNS"])],
72
+ ["NATIVE_CHECKBOX", new Set(["VISIBLE", "LOV", "FC_HAS_FEEDBACK", "FC_SHOW_SELECTED_FIRST", "FC_SHOW_MORE_COUNT", "FC_FILTER_VALUES", "FC_LOV_DISPLAY_NULL"])],
73
+ ["NATIVE_RADIOGROUP", new Set(["VISIBLE", "LOV", "FC_HAS_FEEDBACK", "FC_SHOW_SELECTED_FIRST", "FC_SHOW_MORE_COUNT", "FC_FILTER_VALUES", "FC_LOV_DISPLAY_NULL"])],
74
+ ["NATIVE_SELECT_LIST", new Set(["VISIBLE", "LOV", "FC_HAS_FEEDBACK", "FC_FILTER_VALUES", "FC_LOV_DISPLAY_NULL"])],
75
+ ["NATIVE_RANGE", new Set(["FC_HAS_FEEDBACK"])]
76
+ ]);
77
+
78
+ export function normalizeSemanticValue(value) {
79
+ const cleaned = String(value ?? "").trim().replace(/^["']|["']$/g, "");
80
+ return APEXLANG_NATIVE_VALUE_ALIASES.get(cleaned) || cleaned;
81
+ }
82
+
83
+ export function lookupNativeTypeFeatures(value) {
84
+ const features = NATIVE_TYPE_FEATURES.get(value);
85
+ return features ? new Set(features) : undefined;
86
+ }
87
+
88
+ export function resolveDottedComponentAlias(args) {
89
+ if (!args.component || !args.component.includes(".")) {
90
+ return;
91
+ }
92
+
93
+ const alias = DOTTED_COMPONENT_ALIASES.get(args.component);
94
+ if (!alias) {
95
+ throw new Error(`Unknown dotted component alias: ${args.component}`);
96
+ }
97
+
98
+ args.component = alias.component;
99
+ if (!args.group && alias.group) {
100
+ args.group = alias.group;
101
+ }
102
+ if (alias.parent && !args.parent) {
103
+ args.parent = alias.parent;
104
+ }
105
+ if (alias.assumes?.length) {
106
+ const existing = new Set(args.assumes);
107
+ for (const assumption of alias.assumes) {
108
+ if (!existing.has(assumption)) {
109
+ args.assumes.push(assumption);
110
+ }
111
+ }
112
+ }
113
+ }
114
+
115
+ export function parseQueryAssumptions(entries) {
116
+ const byRawKey = new Map();
117
+ const byScopedName = new Map();
118
+ const byPropertyName = new Map();
119
+
120
+ for (const entry of entries) {
121
+ const pivot = entry.indexOf("=");
122
+ if (pivot === -1) {
123
+ throw new Error(`Invalid --when expression: ${entry}. Expected group.property=value or property=value`);
124
+ }
125
+ const key = entry.slice(0, pivot).trim();
126
+ const value = entry.slice(pivot + 1).trim();
127
+ if (!key || !value) {
128
+ throw new Error(`Invalid --when expression: ${entry}. Expected non-empty key and value`);
129
+ }
130
+ const normalizedValue = normalizeSemanticValue(value);
131
+ byRawKey.set(key, normalizedValue);
132
+ byScopedName.set(key, normalizedValue);
133
+ const propertyName = key.split(".").at(-1);
134
+ if (!byPropertyName.has(propertyName)) {
135
+ byPropertyName.set(propertyName, []);
136
+ }
137
+ byPropertyName.get(propertyName).push({ key, value: normalizedValue });
138
+ }
139
+
140
+ return { byRawKey, byScopedName, byPropertyName };
141
+ }
142
+
143
+ function resolveQueryConditionValue(condition, assumptionIndex) {
144
+ if (condition.propertyId && assumptionIndex.byRawKey.has(condition.propertyId)) {
145
+ return { state: "known", value: assumptionIndex.byRawKey.get(condition.propertyId) };
146
+ }
147
+
148
+ const propertyName = condition.propertyName;
149
+ if (!propertyName) {
150
+ return { state: "unknown", reason: "condition has no property name" };
151
+ }
152
+
153
+ if (assumptionIndex.byScopedName.has(propertyName)) {
154
+ return { state: "known", value: assumptionIndex.byScopedName.get(propertyName) };
155
+ }
156
+
157
+ const matches = assumptionIndex.byPropertyName.get(propertyName) || [];
158
+ if (!matches.length) {
159
+ return { state: "unknown", reason: `no assumption for ${propertyName}` };
160
+ }
161
+ if (matches.length > 1) {
162
+ return {
163
+ state: "unknown",
164
+ reason: `ambiguous assumption for ${propertyName}: ${matches.map((match) => match.key).join(", ")}`
165
+ };
166
+ }
167
+ return { state: "known", value: matches[0].value };
168
+ }
169
+
170
+ function resolveAuditConditionValue(condition, props) {
171
+ if (condition.propertyId && props[condition.propertyId] !== undefined) {
172
+ return { state: "known", value: props[condition.propertyId] };
173
+ }
174
+ if (condition.propertyName && props[condition.propertyName] !== undefined) {
175
+ return { state: "known", value: props[condition.propertyName] };
176
+ }
177
+ return { state: "unknown" };
178
+ }
179
+
180
+ function evaluateConditionLeaf(condition, values, mode) {
181
+ const resolved = mode === "query"
182
+ ? resolveQueryConditionValue(condition, values)
183
+ : resolveAuditConditionValue(condition, values);
184
+ if (resolved.state !== "known") {
185
+ return { state: "unknown", reason: resolved.reason };
186
+ }
187
+
188
+ const actual = normalizeSemanticValue(resolved.value);
189
+ const expected = mode === "audit" ? normalizeSemanticValue(condition.value) : condition.value;
190
+ const expectedValues = mode === "audit"
191
+ ? (condition.values || []).map(normalizeSemanticValue)
192
+ : condition.values || [];
193
+ switch (condition.type) {
194
+ case "EQUALS":
195
+ return { state: actual === expected ? "true" : "false" };
196
+ case "NOT_EQUALS":
197
+ return { state: actual !== expected ? "true" : "false" };
198
+ case "IN_LIST":
199
+ return { state: expectedValues.includes(actual) ? "true" : "false" };
200
+ case "NOT_IN_LIST":
201
+ return { state: expectedValues.includes(actual) ? "false" : "true" };
202
+ case "NOT_NULL":
203
+ return { state: actual ? "true" : "false" };
204
+ case "NULL":
205
+ return { state: actual ? "false" : "true" };
206
+ case "STARTS_WITH":
207
+ return { state: actual.startsWith(expected || "") ? "true" : "false" };
208
+ case "STARTS_WITH_ANY":
209
+ return { state: expectedValues.some((value) => actual.startsWith(value)) ? "true" : "false" };
210
+ case "FEATURES": {
211
+ const features = lookupNativeTypeFeatures(actual);
212
+ if (!features) {
213
+ return {
214
+ state: "unknown",
215
+ reason: mode === "query" ? `no feature map for ${actual}` : undefined
216
+ };
217
+ }
218
+ if (expectedValues.every((value) => features.has(value))) {
219
+ return { state: "true" };
220
+ }
221
+ return mode === "audit"
222
+ ? { state: "unknown" }
223
+ : { state: "false" };
224
+ }
225
+ default:
226
+ return {
227
+ state: "unknown",
228
+ reason: mode === "query" ? `unsupported operator ${condition.type}` : undefined
229
+ };
230
+ }
231
+ }
232
+
233
+ function combineConditionResults(operator, results, mode) {
234
+ const states = results.map((result) => result.state);
235
+ const requiresState = mode === "audit";
236
+ if (operator === "AND") {
237
+ if (states.includes("false")) return { state: "false" };
238
+ if ((!requiresState || states.length) && states.every((state) => state === "true")) return { state: "true" };
239
+ return { state: "unknown" };
240
+ }
241
+ if (operator === "OR") {
242
+ if (states.includes("true")) return { state: "true" };
243
+ if ((!requiresState || states.length) && states.every((state) => state === "false")) return { state: "false" };
244
+ return { state: "unknown" };
245
+ }
246
+ return { state: "unknown" };
247
+ }
248
+
249
+ function evaluateCondition(condition, values, mode) {
250
+ if (!condition) {
251
+ return { state: "true" };
252
+ }
253
+ if (condition.conditions) {
254
+ return combineConditionResults(
255
+ condition.operator || "AND",
256
+ condition.conditions.map((child) => evaluateCondition(child, values, mode)),
257
+ mode
258
+ );
259
+ }
260
+ return evaluateConditionLeaf(condition, values, mode);
261
+ }
262
+
263
+ export function evaluateQueryCondition(condition, assumptionIndex) {
264
+ return evaluateCondition(condition, assumptionIndex, "query");
265
+ }
266
+
267
+ export function evaluateAuditCondition(condition, props) {
268
+ return evaluateCondition(condition, props, "audit").state;
269
+ }
270
+
271
+ function filterRecordsByCondition(records, values, conditionKey, mode) {
272
+ const evaluated = records.map((record) => ({
273
+ record,
274
+ state: record[conditionKey]
275
+ ? evaluateCondition(record[conditionKey], values, mode).state
276
+ : "unconditional"
277
+ }));
278
+ const trueMatches = evaluated.filter((entry) => entry.state === "true").map((entry) => entry.record);
279
+ if (trueMatches.length) {
280
+ return trueMatches;
281
+ }
282
+ return evaluated.filter((entry) => entry.state !== "false").map((entry) => entry.record);
283
+ }
284
+
285
+ export function selectQueryComponents(map, args) {
286
+ let matches = map.componentTypes;
287
+ const assumptionIndex = parseQueryAssumptions(args.assumes);
288
+
289
+ if (args.componentTypeId) {
290
+ matches = matches.filter((record) => record.componentTypeId === args.componentTypeId);
291
+ }
292
+ if (args.component) {
293
+ matches = matches.filter((record) => record.singular === args.component);
294
+ }
295
+ if (args.parent) {
296
+ matches = matches.filter((record) => record.parentComponentType === args.parent);
297
+ }
298
+ if (args.assumes.length) {
299
+ matches = filterRecordsByCondition(matches, assumptionIndex, "parentDependsOn", "query");
300
+ }
301
+ if (
302
+ args.component &&
303
+ !args.componentTypeId &&
304
+ !args.parent &&
305
+ !args.assumes.length &&
306
+ matches.length > 1
307
+ ) {
308
+ const candidates = matches
309
+ .map((record) => `${record.componentTypeId} parent=${record.parentComponentType || "none"}`)
310
+ .join(", ");
311
+ throw new Error(
312
+ `Ambiguous component '${args.component}'. Add --parent, --component-type-id, or --when assumptions. Candidates: ${candidates}`
313
+ );
314
+ }
315
+ if (args.assumes.length && matches.length > 1 && !args.list) {
316
+ const candidates = matches
317
+ .map((record) => `${record.componentTypeId} parent=${record.parentComponentType || "none"}`)
318
+ .join(", ");
319
+ throw new Error(
320
+ `Ambiguous component '${args.component || "*"}' after evaluating assumptions. Add --parent or --component-type-id. Candidates: ${candidates}`
321
+ );
322
+ }
323
+
324
+ return matches.sort((left, right) => left.componentTypeId.localeCompare(right.componentTypeId));
325
+ }
326
+
327
+ export function resolveAuditComponentRecord(map, singular, parentFrame = null) {
328
+ let records = map.componentTypes.filter((record) => record.singular === singular);
329
+ if (parentFrame?.record) {
330
+ records = records.filter((record) => record.parentComponentType === parentFrame.record.singular);
331
+ records = filterRecordsByCondition(records, parentFrame.props || {}, "parentDependsOn", "audit");
332
+ } else if (records.length > 1) {
333
+ records = records.filter((record) => !record.parentComponentType);
334
+ }
335
+ if (records.length === 1) {
336
+ return { record: records[0], failure: "" };
337
+ }
338
+ return { record: null, failure: records.length ? "ambiguous" : "none", candidates: records };
339
+ }
340
+
341
+ export function buildPropertyLookup(record) {
342
+ const lookup = new Map();
343
+ for (const [groupName, props] of Object.entries(record.groups || {})) {
344
+ for (const prop of props) {
345
+ const key = `${groupName}.${prop.propertyName}`;
346
+ if (!lookup.has(key)) {
347
+ lookup.set(key, []);
348
+ }
349
+ lookup.get(key).push(prop);
350
+ }
351
+ }
352
+ return lookup;
353
+ }
354
+
355
+ function compilerMetadataPropertyNames(componentName, groupName, propertyName) {
356
+ const names = [propertyName];
357
+ const scopedKey = groupName
358
+ ? `${componentName}.${groupName}.${propertyName}`
359
+ : `${componentName}.${propertyName}`;
360
+ const alias = COMPILER_METADATA_PROPERTY_ALIASES.get(scopedKey);
361
+ if (alias && !names.includes(alias)) {
362
+ names.push(alias);
363
+ }
364
+ return names;
365
+ }
366
+
367
+ export function resolveAuditProperty({ record, componentName, groupName = "", propertyName, props = {} }) {
368
+ const compilerPropertyNames = compilerMetadataPropertyNames(componentName, groupName, propertyName);
369
+ const candidates = groupName
370
+ ? record.groups[groupName] || []
371
+ : record.properties;
372
+ const property = candidates.find((candidate) => compilerPropertyNames.includes(candidate.propertyName)) || null;
373
+ return {
374
+ property,
375
+ conditionState: property ? evaluateAuditCondition(property.dependsOn, props) : null
376
+ };
377
+ }
378
+
379
+ export function queryPropertyStatus(prop, assumptionIndex) {
380
+ const result = evaluateQueryCondition(prop.dependsOn, assumptionIndex);
381
+ if (result.state === "true") return "active";
382
+ if (result.state === "false") return "inactive";
383
+ return prop.dependsOn ? "conditional" : "active";
384
+ }
385
+
386
+ export function resolveLovValues(prop) {
387
+ if (!prop.lov?.values?.length) {
388
+ return [];
389
+ }
390
+ return prop.lov.values;
391
+ }
@@ -26,6 +26,16 @@ export const DISTILLED_TEMPLATE_COMPONENT_PROFILE_PATH = IS_PACKAGED_ROOT
26
26
  ? path.join(REPO_ROOT, "templates", "template-components", "template-component-profiles.json")
27
27
  : path.join(REPO_ROOT, "ai-context", "apexlang", "templates", "template-components", "template-component-profiles.json");
28
28
 
29
+ const TEMPLATE_COMPONENT_METADATA_PROVENANCE = {
30
+ backend: "repo-theme-export",
31
+ authority: "theme-export-metadata",
32
+ compilerBacked: false,
33
+ limitations: [
34
+ "Theme-export attributes are metadata inventory, not compiler-backed APEXlang legality.",
35
+ "Use direct compiler validation against the target APEX build for emitted structure and properties."
36
+ ]
37
+ };
38
+
29
39
  function resolveTemplateComponentDir(sourceRoot, name) {
30
40
  const aliasTarget = TEMPLATE_COMPONENT_ALIASES[name] || name;
31
41
  const pluginDir = path.join(sourceRoot, aliasTarget);
@@ -251,7 +261,7 @@ function loadTemplateComponentProfileFromSourceRoot(sourceRoot, name) {
251
261
  const templateComponentBlock = extractBraceBlock(pluginBlock.block, "templateComponent") || "";
252
262
 
253
263
  return {
254
- backend: "repo-theme-export",
264
+ ...TEMPLATE_COMPONENT_METADATA_PROVENANCE,
255
265
  theme: "universal-theme",
256
266
  requestedName: resolved.requestedName,
257
267
  resolvedName: resolved.resolvedName,
@@ -302,6 +312,9 @@ export function buildTemplateComponentCatalogFromSourceRoot(sourceRoot) {
302
312
  schemaVersion: 1,
303
313
  theme: "universal-theme",
304
314
  source: "repo-theme-export",
315
+ authority: TEMPLATE_COMPONENT_METADATA_PROVENANCE.authority,
316
+ compilerBacked: TEMPLATE_COMPONENT_METADATA_PROVENANCE.compilerBacked,
317
+ limitations: TEMPLATE_COMPONENT_METADATA_PROVENANCE.limitations,
305
318
  aliases: TEMPLATE_COMPONENT_ALIASES,
306
319
  components
307
320
  };
@@ -325,6 +338,7 @@ export function loadTemplateComponentProfile(name) {
325
338
  const profile = catalog.components[aliasKey];
326
339
  return {
327
340
  ...profile,
341
+ ...TEMPLATE_COMPONENT_METADATA_PROVENANCE,
328
342
  requestedName: name
329
343
  };
330
344
  }