@digilogiclabs/create-saas-app 1.1.2 → 1.4.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 +7 -7
- package/README.md +46 -22
- package/bin/index.js +36 -36
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.js +59 -15
- package/dist/index.js.map +1 -1
- package/dist/templates/mobile/base/template/.env.example +15 -15
- package/dist/templates/mobile/base/template/app/checkout.tsx +20 -20
- package/dist/templates/web/base/template/src/app/checkout/page.tsx +28 -28
- package/dist/templates/web/ui-auth/template/next.config.js +12 -0
- package/dist/templates/web/ui-auth/template/package.json +40 -0
- package/dist/templates/web/ui-auth/template/postcss.config.js +7 -0
- package/dist/templates/web/ui-auth/template/src/app/auth/callback/route.ts +12 -0
- package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth}/template/src/app/checkout/page.tsx +25 -28
- package/dist/templates/web/ui-auth/template/src/app/globals.css +42 -0
- package/dist/templates/web/ui-auth/template/src/app/layout.tsx +29 -0
- package/dist/templates/web/ui-auth/template/src/app/login/page.tsx +109 -0
- package/dist/templates/web/ui-auth/template/src/app/page.tsx +129 -0
- package/dist/templates/web/ui-auth/template/src/app/signup/page.tsx +128 -0
- package/dist/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +25 -0
- package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth}/template/src/components/shared/header.tsx +17 -8
- package/dist/templates/web/ui-auth/template/src/components/ui/badge.tsx +36 -0
- package/dist/templates/web/ui-auth/template/src/lib/utils.ts +7 -0
- package/dist/templates/web/ui-auth/template/tailwind.config.js +77 -0
- package/dist/templates/web/ui-auth/template/tsconfig.json +33 -0
- package/dist/templates/web/ui-auth-payments/template/README.md +165 -0
- package/dist/templates/web/ui-auth-payments/template/next.config.js +12 -0
- package/dist/templates/web/ui-auth-payments/template/package.json +42 -0
- package/dist/templates/web/ui-auth-payments/template/postcss.config.js +7 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/auth/callback/route.ts +12 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +211 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +142 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/globals.css +42 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/layout.tsx +29 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/login/page.tsx +109 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/page.tsx +143 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +128 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +28 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +60 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/ui/badge.tsx +36 -0
- package/dist/templates/web/ui-auth-payments/template/src/lib/utils.ts +7 -0
- package/dist/templates/web/ui-auth-payments/template/tailwind.config.js +77 -0
- package/dist/templates/web/ui-auth-payments/template/tsconfig.json +33 -0
- package/dist/templates/web/ui-auth-payments-audio/template/README.md +187 -0
- package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-audio}/template/next.config.js +0 -3
- package/dist/templates/web/ui-auth-payments-audio/template/package.json +42 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/auth/callback/route.ts +12 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +211 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +142 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/login/page.tsx +109 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +181 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/signup/page.tsx +128 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +28 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +60 -0
- package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-audio}/template/tailwind.config.js +1 -1
- package/dist/templates/web/ui-auth-payments-video/template/README.md +190 -0
- package/dist/templates/web/{web-ui-package → ui-auth-payments-video}/template/next.config.js +0 -3
- package/dist/templates/web/ui-auth-payments-video/template/package.json +42 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/auth/callback/route.ts +12 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +211 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +142 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +109 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/page.tsx +187 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +128 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +28 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +60 -0
- package/dist/templates/web/{web-ui-package → ui-auth-payments-video}/template/tailwind.config.js +1 -1
- package/dist/templates/web/ui-only/template/next.config.js +12 -0
- package/dist/templates/web/{web-ui-package → ui-only}/template/package.json +3 -3
- package/dist/templates/web/ui-only/template/postcss.config.js +7 -0
- package/dist/templates/web/ui-only/template/src/app/auth/callback/route.ts +12 -0
- package/dist/templates/web/{web-ui-package → ui-only}/template/src/app/checkout/page.tsx +25 -28
- package/dist/templates/web/ui-only/template/src/app/globals.css +42 -0
- package/dist/templates/web/ui-only/template/src/app/layout.tsx +29 -0
- package/dist/templates/web/ui-only/template/src/app/login/page.tsx +63 -0
- package/dist/templates/web/ui-only/template/src/app/signup/page.tsx +79 -0
- package/dist/templates/web/ui-only/template/src/components/providers/app-providers.tsx +22 -0
- package/dist/templates/web/{web-ui-package → ui-only}/template/src/components/shared/header.tsx +17 -8
- package/dist/templates/web/ui-only/template/src/components/ui/badge.tsx +36 -0
- package/dist/templates/web/ui-only/template/src/lib/utils.ts +7 -0
- package/dist/templates/web/ui-only/template/tailwind.config.js +77 -0
- package/dist/templates/web/ui-only/template/tsconfig.json +33 -0
- package/dist/templates/web/ui-package-test/template/package.json +2 -2
- package/package.json +1 -1
- package/src/templates/mobile/base/template/.env.example +15 -15
- package/src/templates/mobile/base/template/app/checkout.tsx +20 -20
- package/src/templates/web/base/template/src/app/checkout/page.tsx +28 -28
- package/src/templates/web/ui-auth/template/README.md +68 -0
- package/src/templates/web/ui-auth/template/next.config.js +12 -0
- package/src/templates/web/ui-auth/template/package.json +40 -0
- package/src/templates/web/ui-auth/template/postcss.config.js +7 -0
- package/src/templates/web/ui-auth/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-auth/template/src/app/checkout/page.tsx +25 -0
- package/src/templates/web/ui-auth/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-auth/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-auth/template/src/app/login/page.tsx +109 -0
- package/src/templates/web/ui-auth/template/src/app/page.tsx +129 -0
- package/src/templates/web/ui-auth/template/src/app/signup/page.tsx +128 -0
- package/src/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +25 -0
- package/src/templates/web/ui-auth/template/src/components/shared/header.tsx +51 -0
- package/src/templates/web/ui-auth/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-auth/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-auth/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-auth/template/tsconfig.json +33 -0
- package/src/templates/web/ui-auth-payments/template/README.md +165 -0
- package/src/templates/web/ui-auth-payments/template/next.config.js +12 -0
- package/src/templates/web/ui-auth-payments/template/package.json +42 -0
- package/src/templates/web/ui-auth-payments/template/postcss.config.js +7 -0
- package/src/templates/web/ui-auth-payments/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +211 -0
- package/src/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +142 -0
- package/src/templates/web/ui-auth-payments/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-auth-payments/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-auth-payments/template/src/app/login/page.tsx +109 -0
- package/src/templates/web/ui-auth-payments/template/src/app/page.tsx +143 -0
- package/src/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +128 -0
- package/src/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +28 -0
- package/src/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +60 -0
- package/src/templates/web/ui-auth-payments/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-auth-payments/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-auth-payments/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-auth-payments/template/tsconfig.json +33 -0
- package/src/templates/web/ui-auth-payments-audio/template/README.md +187 -0
- package/src/templates/web/ui-auth-payments-audio/template/next.config.js +12 -0
- package/src/templates/web/ui-auth-payments-audio/template/package.json +42 -0
- package/src/templates/web/ui-auth-payments-audio/template/postcss.config.js +7 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +211 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +142 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/login/page.tsx +109 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +181 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/signup/page.tsx +128 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +28 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +60 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-auth-payments-audio/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-auth-payments-audio/template/tsconfig.json +33 -0
- package/src/templates/web/ui-auth-payments-video/template/README.md +190 -0
- package/src/templates/web/ui-auth-payments-video/template/next.config.js +12 -0
- package/src/templates/web/ui-auth-payments-video/template/package.json +42 -0
- package/src/templates/web/ui-auth-payments-video/template/postcss.config.js +7 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +211 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +142 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +109 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/page.tsx +187 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +128 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +28 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +60 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-auth-payments-video/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-auth-payments-video/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-auth-payments-video/template/tsconfig.json +33 -0
- package/src/templates/web/ui-only/template/.env.example +15 -0
- package/src/templates/web/ui-only/template/README.md +68 -0
- package/src/templates/web/ui-only/template/next.config.js +12 -0
- package/src/templates/web/{web-ui-package → ui-only}/template/package.json +3 -3
- package/src/templates/web/ui-only/template/postcss.config.js +7 -0
- package/src/templates/web/ui-only/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-only/template/src/app/checkout/page.tsx +25 -0
- package/src/templates/web/ui-only/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-only/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-only/template/src/app/login/page.tsx +63 -0
- package/src/templates/web/ui-only/template/src/app/signup/page.tsx +79 -0
- package/src/templates/web/ui-only/template/src/components/providers/app-providers.tsx +22 -0
- package/src/templates/web/ui-only/template/src/components/shared/header.tsx +51 -0
- package/src/templates/web/ui-only/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-only/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-only/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-only/template/tsconfig.json +33 -0
- package/src/templates/web/ui-only/template.backup/.env.example +15 -0
- package/{dist/mobile/base/template → src/templates/web/ui-only/template.backup.20250817}/.env.example +15 -15
- package/src/templates/web/ui-package-test/template/package.json +2 -2
- package/dist/templates/web/web-ui-package/template/src/app/auth/callback/route.ts +0 -18
- package/dist/templates/web/web-ui-package/template/src/app/login/page.tsx +0 -39
- package/dist/templates/web/web-ui-package/template/src/app/signup/page.tsx +0 -39
- package/dist/templates/web/web-ui-package/template/src/components/providers/app-providers.tsx +0 -29
- package/src/templates/web/web-ui-package/template/.eslintrc.js +0 -8
- package/src/templates/web/web-ui-package/template/src/app/auth/callback/route.ts +0 -18
- package/src/templates/web/web-ui-package/template/src/app/login/page.tsx +0 -39
- package/src/templates/web/web-ui-package/template/src/app/signup/page.tsx +0 -39
- package/src/templates/web/web-ui-package/template/src/components/providers/app-providers.tsx +0 -29
- /package/dist/{web/base → templates/web/ui-auth}/template/.env.example +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth}/template/.eslintrc.js +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth}/template/README.md +0 -0
- /package/dist/{web/base → templates/web/ui-auth}/template.backup/.env.example +0 -0
- /package/dist/{web/base → templates/web/ui-auth}/template.backup.20250817/.env.example +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments}/template/.env.example +0 -0
- /package/dist/templates/web/{web-ui-package/template.backup.20250817 → ui-auth-payments-audio/template}/.env.example +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/postcss.config.js +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/src/app/globals.css +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/src/app/layout.tsx +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/src/components/ui/badge.tsx +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/src/lib/utils.ts +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/tsconfig.json +0 -0
- /package/dist/templates/web/{web-ui-package/template.backup → ui-auth-payments-video/template}/.env.example +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/postcss.config.js +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/src/app/globals.css +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/src/app/layout.tsx +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/src/components/ui/badge.tsx +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/src/lib/utils.ts +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/tsconfig.json +0 -0
- /package/dist/{web/ui-package-test → templates/web/ui-only}/template/.env.example +0 -0
- /package/dist/{web/base → templates/web/ui-only}/template/.eslintrc.js +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-only}/template/README.md +0 -0
- /package/dist/templates/web/{web-ui-package → ui-only}/template/src/app/page.tsx +0 -0
- /package/dist/{web/ui-package-test → templates/web/ui-only}/template.backup/.env.example +0 -0
- /package/dist/{web/ui-package-test → templates/web/ui-only}/template.backup.20250817/.env.example +0 -0
- /package/src/templates/web/{web-ui-package → ui-auth}/template/.env.example +0 -0
- /package/{dist/web/ui-package-test → src/templates/web/ui-auth}/template/.eslintrc.js +0 -0
- /package/src/templates/web/{web-ui-package → ui-auth}/template.backup/.env.example +0 -0
- /package/src/templates/web/{web-ui-package → ui-auth}/template.backup.20250817/.env.example +0 -0
- /package/{dist/web/web-ui-package → src/templates/web/ui-auth-payments}/template/.env.example +0 -0
- /package/{dist/web/web-ui-package/template.backup.20250817 → src/templates/web/ui-auth-payments-audio/template}/.env.example +0 -0
- /package/{dist/web/web-ui-package/template.backup → src/templates/web/ui-auth-payments-video/template}/.env.example +0 -0
- /package/{dist/web/web-ui-package → src/templates/web/ui-only}/template/.eslintrc.js +0 -0
- /package/src/templates/web/{web-ui-package → ui-only}/template/src/app/page.tsx +0 -0
package/dist/index.js
CHANGED
|
@@ -279,8 +279,24 @@ async function getProjectPrompts(initialConfig) {
|
|
|
279
279
|
return [
|
|
280
280
|
{ name: "\u{1F4C4} Base - Clean starter template", value: "base" },
|
|
281
281
|
{
|
|
282
|
-
name: "\u{1F4E6}
|
|
283
|
-
value: "
|
|
282
|
+
name: "\u{1F4E6} UI Only - With @digilogiclabs/saas-factory-ui (no auth)",
|
|
283
|
+
value: "ui-only"
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
name: "\u{1F510} UI + Auth - With UI components and authentication",
|
|
287
|
+
value: "ui-auth"
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
name: "\u{1F4B3} UI + Auth + Payments - Full SaaS with payments integration",
|
|
291
|
+
value: "ui-auth-payments"
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
name: "\u{1F3B5} Audio Player App - Full SaaS with audio streaming features",
|
|
295
|
+
value: "ui-auth-payments-audio"
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
name: "\u{1F3AC} Video Player App - Full SaaS with video streaming features",
|
|
299
|
+
value: "ui-auth-payments-video"
|
|
284
300
|
},
|
|
285
301
|
{ name: "\u{1F4CA} Dashboard - Admin dashboard with analytics", value: "dashboard" },
|
|
286
302
|
{ name: "\u{1F4BC} SaaS - Multi-tenant SaaS application", value: "saas" }
|
|
@@ -302,8 +318,8 @@ async function getProjectPrompts(initialConfig) {
|
|
|
302
318
|
name: "auth",
|
|
303
319
|
message: "Select authentication provider:",
|
|
304
320
|
choices: [
|
|
305
|
-
{ name: "\
|
|
306
|
-
{ name: "\
|
|
321
|
+
{ name: "\u26A1 Supabase - Open source alternative", value: "supabase" },
|
|
322
|
+
{ name: "\u{1F525} Firebase - Google's platform", value: "firebase" }
|
|
307
323
|
],
|
|
308
324
|
default: initialConfig.auth
|
|
309
325
|
},
|
|
@@ -364,7 +380,8 @@ var import_glob = require("glob");
|
|
|
364
380
|
var TemplateGenerator = class {
|
|
365
381
|
constructor(config) {
|
|
366
382
|
this.config = config;
|
|
367
|
-
|
|
383
|
+
const isDev = __dirname.includes("/src/");
|
|
384
|
+
this.templatesDir = isDev ? import_path2.default.join(__dirname, "..", "templates") : import_path2.default.join(__dirname, "templates");
|
|
368
385
|
this.context = this.createTemplateContext();
|
|
369
386
|
}
|
|
370
387
|
createTemplateContext() {
|
|
@@ -395,17 +412,40 @@ var TemplateGenerator = class {
|
|
|
395
412
|
};
|
|
396
413
|
}
|
|
397
414
|
getDependencies() {
|
|
398
|
-
const baseDeps = {
|
|
399
|
-
|
|
400
|
-
"
|
|
401
|
-
|
|
415
|
+
const baseDeps = {};
|
|
416
|
+
if ([
|
|
417
|
+
"ui-only",
|
|
418
|
+
"ui-auth",
|
|
419
|
+
"ui-auth-payments",
|
|
420
|
+
"ui-auth-payments-audio",
|
|
421
|
+
"ui-auth-payments-video"
|
|
422
|
+
].includes(this.config.template)) {
|
|
423
|
+
baseDeps["@digilogiclabs/saas-factory-ui"] = "^0.11.1";
|
|
424
|
+
}
|
|
425
|
+
if (["ui-auth", "ui-auth-payments", "ui-auth-payments-audio", "ui-auth-payments-video"].includes(
|
|
426
|
+
this.config.template
|
|
427
|
+
)) {
|
|
428
|
+
baseDeps["@digilogiclabs/saas-factory-auth"] = "^1.0.0";
|
|
429
|
+
}
|
|
430
|
+
if (["ui-auth-payments", "ui-auth-payments-audio", "ui-auth-payments-video"].includes(
|
|
431
|
+
this.config.template
|
|
432
|
+
)) {
|
|
433
|
+
baseDeps["@digilogiclabs/saas-factory-payments"] = "^1.0.0";
|
|
434
|
+
}
|
|
402
435
|
if (this.config.platform === "web" || this.config.platform === "both") {
|
|
403
436
|
Object.assign(baseDeps, {
|
|
404
|
-
next: "^
|
|
405
|
-
react: "^
|
|
406
|
-
"react-dom": "^
|
|
437
|
+
next: "^15.0.0",
|
|
438
|
+
react: "^19.0.0",
|
|
439
|
+
"react-dom": "^19.0.0",
|
|
407
440
|
tailwindcss: "^3.3.0",
|
|
408
|
-
typescript: "^5.0.0"
|
|
441
|
+
typescript: "^5.0.0",
|
|
442
|
+
clsx: "^2.0.0",
|
|
443
|
+
"class-variance-authority": "^0.7.0",
|
|
444
|
+
"tailwind-merge": "^2.0.0",
|
|
445
|
+
"next-themes": "^0.2.1",
|
|
446
|
+
"lucide-react": "^0.292.0",
|
|
447
|
+
autoprefixer: "^10.4.16",
|
|
448
|
+
postcss: "^8.4.31"
|
|
409
449
|
});
|
|
410
450
|
}
|
|
411
451
|
if (this.config.platform === "mobile" || this.config.platform === "both") {
|
|
@@ -515,6 +555,10 @@ var TemplateGenerator = class {
|
|
|
515
555
|
}
|
|
516
556
|
}
|
|
517
557
|
async copySharedResources(outputPath) {
|
|
558
|
+
if (this.config.template === "ui-only") {
|
|
559
|
+
logger.debug("Skipping shared resources for UI-only template");
|
|
560
|
+
return;
|
|
561
|
+
}
|
|
518
562
|
const sharedPath = import_path2.default.join(this.templatesDir, "shared");
|
|
519
563
|
const authPath = import_path2.default.join(sharedPath, "auth", this.config.auth);
|
|
520
564
|
await this.copyAndProcessFiles(authPath, outputPath);
|
|
@@ -792,7 +836,7 @@ async function createProject(platform, template, name, options = {}) {
|
|
|
792
836
|
platform,
|
|
793
837
|
template: template || "base",
|
|
794
838
|
name: name || "my-saas-app",
|
|
795
|
-
auth: options.auth || "
|
|
839
|
+
auth: options.auth || "supabase",
|
|
796
840
|
database: options.database || "supabase",
|
|
797
841
|
theme: options.theme || "default",
|
|
798
842
|
install: options.install !== false,
|
|
@@ -963,7 +1007,7 @@ async function updateDependencies(options = {}) {
|
|
|
963
1007
|
// package.json
|
|
964
1008
|
var package_default = {
|
|
965
1009
|
name: "@digilogiclabs/create-saas-app",
|
|
966
|
-
version: "1.
|
|
1010
|
+
version: "1.4.0",
|
|
967
1011
|
description: "Create modern SaaS applications with Digi Logic Labs packages",
|
|
968
1012
|
main: "dist/index.js",
|
|
969
1013
|
bin: {
|
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: '📦 Web UI Package - With @digilogiclabs/saas-factory-ui',\n value: 'web-ui-package',\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 this.templatesDir = __dirname;\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 '@digilogiclabs/saas-factory-ui': '^1.0.0',\n '@digilogiclabs/saas-factory-auth': '^1.0.0',\n };\n\n if (this.config.platform === 'web' || this.config.platform === 'both') {\n Object.assign(baseDeps, {\n next: '^14.0.0',\n react: '^18.0.0',\n 'react-dom': '^18.0.0',\n tailwindcss: '^3.3.0',\n typescript: '^5.0.0',\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 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.1.2\",\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAwB;;;ACAxB,IAAAA,eAAiB;;;ACAjB,mBAAkB;AAEX,IAAM,SAAS;AAAA,EACpB,MAAM,CAAC,YAAoB,SAAgB;AACzC,YAAQ,IAAI,aAAAC,QAAM,KAAK,QAAG,GAAG,SAAS,GAAG,IAAI;AAAA,EAC/C;AAAA,EAEA,SAAS,CAAC,YAAoB,SAAgB;AAC5C,YAAQ,IAAI,aAAAA,QAAM,MAAM,QAAG,GAAG,SAAS,GAAG,IAAI;AAAA,EAChD;AAAA,EAEA,MAAM,CAAC,YAAoB,SAAgB;AACzC,YAAQ,IAAI,aAAAA,QAAM,OAAO,QAAG,GAAG,SAAS,GAAG,IAAI;AAAA,EACjD;AAAA,EAEA,OAAO,CAAC,YAAoB,SAAgB;AAC1C,YAAQ,IAAI,aAAAA,QAAM,IAAI,QAAG,GAAG,SAAS,GAAG,IAAI;AAAA,EAC9C;AAAA,EAEA,OAAO,CAAC,YAAoB,SAAgB;AAC1C,QAAI,QAAQ,IAAI,OAAO;AACrB,cAAQ,IAAI,aAAAA,QAAM,KAAK,WAAI,GAAG,SAAS,GAAG,IAAI;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,KAAK,CAAC,YAAoB,SAAgB;AACxC,YAAQ,IAAI,SAAS,GAAG,IAAI;AAAA,EAC9B;AAAA,EAEA,SAAS,MAAM;AACb,YAAQ,IAAI;AAAA,EACd;AAAA,EAEA,SAAS,MAAM;AACb,YAAQ,IAAI,aAAAA,QAAM,KAAK,SAAI,OAAO,EAAE,CAAC,CAAC;AAAA,EACxC;AAAA,EAEA,OAAO,CAAC,YAAoB;AAC1B,YAAQ,IAAI;AACZ,YAAQ,IAAI,aAAAA,QAAM,KAAK,KAAK,OAAO,CAAC;AACpC,YAAQ,IAAI,aAAAA,QAAM,KAAK,SAAI,OAAO,QAAQ,MAAM,CAAC,CAAC;AAAA,EACpD;AAAA,EAEA,MAAM,CAAC,MAAc,OAAe,YAAoB;AACtD,YAAQ,IAAI,aAAAA,QAAM,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,GAAG,OAAO;AAAA,EACvD;AAAA,EAEA,WAAW,CAAC,YAAoB;AAC9B,YAAQ,IAAI,aAAAA,QAAM,KAAK,QAAQ,OAAO,CAAC;AAAA,EACzC;AAAA,EAEA,MAAM,CAAC,SAAiB;AACtB,YAAQ,IAAI,aAAAA,QAAM,KAAK,OAAO,IAAI,CAAC;AAAA,EACrC;AAAA,EAEA,MAAM,CAAC,UAAoB;AACzB,UAAM,QAAQ,CAAC,SAAS;AACtB,cAAQ,IAAI,aAAAA,QAAM,KAAK,UAAK,GAAG,IAAI;AAAA,IACrC,CAAC;AAAA,EACH;AACF;;;AC5DA,iBAAyB;AACzB,IAAAC,gBAAkB;AAEX,SAAS,QAAQ,MAAmB;AACzC,aAAO,WAAAC,SAAI;AAAA,IACT,MAAM,cAAAC,QAAM,KAAK,IAAI;AAAA,IACrB,SAAS;AAAA,IACT,OAAO;AAAA,EACT,CAAC,EAAE,MAAM;AACX;;;ACTA,uCAAmC;AACnC,kBAAiB;AACjB,sBAAe;AAGR,SAAS,oBAAoB,MAAuB;AAEzD,MAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,WAAW,GAAG;AACrC,WAAO,MAAM,8BAA8B;AAC3C,WAAO;AAAA,EACT;AAGA,QAAM,iBAAa,iCAAAC,SAAuB,IAAI;AAE9C,MAAI,CAAC,WAAW,qBAAqB;AACnC,WAAO,MAAM,uBAAuB;AAEpC,QAAI,WAAW,QAAQ;AACrB,iBAAW,OAAO,QAAQ,CAAC,UAAU,OAAO,MAAM,YAAO,KAAK,EAAE,CAAC;AAAA,IACnE;AAEA,QAAI,WAAW,UAAU;AACvB,iBAAW,SAAS,QAAQ,CAAC,YAAY,OAAO,KAAK,YAAO,OAAO,EAAE,CAAC;AAAA,IACxE;AAEA,WAAO;AAAA,EACT;AAGA,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,cAAc,SAAS,KAAK,YAAY,CAAC,GAAG;AAC9C,WAAO,MAAM,iBAAiB,IAAI,gDAAgD;AAClF,WAAO;AAAA,EACT;AAGA,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAO,MAAM,sCAAsC;AACnD,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAO,MAAM,yCAAyC;AACtD,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,GAAG,GAAG;AACtB,WAAO,MAAM,uCAAuC;AACpD,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,IAAI,GAAG;AACvB,WAAO,MAAM,8CAA8C;AAC3D,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,IAAI,GAAG;AACvB,WAAO,MAAM,iDAAiD;AAC9D,WAAO;AAAA,EACT;AAGA,MAAI,KAAK,SAAS,KAAK;AACrB,WAAO,MAAM,+CAA+C;AAC5D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAsB,oBAAoB,aAAuC;AAC/E,MAAI;AAEF,QAAI,MAAM,gBAAAC,QAAG,WAAW,WAAW,GAAG;AACpC,YAAM,QAAQ,MAAM,gBAAAA,QAAG,KAAK,WAAW;AAEvC,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,QAAQ,MAAM,gBAAAA,QAAG,QAAQ,WAAW;AAE1C,YAAI,MAAM,SAAS,GAAG;AACpB,iBAAO,MAAM,cAAc,YAAAC,QAAK,SAAS,WAAW,CAAC,mCAAmC;AACxF,iBAAO;AAAA,QACT;AAAA,MACF,OAAO;AACL,eAAO,MAAM,yBAAyB,YAAAA,QAAK,SAAS,WAAW,CAAC,kBAAkB;AAClF,eAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,YAAY,YAAAA,QAAK,QAAQ,WAAW;AAE1C,QAAI;AACF,YAAM,gBAAAD,QAAG,OAAO,WAAW,gBAAAA,QAAG,UAAU,IAAI;AAAA,IAC9C,QAAQ;AACN,aAAO,MAAM,8BAA8B,SAAS,GAAG;AACvD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,MAAM,oCAAoC,KAAK;AACtD,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,MAAsB;AACxD,SAAO,KACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,QAAQ,OAAO,GAAG;AACvB;AAEO,SAAS,mBAAmB,MAAsB;AACvD,QAAM,YAAY,oBAAoB,IAAI;AAE1C,MAAI,oBAAoB,SAAS,GAAG;AAClC,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,MAAM,SAAS;AAEjC,MAAI,oBAAoB,SAAS,GAAG;AAClC,WAAO;AAAA,EACT;AAGA,SAAO;AACT;;;ACpKA,oBAAmB;AACnB,mBAAkB;AAUlB,eAAsB,sBAAwC;AAC5D,QAAM,cAAc,QAAQ;AAC5B,QAAM,aAAa;AAEnB,MAAI,CAAC,cAAAE,QAAO,IAAI,aAAa,UAAU,GAAG;AACxC,WAAO;AAAA,MACL,mBAAmB,UAAU,4CAA4C,WAAW;AAAA,IACtF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACvBA,sBAAqB;AAKrB,eAAsB,kBAAkB,eAAsD;AAC5F,SAAO,MAAM,wCAA4B;AAEzC,QAAM,YAAY;AAAA,IAChB;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,cAAc;AAAA,MACvB,UAAU,CAAC,UAAkB;AAC3B,YAAI,CAAC,oBAAoB,KAAK,GAAG;AAC/B,gBAAM,aAAa,mBAAmB,KAAK;AAC3C,iBAAO,8BAA8B,UAAU;AAAA,QACjD;AACA,eAAO;AAAA,MACT;AAAA,MACA,QAAQ,CAAC,UAAkB,MAAM,KAAK;AAAA,IACxC;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,2BAAoB,OAAO,MAAM;AAAA,QACzC,EAAE,MAAM,2BAAoB,OAAO,SAAS;AAAA,QAC5C,EAAE,MAAM,+BAAwB,OAAO,OAAO;AAAA,MAChD;AAAA,MACA,SAAS,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAACC,aAAiB;AACzB,YAAIA,SAAQ,aAAa,OAAO;AAC9B,iBAAO;AAAA,YACL,EAAE,MAAM,2CAAoC,OAAO,OAAO;AAAA,YAC1D;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,YACA,EAAE,MAAM,wDAAiD,OAAO,YAAY;AAAA,YAC5E,EAAE,MAAM,kDAA2C,OAAO,OAAO;AAAA,UACnE;AAAA,QACF,WAAWA,SAAQ,aAAa,UAAU;AACxC,iBAAO;AAAA,YACL,EAAE,MAAM,sCAA+B,OAAO,OAAO;AAAA,YACrD,EAAE,MAAM,mCAA4B,OAAO,OAAO;AAAA,YAClD,EAAE,MAAM,sCAA+B,OAAO,QAAQ;AAAA,UACxD;AAAA,QACF,OAAO;AACL,iBAAO,CAAC,EAAE,MAAM,yCAAkC,OAAO,OAAO,CAAC;AAAA,QACnE;AAAA,MACF;AAAA,MACA,SAAS,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,0CAAmC,OAAO,WAAW;AAAA,QAC7D,EAAE,MAAM,6CAAwC,OAAO,WAAW;AAAA,MACpE;AAAA,MACA,SAAS,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAACA,aAAiB;AAEzB,cAAM,UAAU;AAAA,UACd,EAAE,MAAM,+CAA0C,OAAO,WAAW;AAAA,UACpE,EAAE,MAAM,6CAAsC,OAAO,WAAW;AAAA,QAClE;AAGA,YAAIA,SAAQ,SAAS,YAAY;AAC/B,iBAAO,QAAQ,QAAQ;AAAA,QACzB;AAEA,eAAO;AAAA,MACT;AAAA,MACA,SAAS,CAACA,aAAiB;AAEzB,eAAOA,SAAQ,SAAS,aAAa,aAAa;AAAA,MACpD;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,wCAAiC,OAAO,UAAU;AAAA,QAC1D,EAAE,MAAM,qDAA8C,OAAO,YAAY;AAAA,QACzE,EAAE,MAAM,2CAAoC,OAAO,UAAU;AAAA,MAC/D;AAAA,MACA,SAAS,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,cAAc;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,gBAAAC,QAAS,OAAO,SAAS;AAE/C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;;;AC7HA,IAAAC,eAAiB;AACjB,IAAAC,mBAAe;AACf,sBAAqB;AACrB,kBAAqB;AAwBd,IAAM,oBAAN,MAAwB;AAAA,EAK7B,YAAY,QAAuB;AACjC,SAAK,SAAS;AACd,SAAK,eAAe;AACpB,SAAK,UAAU,KAAK,sBAAsB;AAAA,EAC5C;AAAA,EAEQ,wBAAyC;AAC/C,UAAM,cAAc,KAAK,OAAO;AAChC,UAAM,cAAc,YAAY,YAAY,EAAE,QAAQ,eAAe,GAAG;AACxE,UAAM,YAAY,KAAK,aAAa,WAAW;AAC/C,UAAM,gBAAgB,KAAK,YAAY,WAAW;AAClD,UAAM,gBAAgB;AACtB,UAAM,gBAAgB,KAAK,YAAY,WAAW;AAElD,WAAO;AAAA,MACL;AAAA,MACA,UAAU,KAAK,OAAO;AAAA,MACtB,UAAU,KAAK,OAAO;AAAA,MACtB,MAAM,KAAK,OAAO;AAAA,MAClB,UAAU,KAAK,OAAO;AAAA,MACtB,OAAO,KAAK,OAAO;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC7B,cAAc,KAAK,gBAAgB;AAAA,MACnC,iBAAiB,KAAK,mBAAmB;AAAA,MACzC,SAAS,KAAK,WAAW;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,kBAA0C;AAChD,UAAM,WAAmC;AAAA,MACvC,kCAAkC;AAAA,MAClC,oCAAoC;AAAA,IACtC;AAEA,QAAI,KAAK,OAAO,aAAa,SAAS,KAAK,OAAO,aAAa,QAAQ;AACrE,aAAO,OAAO,UAAU;AAAA,QACtB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,aAAa;AAAA,QACb,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,OAAO,aAAa,YAAY,KAAK,OAAO,aAAa,QAAQ;AACxE,aAAO,OAAO,UAAU;AAAA,QACtB,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,sBAAsB;AAAA,MACxB,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,OAAO,SAAS,YAAY;AACnC,eAAS,UAAU,IAAI;AAAA,IACzB,WAAW,KAAK,OAAO,SAAS,YAAY;AAC1C,eAAS,uBAAuB,IAAI;AAAA,IACtC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,qBAA6C;AACnD,UAAM,WAAW;AAAA,MACf,eAAe;AAAA,MACf,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAEA,QAAI,KAAK,OAAO,aAAa,SAAS,KAAK,OAAO,aAAa,QAAQ;AACrE,aAAO,OAAO,UAAU;AAAA,QACtB,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,QACpB,cAAc;AAAA,QACd,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAqC;AAC3C,UAAM,UAAkC,CAAC;AAEzC,QAAI,KAAK,OAAO,aAAa,SAAS,KAAK,OAAO,aAAa,QAAQ;AACrE,aAAO,OAAO,SAAS;AAAA,QACrB,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,OAAO,aAAa,YAAY,KAAK,OAAO,aAAa,QAAQ;AACxE,aAAO,OAAO,SAAS;AAAA,QACrB,OAAO;AAAA,QACP,SAAS;AAAA,QACT,KAAK;AAAA,QACL,KAAK;AAAA,MACP,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,SAAS,YAAmC;AACvD,QAAI;AAEF,YAAM,iBAAAC,QAAG,UAAU,UAAU;AAG7B,UAAI,KAAK,OAAO,aAAa,OAAO;AAClC,cAAM,KAAK,mBAAmB,UAAU;AAAA,MAC1C,WAAW,KAAK,OAAO,aAAa,UAAU;AAC5C,cAAM,KAAK,sBAAsB,UAAU;AAAA,MAC7C,WAAW,KAAK,OAAO,aAAa,QAAQ;AAC1C,cAAM,KAAK,mBAAmB,UAAU;AACxC,cAAM,KAAK,sBAAsB,aAAAC,QAAK,KAAK,YAAY,QAAQ,CAAC;AAAA,MAClE;AAGA,YAAM,KAAK,oBAAoB,UAAU;AAEzC,aAAO,MAAM,+BAA+B;AAAA,IAC9C,SAAS,OAAO;AACd,aAAO,MAAM,+BAA+B,KAAK;AACjD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,YAAmC;AAClE,UAAM,eAAe,aAAAA,QAAK,KAAK,KAAK,cAAc,OAAO,KAAK,OAAO,QAAQ;AAC7E,UAAM,KAAK,aAAa,cAAc,UAAU;AAAA,EAClD;AAAA,EAEA,MAAc,sBAAsB,YAAmC;AACrE,UAAM,eAAe,aAAAA,QAAK,KAAK,KAAK,cAAc,UAAU,KAAK,OAAO,QAAQ;AAChF,UAAM,KAAK,aAAa,cAAc,UAAU;AAAA,EAClD;AAAA,EAEA,MAAc,aAAa,cAAsB,YAAmC;AAClF,UAAM,cAAc,aAAAA,QAAK,KAAK,cAAc,UAAU;AAEtD,QAAI,CAAE,MAAM,iBAAAD,QAAG,WAAW,WAAW,GAAI;AACvC,YAAM,IAAI,MAAM,uBAAuB,WAAW,EAAE;AAAA,IACtD;AACA,UAAM,KAAK,oBAAoB,aAAa,UAAU;AAAA,EACxD;AAAA,EAEA,MAAc,oBAAoB,WAAmB,WAAkC;AACrF,QAAI,CAAE,MAAM,iBAAAA,QAAG,WAAW,SAAS,GAAI;AACrC,aAAO,MAAM,wCAAwC,SAAS,EAAE;AAChE;AAAA,IACF;AAEA,UAAM,QAAQ,UAAM,kBAAK,QAAQ;AAAA,MAC/B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AAED,eAAW,QAAQ,OAAO;AACxB,YAAM,aAAa,aAAAC,QAAK,KAAK,WAAW,IAAI;AAC5C,YAAM,aAAa,aAAAA,QAAK,KAAK,WAAW,IAAI;AAE5C,YAAM,iBAAAD,QAAG,UAAU,aAAAC,QAAK,QAAQ,UAAU,CAAC;AAE3C,YAAM,UAAU,MAAM,iBAAAD,QAAG,SAAS,YAAY,OAAO;AAErD,UAAI,KAAK,WAAW,IAAI,GAAG;AACzB,cAAM,mBAAmB,gBAAAE,QAAS,OAAO,SAAS,KAAK,OAAO;AAC9D,cAAM,iBAAAF,QAAG,UAAU,YAAY,gBAAgB;AAAA,MACjD,OAAO;AACL,cAAM,iBAAAA,QAAG,KAAK,YAAY,UAAU;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,YAAmC;AACnE,UAAM,aAAa,aAAAC,QAAK,KAAK,KAAK,cAAc,QAAQ;AAGxD,UAAM,WAAW,aAAAA,QAAK,KAAK,YAAY,QAAQ,KAAK,OAAO,IAAI;AAC/D,UAAM,KAAK,oBAAoB,UAAU,UAAU;AAGnD,UAAM,YAAY,aAAAA,QAAK,KAAK,YAAY,UAAU,KAAK,OAAO,KAAK;AACnE,UAAM,KAAK,oBAAoB,WAAW,UAAU;AAGpD,UAAM,SAAS,aAAAA,QAAK,KAAK,YAAY,YAAY,KAAK,OAAO,QAAQ;AACrE,UAAM,KAAK,oBAAoB,QAAQ,UAAU;AAAA,EACnD;AAAA,EAEQ,WAAW,UAA2B;AAC5C,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,MAAM,aAAAA,QAAK,QAAQ,QAAQ,EAAE,YAAY;AAC/C,WAAO,eAAe,SAAS,GAAG,KAAK,CAAC;AAAA,EAC1C;AAAA,EAEQ,aAAa,KAAqB;AACxC,WAAO,IACJ,QAAQ,iBAAiB,GAAG,EAC5B,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACxE,KAAK,EAAE;AAAA,EACZ;AAAA,EAEQ,YAAY,KAAqB;AACvC,UAAM,SAAS,KAAK,aAAa,GAAG;AACpC,WAAO,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AAAA,EACxD;AAAA,EAEQ,YAAY,KAAqB;AACvC,WAAO,IACJ,QAAQ,iBAAiB,GAAG,EAC5B,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACxE,KAAK,GAAG;AAAA,EACb;AACF;;;ACzRA,IAAAE,eAAiB;AACjB,IAAAC,mBAAe;AACf,IAAAC,gBAAkB;;;ACFlB,IAAAC,gBAAkB;AAClB,IAAAC,mBAAe;AACf,IAAAC,eAAiB;AAIjB,eAAsB,qBAAqB,aAA+C;AACxF,QAAM,MAAM,eAAe,QAAQ,IAAI;AAGvC,QAAM,YAAY;AAAA,IAChB,EAAE,MAAM,kBAAkB,SAAS,OAAyB;AAAA,IAC5D,EAAE,MAAM,aAAa,SAAS,OAAyB;AAAA,IACvD,EAAE,MAAM,qBAAqB,SAAS,MAAwB;AAAA,EAChE;AAEA,aAAW,EAAE,MAAM,QAAQ,KAAK,WAAW;AACzC,QAAI,MAAM,iBAAAC,QAAG,WAAW,aAAAC,QAAK,KAAK,KAAK,IAAI,CAAC,GAAG;AAC7C,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,WAA6B,CAAC,QAAQ,QAAQ,KAAK;AAEzD,aAAW,WAAW,UAAU;AAC9B,QAAI;AACF,gBAAM,cAAAC,SAAM,SAAS,CAAC,WAAW,CAAC;AAClC,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,SAAO;AACT;AAEA,eAAsB,kBAAkB,gBAAmD;AACzF,UAAQ,gBAAgB;AAAA,IACtB,KAAK;AACH,aAAO,CAAC,QAAQ,SAAS;AAAA,IAC3B,KAAK;AACH,aAAO,CAAC,QAAQ,SAAS;AAAA,IAC3B;AACE,aAAO,CAAC,OAAO,SAAS;AAAA,EAC5B;AACF;AAEA,eAAsB,cACpB,gBACA,UACA,MAAM,OACa;AACnB,QAAM,UAAU,MAAO,mBAAmB,QAAQ,eAAe,OAAQ;AAEzE,UAAQ,gBAAgB;AAAA,IACtB,KAAK;AACH,aAAO,CAAC,QAAQ,OAAO,GAAI,MAAM,CAAC,IAAI,IAAI,CAAC,GAAI,GAAG,QAAQ;AAAA,IAC5D,KAAK;AACH,aAAO,CAAC,QAAQ,OAAO,GAAI,MAAM,CAAC,IAAI,IAAI,CAAC,GAAI,GAAG,QAAQ;AAAA,IAC5D;AACE,aAAO,CAAC,OAAO,WAAW,GAAI,UAAU,CAAC,OAAO,IAAI,CAAC,GAAI,GAAG,QAAQ;AAAA,EACxE;AACF;AAgBA,eAAsB,0BAA0B,gBAAkD;AAChG,MAAI;AACF,cAAM,cAAAC,SAAM,gBAAgB,CAAC,WAAW,CAAC;AACzC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AD7EO,IAAM,mBAAN,MAAuB;AAAA,EAG5B,YAAY,aAAqB;AAC/B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAa,UAAyB;AACpC,QAAI;AAEF,YAAM,kBAAkB,aAAAC,QAAK,KAAK,KAAK,aAAa,cAAc;AAClE,UAAI,CAAE,MAAM,iBAAAC,QAAG,WAAW,eAAe,GAAI;AAC3C,cAAM,IAAI,MAAM,6CAA6C;AAAA,MAC/D;AAGA,YAAM,iBAAiB,MAAM,qBAAqB,KAAK,WAAW;AAGlE,UAAI,CAAE,MAAM,0BAA0B,cAAc,GAAI;AACtD,cAAM,IAAI,MAAM,oBAAoB,cAAc,oBAAoB;AAAA,MACxE;AAEA,aAAO,MAAM,gCAAgC,cAAc,KAAK;AAGhE,YAAM,UAAU,MAAM,kBAAkB,cAAc;AAGtD,gBAAM,cAAAC,SAAM,QAAQ,CAAC,GAAG,QAAQ,MAAM,CAAC,GAAG;AAAA,QACxC,KAAK,KAAK;AAAA,QACV,OAAO;AAAA,MACT,CAAC;AAED,aAAO,MAAM,qCAAqC;AAAA,IACpD,SAAS,OAAO;AACd,aAAO,MAAM,gCAAgC,KAAK;AAClD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,oBAAoB,cAAwB,MAAM,OAAsB;AACnF,QAAI;AACF,UAAI,aAAa,WAAW,GAAG;AAC7B;AAAA,MACF;AAEA,YAAM,iBAAiB,MAAM,qBAAqB,KAAK,WAAW;AAElE,UAAI,CAAE,MAAM,0BAA0B,cAAc,GAAI;AACtD,cAAM,IAAI,MAAM,oBAAoB,cAAc,oBAAoB;AAAA,MACxE;AAEA,aAAO,MAAM,cAAc,MAAM,SAAS,EAAE,iBAAiB,aAAa,KAAK,IAAI,CAAC,EAAE;AAGtF,YAAM,UACJ,mBAAmB,SACf,CAAC,QAAQ,OAAO,GAAI,MAAM,CAAC,IAAI,IAAI,CAAC,GAAI,GAAG,YAAY,IACvD,mBAAmB,SACjB,CAAC,QAAQ,OAAO,GAAI,MAAM,CAAC,IAAI,IAAI,CAAC,GAAI,GAAG,YAAY,IACvD,CAAC,OAAO,WAAW,GAAI,MAAM,CAAC,YAAY,IAAI,CAAC,GAAI,GAAG,YAAY;AAG1E,gBAAM,cAAAA,SAAM,QAAQ,CAAC,GAAG,QAAQ,MAAM,CAAC,GAAG;AAAA,QACxC,KAAK,KAAK;AAAA,QACV,OAAO;AAAA,MACT,CAAC;AAED,aAAO,MAAM,GAAG,MAAM,UAAU,GAAG,oCAAoC;AAAA,IACzE,SAAS,OAAO;AACd,aAAO,MAAM,qBAAqB,MAAM,SAAS,EAAE,iBAAiB,KAAK;AACzE,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,kBACX,SAce;AACf,QAAI;AACF,YAAM,kBAAkB,aAAAF,QAAK,KAAK,KAAK,aAAa,cAAc;AAElE,UAAI,CAAE,MAAM,iBAAAC,QAAG,WAAW,eAAe,GAAI;AAC3C,cAAM,IAAI,MAAM,wBAAwB;AAAA,MAC1C;AAEA,YAAM,cAAc,MAAM,iBAAAA,QAAG,SAAS,eAAe;AACrD,YAAM,qBAAqB,EAAE,GAAG,aAAa,GAAG,QAAQ;AAExD,YAAM,iBAAAA,QAAG,UAAU,iBAAiB,oBAAoB,EAAE,QAAQ,EAAE,CAAC;AAErE,aAAO,MAAM,mCAAmC;AAAA,IAClD,SAAS,OAAO;AACd,aAAO,MAAM,kCAAkC,KAAK;AACpD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,UAAU,MAAc,SAAgC;AACnE,QAAI;AACF,YAAM,kBAAkB,aAAAD,QAAK,KAAK,KAAK,aAAa,cAAc;AAClE,YAAM,cAAc,MAAM,iBAAAC,QAAG,SAAS,eAAe;AAErD,UAAI,CAAC,YAAY,SAAS;AACxB,oBAAY,UAAU,CAAC;AAAA,MACzB;AAEA,kBAAY,QAAQ,IAAI,IAAI;AAE5B,YAAM,iBAAAA,QAAG,UAAU,iBAAiB,aAAa,EAAE,QAAQ,EAAE,CAAC;AAE9D,aAAO,MAAM,WAAW,IAAI,yBAAyB;AAAA,IACvD,SAAS,OAAO;AACd,aAAO,MAAM,yBAAyB,IAAI,MAAM,KAAK;AACrD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,aAAa,MAA6B;AACrD,QAAI;AACF,YAAM,kBAAkB,aAAAD,QAAK,KAAK,KAAK,aAAa,cAAc;AAClE,YAAM,cAAc,MAAM,iBAAAC,QAAG,SAAS,eAAe;AAErD,UAAI,YAAY,WAAW,YAAY,QAAQ,IAAI,GAAG;AACpD,eAAO,YAAY,QAAQ,IAAI;AAC/B,cAAM,iBAAAA,QAAG,UAAU,iBAAiB,aAAa,EAAE,QAAQ,EAAE,CAAC;AAC9D,eAAO,MAAM,WAAW,IAAI,6BAA6B;AAAA,MAC3D;AAAA,IACF,SAAS,OAAO;AACd,aAAO,MAAM,4BAA4B,IAAI,MAAM,KAAK;AACxD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAa,kBAGV;AACD,QAAI;AACF,YAAM,kBAAkB,aAAAD,QAAK,KAAK,KAAK,aAAa,cAAc;AAClE,YAAM,cAAc,MAAM,iBAAAC,QAAG,SAAS,eAAe;AAErD,aAAO;AAAA,QACL,cAAc,YAAY,gBAAgB,CAAC;AAAA,QAC3C,iBAAiB,YAAY,mBAAmB,CAAC;AAAA,MACnD;AAAA,IACF,SAAS,OAAO;AACd,aAAO,MAAM,gCAAgC,KAAK;AAClD,aAAO,EAAE,cAAc,CAAC,GAAG,iBAAiB,CAAC,EAAE;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,MAAa,cAAgC;AAC3C,UAAM,YAAY,CAAC,qBAAqB,aAAa,gBAAgB;AAErE,eAAW,YAAY,WAAW;AAChC,UAAI,MAAM,iBAAAA,QAAG,WAAW,aAAAD,QAAK,KAAK,KAAK,aAAa,QAAQ,CAAC,GAAG;AAC9D,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,eAA8B;AACzC,QAAI;AAEF,YAAM,kBAAkB,aAAAA,QAAK,KAAK,KAAK,aAAa,cAAc;AAClE,YAAM,YAAY,CAAC,qBAAqB,aAAa,gBAAgB;AAErE,UAAI,MAAM,iBAAAC,QAAG,WAAW,eAAe,GAAG;AACxC,cAAM,iBAAAA,QAAG,OAAO,eAAe;AAAA,MACjC;AAEA,iBAAW,YAAY,WAAW;AAChC,cAAM,WAAW,aAAAD,QAAK,KAAK,KAAK,aAAa,QAAQ;AACrD,YAAI,MAAM,iBAAAC,QAAG,WAAW,QAAQ,GAAG;AACjC,gBAAM,iBAAAA,QAAG,OAAO,QAAQ;AAAA,QAC1B;AAAA,MACF;AAGA,YAAM,KAAK,QAAQ;AAEnB,aAAO,MAAM,yBAAyB;AAAA,IACxC,SAAS,OAAO;AACd,aAAO,MAAM,yBAAyB,KAAK;AAC3C,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;AErNA,IAAAE,gBAAkB;AAElB,IAAAC,mBAAe;AAGf,eAAsB,cAAc,aAAoC;AACtE,MAAI;AAEF,cAAM,cAAAC,SAAM,OAAO,CAAC,WAAW,CAAC;AAGhC,cAAM,cAAAA,SAAM,OAAO,CAAC,MAAM,GAAG,EAAE,KAAK,YAAY,CAAC;AAGjD,cAAM,cAAAA,SAAM,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,KAAK,YAAY,CAAC;AAGrD,cAAM,cAAAA,SAAM,OAAO,CAAC,UAAU,MAAM,oDAAoD,GAAG;AAAA,MACzF,KAAK;AAAA,IACP,CAAC;AAED,WAAO,MAAM,yCAAyC;AAAA,EACxD,SAAS,OAAO;AACd,WAAO,KAAK,kEAAkE;AAC9E,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC;AACF;;;ATIA,eAAsB,cACpB,UACA,UACA,MACA,UAAyB,CAAC,GAC1B;AACA,MAAI;AAEF,QAAI,CAAE,MAAM,oBAAoB,GAAI;AAClC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,iBAAiB,CAAC,OAAO,UAAU,MAAM;AAC/C,QAAI,CAAC,eAAe,SAAS,QAAQ,GAAG;AACtC,aAAO,MAAM,qBAAqB,QAAQ,qBAAqB,eAAe,KAAK,IAAI,CAAC,EAAE;AAC1F,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,QAAI,SAAwB;AAAA,MAC1B;AAAA,MACA,UAAU,YAAY;AAAA,MACtB,MAAM,QAAQ;AAAA,MACd,MAAO,QAAQ,QAAoC;AAAA,MACnD,UAAW,QAAQ,YAAwC;AAAA,MAC3D,OAAQ,QAAQ,SAAiD;AAAA,MACjE,SAAS,QAAQ,YAAY;AAAA,MAC7B,KAAK,QAAQ,QAAQ;AAAA,IACvB;AAGA,QAAI,CAAC,QAAQ,KAAK;AAChB,eAAS,MAAM,kBAAkB,MAAM;AAAA,IACzC;AAGA,QAAI,CAAC,oBAAoB,OAAO,IAAI,GAAG;AACrC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,cAAc,aAAAC,QAAK,QAAQ,QAAQ,IAAI,GAAG,OAAO,IAAI;AAG3D,QAAI,CAAE,MAAM,oBAAoB,WAAW,GAAI;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,WAAO,MAAM,0CAAmC;AAChD,WAAO,KAAK,aAAa,OAAO,QAAQ,EAAE;AAC1C,WAAO,KAAK,aAAa,OAAO,QAAQ,EAAE;AAC1C,WAAO,KAAK,YAAY,OAAO,IAAI,EAAE;AACrC,WAAO,KAAK,SAAS,OAAO,IAAI,EAAE;AAClC,WAAO,KAAK,aAAa,OAAO,QAAQ,EAAE;AAC1C,WAAO,KAAK,UAAU,OAAO,KAAK,EAAE;AACpC,WAAO,QAAQ;AAGf,UAAM,kBAAkB,QAAQ,iCAAiC;AACjE,QAAI;AACF,YAAM,YAAY,IAAI,kBAAkB,MAAM;AAC9C,YAAM,UAAU,SAAS,WAAW;AACpC,sBAAgB,QAAQ,2BAA2B;AAAA,IACrD,SAAS,QAAQ;AACf,sBAAgB,KAAK,sCAAsC;AAC3D,YAAM;AAAA,IACR;AAGA,QAAI,OAAO,SAAS;AAClB,YAAM,iBAAiB,QAAQ,4BAA4B;AAC3D,UAAI;AACF,cAAM,YAAY,IAAI,iBAAiB,WAAW;AAClD,cAAM,UAAU,QAAQ;AACxB,uBAAe,QAAQ,wBAAwB;AAAA,MACjD,SAAS,QAAQ;AACf,uBAAe,KAAK,gCAAgC;AACpD,eAAO,KAAK,mDAAmD;AAC/D,eAAO,KAAK,MAAM,OAAO,IAAI,iBAAiB;AAAA,MAChD;AAAA,IACF;AAGA,QAAI,OAAO,KAAK;AACd,YAAM,aAAa,QAAQ,gCAAgC;AAC3D,UAAI;AACF,cAAM,cAAc,WAAW;AAC/B,mBAAW,QAAQ,4BAA4B;AAAA,MACjD,SAAS,QAAQ;AACf,mBAAW,KAAK,qCAAqC;AACrD,eAAO,KAAK,6CAA6C;AACzD,eAAO,KAAK,MAAM,OAAO,IAAI,cAAc;AAAA,MAC7C;AAAA,IACF;AAGA,WAAO,QAAQ;AACf,WAAO,QAAQ,yCAAkC;AACjD,WAAO,QAAQ;AAEf,WAAO,MAAM,aAAa;AAC1B,WAAO,KAAK,MAAM,OAAO,IAAI,EAAE;AAE/B,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,KAAK,aAAa;AAAA,IAC3B;AAEA,QAAI,OAAO,aAAa,SAAS,OAAO,aAAa,QAAQ;AAC3D,aAAO,KAAK,aAAa;AACzB,aAAO,KAAK,4CAA4C;AAAA,IAC1D;AAEA,QAAI,OAAO,aAAa,YAAY,OAAO,aAAa,QAAQ;AAC9D,aAAO,KAAK,gBAAgB;AAC5B,aAAO,KAAK,+BAA+B;AAAA,IAC7C;AAEA,WAAO,QAAQ;AACf,WAAO,KAAK,yDAAkD;AAC9D,WAAO,KAAK,qDAA8C;AAAA,EAC5D,SAAS,OAAO;AACd,WAAO,MAAM,2BAA2B;AACxC,WAAO,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACnE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AUrJA,eAAsB,WAAW,SAAiB,WAAuB,CAAC,GAAG;AAC3E,MAAI;AACF,WAAO,MAAM,UAAU,OAAO,UAAU;AAExC,UAAM,gBAAgB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,cAAc,SAAS,OAAO,GAAG;AACpC,aAAO,MAAM,oBAAoB,OAAO,EAAE;AAC1C,aAAO,KAAK,qBAAqB;AACjC,aAAO,KAAK,aAAa;AACzB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAa,QAAQ,UAAU,OAAO,aAAa;AAGzD,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAI,CAAC;AAExD,eAAW,QAAQ,GAAG,OAAO,6BAA6B;AAE1D,WAAO,QAAQ;AACf,WAAO,QAAQ,6BAA6B;AAC5C,WAAO,KAAK,8DAA8D;AAAA,EAC5E,SAAS,OAAO;AACd,WAAO,MAAM,wBAAwB;AACrC,WAAO,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACnE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACzCA,IAAAC,gBAAkB;AAMlB,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,eAAsB,mBAAmB,UAAyB,CAAC,GAAG;AACpE,MAAI;AACF,WAAO,MAAM,uCAAuC;AAEpD,UAAM,iBAAiB,MAAM,qBAAqB;AAClD,WAAO,KAAK,0BAA0B,cAAc,EAAE;AAEtD,QAAI,QAAQ,OAAO;AACjB,YAAM,eAAe,QAAQ,yBAAyB;AAGtD,UAAI;AACF,cAAM,SAAS,UAAM,cAAAC,SAAM,gBAAgB,CAAC,YAAY,GAAG,kBAAkB,GAAG;AAAA,UAC9E,QAAQ;AAAA,QACV,CAAC;AAED,qBAAa,QAAQ,wBAAwB;AAE7C,YAAI,OAAO,QAAQ;AACjB,iBAAO,KAAK,oBAAoB;AAChC,iBAAO,IAAI,OAAO,MAAM;AAAA,QAC1B,OAAO;AACL,iBAAO,QAAQ,8CAA8C;AAAA,QAC/D;AAAA,MACF,SAAS,OAAO;AACd,qBAAa,KAAK,6BAA6B;AAC/C,cAAM;AAAA,MACR;AAAA,IACF,OAAO;AACL,YAAM,gBAAgB,QAAQ,sBAAsB;AAEpD,UAAI;AAEF,cAAM,UAAU,MAAM,cAAc,gBAAgB,kBAAkB;AACtE,kBAAM,cAAAA,SAAM,QAAQ,CAAC,GAAG,QAAQ,MAAM,CAAC,GAAG;AAAA,UACxC,OAAO;AAAA,QACT,CAAC;AAED,sBAAc,QAAQ,+BAA+B;AAErD,eAAO,QAAQ;AACf,eAAO,QAAQ,iDAAiD;AAChE,eAAO,KAAK,uDAAuD;AAAA,MACrE,SAAS,OAAO;AACd,sBAAc,KAAK,2BAA2B;AAC9C,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,gCAAgC;AAC7C,WAAO,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACnE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACrEA;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,MAAQ;AAAA,EACR,KAAO;AAAA,IACL,mBAAmB;AAAA,EACrB;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,MAAQ;AAAA,IACR,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,UAAY;AAAA,IACZ,WAAa;AAAA,IACb,SAAW;AAAA,IACX,SAAW;AAAA,IACX,gBAAkB;AAAA,EACpB;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAU;AAAA,EACV,SAAW;AAAA,EACX,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,MAAQ;AAAA,IACN,KAAO;AAAA,EACT;AAAA,EACA,UAAY;AAAA,EACZ,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,cAAgB;AAAA,IACd,OAAS;AAAA,IACT,WAAa;AAAA,IACb,aAAe;AAAA,IACf,OAAS;AAAA,IACT,YAAY;AAAA,IACZ,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,QAAU;AAAA,IACV,6BAA6B;AAAA,IAC7B,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,mBAAmB;AAAA,IACnB,yBAAyB;AAAA,IACzB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,oCAAoC;AAAA,IACpC,QAAU;AAAA,IACV,0BAA0B;AAAA,IAC1B,0BAA0B;AAAA,IAC1B,UAAY;AAAA,IACZ,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAW;AAAA,IACX,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,YAAc;AAAA,IACd,qBAAqB;AAAA,EACvB;AAAA,EACA,kBAAoB;AAAA,IAClB,YAAc;AAAA,EAChB;AAAA,EACA,eAAiB;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,aAAe;AAAA,IACb,KAAO;AAAA,IACP,MAAQ;AAAA,EACV;AACF;;;AbjGA,IAAM,UAAU,IAAI,yBAAQ;AAE5B,QACG,KAAK,iBAAiB,EACtB,YAAY,+DAA+D,EAC3E,QAAQ,gBAAY,OAAO;AAE9B,QACG,QAAQ,QAAQ,EAChB,MAAM,GAAG,EACT,YAAY,+BAA+B,EAC3C,SAAS,cAAc,gCAAgC,EACvD,SAAS,cAAc,oEAAoE,EAC3F,SAAS,UAAU,cAAc,EACjC,OAAO,yBAAyB,mCAAmC,EACnE,OAAO,6BAA6B,uCAAuC,EAC3E,OAAO,uBAAuB,oCAAoC,EAClE,OAAO,gBAAgB,2BAA2B,EAClD,OAAO,YAAY,yBAAyB,EAC5C,OAAO,aAAa,0BAA0B,EAC9C,OAAO,aAAa;AAEvB,QACG,QAAQ,KAAK,EACb,MAAM,GAAG,EACT,YAAY,kCAAkC,EAC9C,SAAS,aAAa,gDAAgD,EACtE,OAAO,6BAA6B,kBAAkB,EACtD,OAAO,UAAU;AAEpB,QACG,QAAQ,QAAQ,EAChB,MAAM,GAAG,EACT,YAAY,qCAAqC,EACjD,OAAO,WAAW,sCAAsC,EACxD,OAAO,kBAAkB;AAG5B,QAAQ,GAAG,aAAa,MAAM;AAC5B,SAAO,MAAM,oBAAoB,QAAQ,KAAK,KAAK,GAAG,CAAC,EAAE;AACzD,SAAO,KAAK,qDAAqD;AACjE,UAAQ,KAAK,CAAC;AAChB,CAAC;AAGD,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,QAAQ;AACjC,UAAQ,WAAW;AACnB,UAAQ,KAAK,CAAC;AAChB;AAEA,QAAQ,MAAM;AAEd,IAAO,cAAQ;","names":["import_path","chalk","import_chalk","ora","chalk","validateNpmPackageName","fs","path","semver","answers","inquirer","import_path","import_fs_extra","fs","path","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('--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') || 'supabase',\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: '⚡ 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: 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, 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: '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.4.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,15 +1,15 @@
|
|
|
1
|
-
# Auth Configuration
|
|
2
|
-
NEXT_PUBLIC_AUTH_PROVIDER=supabase|firebase
|
|
3
|
-
|
|
4
|
-
# Supabase
|
|
5
|
-
NEXT_PUBLIC_SUPABASE_URL=
|
|
6
|
-
NEXT_PUBLIC_SUPABASE_ANON_KEY=
|
|
7
|
-
|
|
8
|
-
# Firebase
|
|
9
|
-
NEXT_PUBLIC_FIREBASE_API_KEY=
|
|
10
|
-
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
|
|
11
|
-
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
|
|
12
|
-
|
|
13
|
-
# Payments
|
|
14
|
-
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=
|
|
15
|
-
STRIPE_SECRET_KEY=
|
|
1
|
+
# Auth Configuration
|
|
2
|
+
NEXT_PUBLIC_AUTH_PROVIDER=supabase|firebase
|
|
3
|
+
|
|
4
|
+
# Supabase
|
|
5
|
+
NEXT_PUBLIC_SUPABASE_URL=
|
|
6
|
+
NEXT_PUBLIC_SUPABASE_ANON_KEY=
|
|
7
|
+
|
|
8
|
+
# Firebase
|
|
9
|
+
NEXT_PUBLIC_FIREBASE_API_KEY=
|
|
10
|
+
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
|
|
11
|
+
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
|
|
12
|
+
|
|
13
|
+
# Payments
|
|
14
|
+
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=
|
|
15
|
+
STRIPE_SECRET_KEY=
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { View, Button } from 'react-native';
|
|
3
|
-
import { useStripe } from '@digilogiclabs/saas-factory-payments/native';
|
|
4
|
-
|
|
5
|
-
export default function CheckoutScreen() {
|
|
6
|
-
const { handleCheckout } = useStripe();
|
|
7
|
-
|
|
8
|
-
const onCheckout = async () => {
|
|
9
|
-
await handleCheckout({
|
|
10
|
-
priceId: 'price_12345', // Replace with your actual price ID
|
|
11
|
-
returnUrl: 'exp://localhost:8081/dashboard',
|
|
12
|
-
});
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
return (
|
|
16
|
-
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
|
|
17
|
-
<Button title="Proceed to Checkout" onPress={onCheckout} />
|
|
18
|
-
</View>
|
|
19
|
-
);
|
|
20
|
-
}
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { View, Button } from 'react-native';
|
|
3
|
+
import { useStripe } from '@digilogiclabs/saas-factory-payments/native';
|
|
4
|
+
|
|
5
|
+
export default function CheckoutScreen() {
|
|
6
|
+
const { handleCheckout } = useStripe();
|
|
7
|
+
|
|
8
|
+
const onCheckout = async () => {
|
|
9
|
+
await handleCheckout({
|
|
10
|
+
priceId: 'price_12345', // Replace with your actual price ID
|
|
11
|
+
returnUrl: 'exp://localhost:8081/dashboard',
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
|
|
17
|
+
<Button title="Proceed to Checkout" onPress={onCheckout} />
|
|
18
|
+
</View>
|
|
19
|
+
);
|
|
20
|
+
}
|