create-prisma-php-app 3.3.1 → 3.3.3

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 (2) hide show
  1. package/dist/index.js +143 -61
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -7,7 +7,11 @@ import{execSync,spawnSync}from"child_process";import fs from"fs";import{fileURLT
7
7
  * @param {boolean} [isDev=false] - Whether to install the dependencies as devDependencies.
8
8
  */
9
9
  async function installNpmDependencies(baseDir, dependencies, isDev = false) {
10
- console.log("Initializing new Node.js project...");
10
+ if (!fs.existsSync(path.join(baseDir, "package.json"))) {
11
+ console.log("Initializing new Node.js project...");
12
+ } else {
13
+ console.log("Updating existing Node.js project...");
14
+ }
11
15
  // Initialize a package.json if it doesn't exist
12
16
  if (!fs.existsSync(path.join(baseDir, "package.json"))) {
13
17
  execSync("npm init -y", {
@@ -173,29 +177,11 @@ async function main() {
173
177
  let projectName = args[0];
174
178
  let answer = null;
175
179
  if (projectName) {
176
- let useBackendOnly = args.includes("--backend-only");
177
- let useSwaggerDocs = args.includes("--swagger-docs");
178
- let useTailwind = args.includes("--tailwindcss");
179
- let useWebsocket = args.includes("--websocket");
180
- let usePrisma = args.includes("--prisma");
181
- let useDocker = args.includes("--docker");
182
- const predefinedAnswers = {
183
- projectName,
184
- backendOnly: useBackendOnly,
185
- swaggerDocs: useSwaggerDocs,
186
- tailwindcss: useTailwind,
187
- websocket: useWebsocket,
188
- prisma: usePrisma,
189
- docker: useDocker,
190
- };
191
- answer = await getAnswer(predefinedAnswers);
192
- if (answer === null) {
193
- console.log(chalk.red("Installation cancelled."));
194
- return;
195
- }
180
+ // Check if it's an update FIRST
196
181
  const currentDir = process.cwd();
197
182
  const configPath = path.join(currentDir, "prisma-php.json");
198
183
  if (fs.existsSync(configPath)) {
184
+ // It's an update - read existing settings
199
185
  const localSettings = readJsonFile(configPath);
200
186
  let excludeFiles = [];
201
187
  localSettings.excludeFiles?.map((file) => {
@@ -205,19 +191,56 @@ async function main() {
205
191
  });
206
192
  updateAnswer = {
207
193
  projectName,
208
- backendOnly: answer?.backendOnly ?? false,
209
- swaggerDocs: answer?.swaggerDocs ?? false,
210
- tailwindcss: answer?.tailwindcss ?? false,
211
- websocket: answer?.websocket ?? false,
212
- prisma: answer?.prisma ?? false,
213
- docker: answer?.docker ?? false,
194
+ backendOnly: localSettings.backendOnly,
195
+ swaggerDocs: localSettings.swaggerDocs,
196
+ tailwindcss: localSettings.tailwindcss,
197
+ websocket: localSettings.websocket,
198
+ prisma: localSettings.prisma,
199
+ docker: localSettings.docker,
214
200
  isUpdate: true,
215
201
  excludeFiles: localSettings.excludeFiles ?? [],
216
202
  excludeFilePath: excludeFiles ?? [],
217
203
  filePath: currentDir,
218
204
  };
205
+ // For updates, use existing settings but allow CLI overrides
206
+ const predefinedAnswers = {
207
+ projectName,
208
+ backendOnly:
209
+ args.includes("--backend-only") || localSettings.backendOnly,
210
+ swaggerDocs:
211
+ args.includes("--swagger-docs") || localSettings.swaggerDocs,
212
+ tailwindcss:
213
+ args.includes("--tailwindcss") || localSettings.tailwindcss,
214
+ websocket: args.includes("--websocket") || localSettings.websocket,
215
+ prisma: args.includes("--prisma") || localSettings.prisma,
216
+ docker: args.includes("--docker") || localSettings.docker,
217
+ };
218
+ answer = await getAnswer(predefinedAnswers);
219
+ } else {
220
+ // It's a new project - use CLI arguments
221
+ let useBackendOnly = args.includes("--backend-only");
222
+ let useSwaggerDocs = args.includes("--swagger-docs");
223
+ let useTailwind = args.includes("--tailwindcss");
224
+ let useWebsocket = args.includes("--websocket");
225
+ let usePrisma = args.includes("--prisma");
226
+ let useDocker = args.includes("--docker");
227
+ const predefinedAnswers = {
228
+ projectName,
229
+ backendOnly: useBackendOnly,
230
+ swaggerDocs: useSwaggerDocs,
231
+ tailwindcss: useTailwind,
232
+ websocket: useWebsocket,
233
+ prisma: usePrisma,
234
+ docker: useDocker,
235
+ };
236
+ answer = await getAnswer(predefinedAnswers);
237
+ }
238
+ if (answer === null) {
239
+ console.log(chalk.red("Installation cancelled."));
240
+ return;
219
241
  }
220
242
  } else {
243
+ // No project name provided - interactive mode
221
244
  answer = await getAnswer();
222
245
  }
223
246
  if (answer === null) {
@@ -338,24 +361,57 @@ async function main() {
338
361
  if (updateAnswer?.isUpdate) {
339
362
  const updateUninstallNpmDependencies = [];
340
363
  const updateUninstallComposerDependencies = [];
364
+ // Helper function to check if a composer package is installed
365
+ const isComposerPackageInstalled = (packageName) => {
366
+ try {
367
+ const composerJsonPath = path.join(projectPath, "composer.json");
368
+ if (fs.existsSync(composerJsonPath)) {
369
+ const composerJson = JSON.parse(
370
+ fs.readFileSync(composerJsonPath, "utf8")
371
+ );
372
+ return !!(
373
+ composerJson.require && composerJson.require[packageName]
374
+ );
375
+ }
376
+ return false;
377
+ } catch {
378
+ return false;
379
+ }
380
+ };
381
+ // Helper function to check if an npm package is installed
382
+ const isNpmPackageInstalled = (packageName) => {
383
+ try {
384
+ const packageJsonPath = path.join(projectPath, "package.json");
385
+ if (fs.existsSync(packageJsonPath)) {
386
+ const packageJson = JSON.parse(
387
+ fs.readFileSync(packageJsonPath, "utf8")
388
+ );
389
+ return !!(
390
+ (packageJson.dependencies &&
391
+ packageJson.dependencies[packageName]) ||
392
+ (packageJson.devDependencies &&
393
+ packageJson.devDependencies[packageName])
394
+ );
395
+ }
396
+ return false;
397
+ } catch {
398
+ return false;
399
+ }
400
+ };
341
401
  if (updateAnswer.backendOnly) {
342
402
  nonBackendFiles.forEach((file) => {
343
403
  const filePath = path.join(projectPath, "src", "app", file);
344
404
  if (fs.existsSync(filePath)) {
345
- fs.unlinkSync(filePath); // Delete each file if it exists
405
+ fs.unlinkSync(filePath);
346
406
  console.log(`${file} was deleted successfully.`);
347
- } else {
348
- console.log(`${file} does not exist.`);
349
407
  }
350
408
  });
351
409
  const backendOnlyFolders = ["js", "css"];
352
410
  backendOnlyFolders.forEach((folder) => {
353
411
  const folderPath = path.join(projectPath, "src", "app", folder);
354
412
  if (fs.existsSync(folderPath)) {
355
- fs.rmSync(folderPath, { recursive: true, force: true }); // Use fs.rmSync instead of fs.rmdirSync
413
+ fs.rmSync(folderPath, { recursive: true, force: true });
356
414
  console.log(`${folder} was deleted successfully.`);
357
- } else {
358
- console.log(`${folder} does not exist.`);
359
415
  }
360
416
  });
361
417
  }
@@ -367,44 +423,53 @@ async function main() {
367
423
  "swagger-docs"
368
424
  );
369
425
  if (fs.existsSync(swaggerDocsFolder)) {
370
- fs.rmSync(swaggerDocsFolder, { recursive: true, force: true }); // Use fs.rmSync instead of fs.rmdirSync
426
+ fs.rmSync(swaggerDocsFolder, { recursive: true, force: true });
371
427
  console.log(`swagger-docs was deleted successfully.`);
372
428
  }
373
429
  const swaggerFiles = ["swagger-config.ts"];
374
430
  swaggerFiles.forEach((file) => {
375
431
  const filePath = path.join(projectPath, "settings", file);
376
432
  if (fs.existsSync(filePath)) {
377
- fs.unlinkSync(filePath); // Delete each file if it exists
433
+ fs.unlinkSync(filePath);
378
434
  console.log(`${file} was deleted successfully.`);
379
- } else {
380
- console.log(`${file} does not exist.`);
381
435
  }
382
436
  });
383
- updateUninstallNpmDependencies.push(
384
- "swagger-jsdoc",
385
- "@types/swagger-jsdoc",
386
- "prompts",
387
- "@types/prompts"
388
- );
437
+ // Only add to uninstall list if packages are actually installed
438
+ if (isNpmPackageInstalled("swagger-jsdoc")) {
439
+ updateUninstallNpmDependencies.push("swagger-jsdoc");
440
+ }
441
+ if (isNpmPackageInstalled("@types/swagger-jsdoc")) {
442
+ updateUninstallNpmDependencies.push("@types/swagger-jsdoc");
443
+ }
444
+ if (isNpmPackageInstalled("prompts")) {
445
+ updateUninstallNpmDependencies.push("prompts");
446
+ }
447
+ if (isNpmPackageInstalled("@types/prompts")) {
448
+ updateUninstallNpmDependencies.push("@types/prompts");
449
+ }
389
450
  }
390
451
  if (!updateAnswer.tailwindcss) {
391
452
  const tailwindFiles = ["postcss.config.js"];
392
453
  tailwindFiles.forEach((file) => {
393
454
  const filePath = path.join(projectPath, file);
394
455
  if (fs.existsSync(filePath)) {
395
- fs.unlinkSync(filePath); // Delete each file if it exists
456
+ fs.unlinkSync(filePath);
396
457
  console.log(`${file} was deleted successfully.`);
397
- } else {
398
- console.log(`${file} does not exist.`);
399
458
  }
400
459
  });
401
- updateUninstallNpmDependencies.push(
460
+ // Only add to uninstall list if packages are actually installed
461
+ const tailwindPackages = [
402
462
  "tailwindcss",
403
463
  "postcss",
404
464
  "postcss-cli",
405
465
  "@tailwindcss/postcss",
406
- "cssnano"
407
- );
466
+ "cssnano",
467
+ ];
468
+ tailwindPackages.forEach((pkg) => {
469
+ if (isNpmPackageInstalled(pkg)) {
470
+ updateUninstallNpmDependencies.push(pkg);
471
+ }
472
+ });
408
473
  }
409
474
  if (!updateAnswer.websocket) {
410
475
  const websocketFiles = [
@@ -414,10 +479,8 @@ async function main() {
414
479
  websocketFiles.forEach((file) => {
415
480
  const filePath = path.join(projectPath, "settings", file);
416
481
  if (fs.existsSync(filePath)) {
417
- fs.unlinkSync(filePath); // Delete each file if it exists
482
+ fs.unlinkSync(filePath);
418
483
  console.log(`${file} was deleted successfully.`);
419
- } else {
420
- console.log(`${file} does not exist.`);
421
484
  }
422
485
  });
423
486
  const websocketFolder = path.join(
@@ -427,18 +490,28 @@ async function main() {
427
490
  "Websocket"
428
491
  );
429
492
  if (fs.existsSync(websocketFolder)) {
430
- fs.rmSync(websocketFolder, { recursive: true, force: true }); // Use fs.rmSync instead of fs.rmdirSync
493
+ fs.rmSync(websocketFolder, { recursive: true, force: true });
431
494
  console.log(`Websocket folder was deleted successfully.`);
432
495
  }
433
- updateUninstallNpmDependencies.push("chokidar-cli");
434
- updateUninstallComposerDependencies.push("cboden/ratchet");
496
+ // Only add to uninstall list if packages are actually installed
497
+ if (isNpmPackageInstalled("chokidar-cli")) {
498
+ updateUninstallNpmDependencies.push("chokidar-cli");
499
+ }
500
+ if (isComposerPackageInstalled("cboden/ratchet")) {
501
+ updateUninstallComposerDependencies.push("cboden/ratchet");
502
+ }
435
503
  }
436
504
  if (!updateAnswer.prisma) {
437
- updateUninstallNpmDependencies.push(
505
+ const prismaPackages = [
438
506
  "prisma",
439
507
  "@prisma/client",
440
- "@prisma/internals"
441
- );
508
+ "@prisma/internals",
509
+ ];
510
+ prismaPackages.forEach((pkg) => {
511
+ if (isNpmPackageInstalled(pkg)) {
512
+ updateUninstallNpmDependencies.push(pkg);
513
+ }
514
+ });
442
515
  }
443
516
  if (!updateAnswer.docker) {
444
517
  const dockerFiles = [
@@ -450,14 +523,18 @@ async function main() {
450
523
  dockerFiles.forEach((file) => {
451
524
  const filePath = path.join(projectPath, file);
452
525
  if (fs.existsSync(filePath)) {
453
- fs.unlinkSync(filePath); // Delete each file if it exists
526
+ fs.unlinkSync(filePath);
454
527
  console.log(`${file} was deleted successfully.`);
455
- } else {
456
- console.log(`${file} does not exist.`);
457
528
  }
458
529
  });
459
530
  }
531
+ // Only uninstall if there are packages to uninstall
460
532
  if (updateUninstallNpmDependencies.length > 0) {
533
+ console.log(
534
+ `Uninstalling npm packages: ${updateUninstallNpmDependencies.join(
535
+ ", "
536
+ )}`
537
+ );
461
538
  await uninstallNpmDependencies(
462
539
  projectPath,
463
540
  updateUninstallNpmDependencies,
@@ -465,6 +542,11 @@ async function main() {
465
542
  );
466
543
  }
467
544
  if (updateUninstallComposerDependencies.length > 0) {
545
+ console.log(
546
+ `Uninstalling composer packages: ${updateUninstallComposerDependencies.join(
547
+ ", "
548
+ )}`
549
+ );
468
550
  await uninstallComposerDependencies(
469
551
  projectPath,
470
552
  updateUninstallComposerDependencies
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-prisma-php-app",
3
- "version": "3.3.1",
3
+ "version": "3.3.3",
4
4
  "description": "Prisma-PHP: A Revolutionary Library Bridging PHP with Prisma ORM",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",