@digilogiclabs/create-saas-app 1.3.0 → 1.5.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/CHANGELOG.md +42 -0
- package/README.md +46 -22
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.js +48 -6
- package/dist/index.js.map +1 -1
- package/dist/templates/web/base/template/package.json +20 -10
- package/dist/templates/web/base/template/src/app/error.tsx +97 -0
- package/dist/templates/web/base/template/src/app/layout.tsx +8 -2
- package/dist/templates/web/base/template/src/app/loading.tsx +34 -0
- package/dist/templates/web/base/template/src/components/__tests__/example.test.tsx +49 -0
- package/dist/templates/web/base/template/src/components/providers/app-providers.tsx +6 -2
- package/dist/templates/web/base/template/src/components/providers/theme-provider.tsx +94 -0
- package/dist/templates/web/base/template/src/components/shared/footer.tsx +36 -0
- package/dist/templates/web/base/template/src/components/shared/header.tsx +2 -0
- package/dist/templates/web/base/template/src/components/ui/theme-toggle.tsx +34 -0
- package/dist/templates/web/base/template/src/lib/auth-server.ts +177 -0
- package/dist/templates/web/base/template/src/lib/env.ts +46 -0
- package/dist/templates/web/base/template/src/lib/utils.ts +133 -0
- package/dist/templates/web/base/template/src/test/setup.ts +79 -0
- package/dist/templates/web/base/template/vitest.config.ts +17 -0
- package/dist/templates/web/ui-auth/template/package.json +14 -4
- package/dist/templates/web/ui-auth/template/src/app/error.tsx +67 -0
- package/dist/templates/web/ui-auth/template/src/app/layout.tsx +6 -2
- package/dist/templates/web/ui-auth/template/src/app/loading.tsx +20 -0
- package/dist/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +49 -0
- package/dist/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +6 -2
- package/dist/templates/web/ui-auth/template/src/components/providers/theme-provider.tsx +94 -0
- package/dist/templates/web/ui-auth/template/src/components/shared/footer.tsx +36 -0
- package/dist/templates/web/ui-auth/template/src/components/shared/header.tsx +2 -0
- package/dist/templates/web/ui-auth/template/src/components/ui/theme-toggle.tsx +34 -0
- package/dist/templates/web/ui-auth/template/src/lib/env.ts +49 -0
- package/dist/templates/web/ui-auth/template/src/lib/utils.ts +133 -0
- package/dist/templates/web/ui-auth/template/src/test/setup.ts +79 -0
- package/dist/templates/web/ui-auth/template/vitest.config.ts +17 -0
- package/dist/templates/web/ui-auth-payments/template/middleware.ts +68 -0
- package/dist/templates/web/ui-auth-payments/template/package.json +14 -4
- package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/layout.tsx +22 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +183 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/error.tsx +67 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/layout.tsx +6 -2
- package/dist/templates/web/ui-auth-payments/template/src/app/loading.tsx +20 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +38 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +50 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +49 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +52 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +144 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +68 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +185 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +6 -2
- package/dist/templates/web/ui-auth-payments/template/src/components/providers/theme-provider.tsx +94 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/shared/footer.tsx +36 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +2 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/ui/theme-toggle.tsx +34 -0
- package/dist/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +246 -0
- package/dist/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +340 -0
- package/dist/templates/web/ui-auth-payments/template/src/lib/auth-server.ts +177 -0
- package/dist/templates/web/ui-auth-payments/template/src/lib/env.ts +49 -0
- package/dist/templates/web/ui-auth-payments/template/src/lib/utils.ts +133 -0
- package/dist/templates/web/ui-auth-payments/template/src/test/setup.ts +79 -0
- package/dist/templates/web/ui-auth-payments/template/vitest.config.ts +17 -0
- package/dist/templates/web/ui-auth-payments-audio/template/package.json +14 -4
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/error.tsx +67 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +8 -2
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/loading.tsx +20 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +49 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +6 -2
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/theme-provider.tsx +94 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/footer.tsx +36 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +2 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/ui/theme-toggle.tsx +34 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/lib/env.ts +49 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/lib/utils.ts +133 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +79 -0
- package/dist/templates/web/ui-auth-payments-audio/template/vitest.config.ts +17 -0
- package/dist/templates/web/ui-auth-payments-video/template/package.json +14 -4
- package/dist/templates/web/ui-auth-payments-video/template/src/app/error.tsx +67 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +6 -2
- package/dist/templates/web/ui-auth-payments-video/template/src/app/loading.tsx +20 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +49 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +6 -2
- package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/theme-provider.tsx +94 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/footer.tsx +36 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +2 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/ui/theme-toggle.tsx +34 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/lib/env.ts +49 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/lib/utils.ts +133 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/test/setup.ts +79 -0
- package/dist/templates/web/ui-auth-payments-video/template/vitest.config.ts +17 -0
- package/dist/templates/web/ui-only/template/package.json +14 -4
- package/dist/templates/web/ui-only/template/src/app/error.tsx +67 -0
- package/dist/templates/web/ui-only/template/src/app/layout.tsx +6 -2
- package/dist/templates/web/ui-only/template/src/app/loading.tsx +20 -0
- package/dist/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +49 -0
- package/dist/templates/web/ui-only/template/src/components/providers/app-providers.tsx +6 -2
- package/dist/templates/web/ui-only/template/src/components/providers/theme-provider.tsx +94 -0
- package/dist/templates/web/ui-only/template/src/components/shared/footer.tsx +36 -0
- package/dist/templates/web/ui-only/template/src/components/shared/header.tsx +2 -0
- package/dist/templates/web/ui-only/template/src/components/ui/theme-toggle.tsx +34 -0
- package/dist/templates/web/ui-only/template/src/lib/env.ts +49 -0
- package/dist/templates/web/ui-only/template/src/lib/utils.ts +133 -0
- package/dist/templates/web/ui-only/template/src/test/setup.ts +79 -0
- package/dist/templates/web/ui-only/template/vitest.config.ts +17 -0
- package/package.json +1 -1
- package/src/templates/web/base/template/package.json +20 -10
- package/src/templates/web/base/template/src/app/error.tsx +97 -0
- package/src/templates/web/base/template/src/app/layout.tsx +8 -2
- package/src/templates/web/base/template/src/app/loading.tsx +34 -0
- package/src/templates/web/base/template/src/components/__tests__/example.test.tsx +49 -0
- package/src/templates/web/base/template/src/components/providers/app-providers.tsx +6 -2
- package/src/templates/web/base/template/src/components/providers/theme-provider.tsx +94 -0
- package/src/templates/web/base/template/src/components/shared/footer.tsx +36 -0
- package/src/templates/web/base/template/src/components/shared/header.tsx +2 -0
- package/src/templates/web/base/template/src/components/ui/theme-toggle.tsx +34 -0
- package/src/templates/web/base/template/src/lib/auth-server.ts +177 -0
- package/src/templates/web/base/template/src/lib/env.ts +46 -0
- package/src/templates/web/base/template/src/lib/utils.ts +133 -0
- package/src/templates/web/base/template/src/test/setup.ts +79 -0
- package/src/templates/web/base/template/vitest.config.ts +17 -0
- package/src/templates/web/ui-auth/template/package.json +14 -4
- package/src/templates/web/ui-auth/template/src/app/error.tsx +67 -0
- package/src/templates/web/ui-auth/template/src/app/layout.tsx +6 -2
- package/src/templates/web/ui-auth/template/src/app/loading.tsx +20 -0
- package/src/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +49 -0
- package/src/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +6 -2
- package/src/templates/web/ui-auth/template/src/components/providers/theme-provider.tsx +94 -0
- package/src/templates/web/ui-auth/template/src/components/shared/footer.tsx +36 -0
- package/src/templates/web/ui-auth/template/src/components/shared/header.tsx +2 -0
- package/src/templates/web/ui-auth/template/src/components/ui/theme-toggle.tsx +34 -0
- package/src/templates/web/ui-auth/template/src/lib/env.ts +49 -0
- package/src/templates/web/ui-auth/template/src/lib/utils.ts +133 -0
- package/src/templates/web/ui-auth/template/src/test/setup.ts +79 -0
- package/src/templates/web/ui-auth/template/vitest.config.ts +17 -0
- package/src/templates/web/ui-auth-payments/template/middleware.ts +68 -0
- package/src/templates/web/ui-auth-payments/template/package.json +14 -4
- package/src/templates/web/ui-auth-payments/template/src/app/dashboard/layout.tsx +22 -0
- package/src/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +183 -0
- package/src/templates/web/ui-auth-payments/template/src/app/error.tsx +67 -0
- package/src/templates/web/ui-auth-payments/template/src/app/layout.tsx +6 -2
- package/src/templates/web/ui-auth-payments/template/src/app/loading.tsx +20 -0
- package/src/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +38 -0
- package/src/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +50 -0
- package/src/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +49 -0
- package/src/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +52 -0
- package/src/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +144 -0
- package/src/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +68 -0
- package/src/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +185 -0
- package/src/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +6 -2
- package/src/templates/web/ui-auth-payments/template/src/components/providers/theme-provider.tsx +94 -0
- package/src/templates/web/ui-auth-payments/template/src/components/shared/footer.tsx +36 -0
- package/src/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +2 -0
- package/src/templates/web/ui-auth-payments/template/src/components/ui/theme-toggle.tsx +34 -0
- package/src/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +246 -0
- package/src/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +340 -0
- package/src/templates/web/ui-auth-payments/template/src/lib/auth-server.ts +177 -0
- package/src/templates/web/ui-auth-payments/template/src/lib/env.ts +49 -0
- package/src/templates/web/ui-auth-payments/template/src/lib/utils.ts +133 -0
- package/src/templates/web/ui-auth-payments/template/src/test/setup.ts +79 -0
- package/src/templates/web/ui-auth-payments/template/vitest.config.ts +17 -0
- package/src/templates/web/ui-auth-payments-audio/template/package.json +14 -4
- package/src/templates/web/ui-auth-payments-audio/template/src/app/error.tsx +67 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +8 -2
- package/src/templates/web/ui-auth-payments-audio/template/src/app/loading.tsx +20 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +49 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +6 -2
- package/src/templates/web/ui-auth-payments-audio/template/src/components/providers/theme-provider.tsx +94 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/footer.tsx +36 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +2 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/ui/theme-toggle.tsx +34 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/lib/env.ts +49 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/lib/utils.ts +133 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +79 -0
- package/src/templates/web/ui-auth-payments-audio/template/vitest.config.ts +17 -0
- package/src/templates/web/ui-auth-payments-video/template/package.json +14 -4
- package/src/templates/web/ui-auth-payments-video/template/src/app/error.tsx +67 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +6 -2
- package/src/templates/web/ui-auth-payments-video/template/src/app/loading.tsx +20 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +49 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +6 -2
- package/src/templates/web/ui-auth-payments-video/template/src/components/providers/theme-provider.tsx +94 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/shared/footer.tsx +36 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +2 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/ui/theme-toggle.tsx +34 -0
- package/src/templates/web/ui-auth-payments-video/template/src/lib/env.ts +49 -0
- package/src/templates/web/ui-auth-payments-video/template/src/lib/utils.ts +133 -0
- package/src/templates/web/ui-auth-payments-video/template/src/test/setup.ts +79 -0
- package/src/templates/web/ui-auth-payments-video/template/vitest.config.ts +17 -0
- package/src/templates/web/ui-only/template/package.json +14 -4
- package/src/templates/web/ui-only/template/src/app/error.tsx +67 -0
- package/src/templates/web/ui-only/template/src/app/layout.tsx +6 -2
- package/src/templates/web/ui-only/template/src/app/loading.tsx +20 -0
- package/src/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +49 -0
- package/src/templates/web/ui-only/template/src/components/providers/app-providers.tsx +6 -2
- package/src/templates/web/ui-only/template/src/components/providers/theme-provider.tsx +94 -0
- package/src/templates/web/ui-only/template/src/components/shared/footer.tsx +36 -0
- package/src/templates/web/ui-only/template/src/components/shared/header.tsx +2 -0
- package/src/templates/web/ui-only/template/src/components/ui/theme-toggle.tsx +34 -0
- package/src/templates/web/ui-only/template/src/lib/env.ts +49 -0
- package/src/templates/web/ui-only/template/src/lib/utils.ts +133 -0
- package/src/templates/web/ui-only/template/src/test/setup.ts +79 -0
- package/src/templates/web/ui-only/template/vitest.config.ts +17 -0
package/dist/index.js
CHANGED
|
@@ -318,8 +318,8 @@ async function getProjectPrompts(initialConfig) {
|
|
|
318
318
|
name: "auth",
|
|
319
319
|
message: "Select authentication provider:",
|
|
320
320
|
choices: [
|
|
321
|
-
{ name: "\
|
|
322
|
-
{ name: "\
|
|
321
|
+
{ name: "\u26A1 Supabase - Open source alternative", value: "supabase" },
|
|
322
|
+
{ name: "\u{1F525} Firebase - Google's platform", value: "firebase" }
|
|
323
323
|
],
|
|
324
324
|
default: initialConfig.auth
|
|
325
325
|
},
|
|
@@ -352,6 +352,31 @@ async function getProjectPrompts(initialConfig) {
|
|
|
352
352
|
],
|
|
353
353
|
default: initialConfig.theme
|
|
354
354
|
},
|
|
355
|
+
{
|
|
356
|
+
type: "list",
|
|
357
|
+
name: "themeColor",
|
|
358
|
+
message: "Select theme color:",
|
|
359
|
+
choices: [
|
|
360
|
+
{ name: "\u{1F535} Blue - Classic and trustworthy", value: "blue" },
|
|
361
|
+
{ name: "\u{1F7E2} Green - Fresh and natural", value: "green" },
|
|
362
|
+
{ name: "\u{1F7E3} Purple - Creative and modern", value: "purple" },
|
|
363
|
+
{ name: "\u{1F7E0} Orange - Energetic and friendly", value: "orange" },
|
|
364
|
+
{ name: "\u{1F534} Red - Bold and attention-grabbing", value: "red" },
|
|
365
|
+
{ name: "\u26AB Slate - Professional and minimal", value: "slate" }
|
|
366
|
+
],
|
|
367
|
+
default: initialConfig.themeColor
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
type: "list",
|
|
371
|
+
name: "defaultTheme",
|
|
372
|
+
message: "Select default theme mode:",
|
|
373
|
+
choices: [
|
|
374
|
+
{ name: "\u{1F319} System - Follow system preference", value: "system" },
|
|
375
|
+
{ name: "\u2600\uFE0F Light - Always light mode", value: "light" },
|
|
376
|
+
{ name: "\u{1F319} Dark - Always dark mode", value: "dark" }
|
|
377
|
+
],
|
|
378
|
+
default: initialConfig.defaultTheme
|
|
379
|
+
},
|
|
355
380
|
{
|
|
356
381
|
type: "confirm",
|
|
357
382
|
name: "install",
|
|
@@ -391,6 +416,12 @@ var TemplateGenerator = class {
|
|
|
391
416
|
const camelCaseName = this.toCamelCase(projectName);
|
|
392
417
|
const kebabCaseName = packageName;
|
|
393
418
|
const titleCaseName = this.toTitleCase(projectName);
|
|
419
|
+
const dependencies = this.getDependencies();
|
|
420
|
+
const generatedDate = (/* @__PURE__ */ new Date()).toLocaleDateString("en-US", {
|
|
421
|
+
year: "numeric",
|
|
422
|
+
month: "short",
|
|
423
|
+
day: "numeric"
|
|
424
|
+
});
|
|
394
425
|
return {
|
|
395
426
|
projectName,
|
|
396
427
|
platform: this.config.platform,
|
|
@@ -398,6 +429,8 @@ var TemplateGenerator = class {
|
|
|
398
429
|
auth: this.config.auth,
|
|
399
430
|
database: this.config.database,
|
|
400
431
|
theme: this.config.theme,
|
|
432
|
+
themeColor: this.config.themeColor,
|
|
433
|
+
defaultTheme: this.config.defaultTheme,
|
|
401
434
|
packageName,
|
|
402
435
|
className,
|
|
403
436
|
camelCaseName,
|
|
@@ -406,7 +439,12 @@ var TemplateGenerator = class {
|
|
|
406
439
|
description: `A modern SaaS application built with Digi Logic Labs`,
|
|
407
440
|
author: "Digi Logic Labs",
|
|
408
441
|
year: (/* @__PURE__ */ new Date()).getFullYear(),
|
|
409
|
-
|
|
442
|
+
generatedDate,
|
|
443
|
+
generatorVersion: "1.5.0",
|
|
444
|
+
uiVersion: dependencies["@digilogiclabs/saas-factory-ui"]?.replace("^", "") || "0.11.1",
|
|
445
|
+
authVersion: dependencies["@digilogiclabs/saas-factory-auth"]?.replace("^", "") || "1.0.0",
|
|
446
|
+
paymentsVersion: dependencies["@digilogiclabs/saas-factory-payments"]?.replace("^", "") || "1.0.0",
|
|
447
|
+
dependencies,
|
|
410
448
|
devDependencies: this.getDevDependencies(),
|
|
411
449
|
scripts: this.getScripts()
|
|
412
450
|
};
|
|
@@ -836,9 +874,11 @@ async function createProject(platform, template, name, options = {}) {
|
|
|
836
874
|
platform,
|
|
837
875
|
template: template || "base",
|
|
838
876
|
name: name || "my-saas-app",
|
|
839
|
-
auth: options.auth || "
|
|
877
|
+
auth: options.auth || "supabase",
|
|
840
878
|
database: options.database || "supabase",
|
|
841
879
|
theme: options.theme || "default",
|
|
880
|
+
themeColor: options.themeColor || "blue",
|
|
881
|
+
defaultTheme: options.defaultTheme || "system",
|
|
842
882
|
install: options.install !== false,
|
|
843
883
|
git: options.git !== false
|
|
844
884
|
};
|
|
@@ -859,6 +899,8 @@ async function createProject(platform, template, name, options = {}) {
|
|
|
859
899
|
logger.info(`Auth: ${config.auth}`);
|
|
860
900
|
logger.info(`Database: ${config.database}`);
|
|
861
901
|
logger.info(`Theme: ${config.theme}`);
|
|
902
|
+
logger.info(`Theme Color: ${config.themeColor}`);
|
|
903
|
+
logger.info(`Default Theme: ${config.defaultTheme}`);
|
|
862
904
|
logger.newLine();
|
|
863
905
|
const templateSpinner = spinner("Generating project structure...");
|
|
864
906
|
try {
|
|
@@ -1007,7 +1049,7 @@ async function updateDependencies(options = {}) {
|
|
|
1007
1049
|
// package.json
|
|
1008
1050
|
var package_default = {
|
|
1009
1051
|
name: "@digilogiclabs/create-saas-app",
|
|
1010
|
-
version: "1.
|
|
1052
|
+
version: "1.5.0",
|
|
1011
1053
|
description: "Create modern SaaS applications with Digi Logic Labs packages",
|
|
1012
1054
|
main: "dist/index.js",
|
|
1013
1055
|
bin: {
|
|
@@ -1114,7 +1156,7 @@ var package_default = {
|
|
|
1114
1156
|
// src/cli/index.ts
|
|
1115
1157
|
var program = new import_commander.Command();
|
|
1116
1158
|
program.name("create-saas-app").description("Create modern SaaS applications with Digi Logic Labs packages").version(package_default.version);
|
|
1117
|
-
program.command("create").alias("c").description("Create a new SaaS application").argument("<platform>", "Platform: web, mobile, or both").argument("[template]", "Template: base, dashboard, saas (web) | base, tabs, stack (mobile)").argument("[name]", "Project name").option("-a, --auth <provider>", "Auth provider: firebase, supabase").option("-d, --database <provider>", "Database provider: supabase, firebase").option("-t, --theme <theme>", "Theme: default, corporate, startup").option("--no-install", "Skip package installation").option("--no-git", "Skip git initialization").option("-y, --yes", "Skip interactive prompts").action(createProject);
|
|
1159
|
+
program.command("create").alias("c").description("Create a new SaaS application").argument("<platform>", "Platform: web, mobile, or both").argument("[template]", "Template: base, dashboard, saas (web) | base, tabs, stack (mobile)").argument("[name]", "Project name").option("-a, --auth <provider>", "Auth provider: firebase, supabase").option("-d, --database <provider>", "Database provider: supabase, firebase").option("-t, --theme <theme>", "Theme: default, corporate, startup").option("-c, --theme-color <color>", "Theme color: blue, green, purple, orange, red, slate").option("--default-theme <mode>", "Default theme mode: light, dark, system").option("--no-install", "Skip package installation").option("--no-git", "Skip git initialization").option("-y, --yes", "Skip interactive prompts").action(createProject);
|
|
1118
1160
|
program.command("add").alias("a").description("Add features to existing project").argument("<feature>", "Feature to add: auth, billing, analytics, etc.").option("-p, --provider <provider>", "Service provider").action(addFeature);
|
|
1119
1161
|
program.command("update").alias("u").description("Update Digi Logic Labs dependencies").option("--check", "Check for updates without installing").action(updateDependencies);
|
|
1120
1162
|
program.on("command:*", () => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/create.ts","../src/cli/utils/logger.ts","../src/cli/utils/spinner.ts","../src/cli/validators/project-name.ts","../src/cli/validators/dependencies.ts","../src/cli/prompts/project-setup.ts","../src/generators/template-generator.ts","../src/generators/package-installer.ts","../src/cli/utils/package-manager.ts","../src/cli/utils/git.ts","../src/cli/commands/add.ts","../src/cli/commands/update.ts","../package.json"],"sourcesContent":["import { Command } from 'commander';\nimport { createProject } from './commands/create';\nimport { addFeature } from './commands/add';\nimport { updateDependencies } from './commands/update';\nimport { logger } from './utils/logger';\nimport packageJson from '../../package.json';\n\nconst program = new Command();\n\nprogram\n .name('create-saas-app')\n .description('Create modern SaaS applications with Digi Logic Labs packages')\n .version(packageJson.version);\n\nprogram\n .command('create')\n .alias('c')\n .description('Create a new SaaS application')\n .argument('<platform>', 'Platform: web, mobile, or both')\n .argument('[template]', 'Template: base, dashboard, saas (web) | base, tabs, stack (mobile)')\n .argument('[name]', 'Project name')\n .option('-a, --auth <provider>', 'Auth provider: firebase, supabase')\n .option('-d, --database <provider>', 'Database provider: supabase, firebase')\n .option('-t, --theme <theme>', 'Theme: default, corporate, startup')\n .option('--no-install', 'Skip package installation')\n .option('--no-git', 'Skip git initialization')\n .option('-y, --yes', 'Skip interactive prompts')\n .action(createProject);\n\nprogram\n .command('add')\n .alias('a')\n .description('Add features to existing project')\n .argument('<feature>', 'Feature to add: auth, billing, analytics, etc.')\n .option('-p, --provider <provider>', 'Service provider')\n .action(addFeature);\n\nprogram\n .command('update')\n .alias('u')\n .description('Update Digi Logic Labs dependencies')\n .option('--check', 'Check for updates without installing')\n .action(updateDependencies);\n\n// Handle unknown commands\nprogram.on('command:*', () => {\n logger.error(`Unknown command: ${program.args.join(' ')}`);\n logger.info('Run \"create-saas-app --help\" for available commands');\n process.exit(1);\n});\n\n// Show help if no arguments provided\nif (!process.argv.slice(2).length) {\n program.outputHelp();\n process.exit(0);\n}\n\nprogram.parse();\n\nexport default program;\n","import path from 'path';\nimport { logger } from '../utils/logger';\nimport { spinner } from '../utils/spinner';\nimport { validateProjectName, validateProjectPath } from '../validators/project-name';\nimport { validateNodeVersion } from '../validators/dependencies';\nimport { getProjectPrompts } from '../prompts/project-setup';\nimport { TemplateGenerator } from '../../generators/template-generator';\nimport { PackageInstaller } from '../../generators/package-installer';\nimport { initializeGit } from '../utils/git';\n\ninterface CreateOptions {\n auth?: string;\n database?: string;\n theme?: string;\n install?: boolean;\n git?: boolean;\n yes?: boolean;\n}\n\nexport interface ProjectConfig {\n platform: 'web' | 'mobile' | 'both';\n template: string;\n name: string;\n auth: 'firebase' | 'supabase';\n database: 'supabase' | 'firebase';\n theme: 'default' | 'corporate' | 'startup';\n install: boolean;\n git: boolean;\n}\n\nexport async function createProject(\n platform: string,\n template?: string,\n name?: string,\n options: CreateOptions = {}\n) {\n try {\n // Validate Node.js version\n if (!(await validateNodeVersion())) {\n process.exit(1);\n }\n\n // Validate platform\n const validPlatforms = ['web', 'mobile', 'both'];\n if (!validPlatforms.includes(platform)) {\n logger.error(`Invalid platform: ${platform}. Must be one of: ${validPlatforms.join(', ')}`);\n process.exit(1);\n }\n\n // Set up initial configuration\n let config: ProjectConfig = {\n platform: platform as 'web' | 'mobile' | 'both',\n template: template || 'base',\n name: name || 'my-saas-app',\n auth: (options.auth as 'firebase' | 'supabase') || 'firebase',\n database: (options.database as 'supabase' | 'firebase') || 'supabase',\n theme: (options.theme as 'default' | 'corporate' | 'startup') || 'default',\n install: options.install !== false,\n git: options.git !== false,\n };\n\n // Interactive prompts if not in yes mode\n if (!options.yes) {\n config = await getProjectPrompts(config);\n }\n\n // Validate project name\n if (!validateProjectName(config.name)) {\n process.exit(1);\n }\n\n const projectPath = path.resolve(process.cwd(), config.name);\n\n // Validate project path\n if (!(await validateProjectPath(projectPath))) {\n process.exit(1);\n }\n\n // Display configuration\n logger.title('🚀 Creating your SaaS application');\n logger.info(`Platform: ${config.platform}`);\n logger.info(`Template: ${config.template}`);\n logger.info(`Project: ${config.name}`);\n logger.info(`Auth: ${config.auth}`);\n logger.info(`Database: ${config.database}`);\n logger.info(`Theme: ${config.theme}`);\n logger.newLine();\n\n // Generate project structure\n const templateSpinner = spinner('Generating project structure...');\n try {\n const generator = new TemplateGenerator(config);\n await generator.generate(projectPath);\n templateSpinner.succeed('Project structure created');\n } catch (_error) {\n templateSpinner.fail('Failed to generate project structure');\n throw _error;\n }\n\n // Install dependencies\n if (config.install) {\n const installSpinner = spinner('Installing dependencies...');\n try {\n const installer = new PackageInstaller(projectPath);\n await installer.install();\n installSpinner.succeed('Dependencies installed');\n } catch (_error) {\n installSpinner.fail('Failed to install dependencies');\n logger.warn('You can install dependencies manually by running:');\n logger.code(`cd ${config.name} && npm install`);\n }\n }\n\n // Initialize git repository\n if (config.git) {\n const gitSpinner = spinner('Initializing git repository...');\n try {\n await initializeGit(projectPath);\n gitSpinner.succeed('Git repository initialized');\n } catch (_error) {\n gitSpinner.fail('Failed to initialize git repository');\n logger.warn('You can initialize git manually by running:');\n logger.code(`cd ${config.name} && git init`);\n }\n }\n\n // Success message with next steps\n logger.newLine();\n logger.success('🎉 Project created successfully!');\n logger.newLine();\n\n logger.title('Next steps:');\n logger.code(`cd ${config.name}`);\n\n if (!config.install) {\n logger.code('npm install');\n }\n\n if (config.platform === 'web' || config.platform === 'both') {\n logger.code('npm run dev');\n logger.info('Open http://localhost:3000 in your browser');\n }\n\n if (config.platform === 'mobile' || config.platform === 'both') {\n logger.code('npx expo start');\n logger.info('Scan QR code with Expo Go app');\n }\n\n logger.newLine();\n logger.info('📚 Documentation: https://docs.digilogiclabs.com');\n logger.info('💬 Support: https://discord.gg/digilogiclabs');\n } catch (error) {\n logger.error('Failed to create project:');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\n\nexport const logger = {\n info: (message: string, ...args: any[]) => {\n console.log(chalk.blue('ℹ'), message, ...args);\n },\n\n success: (message: string, ...args: any[]) => {\n console.log(chalk.green('✓'), message, ...args);\n },\n\n warn: (message: string, ...args: any[]) => {\n console.log(chalk.yellow('⚠'), message, ...args);\n },\n\n error: (message: string, ...args: any[]) => {\n console.log(chalk.red('✗'), message, ...args);\n },\n\n debug: (message: string, ...args: any[]) => {\n if (process.env.DEBUG) {\n console.log(chalk.gray('🐛'), message, ...args);\n }\n },\n\n log: (message: string, ...args: any[]) => {\n console.log(message, ...args);\n },\n\n newLine: () => {\n console.log();\n },\n\n divider: () => {\n console.log(chalk.gray('─'.repeat(50)));\n },\n\n title: (message: string) => {\n console.log();\n console.log(chalk.bold.cyan(message));\n console.log(chalk.gray('─'.repeat(message.length)));\n },\n\n step: (step: number, total: number, message: string) => {\n console.log(chalk.cyan(`[${step}/${total}]`), message);\n },\n\n highlight: (message: string) => {\n console.log(chalk.bold.magenta(message));\n },\n\n code: (code: string) => {\n console.log(chalk.gray(' ' + code));\n },\n\n list: (items: string[]) => {\n items.forEach((item) => {\n console.log(chalk.gray(' •'), item);\n });\n },\n};\n","import ora, { Ora } from 'ora';\nimport chalk from 'chalk';\n\nexport function spinner(text: string): Ora {\n return ora({\n text: chalk.gray(text),\n spinner: 'dots',\n color: 'cyan',\n }).start();\n}\n\nexport function createSpinner(text: string): Ora {\n return ora({\n text: chalk.gray(text),\n spinner: 'dots',\n color: 'cyan',\n });\n}\n\nexport function successSpinner(text: string): Ora {\n return ora({\n text: chalk.green(text),\n spinner: 'dots',\n color: 'green',\n });\n}\n\nexport function errorSpinner(text: string): Ora {\n return ora({\n text: chalk.red(text),\n spinner: 'dots',\n color: 'red',\n });\n}\n\nexport function warnSpinner(text: string): Ora {\n return ora({\n text: chalk.yellow(text),\n spinner: 'dots',\n color: 'yellow',\n });\n}\n","import validateNpmPackageName from 'validate-npm-package-name';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { logger } from '../utils/logger';\n\nexport function validateProjectName(name: string): boolean {\n // Check if name is empty\n if (!name || name.trim().length === 0) {\n logger.error('Project name cannot be empty');\n return false;\n }\n\n // Check npm package name validity\n const validation = validateNpmPackageName(name);\n\n if (!validation.validForNewPackages) {\n logger.error('Invalid project name:');\n\n if (validation.errors) {\n validation.errors.forEach((error) => logger.error(` • ${error}`));\n }\n\n if (validation.warnings) {\n validation.warnings.forEach((warning) => logger.warn(` • ${warning}`));\n }\n\n return false;\n }\n\n // Check for reserved names\n const reservedNames = [\n 'node_modules',\n 'package.json',\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n '.git',\n '.gitignore',\n 'README.md',\n 'LICENSE',\n 'src',\n 'dist',\n 'build',\n 'public',\n 'static',\n 'assets',\n 'components',\n 'pages',\n 'app',\n 'lib',\n 'utils',\n 'hooks',\n 'types',\n 'styles',\n 'config',\n 'test',\n 'tests',\n '__tests__',\n 'spec',\n 'specs',\n 'docs',\n 'documentation',\n ];\n\n if (reservedNames.includes(name.toLowerCase())) {\n logger.error(`Project name \"${name}\" is reserved. Please choose a different name.`);\n return false;\n }\n\n // Check for common problematic patterns\n if (name.startsWith('.')) {\n logger.error('Project name cannot start with a dot');\n return false;\n }\n\n if (name.startsWith('-')) {\n logger.error('Project name cannot start with a hyphen');\n return false;\n }\n\n if (name.endsWith('-')) {\n logger.error('Project name cannot end with a hyphen');\n return false;\n }\n\n if (name.includes('..')) {\n logger.error('Project name cannot contain consecutive dots');\n return false;\n }\n\n if (name.includes('//')) {\n logger.error('Project name cannot contain consecutive slashes');\n return false;\n }\n\n // Check length\n if (name.length > 214) {\n logger.error('Project name is too long (max 214 characters)');\n return false;\n }\n\n return true;\n}\n\nexport async function validateProjectPath(projectPath: string): Promise<boolean> {\n try {\n // Check if directory already exists\n if (await fs.pathExists(projectPath)) {\n const stats = await fs.stat(projectPath);\n\n if (stats.isDirectory()) {\n const files = await fs.readdir(projectPath);\n\n if (files.length > 0) {\n logger.error(`Directory \"${path.basename(projectPath)}\" already exists and is not empty`);\n return false;\n }\n } else {\n logger.error(`A file with the name \"${path.basename(projectPath)}\" already exists`);\n return false;\n }\n }\n\n // Check if parent directory is writable\n const parentDir = path.dirname(projectPath);\n\n try {\n await fs.access(parentDir, fs.constants.W_OK);\n } catch {\n logger.error(`Cannot write to directory \"${parentDir}\"`);\n return false;\n }\n\n return true;\n } catch (error) {\n logger.error('Failed to validate project path:', error);\n return false;\n }\n}\n\nexport function sanitizeProjectName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/^-+|-+$/g, '')\n .replace(/-+/g, '-');\n}\n\nexport function suggestProjectName(name: string): string {\n const sanitized = sanitizeProjectName(name);\n\n if (validateProjectName(sanitized)) {\n return sanitized;\n }\n\n // If still invalid, add a prefix\n const suggested = `my-${sanitized}`;\n\n if (validateProjectName(suggested)) {\n return suggested;\n }\n\n // Last resort\n return 'my-saas-app';\n}\n","import semver from 'semver';\nimport execa from 'execa';\nimport { logger } from '../utils/logger';\n\nexport interface DependencyInfo {\n name: string;\n version: string;\n latest?: string;\n outdated?: boolean;\n}\n\nexport async function validateNodeVersion(): Promise<boolean> {\n const nodeVersion = process.version;\n const minVersion = '16.0.0';\n\n if (!semver.gte(nodeVersion, minVersion)) {\n logger.error(\n `Node.js version ${minVersion} or higher is required. Current version: ${nodeVersion}`\n );\n return false;\n }\n\n return true;\n}\n\nexport async function checkPackageExists(packageName: string): Promise<boolean> {\n try {\n await execa('npm', ['view', packageName, 'version']);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function getLatestVersion(packageName: string): Promise<string | null> {\n try {\n const result = await execa('npm', ['view', packageName, 'version']);\n return result.stdout.trim();\n } catch {\n return null;\n }\n}\n\nexport async function validateDependencies(dependencies: string[]): Promise<DependencyInfo[]> {\n const results: DependencyInfo[] = [];\n\n for (const dep of dependencies) {\n const [name, version] =\n dep.includes('@') && !dep.startsWith('@') ? dep.split('@') : [dep, 'latest'];\n\n try {\n const latest = await getLatestVersion(name);\n\n if (!latest) {\n logger.warn(`Package \"${name}\" not found in npm registry`);\n continue;\n }\n\n const resolvedVersion = version === 'latest' ? latest : version;\n const outdated = version !== 'latest' && semver.lt(resolvedVersion, latest);\n\n results.push({\n name,\n version: resolvedVersion,\n latest,\n outdated,\n });\n } catch (error) {\n logger.warn(`Failed to validate package \"${name}\":`, error);\n }\n }\n\n return results;\n}\n\nexport function validateVersionRange(version: string): boolean {\n try {\n return semver.validRange(version) !== null;\n } catch {\n return false;\n }\n}\n\nexport function isValidSemver(version: string): boolean {\n return semver.valid(version) !== null;\n}\n\nexport function compareVersions(version1: string, version2: string): number {\n try {\n return semver.compare(version1, version2);\n } catch {\n return 0;\n }\n}\n\nexport function getVersionSuggestion(currentVersion: string, latestVersion: string): string {\n if (!isValidSemver(currentVersion) || !isValidSemver(latestVersion)) {\n return latestVersion;\n }\n\n const current = semver.parse(currentVersion);\n const latest = semver.parse(latestVersion);\n\n if (!current || !latest) {\n return latestVersion;\n }\n\n // If major version is different, suggest latest\n if (current.major !== latest.major) {\n return `^${latestVersion}`;\n }\n\n // If minor version is different, suggest latest minor\n if (current.minor !== latest.minor) {\n return `~${latestVersion}`;\n }\n\n // If only patch is different, suggest exact latest\n return latestVersion;\n}\n","import inquirer from 'inquirer';\nimport { ProjectConfig } from '../commands/create';\nimport { validateProjectName, suggestProjectName } from '../validators/project-name';\nimport { logger } from '../utils/logger';\n\nexport async function getProjectPrompts(initialConfig: ProjectConfig): Promise<ProjectConfig> {\n logger.title('🛠️ Project Configuration');\n\n const questions = [\n {\n type: 'input',\n name: 'name',\n message: 'Project name:',\n default: initialConfig.name,\n validate: (input: string) => {\n if (!validateProjectName(input)) {\n const suggestion = suggestProjectName(input);\n return `Invalid project name. Try: ${suggestion}`;\n }\n return true;\n },\n filter: (input: string) => input.trim(),\n },\n {\n type: 'list',\n name: 'platform',\n message: 'Select platform:',\n choices: [\n { name: '🌐 Web (Next.js)', value: 'web' },\n { name: '📱 Mobile (Expo)', value: 'mobile' },\n { name: '🚀 Both (Full-stack)', value: 'both' },\n ],\n default: initialConfig.platform,\n },\n {\n type: 'list',\n name: 'template',\n message: 'Select template:',\n choices: (answers: any) => {\n if (answers.platform === 'web') {\n return [\n { name: '📄 Base - Clean starter template', value: 'base' },\n {\n name: '📦 UI Only - With @digilogiclabs/saas-factory-ui (no auth)',\n value: 'ui-only',\n },\n {\n name: '🔐 UI + Auth - With UI components and authentication',\n value: 'ui-auth',\n },\n {\n name: '💳 UI + Auth + Payments - Full SaaS with payments integration',\n value: 'ui-auth-payments',\n },\n {\n name: '🎵 Audio Player App - Full SaaS with audio streaming features',\n value: 'ui-auth-payments-audio',\n },\n {\n name: '🎬 Video Player App - Full SaaS with video streaming features',\n value: 'ui-auth-payments-video',\n },\n { name: '📊 Dashboard - Admin dashboard with analytics', value: 'dashboard' },\n { name: '💼 SaaS - Multi-tenant SaaS application', value: 'saas' },\n ];\n } else if (answers.platform === 'mobile') {\n return [\n { name: '📱 Base - Simple mobile app', value: 'base' },\n { name: '📑 Tabs - Tab navigation', value: 'tabs' },\n { name: '📚 Stack - Stack navigation', value: 'stack' },\n ];\n } else {\n return [{ name: '🚀 Base - Web + Mobile starter', value: 'base' }];\n }\n },\n default: initialConfig.template,\n },\n {\n type: 'list',\n name: 'auth',\n message: 'Select authentication provider:',\n choices: [\n { name: \"🔥 Firebase - Google's platform\", value: 'firebase' },\n { name: '⚡ Supabase - Open source alternative', value: 'supabase' },\n ],\n default: initialConfig.auth,\n },\n {\n type: 'list',\n name: 'database',\n message: 'Select database provider:',\n choices: (answers: any) => {\n // Smart defaults based on auth choice\n const choices = [\n { name: '⚡ Supabase - PostgreSQL with real-time', value: 'supabase' },\n { name: '🔥 Firebase - NoSQL with real-time', value: 'firebase' },\n ];\n\n // Suggest matching auth provider\n if (answers.auth === 'firebase') {\n return choices.reverse();\n }\n\n return choices;\n },\n default: (answers: any) => {\n // Auto-match auth provider if possible\n return answers.auth === 'firebase' ? 'firebase' : 'supabase';\n },\n },\n {\n type: 'list',\n name: 'theme',\n message: 'Select theme:',\n choices: [\n { name: '🎨 Default - Clean and modern', value: 'default' },\n { name: '🏢 Corporate - Professional business theme', value: 'corporate' },\n { name: '🚀 Startup - Bold and innovative', value: 'startup' },\n ],\n default: initialConfig.theme,\n },\n {\n type: 'confirm',\n name: 'install',\n message: 'Install dependencies?',\n default: initialConfig.install,\n },\n {\n type: 'confirm',\n name: 'git',\n message: 'Initialize git repository?',\n default: initialConfig.git,\n },\n ];\n\n const answers = await inquirer.prompt(questions);\n\n return {\n ...initialConfig,\n ...answers,\n };\n}\n\nexport async function getAuthSetupPrompts(authProvider: string) {\n logger.title(`🔐 ${authProvider} Configuration`);\n\n if (authProvider === 'firebase') {\n const questions = [\n {\n type: 'input',\n name: 'projectId',\n message: 'Firebase Project ID:',\n validate: (input: string) => input.length > 0 || 'Project ID is required',\n },\n {\n type: 'input',\n name: 'apiKey',\n message: 'Firebase API Key:',\n validate: (input: string) => input.length > 0 || 'API Key is required',\n },\n {\n type: 'input',\n name: 'authDomain',\n message: 'Firebase Auth Domain:',\n validate: (input: string) => input.length > 0 || 'Auth Domain is required',\n },\n ];\n\n return await inquirer.prompt(questions);\n } else if (authProvider === 'supabase') {\n const questions = [\n {\n type: 'input',\n name: 'url',\n message: 'Supabase URL:',\n validate: (input: string) => {\n if (!input.length) return 'URL is required';\n if (!input.startsWith('https://')) return 'URL must start with https://';\n return true;\n },\n },\n {\n type: 'input',\n name: 'anonKey',\n message: 'Supabase Anon Key:',\n validate: (input: string) => input.length > 0 || 'Anon Key is required',\n },\n ];\n\n return await inquirer.prompt(questions);\n }\n\n return {};\n}\n\nexport async function getThemeCustomizationPrompts(theme: string) {\n logger.title(`🎨 ${theme} Theme Customization`);\n\n const questions = [\n {\n type: 'input',\n name: 'primaryColor',\n message: 'Primary color (hex):',\n default: theme === 'corporate' ? '#1e40af' : theme === 'startup' ? '#7c3aed' : '#3b82f6',\n validate: (input: string) => {\n if (!/^#[0-9A-F]{6}$/i.test(input)) {\n return 'Please enter a valid hex color (e.g., #3b82f6)';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'fontFamily',\n message: 'Font family:',\n default: theme === 'corporate' ? 'Inter' : theme === 'startup' ? 'Poppins' : 'System UI',\n },\n {\n type: 'confirm',\n name: 'darkMode',\n message: 'Enable dark mode support?',\n default: true,\n },\n ];\n\n return await inquirer.prompt(questions);\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport mustache from 'mustache';\nimport { glob } from 'glob';\nimport { ProjectConfig } from '../cli/commands/create';\nimport { logger } from '../cli/utils/logger';\n\nexport interface TemplateContext {\n projectName: string;\n platform: string;\n template: string;\n auth: string;\n database: string;\n theme: string;\n packageName: string;\n className: string;\n camelCaseName: string;\n kebabCaseName: string;\n titleCaseName: string;\n description: string;\n author: string;\n year: number;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n scripts: Record<string, string>;\n}\n\nexport class TemplateGenerator {\n private config: ProjectConfig;\n private context: TemplateContext;\n private templatesDir: string;\n\n constructor(config: ProjectConfig) {\n this.config = config;\n // Check if we're in development (src) or production (dist)\n const isDev = __dirname.includes('/src/');\n this.templatesDir = isDev\n ? path.join(__dirname, '..', 'templates')\n : path.join(__dirname, 'templates');\n this.context = this.createTemplateContext();\n }\n\n private createTemplateContext(): TemplateContext {\n const projectName = this.config.name;\n const packageName = projectName.toLowerCase().replace(/[^a-z0-9-]/g, '-');\n const className = this.toPascalCase(projectName);\n const camelCaseName = this.toCamelCase(projectName);\n const kebabCaseName = packageName;\n const titleCaseName = this.toTitleCase(projectName);\n\n return {\n projectName,\n platform: this.config.platform,\n template: this.config.template,\n auth: this.config.auth,\n database: this.config.database,\n theme: this.config.theme,\n packageName,\n className,\n camelCaseName,\n kebabCaseName,\n titleCaseName,\n description: `A modern SaaS application built with Digi Logic Labs`,\n author: 'Digi Logic Labs',\n year: new Date().getFullYear(),\n dependencies: this.getDependencies(),\n devDependencies: this.getDevDependencies(),\n scripts: this.getScripts(),\n };\n }\n\n private getDependencies(): Record<string, string> {\n const baseDeps: Record<string, string> = {};\n\n // Add UI package for ui-only, ui-auth, ui-auth-payments, and media player templates\n if (\n [\n 'ui-only',\n 'ui-auth',\n 'ui-auth-payments',\n 'ui-auth-payments-audio',\n 'ui-auth-payments-video',\n ].includes(this.config.template)\n ) {\n baseDeps['@digilogiclabs/saas-factory-ui'] = '^0.11.1';\n }\n\n // Add auth package for auth-enabled templates\n if (\n ['ui-auth', 'ui-auth-payments', 'ui-auth-payments-audio', 'ui-auth-payments-video'].includes(\n this.config.template\n )\n ) {\n baseDeps['@digilogiclabs/saas-factory-auth'] = '^1.0.0';\n }\n\n // Add payments package for payment-enabled templates\n if (\n ['ui-auth-payments', 'ui-auth-payments-audio', 'ui-auth-payments-video'].includes(\n this.config.template\n )\n ) {\n baseDeps['@digilogiclabs/saas-factory-payments'] = '^1.0.0';\n }\n\n if (this.config.platform === 'web' || this.config.platform === 'both') {\n Object.assign(baseDeps, {\n next: '^15.0.0',\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n tailwindcss: '^3.3.0',\n typescript: '^5.0.0',\n clsx: '^2.0.0',\n 'class-variance-authority': '^0.7.0',\n 'tailwind-merge': '^2.0.0',\n 'next-themes': '^0.2.1',\n 'lucide-react': '^0.292.0',\n autoprefixer: '^10.4.16',\n postcss: '^8.4.31',\n });\n }\n\n if (this.config.platform === 'mobile' || this.config.platform === 'both') {\n Object.assign(baseDeps, {\n expo: '~49.0.0',\n 'react-native': '0.72.0',\n '@expo/vector-icons': '^13.0.0',\n });\n }\n\n if (this.config.auth === 'firebase') {\n baseDeps['firebase'] = '^10.0.0';\n } else if (this.config.auth === 'supabase') {\n baseDeps['@supabase/supabase-js'] = '^2.0.0';\n }\n\n return baseDeps;\n }\n\n private getDevDependencies(): Record<string, string> {\n const baseDeps = {\n '@types/node': '^20.0.0',\n eslint: '^8.0.0',\n prettier: '^3.0.0',\n };\n\n if (this.config.platform === 'web' || this.config.platform === 'both') {\n Object.assign(baseDeps, {\n '@types/react': '^18.0.0',\n '@types/react-dom': '^18.0.0',\n autoprefixer: '^10.0.0',\n postcss: '^8.0.0',\n });\n }\n\n return baseDeps;\n }\n\n private getScripts(): Record<string, string> {\n const scripts: Record<string, string> = {};\n\n if (this.config.platform === 'web' || this.config.platform === 'both') {\n Object.assign(scripts, {\n dev: 'next dev',\n build: 'next build',\n start: 'next start',\n lint: 'next lint',\n });\n }\n\n if (this.config.platform === 'mobile' || this.config.platform === 'both') {\n Object.assign(scripts, {\n start: 'expo start',\n android: 'expo start --android',\n ios: 'expo start --ios',\n web: 'expo start --web',\n });\n }\n\n return scripts;\n }\n\n public async generate(outputPath: string): Promise<void> {\n try {\n // Ensure output directory exists\n await fs.ensureDir(outputPath);\n\n // Generate based on platform\n if (this.config.platform === 'web') {\n await this.generateWebProject(outputPath);\n } else if (this.config.platform === 'mobile') {\n await this.generateMobileProject(outputPath);\n } else if (this.config.platform === 'both') {\n await this.generateWebProject(outputPath);\n await this.generateMobileProject(path.join(outputPath, 'mobile'));\n }\n\n // Copy shared resources\n await this.copySharedResources(outputPath);\n\n logger.debug('Template generation completed');\n } catch (error) {\n logger.error('Template generation failed:', error);\n throw error;\n }\n }\n\n private async generateWebProject(outputPath: string): Promise<void> {\n const templatePath = path.join(this.templatesDir, 'web', this.config.template);\n await this.copyTemplate(templatePath, outputPath);\n }\n\n private async generateMobileProject(outputPath: string): Promise<void> {\n const templatePath = path.join(this.templatesDir, 'mobile', this.config.template);\n await this.copyTemplate(templatePath, outputPath);\n }\n\n private async copyTemplate(templatePath: string, outputPath: string): Promise<void> {\n const templateDir = path.join(templatePath, 'template');\n\n if (!(await fs.pathExists(templateDir))) {\n throw new Error(`Template not found: ${templateDir}`);\n }\n await this.copyAndProcessFiles(templateDir, outputPath);\n }\n\n private async copyAndProcessFiles(sourceDir: string, targetDir: string): Promise<void> {\n if (!(await fs.pathExists(sourceDir))) {\n logger.debug(`Template source directory not found: ${sourceDir}`);\n return;\n }\n\n const files = await glob('**/*', {\n cwd: sourceDir,\n dot: true,\n nodir: true,\n });\n\n for (const file of files) {\n const sourcePath = path.join(sourceDir, file);\n const targetPath = path.join(targetDir, file);\n\n await fs.ensureDir(path.dirname(targetPath));\n\n const content = await fs.readFile(sourcePath, 'utf-8');\n\n if (this.isTextFile(file)) {\n const processedContent = mustache.render(content, this.context);\n await fs.writeFile(targetPath, processedContent);\n } else {\n await fs.copy(sourcePath, targetPath);\n }\n }\n }\n\n private async copySharedResources(outputPath: string): Promise<void> {\n // Skip copying shared resources for UI-only templates\n if (this.config.template === 'ui-only') {\n logger.debug('Skipping shared resources for UI-only template');\n return;\n }\n\n const sharedPath = path.join(this.templatesDir, 'shared');\n\n // Copy auth configuration\n const authPath = path.join(sharedPath, 'auth', this.config.auth);\n await this.copyAndProcessFiles(authPath, outputPath);\n\n // Copy theme configuration\n const themePath = path.join(sharedPath, 'themes', this.config.theme);\n await this.copyAndProcessFiles(themePath, outputPath);\n\n // Copy database configuration\n const dbPath = path.join(sharedPath, 'database', this.config.database);\n await this.copyAndProcessFiles(dbPath, outputPath);\n }\n\n private isTextFile(filename: string): boolean {\n const textExtensions = [\n '.js',\n '.jsx',\n '.ts',\n '.tsx',\n '.json',\n '.md',\n '.txt',\n '.yml',\n '.yaml',\n '.xml',\n '.html',\n '.css',\n '.scss',\n '.sass',\n '.less',\n '.env',\n '.gitignore',\n '.eslintrc',\n '.prettierrc',\n '.editorconfig',\n '.nvmrc',\n ];\n\n const ext = path.extname(filename).toLowerCase();\n return textExtensions.includes(ext) || !ext;\n }\n\n private toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n }\n\n private toCamelCase(str: string): string {\n const pascal = this.toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n }\n\n private toTitleCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport execa from 'execa';\nimport {\n detectPackageManager,\n getInstallCommand,\n isPackageManagerAvailable,\n} from '../cli/utils/package-manager';\nimport { logger } from '../cli/utils/logger';\n\nexport class PackageInstaller {\n private projectPath: string;\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n }\n\n public async install(): Promise<void> {\n try {\n // Check if package.json exists\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n if (!(await fs.pathExists(packageJsonPath))) {\n throw new Error('package.json not found in project directory');\n }\n\n // Detect package manager\n const packageManager = await detectPackageManager(this.projectPath);\n\n // Verify package manager is available\n if (!(await isPackageManagerAvailable(packageManager))) {\n throw new Error(`Package manager \"${packageManager}\" is not available`);\n }\n\n logger.debug(`Installing dependencies with ${packageManager}...`);\n\n // Get install command\n const command = await getInstallCommand(packageManager);\n\n // Run installation\n await execa(command[0], command.slice(1), {\n cwd: this.projectPath,\n stdio: 'pipe',\n });\n\n logger.debug('Dependencies installed successfully');\n } catch (error) {\n logger.error('Package installation failed:', error);\n throw error;\n }\n }\n\n public async installDependencies(dependencies: string[], dev = false): Promise<void> {\n try {\n if (dependencies.length === 0) {\n return;\n }\n\n const packageManager = await detectPackageManager(this.projectPath);\n\n if (!(await isPackageManagerAvailable(packageManager))) {\n throw new Error(`Package manager \"${packageManager}\" is not available`);\n }\n\n logger.debug(`Installing ${dev ? 'dev ' : ''}dependencies: ${dependencies.join(', ')}`);\n\n // Get add command\n const command =\n packageManager === 'yarn'\n ? ['yarn', 'add', ...(dev ? ['-D'] : []), ...dependencies]\n : packageManager === 'pnpm'\n ? ['pnpm', 'add', ...(dev ? ['-D'] : []), ...dependencies]\n : ['npm', 'install', ...(dev ? ['--save-dev'] : []), ...dependencies];\n\n // Run installation\n await execa(command[0], command.slice(1), {\n cwd: this.projectPath,\n stdio: 'pipe',\n });\n\n logger.debug(`${dev ? 'Dev d' : 'D'}ependencies installed successfully`);\n } catch (error) {\n logger.error(`Failed to install ${dev ? 'dev ' : ''}dependencies:`, error);\n throw error;\n }\n }\n\n public async updatePackageJson(\n updates: Partial<{\n name: string;\n version: string;\n description: string;\n author: string;\n license: string;\n scripts: Record<string, string>;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n keywords: string[];\n repository: any;\n bugs: any;\n homepage: string;\n }>\n ): Promise<void> {\n try {\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n\n if (!(await fs.pathExists(packageJsonPath))) {\n throw new Error('package.json not found');\n }\n\n const packageJson = await fs.readJson(packageJsonPath);\n const updatedPackageJson = { ...packageJson, ...updates };\n\n await fs.writeJson(packageJsonPath, updatedPackageJson, { spaces: 2 });\n\n logger.debug('package.json updated successfully');\n } catch (error) {\n logger.error('Failed to update package.json:', error);\n throw error;\n }\n }\n\n public async addScript(name: string, command: string): Promise<void> {\n try {\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n const packageJson = await fs.readJson(packageJsonPath);\n\n if (!packageJson.scripts) {\n packageJson.scripts = {};\n }\n\n packageJson.scripts[name] = command;\n\n await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });\n\n logger.debug(`Script \"${name}\" added to package.json`);\n } catch (error) {\n logger.error(`Failed to add script \"${name}\":`, error);\n throw error;\n }\n }\n\n public async removeScript(name: string): Promise<void> {\n try {\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n const packageJson = await fs.readJson(packageJsonPath);\n\n if (packageJson.scripts && packageJson.scripts[name]) {\n delete packageJson.scripts[name];\n await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });\n logger.debug(`Script \"${name}\" removed from package.json`);\n }\n } catch (error) {\n logger.error(`Failed to remove script \"${name}\":`, error);\n throw error;\n }\n }\n\n public async getDependencies(): Promise<{\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n }> {\n try {\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n const packageJson = await fs.readJson(packageJsonPath);\n\n return {\n dependencies: packageJson.dependencies || {},\n devDependencies: packageJson.devDependencies || {},\n };\n } catch (error) {\n logger.error('Failed to read dependencies:', error);\n return { dependencies: {}, devDependencies: {} };\n }\n }\n\n public async hasLockFile(): Promise<boolean> {\n const lockFiles = ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml'];\n\n for (const lockFile of lockFiles) {\n if (await fs.pathExists(path.join(this.projectPath, lockFile))) {\n return true;\n }\n }\n\n return false;\n }\n\n public async cleanInstall(): Promise<void> {\n try {\n // Remove node_modules and lock files\n const nodeModulesPath = path.join(this.projectPath, 'node_modules');\n const lockFiles = ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml'];\n\n if (await fs.pathExists(nodeModulesPath)) {\n await fs.remove(nodeModulesPath);\n }\n\n for (const lockFile of lockFiles) {\n const lockPath = path.join(this.projectPath, lockFile);\n if (await fs.pathExists(lockPath)) {\n await fs.remove(lockPath);\n }\n }\n\n // Fresh install\n await this.install();\n\n logger.debug('Clean install completed');\n } catch (error) {\n logger.error('Clean install failed:', error);\n throw error;\n }\n }\n}\n","import execa from 'execa';\nimport fs from 'fs-extra';\nimport path from 'path';\n\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm';\n\nexport async function detectPackageManager(projectPath?: string): Promise<PackageManager> {\n const cwd = projectPath || process.cwd();\n\n // Check for lock files\n const lockFiles = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' as PackageManager },\n { file: 'yarn.lock', manager: 'yarn' as PackageManager },\n { file: 'package-lock.json', manager: 'npm' as PackageManager },\n ];\n\n for (const { file, manager } of lockFiles) {\n if (await fs.pathExists(path.join(cwd, file))) {\n return manager;\n }\n }\n\n // Check for package manager availability\n const managers: PackageManager[] = ['pnpm', 'yarn', 'npm'];\n\n for (const manager of managers) {\n try {\n await execa(manager, ['--version']);\n return manager;\n } catch {\n // Continue to next manager\n }\n }\n\n // Default to npm\n return 'npm';\n}\n\nexport async function getInstallCommand(packageManager: PackageManager): Promise<string[]> {\n switch (packageManager) {\n case 'yarn':\n return ['yarn', 'install'];\n case 'pnpm':\n return ['pnpm', 'install'];\n default:\n return ['npm', 'install'];\n }\n}\n\nexport async function getAddCommand(\n packageManager: PackageManager,\n packages: string[],\n dev = false\n): Promise<string[]> {\n const devFlag = dev ? (packageManager === 'npm' ? '--save-dev' : '-D') : '';\n\n switch (packageManager) {\n case 'yarn':\n return ['yarn', 'add', ...(dev ? ['-D'] : []), ...packages];\n case 'pnpm':\n return ['pnpm', 'add', ...(dev ? ['-D'] : []), ...packages];\n default:\n return ['npm', 'install', ...(devFlag ? [devFlag] : []), ...packages];\n }\n}\n\nexport async function getRunCommand(\n packageManager: PackageManager,\n script: string\n): Promise<string[]> {\n switch (packageManager) {\n case 'yarn':\n return ['yarn', script];\n case 'pnpm':\n return ['pnpm', script];\n default:\n return ['npm', 'run', script];\n }\n}\n\nexport async function isPackageManagerAvailable(packageManager: PackageManager): Promise<boolean> {\n try {\n await execa(packageManager, ['--version']);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getPackageManagerDisplayName(packageManager: PackageManager): string {\n switch (packageManager) {\n case 'yarn':\n return 'Yarn';\n case 'pnpm':\n return 'pnpm';\n default:\n return 'npm';\n }\n}\n","import execa from 'execa';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { logger } from './logger';\n\nexport async function initializeGit(projectPath: string): Promise<void> {\n try {\n // Check if git is available\n await execa('git', ['--version']);\n\n // Initialize git repository\n await execa('git', ['init'], { cwd: projectPath });\n\n // Add all files\n await execa('git', ['add', '.'], { cwd: projectPath });\n\n // Create initial commit\n await execa('git', ['commit', '-m', 'Initial commit from @digilogiclabs/create-saas-app'], {\n cwd: projectPath,\n });\n\n logger.debug('Git repository initialized successfully');\n } catch (error) {\n logger.warn('Git initialization failed. You can initialize it manually later.');\n logger.debug('Git error:', error);\n }\n}\n\nexport async function isGitRepository(projectPath: string): Promise<boolean> {\n try {\n const gitDir = path.join(projectPath, '.git');\n return await fs.pathExists(gitDir);\n } catch {\n return false;\n }\n}\n\nexport async function getGitUserInfo(): Promise<{ name?: string; email?: string }> {\n try {\n const [nameResult, emailResult] = await Promise.allSettled([\n execa('git', ['config', '--global', 'user.name']),\n execa('git', ['config', '--global', 'user.email']),\n ]);\n\n return {\n name: nameResult.status === 'fulfilled' ? nameResult.value.stdout : undefined,\n email: emailResult.status === 'fulfilled' ? emailResult.value.stdout : undefined,\n };\n } catch {\n return {};\n }\n}\n\nexport async function hasGitChanges(projectPath: string): Promise<boolean> {\n try {\n const result = await execa('git', ['status', '--porcelain'], { cwd: projectPath });\n return result.stdout.trim().length > 0;\n } catch {\n return false;\n }\n}\n\nexport async function commitChanges(projectPath: string, message: string): Promise<void> {\n try {\n await execa('git', ['add', '.'], { cwd: projectPath });\n await execa('git', ['commit', '-m', message], { cwd: projectPath });\n } catch (error) {\n logger.warn('Failed to commit changes');\n logger.debug('Git commit error:', error);\n }\n}\n","import { logger } from '../utils/logger';\nimport { spinner } from '../utils/spinner';\n\ninterface AddOptions {\n provider?: string;\n}\n\nexport async function addFeature(feature: string, _options: AddOptions = {}) {\n try {\n logger.title(`Adding ${feature} feature`);\n\n const validFeatures = [\n 'auth',\n 'billing',\n 'analytics',\n 'teams',\n 'notifications',\n 'admin',\n 'api',\n 'docs',\n ];\n\n if (!validFeatures.includes(feature)) {\n logger.error(`Invalid feature: ${feature}`);\n logger.info('Available features:');\n logger.list(validFeatures);\n process.exit(1);\n }\n\n const addSpinner = spinner(`Adding ${feature} feature...`);\n\n // Simulate feature addition (placeholder for now)\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n addSpinner.succeed(`${feature} feature added successfully`);\n\n logger.newLine();\n logger.success('Feature added successfully!');\n logger.info(\"Don't forget to update your environment variables if needed.\");\n } catch (error) {\n logger.error('Failed to add feature:');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import { logger } from '../utils/logger';\nimport { spinner } from '../utils/spinner';\nimport { detectPackageManager, getAddCommand } from '../utils/package-manager';\nimport execa from 'execa';\n\ninterface UpdateOptions {\n check?: boolean;\n}\n\nconst DIGILOGIC_PACKAGES = [\n '@digilogiclabs/saas-factory-ui',\n '@digilogiclabs/saas-factory-auth',\n '@digilogiclabs/saas-factory-billing',\n '@digilogiclabs/saas-factory-analytics',\n];\n\nexport async function updateDependencies(options: UpdateOptions = {}) {\n try {\n logger.title('Updating Digi Logic Labs dependencies');\n\n const packageManager = await detectPackageManager();\n logger.info(`Using package manager: ${packageManager}`);\n\n if (options.check) {\n const checkSpinner = spinner('Checking for updates...');\n\n // Check for outdated packages\n try {\n const result = await execa(packageManager, ['outdated', ...DIGILOGIC_PACKAGES], {\n reject: false,\n });\n\n checkSpinner.succeed('Update check completed');\n\n if (result.stdout) {\n logger.info('Available updates:');\n logger.log(result.stdout);\n } else {\n logger.success('All Digi Logic Labs packages are up to date!');\n }\n } catch (error) {\n checkSpinner.fail('Failed to check for updates');\n throw error;\n }\n } else {\n const updateSpinner = spinner('Updating packages...');\n\n try {\n // Update packages\n const command = await getAddCommand(packageManager, DIGILOGIC_PACKAGES);\n await execa(command[0], command.slice(1), {\n stdio: 'inherit',\n });\n\n updateSpinner.succeed('Packages updated successfully');\n\n logger.newLine();\n logger.success('All Digi Logic Labs packages have been updated!');\n logger.info(\"Don't forget to test your application after updating.\");\n } catch (error) {\n updateSpinner.fail('Failed to update packages');\n throw error;\n }\n }\n } catch (error) {\n logger.error('Failed to update dependencies:');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","{\r\n \"name\": \"@digilogiclabs/create-saas-app\",\r\n \"version\": \"1.3.0\",\r\n \"description\": \"Create modern SaaS applications with Digi Logic Labs packages\",\r\n \"main\": \"dist/index.js\",\r\n \"bin\": {\r\n \"create-saas-app\": \"bin/index.js\"\r\n },\r\n \"scripts\": {\r\n \"build\": \"tsup\",\r\n \"dev\": \"tsup --watch\",\r\n \"test\": \"jest\",\r\n \"test:templates\": \"tsx scripts/test-all-templates.ts\",\r\n \"lint\": \"eslint src\",\r\n \"lint:fix\": \"eslint src --fix\",\r\n \"type-check\": \"tsc --noEmit\",\r\n \"validate\": \"tsx scripts/validate-templates.ts\",\r\n \"changeset\": \"changeset\",\r\n \"version\": \"changeset version\",\r\n \"release\": \"npm run build && changeset publish\",\r\n \"prepublishOnly\": \"npm run build && npm run lint && npm run type-check\"\r\n },\r\n \"keywords\": [\r\n \"cli\",\r\n \"saas\",\r\n \"template\",\r\n \"nextjs\",\r\n \"react-native\",\r\n \"expo\",\r\n \"typescript\",\r\n \"tailwind\",\r\n \"firebase\",\r\n \"supabase\",\r\n \"digilogiclabs\"\r\n ],\r\n \"author\": \"Digi Logic Labs\",\r\n \"license\": \"MIT\",\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"git+https://github.com/DigiLogicLabs/create-saas-app.git\"\r\n },\r\n \"bugs\": {\r\n \"url\": \"https://github.com/DigiLogicLabs/create-saas-app/issues\"\r\n },\r\n \"homepage\": \"https://github.com/DigiLogicLabs/create-saas-app#readme\",\r\n \"files\": [\r\n \"dist\",\r\n \"bin\",\r\n \"src/templates\",\r\n \"README.md\",\r\n \"CHANGELOG.md\",\r\n \"LICENSE\"\r\n ],\r\n \"engines\": {\r\n \"node\": \">=18.0.0\"\r\n },\r\n \"dependencies\": {\r\n \"chalk\": \"^4.1.2\",\r\n \"commander\": \"^11.1.0\",\r\n \"cosmiconfig\": \"^8.3.6\",\r\n \"execa\": \"^5.1.1\",\r\n \"fs-extra\": \"^11.1.1\",\r\n \"glob\": \"^10.3.10\",\r\n \"inquirer\": \"^9.2.12\",\r\n \"listr2\": \"^7.0.2\",\r\n \"mustache\": \"^4.2.0\",\r\n \"ora\": \"^5.4.1\",\r\n \"semver\": \"^7.5.4\",\r\n \"validate-npm-package-name\": \"^5.0.0\",\r\n \"zod\": \"^3.22.4\"\r\n },\r\n \"devDependencies\": {\r\n \"@changesets/cli\": \"^2.26.2\",\r\n \"@supabase/supabase-js\": \"^2.39.2\",\r\n \"@types/fs-extra\": \"^11.0.4\",\r\n \"@types/inquirer\": \"^9.0.7\",\r\n \"@types/jest\": \"^29.5.6\",\r\n \"@types/mustache\": \"^4.2.5\",\r\n \"@types/node\": \"^20.8.7\",\r\n \"@types/semver\": \"^7.5.4\",\r\n \"@types/validate-npm-package-name\": \"^4.0.2\",\r\n \"eslint\": \"^8.57.1\",\r\n \"eslint-config-prettier\": \"^9.1.2\",\r\n \"eslint-plugin-prettier\": \"^5.5.4\",\r\n \"firebase\": \"^10.7.1\",\r\n \"globals\": \"^16.3.0\",\r\n \"jest\": \"^29.7.0\",\r\n \"prettier\": \"^3.0.3\",\r\n \"ts-jest\": \"^29.1.1\",\r\n \"tsup\": \"^7.2.0\",\r\n \"tsx\": \"^3.14.0\",\r\n \"typescript\": \"^5.2.2\",\r\n \"typescript-eslint\": \"^8.40.0\"\r\n },\r\n \"peerDependencies\": {\r\n \"typescript\": \">=4.9.0\"\r\n },\r\n \"publishConfig\": {\r\n \"access\": \"public\"\r\n },\r\n \"directories\": {\r\n \"doc\": \"docs\",\r\n \"test\": \"tests\"\r\n }\r\n}\r\n"],"mappings":"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","names":["import_path","chalk","import_chalk","ora","chalk","validateNpmPackageName","fs","path","semver","answers","inquirer","import_path","import_fs_extra","path","fs","mustache","import_path","import_fs_extra","import_execa","import_execa","import_fs_extra","import_path","fs","path","execa","execa","path","fs","execa","import_execa","import_fs_extra","execa","path","import_execa","execa"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/create.ts","../src/cli/utils/logger.ts","../src/cli/utils/spinner.ts","../src/cli/validators/project-name.ts","../src/cli/validators/dependencies.ts","../src/cli/prompts/project-setup.ts","../src/generators/template-generator.ts","../src/generators/package-installer.ts","../src/cli/utils/package-manager.ts","../src/cli/utils/git.ts","../src/cli/commands/add.ts","../src/cli/commands/update.ts","../package.json"],"sourcesContent":["import { Command } from 'commander';\nimport { createProject } from './commands/create';\nimport { addFeature } from './commands/add';\nimport { updateDependencies } from './commands/update';\nimport { logger } from './utils/logger';\nimport packageJson from '../../package.json';\n\nconst program = new Command();\n\nprogram\n .name('create-saas-app')\n .description('Create modern SaaS applications with Digi Logic Labs packages')\n .version(packageJson.version);\n\nprogram\n .command('create')\n .alias('c')\n .description('Create a new SaaS application')\n .argument('<platform>', 'Platform: web, mobile, or both')\n .argument('[template]', 'Template: base, dashboard, saas (web) | base, tabs, stack (mobile)')\n .argument('[name]', 'Project name')\n .option('-a, --auth <provider>', 'Auth provider: firebase, supabase')\n .option('-d, --database <provider>', 'Database provider: supabase, firebase')\n .option('-t, --theme <theme>', 'Theme: default, corporate, startup')\n .option('-c, --theme-color <color>', 'Theme color: blue, green, purple, orange, red, slate')\n .option('--default-theme <mode>', 'Default theme mode: light, dark, system')\n .option('--no-install', 'Skip package installation')\n .option('--no-git', 'Skip git initialization')\n .option('-y, --yes', 'Skip interactive prompts')\n .action(createProject);\n\nprogram\n .command('add')\n .alias('a')\n .description('Add features to existing project')\n .argument('<feature>', 'Feature to add: auth, billing, analytics, etc.')\n .option('-p, --provider <provider>', 'Service provider')\n .action(addFeature);\n\nprogram\n .command('update')\n .alias('u')\n .description('Update Digi Logic Labs dependencies')\n .option('--check', 'Check for updates without installing')\n .action(updateDependencies);\n\n// Handle unknown commands\nprogram.on('command:*', () => {\n logger.error(`Unknown command: ${program.args.join(' ')}`);\n logger.info('Run \"create-saas-app --help\" for available commands');\n process.exit(1);\n});\n\n// Show help if no arguments provided\nif (!process.argv.slice(2).length) {\n program.outputHelp();\n process.exit(0);\n}\n\nprogram.parse();\n\nexport default program;\n","import path from 'path';\nimport { logger } from '../utils/logger';\nimport { spinner } from '../utils/spinner';\nimport { validateProjectName, validateProjectPath } from '../validators/project-name';\nimport { validateNodeVersion } from '../validators/dependencies';\nimport { getProjectPrompts } from '../prompts/project-setup';\nimport { TemplateGenerator } from '../../generators/template-generator';\nimport { PackageInstaller } from '../../generators/package-installer';\nimport { initializeGit } from '../utils/git';\n\ninterface CreateOptions {\n auth?: string;\n database?: string;\n theme?: string;\n themeColor?: string;\n defaultTheme?: string;\n install?: boolean;\n git?: boolean;\n yes?: boolean;\n}\n\nexport interface ProjectConfig {\n platform: 'web' | 'mobile' | 'both';\n template: string;\n name: string;\n auth: 'firebase' | 'supabase';\n database: 'supabase' | 'firebase';\n theme: 'default' | 'corporate' | 'startup';\n themeColor: 'blue' | 'green' | 'purple' | 'orange' | 'red' | 'slate';\n defaultTheme: 'light' | 'dark' | 'system';\n install: boolean;\n git: boolean;\n}\n\nexport async function createProject(\n platform: string,\n template?: string,\n name?: string,\n options: CreateOptions & { themeColor?: string; defaultTheme?: string } = {}\n) {\n try {\n // Validate Node.js version\n if (!(await validateNodeVersion())) {\n process.exit(1);\n }\n\n // Validate platform\n const validPlatforms = ['web', 'mobile', 'both'];\n if (!validPlatforms.includes(platform)) {\n logger.error(`Invalid platform: ${platform}. Must be one of: ${validPlatforms.join(', ')}`);\n process.exit(1);\n }\n\n // Set up initial configuration\n let config: ProjectConfig = {\n platform: platform as 'web' | 'mobile' | 'both',\n template: template || 'base',\n name: name || 'my-saas-app',\n auth: (options.auth as 'firebase' | 'supabase') || 'supabase',\n database: (options.database as 'supabase' | 'firebase') || 'supabase',\n theme: (options.theme as 'default' | 'corporate' | 'startup') || 'default',\n themeColor:\n (options.themeColor as 'blue' | 'green' | 'purple' | 'orange' | 'red' | 'slate') || 'blue',\n defaultTheme: (options.defaultTheme as 'light' | 'dark' | 'system') || 'system',\n install: options.install !== false,\n git: options.git !== false,\n };\n\n // Interactive prompts if not in yes mode\n if (!options.yes) {\n config = await getProjectPrompts(config);\n }\n\n // Validate project name\n if (!validateProjectName(config.name)) {\n process.exit(1);\n }\n\n const projectPath = path.resolve(process.cwd(), config.name);\n\n // Validate project path\n if (!(await validateProjectPath(projectPath))) {\n process.exit(1);\n }\n\n // Display configuration\n logger.title('🚀 Creating your SaaS application');\n logger.info(`Platform: ${config.platform}`);\n logger.info(`Template: ${config.template}`);\n logger.info(`Project: ${config.name}`);\n logger.info(`Auth: ${config.auth}`);\n logger.info(`Database: ${config.database}`);\n logger.info(`Theme: ${config.theme}`);\n logger.info(`Theme Color: ${config.themeColor}`);\n logger.info(`Default Theme: ${config.defaultTheme}`);\n logger.newLine();\n\n // Generate project structure\n const templateSpinner = spinner('Generating project structure...');\n try {\n const generator = new TemplateGenerator(config);\n await generator.generate(projectPath);\n templateSpinner.succeed('Project structure created');\n } catch (_error) {\n templateSpinner.fail('Failed to generate project structure');\n throw _error;\n }\n\n // Install dependencies\n if (config.install) {\n const installSpinner = spinner('Installing dependencies...');\n try {\n const installer = new PackageInstaller(projectPath);\n await installer.install();\n installSpinner.succeed('Dependencies installed');\n } catch (_error) {\n installSpinner.fail('Failed to install dependencies');\n logger.warn('You can install dependencies manually by running:');\n logger.code(`cd ${config.name} && npm install`);\n }\n }\n\n // Initialize git repository\n if (config.git) {\n const gitSpinner = spinner('Initializing git repository...');\n try {\n await initializeGit(projectPath);\n gitSpinner.succeed('Git repository initialized');\n } catch (_error) {\n gitSpinner.fail('Failed to initialize git repository');\n logger.warn('You can initialize git manually by running:');\n logger.code(`cd ${config.name} && git init`);\n }\n }\n\n // Success message with next steps\n logger.newLine();\n logger.success('🎉 Project created successfully!');\n logger.newLine();\n\n logger.title('Next steps:');\n logger.code(`cd ${config.name}`);\n\n if (!config.install) {\n logger.code('npm install');\n }\n\n if (config.platform === 'web' || config.platform === 'both') {\n logger.code('npm run dev');\n logger.info('Open http://localhost:3000 in your browser');\n }\n\n if (config.platform === 'mobile' || config.platform === 'both') {\n logger.code('npx expo start');\n logger.info('Scan QR code with Expo Go app');\n }\n\n logger.newLine();\n logger.info('📚 Documentation: https://docs.digilogiclabs.com');\n logger.info('💬 Support: https://discord.gg/digilogiclabs');\n } catch (error) {\n logger.error('Failed to create project:');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\n\nexport const logger = {\n info: (message: string, ...args: unknown[]) => {\n console.log(chalk.blue('ℹ'), message, ...args);\n },\n\n success: (message: string, ...args: unknown[]) => {\n console.log(chalk.green('✓'), message, ...args);\n },\n\n warn: (message: string, ...args: unknown[]) => {\n console.log(chalk.yellow('⚠'), message, ...args);\n },\n\n error: (message: string, ...args: unknown[]) => {\n console.log(chalk.red('✗'), message, ...args);\n },\n\n debug: (message: string, ...args: unknown[]) => {\n if (process.env.DEBUG) {\n console.log(chalk.gray('🐛'), message, ...args);\n }\n },\n\n log: (message: string, ...args: unknown[]) => {\n console.log(message, ...args);\n },\n\n newLine: () => {\n console.log();\n },\n\n divider: () => {\n console.log(chalk.gray('─'.repeat(50)));\n },\n\n title: (message: string) => {\n console.log();\n console.log(chalk.bold.cyan(message));\n console.log(chalk.gray('─'.repeat(message.length)));\n },\n\n step: (step: number, total: number, message: string) => {\n console.log(chalk.cyan(`[${step}/${total}]`), message);\n },\n\n highlight: (message: string) => {\n console.log(chalk.bold.magenta(message));\n },\n\n code: (code: string) => {\n console.log(chalk.gray(' ' + code));\n },\n\n list: (items: string[]) => {\n items.forEach((item) => {\n console.log(chalk.gray(' •'), item);\n });\n },\n};\n","import ora, { Ora } from 'ora';\nimport chalk from 'chalk';\n\nexport function spinner(text: string): Ora {\n return ora({\n text: chalk.gray(text),\n spinner: 'dots',\n color: 'cyan',\n }).start();\n}\n\nexport function createSpinner(text: string): Ora {\n return ora({\n text: chalk.gray(text),\n spinner: 'dots',\n color: 'cyan',\n });\n}\n\nexport function successSpinner(text: string): Ora {\n return ora({\n text: chalk.green(text),\n spinner: 'dots',\n color: 'green',\n });\n}\n\nexport function errorSpinner(text: string): Ora {\n return ora({\n text: chalk.red(text),\n spinner: 'dots',\n color: 'red',\n });\n}\n\nexport function warnSpinner(text: string): Ora {\n return ora({\n text: chalk.yellow(text),\n spinner: 'dots',\n color: 'yellow',\n });\n}\n","import validateNpmPackageName from 'validate-npm-package-name';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { logger } from '../utils/logger';\n\nexport function validateProjectName(name: string): boolean {\n // Check if name is empty\n if (!name || name.trim().length === 0) {\n logger.error('Project name cannot be empty');\n return false;\n }\n\n // Check npm package name validity\n const validation = validateNpmPackageName(name);\n\n if (!validation.validForNewPackages) {\n logger.error('Invalid project name:');\n\n if (validation.errors) {\n validation.errors.forEach((error) => logger.error(` • ${error}`));\n }\n\n if (validation.warnings) {\n validation.warnings.forEach((warning) => logger.warn(` • ${warning}`));\n }\n\n return false;\n }\n\n // Check for reserved names\n const reservedNames = [\n 'node_modules',\n 'package.json',\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n '.git',\n '.gitignore',\n 'README.md',\n 'LICENSE',\n 'src',\n 'dist',\n 'build',\n 'public',\n 'static',\n 'assets',\n 'components',\n 'pages',\n 'app',\n 'lib',\n 'utils',\n 'hooks',\n 'types',\n 'styles',\n 'config',\n 'test',\n 'tests',\n '__tests__',\n 'spec',\n 'specs',\n 'docs',\n 'documentation',\n ];\n\n if (reservedNames.includes(name.toLowerCase())) {\n logger.error(`Project name \"${name}\" is reserved. Please choose a different name.`);\n return false;\n }\n\n // Check for common problematic patterns\n if (name.startsWith('.')) {\n logger.error('Project name cannot start with a dot');\n return false;\n }\n\n if (name.startsWith('-')) {\n logger.error('Project name cannot start with a hyphen');\n return false;\n }\n\n if (name.endsWith('-')) {\n logger.error('Project name cannot end with a hyphen');\n return false;\n }\n\n if (name.includes('..')) {\n logger.error('Project name cannot contain consecutive dots');\n return false;\n }\n\n if (name.includes('//')) {\n logger.error('Project name cannot contain consecutive slashes');\n return false;\n }\n\n // Check length\n if (name.length > 214) {\n logger.error('Project name is too long (max 214 characters)');\n return false;\n }\n\n return true;\n}\n\nexport async function validateProjectPath(projectPath: string): Promise<boolean> {\n try {\n // Check if directory already exists\n if (await fs.pathExists(projectPath)) {\n const stats = await fs.stat(projectPath);\n\n if (stats.isDirectory()) {\n const files = await fs.readdir(projectPath);\n\n if (files.length > 0) {\n logger.error(`Directory \"${path.basename(projectPath)}\" already exists and is not empty`);\n return false;\n }\n } else {\n logger.error(`A file with the name \"${path.basename(projectPath)}\" already exists`);\n return false;\n }\n }\n\n // Check if parent directory is writable\n const parentDir = path.dirname(projectPath);\n\n try {\n await fs.access(parentDir, fs.constants.W_OK);\n } catch {\n logger.error(`Cannot write to directory \"${parentDir}\"`);\n return false;\n }\n\n return true;\n } catch (error) {\n logger.error('Failed to validate project path:', error);\n return false;\n }\n}\n\nexport function sanitizeProjectName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/^-+|-+$/g, '')\n .replace(/-+/g, '-');\n}\n\nexport function suggestProjectName(name: string): string {\n const sanitized = sanitizeProjectName(name);\n\n if (validateProjectName(sanitized)) {\n return sanitized;\n }\n\n // If still invalid, add a prefix\n const suggested = `my-${sanitized}`;\n\n if (validateProjectName(suggested)) {\n return suggested;\n }\n\n // Last resort\n return 'my-saas-app';\n}\n","import semver from 'semver';\nimport execa from 'execa';\nimport { logger } from '../utils/logger';\n\nexport interface DependencyInfo {\n name: string;\n version: string;\n latest?: string;\n outdated?: boolean;\n}\n\nexport async function validateNodeVersion(): Promise<boolean> {\n const nodeVersion = process.version;\n const minVersion = '16.0.0';\n\n if (!semver.gte(nodeVersion, minVersion)) {\n logger.error(\n `Node.js version ${minVersion} or higher is required. Current version: ${nodeVersion}`\n );\n return false;\n }\n\n return true;\n}\n\nexport async function checkPackageExists(packageName: string): Promise<boolean> {\n try {\n await execa('npm', ['view', packageName, 'version']);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function getLatestVersion(packageName: string): Promise<string | null> {\n try {\n const result = await execa('npm', ['view', packageName, 'version']);\n return result.stdout.trim();\n } catch {\n return null;\n }\n}\n\nexport async function validateDependencies(dependencies: string[]): Promise<DependencyInfo[]> {\n const results: DependencyInfo[] = [];\n\n for (const dep of dependencies) {\n const [name, version] =\n dep.includes('@') && !dep.startsWith('@') ? dep.split('@') : [dep, 'latest'];\n\n try {\n const latest = await getLatestVersion(name);\n\n if (!latest) {\n logger.warn(`Package \"${name}\" not found in npm registry`);\n continue;\n }\n\n const resolvedVersion = version === 'latest' ? latest : version;\n const outdated = version !== 'latest' && semver.lt(resolvedVersion, latest);\n\n results.push({\n name,\n version: resolvedVersion,\n latest,\n outdated,\n });\n } catch (error) {\n logger.warn(`Failed to validate package \"${name}\":`, error);\n }\n }\n\n return results;\n}\n\nexport function validateVersionRange(version: string): boolean {\n try {\n return semver.validRange(version) !== null;\n } catch {\n return false;\n }\n}\n\nexport function isValidSemver(version: string): boolean {\n return semver.valid(version) !== null;\n}\n\nexport function compareVersions(version1: string, version2: string): number {\n try {\n return semver.compare(version1, version2);\n } catch {\n return 0;\n }\n}\n\nexport function getVersionSuggestion(currentVersion: string, latestVersion: string): string {\n if (!isValidSemver(currentVersion) || !isValidSemver(latestVersion)) {\n return latestVersion;\n }\n\n const current = semver.parse(currentVersion);\n const latest = semver.parse(latestVersion);\n\n if (!current || !latest) {\n return latestVersion;\n }\n\n // If major version is different, suggest latest\n if (current.major !== latest.major) {\n return `^${latestVersion}`;\n }\n\n // If minor version is different, suggest latest minor\n if (current.minor !== latest.minor) {\n return `~${latestVersion}`;\n }\n\n // If only patch is different, suggest exact latest\n return latestVersion;\n}\n","import inquirer from 'inquirer';\nimport { ProjectConfig } from '../commands/create';\nimport { validateProjectName, suggestProjectName } from '../validators/project-name';\nimport { logger } from '../utils/logger';\n\nexport async function getProjectPrompts(initialConfig: ProjectConfig): Promise<ProjectConfig> {\n logger.title('🛠️ Project Configuration');\n\n const questions = [\n {\n type: 'input',\n name: 'name',\n message: 'Project name:',\n default: initialConfig.name,\n validate: (input: string) => {\n if (!validateProjectName(input)) {\n const suggestion = suggestProjectName(input);\n return `Invalid project name. Try: ${suggestion}`;\n }\n return true;\n },\n filter: (input: string) => input.trim(),\n },\n {\n type: 'list',\n name: 'platform',\n message: 'Select platform:',\n choices: [\n { name: '🌐 Web (Next.js)', value: 'web' },\n { name: '📱 Mobile (Expo)', value: 'mobile' },\n { name: '🚀 Both (Full-stack)', value: 'both' },\n ],\n default: initialConfig.platform,\n },\n {\n type: 'list',\n name: 'template',\n message: 'Select template:',\n choices: (answers: { platform: string }) => {\n if (answers.platform === 'web') {\n return [\n { name: '📄 Base - Clean starter template', value: 'base' },\n {\n name: '📦 UI Only - With @digilogiclabs/saas-factory-ui (no auth)',\n value: 'ui-only',\n },\n {\n name: '🔐 UI + Auth - With UI components and authentication',\n value: 'ui-auth',\n },\n {\n name: '💳 UI + Auth + Payments - Full SaaS with payments integration',\n value: 'ui-auth-payments',\n },\n {\n name: '🎵 Audio Player App - Full SaaS with audio streaming features',\n value: 'ui-auth-payments-audio',\n },\n {\n name: '🎬 Video Player App - Full SaaS with video streaming features',\n value: 'ui-auth-payments-video',\n },\n { name: '📊 Dashboard - Admin dashboard with analytics', value: 'dashboard' },\n { name: '💼 SaaS - Multi-tenant SaaS application', value: 'saas' },\n ];\n } else if (answers.platform === 'mobile') {\n return [\n { name: '📱 Base - Simple mobile app', value: 'base' },\n { name: '📑 Tabs - Tab navigation', value: 'tabs' },\n { name: '📚 Stack - Stack navigation', value: 'stack' },\n ];\n } else {\n return [{ name: '🚀 Base - Web + Mobile starter', value: 'base' }];\n }\n },\n default: initialConfig.template,\n },\n {\n type: 'list',\n name: 'auth',\n message: 'Select authentication provider:',\n choices: [\n { name: '⚡ Supabase - Open source alternative', value: 'supabase' },\n { name: \"🔥 Firebase - Google's platform\", value: 'firebase' },\n ],\n default: initialConfig.auth,\n },\n {\n type: 'list',\n name: 'database',\n message: 'Select database provider:',\n choices: (answers: { auth: string }) => {\n // Smart defaults based on auth choice\n const choices = [\n { name: '⚡ Supabase - PostgreSQL with real-time', value: 'supabase' },\n { name: '🔥 Firebase - NoSQL with real-time', value: 'firebase' },\n ];\n\n // Suggest matching auth provider\n if (answers.auth === 'firebase') {\n return choices.reverse();\n }\n\n return choices;\n },\n default: (answers: { auth: string }) => {\n // Auto-match auth provider if possible, but prefer Supabase\n return answers.auth === 'firebase' ? 'firebase' : 'supabase';\n },\n },\n {\n type: 'list',\n name: 'theme',\n message: 'Select theme:',\n choices: [\n { name: '🎨 Default - Clean and modern', value: 'default' },\n { name: '🏢 Corporate - Professional business theme', value: 'corporate' },\n { name: '🚀 Startup - Bold and innovative', value: 'startup' },\n ],\n default: initialConfig.theme,\n },\n {\n type: 'list',\n name: 'themeColor',\n message: 'Select theme color:',\n choices: [\n { name: '🔵 Blue - Classic and trustworthy', value: 'blue' },\n { name: '🟢 Green - Fresh and natural', value: 'green' },\n { name: '🟣 Purple - Creative and modern', value: 'purple' },\n { name: '🟠 Orange - Energetic and friendly', value: 'orange' },\n { name: '🔴 Red - Bold and attention-grabbing', value: 'red' },\n { name: '⚫ Slate - Professional and minimal', value: 'slate' },\n ],\n default: initialConfig.themeColor,\n },\n {\n type: 'list',\n name: 'defaultTheme',\n message: 'Select default theme mode:',\n choices: [\n { name: '🌙 System - Follow system preference', value: 'system' },\n { name: '☀️ Light - Always light mode', value: 'light' },\n { name: '🌙 Dark - Always dark mode', value: 'dark' },\n ],\n default: initialConfig.defaultTheme,\n },\n {\n type: 'confirm',\n name: 'install',\n message: 'Install dependencies?',\n default: initialConfig.install,\n },\n {\n type: 'confirm',\n name: 'git',\n message: 'Initialize git repository?',\n default: initialConfig.git,\n },\n ];\n\n const answers = await inquirer.prompt(questions);\n\n return {\n ...initialConfig,\n ...answers,\n } as ProjectConfig;\n}\n\nexport async function getAuthSetupPrompts(authProvider: string) {\n logger.title(`🔐 ${authProvider} Configuration`);\n\n if (authProvider === 'firebase') {\n const questions = [\n {\n type: 'input',\n name: 'projectId',\n message: 'Firebase Project ID:',\n validate: (input: string) => input.length > 0 || 'Project ID is required',\n },\n {\n type: 'input',\n name: 'apiKey',\n message: 'Firebase API Key:',\n validate: (input: string) => input.length > 0 || 'API Key is required',\n },\n {\n type: 'input',\n name: 'authDomain',\n message: 'Firebase Auth Domain:',\n validate: (input: string) => input.length > 0 || 'Auth Domain is required',\n },\n ];\n\n return await inquirer.prompt(questions);\n } else if (authProvider === 'supabase') {\n const questions = [\n {\n type: 'input',\n name: 'url',\n message: 'Supabase URL:',\n validate: (input: string) => {\n if (!input.length) return 'URL is required';\n if (!input.startsWith('https://')) return 'URL must start with https://';\n return true;\n },\n },\n {\n type: 'input',\n name: 'anonKey',\n message: 'Supabase Anon Key:',\n validate: (input: string) => input.length > 0 || 'Anon Key is required',\n },\n ];\n\n return await inquirer.prompt(questions);\n }\n\n return {};\n}\n\nexport async function getThemeCustomizationPrompts(theme: string) {\n logger.title(`🎨 ${theme} Theme Customization`);\n\n const questions = [\n {\n type: 'input',\n name: 'primaryColor',\n message: 'Primary color (hex):',\n default: theme === 'corporate' ? '#1e40af' : theme === 'startup' ? '#7c3aed' : '#3b82f6',\n validate: (input: string) => {\n if (!/^#[0-9A-F]{6}$/i.test(input)) {\n return 'Please enter a valid hex color (e.g., #3b82f6)';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'fontFamily',\n message: 'Font family:',\n default: theme === 'corporate' ? 'Inter' : theme === 'startup' ? 'Poppins' : 'System UI',\n },\n {\n type: 'confirm',\n name: 'darkMode',\n message: 'Enable dark mode support?',\n default: true,\n },\n ];\n\n return await inquirer.prompt(questions);\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport mustache from 'mustache';\nimport { glob } from 'glob';\nimport { ProjectConfig } from '../cli/commands/create';\nimport { logger } from '../cli/utils/logger';\n\nexport interface TemplateContext {\n projectName: string;\n platform: string;\n template: string;\n auth: string;\n database: string;\n theme: string;\n themeColor: string;\n defaultTheme: string;\n packageName: string;\n className: string;\n camelCaseName: string;\n kebabCaseName: string;\n titleCaseName: string;\n description: string;\n author: string;\n year: number;\n generatedDate: string;\n generatorVersion: string;\n uiVersion: string;\n authVersion: string;\n paymentsVersion: string;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n scripts: Record<string, string>;\n}\n\nexport class TemplateGenerator {\n private config: ProjectConfig;\n private context: TemplateContext;\n private templatesDir: string;\n\n constructor(config: ProjectConfig) {\n this.config = config;\n // Check if we're in development (src) or production (dist)\n const isDev = __dirname.includes('/src/');\n this.templatesDir = isDev\n ? path.join(__dirname, '..', 'templates')\n : path.join(__dirname, 'templates');\n this.context = this.createTemplateContext();\n }\n\n private createTemplateContext(): TemplateContext {\n const projectName = this.config.name;\n const packageName = projectName.toLowerCase().replace(/[^a-z0-9-]/g, '-');\n const className = this.toPascalCase(projectName);\n const camelCaseName = this.toCamelCase(projectName);\n const kebabCaseName = packageName;\n const titleCaseName = this.toTitleCase(projectName);\n\n const dependencies = this.getDependencies();\n const generatedDate = new Date().toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n\n return {\n projectName,\n platform: this.config.platform,\n template: this.config.template,\n auth: this.config.auth,\n database: this.config.database,\n theme: this.config.theme,\n themeColor: this.config.themeColor,\n defaultTheme: this.config.defaultTheme,\n packageName,\n className,\n camelCaseName,\n kebabCaseName,\n titleCaseName,\n description: `A modern SaaS application built with Digi Logic Labs`,\n author: 'Digi Logic Labs',\n year: new Date().getFullYear(),\n generatedDate,\n generatorVersion: '1.5.0',\n uiVersion: dependencies['@digilogiclabs/saas-factory-ui']?.replace('^', '') || '0.11.1',\n authVersion: dependencies['@digilogiclabs/saas-factory-auth']?.replace('^', '') || '1.0.0',\n paymentsVersion:\n dependencies['@digilogiclabs/saas-factory-payments']?.replace('^', '') || '1.0.0',\n dependencies,\n devDependencies: this.getDevDependencies(),\n scripts: this.getScripts(),\n };\n }\n\n private getDependencies(): Record<string, string> {\n const baseDeps: Record<string, string> = {};\n\n // Add UI package for ui-only, ui-auth, ui-auth-payments, and media player templates\n if (\n [\n 'ui-only',\n 'ui-auth',\n 'ui-auth-payments',\n 'ui-auth-payments-audio',\n 'ui-auth-payments-video',\n ].includes(this.config.template)\n ) {\n baseDeps['@digilogiclabs/saas-factory-ui'] = '^0.11.1';\n }\n\n // Add auth package for auth-enabled templates\n if (\n ['ui-auth', 'ui-auth-payments', 'ui-auth-payments-audio', 'ui-auth-payments-video'].includes(\n this.config.template\n )\n ) {\n baseDeps['@digilogiclabs/saas-factory-auth'] = '^1.0.0';\n }\n\n // Add payments package for payment-enabled templates\n if (\n ['ui-auth-payments', 'ui-auth-payments-audio', 'ui-auth-payments-video'].includes(\n this.config.template\n )\n ) {\n baseDeps['@digilogiclabs/saas-factory-payments'] = '^1.0.0';\n }\n\n if (this.config.platform === 'web' || this.config.platform === 'both') {\n Object.assign(baseDeps, {\n next: '^15.0.0',\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n tailwindcss: '^3.3.0',\n typescript: '^5.0.0',\n clsx: '^2.0.0',\n 'class-variance-authority': '^0.7.0',\n 'tailwind-merge': '^2.0.0',\n 'next-themes': '^0.2.1',\n 'lucide-react': '^0.292.0',\n autoprefixer: '^10.4.16',\n postcss: '^8.4.31',\n });\n }\n\n if (this.config.platform === 'mobile' || this.config.platform === 'both') {\n Object.assign(baseDeps, {\n expo: '~49.0.0',\n 'react-native': '0.72.0',\n '@expo/vector-icons': '^13.0.0',\n });\n }\n\n if (this.config.auth === 'firebase') {\n baseDeps['firebase'] = '^10.0.0';\n } else if (this.config.auth === 'supabase') {\n baseDeps['@supabase/supabase-js'] = '^2.0.0';\n }\n\n return baseDeps;\n }\n\n private getDevDependencies(): Record<string, string> {\n const baseDeps = {\n '@types/node': '^20.0.0',\n eslint: '^8.0.0',\n prettier: '^3.0.0',\n };\n\n if (this.config.platform === 'web' || this.config.platform === 'both') {\n Object.assign(baseDeps, {\n '@types/react': '^18.0.0',\n '@types/react-dom': '^18.0.0',\n autoprefixer: '^10.0.0',\n postcss: '^8.0.0',\n });\n }\n\n return baseDeps;\n }\n\n private getScripts(): Record<string, string> {\n const scripts: Record<string, string> = {};\n\n if (this.config.platform === 'web' || this.config.platform === 'both') {\n Object.assign(scripts, {\n dev: 'next dev',\n build: 'next build',\n start: 'next start',\n lint: 'next lint',\n });\n }\n\n if (this.config.platform === 'mobile' || this.config.platform === 'both') {\n Object.assign(scripts, {\n start: 'expo start',\n android: 'expo start --android',\n ios: 'expo start --ios',\n web: 'expo start --web',\n });\n }\n\n return scripts;\n }\n\n public async generate(outputPath: string): Promise<void> {\n try {\n // Ensure output directory exists\n await fs.ensureDir(outputPath);\n\n // Generate based on platform\n if (this.config.platform === 'web') {\n await this.generateWebProject(outputPath);\n } else if (this.config.platform === 'mobile') {\n await this.generateMobileProject(outputPath);\n } else if (this.config.platform === 'both') {\n await this.generateWebProject(outputPath);\n await this.generateMobileProject(path.join(outputPath, 'mobile'));\n }\n\n // Copy shared resources\n await this.copySharedResources(outputPath);\n\n logger.debug('Template generation completed');\n } catch (error) {\n logger.error('Template generation failed:', error);\n throw error;\n }\n }\n\n private async generateWebProject(outputPath: string): Promise<void> {\n const templatePath = path.join(this.templatesDir, 'web', this.config.template);\n await this.copyTemplate(templatePath, outputPath);\n }\n\n private async generateMobileProject(outputPath: string): Promise<void> {\n const templatePath = path.join(this.templatesDir, 'mobile', this.config.template);\n await this.copyTemplate(templatePath, outputPath);\n }\n\n private async copyTemplate(templatePath: string, outputPath: string): Promise<void> {\n const templateDir = path.join(templatePath, 'template');\n\n if (!(await fs.pathExists(templateDir))) {\n throw new Error(`Template not found: ${templateDir}`);\n }\n await this.copyAndProcessFiles(templateDir, outputPath);\n }\n\n private async copyAndProcessFiles(sourceDir: string, targetDir: string): Promise<void> {\n if (!(await fs.pathExists(sourceDir))) {\n logger.debug(`Template source directory not found: ${sourceDir}`);\n return;\n }\n\n const files = await glob('**/*', {\n cwd: sourceDir,\n dot: true,\n nodir: true,\n });\n\n for (const file of files) {\n const sourcePath = path.join(sourceDir, file);\n const targetPath = path.join(targetDir, file);\n\n await fs.ensureDir(path.dirname(targetPath));\n\n const content = await fs.readFile(sourcePath, 'utf-8');\n\n if (this.isTextFile(file)) {\n const processedContent = mustache.render(content, this.context);\n await fs.writeFile(targetPath, processedContent);\n } else {\n await fs.copy(sourcePath, targetPath);\n }\n }\n }\n\n private async copySharedResources(outputPath: string): Promise<void> {\n // Skip copying shared resources for UI-only templates\n if (this.config.template === 'ui-only') {\n logger.debug('Skipping shared resources for UI-only template');\n return;\n }\n\n const sharedPath = path.join(this.templatesDir, 'shared');\n\n // Copy auth configuration\n const authPath = path.join(sharedPath, 'auth', this.config.auth);\n await this.copyAndProcessFiles(authPath, outputPath);\n\n // Copy theme configuration\n const themePath = path.join(sharedPath, 'themes', this.config.theme);\n await this.copyAndProcessFiles(themePath, outputPath);\n\n // Copy database configuration\n const dbPath = path.join(sharedPath, 'database', this.config.database);\n await this.copyAndProcessFiles(dbPath, outputPath);\n }\n\n private isTextFile(filename: string): boolean {\n const textExtensions = [\n '.js',\n '.jsx',\n '.ts',\n '.tsx',\n '.json',\n '.md',\n '.txt',\n '.yml',\n '.yaml',\n '.xml',\n '.html',\n '.css',\n '.scss',\n '.sass',\n '.less',\n '.env',\n '.gitignore',\n '.eslintrc',\n '.prettierrc',\n '.editorconfig',\n '.nvmrc',\n ];\n\n const ext = path.extname(filename).toLowerCase();\n return textExtensions.includes(ext) || !ext;\n }\n\n private toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n }\n\n private toCamelCase(str: string): string {\n const pascal = this.toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n }\n\n private toTitleCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport execa from 'execa';\nimport {\n detectPackageManager,\n getInstallCommand,\n isPackageManagerAvailable,\n} from '../cli/utils/package-manager';\nimport { logger } from '../cli/utils/logger';\n\nexport class PackageInstaller {\n private projectPath: string;\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n }\n\n public async install(): Promise<void> {\n try {\n // Check if package.json exists\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n if (!(await fs.pathExists(packageJsonPath))) {\n throw new Error('package.json not found in project directory');\n }\n\n // Detect package manager\n const packageManager = await detectPackageManager(this.projectPath);\n\n // Verify package manager is available\n if (!(await isPackageManagerAvailable(packageManager))) {\n throw new Error(`Package manager \"${packageManager}\" is not available`);\n }\n\n logger.debug(`Installing dependencies with ${packageManager}...`);\n\n // Get install command\n const command = await getInstallCommand(packageManager);\n\n // Run installation\n await execa(command[0], command.slice(1), {\n cwd: this.projectPath,\n stdio: 'pipe',\n });\n\n logger.debug('Dependencies installed successfully');\n } catch (error) {\n logger.error('Package installation failed:', error);\n throw error;\n }\n }\n\n public async installDependencies(dependencies: string[], dev = false): Promise<void> {\n try {\n if (dependencies.length === 0) {\n return;\n }\n\n const packageManager = await detectPackageManager(this.projectPath);\n\n if (!(await isPackageManagerAvailable(packageManager))) {\n throw new Error(`Package manager \"${packageManager}\" is not available`);\n }\n\n logger.debug(`Installing ${dev ? 'dev ' : ''}dependencies: ${dependencies.join(', ')}`);\n\n // Get add command\n const command =\n packageManager === 'yarn'\n ? ['yarn', 'add', ...(dev ? ['-D'] : []), ...dependencies]\n : packageManager === 'pnpm'\n ? ['pnpm', 'add', ...(dev ? ['-D'] : []), ...dependencies]\n : ['npm', 'install', ...(dev ? ['--save-dev'] : []), ...dependencies];\n\n // Run installation\n await execa(command[0], command.slice(1), {\n cwd: this.projectPath,\n stdio: 'pipe',\n });\n\n logger.debug(`${dev ? 'Dev d' : 'D'}ependencies installed successfully`);\n } catch (error) {\n logger.error(`Failed to install ${dev ? 'dev ' : ''}dependencies:`, error);\n throw error;\n }\n }\n\n public async updatePackageJson(\n updates: Partial<{\n name: string;\n version: string;\n description: string;\n author: string;\n license: string;\n scripts: Record<string, string>;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n keywords: string[];\n repository: unknown;\n bugs: unknown;\n homepage: string;\n }>\n ): Promise<void> {\n try {\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n\n if (!(await fs.pathExists(packageJsonPath))) {\n throw new Error('package.json not found');\n }\n\n const packageJson = await fs.readJson(packageJsonPath);\n const updatedPackageJson = { ...packageJson, ...updates };\n\n await fs.writeJson(packageJsonPath, updatedPackageJson, { spaces: 2 });\n\n logger.debug('package.json updated successfully');\n } catch (error) {\n logger.error('Failed to update package.json:', error);\n throw error;\n }\n }\n\n public async addScript(name: string, command: string): Promise<void> {\n try {\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n const packageJson = await fs.readJson(packageJsonPath);\n\n if (!packageJson.scripts) {\n packageJson.scripts = {};\n }\n\n packageJson.scripts[name] = command;\n\n await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });\n\n logger.debug(`Script \"${name}\" added to package.json`);\n } catch (error) {\n logger.error(`Failed to add script \"${name}\":`, error);\n throw error;\n }\n }\n\n public async removeScript(name: string): Promise<void> {\n try {\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n const packageJson = await fs.readJson(packageJsonPath);\n\n if (packageJson.scripts && packageJson.scripts[name]) {\n delete packageJson.scripts[name];\n await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });\n logger.debug(`Script \"${name}\" removed from package.json`);\n }\n } catch (error) {\n logger.error(`Failed to remove script \"${name}\":`, error);\n throw error;\n }\n }\n\n public async getDependencies(): Promise<{\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n }> {\n try {\n const packageJsonPath = path.join(this.projectPath, 'package.json');\n const packageJson = await fs.readJson(packageJsonPath);\n\n return {\n dependencies: packageJson.dependencies || {},\n devDependencies: packageJson.devDependencies || {},\n };\n } catch (error) {\n logger.error('Failed to read dependencies:', error);\n return { dependencies: {}, devDependencies: {} };\n }\n }\n\n public async hasLockFile(): Promise<boolean> {\n const lockFiles = ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml'];\n\n for (const lockFile of lockFiles) {\n if (await fs.pathExists(path.join(this.projectPath, lockFile))) {\n return true;\n }\n }\n\n return false;\n }\n\n public async cleanInstall(): Promise<void> {\n try {\n // Remove node_modules and lock files\n const nodeModulesPath = path.join(this.projectPath, 'node_modules');\n const lockFiles = ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml'];\n\n if (await fs.pathExists(nodeModulesPath)) {\n await fs.remove(nodeModulesPath);\n }\n\n for (const lockFile of lockFiles) {\n const lockPath = path.join(this.projectPath, lockFile);\n if (await fs.pathExists(lockPath)) {\n await fs.remove(lockPath);\n }\n }\n\n // Fresh install\n await this.install();\n\n logger.debug('Clean install completed');\n } catch (error) {\n logger.error('Clean install failed:', error);\n throw error;\n }\n }\n}\n","import execa from 'execa';\nimport fs from 'fs-extra';\nimport path from 'path';\n\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm';\n\nexport async function detectPackageManager(projectPath?: string): Promise<PackageManager> {\n const cwd = projectPath || process.cwd();\n\n // Check for lock files\n const lockFiles = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' as PackageManager },\n { file: 'yarn.lock', manager: 'yarn' as PackageManager },\n { file: 'package-lock.json', manager: 'npm' as PackageManager },\n ];\n\n for (const { file, manager } of lockFiles) {\n if (await fs.pathExists(path.join(cwd, file))) {\n return manager;\n }\n }\n\n // Check for package manager availability\n const managers: PackageManager[] = ['pnpm', 'yarn', 'npm'];\n\n for (const manager of managers) {\n try {\n await execa(manager, ['--version']);\n return manager;\n } catch {\n // Continue to next manager\n }\n }\n\n // Default to npm\n return 'npm';\n}\n\nexport async function getInstallCommand(packageManager: PackageManager): Promise<string[]> {\n switch (packageManager) {\n case 'yarn':\n return ['yarn', 'install'];\n case 'pnpm':\n return ['pnpm', 'install'];\n default:\n return ['npm', 'install'];\n }\n}\n\nexport async function getAddCommand(\n packageManager: PackageManager,\n packages: string[],\n dev = false\n): Promise<string[]> {\n const devFlag = dev ? (packageManager === 'npm' ? '--save-dev' : '-D') : '';\n\n switch (packageManager) {\n case 'yarn':\n return ['yarn', 'add', ...(dev ? ['-D'] : []), ...packages];\n case 'pnpm':\n return ['pnpm', 'add', ...(dev ? ['-D'] : []), ...packages];\n default:\n return ['npm', 'install', ...(devFlag ? [devFlag] : []), ...packages];\n }\n}\n\nexport async function getRunCommand(\n packageManager: PackageManager,\n script: string\n): Promise<string[]> {\n switch (packageManager) {\n case 'yarn':\n return ['yarn', script];\n case 'pnpm':\n return ['pnpm', script];\n default:\n return ['npm', 'run', script];\n }\n}\n\nexport async function isPackageManagerAvailable(packageManager: PackageManager): Promise<boolean> {\n try {\n await execa(packageManager, ['--version']);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getPackageManagerDisplayName(packageManager: PackageManager): string {\n switch (packageManager) {\n case 'yarn':\n return 'Yarn';\n case 'pnpm':\n return 'pnpm';\n default:\n return 'npm';\n }\n}\n","import execa from 'execa';\nimport path from 'path';\nimport fs from 'fs-extra';\nimport { logger } from './logger';\n\nexport async function initializeGit(projectPath: string): Promise<void> {\n try {\n // Check if git is available\n await execa('git', ['--version']);\n\n // Initialize git repository\n await execa('git', ['init'], { cwd: projectPath });\n\n // Add all files\n await execa('git', ['add', '.'], { cwd: projectPath });\n\n // Create initial commit\n await execa('git', ['commit', '-m', 'Initial commit from @digilogiclabs/create-saas-app'], {\n cwd: projectPath,\n });\n\n logger.debug('Git repository initialized successfully');\n } catch (error) {\n logger.warn('Git initialization failed. You can initialize it manually later.');\n logger.debug('Git error:', error);\n }\n}\n\nexport async function isGitRepository(projectPath: string): Promise<boolean> {\n try {\n const gitDir = path.join(projectPath, '.git');\n return await fs.pathExists(gitDir);\n } catch {\n return false;\n }\n}\n\nexport async function getGitUserInfo(): Promise<{ name?: string; email?: string }> {\n try {\n const [nameResult, emailResult] = await Promise.allSettled([\n execa('git', ['config', '--global', 'user.name']),\n execa('git', ['config', '--global', 'user.email']),\n ]);\n\n return {\n name: nameResult.status === 'fulfilled' ? nameResult.value.stdout : undefined,\n email: emailResult.status === 'fulfilled' ? emailResult.value.stdout : undefined,\n };\n } catch {\n return {};\n }\n}\n\nexport async function hasGitChanges(projectPath: string): Promise<boolean> {\n try {\n const result = await execa('git', ['status', '--porcelain'], { cwd: projectPath });\n return result.stdout.trim().length > 0;\n } catch {\n return false;\n }\n}\n\nexport async function commitChanges(projectPath: string, message: string): Promise<void> {\n try {\n await execa('git', ['add', '.'], { cwd: projectPath });\n await execa('git', ['commit', '-m', message], { cwd: projectPath });\n } catch (error) {\n logger.warn('Failed to commit changes');\n logger.debug('Git commit error:', error);\n }\n}\n","import { logger } from '../utils/logger';\nimport { spinner } from '../utils/spinner';\n\ninterface AddOptions {\n provider?: string;\n}\n\nexport async function addFeature(feature: string, _options: AddOptions = {}) {\n try {\n logger.title(`Adding ${feature} feature`);\n\n const validFeatures = [\n 'auth',\n 'billing',\n 'analytics',\n 'teams',\n 'notifications',\n 'admin',\n 'api',\n 'docs',\n ];\n\n if (!validFeatures.includes(feature)) {\n logger.error(`Invalid feature: ${feature}`);\n logger.info('Available features:');\n logger.list(validFeatures);\n process.exit(1);\n }\n\n const addSpinner = spinner(`Adding ${feature} feature...`);\n\n // Simulate feature addition (placeholder for now)\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n addSpinner.succeed(`${feature} feature added successfully`);\n\n logger.newLine();\n logger.success('Feature added successfully!');\n logger.info(\"Don't forget to update your environment variables if needed.\");\n } catch (error) {\n logger.error('Failed to add feature:');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import { logger } from '../utils/logger';\nimport { spinner } from '../utils/spinner';\nimport { detectPackageManager, getAddCommand } from '../utils/package-manager';\nimport execa from 'execa';\n\ninterface UpdateOptions {\n check?: boolean;\n}\n\nconst DIGILOGIC_PACKAGES = [\n '@digilogiclabs/saas-factory-ui',\n '@digilogiclabs/saas-factory-auth',\n '@digilogiclabs/saas-factory-billing',\n '@digilogiclabs/saas-factory-analytics',\n];\n\nexport async function updateDependencies(options: UpdateOptions = {}) {\n try {\n logger.title('Updating Digi Logic Labs dependencies');\n\n const packageManager = await detectPackageManager();\n logger.info(`Using package manager: ${packageManager}`);\n\n if (options.check) {\n const checkSpinner = spinner('Checking for updates...');\n\n // Check for outdated packages\n try {\n const result = await execa(packageManager, ['outdated', ...DIGILOGIC_PACKAGES], {\n reject: false,\n });\n\n checkSpinner.succeed('Update check completed');\n\n if (result.stdout) {\n logger.info('Available updates:');\n logger.log(result.stdout);\n } else {\n logger.success('All Digi Logic Labs packages are up to date!');\n }\n } catch (error) {\n checkSpinner.fail('Failed to check for updates');\n throw error;\n }\n } else {\n const updateSpinner = spinner('Updating packages...');\n\n try {\n // Update packages\n const command = await getAddCommand(packageManager, DIGILOGIC_PACKAGES);\n await execa(command[0], command.slice(1), {\n stdio: 'inherit',\n });\n\n updateSpinner.succeed('Packages updated successfully');\n\n logger.newLine();\n logger.success('All Digi Logic Labs packages have been updated!');\n logger.info(\"Don't forget to test your application after updating.\");\n } catch (error) {\n updateSpinner.fail('Failed to update packages');\n throw error;\n }\n }\n } catch (error) {\n logger.error('Failed to update dependencies:');\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","{\r\n \"name\": \"@digilogiclabs/create-saas-app\",\r\n \"version\": \"1.5.0\",\r\n \"description\": \"Create modern SaaS applications with Digi Logic Labs packages\",\r\n \"main\": \"dist/index.js\",\r\n \"bin\": {\r\n \"create-saas-app\": \"bin/index.js\"\r\n },\r\n \"scripts\": {\r\n \"build\": \"tsup\",\r\n \"dev\": \"tsup --watch\",\r\n \"test\": \"jest\",\r\n \"test:templates\": \"tsx scripts/test-all-templates.ts\",\r\n \"lint\": \"eslint src\",\r\n \"lint:fix\": \"eslint src --fix\",\r\n \"type-check\": \"tsc --noEmit\",\r\n \"validate\": \"tsx scripts/validate-templates.ts\",\r\n \"changeset\": \"changeset\",\r\n \"version\": \"changeset version\",\r\n \"release\": \"npm run build && changeset publish\",\r\n \"prepublishOnly\": \"npm run build && npm run lint && npm run type-check\"\r\n },\r\n \"keywords\": [\r\n \"cli\",\r\n \"saas\",\r\n \"template\",\r\n \"nextjs\",\r\n \"react-native\",\r\n \"expo\",\r\n \"typescript\",\r\n \"tailwind\",\r\n \"firebase\",\r\n \"supabase\",\r\n \"digilogiclabs\"\r\n ],\r\n \"author\": \"Digi Logic Labs\",\r\n \"license\": \"MIT\",\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"git+https://github.com/DigiLogicLabs/create-saas-app.git\"\r\n },\r\n \"bugs\": {\r\n \"url\": \"https://github.com/DigiLogicLabs/create-saas-app/issues\"\r\n },\r\n \"homepage\": \"https://github.com/DigiLogicLabs/create-saas-app#readme\",\r\n \"files\": [\r\n \"dist\",\r\n \"bin\",\r\n \"src/templates\",\r\n \"README.md\",\r\n \"CHANGELOG.md\",\r\n \"LICENSE\"\r\n ],\r\n \"engines\": {\r\n \"node\": \">=18.0.0\"\r\n },\r\n \"dependencies\": {\r\n \"chalk\": \"^4.1.2\",\r\n \"commander\": \"^11.1.0\",\r\n \"cosmiconfig\": \"^8.3.6\",\r\n \"execa\": \"^5.1.1\",\r\n \"fs-extra\": \"^11.1.1\",\r\n \"glob\": \"^10.3.10\",\r\n \"inquirer\": \"^9.2.12\",\r\n \"listr2\": \"^7.0.2\",\r\n \"mustache\": \"^4.2.0\",\r\n \"ora\": \"^5.4.1\",\r\n \"semver\": \"^7.5.4\",\r\n \"validate-npm-package-name\": \"^5.0.0\",\r\n \"zod\": \"^3.22.4\"\r\n },\r\n \"devDependencies\": {\r\n \"@changesets/cli\": \"^2.26.2\",\r\n \"@supabase/supabase-js\": \"^2.39.2\",\r\n \"@types/fs-extra\": \"^11.0.4\",\r\n \"@types/inquirer\": \"^9.0.7\",\r\n \"@types/jest\": \"^29.5.6\",\r\n \"@types/mustache\": \"^4.2.5\",\r\n \"@types/node\": \"^20.8.7\",\r\n \"@types/semver\": \"^7.5.4\",\r\n \"@types/validate-npm-package-name\": \"^4.0.2\",\r\n \"eslint\": \"^8.57.1\",\r\n \"eslint-config-prettier\": \"^9.1.2\",\r\n \"eslint-plugin-prettier\": \"^5.5.4\",\r\n \"firebase\": \"^10.7.1\",\r\n \"globals\": \"^16.3.0\",\r\n \"jest\": \"^29.7.0\",\r\n \"prettier\": \"^3.0.3\",\r\n \"ts-jest\": \"^29.1.1\",\r\n \"tsup\": \"^7.2.0\",\r\n \"tsx\": \"^3.14.0\",\r\n \"typescript\": \"^5.2.2\",\r\n \"typescript-eslint\": \"^8.40.0\"\r\n },\r\n \"peerDependencies\": {\r\n \"typescript\": \">=4.9.0\"\r\n },\r\n \"publishConfig\": {\r\n \"access\": \"public\"\r\n },\r\n \"directories\": {\r\n \"doc\": \"docs\",\r\n \"test\": \"tests\"\r\n }\r\n}\r\n"],"mappings":"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","names":["import_path","chalk","import_chalk","ora","chalk","validateNpmPackageName","fs","path","semver","answers","inquirer","import_path","import_fs_extra","path","fs","mustache","import_path","import_fs_extra","import_execa","import_execa","import_fs_extra","import_path","fs","path","execa","execa","path","fs","execa","import_execa","import_fs_extra","execa","path","import_execa","execa"]}
|
|
@@ -4,16 +4,19 @@
|
|
|
4
4
|
"description": "{{description}}",
|
|
5
5
|
"private": true,
|
|
6
6
|
"scripts": {
|
|
7
|
-
"dev": "next dev",
|
|
7
|
+
"dev": "next dev --turbo",
|
|
8
8
|
"build": "next build",
|
|
9
9
|
"start": "next start",
|
|
10
10
|
"lint": "next lint",
|
|
11
|
-
"type-check": "tsc --noEmit"
|
|
11
|
+
"type-check": "tsc --noEmit",
|
|
12
|
+
"test": "vitest",
|
|
13
|
+
"test:ui": "vitest --ui",
|
|
14
|
+
"test:run": "vitest run"
|
|
12
15
|
},
|
|
13
16
|
"dependencies": {
|
|
14
|
-
"next": "^
|
|
15
|
-
"react": "^
|
|
16
|
-
"react-dom": "^
|
|
17
|
+
"next": "^15.0.0",
|
|
18
|
+
"react": "^19.0.0",
|
|
19
|
+
"react-dom": "^19.0.0",
|
|
17
20
|
"@digilogiclabs/saas-factory-ui": "^0.7.2",
|
|
18
21
|
"@digilogiclabs/saas-factory-auth": "^0.4.3",
|
|
19
22
|
"@digilogiclabs/saas-factory-payments": "^0.2.0",
|
|
@@ -26,21 +29,28 @@
|
|
|
26
29
|
"next-themes": "^0.2.1",
|
|
27
30
|
"@radix-ui/react-slot": "^1.0.2",
|
|
28
31
|
"tailwindcss-animate": "^1.0.7",
|
|
29
|
-
"lucide-react": "^0.
|
|
32
|
+
"lucide-react": "^0.542.0",
|
|
33
|
+
"zod": "^3.22.4",
|
|
30
34
|
"firebase": "^10.0.0",
|
|
31
35
|
"@supabase/supabase-js": "^2.0.0"
|
|
32
36
|
},
|
|
33
37
|
"devDependencies": {
|
|
34
38
|
"typescript": "^5.0.0",
|
|
35
39
|
"@types/node": "^20.0.0",
|
|
36
|
-
"@types/react": "^
|
|
37
|
-
"@types/react-dom": "^
|
|
40
|
+
"@types/react": "^19.0.0",
|
|
41
|
+
"@types/react-dom": "^19.0.0",
|
|
38
42
|
"eslint": "^8.0.0",
|
|
39
|
-
"eslint-config-next": "^
|
|
43
|
+
"eslint-config-next": "^15.0.0",
|
|
40
44
|
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
41
45
|
"@typescript-eslint/parser": "^6.0.0",
|
|
42
46
|
"prettier": "^3.0.0",
|
|
43
|
-
"prettier-plugin-tailwindcss": "^0.5.0"
|
|
47
|
+
"prettier-plugin-tailwindcss": "^0.5.0",
|
|
48
|
+
"vitest": "^1.0.0",
|
|
49
|
+
"@vitejs/plugin-react": "^4.0.0",
|
|
50
|
+
"@testing-library/react": "^14.0.0",
|
|
51
|
+
"@testing-library/jest-dom": "^6.0.0",
|
|
52
|
+
"@testing-library/user-event": "^14.0.0",
|
|
53
|
+
"jsdom": "^24.0.0"
|
|
44
54
|
},
|
|
45
55
|
"engines": {
|
|
46
56
|
"node": ">=18.0.0"
|