create-ec-app 1.1.0 → 1.3.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 (80) hide show
  1. package/README.md +77 -0
  2. package/dist/index.js +304 -78
  3. package/dist/index.js.map +1 -1
  4. package/dist/pcf.d.ts.map +1 -1
  5. package/dist/pcf.js +82 -0
  6. package/dist/pcf.js.map +1 -1
  7. package/package.json +3 -1
  8. package/scripts/check-generated-css-scope.mjs +61 -0
  9. package/templates/base/package-lock.json +713 -1466
  10. package/templates/base/package.json +19 -19
  11. package/templates/base/src/App.tsx +1 -1
  12. package/templates/base/src/index.css +4 -1
  13. package/templates/base/src/main.tsx +4 -1
  14. package/templates/base/src/runtime/EcAppShell.tsx +29 -0
  15. package/templates/base/tsconfig.app.json +0 -1
  16. package/templates/base/tsconfig.json +1 -2
  17. package/templates/pcf/base/README.md +13 -0
  18. package/templates/pcf/base/index.ts +9 -3
  19. package/templates/pcf/base/package-lock.json +7290 -0
  20. package/templates/pcf/base/package.json +3 -3
  21. package/templates/targets/power-pages/src/App.patch.tsx +1 -1
  22. package/templates/targets/swa/package.patch.json +1 -1
  23. package/templates/ui/kendo/package.patch.json +2 -2
  24. package/templates/ui/kendo/src/main.patch.tsx +4 -1
  25. package/templates/ui/shadcn-ui/components.json +5 -2
  26. package/templates/ui/shadcn-ui/package.patch.json +3 -41
  27. package/templates/ui/shadcn-ui/src/index.patch.css +26 -9
  28. package/templates/ui/shadcn-ui/src/components/ui/accordion.tsx +0 -64
  29. package/templates/ui/shadcn-ui/src/components/ui/alert-dialog.tsx +0 -155
  30. package/templates/ui/shadcn-ui/src/components/ui/alert.tsx +0 -66
  31. package/templates/ui/shadcn-ui/src/components/ui/aspect-ratio.tsx +0 -11
  32. package/templates/ui/shadcn-ui/src/components/ui/avatar.tsx +0 -51
  33. package/templates/ui/shadcn-ui/src/components/ui/badge.tsx +0 -46
  34. package/templates/ui/shadcn-ui/src/components/ui/breadcrumb.tsx +0 -109
  35. package/templates/ui/shadcn-ui/src/components/ui/button-group.tsx +0 -83
  36. package/templates/ui/shadcn-ui/src/components/ui/button.tsx +0 -60
  37. package/templates/ui/shadcn-ui/src/components/ui/calendar.tsx +0 -216
  38. package/templates/ui/shadcn-ui/src/components/ui/card.tsx +0 -92
  39. package/templates/ui/shadcn-ui/src/components/ui/carousel.tsx +0 -239
  40. package/templates/ui/shadcn-ui/src/components/ui/chart.tsx +0 -357
  41. package/templates/ui/shadcn-ui/src/components/ui/checkbox.tsx +0 -32
  42. package/templates/ui/shadcn-ui/src/components/ui/collapsible.tsx +0 -31
  43. package/templates/ui/shadcn-ui/src/components/ui/command.tsx +0 -182
  44. package/templates/ui/shadcn-ui/src/components/ui/context-menu.tsx +0 -252
  45. package/templates/ui/shadcn-ui/src/components/ui/dialog.tsx +0 -141
  46. package/templates/ui/shadcn-ui/src/components/ui/drawer.tsx +0 -135
  47. package/templates/ui/shadcn-ui/src/components/ui/dropdown-menu.tsx +0 -255
  48. package/templates/ui/shadcn-ui/src/components/ui/empty.tsx +0 -104
  49. package/templates/ui/shadcn-ui/src/components/ui/field.tsx +0 -246
  50. package/templates/ui/shadcn-ui/src/components/ui/form.tsx +0 -167
  51. package/templates/ui/shadcn-ui/src/components/ui/hover-card.tsx +0 -44
  52. package/templates/ui/shadcn-ui/src/components/ui/input-group.tsx +0 -170
  53. package/templates/ui/shadcn-ui/src/components/ui/input-otp.tsx +0 -75
  54. package/templates/ui/shadcn-ui/src/components/ui/input.tsx +0 -21
  55. package/templates/ui/shadcn-ui/src/components/ui/item.tsx +0 -193
  56. package/templates/ui/shadcn-ui/src/components/ui/kbd.tsx +0 -28
  57. package/templates/ui/shadcn-ui/src/components/ui/label.tsx +0 -24
  58. package/templates/ui/shadcn-ui/src/components/ui/menubar.tsx +0 -274
  59. package/templates/ui/shadcn-ui/src/components/ui/navigation-menu.tsx +0 -168
  60. package/templates/ui/shadcn-ui/src/components/ui/pagination.tsx +0 -127
  61. package/templates/ui/shadcn-ui/src/components/ui/popover.tsx +0 -48
  62. package/templates/ui/shadcn-ui/src/components/ui/progress.tsx +0 -29
  63. package/templates/ui/shadcn-ui/src/components/ui/radio-group.tsx +0 -45
  64. package/templates/ui/shadcn-ui/src/components/ui/resizable.tsx +0 -54
  65. package/templates/ui/shadcn-ui/src/components/ui/scroll-area.tsx +0 -58
  66. package/templates/ui/shadcn-ui/src/components/ui/select.tsx +0 -185
  67. package/templates/ui/shadcn-ui/src/components/ui/separator.tsx +0 -28
  68. package/templates/ui/shadcn-ui/src/components/ui/sheet.tsx +0 -137
  69. package/templates/ui/shadcn-ui/src/components/ui/sidebar.tsx +0 -726
  70. package/templates/ui/shadcn-ui/src/components/ui/skeleton.tsx +0 -13
  71. package/templates/ui/shadcn-ui/src/components/ui/slider.tsx +0 -63
  72. package/templates/ui/shadcn-ui/src/components/ui/sonner.tsx +0 -38
  73. package/templates/ui/shadcn-ui/src/components/ui/spinner.tsx +0 -16
  74. package/templates/ui/shadcn-ui/src/components/ui/switch.tsx +0 -31
  75. package/templates/ui/shadcn-ui/src/components/ui/table.tsx +0 -114
  76. package/templates/ui/shadcn-ui/src/components/ui/tabs.tsx +0 -66
  77. package/templates/ui/shadcn-ui/src/components/ui/textarea.tsx +0 -18
  78. package/templates/ui/shadcn-ui/src/components/ui/toggle-group.tsx +0 -81
  79. package/templates/ui/shadcn-ui/src/components/ui/toggle.tsx +0 -45
  80. package/templates/ui/shadcn-ui/src/components/ui/tooltip.tsx +0 -61
package/dist/pcf.js CHANGED
@@ -20,6 +20,38 @@ export interface PcfRuntimeContext {
20
20
  \twebApi: PcfWebApi;
21
21
  }
22
22
  `;
23
+ function createAppShellTemplate(appId) {
24
+ return `import * as React from "react";
25
+
26
+ export const EC_APP_SCOPE_CLASS = "ec-app";
27
+ export const EC_APP_ID = ${JSON.stringify(appId)};
28
+ export const EC_PCF_SCOPE_CLASS = "ec-pcf-shell-control";
29
+
30
+ const EcPortalContainerContext = React.createContext<HTMLElement | null>(null);
31
+
32
+ export function useEcPortalContainer() {
33
+ \treturn React.useContext(EcPortalContainerContext);
34
+ }
35
+
36
+ export function EcAppShell({ children }: { children: React.ReactNode }) {
37
+ \tconst [portalContainer, setPortalContainer] =
38
+ \t\tReact.useState<HTMLDivElement | null>(null);
39
+
40
+ \treturn (
41
+ \t\t<div
42
+ \t\t\tclassName={EC_APP_SCOPE_CLASS}
43
+ \t\t\tdata-ec-app-id={EC_APP_ID}
44
+ \t\t\tdata-ec-app-root=""
45
+ \t\t>
46
+ \t\t\t<EcPortalContainerContext.Provider value={portalContainer}>
47
+ \t\t\t\t{children}
48
+ \t\t\t\t<div data-ec-portal-root="" ref={setPortalContainer} />
49
+ \t\t\t</EcPortalContainerContext.Provider>
50
+ \t\t</div>
51
+ \t);
52
+ }
53
+ `;
54
+ }
23
55
  export async function generatePcfFromExistingWebresource(options) {
24
56
  const projectDir = path.resolve(process.cwd(), options.pcfDir);
25
57
  const packageJson = await readJson(path.join(projectDir, "package.json"));
@@ -40,11 +72,14 @@ export async function generatePcfFromExistingWebresource(options) {
40
72
  const packageNameToken = options.packageName ?? toKebabCase(constructorName);
41
73
  const relToProject = toPosixPath(path.relative(outputDir, projectDir) || ".");
42
74
  const appImportPath = ensureRelativeImport(toPosixPath(path.relative(outputDir, path.join(projectDir, "src", "App"))));
75
+ const appShellImportPath = ensureRelativeImport(toPosixPath(path.relative(outputDir, path.join(projectDir, "src", "runtime", "EcAppShell"))));
43
76
  const runtimeTypesImportPath = ensureRelativeImport(toPosixPath(path.relative(outputDir, path.join(projectDir, "src", "runtime", "types"))));
44
77
  const cssImportPath = ensureRelativeImport(toPosixPath(path.relative(outputDir, path.join(projectDir, distDirName, "main.css"))));
45
78
  await assertFileExists(path.join(projectDir, "src", "App.tsx"), `Could not find src/App.tsx in ${projectDir}.`);
46
79
  await assertFileExists(path.join(projectDir, distDirName, "main.css"), `Could not find ${distDirName}/main.css in ${projectDir}. Run the webresource build first.`);
47
80
  await ensureRuntimeTypes(projectDir);
81
+ await ensureAppShell(projectDir, packageName);
82
+ await warnIfCssAppearsUnsafe(path.join(projectDir, distDirName, "main.css"));
48
83
  await fs.remove(outputDir);
49
84
  await applyLayer(templateDir, outputDir);
50
85
  for (const layerDir of layerDirs) {
@@ -59,6 +94,7 @@ export async function generatePcfFromExistingWebresource(options) {
59
94
  PCF_VERSION: version,
60
95
  PROJECT_APP_IMPORT: appImportPath,
61
96
  PROJECT_CSS_IMPORT: cssImportPath,
97
+ PROJECT_EC_APP_SHELL_IMPORT: appShellImportPath,
62
98
  PROJECT_NODE_MODULES_TYPES_ROOT: `${relToProject}/node_modules/@types`,
63
99
  PROJECT_REACT_ALIAS: `${relToProject}/node_modules/react`,
64
100
  PROJECT_REACT_DOM_ALIAS: `${relToProject}/node_modules/react-dom`,
@@ -82,6 +118,52 @@ async function ensureRuntimeTypes(projectDir) {
82
118
  await fs.ensureDir(path.dirname(runtimeTypesPath));
83
119
  await fs.writeFile(runtimeTypesPath, RUNTIME_TYPES_TEMPLATE, "utf8");
84
120
  }
121
+ async function ensureAppShell(projectDir, appId) {
122
+ const appShellPath = path.join(projectDir, "src", "runtime", "EcAppShell.tsx");
123
+ if (await fs.pathExists(appShellPath)) {
124
+ return;
125
+ }
126
+ await fs.ensureDir(path.dirname(appShellPath));
127
+ await fs.writeFile(appShellPath, createAppShellTemplate(appId), "utf8");
128
+ }
129
+ async function warnIfCssAppearsUnsafe(cssPath) {
130
+ const css = await fs.readFile(cssPath, "utf8");
131
+ const unsafeChecks = [
132
+ { name: "global body rule", pattern: /(^|})\s*body\s*\{/ },
133
+ {
134
+ name: "global shadcn :root token rule",
135
+ pattern: /(^|})\s*:root\s*\{[^}]*--background\s*:/,
136
+ },
137
+ {
138
+ name: "global shadcn dark token rule",
139
+ pattern: /(^|})\s*\.dark\s*\{[^}]*--background\s*:/,
140
+ },
141
+ {
142
+ name: "Tailwind Preflight universal reset",
143
+ pattern: /(^|})\s*\*,\s*::before,\s*::after,\s*::backdrop\b/,
144
+ },
145
+ { name: "unprefixed flex utility", pattern: /(^|})\s*\.flex\s*\{/ },
146
+ { name: "unprefixed grid utility", pattern: /(^|})\s*\.grid\s*\{/ },
147
+ { name: "unprefixed hidden utility", pattern: /(^|})\s*\.hidden\s*\{/ },
148
+ { name: "unprefixed border utility", pattern: /(^|})\s*\.border\s*\{/ },
149
+ { name: "unprefixed text-sm utility", pattern: /(^|})\s*\.text-sm\s*\{/ },
150
+ {
151
+ name: "unprefixed bg-background utility",
152
+ pattern: /(^|})\s*\.bg-background\s*\{/,
153
+ },
154
+ ];
155
+ const matches = unsafeChecks
156
+ .filter((check) => check.pattern.test(css))
157
+ .map((check) => check.name);
158
+ if (matches.length === 0) {
159
+ return;
160
+ }
161
+ console.warn([
162
+ "Warning: the built CSS appears to use unscoped Tailwind/shadcn styles and may leak into the host page when deployed as PCF.",
163
+ `Detected: ${matches.join(", ")}.`,
164
+ "Regenerate or migrate the source app to the scoped CSS template before deploying to Dynamics 365.",
165
+ ].join("\n"));
166
+ }
85
167
  async function readJson(filePath) {
86
168
  try {
87
169
  return await fs.readJson(filePath);
package/dist/pcf.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pcf.js","sourceRoot":"","sources":["../src/pcf.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pcf.js","sourceRoot":"","sources":["../src/pcf.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-ec-app",
3
- "version": "1.1.0",
3
+ "version": "1.3.0",
4
4
  "description": "Unified CLI tool to create different types of EC applications: Webresource, Portal, Power Pages",
5
5
  "bin": {
6
6
  "create-ec-app": "./dist/index.js"
@@ -8,6 +8,7 @@
8
8
  "scripts": {
9
9
  "dev": "tsx src/index.ts",
10
10
  "build": "tsc -p tsconfig.json",
11
+ "check:css-scope": "node scripts/check-generated-css-scope.mjs",
11
12
  "test": "node bin/index.js test-app",
12
13
  "release": "semantic-release",
13
14
  "prepublishOnly": "npm run build"
@@ -30,6 +31,7 @@
30
31
  "files": [
31
32
  "dist/**/*",
32
33
  "bin/**/*",
34
+ "scripts/**/*",
33
35
  "templates/**/*"
34
36
  ],
35
37
  "author": "Schalk Conradie",
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+
6
+ const appPath = process.argv[2];
7
+
8
+ if (!appPath) {
9
+ console.error("Usage: node scripts/check-generated-css-scope.mjs <generated-app>");
10
+ process.exit(1);
11
+ }
12
+
13
+ const cssPath = path.join(path.resolve(appPath), "dist", "main.css");
14
+
15
+ if (!fs.existsSync(cssPath)) {
16
+ console.error(`Could not find ${cssPath}. Build the generated app first.`);
17
+ process.exit(1);
18
+ }
19
+
20
+ const css = fs.readFileSync(cssPath, "utf8");
21
+
22
+ const forbidden = [
23
+ { name: "global body rule", pattern: /(^|})\s*body\s*\{/ },
24
+ {
25
+ name: "global shadcn :root token rule",
26
+ pattern: /(^|})\s*:root\s*\{[^}]*--background\s*:/,
27
+ },
28
+ {
29
+ name: "global shadcn dark token rule",
30
+ pattern: /(^|})\s*\.dark\s*\{[^}]*--background\s*:/,
31
+ },
32
+ { name: "unprefixed flex utility", pattern: /(^|})\s*\.flex\s*\{/ },
33
+ { name: "unprefixed grid utility", pattern: /(^|})\s*\.grid\s*\{/ },
34
+ { name: "unprefixed hidden utility", pattern: /(^|})\s*\.hidden\s*\{/ },
35
+ {
36
+ name: "unprefixed bg-background utility",
37
+ pattern: /(^|})\s*\.bg-background\s*\{/,
38
+ },
39
+ ];
40
+
41
+ const required = [
42
+ { name: "ec app scope", pattern: /\.ec-app\b/ },
43
+ { name: "prefixed flex utility", pattern: /\.ec\\:flex\b/ },
44
+ ];
45
+
46
+ const failures = [
47
+ ...forbidden.filter((check) => check.pattern.test(css)).map((check) => check.name),
48
+ ...required
49
+ .filter((check) => !check.pattern.test(css))
50
+ .map((check) => `missing ${check.name}`),
51
+ ];
52
+
53
+ if (failures.length > 0) {
54
+ console.error("CSS scope check failed:");
55
+ for (const failure of failures) {
56
+ console.error(`- ${failure}`);
57
+ }
58
+ process.exit(1);
59
+ }
60
+
61
+ console.log("CSS scope check passed.");