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.
- package/README.md +77 -0
- package/dist/index.js +304 -78
- package/dist/index.js.map +1 -1
- package/dist/pcf.d.ts.map +1 -1
- package/dist/pcf.js +82 -0
- package/dist/pcf.js.map +1 -1
- package/package.json +3 -1
- package/scripts/check-generated-css-scope.mjs +61 -0
- package/templates/base/package-lock.json +713 -1466
- package/templates/base/package.json +19 -19
- package/templates/base/src/App.tsx +1 -1
- package/templates/base/src/index.css +4 -1
- package/templates/base/src/main.tsx +4 -1
- package/templates/base/src/runtime/EcAppShell.tsx +29 -0
- package/templates/base/tsconfig.app.json +0 -1
- package/templates/base/tsconfig.json +1 -2
- package/templates/pcf/base/README.md +13 -0
- package/templates/pcf/base/index.ts +9 -3
- package/templates/pcf/base/package-lock.json +7290 -0
- package/templates/pcf/base/package.json +3 -3
- package/templates/targets/power-pages/src/App.patch.tsx +1 -1
- package/templates/targets/swa/package.patch.json +1 -1
- package/templates/ui/kendo/package.patch.json +2 -2
- package/templates/ui/kendo/src/main.patch.tsx +4 -1
- package/templates/ui/shadcn-ui/components.json +5 -2
- package/templates/ui/shadcn-ui/package.patch.json +3 -41
- package/templates/ui/shadcn-ui/src/index.patch.css +26 -9
- package/templates/ui/shadcn-ui/src/components/ui/accordion.tsx +0 -64
- package/templates/ui/shadcn-ui/src/components/ui/alert-dialog.tsx +0 -155
- package/templates/ui/shadcn-ui/src/components/ui/alert.tsx +0 -66
- package/templates/ui/shadcn-ui/src/components/ui/aspect-ratio.tsx +0 -11
- package/templates/ui/shadcn-ui/src/components/ui/avatar.tsx +0 -51
- package/templates/ui/shadcn-ui/src/components/ui/badge.tsx +0 -46
- package/templates/ui/shadcn-ui/src/components/ui/breadcrumb.tsx +0 -109
- package/templates/ui/shadcn-ui/src/components/ui/button-group.tsx +0 -83
- package/templates/ui/shadcn-ui/src/components/ui/button.tsx +0 -60
- package/templates/ui/shadcn-ui/src/components/ui/calendar.tsx +0 -216
- package/templates/ui/shadcn-ui/src/components/ui/card.tsx +0 -92
- package/templates/ui/shadcn-ui/src/components/ui/carousel.tsx +0 -239
- package/templates/ui/shadcn-ui/src/components/ui/chart.tsx +0 -357
- package/templates/ui/shadcn-ui/src/components/ui/checkbox.tsx +0 -32
- package/templates/ui/shadcn-ui/src/components/ui/collapsible.tsx +0 -31
- package/templates/ui/shadcn-ui/src/components/ui/command.tsx +0 -182
- package/templates/ui/shadcn-ui/src/components/ui/context-menu.tsx +0 -252
- package/templates/ui/shadcn-ui/src/components/ui/dialog.tsx +0 -141
- package/templates/ui/shadcn-ui/src/components/ui/drawer.tsx +0 -135
- package/templates/ui/shadcn-ui/src/components/ui/dropdown-menu.tsx +0 -255
- package/templates/ui/shadcn-ui/src/components/ui/empty.tsx +0 -104
- package/templates/ui/shadcn-ui/src/components/ui/field.tsx +0 -246
- package/templates/ui/shadcn-ui/src/components/ui/form.tsx +0 -167
- package/templates/ui/shadcn-ui/src/components/ui/hover-card.tsx +0 -44
- package/templates/ui/shadcn-ui/src/components/ui/input-group.tsx +0 -170
- package/templates/ui/shadcn-ui/src/components/ui/input-otp.tsx +0 -75
- package/templates/ui/shadcn-ui/src/components/ui/input.tsx +0 -21
- package/templates/ui/shadcn-ui/src/components/ui/item.tsx +0 -193
- package/templates/ui/shadcn-ui/src/components/ui/kbd.tsx +0 -28
- package/templates/ui/shadcn-ui/src/components/ui/label.tsx +0 -24
- package/templates/ui/shadcn-ui/src/components/ui/menubar.tsx +0 -274
- package/templates/ui/shadcn-ui/src/components/ui/navigation-menu.tsx +0 -168
- package/templates/ui/shadcn-ui/src/components/ui/pagination.tsx +0 -127
- package/templates/ui/shadcn-ui/src/components/ui/popover.tsx +0 -48
- package/templates/ui/shadcn-ui/src/components/ui/progress.tsx +0 -29
- package/templates/ui/shadcn-ui/src/components/ui/radio-group.tsx +0 -45
- package/templates/ui/shadcn-ui/src/components/ui/resizable.tsx +0 -54
- package/templates/ui/shadcn-ui/src/components/ui/scroll-area.tsx +0 -58
- package/templates/ui/shadcn-ui/src/components/ui/select.tsx +0 -185
- package/templates/ui/shadcn-ui/src/components/ui/separator.tsx +0 -28
- package/templates/ui/shadcn-ui/src/components/ui/sheet.tsx +0 -137
- package/templates/ui/shadcn-ui/src/components/ui/sidebar.tsx +0 -726
- package/templates/ui/shadcn-ui/src/components/ui/skeleton.tsx +0 -13
- package/templates/ui/shadcn-ui/src/components/ui/slider.tsx +0 -63
- package/templates/ui/shadcn-ui/src/components/ui/sonner.tsx +0 -38
- package/templates/ui/shadcn-ui/src/components/ui/spinner.tsx +0 -16
- package/templates/ui/shadcn-ui/src/components/ui/switch.tsx +0 -31
- package/templates/ui/shadcn-ui/src/components/ui/table.tsx +0 -114
- package/templates/ui/shadcn-ui/src/components/ui/tabs.tsx +0 -66
- package/templates/ui/shadcn-ui/src/components/ui/textarea.tsx +0 -18
- package/templates/ui/shadcn-ui/src/components/ui/toggle-group.tsx +0 -81
- package/templates/ui/shadcn-ui/src/components/ui/toggle.tsx +0 -45
- 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":"AAAA,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;CAe9B,CAAC;
|
|
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.
|
|
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.");
|