@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.
- package/README.md +74 -0
- package/dist/artifacts/registry.d.ts +18 -0
- package/dist/artifacts/registry.d.ts.map +1 -0
- package/dist/artifacts/registry.js +340 -0
- package/dist/artifacts/registry.js.map +1 -0
- package/dist/artifacts/types.d.ts +122 -0
- package/dist/artifacts/types.d.ts.map +1 -0
- package/dist/artifacts/types.js +7 -0
- package/dist/artifacts/types.js.map +1 -0
- package/dist/artifacts/validators.d.ts +16 -0
- package/dist/artifacts/validators.d.ts.map +1 -0
- package/dist/artifacts/validators.js +45 -0
- package/dist/artifacts/validators.js.map +1 -0
- package/dist/fromDesign.d.ts +5 -0
- package/dist/fromDesign.d.ts.map +1 -0
- package/dist/fromDesign.js +98 -0
- package/dist/fromDesign.js.map +1 -0
- package/dist/index.js +129 -177
- package/dist/index.js.map +1 -1
- package/dist/injectDevTools.d.ts +28 -0
- package/dist/injectDevTools.d.ts.map +1 -0
- package/dist/injectDevTools.js +148 -0
- package/dist/injectDevTools.js.map +1 -0
- package/dist/scaffold.d.ts +48 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +180 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/templatePlan.d.ts +3 -0
- package/dist/templatePlan.d.ts.map +1 -0
- package/dist/templatePlan.js +43 -0
- package/dist/templatePlan.js.map +1 -0
- package/dist/utils/copyTemplate.d.ts +13 -1
- package/dist/utils/copyTemplate.d.ts.map +1 -1
- package/dist/utils/copyTemplate.js +98 -4
- package/dist/utils/copyTemplate.js.map +1 -1
- package/dist/utils/updatePackageJson.d.ts +11 -1
- package/dist/utils/updatePackageJson.d.ts.map +1 -1
- package/dist/utils/updatePackageJson.js +12 -10
- package/dist/utils/updatePackageJson.js.map +1 -1
- package/package.json +10 -7
- package/templates/_shared/dev-tools/auth/get-token.js +72 -0
- package/templates/_shared/dev-tools/dev/mock-xrm.js +42 -0
- package/templates/_shared/dev-tools/metadata-sync/index.js +152 -0
- package/templates/_shared/dev-tools/smoke/test-retrieve.js +44 -0
- package/templates/dialog-form/README.md +27 -0
- package/templates/dialog-form/_variants/App.v8.tsx +39 -0
- package/templates/dialog-form/_variants/App.v9.tsx +41 -0
- package/templates/dialog-form/gitignore +5 -0
- package/templates/dialog-form/package.json +27 -0
- package/templates/dialog-form/public/index.html +11 -0
- package/templates/dialog-form/src/index.tsx +10 -0
- package/templates/dialog-form/src/services/dataverse.ts +30 -0
- package/templates/dialog-form/tsconfig.json +15 -0
- package/templates/dialog-form/webpack.config.js +17 -0
- package/templates/grid-customizer/README.md +28 -0
- package/templates/grid-customizer/gitignore +4 -0
- package/templates/grid-customizer/package.json +25 -0
- package/templates/grid-customizer/src/GridCustomizer.ts +28 -0
- package/templates/grid-customizer/src/cell-renderers.tsx +35 -0
- package/templates/grid-customizer/src/index.ts +4 -0
- package/templates/grid-customizer/src/types/grid-types.ts +30 -0
- package/templates/grid-customizer/src/utils/color-utils.ts +24 -0
- package/templates/grid-customizer/tsconfig.json +15 -0
- package/templates/grid-customizer/webpack.config.js +17 -0
- package/templates/pcf-dataset/ControlManifest.Input.xml +16 -0
- package/templates/pcf-dataset/README.md +21 -0
- package/templates/pcf-dataset/gitignore +5 -0
- package/templates/pcf-dataset/index.ts +39 -0
- package/templates/pcf-dataset/package.json +30 -0
- package/templates/pcf-dataset/strings/{{componentName}}.1033.resx +47 -0
- package/templates/pcf-dataset/tsconfig.json +8 -0
- package/templates/pcf-dataset/{{componentName}}Component.tsx +39 -0
- package/templates/pcf-field/ControlManifest.Input.xml +17 -0
- package/templates/pcf-field/README.md +95 -0
- package/templates/pcf-field/_variants/ValueInput.boolean.tsx +24 -0
- package/templates/pcf-field/_variants/ValueInput.date.tsx +27 -0
- package/templates/pcf-field/_variants/ValueInput.number.tsx +35 -0
- package/templates/pcf-field/_variants/ValueInput.text.tsx +27 -0
- package/templates/pcf-field/gitignore +5 -0
- package/templates/pcf-field/index.ts +61 -0
- package/templates/pcf-field/package.json +30 -0
- package/templates/pcf-field/strings/{{componentName}}.1033.resx +47 -0
- package/templates/pcf-field/tsconfig.json +8 -0
- package/templates/pcf-field/{{componentName}}Component.tsx +35 -0
- package/templates/power-pages-starter/gitignore +5 -0
- package/templates/react-custom-page/gitignore +5 -0
- package/templates/{dynamics-365-starter ā react-custom-page}/package.json +3 -3
- package/templates/react-custom-page/tools/metadata-sync/index.js +152 -0
- package/templates/static-web-app/README.md +36 -0
- package/templates/static-web-app/_variants/App.v8.tsx +32 -0
- package/templates/static-web-app/_variants/App.v9.tsx +31 -0
- package/templates/static-web-app/api/host.json +12 -0
- package/templates/static-web-app/api/package.json +19 -0
- package/templates/static-web-app/api/src/functions/hello.ts +16 -0
- package/templates/static-web-app/api/tsconfig.json +14 -0
- package/templates/static-web-app/frontend/index.html +12 -0
- package/templates/static-web-app/frontend/package.json +23 -0
- package/templates/static-web-app/frontend/src/index.tsx +8 -0
- package/templates/static-web-app/frontend/tsconfig.json +16 -0
- package/templates/static-web-app/frontend/vite.config.ts +13 -0
- package/templates/static-web-app/gitignore +8 -0
- package/templates/static-web-app/package.json +15 -0
- package/templates/static-web-app/staticwebapp.config.json +7 -0
- package/templates/teams-app/README.md +27 -0
- package/templates/teams-app/_variants/graph.off.ts +7 -0
- package/templates/teams-app/_variants/graph.on.ts +22 -0
- package/templates/teams-app/appPackage/manifest.json +26 -0
- package/templates/teams-app/gitignore +5 -0
- package/templates/teams-app/index.html +12 -0
- package/templates/teams-app/package.json +26 -0
- package/templates/teams-app/src/App.tsx +25 -0
- package/templates/teams-app/src/index.tsx +8 -0
- package/templates/teams-app/tsconfig.json +16 -0
- package/templates/teams-app/vite.config.ts +9 -0
- package/templates/web-resource/README.md +39 -0
- package/templates/web-resource/_variants/App.v8.tsx +29 -0
- package/templates/web-resource/_variants/App.v9.tsx +28 -0
- package/templates/web-resource/gitignore +5 -0
- package/templates/web-resource/package.json +27 -0
- package/templates/web-resource/public/index.html +11 -0
- package/templates/web-resource/src/index.tsx +10 -0
- package/templates/web-resource/src/services/dataverse.ts +30 -0
- package/templates/web-resource/tsconfig.json +15 -0
- package/templates/web-resource/webpack.config.js +17 -0
- package/dist/utils/consultingHelpers.d.ts +0 -13
- package/dist/utils/consultingHelpers.d.ts.map +0 -1
- package/dist/utils/consultingHelpers.js +0 -569
- package/dist/utils/consultingHelpers.js.map +0 -1
- package/templates/dynamics-365-starter/INTEGRATION_TEST_RESULTS.md +0 -302
- package/templates/dynamics-365-starter/PHASE_4_COMPLETION_SUMMARY.md +0 -305
- package/templates/dynamics-365-starter/deployment/QUICKSTART-MAC.md +0 -507
- package/templates/dynamics-365-starter/deployment/QUICKSTART-WINDOWS.md +0 -372
- package/templates/dynamics-365-starter/deployment/pipelines/README.md +0 -375
- package/templates/dynamics-365-starter/deployment/pipelines/azure-pipelines.yml +0 -330
- package/templates/dynamics-365-starter/deployment/pipelines/github-actions.yml +0 -422
- package/templates/dynamics-365-starter/deployment/pipelines/jenkins.groovy +0 -636
- package/templates/dynamics-365-starter/deployment/scripts/deploy.ps1 +0 -417
- package/templates/dynamics-365-starter/deployment/scripts/deploy.sh +0 -582
- package/templates/dynamics-365-starter/deployment/scripts/team-onboarding.ps1 +0 -486
- package/templates/dynamics-365-starter/deployment/scripts/team-onboarding.sh +0 -567
- package/templates/dynamics-365-starter/deployment/scripts/validate-setup.ps1 +0 -703
- package/templates/dynamics-365-starter/deployment/scripts/validate-setup.sh +0 -671
- package/templates/dynamics-365-starter/docs/team-standards/README.md +0 -273
- package/templates/dynamics-365-starter/docs/team-standards/client-onboarding.md +0 -577
- package/templates/dynamics-365-starter/docs/team-standards/code-review-checklist.md +0 -359
- package/templates/dynamics-365-starter/docs/team-standards/coding-standards.md +0 -700
- package/templates/dynamics-365-starter/docs/team-standards/cross-platform-team-guide.md +0 -736
- package/templates/dynamics-365-starter/docs/team-standards/development-workflows.md +0 -727
- package/templates/dynamics-365-starter/docs/troubleshooting/common-errors.md +0 -758
- package/templates/dynamics-365-starter/docs/troubleshooting/platform-specific-issues.md +0 -878
- package/templates/dynamics-365-starter/src/client-project-template/README.md +0 -234
- package/templates/dynamics-365-starter/src/client-project-template/config/client.template.json +0 -114
- package/templates/dynamics-365-starter/src/client-project-template/config/environments/template.json +0 -186
- package/templates/dynamics-365-starter/src/client-project-template/scripts/client-setup.js +0 -667
- package/templates/dynamics-365-starter/src/examples/README.md +0 -52
- package/templates/dynamics-365-starter/src/examples/component-examples/opportunity-management.tsx +0 -625
- package/templates/dynamics-365-starter/src/examples/entity-examples/opportunity-model.ts +0 -545
- package/templates/dynamics-365-starter/src/examples/integration-examples/custom-pcf-wrapper.tsx +0 -722
- package/templates/dynamics-365-starter/src/examples/workflow-examples/sales-workflow.ts +0 -662
- package/templates/dynamics-365-starter/src/page-templates/EntityDashboard.tsx +0 -519
- package/templates/dynamics-365-starter/src/page-templates/EntityDetailPage.tsx +0 -456
- package/templates/dynamics-365-starter/src/page-templates/EntityListPage.tsx +0 -406
- package/templates/dynamics-365-starter/src/page-templates/RelatedEntitiesPage.tsx +0 -578
- package/templates/dynamics-365-starter/src/page-templates/SearchPage.tsx +0 -629
- package/templates/dynamics-365-starter/tools/entity-generator/index.js +0 -168
- package/templates/dynamics-365-starter/tools/entity-generator/templates/constants.template.ts +0 -124
- package/templates/dynamics-365-starter/tools/entity-generator/templates/form.template.css +0 -283
- package/templates/dynamics-365-starter/tools/entity-generator/templates/form.template.tsx +0 -275
- package/templates/dynamics-365-starter/tools/entity-generator/templates/management.template.css +0 -204
- package/templates/dynamics-365-starter/tools/entity-generator/templates/management.template.tsx +0 -413
- package/templates/dynamics-365-starter/tools/entity-generator/templates/model.template.ts +0 -250
- package/templates/dynamics-365-starter/tools/metadata-sync/d365-client.js +0 -410
- package/templates/dynamics-365-starter/tools/metadata-sync/index.js +0 -512
- package/templates/dynamics-365-starter/tools/metadata-sync/type-generator.js +0 -675
- /package/templates/{dynamics-365-starter ā react-custom-page}/README.md +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/deployment/README.md +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/docs/ARCHITECTURE_OVERVIEW.md +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/docs/BEST_PRACTICES.md +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/docs/MIGRATION_GUIDE.md +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/public/index.html +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/scripts/custom-build.js +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/components/AccountForm.css +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/components/AccountForm.tsx +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/components/AccountManagement.css +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/components/AccountManagement.tsx +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/components/ContactForm.css +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/components/ContactForm.tsx +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/components/ContactManagement.css +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/components/ContactManagement.tsx +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/components/Logging/LogDialog.tsx +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/components/Logging/LoggingContext.tsx +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/components/Logging/LoggingDebugPanel.css +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/components/Logging/LoggingDebugPanel.tsx +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/components/Logging/LoggingProvider.tsx +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/components/Logging/logger.ts +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/constants/account.ts +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/constants/contact.ts +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/index.tsx +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/models/Account.ts +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/models/BaseEntity.ts +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/models/Contact.ts +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/pcf/ContactControlWrapper.tsx +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/pcf/MultiEntityControlWrapper.tsx +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/providers/DynamicsProvider.tsx +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/services/MockApiService.ts +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/services/ServiceFactory.ts +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/services/XrmApiService.ts +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/src/styles/index.css +0 -0
- /package/templates/{dynamics-365-starter ā react-custom-page}/tsconfig.json +0 -0
- /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 {
|
|
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('
|
|
16
|
-
.version(
|
|
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('-
|
|
19
|
-
.option('-
|
|
20
|
-
.option('-
|
|
21
|
-
.option('
|
|
22
|
-
.option('
|
|
23
|
-
.option('--
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
122
|
-
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
await
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
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
|
-
|
|
201
|
-
|
|
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
|
|
205
|
-
console.log(' npm run build
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
console.log('
|
|
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
|
-
|
|
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":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;
|
|
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"}
|