create-ec-app 0.0.5 → 0.0.6
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/dist/index.js +139 -88
- package/dist/index.js.map +1 -1
- package/dist/libFunctions.d.ts +42 -0
- package/dist/libFunctions.d.ts.map +1 -0
- package/dist/libFunctions.js +121 -0
- package/dist/libFunctions.js.map +1 -0
- package/package.json +54 -59
- package/README.md +0 -207
- package/bin/index.js +0 -2
- package/dist/creators/mobile.d.ts +0 -2
- package/dist/creators/mobile.d.ts.map +0 -1
- package/dist/creators/mobile.js +0 -244
- package/dist/creators/mobile.js.map +0 -1
- package/dist/creators/portal.d.ts +0 -2
- package/dist/creators/portal.d.ts.map +0 -1
- package/dist/creators/portal.js +0 -1005
- package/dist/creators/portal.js.map +0 -1
- package/dist/creators/powerpages.d.ts +0 -2
- package/dist/creators/powerpages.d.ts.map +0 -1
- package/dist/creators/powerpages.js +0 -755
- package/dist/creators/powerpages.js.map +0 -1
- package/dist/creators/webresource.d.ts +0 -2
- package/dist/creators/webresource.d.ts.map +0 -1
- package/dist/creators/webresource.js +0 -705
- package/dist/creators/webresource.js.map +0 -1
- package/dist/readmes/mobile.md +0 -42
- package/dist/readmes/portal.md +0 -161
- package/dist/readmes/powerpages.md +0 -108
- package/dist/readmes/webresource.md +0 -260
|
@@ -1,705 +0,0 @@
|
|
|
1
|
-
import chalk from "chalk";
|
|
2
|
-
import ora from "ora";
|
|
3
|
-
import fs from "fs-extra";
|
|
4
|
-
import path from "path";
|
|
5
|
-
import { execSync } from "child_process";
|
|
6
|
-
import inquirer from "inquirer";
|
|
7
|
-
import { fileURLToPath } from "url";
|
|
8
|
-
// Helper function to run commands and show a spinner
|
|
9
|
-
const runCommand = (command, spinnerMessage) => {
|
|
10
|
-
const spinner = ora(spinnerMessage).start();
|
|
11
|
-
try {
|
|
12
|
-
execSync(command, { stdio: "pipe" });
|
|
13
|
-
spinner.succeed();
|
|
14
|
-
}
|
|
15
|
-
catch (error) {
|
|
16
|
-
spinner.fail();
|
|
17
|
-
console.error(chalk.red(`Failed to execute command: ${command}`));
|
|
18
|
-
console.error(error);
|
|
19
|
-
process.exit(1);
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
export const createWebResourceApp = async (projectName) => {
|
|
23
|
-
// Prompt for UI library choice
|
|
24
|
-
const { uiLibrary } = await inquirer.prompt([
|
|
25
|
-
{
|
|
26
|
-
type: "list",
|
|
27
|
-
name: "uiLibrary",
|
|
28
|
-
message: "Which UI library would you like to use?",
|
|
29
|
-
choices: [
|
|
30
|
-
{ name: "Kendo UI (React components with themes)", value: "kendo" },
|
|
31
|
-
{ name: "Shadcn/ui (Modern React components)", value: "shadcn" },
|
|
32
|
-
],
|
|
33
|
-
},
|
|
34
|
-
]);
|
|
35
|
-
let kendoThemePackage = "";
|
|
36
|
-
if (uiLibrary === "kendo") {
|
|
37
|
-
// Prompt for Kendo theme
|
|
38
|
-
const kendoThemes = [
|
|
39
|
-
{ name: "Default", value: "@progress/kendo-theme-default" },
|
|
40
|
-
{ name: "Bootstrap (v5)", value: "@progress/kendo-theme-bootstrap" },
|
|
41
|
-
{ name: "Material (v3)", value: "@progress/kendo-theme-material" },
|
|
42
|
-
{ name: "Fluent", value: "@progress/kendo-theme-fluent" },
|
|
43
|
-
{ name: "Classic", value: "@progress/kendo-theme-classic" },
|
|
44
|
-
];
|
|
45
|
-
const { kendoThemePackage: selectedTheme } = await inquirer.prompt([
|
|
46
|
-
{
|
|
47
|
-
type: "list",
|
|
48
|
-
name: "kendoThemePackage",
|
|
49
|
-
message: "Which Kendo UI theme would you like to install?",
|
|
50
|
-
choices: kendoThemes,
|
|
51
|
-
},
|
|
52
|
-
]);
|
|
53
|
-
kendoThemePackage = selectedTheme;
|
|
54
|
-
}
|
|
55
|
-
const projectDir = path.resolve(process.cwd(), projectName);
|
|
56
|
-
console.log(`\nScaffolding a new project in ${chalk.green(projectDir)}...\n`);
|
|
57
|
-
// Create React + Vite (TypeScript) project
|
|
58
|
-
runCommand(`npm create vite@latest ${projectName} -- --template react-ts`, "Creating Vite + React + TS project...");
|
|
59
|
-
process.chdir(projectDir);
|
|
60
|
-
// Update package.json with overrides for Vite 7 compatibility
|
|
61
|
-
const packageJsonPath = path.join(projectDir, "package.json");
|
|
62
|
-
const packageJson = fs.readJsonSync(packageJsonPath);
|
|
63
|
-
// Add custom build script
|
|
64
|
-
packageJson.scripts["build:dev"] = "tsc -b && vite build --mode development";
|
|
65
|
-
fs.writeJsonSync(packageJsonPath, packageJson, { spaces: 2 });
|
|
66
|
-
ora("Updated package.json with Vite 7 overrides and custom build script").succeed();
|
|
67
|
-
// Install dependencies based on UI library choice
|
|
68
|
-
let dependencies = [
|
|
69
|
-
"tailwindcss",
|
|
70
|
-
"@tailwindcss/vite",
|
|
71
|
-
"@tanstack/react-query",
|
|
72
|
-
"zustand",
|
|
73
|
-
"@types/xrm",
|
|
74
|
-
"@types/node",
|
|
75
|
-
];
|
|
76
|
-
if (uiLibrary === "kendo") {
|
|
77
|
-
dependencies.push("@progress/kendo-react-buttons", "@progress/kendo-licensing", kendoThemePackage);
|
|
78
|
-
}
|
|
79
|
-
const installMessage = uiLibrary === "kendo"
|
|
80
|
-
? `Installing dependencies (Kendo Theme: ${kendoThemePackage.split("/")[1]})...`
|
|
81
|
-
: "Installing dependencies (Shadcn/ui)...";
|
|
82
|
-
runCommand(`npm install ${dependencies.join(" ")}`, installMessage);
|
|
83
|
-
if (uiLibrary === "kendo") {
|
|
84
|
-
// Create kendo-tw-preset.js
|
|
85
|
-
const kendoPresetPath = path.join(projectDir, "kendo-tw-preset.js");
|
|
86
|
-
const kendoPresetContent = `module.exports = {
|
|
87
|
-
theme: {
|
|
88
|
-
extend: {
|
|
89
|
-
spacing: {
|
|
90
|
-
1: "var( --kendo-spacing-1 )",
|
|
91
|
-
1.5: "var( --kendo-spacing-1.5 )",
|
|
92
|
-
2: "var( --kendo-spacing-2 )",
|
|
93
|
-
2.5: "var( --kendo-spacing-2.5 )",
|
|
94
|
-
3: "var( --kendo-spacing-3 )",
|
|
95
|
-
3.5: "var( --kendo-spacing-3.5 )",
|
|
96
|
-
4: "var( --kendo-spacing-4 )",
|
|
97
|
-
4.5: "var( --kendo-spacing-4.5 )",
|
|
98
|
-
5: "var( --kendo-spacing-5 )",
|
|
99
|
-
5.5: "var( --kendo-spacing-5.5 )",
|
|
100
|
-
6: "var( --kendo-spacing-6 )",
|
|
101
|
-
6.5: "var( --kendo-spacing-6.5 )",
|
|
102
|
-
7: "var( --kendo-spacing-7 )",
|
|
103
|
-
7.5: "var( --kendo-spacing-7.5 )",
|
|
104
|
-
8: "var( --kendo-spacing-8 )",
|
|
105
|
-
9: "var( --kendo-spacing-9 )",
|
|
106
|
-
10: "var( --kendo-spacing-10 )",
|
|
107
|
-
11: "var( --kendo-spacing-11 )",
|
|
108
|
-
12: "var( --kendo-spacing-12 )",
|
|
109
|
-
13: "var( --kendo-spacing-13 )",
|
|
110
|
-
14: "var( --kendo-spacing-14 )",
|
|
111
|
-
15: "var( --kendo-spacing-15 )",
|
|
112
|
-
16: "var( --kendo-spacing-16 )",
|
|
113
|
-
17: "var( --kendo-spacing-17 )",
|
|
114
|
-
18: "var( --kendo-spacing-18 )",
|
|
115
|
-
19: "var( --kendo-spacing-19 )",
|
|
116
|
-
20: "var( --kendo-spacing-20 )",
|
|
117
|
-
21: "var( --kendo-spacing-21 )",
|
|
118
|
-
22: "var( --kendo-spacing-22 )",
|
|
119
|
-
23: "var( --kendo-spacing-23 )",
|
|
120
|
-
24: "var( --kendo-spacing-24 )",
|
|
121
|
-
25: "var( --kendo-spacing-25 )",
|
|
122
|
-
26: "var( --kendo-spacing-26 )",
|
|
123
|
-
27: "var( --kendo-spacing-27 )",
|
|
124
|
-
28: "var( --kendo-spacing-28 )",
|
|
125
|
-
29: "var( --kendo-spacing-29 )",
|
|
126
|
-
30: "var( --kendo-spacing-30 )",
|
|
127
|
-
},
|
|
128
|
-
borderRadius: {
|
|
129
|
-
none: "var( --kendo-border-radius-none )",
|
|
130
|
-
sm: "var( --kendo-border-radius-sm )",
|
|
131
|
-
DEFAULT: "var( --kendo-border-radius-md )",
|
|
132
|
-
lg: "var( --kendo-border-radius-lg )",
|
|
133
|
-
xl: "var( --kendo-border-radius-xl )",
|
|
134
|
-
"2xl": "var( --kendo-border-radius-xxl )",
|
|
135
|
-
"3xl": "var( --kendo-border-radius-xxxl )",
|
|
136
|
-
full: "var( --kendo-border-radius-none )",
|
|
137
|
-
},
|
|
138
|
-
boxShadow: {
|
|
139
|
-
sm: "var( --kendo-elevation-2 )",
|
|
140
|
-
DEFAULT: "var( --kendo-elevation-4 )",
|
|
141
|
-
lg: "var( --kendo-elevation-6 )",
|
|
142
|
-
xl: "var( --kendo-elevation-8 )",
|
|
143
|
-
"2xl": "var( --keno-elevation-9 )",
|
|
144
|
-
},
|
|
145
|
-
colors: {
|
|
146
|
-
"app-surface": "var( --kendo-color-app-surface )",
|
|
147
|
-
"on-app-surface": "var( --kendo-color-on-app-surface )",
|
|
148
|
-
subtle: "var( --kendo-color-subtle )",
|
|
149
|
-
surface: "var( --kendo-color-surface )",
|
|
150
|
-
"surface-alt": "var( --kendo-color-surface-alt )",
|
|
151
|
-
border: "var( --kendo-color-border )",
|
|
152
|
-
"border-alt": "var( --kendo-color-border-alt )",
|
|
153
|
-
base: {
|
|
154
|
-
DEFAULT: "var( --kendo-color-base )",
|
|
155
|
-
hover: "var( --kendo-color-base-hover )",
|
|
156
|
-
active: "var( --kendo-color-base-active )",
|
|
157
|
-
emphasis: "var( --kendo-color-base-emphasis )",
|
|
158
|
-
subtle: "var( --kendo-color-base-subtle )",
|
|
159
|
-
"subtle-hover": "var( --kendo-color-base-subtle-hover )",
|
|
160
|
-
"subtle-active": "var( --kendo-color-base-subtle-active)",
|
|
161
|
-
"on-subtle": "var( --kendo-color-base-on-subtle )",
|
|
162
|
-
"on-surface": "var( --kendo-color-base-on-surface )",
|
|
163
|
-
},
|
|
164
|
-
"on-base": "var( --kendo-color-on-base )",
|
|
165
|
-
primary: {
|
|
166
|
-
DEFAULT: "var( --kendo-color-primary )",
|
|
167
|
-
hover: "var( --kendo-color-primary-hover )",
|
|
168
|
-
active: "var( --kendo-color-primary-active )",
|
|
169
|
-
emphasis: "var( --kendo-color-primary-emphasis )",
|
|
170
|
-
subtle: "var( --kendo-color-primary-subtle )",
|
|
171
|
-
"subtle-hover": "var( --kendo-color-primary-subtle-hover )",
|
|
172
|
-
"subtle-active": "var( --kendo-color-primary-subtle-active)",
|
|
173
|
-
"on-subtle": "var( --kendo-color-primary-on-subtle )",
|
|
174
|
-
"on-surface": "var( --kendo-color-primary-on-surface )",
|
|
175
|
-
},
|
|
176
|
-
"on-primary": "var( --kendo-color-on-primary )",
|
|
177
|
-
secondary: {
|
|
178
|
-
DEFAULT: "var( --kendo-color-secondary )",
|
|
179
|
-
hover: "var( --kendo-color-secondary-hover )",
|
|
180
|
-
active: "var( --kendo-color-secondary-active )",
|
|
181
|
-
emphasis: "var( --kendo-color-secondary-emphasis )",
|
|
182
|
-
subtle: "var( --kendo-color-secondary-subtle )",
|
|
183
|
-
"subtle-hover": "var( --kendo-color-secondary-subtle-hover )",
|
|
184
|
-
"subtle-active": "var( --kendo-color-secondary-subtle-active)",
|
|
185
|
-
"on-subtle": "var( --kendo-color-secondary-on-subtle )",
|
|
186
|
-
"on-surface": "var( --kendo-color-secondary-on-surface )",
|
|
187
|
-
},
|
|
188
|
-
"on-secondary": "var( --kendo-color-on-secondary )",
|
|
189
|
-
tertiary: {
|
|
190
|
-
DEFAULT: "var( --kendo-color-tertiary )",
|
|
191
|
-
hover: "var( --kendo-color-tertiary-hover )",
|
|
192
|
-
active: "var( --kendo-color-tertiary-active )",
|
|
193
|
-
emphasis: "var( --kendo-color-tertiary-emphasis )",
|
|
194
|
-
subtle: "var( --kendo-color-tertiary-subtle )",
|
|
195
|
-
"subtle-hover": "var( --kendo-color-tertiary-subtle-hover )",
|
|
196
|
-
"subtle-active": "var( --kendo-color-tertiary-subtle-active)",
|
|
197
|
-
"on-subtle": "var( --kendo-color-tertiary-on-subtle )",
|
|
198
|
-
"on-surface": "var( --kendo-color-tertiary-on-surface )",
|
|
199
|
-
},
|
|
200
|
-
"on-tertiary": "var( --kendo-color-on-tertiary )",
|
|
201
|
-
light: {
|
|
202
|
-
DEFAULT: "var( --kendo-color-light )",
|
|
203
|
-
hover: "var( --kendo-color-light-hover )",
|
|
204
|
-
active: "var( --kendo-color-light-active )",
|
|
205
|
-
emphasis: "var( --kendo-color-light-emphasis )",
|
|
206
|
-
subtle: "var( --kendo-color-light-subtle )",
|
|
207
|
-
"subtle-hover": "var( --kendo-color-light-subtle-hover )",
|
|
208
|
-
"subtle-active": "var( --kendo-color-light-subtle-active)",
|
|
209
|
-
"on-subtle": "var( --kendo-color-light-on-subtle )",
|
|
210
|
-
"on-surface": "var( --kendo-color-light-on-surface )",
|
|
211
|
-
},
|
|
212
|
-
"on-light": "var( --kendo-color-on-light )",
|
|
213
|
-
dark: {
|
|
214
|
-
DEFAULT: "var( --kendo-color-dark )",
|
|
215
|
-
hover: "var( --kendo-color-dark-hover )",
|
|
216
|
-
active: "var( --kendo-color-dark-active )",
|
|
217
|
-
emphasis: "var( --kendo-color-dark-emphasis )",
|
|
218
|
-
subtle: "var( --kendo-color-dark-subtle )",
|
|
219
|
-
"subtle-hover": "var( --kendo-color-dark-subtle-hover )",
|
|
220
|
-
"subtle-active": "var( --kendo-color-dark-subtle-active)",
|
|
221
|
-
"on-subtle": "var( --kendo-color-dark-on-subtle )",
|
|
222
|
-
"on-surface": "var( --kendo-color-dark-on-surface )",
|
|
223
|
-
},
|
|
224
|
-
"on-dark": "var( --kendo-color-on-dark )",
|
|
225
|
-
info: {
|
|
226
|
-
DEFAULT: "var( --kendo-color-info )",
|
|
227
|
-
hover: "var( --kendo-color-info-hover )",
|
|
228
|
-
active: "var( --kendo-color-info-active )",
|
|
229
|
-
emphasis: "var( --kendo-color-info-emphasis )",
|
|
230
|
-
subtle: "var( --kendo-color-info-subtle )",
|
|
231
|
-
"subtle-hover": "var( --kendo-color-info-subtle-hover )",
|
|
232
|
-
"subtle-active": "var( --kendo-color-info-subtle-active)",
|
|
233
|
-
"on-subtle": "var( --kendo-color-info-on-subtle )",
|
|
234
|
-
"on-surface": "var( --kendo-color-info-on-surface )",
|
|
235
|
-
},
|
|
236
|
-
"on-info": "var( --kendo-color-on-info )",
|
|
237
|
-
success: {
|
|
238
|
-
DEFAULT: "var( --kendo-color-success )",
|
|
239
|
-
hover: "var( --kendo-color-success-hover )",
|
|
240
|
-
active: "var( --kendo-color-success-active )",
|
|
241
|
-
emphasis: "var( --kendo-color-success-emphasis )",
|
|
242
|
-
subtle: "var( --kendo-color-success-subtle )",
|
|
243
|
-
"subtle-hover": "var( --kendo-color-success-subtle-hover )",
|
|
244
|
-
"subtle-active": "var( --kendo-color-success-subtle-active)",
|
|
245
|
-
"on-subtle": "var( --kendo-color-success-on-subtle )",
|
|
246
|
-
"on-surface": "var( --kendo-color-success-on-surface )",
|
|
247
|
-
},
|
|
248
|
-
"on-success": "var( --kendo-color-on-success )",
|
|
249
|
-
error: {
|
|
250
|
-
DEFAULT: "var( --kendo-color-error )",
|
|
251
|
-
hover: "var( --kendo-color-error-hover )",
|
|
252
|
-
active: "var( --kendo-color-error-active )",
|
|
253
|
-
emphasis: "var( --kendo-color-error-emphasis )",
|
|
254
|
-
subtle: "var( --kendo-color-error-subtle )",
|
|
255
|
-
"subtle-hover": "var( --kendo-color-error-subtle-hover )",
|
|
256
|
-
"subtle-active": "var( --kendo-color-error-subtle-active)",
|
|
257
|
-
"on-subtle": "var( --kendo-color-error-on-subtle )",
|
|
258
|
-
"on-surface": "var( --kendo-color-error-on-surface )",
|
|
259
|
-
},
|
|
260
|
-
"on-error": "var( --kendo-color-on-error )",
|
|
261
|
-
warning: {
|
|
262
|
-
DEFAULT: "var( --kendo-color-warning )",
|
|
263
|
-
hover: "var( --kendo-color-warning-hover )",
|
|
264
|
-
active: "var( --kendo-color-warning-active )",
|
|
265
|
-
emphasis: "var( --kendo-color-warning-emphasis )",
|
|
266
|
-
subtle: "var( --kendo-color-warning-subtle )",
|
|
267
|
-
"subtle-hover": "var( --kendo-color-warning-subtle-hover )",
|
|
268
|
-
"subtle-active": "var( --kendo-color-warning-subtle-active)",
|
|
269
|
-
"on-subtle": "var( --kendo-color-warning-on-subtle )",
|
|
270
|
-
"on-surface": "var( --kendo-color-warning-on-surface )",
|
|
271
|
-
},
|
|
272
|
-
"on-warning": "var( --kendo-color-on-warning )",
|
|
273
|
-
"series-a": {
|
|
274
|
-
DEFAULT: "var( --kendo-color-series-a )",
|
|
275
|
-
subtle: "var( --kendo-color-series-a-subtle )",
|
|
276
|
-
subtler: "var( --kendo-color-series-a-subtler )",
|
|
277
|
-
bold: "var( --kendo-color-series-a-bold )",
|
|
278
|
-
bolder: "var( --kendo-color-series-a-bolder )",
|
|
279
|
-
},
|
|
280
|
-
"series-b": {
|
|
281
|
-
DEFAULT: "var( --kendo-color-series-b )",
|
|
282
|
-
subtle: "var( --kendo-color-series-b-subtle )",
|
|
283
|
-
subtler: "var( --kendo-color-series-b-subtler )",
|
|
284
|
-
bold: "var( --kendo-color-series-b-bold )",
|
|
285
|
-
bolder: "var( --kendo-color-series-b-bolder )",
|
|
286
|
-
},
|
|
287
|
-
"series-c": {
|
|
288
|
-
DEFAULT: "var( --kendo-color-series-c )",
|
|
289
|
-
subtle: "var( --kendo-color-series-c-subtle )",
|
|
290
|
-
subtler: "var( --kendo-color-series-c-subtler )",
|
|
291
|
-
bold: "var( --kendo-color-series-c-bold )",
|
|
292
|
-
bolder: "var( --kendo-color-series-c-bolder )",
|
|
293
|
-
},
|
|
294
|
-
"series-d": {
|
|
295
|
-
DEFAULT: "var( --kendo-color-series-d )",
|
|
296
|
-
subtle: "var( --kendo-color-series-d-subtle )",
|
|
297
|
-
subtler: "var( --kendo-color-series-d-subtler )",
|
|
298
|
-
bold: "var( --kendo-color-series-d-bold )",
|
|
299
|
-
bolder: "var( --kendo-color-series-d-bolder )",
|
|
300
|
-
},
|
|
301
|
-
"series-e": {
|
|
302
|
-
DEFAULT: "var( --kendo-color-series-e )",
|
|
303
|
-
subtle: "var( --kendo-color-series-e-subtle )",
|
|
304
|
-
subtler: "var( --kendo-color-series-e-subtler )",
|
|
305
|
-
bold: "var( --kendo-color-series-e-bold )",
|
|
306
|
-
bolder: "var( --kendo-color-series-e-bolder )",
|
|
307
|
-
},
|
|
308
|
-
"series-f": {
|
|
309
|
-
DEFAULT: "var( --kendo-color-series-f )",
|
|
310
|
-
subtle: "var( --kendo-color-series-f-subtle )",
|
|
311
|
-
subtler: "var( --kendo-color-series-f-subtler )",
|
|
312
|
-
bold: "var( --kendo-color-series-f-bold )",
|
|
313
|
-
bolder: "var( --kendo-color-series-f-bolder )",
|
|
314
|
-
},
|
|
315
|
-
},
|
|
316
|
-
},
|
|
317
|
-
},
|
|
318
|
-
};`;
|
|
319
|
-
fs.writeFileSync(kendoPresetPath, kendoPresetContent, "utf8");
|
|
320
|
-
ora("Created kendo-tw-preset.js").succeed();
|
|
321
|
-
// Create tailwind.config.js with Kendo preset
|
|
322
|
-
const tailwindConfigPath = path.join(projectDir, "tailwind.config.js");
|
|
323
|
-
const tailwindConfigContent = `/** @type {import('tailwindcss').Config} */
|
|
324
|
-
|
|
325
|
-
import kendoTwPreset from "./kendo-tw-preset.js";
|
|
326
|
-
|
|
327
|
-
export default {
|
|
328
|
-
content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],
|
|
329
|
-
presets: [kendoTwPreset],
|
|
330
|
-
theme: {
|
|
331
|
-
extend: {
|
|
332
|
-
colors: {},
|
|
333
|
-
},
|
|
334
|
-
},
|
|
335
|
-
plugins: [],
|
|
336
|
-
};`;
|
|
337
|
-
fs.writeFileSync(tailwindConfigPath, tailwindConfigContent, "utf8");
|
|
338
|
-
ora("Created tailwind.config.js with Kendo preset").succeed();
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
// tsconfig.json
|
|
342
|
-
const tsconfigPath = path.join(projectDir, "tsconfig.json");
|
|
343
|
-
const tsConfigContent = `{
|
|
344
|
-
"files": [],
|
|
345
|
-
"references": [
|
|
346
|
-
{
|
|
347
|
-
"path": "./tsconfig.app.json"
|
|
348
|
-
},
|
|
349
|
-
{
|
|
350
|
-
"path": "./tsconfig.node.json"
|
|
351
|
-
}
|
|
352
|
-
],
|
|
353
|
-
"compilerOptions": {
|
|
354
|
-
"baseUrl": ".",
|
|
355
|
-
"paths": {
|
|
356
|
-
"@/*": [
|
|
357
|
-
"./src/*"
|
|
358
|
-
]
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
}`;
|
|
362
|
-
fs.writeFileSync(tsconfigPath, tsConfigContent, "utf8");
|
|
363
|
-
ora("Updated tsconfig.json with baseUrl and paths").succeed();
|
|
364
|
-
// tsconfig.app.json
|
|
365
|
-
const tsconfigAppPath = path.join(projectDir, "tsconfig.app.json");
|
|
366
|
-
const tsConfigAppContent = `{
|
|
367
|
-
"compilerOptions": {
|
|
368
|
-
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
|
369
|
-
"target": "ES2022",
|
|
370
|
-
"useDefineForClassFields": true,
|
|
371
|
-
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
372
|
-
"module": "ESNext",
|
|
373
|
-
"skipLibCheck": true,
|
|
374
|
-
|
|
375
|
-
/* Shadcn */
|
|
376
|
-
"baseUrl": ".",
|
|
377
|
-
"paths": {
|
|
378
|
-
"@/*": [
|
|
379
|
-
"./src/*"
|
|
380
|
-
]
|
|
381
|
-
},
|
|
382
|
-
|
|
383
|
-
/* Bundler mode */
|
|
384
|
-
"moduleResolution": "bundler",
|
|
385
|
-
"allowImportingTsExtensions": true,
|
|
386
|
-
"moduleDetection": "force",
|
|
387
|
-
"noEmit": true,
|
|
388
|
-
"jsx": "react-jsx",
|
|
389
|
-
|
|
390
|
-
/* Linting */
|
|
391
|
-
"strict": true,
|
|
392
|
-
"noUnusedLocals": true,
|
|
393
|
-
"noUnusedParameters": true,
|
|
394
|
-
"noFallthroughCasesInSwitch": true,
|
|
395
|
-
},
|
|
396
|
-
"include": ["src"]
|
|
397
|
-
}
|
|
398
|
-
`;
|
|
399
|
-
fs.writeFileSync(tsconfigAppPath, tsConfigAppContent, "utf8");
|
|
400
|
-
ora("Created tsconfig.app.json").succeed();
|
|
401
|
-
// index.css before we do the install
|
|
402
|
-
// Update CSS entry point
|
|
403
|
-
const indexCssPath = path.join(projectDir, "src", "index.css");
|
|
404
|
-
fs.writeFileSync(indexCssPath, `@import "tailwindcss";`, "utf8");
|
|
405
|
-
ora("Updated CSS entry point").succeed();
|
|
406
|
-
// Update the vite.config.ts early to include the paths
|
|
407
|
-
const viteConfigPath = path.join(projectDir, "vite.config.ts");
|
|
408
|
-
const newViteConfigContent = `import path from "path";
|
|
409
|
-
import tailwindcss from "@tailwindcss/vite";
|
|
410
|
-
import { defineConfig } from "vite";
|
|
411
|
-
import react from "@vitejs/plugin-react";
|
|
412
|
-
|
|
413
|
-
export default defineConfig(({ command, mode }) => {
|
|
414
|
-
const isDev = mode === "development" || command === "serve";
|
|
415
|
-
|
|
416
|
-
return {
|
|
417
|
-
base: "./",
|
|
418
|
-
plugins: [react(), tailwindcss()],
|
|
419
|
-
resolve: {
|
|
420
|
-
alias: {
|
|
421
|
-
"@": path.resolve(__dirname, "./src"),
|
|
422
|
-
},
|
|
423
|
-
},
|
|
424
|
-
build: {
|
|
425
|
-
rollupOptions: {
|
|
426
|
-
external: ["../../token.json"],
|
|
427
|
-
output: {
|
|
428
|
-
manualChunks: undefined,
|
|
429
|
-
entryFileNames: "[name].js",
|
|
430
|
-
chunkFileNames: "[name].chunk.js",
|
|
431
|
-
assetFileNames: (assetInfo) => {
|
|
432
|
-
if (assetInfo.name?.endsWith(".css")) {
|
|
433
|
-
return "main.css";
|
|
434
|
-
}
|
|
435
|
-
return "[name].[ext]";
|
|
436
|
-
},
|
|
437
|
-
},
|
|
438
|
-
},
|
|
439
|
-
minify: !isDev,
|
|
440
|
-
mode: isDev ? "development" : "production",
|
|
441
|
-
assetsDir: "",
|
|
442
|
-
target: "es2015",
|
|
443
|
-
cssCodeSplit: false,
|
|
444
|
-
},
|
|
445
|
-
};
|
|
446
|
-
});
|
|
447
|
-
`;
|
|
448
|
-
fs.writeFileSync(viteConfigPath, newViteConfigContent, "utf8");
|
|
449
|
-
ora("Replaced vite.config.ts with custom build config").succeed();
|
|
450
|
-
// Initialize Shadcn/ui after basic setup
|
|
451
|
-
runCommand("npx shadcn@latest init --force --silent --yes --base-color neutral", "Initializing Shadcn/ui...");
|
|
452
|
-
// Install some basic Shadcn components
|
|
453
|
-
runCommand("npx shadcn@latest add --all", "Installing all Shadcn components...");
|
|
454
|
-
}
|
|
455
|
-
if (uiLibrary === "kendo") {
|
|
456
|
-
// Overwrite Vite config with advanced build options
|
|
457
|
-
const viteConfigPath = path.join(projectDir, "vite.config.ts");
|
|
458
|
-
const newViteConfigContent = `import path from "path";
|
|
459
|
-
import tailwindcss from "@tailwindcss/vite";
|
|
460
|
-
import { defineConfig } from "vite";
|
|
461
|
-
import react from "@vitejs/plugin-react";
|
|
462
|
-
|
|
463
|
-
export default defineConfig(({ command, mode }) => {
|
|
464
|
-
const isDev = mode === "development" || command === "serve";
|
|
465
|
-
|
|
466
|
-
return {
|
|
467
|
-
base: "./",
|
|
468
|
-
plugins: [react(), tailwindcss()],
|
|
469
|
-
resolve: {
|
|
470
|
-
alias: {
|
|
471
|
-
"@": path.resolve(__dirname, "./src"),
|
|
472
|
-
},
|
|
473
|
-
},
|
|
474
|
-
build: {
|
|
475
|
-
rollupOptions: {
|
|
476
|
-
external: ["../../token.json"],
|
|
477
|
-
output: {
|
|
478
|
-
manualChunks: undefined,
|
|
479
|
-
entryFileNames: "[name].js",
|
|
480
|
-
chunkFileNames: "[name].chunk.js",
|
|
481
|
-
assetFileNames: (assetInfo) => {
|
|
482
|
-
if (assetInfo.name?.endsWith(".css")) {
|
|
483
|
-
return "main.css";
|
|
484
|
-
}
|
|
485
|
-
return "[name].[ext]";
|
|
486
|
-
},
|
|
487
|
-
},
|
|
488
|
-
},
|
|
489
|
-
minify: !isDev,
|
|
490
|
-
mode: isDev ? "development" : "production",
|
|
491
|
-
assetsDir: "",
|
|
492
|
-
target: "es2015",
|
|
493
|
-
cssCodeSplit: false,
|
|
494
|
-
},
|
|
495
|
-
};
|
|
496
|
-
});
|
|
497
|
-
`;
|
|
498
|
-
fs.writeFileSync(viteConfigPath, newViteConfigContent, "utf8");
|
|
499
|
-
ora("Replaced vite.config.ts with custom build config").succeed();
|
|
500
|
-
}
|
|
501
|
-
if (uiLibrary === "kendo") {
|
|
502
|
-
// Update CSS entry point
|
|
503
|
-
const indexCssPath = path.join(projectDir, "src", "index.css");
|
|
504
|
-
fs.writeFileSync(indexCssPath, `@import "tailwindcss";`, "utf8");
|
|
505
|
-
ora("Updated CSS entry point").succeed();
|
|
506
|
-
}
|
|
507
|
-
// Add global type declarations for asset modules
|
|
508
|
-
const globalDtsPath = path.join(projectDir, "src", "global.d.ts");
|
|
509
|
-
const globalDtsContent = `declare module "*.css";
|
|
510
|
-
declare module "*.scss";
|
|
511
|
-
declare module "*.svg";
|
|
512
|
-
declare module "*.png";
|
|
513
|
-
`;
|
|
514
|
-
fs.writeFileSync(globalDtsPath, globalDtsContent, "utf8");
|
|
515
|
-
ora("Created src/global.d.ts").succeed();
|
|
516
|
-
// Clear App.css
|
|
517
|
-
const appCssPath = path.join(projectDir, "src", "App.css");
|
|
518
|
-
fs.writeFileSync(appCssPath, "", "utf8");
|
|
519
|
-
ora("Cleared App.css").succeed();
|
|
520
|
-
// Replace App.tsx with custom content based on UI library
|
|
521
|
-
const appTsxPath = path.join(projectDir, "src", "App.tsx");
|
|
522
|
-
let newAppTsxContent = "";
|
|
523
|
-
if (uiLibrary === "kendo") {
|
|
524
|
-
newAppTsxContent = `import "./App.css";
|
|
525
|
-
|
|
526
|
-
function App() {
|
|
527
|
-
return (
|
|
528
|
-
<>
|
|
529
|
-
<div className="flex flex-col h-screen items-center justify-center">
|
|
530
|
-
Hello World!
|
|
531
|
-
</div>
|
|
532
|
-
</>
|
|
533
|
-
);
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
export default App;
|
|
537
|
-
`;
|
|
538
|
-
}
|
|
539
|
-
else {
|
|
540
|
-
// Shadcn/ui version - template with Shadcn components
|
|
541
|
-
newAppTsxContent = `import "./App.css";
|
|
542
|
-
import { Button } from "@/components/ui/button";
|
|
543
|
-
|
|
544
|
-
function App() {
|
|
545
|
-
return (
|
|
546
|
-
<>
|
|
547
|
-
<div className="flex flex-col h-screen items-center justify-center">
|
|
548
|
-
<p>Hello, World!</p>
|
|
549
|
-
<Button>Click me</Button>
|
|
550
|
-
</div>
|
|
551
|
-
</>
|
|
552
|
-
);
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
export default App;
|
|
556
|
-
`;
|
|
557
|
-
}
|
|
558
|
-
fs.writeFileSync(appTsxPath, newAppTsxContent, "utf8");
|
|
559
|
-
ora(`Replaced App.tsx with ${uiLibrary} template`).succeed();
|
|
560
|
-
// Generate main.tsx from template
|
|
561
|
-
const mainTsxPath = path.join(projectDir, "src", "main.tsx");
|
|
562
|
-
const kendoImport = uiLibrary === "kendo" ? `import "${kendoThemePackage}/dist/all.css";` : "";
|
|
563
|
-
const newMainTsxContent = `import { StrictMode } from "react";
|
|
564
|
-
import { createRoot } from "react-dom/client";
|
|
565
|
-
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
566
|
-
${kendoImport}
|
|
567
|
-
import "./index.css";
|
|
568
|
-
import App from "./App.tsx";
|
|
569
|
-
|
|
570
|
-
const queryClient = new QueryClient({
|
|
571
|
-
defaultOptions: {
|
|
572
|
-
queries: {
|
|
573
|
-
refetchOnWindowFocus: false,
|
|
574
|
-
retry: 3,
|
|
575
|
-
staleTime: 5 * 60 * 1000, // 5 minutes
|
|
576
|
-
},
|
|
577
|
-
mutations: {
|
|
578
|
-
retry: 1,
|
|
579
|
-
},
|
|
580
|
-
},
|
|
581
|
-
});
|
|
582
|
-
|
|
583
|
-
const root = createRoot(document.getElementById("root")!);
|
|
584
|
-
|
|
585
|
-
root.render(
|
|
586
|
-
<StrictMode>
|
|
587
|
-
<QueryClientProvider client={queryClient}>
|
|
588
|
-
<App />
|
|
589
|
-
</QueryClientProvider>
|
|
590
|
-
</StrictMode>
|
|
591
|
-
);
|
|
592
|
-
`;
|
|
593
|
-
fs.writeFileSync(mainTsxPath, newMainTsxContent, "utf8");
|
|
594
|
-
ora("Generated custom main.tsx with providers").succeed();
|
|
595
|
-
// Modify index.html
|
|
596
|
-
const indexPath = path.join(projectDir, "index.html");
|
|
597
|
-
let indexContent = fs.readFileSync(indexPath, "utf8");
|
|
598
|
-
indexContent = indexContent
|
|
599
|
-
.replace("<title>Vite + React + TS</title>", "<title>EC | Vite + React + TS + Kendo UI + Tailwind</title>")
|
|
600
|
-
.replace("</head>", ` <script src="../../ClientGlobalContext.js.aspx" type="text/javascript"></script>\n </head>`);
|
|
601
|
-
fs.writeFileSync(indexPath, indexContent, "utf8");
|
|
602
|
-
ora("Added ClientGlobalContext script to index.html").succeed();
|
|
603
|
-
// Add .prettierrc in root directory
|
|
604
|
-
const prettierRcPath = path.join(projectDir, ".prettierrc");
|
|
605
|
-
const prettierRcContent = `{
|
|
606
|
-
"tabWidth": 4,
|
|
607
|
-
"useTabs": true,
|
|
608
|
-
"semi": true,
|
|
609
|
-
"singleQuote": false,
|
|
610
|
-
"trailingComma": "es5",
|
|
611
|
-
"bracketSpacing": true,
|
|
612
|
-
"jsxBracketSameLine": false,
|
|
613
|
-
"arrowParens": "always",
|
|
614
|
-
"printWidth": 120
|
|
615
|
-
}`;
|
|
616
|
-
fs.writeFileSync(prettierRcPath, prettierRcContent, "utf8");
|
|
617
|
-
ora("Added .prettierrc").succeed();
|
|
618
|
-
// Add token.json in root directory
|
|
619
|
-
const tokenJsonPath = path.join(projectDir, "token.json");
|
|
620
|
-
const tokenJsonContent = `{
|
|
621
|
-
"accessToken": "",
|
|
622
|
-
"expiresIn": "",
|
|
623
|
-
"expires_on": 0,
|
|
624
|
-
"subscription": "",
|
|
625
|
-
"tenant": "",
|
|
626
|
-
"tokenType": "Bearer"
|
|
627
|
-
}`;
|
|
628
|
-
fs.writeFileSync(tokenJsonPath, tokenJsonContent, "utf8");
|
|
629
|
-
ora("Added token.json").succeed();
|
|
630
|
-
// Create services directory and authService.ts
|
|
631
|
-
const servicesDir = path.join(projectDir, "src", "services");
|
|
632
|
-
fs.ensureDirSync(servicesDir);
|
|
633
|
-
const authServicePath = path.join(servicesDir, "authService.ts");
|
|
634
|
-
const authServiceContent = `const getAuthToken = async (): Promise<string> => {
|
|
635
|
-
const tokenModule = await import("../../token.json");
|
|
636
|
-
const token = tokenModule.default.accessToken;
|
|
637
|
-
return token;
|
|
638
|
-
};
|
|
639
|
-
|
|
640
|
-
export const getApiUrl = (): string => {
|
|
641
|
-
if (window.parent && window.parent.Xrm) {
|
|
642
|
-
const globalContext = window.Xrm.Utility.getGlobalContext();
|
|
643
|
-
const clientUrl = globalContext.getClientUrl();
|
|
644
|
-
return \`\${clientUrl}/api/data/v9.2\`;
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
return "https://DOMAIN.REGION.dynamics.com/api/data/v9.2";
|
|
648
|
-
};
|
|
649
|
-
|
|
650
|
-
export const getAuthHeaders = async (): Promise<HeadersInit> => {
|
|
651
|
-
if (window.parent && window.parent.Xrm) {
|
|
652
|
-
return {
|
|
653
|
-
"Content-Type": "application/json",
|
|
654
|
-
"OData-MaxVersion": "4.0",
|
|
655
|
-
"OData-Version": "4.0",
|
|
656
|
-
Prefer: 'odata.include-annotations="*"',
|
|
657
|
-
};
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
const token = await getAuthToken();
|
|
661
|
-
const headers: HeadersInit = {
|
|
662
|
-
Authorization: \`Bearer \${token}\`,
|
|
663
|
-
"Content-Type": "application/json",
|
|
664
|
-
"OData-MaxVersion": "4.0",
|
|
665
|
-
"OData-Version": "4.0",
|
|
666
|
-
Prefer: 'odata.include-annotations="*"',
|
|
667
|
-
};
|
|
668
|
-
|
|
669
|
-
return headers;
|
|
670
|
-
};`;
|
|
671
|
-
fs.writeFileSync(authServicePath, authServiceContent, "utf8");
|
|
672
|
-
ora("Created authService.ts in src/services").succeed();
|
|
673
|
-
// Replace README.md with template from the package
|
|
674
|
-
try {
|
|
675
|
-
const currentFileDir = path.dirname(fileURLToPath(import.meta.url));
|
|
676
|
-
const candidates = [
|
|
677
|
-
path.resolve(currentFileDir, "../readmes/webresource.md"), // dist layout
|
|
678
|
-
path.resolve(currentFileDir, "../../src/readmes/webresource.md"), // repo layout (ts src)
|
|
679
|
-
];
|
|
680
|
-
let templatePath = "";
|
|
681
|
-
for (const c of candidates) {
|
|
682
|
-
if (fs.existsSync(c)) {
|
|
683
|
-
templatePath = c;
|
|
684
|
-
break;
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
let readmeContent = "";
|
|
688
|
-
if (templatePath) {
|
|
689
|
-
readmeContent = fs.readFileSync(templatePath, "utf8");
|
|
690
|
-
}
|
|
691
|
-
else {
|
|
692
|
-
readmeContent = `# EC Webresource App\n\nSee documentation inside create-ec-app (webresource README template).`;
|
|
693
|
-
}
|
|
694
|
-
fs.writeFileSync(path.join(projectDir, "README.md"), readmeContent, "utf8");
|
|
695
|
-
ora("Added README.md from template").succeed();
|
|
696
|
-
}
|
|
697
|
-
catch (err) {
|
|
698
|
-
ora("Failed to add README.md from template; keeping Vite README").warn();
|
|
699
|
-
}
|
|
700
|
-
// Initialize Git
|
|
701
|
-
runCommand("git init", "Initializing Git repository...");
|
|
702
|
-
runCommand("git add .", "Staging files for initial commit...");
|
|
703
|
-
runCommand(`git commit -m "Initial commit from create-ec-app"`, "Creating initial commit...");
|
|
704
|
-
};
|
|
705
|
-
//# sourceMappingURL=webresource.js.map
|