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.
@@ -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