@khester/create-dynamics-app 1.1.0 → 2.1.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 (210) hide show
  1. package/README.md +74 -0
  2. package/dist/artifacts/registry.d.ts +18 -0
  3. package/dist/artifacts/registry.d.ts.map +1 -0
  4. package/dist/artifacts/registry.js +340 -0
  5. package/dist/artifacts/registry.js.map +1 -0
  6. package/dist/artifacts/types.d.ts +122 -0
  7. package/dist/artifacts/types.d.ts.map +1 -0
  8. package/dist/artifacts/types.js +7 -0
  9. package/dist/artifacts/types.js.map +1 -0
  10. package/dist/artifacts/validators.d.ts +16 -0
  11. package/dist/artifacts/validators.d.ts.map +1 -0
  12. package/dist/artifacts/validators.js +45 -0
  13. package/dist/artifacts/validators.js.map +1 -0
  14. package/dist/fromDesign.d.ts +5 -0
  15. package/dist/fromDesign.d.ts.map +1 -0
  16. package/dist/fromDesign.js +98 -0
  17. package/dist/fromDesign.js.map +1 -0
  18. package/dist/index.js +129 -177
  19. package/dist/index.js.map +1 -1
  20. package/dist/injectDevTools.d.ts +28 -0
  21. package/dist/injectDevTools.d.ts.map +1 -0
  22. package/dist/injectDevTools.js +148 -0
  23. package/dist/injectDevTools.js.map +1 -0
  24. package/dist/scaffold.d.ts +48 -0
  25. package/dist/scaffold.d.ts.map +1 -0
  26. package/dist/scaffold.js +180 -0
  27. package/dist/scaffold.js.map +1 -0
  28. package/dist/templatePlan.d.ts +3 -0
  29. package/dist/templatePlan.d.ts.map +1 -0
  30. package/dist/templatePlan.js +43 -0
  31. package/dist/templatePlan.js.map +1 -0
  32. package/dist/utils/copyTemplate.d.ts +13 -1
  33. package/dist/utils/copyTemplate.d.ts.map +1 -1
  34. package/dist/utils/copyTemplate.js +98 -4
  35. package/dist/utils/copyTemplate.js.map +1 -1
  36. package/dist/utils/updatePackageJson.d.ts +11 -1
  37. package/dist/utils/updatePackageJson.d.ts.map +1 -1
  38. package/dist/utils/updatePackageJson.js +12 -10
  39. package/dist/utils/updatePackageJson.js.map +1 -1
  40. package/package.json +10 -7
  41. package/templates/_shared/dev-tools/auth/get-token.js +72 -0
  42. package/templates/_shared/dev-tools/dev/mock-xrm.js +42 -0
  43. package/templates/_shared/dev-tools/metadata-sync/index.js +152 -0
  44. package/templates/_shared/dev-tools/smoke/test-retrieve.js +44 -0
  45. package/templates/dialog-form/README.md +27 -0
  46. package/templates/dialog-form/_variants/App.v8.tsx +39 -0
  47. package/templates/dialog-form/_variants/App.v9.tsx +41 -0
  48. package/templates/dialog-form/gitignore +5 -0
  49. package/templates/dialog-form/package.json +27 -0
  50. package/templates/dialog-form/public/index.html +11 -0
  51. package/templates/dialog-form/src/index.tsx +10 -0
  52. package/templates/dialog-form/src/services/dataverse.ts +30 -0
  53. package/templates/dialog-form/tsconfig.json +15 -0
  54. package/templates/dialog-form/webpack.config.js +17 -0
  55. package/templates/grid-customizer/README.md +28 -0
  56. package/templates/grid-customizer/gitignore +4 -0
  57. package/templates/grid-customizer/package.json +25 -0
  58. package/templates/grid-customizer/src/GridCustomizer.ts +28 -0
  59. package/templates/grid-customizer/src/cell-renderers.tsx +35 -0
  60. package/templates/grid-customizer/src/index.ts +4 -0
  61. package/templates/grid-customizer/src/types/grid-types.ts +30 -0
  62. package/templates/grid-customizer/src/utils/color-utils.ts +24 -0
  63. package/templates/grid-customizer/tsconfig.json +15 -0
  64. package/templates/grid-customizer/webpack.config.js +17 -0
  65. package/templates/pcf-dataset/ControlManifest.Input.xml +16 -0
  66. package/templates/pcf-dataset/README.md +21 -0
  67. package/templates/pcf-dataset/gitignore +5 -0
  68. package/templates/pcf-dataset/index.ts +39 -0
  69. package/templates/pcf-dataset/package.json +30 -0
  70. package/templates/pcf-dataset/strings/{{componentName}}.1033.resx +47 -0
  71. package/templates/pcf-dataset/tsconfig.json +8 -0
  72. package/templates/pcf-dataset/{{componentName}}Component.tsx +39 -0
  73. package/templates/pcf-field/ControlManifest.Input.xml +17 -0
  74. package/templates/pcf-field/README.md +95 -0
  75. package/templates/pcf-field/_variants/ValueInput.boolean.tsx +24 -0
  76. package/templates/pcf-field/_variants/ValueInput.date.tsx +27 -0
  77. package/templates/pcf-field/_variants/ValueInput.number.tsx +35 -0
  78. package/templates/pcf-field/_variants/ValueInput.text.tsx +27 -0
  79. package/templates/pcf-field/gitignore +5 -0
  80. package/templates/pcf-field/index.ts +61 -0
  81. package/templates/pcf-field/package.json +30 -0
  82. package/templates/pcf-field/strings/{{componentName}}.1033.resx +47 -0
  83. package/templates/pcf-field/tsconfig.json +8 -0
  84. package/templates/pcf-field/{{componentName}}Component.tsx +35 -0
  85. package/templates/power-pages-starter/gitignore +5 -0
  86. package/templates/react-custom-page/gitignore +5 -0
  87. package/templates/{dynamics-365-starter → react-custom-page}/package.json +3 -3
  88. package/templates/react-custom-page/tools/metadata-sync/index.js +152 -0
  89. package/templates/static-web-app/README.md +36 -0
  90. package/templates/static-web-app/_variants/App.v8.tsx +32 -0
  91. package/templates/static-web-app/_variants/App.v9.tsx +31 -0
  92. package/templates/static-web-app/api/host.json +12 -0
  93. package/templates/static-web-app/api/package.json +19 -0
  94. package/templates/static-web-app/api/src/functions/hello.ts +16 -0
  95. package/templates/static-web-app/api/tsconfig.json +14 -0
  96. package/templates/static-web-app/frontend/index.html +12 -0
  97. package/templates/static-web-app/frontend/package.json +23 -0
  98. package/templates/static-web-app/frontend/src/index.tsx +8 -0
  99. package/templates/static-web-app/frontend/tsconfig.json +16 -0
  100. package/templates/static-web-app/frontend/vite.config.ts +13 -0
  101. package/templates/static-web-app/gitignore +8 -0
  102. package/templates/static-web-app/package.json +15 -0
  103. package/templates/static-web-app/staticwebapp.config.json +7 -0
  104. package/templates/teams-app/README.md +27 -0
  105. package/templates/teams-app/_variants/graph.off.ts +7 -0
  106. package/templates/teams-app/_variants/graph.on.ts +22 -0
  107. package/templates/teams-app/appPackage/manifest.json +26 -0
  108. package/templates/teams-app/gitignore +5 -0
  109. package/templates/teams-app/index.html +12 -0
  110. package/templates/teams-app/package.json +26 -0
  111. package/templates/teams-app/src/App.tsx +25 -0
  112. package/templates/teams-app/src/index.tsx +8 -0
  113. package/templates/teams-app/tsconfig.json +16 -0
  114. package/templates/teams-app/vite.config.ts +9 -0
  115. package/templates/web-resource/README.md +39 -0
  116. package/templates/web-resource/_variants/App.v8.tsx +29 -0
  117. package/templates/web-resource/_variants/App.v9.tsx +28 -0
  118. package/templates/web-resource/gitignore +5 -0
  119. package/templates/web-resource/package.json +27 -0
  120. package/templates/web-resource/public/index.html +11 -0
  121. package/templates/web-resource/src/index.tsx +10 -0
  122. package/templates/web-resource/src/services/dataverse.ts +30 -0
  123. package/templates/web-resource/tsconfig.json +15 -0
  124. package/templates/web-resource/webpack.config.js +17 -0
  125. package/dist/utils/consultingHelpers.d.ts +0 -13
  126. package/dist/utils/consultingHelpers.d.ts.map +0 -1
  127. package/dist/utils/consultingHelpers.js +0 -569
  128. package/dist/utils/consultingHelpers.js.map +0 -1
  129. package/templates/dynamics-365-starter/INTEGRATION_TEST_RESULTS.md +0 -302
  130. package/templates/dynamics-365-starter/PHASE_4_COMPLETION_SUMMARY.md +0 -305
  131. package/templates/dynamics-365-starter/deployment/QUICKSTART-MAC.md +0 -507
  132. package/templates/dynamics-365-starter/deployment/QUICKSTART-WINDOWS.md +0 -372
  133. package/templates/dynamics-365-starter/deployment/pipelines/README.md +0 -375
  134. package/templates/dynamics-365-starter/deployment/pipelines/azure-pipelines.yml +0 -330
  135. package/templates/dynamics-365-starter/deployment/pipelines/github-actions.yml +0 -422
  136. package/templates/dynamics-365-starter/deployment/pipelines/jenkins.groovy +0 -636
  137. package/templates/dynamics-365-starter/deployment/scripts/deploy.ps1 +0 -417
  138. package/templates/dynamics-365-starter/deployment/scripts/deploy.sh +0 -582
  139. package/templates/dynamics-365-starter/deployment/scripts/team-onboarding.ps1 +0 -486
  140. package/templates/dynamics-365-starter/deployment/scripts/team-onboarding.sh +0 -567
  141. package/templates/dynamics-365-starter/deployment/scripts/validate-setup.ps1 +0 -703
  142. package/templates/dynamics-365-starter/deployment/scripts/validate-setup.sh +0 -671
  143. package/templates/dynamics-365-starter/docs/team-standards/README.md +0 -273
  144. package/templates/dynamics-365-starter/docs/team-standards/client-onboarding.md +0 -577
  145. package/templates/dynamics-365-starter/docs/team-standards/code-review-checklist.md +0 -359
  146. package/templates/dynamics-365-starter/docs/team-standards/coding-standards.md +0 -700
  147. package/templates/dynamics-365-starter/docs/team-standards/cross-platform-team-guide.md +0 -736
  148. package/templates/dynamics-365-starter/docs/team-standards/development-workflows.md +0 -727
  149. package/templates/dynamics-365-starter/docs/troubleshooting/common-errors.md +0 -758
  150. package/templates/dynamics-365-starter/docs/troubleshooting/platform-specific-issues.md +0 -878
  151. package/templates/dynamics-365-starter/src/client-project-template/README.md +0 -234
  152. package/templates/dynamics-365-starter/src/client-project-template/config/client.template.json +0 -114
  153. package/templates/dynamics-365-starter/src/client-project-template/config/environments/template.json +0 -186
  154. package/templates/dynamics-365-starter/src/client-project-template/scripts/client-setup.js +0 -667
  155. package/templates/dynamics-365-starter/src/examples/README.md +0 -52
  156. package/templates/dynamics-365-starter/src/examples/component-examples/opportunity-management.tsx +0 -625
  157. package/templates/dynamics-365-starter/src/examples/entity-examples/opportunity-model.ts +0 -545
  158. package/templates/dynamics-365-starter/src/examples/integration-examples/custom-pcf-wrapper.tsx +0 -722
  159. package/templates/dynamics-365-starter/src/examples/workflow-examples/sales-workflow.ts +0 -662
  160. package/templates/dynamics-365-starter/src/page-templates/EntityDashboard.tsx +0 -519
  161. package/templates/dynamics-365-starter/src/page-templates/EntityDetailPage.tsx +0 -456
  162. package/templates/dynamics-365-starter/src/page-templates/EntityListPage.tsx +0 -406
  163. package/templates/dynamics-365-starter/src/page-templates/RelatedEntitiesPage.tsx +0 -578
  164. package/templates/dynamics-365-starter/src/page-templates/SearchPage.tsx +0 -629
  165. package/templates/dynamics-365-starter/tools/entity-generator/index.js +0 -168
  166. package/templates/dynamics-365-starter/tools/entity-generator/templates/constants.template.ts +0 -124
  167. package/templates/dynamics-365-starter/tools/entity-generator/templates/form.template.css +0 -283
  168. package/templates/dynamics-365-starter/tools/entity-generator/templates/form.template.tsx +0 -275
  169. package/templates/dynamics-365-starter/tools/entity-generator/templates/management.template.css +0 -204
  170. package/templates/dynamics-365-starter/tools/entity-generator/templates/management.template.tsx +0 -413
  171. package/templates/dynamics-365-starter/tools/entity-generator/templates/model.template.ts +0 -250
  172. package/templates/dynamics-365-starter/tools/metadata-sync/d365-client.js +0 -410
  173. package/templates/dynamics-365-starter/tools/metadata-sync/index.js +0 -512
  174. package/templates/dynamics-365-starter/tools/metadata-sync/type-generator.js +0 -675
  175. /package/templates/{dynamics-365-starter → react-custom-page}/README.md +0 -0
  176. /package/templates/{dynamics-365-starter → react-custom-page}/deployment/README.md +0 -0
  177. /package/templates/{dynamics-365-starter → react-custom-page}/docs/ARCHITECTURE_OVERVIEW.md +0 -0
  178. /package/templates/{dynamics-365-starter → react-custom-page}/docs/BEST_PRACTICES.md +0 -0
  179. /package/templates/{dynamics-365-starter → react-custom-page}/docs/MIGRATION_GUIDE.md +0 -0
  180. /package/templates/{dynamics-365-starter → react-custom-page}/public/index.html +0 -0
  181. /package/templates/{dynamics-365-starter → react-custom-page}/scripts/custom-build.js +0 -0
  182. /package/templates/{dynamics-365-starter → react-custom-page}/src/components/AccountForm.css +0 -0
  183. /package/templates/{dynamics-365-starter → react-custom-page}/src/components/AccountForm.tsx +0 -0
  184. /package/templates/{dynamics-365-starter → react-custom-page}/src/components/AccountManagement.css +0 -0
  185. /package/templates/{dynamics-365-starter → react-custom-page}/src/components/AccountManagement.tsx +0 -0
  186. /package/templates/{dynamics-365-starter → react-custom-page}/src/components/ContactForm.css +0 -0
  187. /package/templates/{dynamics-365-starter → react-custom-page}/src/components/ContactForm.tsx +0 -0
  188. /package/templates/{dynamics-365-starter → react-custom-page}/src/components/ContactManagement.css +0 -0
  189. /package/templates/{dynamics-365-starter → react-custom-page}/src/components/ContactManagement.tsx +0 -0
  190. /package/templates/{dynamics-365-starter → react-custom-page}/src/components/Logging/LogDialog.tsx +0 -0
  191. /package/templates/{dynamics-365-starter → react-custom-page}/src/components/Logging/LoggingContext.tsx +0 -0
  192. /package/templates/{dynamics-365-starter → react-custom-page}/src/components/Logging/LoggingDebugPanel.css +0 -0
  193. /package/templates/{dynamics-365-starter → react-custom-page}/src/components/Logging/LoggingDebugPanel.tsx +0 -0
  194. /package/templates/{dynamics-365-starter → react-custom-page}/src/components/Logging/LoggingProvider.tsx +0 -0
  195. /package/templates/{dynamics-365-starter → react-custom-page}/src/components/Logging/logger.ts +0 -0
  196. /package/templates/{dynamics-365-starter → react-custom-page}/src/constants/account.ts +0 -0
  197. /package/templates/{dynamics-365-starter → react-custom-page}/src/constants/contact.ts +0 -0
  198. /package/templates/{dynamics-365-starter → react-custom-page}/src/index.tsx +0 -0
  199. /package/templates/{dynamics-365-starter → react-custom-page}/src/models/Account.ts +0 -0
  200. /package/templates/{dynamics-365-starter → react-custom-page}/src/models/BaseEntity.ts +0 -0
  201. /package/templates/{dynamics-365-starter → react-custom-page}/src/models/Contact.ts +0 -0
  202. /package/templates/{dynamics-365-starter → react-custom-page}/src/pcf/ContactControlWrapper.tsx +0 -0
  203. /package/templates/{dynamics-365-starter → react-custom-page}/src/pcf/MultiEntityControlWrapper.tsx +0 -0
  204. /package/templates/{dynamics-365-starter → react-custom-page}/src/providers/DynamicsProvider.tsx +0 -0
  205. /package/templates/{dynamics-365-starter → react-custom-page}/src/services/MockApiService.ts +0 -0
  206. /package/templates/{dynamics-365-starter → react-custom-page}/src/services/ServiceFactory.ts +0 -0
  207. /package/templates/{dynamics-365-starter → react-custom-page}/src/services/XrmApiService.ts +0 -0
  208. /package/templates/{dynamics-365-starter → react-custom-page}/src/styles/index.css +0 -0
  209. /package/templates/{dynamics-365-starter → react-custom-page}/tsconfig.json +0 -0
  210. /package/templates/{dynamics-365-starter → react-custom-page}/webpack.config.js +0 -0
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Input validators. User-supplied values (project name, PCF namespace /
3
+ * component name) are substituted raw into XML manifests, JSON, TypeScript
4
+ * identifiers, and filenames — so they must be format-checked before they enter
5
+ * the substitution bag, both from interactive prompts and from CLI flags.
6
+ */
7
+ /** A single PascalCase-ish identifier (PCF constructor / component name). */
8
+ const PCF_IDENTIFIER = /^[A-Za-z][A-Za-z0-9]*$/;
9
+ /** A dot-separated set of identifiers (PCF namespace). */
10
+ const PCF_NAMESPACE = /^[A-Za-z][A-Za-z0-9]*(\.[A-Za-z][A-Za-z0-9]*)*$/;
11
+ /** npm-name-safe + filesystem-safe project name. */
12
+ const PROJECT_NAME = /^[A-Za-z0-9._-]+$/;
13
+ export function validateComponentName(value) {
14
+ return PCF_IDENTIFIER.test(value)
15
+ ? true
16
+ : `Component name must be a single identifier (letters/digits, starting with a letter), e.g. "RatingField". Got: ${JSON.stringify(value)}`;
17
+ }
18
+ export function validateNamespace(value) {
19
+ return PCF_NAMESPACE.test(value)
20
+ ? true
21
+ : `Namespace must be one or more dot-separated identifiers, e.g. "Contoso" or "Contoso.Controls". Got: ${JSON.stringify(value)}`;
22
+ }
23
+ /**
24
+ * Coerce an arbitrary name (e.g. a hyphenated project name) into a valid PCF
25
+ * identifier — PascalCase, alphanumeric, starting with a letter. Used to derive
26
+ * a safe default `componentName` so we never offer an invalid PCF constructor.
27
+ */
28
+ export function toIdentifier(value) {
29
+ const joined = value
30
+ .split(/[^A-Za-z0-9]+/)
31
+ .filter(Boolean)
32
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
33
+ .join('');
34
+ return /^[A-Za-z]/.test(joined) ? joined : `Control${joined}`;
35
+ }
36
+ export function validateProjectName(value) {
37
+ if (!value)
38
+ return 'Project name is required.';
39
+ if (value === '.' || value === '..')
40
+ return 'Project name cannot be "." or "..".';
41
+ return PROJECT_NAME.test(value)
42
+ ? true
43
+ : `Project name may only contain letters, digits, ".", "_" and "-" (no spaces, slashes, or quotes). Got: ${JSON.stringify(value)}`;
44
+ }
45
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/artifacts/validators.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6EAA6E;AAC7E,MAAM,cAAc,GAAG,wBAAwB,CAAC;AAChD,0DAA0D;AAC1D,MAAM,aAAa,GAAG,iDAAiD,CAAC;AACxE,oDAAoD;AACpD,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEzC,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,iHAAiH,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;AAC/I,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,uGAAuG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;AACrI,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,MAAM,GAAG,KAAK;SACjB,KAAK,CAAC,eAAe,CAAC;SACtB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,2BAA2B,CAAC;IAC/C,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,qCAAqC,CAAC;IAClF,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,yGAAyG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;AACvI,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ArtifactDescriptor, ComponentLibrary } from './artifacts/types.js';
2
+ /** Whether `--from-design` is available for an artifact. */
3
+ export declare function supportsFromDesign(descriptor: ArtifactDescriptor): boolean;
4
+ export declare function scaffoldFromDesign(descriptor: ArtifactDescriptor, projectName: string, projectPath: string, library: ComponentLibrary | undefined, designPath: string): Promise<void>;
5
+ //# sourceMappingURL=fromDesign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromDesign.d.ts","sourceRoot":"","sources":["../src/fromDesign.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAgBjF,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAE1E;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,kBAAkB,EAC9B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,gBAAgB,GAAG,SAAS,EACrC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAqFf"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * From-design scaffolding: turn a form-builder export (a FormBuilderProject JSON)
3
+ * into a deployable artifact by running the export engine's generators.
4
+ *
5
+ * `previewExport` returns the full project as `GeneratedFile[]` (host + form code +
6
+ * a design-derived data-access layer + its own token tooling) for the artifact's
7
+ * export target; we write those to disk. The v9-required gate is checked first via
8
+ * `validateExportTarget`, which RETURNS a result (it does not throw).
9
+ *
10
+ * NOTE: the output is structurally DIFFERENT from the blank-starter templates — it
11
+ * is generated by @dataverse-kit/export-engine (e.g. a CRA-based web resource), ships
12
+ * its OWN token tooling, and is recorded by `package.json.dynamicsKit.artifact`. The
13
+ * driver therefore skips create-app's dev-tools injection for from-design.
14
+ */
15
+ import fs from 'fs-extra';
16
+ import path from 'path';
17
+ import chalk from 'chalk';
18
+ import { previewExport, validateExportTarget } from '@dataverse-kit/export-engine';
19
+ /** Export targets the export engine can generate from a design. */
20
+ const EXPORTABLE = ['web-resource', 'pcf', 'static-web-app'];
21
+ /** The export-engine target for an artifact, or undefined if from-design is unsupported. */
22
+ function exportTargetOf(descriptor) {
23
+ return EXPORTABLE.find((t) => t === descriptor.exportTarget);
24
+ }
25
+ /** Whether `--from-design` is available for an artifact. */
26
+ export function supportsFromDesign(descriptor) {
27
+ return exportTargetOf(descriptor) !== undefined;
28
+ }
29
+ export async function scaffoldFromDesign(descriptor, projectName, projectPath, library, designPath) {
30
+ const target = exportTargetOf(descriptor);
31
+ if (!target) {
32
+ console.error(chalk.red(`āŒ --from-design is not supported for "${descriptor.id}".`) +
33
+ ` Supported targets: web-resource, pcf, static-web-app.`);
34
+ process.exit(1);
35
+ return;
36
+ }
37
+ if (!(await fs.pathExists(designPath))) {
38
+ console.error(chalk.red(`āŒ Design file not found: ${designPath}`));
39
+ process.exit(1);
40
+ }
41
+ let project;
42
+ try {
43
+ project = (await fs.readJson(designPath));
44
+ }
45
+ catch (e) {
46
+ console.error(chalk.red(`āŒ Design file is not valid JSON: ${String(e)}`));
47
+ process.exit(1);
48
+ return;
49
+ }
50
+ if (!Array.isArray(project.forms) || project.forms.length === 0) {
51
+ console.error(chalk.red('āŒ Design file has no `forms` — is it a FormBuilderProject export?'));
52
+ process.exit(1);
53
+ }
54
+ const options = {
55
+ target,
56
+ projectName,
57
+ includeDeployScript: false,
58
+ minify: false,
59
+ exportMethod: 'folder',
60
+ ...(library ? { componentLibrary: library } : {}),
61
+ };
62
+ // The v9-required gate RETURNS a result; it does not throw.
63
+ const check = validateExportTarget(project, options);
64
+ if (!check.ok) {
65
+ console.error(chalk.red('\nāŒ This design uses Fluent v9-only controls but resolves to Fluent v8'));
66
+ console.error(chalk.gray(' (from your --v8/--library flag or the project default):'));
67
+ for (const ref of check.reason.required) {
68
+ const control = ref.controlType ?? JSON.stringify(ref);
69
+ const form = ref.formName;
70
+ console.error(chalk.gray(` - ${control}${form ? ` on form "${form}"` : ''}`));
71
+ }
72
+ console.error(chalk.cyan('\n Re-run with --v9 to generate Fluent v9 output.\n'));
73
+ process.exit(1);
74
+ }
75
+ let files;
76
+ try {
77
+ files = previewExport(project, options);
78
+ }
79
+ catch (e) {
80
+ console.error(chalk.red('āŒ Could not generate from this design — it parsed as JSON but is not a complete FormBuilderProject.'));
81
+ console.error(chalk.gray(String(e instanceof Error ? e.message : e)));
82
+ process.exit(1);
83
+ return;
84
+ }
85
+ // Write each generated file, refusing any path that escapes the project directory.
86
+ const projectRoot = path.resolve(projectPath);
87
+ for (const file of files) {
88
+ const dest = path.resolve(projectRoot, file.path);
89
+ if (dest !== projectRoot && !dest.startsWith(projectRoot + path.sep)) {
90
+ console.error(chalk.red(`āŒ Generated file path escapes the project directory: ${file.path}`));
91
+ process.exit(1);
92
+ }
93
+ await fs.outputFile(dest, file.content);
94
+ }
95
+ console.log(chalk.green(` āœ“ Generated ${files.length} files from ${project.forms.length} form(s) in "${project.name}".`));
96
+ console.log(chalk.gray(' ā„¹ļø The export engine generated a typed data layer + token tooling — see the project README.'));
97
+ }
98
+ //# sourceMappingURL=fromDesign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromDesign.js","sourceRoot":"","sources":["../src/fromDesign.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -5,218 +5,170 @@ import chalk from 'chalk';
5
5
  import path from 'path';
6
6
  import fs from 'fs-extra';
7
7
  import { copyTemplate } from './utils/copyTemplate.js';
8
+ import { applyTemplatePlan } from './templatePlan.js';
9
+ import { injectDevTools, applyConditionalDeps } from './injectDevTools.js';
10
+ import { scaffoldFromDesign, supportsFromDesign } from './fromDesign.js';
8
11
  import { updatePackageJson } from './utils/updatePackageJson.js';
9
12
  import { installDependencies } from './utils/installDependencies.js';
10
13
  import { initGit } from './utils/initGit.js';
11
- import { generateEntities, generatePageTemplates, customizeForDeployment, } from './utils/consultingHelpers.js';
14
+ import { ARTIFACTS } from './artifacts/registry.js';
15
+ import { validateProjectName } from './artifacts/validators.js';
16
+ import { CLI_VERSION, resolveArtifact, resolveLibraryFromFlags, resolveWithComponents, runArtifactPrompts, buildTemplateVariables, } from './scaffold.js';
12
17
  const program = new Command();
13
18
  program
14
19
  .name('create-dynamics-app')
15
- .description('Create a new Dynamics UI Kit project - Enterprise Consulting Edition')
16
- .version('2.0.0')
20
+ .description('Scaffold Dynamics 365 / Power Platform artifacts (unified CLI)')
21
+ .version(CLI_VERSION)
17
22
  .argument('<project-name>', 'name of the project')
18
- .option('-t, --template <template>', 'template to use (power-pages, dynamics-365)')
19
- .option('-c, --client-name <name>', 'client name for project customization')
20
- .option('-e, --entities <entities>', 'comma-separated list of entities to generate (e.g., "opportunity,quote,invoice")')
21
- .option('-p, --page-type <type>', 'specific page template (entity-list, entity-detail, entity-dashboard, search, related-entities)')
22
- .option('-d, --deployment-target <target>', 'target environment (dev, test, prod)')
23
- .option('--generate-sample', 'generate sample entities and pages for demonstration')
23
+ .option('-a, --artifact <id>', `artifact type (${ARTIFACTS.filter((a) => a.available).map((a) => a.id).join(', ')})`)
24
+ .option('-t, --template <template>', '[deprecated] legacy template flag')
25
+ .option('-l, --library <library>', 'component library: fluent-v8 (default) or fluent-v9')
26
+ .option('--v8', 'shorthand for --library fluent-v8')
27
+ .option('--v9', 'shorthand for --library fluent-v9')
28
+ .option('-n, --namespace <namespace>', 'namespace for PCF control')
29
+ .option('--component-name <name>', 'component name for PCF control')
30
+ .option('--property-type <type>', 'PCF bound property type (e.g. SingleLine.Text, TwoOptions)')
31
+ .option('--graph', 'include Microsoft Graph integration (teams-app)')
32
+ .option('--with-components', 'install @khester/reusable-components (Fluent v8) — react-custom-page, power-pages, web-resource, dialog-form')
33
+ .option('--from-design <file>', 'generate from a form-builder export (FormBuilderProject JSON)')
24
34
  .option('--skip-git', 'skip git repository initialization')
25
35
  .option('--skip-install', 'skip dependency installation')
26
36
  .action(async (projectName, options) => {
27
37
  try {
28
- console.log(chalk.cyan(`\nšŸš€ Creating ${projectName} - Enterprise Consulting Edition...\n`));
29
38
  // Validate project name
30
- if (!projectName ||
31
- projectName.includes('/') ||
32
- projectName.includes('\\')) {
33
- console.error(chalk.red('āŒ Please provide a valid project name'));
39
+ const nameCheck = validateProjectName(projectName);
40
+ if (nameCheck !== true) {
41
+ console.error(chalk.red(`āŒ ${nameCheck}`));
42
+ process.exit(1);
43
+ }
44
+ if (options.fromDesign && options.template) {
45
+ console.error(chalk.red('āŒ --from-design cannot be combined with the deprecated --template; use --artifact.'));
34
46
  process.exit(1);
35
47
  }
36
48
  const projectPath = path.resolve(process.cwd(), projectName);
37
- // Check if directory already exists
38
49
  if (await fs.pathExists(projectPath)) {
39
50
  console.error(chalk.red(`āŒ Directory ${projectName} already exists`));
40
51
  process.exit(1);
41
52
  }
42
- let template = options.template;
43
- let clientName = options.clientName;
44
- let entities = options.entities;
45
- let pageType = options.pageType;
46
- let deploymentTarget = options.deploymentTarget;
47
- // Enhanced prompts for consulting workflow
48
- if (!template) {
49
- const answers = await inquirer.prompt([
50
- {
51
- type: 'list',
52
- name: 'template',
53
- message: 'Which template would you like to use?',
54
- choices: [
55
- {
56
- name: '🌐 Power Pages - For Power Pages portal development',
57
- value: 'power-pages',
58
- },
59
- {
60
- name: '⚔ Dynamics 365 - For Dynamics 365 custom controls and forms (Recommended for consulting)',
61
- value: 'dynamics-365',
62
- },
63
- ],
64
- },
65
- ]);
66
- template = answers.template;
53
+ const descriptor = await resolveArtifact(options);
54
+ if (options.fromDesign && !supportsFromDesign(descriptor)) {
55
+ console.error(chalk.red(`āŒ --from-design is not supported for "${descriptor.id}".`) +
56
+ ' Supported targets: web-resource, pcf, static-web-app.');
57
+ process.exit(1);
67
58
  }
68
- // Consulting-specific prompts for Dynamics 365 template
69
- if (template === 'dynamics-365') {
70
- const consultingAnswers = await inquirer.prompt([
71
- {
72
- type: 'input',
73
- name: 'clientName',
74
- message: 'Client name (for project customization):',
75
- default: clientName || 'Client',
76
- when: !clientName,
77
- },
78
- {
79
- type: 'input',
80
- name: 'entities',
81
- message: 'Entities to generate (comma-separated, e.g., "opportunity,quote,invoice"):',
82
- default: entities || '',
83
- when: !entities && !options.generateSample,
84
- },
85
- {
86
- type: 'list',
87
- name: 'pageType',
88
- message: 'Primary page template to include:',
89
- choices: [
90
- {
91
- name: 'šŸ“‹ Entity List - Standard CRUD list page',
92
- value: 'entity-list',
93
- },
94
- {
95
- name: 'šŸ“„ Entity Detail - Master-detail view',
96
- value: 'entity-detail',
97
- },
98
- {
99
- name: 'šŸ“Š Entity Dashboard - KPI and analytics view',
100
- value: 'entity-dashboard',
101
- },
102
- { name: 'šŸ” Search Page - Cross-entity search', value: 'search' },
103
- {
104
- name: 'šŸ”— Related Entities - Master-detail relationships',
105
- value: 'related-entities',
106
- },
107
- {
108
- name: 'šŸŽÆ All Templates - Include all page templates',
109
- value: 'all',
110
- },
111
- ],
112
- default: pageType || 'all',
113
- when: !pageType,
114
- },
115
- {
116
- type: 'list',
117
- name: 'deploymentTarget',
118
- message: 'Primary deployment target:',
119
- choices: [
59
+ console.log(chalk.cyan(`\nšŸš€ Creating ${projectName} — ${descriptor.label}\n`));
60
+ // Resolve the library + (blank path) prompts/vars BEFORE creating the directory,
61
+ // so an input-validation failure exits without leaving an orphaned project dir.
62
+ let library;
63
+ // `vars` is only used by the blank path (drives conditionalDeps).
64
+ let vars;
65
+ if (options.fromDesign) {
66
+ // Library comes from flags; export-engine resolves it from the design when unset.
67
+ library = resolveLibraryFromFlags(options);
68
+ if (options.withComponents) {
69
+ console.log(chalk.yellow("āš ļø --with-components is ignored with --from-design (the generated output ships the export engine's own dependencies)."));
70
+ }
71
+ }
72
+ else {
73
+ if (descriptor.supportsLibraryChoice) {
74
+ library = resolveLibraryFromFlags(options);
75
+ if (!library && !process.stdin.isTTY) {
76
+ library = descriptor.defaultLibrary ?? 'fluent-v8';
77
+ }
78
+ if (!library) {
79
+ const reply = await inquirer.prompt([
120
80
  {
121
- name: 'šŸ› ļø Development - Local development environment',
122
- value: 'dev',
81
+ type: 'list',
82
+ name: 'library',
83
+ message: 'Fluent UI version for generated output:',
84
+ choices: [
85
+ { name: 'Fluent UI v8 (Power Pages / Canvas PCF safe)', value: 'fluent-v8' },
86
+ { name: 'Fluent UI v9 (modern)', value: 'fluent-v9' },
87
+ ],
88
+ default: descriptor.defaultLibrary ?? 'fluent-v8',
123
89
  },
124
- { name: '🧪 Test - Testing environment', value: 'test' },
125
- { name: 'šŸš€ Production - Production environment', value: 'prod' },
126
- ],
127
- default: deploymentTarget || 'dev',
128
- when: !deploymentTarget,
129
- },
130
- {
131
- type: 'confirm',
132
- name: 'generateSample',
133
- message: 'Generate sample entities and pages for demonstration?',
134
- default: options.generateSample || false,
135
- when: !options.generateSample && !entities,
136
- },
137
- ]);
138
- clientName = clientName || consultingAnswers.clientName;
139
- entities = entities || consultingAnswers.entities;
140
- pageType = pageType || consultingAnswers.pageType;
141
- deploymentTarget =
142
- deploymentTarget || consultingAnswers.deploymentTarget;
143
- options.generateSample =
144
- options.generateSample || consultingAnswers.generateSample;
145
- }
146
- // Validate template
147
- if (!template || !['power-pages', 'dynamics-365'].includes(template)) {
148
- console.error(chalk.red('āŒ Invalid template. Choose power-pages or dynamics-365'));
149
- process.exit(1);
90
+ ]);
91
+ library = reply.library;
92
+ }
93
+ }
94
+ // --with-components: opt-in @khester/reusable-components (Fluent v8).
95
+ const wc = resolveWithComponents(descriptor, library, options.withComponents);
96
+ if (wc.kind === 'warn') {
97
+ console.log(chalk.yellow(`āš ļø ${wc.message}`));
98
+ }
99
+ else if (wc.kind === 'error') {
100
+ console.error(chalk.red(`āŒ ${wc.message}`));
101
+ process.exit(1);
102
+ }
103
+ const answers = await runArtifactPrompts(descriptor, projectName, options);
104
+ vars = buildTemplateVariables(descriptor, projectName, answers, library, options.withComponents);
150
105
  }
151
- // Create project directory
106
+ // From here on we touch the filesystem. Clean up the created directory on any
107
+ // failure so a transient error doesn't permanently block a retry (create refuses
108
+ // a non-empty directory).
152
109
  await fs.ensureDir(projectPath);
153
- // Copy template files
154
- await copyTemplate(template, projectPath);
155
- // Update package.json with project name and client info
156
- await updatePackageJson(projectPath, projectName, clientName);
157
- // Generate entities if specified
158
- if (template === 'dynamics-365' && (entities || options.generateSample)) {
159
- await generateEntities(projectPath, entities, options.generateSample);
160
- }
161
- // Generate page templates if specified
162
- if (template === 'dynamics-365' && pageType) {
163
- await generatePageTemplates(projectPath, pageType, entities, options.generateSample);
164
- }
165
- // Customize for deployment target
166
- if (deploymentTarget) {
167
- await customizeForDeployment(projectPath, deploymentTarget);
168
- }
169
- // Initialize git repository
170
- if (!options.skipGit) {
171
- await initGit(projectPath);
110
+ try {
111
+ if (options.fromDesign) {
112
+ await scaffoldFromDesign(descriptor, projectName, projectPath, library, options.fromDesign);
113
+ }
114
+ else {
115
+ await copyTemplate(descriptor.templateDir, projectPath, vars);
116
+ await applyTemplatePlan(projectPath, descriptor, vars);
117
+ }
118
+ const provenance = {
119
+ cliVersion: CLI_VERSION,
120
+ artifact: descriptor.id,
121
+ componentLibrary: library,
122
+ templateVersion: descriptor.templateVersion,
123
+ };
124
+ await updatePackageJson(projectPath, projectName, { provenance });
125
+ // From-design output ships the export engine's own tooling — don't inject ours
126
+ // (a second, incompatible token chain) on top. Blank starters get the dev-tools.
127
+ if (!options.fromDesign) {
128
+ await injectDevTools(projectPath, descriptor.devTools);
129
+ if (vars)
130
+ await applyConditionalDeps(projectPath, descriptor, vars);
131
+ }
132
+ if (!options.skipGit) {
133
+ await initGit(projectPath);
134
+ }
135
+ if (!options.skipInstall) {
136
+ await installDependencies(projectPath);
137
+ }
172
138
  }
173
- // Install dependencies
174
- if (!options.skipInstall) {
175
- await installDependencies(projectPath);
139
+ catch (err) {
140
+ await fs.remove(projectPath).catch(() => undefined);
141
+ throw err;
176
142
  }
177
- // Success message with consulting-specific information
178
143
  console.log(chalk.green(`\nāœ… Successfully created ${projectName}!\n`));
179
- if (clientName) {
180
- console.log(chalk.blue(`šŸ‘¤ Client: ${clientName}`));
181
- }
182
- if (entities) {
183
- console.log(chalk.blue(`šŸ“Š Generated entities: ${entities}`));
184
- }
185
- if (pageType && pageType !== 'all') {
186
- console.log(chalk.blue(`šŸ“„ Page template: ${pageType}`));
187
- }
188
- if (deploymentTarget) {
189
- console.log(chalk.blue(`šŸŽÆ Deployment target: ${deploymentTarget}`));
190
- }
191
- console.log(chalk.cyan('\nšŸ“ Next steps:'));
144
+ console.log(chalk.cyan('šŸ“ Next steps:'));
192
145
  console.log(` cd ${projectName}`);
193
- if (options.skipInstall) {
146
+ if (options.skipInstall)
194
147
  console.log(' npm install');
195
- }
196
- if (template === 'power-pages') {
148
+ if (descriptor.id === 'power-pages') {
197
149
  console.log(' npm run dev # Start development server');
198
150
  console.log(' npm run build # Build for production');
199
- console.log("\nšŸ“– Don't forget to:");
200
- console.log(' - Copy .env.example to .env');
201
- console.log(' - Set your PORTAL_URL in .env');
151
+ console.log("\nšŸ“– Don't forget to copy .env.example to .env and set PORTAL_URL.");
152
+ }
153
+ else if (descriptor.id === 'pcf-field' || descriptor.id === 'pcf-dataset') {
154
+ console.log(' npm run build # Build the control');
155
+ console.log(' npm start # Start the PCF test harness');
202
156
  }
203
157
  else {
204
- console.log(' npm run build:dev # Build for development');
205
- console.log(' npm run build:prod # Build for production');
206
- console.log(' npm run start # Start development server');
207
- if (entities || options.generateSample) {
208
- console.log('\nšŸ”§ Entity generator commands:');
209
- console.log(' npm run generate:entity -- --entity customentity --display-name "Custom Entity"');
158
+ console.log(' npm run dev # Start development server');
159
+ console.log(' npm run build # Build for production');
160
+ if (descriptor.devTools.includes('codegen')) {
161
+ console.log('\nšŸ”§ Generate typed entities from a live org:');
162
+ console.log(' npm run metadata:pull -- --entities account,contact');
210
163
  }
211
- console.log('\nšŸ“– Consulting workflow:');
212
- console.log(' 1. Review generated entities and customize field constants');
213
- console.log(' 2. Update validation rules in entity models');
214
- console.log(' 3. Customize page templates for client requirements');
215
- console.log(' 4. Run quality checks: npm run quality');
216
- console.log(' 5. Deploy: npm run build:d365');
217
- console.log('\nšŸ“š Check docs/ folder for deployment guides');
218
164
  }
219
- console.log(chalk.magenta('\nšŸŽ‰ Ready for enterprise consulting!\n'));
165
+ if (library === 'fluent-v9') {
166
+ console.log(chalk.gray('\nā„¹ļø Fluent v9 selected — code is emitted and builds. A blank v9 form renders bare until you add controls.'));
167
+ }
168
+ if (!options.fromDesign && options.withComponents && descriptor.supportsComponents) {
169
+ console.log(chalk.gray("\nšŸ“¦ @khester/reusable-components installed — e.g. import { ReusableCard, CustomSection } from '@khester/reusable-components'."));
170
+ }
171
+ console.log(chalk.magenta('\nšŸŽ‰ Done.\n'));
220
172
  }
221
173
  catch (error) {
222
174
  console.error(chalk.red('āŒ An error occurred:'), error);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { ArtifactDescriptor, DevToolId } from './artifacts/types.js';
2
+ interface PackageJson {
3
+ scripts?: Record<string, string>;
4
+ dependencies?: Record<string, string>;
5
+ devDependencies?: Record<string, string>;
6
+ [key: string]: unknown;
7
+ }
8
+ /** Compare two npm version ranges loosely; return the higher (keeping its prefix). */
9
+ export declare function pickHigherRange(a: string, b: string): string;
10
+ export interface DevToolPlan {
11
+ pkg: PackageJson;
12
+ filesToCopy: Array<{
13
+ from: string;
14
+ to: string;
15
+ }>;
16
+ added: string[];
17
+ skipped: DevToolId[];
18
+ warnings: string[];
19
+ }
20
+ /** Pure: compute the merged package.json + file-copy plan. No IO. */
21
+ export declare function planDevTools(pkg: PackageJson, toolIds: DevToolId[]): DevToolPlan;
22
+ /** Impure: apply the dev-tool plan to a generated project. */
23
+ export declare function injectDevTools(projectPath: string, toolIds: DevToolId[]): Promise<void>;
24
+ /** Add an artifact's conditional dependencies whose `when(vars)` predicate holds.
25
+ * Each condition may target a sub-package via `packagePath` (e.g. an SWA `frontend`). */
26
+ export declare function applyConditionalDeps(projectPath: string, descriptor: ArtifactDescriptor, vars: Record<string, string>): Promise<void>;
27
+ export {};
28
+ //# sourceMappingURL=injectDevTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectDevTools.d.ts","sourceRoot":"","sources":["../src/injectDevTools.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAwC1E,UAAU,WAAW;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,WAAW,CAAC;IACjB,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,WAAW,CAyChF;AAED,8DAA8D;AAC9D,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB7F;AAED;yFACyF;AACzF,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,kBAAkB,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC,CAkCf"}