@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,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inject the dev-tools an artifact declares (`descriptor.devTools`) into a
|
|
3
|
+
* generated project: merge npm scripts + deps into package.json and copy the tool
|
|
4
|
+
* files from templates/_shared/dev-tools.
|
|
5
|
+
*
|
|
6
|
+
* Collision policy (the review's concern — naive "template-wins" silently drops a
|
|
7
|
+
* tool's wiring): if the template ALREADY defines any of a tool's script names,
|
|
8
|
+
* the whole tool is skipped (the template provides it) and a notice is printed —
|
|
9
|
+
* never a silent half-merge. Dependency clashes take the higher version range.
|
|
10
|
+
*/
|
|
11
|
+
import fs from 'fs-extra';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
const sharedToolsDir = fileURLToPath(new URL('../templates/_shared/dev-tools', import.meta.url));
|
|
15
|
+
const CODEGEN_DEP = { '@dataverse-kit/dataverse-codegen': '^0.1.0' };
|
|
16
|
+
const DEV_TOOLS = {
|
|
17
|
+
token: {
|
|
18
|
+
scripts: { 'auth:token': 'node tools/auth/get-token.js' },
|
|
19
|
+
files: [{ from: 'auth/get-token.js', to: 'tools/auth/get-token.js' }],
|
|
20
|
+
},
|
|
21
|
+
serve: {
|
|
22
|
+
// No script (the artifact's own dev server runs); just ship the mock-Xrm helper.
|
|
23
|
+
files: [{ from: 'dev/mock-xrm.js', to: 'tools/dev/mock-xrm.js' }],
|
|
24
|
+
},
|
|
25
|
+
codegen: {
|
|
26
|
+
scripts: {
|
|
27
|
+
'metadata:pull': 'node tools/metadata-sync/index.js pull',
|
|
28
|
+
'metadata:sync': 'node tools/metadata-sync/index.js sync',
|
|
29
|
+
'metadata:generate': 'node tools/metadata-sync/index.js generate',
|
|
30
|
+
'metadata:validate': 'node tools/metadata-sync/index.js validate',
|
|
31
|
+
},
|
|
32
|
+
devDependencies: { commander: '^11.1.0', ...CODEGEN_DEP },
|
|
33
|
+
files: [{ from: 'metadata-sync/index.js', to: 'tools/metadata-sync/index.js' }],
|
|
34
|
+
},
|
|
35
|
+
smoke: {
|
|
36
|
+
scripts: { 'smoke:live': 'node tools/smoke/test-retrieve.js' },
|
|
37
|
+
devDependencies: { ...CODEGEN_DEP },
|
|
38
|
+
files: [{ from: 'smoke/test-retrieve.js', to: 'tools/smoke/test-retrieve.js' }],
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
/** Compare two npm version ranges loosely; return the higher (keeping its prefix). */
|
|
42
|
+
export function pickHigherRange(a, b) {
|
|
43
|
+
const nums = (r) => r.replace(/^[^0-9]*/, '').split('.').map((n) => parseInt(n, 10) || 0);
|
|
44
|
+
const x = nums(a);
|
|
45
|
+
const y = nums(b);
|
|
46
|
+
for (let i = 0; i < 3; i++) {
|
|
47
|
+
if ((x[i] || 0) !== (y[i] || 0))
|
|
48
|
+
return (x[i] || 0) > (y[i] || 0) ? a : b;
|
|
49
|
+
}
|
|
50
|
+
return a;
|
|
51
|
+
}
|
|
52
|
+
/** Pure: compute the merged package.json + file-copy plan. No IO. */
|
|
53
|
+
export function planDevTools(pkg, toolIds) {
|
|
54
|
+
const out = JSON.parse(JSON.stringify(pkg));
|
|
55
|
+
out.scripts = out.scripts || {};
|
|
56
|
+
out.dependencies = out.dependencies || {};
|
|
57
|
+
out.devDependencies = out.devDependencies || {};
|
|
58
|
+
const filesToCopy = [];
|
|
59
|
+
const added = [];
|
|
60
|
+
const skipped = [];
|
|
61
|
+
const warnings = [];
|
|
62
|
+
for (const id of toolIds) {
|
|
63
|
+
const tool = DEV_TOOLS[id];
|
|
64
|
+
if (!tool)
|
|
65
|
+
continue;
|
|
66
|
+
const scriptNames = Object.keys(tool.scripts || {});
|
|
67
|
+
const collisions = scriptNames.filter((s) => out.scripts[s] !== undefined);
|
|
68
|
+
if (scriptNames.length > 0 && collisions.length > 0) {
|
|
69
|
+
skipped.push(id);
|
|
70
|
+
warnings.push(`dev-tool "${id}" skipped — template already defines: ${collisions.join(', ')}`);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
for (const [name, cmd] of Object.entries(tool.scripts || {})) {
|
|
74
|
+
out.scripts[name] = cmd;
|
|
75
|
+
added.push(name);
|
|
76
|
+
}
|
|
77
|
+
for (const [dep, ver] of Object.entries(tool.dependencies || {})) {
|
|
78
|
+
out.dependencies[dep] = out.dependencies[dep]
|
|
79
|
+
? pickHigherRange(out.dependencies[dep], ver)
|
|
80
|
+
: ver;
|
|
81
|
+
}
|
|
82
|
+
for (const [dep, ver] of Object.entries(tool.devDependencies || {})) {
|
|
83
|
+
out.devDependencies[dep] = out.devDependencies[dep]
|
|
84
|
+
? pickHigherRange(out.devDependencies[dep], ver)
|
|
85
|
+
: ver;
|
|
86
|
+
}
|
|
87
|
+
for (const f of tool.files || [])
|
|
88
|
+
filesToCopy.push(f);
|
|
89
|
+
}
|
|
90
|
+
return { pkg: out, filesToCopy, added, skipped, warnings };
|
|
91
|
+
}
|
|
92
|
+
/** Impure: apply the dev-tool plan to a generated project. */
|
|
93
|
+
export async function injectDevTools(projectPath, toolIds) {
|
|
94
|
+
if (!toolIds || toolIds.length === 0)
|
|
95
|
+
return;
|
|
96
|
+
const pkgPath = path.join(projectPath, 'package.json');
|
|
97
|
+
if (!(await fs.pathExists(pkgPath)))
|
|
98
|
+
return;
|
|
99
|
+
const pkg = (await fs.readJson(pkgPath));
|
|
100
|
+
const plan = planDevTools(pkg, toolIds);
|
|
101
|
+
for (const f of plan.filesToCopy) {
|
|
102
|
+
await fs.ensureDir(path.dirname(path.join(projectPath, f.to)));
|
|
103
|
+
await fs.copy(path.join(sharedToolsDir, f.from), path.join(projectPath, f.to), {
|
|
104
|
+
overwrite: true,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
await fs.writeJson(pkgPath, plan.pkg, { spaces: 2 });
|
|
108
|
+
for (const w of plan.warnings)
|
|
109
|
+
console.log(` ℹ️ ${w}`);
|
|
110
|
+
}
|
|
111
|
+
/** Add an artifact's conditional dependencies whose `when(vars)` predicate holds.
|
|
112
|
+
* Each condition may target a sub-package via `packagePath` (e.g. an SWA `frontend`). */
|
|
113
|
+
export async function applyConditionalDeps(projectPath, descriptor, vars) {
|
|
114
|
+
const conds = (descriptor.conditionalDeps ?? []).filter((c) => c.when(vars));
|
|
115
|
+
if (conds.length === 0)
|
|
116
|
+
return;
|
|
117
|
+
// Group matched conditions by their target package.json (default: root).
|
|
118
|
+
const byPath = new Map();
|
|
119
|
+
for (const cond of conds) {
|
|
120
|
+
const rel = cond.packagePath ?? '.';
|
|
121
|
+
(byPath.get(rel) ?? byPath.set(rel, []).get(rel)).push(cond);
|
|
122
|
+
}
|
|
123
|
+
for (const [rel, group] of byPath) {
|
|
124
|
+
const pkgPath = path.join(projectPath, rel, 'package.json');
|
|
125
|
+
if (!(await fs.pathExists(pkgPath)))
|
|
126
|
+
continue;
|
|
127
|
+
const pkg = (await fs.readJson(pkgPath));
|
|
128
|
+
let changed = false;
|
|
129
|
+
for (const cond of group) {
|
|
130
|
+
const buckets = [
|
|
131
|
+
['dependencies', cond.dependencies],
|
|
132
|
+
['devDependencies', cond.devDependencies],
|
|
133
|
+
];
|
|
134
|
+
for (const [field, deps] of buckets) {
|
|
135
|
+
if (!deps)
|
|
136
|
+
continue;
|
|
137
|
+
pkg[field] = pkg[field] || {};
|
|
138
|
+
for (const [dep, ver] of Object.entries(deps)) {
|
|
139
|
+
pkg[field][dep] = pkg[field][dep] ? pickHigherRange(pkg[field][dep], ver) : ver;
|
|
140
|
+
changed = true;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (changed)
|
|
145
|
+
await fs.writeJson(pkgPath, pkg, { spaces: 2 });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=injectDevTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injectDevTools.js","sourceRoot":"","sources":["../src/injectDevTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ArtifactDescriptor, ComponentLibrary } from './artifacts/types.js';
|
|
2
|
+
export declare const CLI_VERSION: string;
|
|
3
|
+
export interface ProjectOptions {
|
|
4
|
+
artifact?: string;
|
|
5
|
+
template?: string;
|
|
6
|
+
library?: string;
|
|
7
|
+
v8?: boolean;
|
|
8
|
+
v9?: boolean;
|
|
9
|
+
namespace?: string;
|
|
10
|
+
componentName?: string;
|
|
11
|
+
propertyType?: string;
|
|
12
|
+
graph?: boolean;
|
|
13
|
+
withComponents?: boolean;
|
|
14
|
+
fromDesign?: string;
|
|
15
|
+
skipGit?: boolean;
|
|
16
|
+
skipInstall?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Resolve the chosen Fluent library from flags, or undefined to prompt/default. */
|
|
19
|
+
export declare function resolveLibraryFromFlags(options: ProjectOptions): ComponentLibrary | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Outcome of resolving `--with-components` against an artifact + chosen library.
|
|
22
|
+
* Pure so the driver's guard is unit-testable (index.ts just prints + exits).
|
|
23
|
+
* - `apply`: inject @khester/reusable-components
|
|
24
|
+
* - `skip`: flag not set
|
|
25
|
+
* - `warn`: flag set but the artifact can't host the components → warn, continue
|
|
26
|
+
* - `error`: flag set with Fluent v9 on a v8/v9 host → print + exit non-zero
|
|
27
|
+
*/
|
|
28
|
+
export type WithComponentsOutcome = {
|
|
29
|
+
kind: 'apply';
|
|
30
|
+
} | {
|
|
31
|
+
kind: 'skip';
|
|
32
|
+
} | {
|
|
33
|
+
kind: 'warn';
|
|
34
|
+
message: string;
|
|
35
|
+
} | {
|
|
36
|
+
kind: 'error';
|
|
37
|
+
message: string;
|
|
38
|
+
};
|
|
39
|
+
export declare function resolveWithComponents(descriptor: ArtifactDescriptor, library: ComponentLibrary | undefined, withComponents: boolean | undefined): WithComponentsOutcome;
|
|
40
|
+
/** Map known CLI flags to prompt answers so we don't re-ask for them. */
|
|
41
|
+
export declare function prefilledAnswers(options: ProjectOptions): Record<string, string>;
|
|
42
|
+
/** Run an artifact's prompts, skipping any already provided via flags. */
|
|
43
|
+
export declare function runArtifactPrompts(descriptor: ArtifactDescriptor, projectName: string, options: ProjectOptions): Promise<Record<string, string>>;
|
|
44
|
+
/** Build the `{{var}}` substitution bag from answers + the artifact's derive() hook. */
|
|
45
|
+
export declare function buildTemplateVariables(descriptor: ArtifactDescriptor, projectName: string, answers: Record<string, string>, library?: ComponentLibrary, withComponents?: boolean): Record<string, string>;
|
|
46
|
+
/** Resolve the artifact to scaffold from flags/prompts; handles legacy --template. */
|
|
47
|
+
export declare function resolveArtifact(options: ProjectOptions): Promise<ArtifactDescriptor>;
|
|
48
|
+
//# sourceMappingURL=scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAEjB,MAAM,sBAAsB,CAAC;AAG9B,eAAO,MAAM,WAAW,QAA8D,CAAC;AAEvF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,cAAc,GAAG,gBAAgB,GAAG,SAAS,CAO7F;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAIvC,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,kBAAkB,EAC9B,OAAO,EAAE,gBAAgB,GAAG,SAAS,EACrC,cAAc,EAAE,OAAO,GAAG,SAAS,GAClC,qBAAqB,CAiBvB;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOhF;AAED,0EAA0E;AAC1E,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,kBAAkB,EAC9B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwDjC;AAED,wFAAwF;AACxF,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,kBAAkB,EAC9B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,CAAC,EAAE,gBAAgB,EAC1B,cAAc,CAAC,EAAE,OAAO,GACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBxB;AAED,sFAAsF;AACtF,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsE1F"}
|
package/dist/scaffold.js
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scaffold driver helpers — extracted from the commander entrypoint so they are
|
|
3
|
+
* importable + unit-testable without triggering `program.parse()`. The orchestration
|
|
4
|
+
* (the ordered steps) lives in `index.ts`; the decision logic lives here.
|
|
5
|
+
*/
|
|
6
|
+
import inquirer from 'inquirer';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { createRequire } from 'module';
|
|
9
|
+
import { availableArtifacts, getArtifact, TEMPLATE_FLAG_MIGRATIONS, } from './artifacts/registry.js';
|
|
10
|
+
import { toIdentifier } from './artifacts/validators.js';
|
|
11
|
+
const require = createRequire(import.meta.url);
|
|
12
|
+
export const CLI_VERSION = require('../package.json').version;
|
|
13
|
+
/** Resolve the chosen Fluent library from flags, or undefined to prompt/default. */
|
|
14
|
+
export function resolveLibraryFromFlags(options) {
|
|
15
|
+
if (options.v9)
|
|
16
|
+
return 'fluent-v9';
|
|
17
|
+
if (options.v8)
|
|
18
|
+
return 'fluent-v8';
|
|
19
|
+
if (options.library === 'fluent-v8' || options.library === 'fluent-v9') {
|
|
20
|
+
return options.library;
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
const COMPONENT_HOSTS = 'react-custom-page, power-pages, web-resource, dialog-form';
|
|
25
|
+
export function resolveWithComponents(descriptor, library, withComponents) {
|
|
26
|
+
if (!withComponents)
|
|
27
|
+
return { kind: 'skip' };
|
|
28
|
+
if (!descriptor.supportsComponents) {
|
|
29
|
+
return {
|
|
30
|
+
kind: 'warn',
|
|
31
|
+
message: `--with-components is ignored for "${descriptor.id}". Supported: ${COMPONENT_HOSTS}.`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (library === 'fluent-v9') {
|
|
35
|
+
return {
|
|
36
|
+
kind: 'error',
|
|
37
|
+
message: `--with-components ships Fluent v8 components and can't combine with Fluent v9 on "${descriptor.id}". ` +
|
|
38
|
+
'Re-run with --v8 (or drop --with-components).',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return { kind: 'apply' };
|
|
42
|
+
}
|
|
43
|
+
/** Map known CLI flags to prompt answers so we don't re-ask for them. */
|
|
44
|
+
export function prefilledAnswers(options) {
|
|
45
|
+
const pre = {};
|
|
46
|
+
if (options.namespace)
|
|
47
|
+
pre.namespace = options.namespace;
|
|
48
|
+
if (options.componentName)
|
|
49
|
+
pre.componentName = options.componentName;
|
|
50
|
+
if (options.propertyType)
|
|
51
|
+
pre.propertyType = options.propertyType;
|
|
52
|
+
if (options.graph)
|
|
53
|
+
pre.graph = 'true';
|
|
54
|
+
return pre;
|
|
55
|
+
}
|
|
56
|
+
/** Run an artifact's prompts, skipping any already provided via flags. */
|
|
57
|
+
export async function runArtifactPrompts(descriptor, projectName, options) {
|
|
58
|
+
const answers = prefilledAnswers(options);
|
|
59
|
+
for (const spec of descriptor.prompts) {
|
|
60
|
+
// Flag-supplied values bypass the prompt — validate them here so they don't
|
|
61
|
+
// slip past `spec.validate` (which inquirer only enforces interactively).
|
|
62
|
+
if (answers[spec.name] !== undefined) {
|
|
63
|
+
if (spec.validate) {
|
|
64
|
+
const result = spec.validate(answers[spec.name]);
|
|
65
|
+
if (result !== true) {
|
|
66
|
+
console.error(chalk.red(`❌ ${result}`));
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (spec.when && !spec.when(answers))
|
|
73
|
+
continue;
|
|
74
|
+
// The PCF component name defaults to a valid identifier derived from the project name.
|
|
75
|
+
const fallback = spec.default ?? (spec.name === 'componentName' ? toIdentifier(projectName) : undefined);
|
|
76
|
+
// Non-interactive: use the default; error if the prompt has none (needs a flag).
|
|
77
|
+
if (!process.stdin.isTTY) {
|
|
78
|
+
if (fallback === undefined) {
|
|
79
|
+
console.error(chalk.red(`❌ "${spec.name}" is required in non-interactive mode — provide the matching flag.`));
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
if (spec.validate) {
|
|
83
|
+
const result = spec.validate(fallback);
|
|
84
|
+
if (result !== true) {
|
|
85
|
+
console.error(chalk.red(`❌ ${result}`));
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
answers[spec.name] = fallback;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const reply = await inquirer.prompt([
|
|
93
|
+
{
|
|
94
|
+
type: spec.type ?? 'input',
|
|
95
|
+
name: spec.name,
|
|
96
|
+
message: spec.message,
|
|
97
|
+
// confirm prompts take a boolean default; our defaults are strings.
|
|
98
|
+
default: spec.type === 'confirm' ? fallback === 'true' : fallback,
|
|
99
|
+
choices: spec.choices,
|
|
100
|
+
validate: spec.validate,
|
|
101
|
+
},
|
|
102
|
+
]);
|
|
103
|
+
answers[spec.name] = String(reply[spec.name]);
|
|
104
|
+
}
|
|
105
|
+
return answers;
|
|
106
|
+
}
|
|
107
|
+
/** Build the `{{var}}` substitution bag from answers + the artifact's derive() hook. */
|
|
108
|
+
export function buildTemplateVariables(descriptor, projectName, answers, library, withComponents) {
|
|
109
|
+
let vars = { projectName, ...answers };
|
|
110
|
+
// Derived vars are data-driven per artifact (replaces hard-coded per-id logic).
|
|
111
|
+
if (descriptor.derive) {
|
|
112
|
+
vars = { ...vars, ...descriptor.derive(answers, { projectName }) };
|
|
113
|
+
}
|
|
114
|
+
if (descriptor.supportsLibraryChoice && library) {
|
|
115
|
+
vars.componentLibrary = library;
|
|
116
|
+
}
|
|
117
|
+
// Opt-in @khester/reusable-components (Fluent v8). Only honored on a host that
|
|
118
|
+
// can consume them; the driver guards `--with-components --v9` before this point.
|
|
119
|
+
if (descriptor.supportsComponents && withComponents) {
|
|
120
|
+
vars.withComponents = 'true';
|
|
121
|
+
}
|
|
122
|
+
// Always return the bag. Substitution is keyed on `{{name}}`, so it is a safe
|
|
123
|
+
// no-op on templates without placeholders — and this guarantees `{{projectName}}`
|
|
124
|
+
// is honored if a template adds it later (the old length-based guard silently skipped it).
|
|
125
|
+
return vars;
|
|
126
|
+
}
|
|
127
|
+
/** Resolve the artifact to scaffold from flags/prompts; handles legacy --template. */
|
|
128
|
+
export async function resolveArtifact(options) {
|
|
129
|
+
// --template and --artifact are mutually exclusive (avoid one silently winning).
|
|
130
|
+
if (options.template && options.artifact) {
|
|
131
|
+
console.error(chalk.red('❌ --template (deprecated) and --artifact cannot be combined.') +
|
|
132
|
+
` Use --artifact ${options.artifact}.`);
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
// Legacy --template flag: passthrough (power-pages) or hard-deprecate.
|
|
136
|
+
if (options.template) {
|
|
137
|
+
const migration = TEMPLATE_FLAG_MIGRATIONS[options.template];
|
|
138
|
+
if (!migration) {
|
|
139
|
+
console.error(chalk.red(`❌ Unknown --template "${options.template}".`) +
|
|
140
|
+
` Use --artifact instead (one of: ${availableArtifacts().map((a) => a.id).join(', ')}).`);
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
if (migration.mode === 'hard-deprecate') {
|
|
144
|
+
console.error(chalk.yellow(`\n⚠️ --template ${options.template} has been removed in create-dynamics-app v${CLI_VERSION}.`) +
|
|
145
|
+
chalk.gray(`\n The old flow generated entity/page/deployment code that is no longer shipped,` +
|
|
146
|
+
`\n so the output would differ from what you expect.\n`) +
|
|
147
|
+
chalk.cyan(` Use: create-dynamics-app <name> --artifact ${migration.artifact}\n`));
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
// passthrough
|
|
151
|
+
const descriptor = getArtifact(migration.artifact);
|
|
152
|
+
if (descriptor && descriptor.available) {
|
|
153
|
+
console.log(chalk.gray(`(note: --template ${options.template} is deprecated; prefer --artifact ${migration.artifact})`));
|
|
154
|
+
return descriptor;
|
|
155
|
+
}
|
|
156
|
+
console.error(chalk.red(`❌ Artifact "${migration.artifact}" is not available yet.`));
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
// Explicit --artifact flag.
|
|
160
|
+
if (options.artifact) {
|
|
161
|
+
const descriptor = getArtifact(options.artifact);
|
|
162
|
+
if (!descriptor || !descriptor.available) {
|
|
163
|
+
console.error(chalk.red(`❌ Unknown or unavailable artifact "${options.artifact}".`) +
|
|
164
|
+
` Choose one of: ${availableArtifacts().map((a) => a.id).join(', ')}.`);
|
|
165
|
+
process.exit(1);
|
|
166
|
+
}
|
|
167
|
+
return descriptor;
|
|
168
|
+
}
|
|
169
|
+
// Interactive picker.
|
|
170
|
+
const { artifact } = await inquirer.prompt([
|
|
171
|
+
{
|
|
172
|
+
type: 'list',
|
|
173
|
+
name: 'artifact',
|
|
174
|
+
message: 'What would you like to scaffold?',
|
|
175
|
+
choices: availableArtifacts().map((a) => ({ name: a.label, value: a.id })),
|
|
176
|
+
},
|
|
177
|
+
]);
|
|
178
|
+
return getArtifact(artifact);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templatePlan.d.ts","sourceRoot":"","sources":["../src/templatePlan.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAY/D,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,kBAAkB,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-copy template plan: applies an artifact's `variants` (select one file per a
|
|
3
|
+
* derived key) and `prune` (delete scaffolding leftovers). Runs after `copyTemplate`
|
|
4
|
+
* has copied + substituted the whole template, so variant sources are already
|
|
5
|
+
* substituted before one is chosen.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'fs-extra';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
/** Resolve a template-relative path, refusing anything that escapes the project dir. */
|
|
10
|
+
function safeJoin(root, rel) {
|
|
11
|
+
const resolvedRoot = path.resolve(root);
|
|
12
|
+
const full = path.resolve(resolvedRoot, rel);
|
|
13
|
+
if (full !== resolvedRoot && !full.startsWith(resolvedRoot + path.sep)) {
|
|
14
|
+
throw new Error(`Path ${JSON.stringify(rel)} escapes the project directory.`);
|
|
15
|
+
}
|
|
16
|
+
return full;
|
|
17
|
+
}
|
|
18
|
+
export async function applyTemplatePlan(projectPath, descriptor, vars) {
|
|
19
|
+
// 1. Variant selection — pick one source file per the value of `choose`.
|
|
20
|
+
for (const variant of descriptor.variants ?? []) {
|
|
21
|
+
const key = vars[variant.choose];
|
|
22
|
+
if (key === undefined) {
|
|
23
|
+
throw new Error(`Variant selector "${variant.choose}" has no value — did the artifact's derive() set it?`);
|
|
24
|
+
}
|
|
25
|
+
const source = variant.cases[key];
|
|
26
|
+
if (source === undefined) {
|
|
27
|
+
throw new Error(`No variant case for ${variant.choose}=${JSON.stringify(key)} ` +
|
|
28
|
+
`(available: ${Object.keys(variant.cases).join(', ')}).`);
|
|
29
|
+
}
|
|
30
|
+
const from = safeJoin(projectPath, source);
|
|
31
|
+
const to = safeJoin(projectPath, variant.to);
|
|
32
|
+
if (!(await fs.pathExists(from))) {
|
|
33
|
+
throw new Error(`Variant source not found in template: ${source}`);
|
|
34
|
+
}
|
|
35
|
+
await fs.ensureDir(path.dirname(to));
|
|
36
|
+
await fs.copy(from, to, { overwrite: true });
|
|
37
|
+
}
|
|
38
|
+
// 2. Prune scaffolding leftovers (e.g. the _variants/ directory).
|
|
39
|
+
for (const rel of descriptor.prune ?? []) {
|
|
40
|
+
await fs.remove(safeJoin(projectPath, rel));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=templatePlan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templatePlan.js","sourceRoot":"","sources":["../src/templatePlan.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,wFAAwF;AACxF,SAAS,QAAQ,CAAC,IAAY,EAAE,GAAW;IACzC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,UAA8B,EAC9B,IAA4B;IAE5B,yEAAyE;IACzE,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,qBAAqB,OAAO,CAAC,MAAM,sDAAsD,CAC1F,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,uBAAuB,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG;gBAC7D,eAAe,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAC3D,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,yCAAyC,MAAM,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,kEAAkE;IAClE,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACzC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
|
|
@@ -1,2 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Copy a template directory into the destination, then substitute `{{var}}`
|
|
3
|
+
* placeholders in file contents and filenames.
|
|
4
|
+
*
|
|
5
|
+
* `templateDir` is the LITERAL directory name under `templates/` (e.g.
|
|
6
|
+
* `react-custom-page`, `power-pages-starter`, `pcf-field`) — resolved from the
|
|
7
|
+
* artifact registry's `templateDir`, with no `-starter` suffix heuristic.
|
|
8
|
+
* Substitution runs whenever `templateVariables` is provided (no per-template
|
|
9
|
+
* special-casing).
|
|
10
|
+
*/
|
|
11
|
+
export declare function copyTemplate(templateDir: string, destinationPath: string, templateVariables?: {
|
|
12
|
+
[key: string]: string;
|
|
13
|
+
}): Promise<void>;
|
|
2
14
|
//# sourceMappingURL=copyTemplate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copyTemplate.d.ts","sourceRoot":"","sources":["../../src/utils/copyTemplate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"copyTemplate.d.ts","sourceRoot":"","sources":["../../src/utils/copyTemplate.ts"],"names":[],"mappings":"AAuGA;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,iBAAiB,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
|
|
@@ -5,19 +5,113 @@ import ora from 'ora';
|
|
|
5
5
|
import { fileURLToPath } from 'url';
|
|
6
6
|
const __filename = fileURLToPath(import.meta.url);
|
|
7
7
|
const __dirname = path.dirname(__filename);
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
/** Substitution-variable keys must be plain identifiers (they go into a RegExp). */
|
|
9
|
+
const KEY_PATTERN = /^[A-Za-z0-9_]+$/;
|
|
10
|
+
/** Substitute `{{key}}` in a filename. Uses a function replacer so `$`-patterns in values are literal. */
|
|
11
|
+
function substituteName(name, variables) {
|
|
12
|
+
if (!name.includes('{{'))
|
|
13
|
+
return name;
|
|
14
|
+
let out = name;
|
|
15
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
16
|
+
out = out.replace(new RegExp(`{{${key}}}`, 'g'), () => value);
|
|
17
|
+
}
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
/** Rename `fullPath`'s basename to `newName`, refusing any name that escapes `dirPath`. */
|
|
21
|
+
async function safeRename(dirPath, fullPath, newName) {
|
|
22
|
+
if (newName.includes('/') || newName.includes('\\') || newName.includes('..')) {
|
|
23
|
+
throw new Error(`Refusing unsafe substituted filename: ${JSON.stringify(newName)}`);
|
|
24
|
+
}
|
|
25
|
+
const newPath = path.join(dirPath, newName);
|
|
26
|
+
const resolvedDir = path.resolve(dirPath);
|
|
27
|
+
if (path.resolve(newPath) !== path.join(resolvedDir, newName)) {
|
|
28
|
+
throw new Error(`Substituted filename escapes the template directory: ${JSON.stringify(newName)}`);
|
|
29
|
+
}
|
|
30
|
+
await fs.rename(fullPath, newPath);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Restore dotfile names that npm strips from published tarballs. Templates ship
|
|
34
|
+
* these without the leading dot (e.g. `gitignore`) so they survive `npm publish`;
|
|
35
|
+
* we rename them back on copy. Runs for every scaffold, regardless of substitution.
|
|
36
|
+
*/
|
|
37
|
+
const DOTFILE_RENAMES = {
|
|
38
|
+
gitignore: '.gitignore',
|
|
39
|
+
npmignore: '.npmignore',
|
|
40
|
+
};
|
|
41
|
+
async function renameDotfiles(dirPath) {
|
|
42
|
+
for (const file of await fs.readdir(dirPath, { withFileTypes: true })) {
|
|
43
|
+
const fullPath = path.join(dirPath, file.name);
|
|
44
|
+
if (file.isDirectory()) {
|
|
45
|
+
await renameDotfiles(fullPath);
|
|
46
|
+
}
|
|
47
|
+
else if (DOTFILE_RENAMES[file.name]) {
|
|
48
|
+
await fs.rename(fullPath, path.join(dirPath, DOTFILE_RENAMES[file.name]));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async function replaceTemplateVariables(dirPath, variables) {
|
|
53
|
+
for (const key of Object.keys(variables)) {
|
|
54
|
+
if (!KEY_PATTERN.test(key)) {
|
|
55
|
+
throw new Error(`Invalid template variable key ${JSON.stringify(key)} (must match ${KEY_PATTERN}).`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const files = await fs.readdir(dirPath, { withFileTypes: true });
|
|
59
|
+
for (const file of files) {
|
|
60
|
+
const fullPath = path.join(dirPath, file.name);
|
|
61
|
+
if (file.isDirectory()) {
|
|
62
|
+
// Recurse first, then rename the directory if its name carries a placeholder.
|
|
63
|
+
await replaceTemplateVariables(fullPath, variables);
|
|
64
|
+
const newDirName = substituteName(file.name, variables);
|
|
65
|
+
if (newDirName !== file.name) {
|
|
66
|
+
await safeRename(dirPath, fullPath, newDirName);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Replace variables in file content. Function replacer => `$`-sequences in
|
|
71
|
+
// values are treated literally (no $&/$1 replacement-pattern injection).
|
|
72
|
+
let content = await fs.readFile(fullPath, 'utf8');
|
|
73
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
74
|
+
const regex = new RegExp(`{{${key}}}`, 'g');
|
|
75
|
+
content = content.replace(regex, () => value);
|
|
76
|
+
}
|
|
77
|
+
await fs.writeFile(fullPath, content, 'utf8');
|
|
78
|
+
// Replace variables in filename if needed.
|
|
79
|
+
const newName = substituteName(file.name, variables);
|
|
80
|
+
if (newName !== file.name) {
|
|
81
|
+
await safeRename(dirPath, fullPath, newName);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Copy a template directory into the destination, then substitute `{{var}}`
|
|
88
|
+
* placeholders in file contents and filenames.
|
|
89
|
+
*
|
|
90
|
+
* `templateDir` is the LITERAL directory name under `templates/` (e.g.
|
|
91
|
+
* `react-custom-page`, `power-pages-starter`, `pcf-field`) — resolved from the
|
|
92
|
+
* artifact registry's `templateDir`, with no `-starter` suffix heuristic.
|
|
93
|
+
* Substitution runs whenever `templateVariables` is provided (no per-template
|
|
94
|
+
* special-casing).
|
|
95
|
+
*/
|
|
96
|
+
export async function copyTemplate(templateDir, destinationPath, templateVariables) {
|
|
97
|
+
const spinner = ora(`Copying ${templateDir} template...`).start();
|
|
10
98
|
try {
|
|
11
|
-
const templatePath = path.join(__dirname, '../../templates',
|
|
99
|
+
const templatePath = path.join(__dirname, '../../templates', templateDir);
|
|
12
100
|
// Check if template exists
|
|
13
101
|
if (!(await fs.pathExists(templatePath))) {
|
|
14
|
-
throw new Error(`Template ${
|
|
102
|
+
throw new Error(`Template ${templateDir} not found at ${templatePath}`);
|
|
15
103
|
}
|
|
16
104
|
// Copy all template files
|
|
17
105
|
await fs.copy(templatePath, destinationPath, {
|
|
18
106
|
overwrite: false,
|
|
19
107
|
errorOnExist: false,
|
|
20
108
|
});
|
|
109
|
+
// Replace template variables if provided
|
|
110
|
+
if (templateVariables) {
|
|
111
|
+
await replaceTemplateVariables(destinationPath, templateVariables);
|
|
112
|
+
}
|
|
113
|
+
// Restore npm-stripped dotfiles (gitignore → .gitignore) for every scaffold.
|
|
114
|
+
await renameDotfiles(destinationPath);
|
|
21
115
|
spinner.succeed(chalk.green(`Template copied successfully`));
|
|
22
116
|
}
|
|
23
117
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copyTemplate.js","sourceRoot":"","sources":["../../src/utils/copyTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"copyTemplate.js","sourceRoot":"","sources":["../../src/utils/copyTemplate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
/** Provenance stamped into a generated project's package.json for migration/debug. */
|
|
2
|
+
export interface Provenance {
|
|
3
|
+
cliVersion: string;
|
|
4
|
+
artifact: string;
|
|
5
|
+
componentLibrary?: string;
|
|
6
|
+
templateVersion: string;
|
|
7
|
+
}
|
|
8
|
+
export interface UpdatePackageJsonOptions {
|
|
9
|
+
provenance?: Provenance;
|
|
10
|
+
}
|
|
11
|
+
export declare function updatePackageJson(projectPath: string, projectName: string, options?: UpdatePackageJsonOptions): Promise<void>;
|
|
2
12
|
//# sourceMappingURL=updatePackageJson.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updatePackageJson.d.ts","sourceRoot":"","sources":["../../src/utils/updatePackageJson.ts"],"names":[],"mappings":"AAKA,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,
|
|
1
|
+
{"version":3,"file":"updatePackageJson.d.ts","sourceRoot":"","sources":["../../src/utils/updatePackageJson.ts"],"names":[],"mappings":"AAKA,sFAAsF;AACtF,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,IAAI,CAAC,CAoCf"}
|