@react-spa-scaffold/mcp 2.2.0 → 2.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/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +4 -0
- package/dist/constants.js.map +1 -1
- package/dist/features/definitions/api.d.ts.map +1 -1
- package/dist/features/definitions/api.js +2 -1
- package/dist/features/definitions/api.js.map +1 -1
- package/dist/features/definitions/database.d.ts +3 -0
- package/dist/features/definitions/database.d.ts.map +1 -0
- package/dist/features/definitions/database.js +45 -0
- package/dist/features/definitions/database.js.map +1 -0
- package/dist/features/definitions/deployment.d.ts +3 -0
- package/dist/features/definitions/deployment.d.ts.map +1 -0
- package/dist/features/definitions/deployment.js +14 -0
- package/dist/features/definitions/deployment.js.map +1 -0
- package/dist/features/definitions/electron.d.ts +3 -0
- package/dist/features/definitions/electron.d.ts.map +1 -0
- package/dist/features/definitions/electron.js +23 -0
- package/dist/features/definitions/electron.js.map +1 -0
- package/dist/features/definitions/index.d.ts +3 -0
- package/dist/features/definitions/index.d.ts.map +1 -1
- package/dist/features/definitions/index.js +3 -0
- package/dist/features/definitions/index.js.map +1 -1
- package/dist/features/registry.d.ts.map +1 -1
- package/dist/features/registry.js +4 -1
- package/dist/features/registry.js.map +1 -1
- package/dist/features/types.d.ts +1 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/features/types.test.js +5 -2
- package/dist/features/types.test.js.map +1 -1
- package/dist/resources/docs.d.ts.map +1 -1
- package/dist/resources/docs.js +5 -0
- package/dist/resources/docs.js.map +1 -1
- package/dist/tools/add-features.js +1 -1
- package/dist/tools/add-features.js.map +1 -1
- package/dist/tools/get-features.test.js +7 -0
- package/dist/tools/get-features.test.js.map +1 -1
- package/dist/tools/get-scaffold.d.ts +1 -0
- package/dist/tools/get-scaffold.d.ts.map +1 -1
- package/dist/tools/get-scaffold.js +4 -1
- package/dist/tools/get-scaffold.js.map +1 -1
- package/dist/tools/get-scaffold.test.js +50 -0
- package/dist/tools/get-scaffold.test.js.map +1 -1
- package/dist/utils/docs.d.ts.map +1 -1
- package/dist/utils/docs.js +2 -0
- package/dist/utils/docs.js.map +1 -1
- package/dist/utils/scaffold/claude-md/index.d.ts.map +1 -1
- package/dist/utils/scaffold/claude-md/index.js +4 -1
- package/dist/utils/scaffold/claude-md/index.js.map +1 -1
- package/dist/utils/scaffold/claude-md/sections.d.ts +3 -0
- package/dist/utils/scaffold/claude-md/sections.d.ts.map +1 -1
- package/dist/utils/scaffold/claude-md/sections.js +174 -2
- package/dist/utils/scaffold/claude-md/sections.js.map +1 -1
- package/dist/utils/scaffold/compute.d.ts.map +1 -1
- package/dist/utils/scaffold/compute.js +4 -2
- package/dist/utils/scaffold/compute.js.map +1 -1
- package/dist/utils/scaffold/generators.d.ts +7 -2
- package/dist/utils/scaffold/generators.d.ts.map +1 -1
- package/dist/utils/scaffold/generators.js +100 -22
- package/dist/utils/scaffold/generators.js.map +1 -1
- package/package.json +1 -1
- package/templates/.env.example +40 -12
- package/templates/.github/workflows/ci.yml +49 -2
- package/templates/.github/workflows/deploy.yml +46 -0
- package/templates/CLAUDE.md +180 -1
- package/templates/docs/AUTHENTICATION.md +325 -0
- package/templates/docs/DEPLOYMENT.md +296 -0
- package/templates/docs/E2E_TESTING.md +81 -4
- package/templates/docs/SUPABASE_INTEGRATION.md +310 -0
- package/templates/docs/TESTING.md +195 -77
- package/templates/e2e/auth/auth.setup.ts +60 -0
- package/templates/e2e/fixtures/index.ts +11 -0
- package/templates/e2e/tests/profile.auth.spec.ts +103 -0
- package/templates/e2e/tests/profile.spec.ts +64 -0
- package/templates/e2e/tests/register-form.spec.ts +38 -0
- package/templates/forge.config.js +53 -0
- package/templates/gitignore +5 -0
- package/templates/package.json +13 -1
- package/templates/playwright.config.ts +33 -3
- package/templates/src/App.tsx +32 -19
- package/templates/src/components/layout/Header.test.tsx +17 -1
- package/templates/src/components/layout/Header.tsx +11 -0
- package/templates/src/components/shared/AccountButton/AccountButton.test.tsx +3 -3
- package/templates/src/components/shared/ProfileSync/ProfileSync.test.tsx +44 -0
- package/templates/src/components/shared/ProfileSync/ProfileSync.tsx +104 -0
- package/templates/src/components/shared/ProfileSync/index.ts +1 -0
- package/templates/src/components/shared/ProtectedRoute/ProtectedRoute.test.tsx +3 -3
- package/templates/src/components/shared/index.ts +1 -0
- package/templates/src/contexts/performanceContext.tsx +3 -3
- package/templates/src/contexts/queryContext.tsx +9 -8
- package/templates/src/contexts/supabaseContext.test.tsx +59 -0
- package/templates/src/contexts/supabaseContext.tsx +87 -0
- package/templates/src/hooks/index.ts +17 -0
- package/templates/src/hooks/supabase/index.ts +12 -0
- package/templates/src/hooks/supabase/useProfiles.test.tsx +207 -0
- package/templates/src/hooks/supabase/useProfiles.ts +213 -0
- package/templates/src/hooks/supabase/useSupabaseQuery.test.tsx +150 -0
- package/templates/src/hooks/supabase/useSupabaseQuery.ts +91 -0
- package/templates/src/lib/api.test.ts +30 -38
- package/templates/src/lib/api.ts +1 -7
- package/templates/src/lib/config.ts +54 -4
- package/templates/src/lib/env.ts +36 -14
- package/templates/src/lib/index.ts +4 -2
- package/templates/src/lib/routes.ts +1 -0
- package/templates/src/lib/sentry.ts +13 -10
- package/templates/src/lib/supabase/client.ts +58 -0
- package/templates/src/lib/supabase/index.ts +5 -0
- package/templates/src/main.ts +227 -0
- package/templates/src/main.tsx +32 -42
- package/templates/src/mocks/constants.ts +31 -0
- package/templates/src/mocks/fixtures/index.ts +3 -1
- package/templates/src/mocks/fixtures/profiles.ts +55 -0
- package/templates/src/mocks/fixtures/users.ts +91 -0
- package/templates/src/mocks/handlers/index.ts +2 -1
- package/templates/src/mocks/handlers/supabase.ts +64 -0
- package/templates/src/mocks/handlers/todos.ts +1 -1
- package/templates/src/mocks/index.ts +6 -0
- package/templates/src/pages/Profile.test.tsx +263 -0
- package/templates/src/pages/Profile.tsx +171 -0
- package/templates/src/pages/index.ts +1 -0
- package/templates/src/preload.ts +26 -0
- package/templates/src/stores/preferencesStore.ts +2 -1
- package/templates/src/test/clerkMock.tsx +49 -9
- package/templates/src/test/fetchMock.ts +58 -0
- package/templates/src/test/index.ts +49 -3
- package/templates/src/test/mocks.ts +128 -1
- package/templates/src/test/providers.tsx +7 -4
- package/templates/src/test/supabaseMock.ts +112 -0
- package/templates/src/test-setup.ts +26 -0
- package/templates/src/types/database.ts +46 -0
- package/templates/src/types/global.d.ts +28 -0
- package/templates/src/types/index.ts +1 -0
- package/templates/src/types/supabase.ts +167 -0
- package/templates/src/vite-env.d.ts +6 -0
- package/templates/supabase/migrations/20260104000000_create_profiles_table.sql +67 -0
- package/templates/vite.main.config.mjs +20 -0
- package/templates/vite.preload.config.mjs +17 -0
- package/templates/vite.renderer.config.mjs +52 -0
package/dist/utils/docs.js
CHANGED
|
@@ -23,6 +23,8 @@ const DOCS_CONFIG = {
|
|
|
23
23
|
'docs/TESTING.md': { requiredFeatures: ['testing'] },
|
|
24
24
|
'docs/E2E_TESTING.md': { requiredFeatures: ['testing'] },
|
|
25
25
|
'docs/INTERNATIONALIZATION.md': { requiredFeatures: ['i18n'] },
|
|
26
|
+
'docs/SUPABASE_INTEGRATION.md': { requiredFeatures: ['database'] },
|
|
27
|
+
'docs/DEPLOYMENT.md': { requiredFeatures: ['deployment'] },
|
|
26
28
|
};
|
|
27
29
|
/**
|
|
28
30
|
* Determine which docs to include based on selected features
|
package/dist/utils/docs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/utils/docs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,WAAW,GAAoD;IACnE,8BAA8B;IAC9B,sBAAsB,EAAE,EAAE;IAC1B,0BAA0B,EAAE,EAAE;IAC9B,8BAA8B,EAAE,EAAE;IAClC,uBAAuB,EAAE,EAAE;IAE3B,mBAAmB;IACnB,iBAAiB,EAAE,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE;IACpD,qBAAqB,EAAE,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE;IACxD,8BAA8B,EAAE,EAAE,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/utils/docs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,WAAW,GAAoD;IACnE,8BAA8B;IAC9B,sBAAsB,EAAE,EAAE;IAC1B,0BAA0B,EAAE,EAAE;IAC9B,8BAA8B,EAAE,EAAE;IAClC,uBAAuB,EAAE,EAAE;IAE3B,mBAAmB;IACnB,iBAAiB,EAAE,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE;IACpD,qBAAqB,EAAE,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE;IACxD,8BAA8B,EAAE,EAAE,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE;IAC9D,8BAA8B,EAAE,EAAE,gBAAgB,EAAE,CAAC,UAAU,CAAC,EAAE;IAClE,oBAAoB,EAAE,EAAE,gBAAgB,EAAE,CAAC,YAAY,CAAC,EAAE;CAC3D,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAA6B;IAClE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAEvC,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE;QACrB,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC,CAAC,YAAY;QACvD,OAAO,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;SACrB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,OAAO,CAAC,OAAe;IACpC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,wBAAwB,OAAO,yEAAyE,CAAC;IAClH,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAA6B;IACpE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/scaffold/claude-md/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/scaffold/claude-md/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAkB5D,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,SAAS,EAAE,EACvB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAmBR"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* CLAUDE.md generator - composes sections based on selected features.
|
|
3
3
|
*/
|
|
4
4
|
import { FEATURE } from '../../../constants.js';
|
|
5
|
-
import { generateHeader, generateCommandsSection, generateStructureSection, generateCodePatternsSection, generateUiSection, generateMobileSection, generateThemingSection, generateMcpSection, generateI18nSection, generateTestingSection, generateGotchasSection, } from './sections.js';
|
|
5
|
+
import { generateHeader, generateCommandsSection, generateStructureSection, generateCodePatternsSection, generateUiSection, generateMobileSection, generateThemingSection, generateAuthSection, generateDatabaseSection, generateElectronSection, generateMcpSection, generateI18nSection, generateTestingSection, generateGotchasSection, } from './sections.js';
|
|
6
6
|
/** Generates CLAUDE.md content based on selected features. */
|
|
7
7
|
export function generateClaudeMd(featureIds, projectName, scripts) {
|
|
8
8
|
const sections = [
|
|
@@ -13,6 +13,9 @@ export function generateClaudeMd(featureIds, projectName, scripts) {
|
|
|
13
13
|
featureIds.includes(FEATURE.UI) && generateUiSection(),
|
|
14
14
|
featureIds.includes(FEATURE.MOBILE) && generateMobileSection(),
|
|
15
15
|
featureIds.includes(FEATURE.THEMING) && generateThemingSection(),
|
|
16
|
+
featureIds.includes(FEATURE.AUTH) && generateAuthSection(),
|
|
17
|
+
featureIds.includes(FEATURE.DATABASE) && generateDatabaseSection(),
|
|
18
|
+
featureIds.includes(FEATURE.ELECTRON) && generateElectronSection(),
|
|
16
19
|
generateMcpSection(featureIds),
|
|
17
20
|
featureIds.includes(FEATURE.I18N) && generateI18nSection(),
|
|
18
21
|
featureIds.includes(FEATURE.TESTING) && generateTestingSection(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/scaffold/claude-md/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB,CAC9B,UAAuB,EACvB,WAAmB,EACnB,OAA+B;IAE/B,MAAM,QAAQ,GAAG;QACf,cAAc,CAAC,WAAW,CAAC;QAC3B,uBAAuB,CAAC,OAAO,CAAC;QAChC,wBAAwB,CAAC,UAAU,CAAC;QACpC,2BAA2B,CAAC,UAAU,CAAC;QACvC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,iBAAiB,EAAE;QACtD,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,qBAAqB,EAAE;QAC9D,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,sBAAsB,EAAE;QAChE,kBAAkB,CAAC,UAAU,CAAC;QAC9B,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,mBAAmB,EAAE;QAC1D,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,sBAAsB,EAAE;QAChE,sBAAsB,CAAC,UAAU,CAAC;KACnC,CAAC;IAEF,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/scaffold/claude-md/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB,CAC9B,UAAuB,EACvB,WAAmB,EACnB,OAA+B;IAE/B,MAAM,QAAQ,GAAG;QACf,cAAc,CAAC,WAAW,CAAC;QAC3B,uBAAuB,CAAC,OAAO,CAAC;QAChC,wBAAwB,CAAC,UAAU,CAAC;QACpC,2BAA2B,CAAC,UAAU,CAAC;QACvC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,iBAAiB,EAAE;QACtD,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,qBAAqB,EAAE;QAC9D,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,sBAAsB,EAAE;QAChE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,mBAAmB,EAAE;QAC1D,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,uBAAuB,EAAE;QAClE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,uBAAuB,EAAE;QAClE,kBAAkB,CAAC,UAAU,CAAC;QAC9B,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,mBAAmB,EAAE;QAC1D,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,sBAAsB,EAAE;QAChE,sBAAsB,CAAC,UAAU,CAAC;KACnC,CAAC;IAEF,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -9,8 +9,11 @@ export declare function generateCodePatternsSection(featureIds: FeatureId[]): st
|
|
|
9
9
|
export declare function generateUiSection(): string;
|
|
10
10
|
export declare function generateMobileSection(): string;
|
|
11
11
|
export declare function generateThemingSection(): string;
|
|
12
|
+
export declare function generateAuthSection(): string;
|
|
13
|
+
export declare function generateDatabaseSection(): string;
|
|
12
14
|
export declare function generateMcpSection(featureIds: FeatureId[]): string;
|
|
13
15
|
export declare function generateI18nSection(): string;
|
|
14
16
|
export declare function generateTestingSection(): string;
|
|
17
|
+
export declare function generateElectronSection(): string;
|
|
15
18
|
export declare function generateGotchasSection(featureIds: FeatureId[]): string;
|
|
16
19
|
//# sourceMappingURL=sections.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sections.d.ts","sourceRoot":"","sources":["../../../../src/utils/scaffold/claude-md/sections.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"sections.d.ts","sourceRoot":"","sources":["../../../../src/utils/scaffold/claude-md/sections.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AA4B5D,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAe/E;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CA6CxE;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAkB3E;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAmB1C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAoC9C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAuB/C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAsC5C;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CA0EhD;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAwClE;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAY5C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAe/C;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAmChD;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CA8BtE"}
|
|
@@ -19,6 +19,13 @@ const SCRIPT_DESCRIPTIONS = {
|
|
|
19
19
|
'e2e:ui': 'Playwright UI mode',
|
|
20
20
|
'i18n:extract': 'Extract translations to .po',
|
|
21
21
|
prepare: 'Initialize Husky hooks',
|
|
22
|
+
'db:types': 'Generate Supabase TypeScript types',
|
|
23
|
+
'db:push': 'Push database migrations',
|
|
24
|
+
'db:reset': 'Reset database (destructive)',
|
|
25
|
+
'db:studio': 'Open Supabase Studio',
|
|
26
|
+
'electron:dev': 'Start Electron in development',
|
|
27
|
+
'electron:build': 'Package Electron app',
|
|
28
|
+
'electron:make': 'Create distributable (DMG/ZIP)',
|
|
22
29
|
};
|
|
23
30
|
export function generateHeader(projectName) {
|
|
24
31
|
return `# CLAUDE.md
|
|
@@ -42,7 +49,10 @@ ${commandLines.join('\n')}
|
|
|
42
49
|
}
|
|
43
50
|
export function generateStructureSection(featureIds) {
|
|
44
51
|
const parts = ['src/', '├── components/ # ui/ (primitives), layout/, shared/ (features)'];
|
|
45
|
-
if (featureIds.includes(FEATURE.API) ||
|
|
52
|
+
if (featureIds.includes(FEATURE.API) ||
|
|
53
|
+
featureIds.includes(FEATURE.I18N) ||
|
|
54
|
+
featureIds.includes(FEATURE.MOBILE) ||
|
|
55
|
+
featureIds.includes(FEATURE.DATABASE)) {
|
|
46
56
|
parts.push('├── contexts/ # React Context providers');
|
|
47
57
|
}
|
|
48
58
|
parts.push('├── hooks/ # Custom hooks');
|
|
@@ -53,6 +63,8 @@ export function generateStructureSection(featureIds) {
|
|
|
53
63
|
libParts.push('routes');
|
|
54
64
|
if (featureIds.includes(FEATURE.STATE))
|
|
55
65
|
libParts.push('storage');
|
|
66
|
+
if (featureIds.includes(FEATURE.DATABASE))
|
|
67
|
+
libParts.push('supabase');
|
|
56
68
|
parts.push(`├── lib/ # ${libParts.join(', ')}`);
|
|
57
69
|
if (featureIds.includes(FEATURE.ROUTING))
|
|
58
70
|
parts.push('├── pages/ # Lazy-loaded route components');
|
|
@@ -180,6 +192,120 @@ const getResolvedTheme = usePreferencesStore((s) => s.getResolvedTheme);
|
|
|
180
192
|
The \`useThemeEffect\` hook automatically applies the \`.dark\` class to the document.
|
|
181
193
|
The ThemeToggle component provides a UI for switching between light, dark, and system themes.`;
|
|
182
194
|
}
|
|
195
|
+
export function generateAuthSection() {
|
|
196
|
+
return `
|
|
197
|
+
## Authentication (Clerk)
|
|
198
|
+
|
|
199
|
+
Clerk provides authentication with modal-based sign-in.
|
|
200
|
+
|
|
201
|
+
### Setup
|
|
202
|
+
|
|
203
|
+
1. Create an account at [clerk.com](https://clerk.com)
|
|
204
|
+
2. Get your Publishable Key from the dashboard
|
|
205
|
+
3. Set \`VITE_CLERK_PUBLISHABLE_KEY\` in \`.env\`
|
|
206
|
+
|
|
207
|
+
### Usage
|
|
208
|
+
|
|
209
|
+
\`\`\`tsx
|
|
210
|
+
import { SignedIn, SignedOut, UserButton, SignInButton } from '@clerk/react-router';
|
|
211
|
+
import { ProtectedRoute } from '@/components/shared';
|
|
212
|
+
|
|
213
|
+
// Conditional rendering
|
|
214
|
+
<SignedIn><UserButton /></SignedIn>
|
|
215
|
+
<SignedOut><SignInButton mode="modal"><Button>Sign In</Button></SignInButton></SignedOut>
|
|
216
|
+
|
|
217
|
+
// Protected routes
|
|
218
|
+
<Route path="/dashboard" element={<ProtectedRoute><DashboardPage /></ProtectedRoute>} />
|
|
219
|
+
\`\`\`
|
|
220
|
+
|
|
221
|
+
### Testing
|
|
222
|
+
|
|
223
|
+
\`\`\`tsx
|
|
224
|
+
import { setMockClerkSignedIn, resetClerkMocks } from '@/test';
|
|
225
|
+
|
|
226
|
+
beforeEach(() => resetClerkMocks());
|
|
227
|
+
|
|
228
|
+
it('shows sign-in when not authenticated', () => {
|
|
229
|
+
setMockClerkSignedIn(false);
|
|
230
|
+
// ...
|
|
231
|
+
});
|
|
232
|
+
\`\`\``;
|
|
233
|
+
}
|
|
234
|
+
export function generateDatabaseSection() {
|
|
235
|
+
return `
|
|
236
|
+
## Database (Supabase)
|
|
237
|
+
|
|
238
|
+
Supabase provides PostgreSQL with Row Level Security (RLS), integrated with Clerk authentication.
|
|
239
|
+
|
|
240
|
+
### Setup
|
|
241
|
+
|
|
242
|
+
1. Create a project at [supabase.com](https://supabase.com)
|
|
243
|
+
2. Configure Clerk as third-party auth provider in Supabase Dashboard
|
|
244
|
+
3. Enable Supabase integration in Clerk Dashboard → Integrations
|
|
245
|
+
4. Set environment variables in \`.env\`:
|
|
246
|
+
- \`VITE_SUPABASE_DATABASE_URL\` - Your project URL
|
|
247
|
+
- \`VITE_SUPABASE_ANON_KEY\` - Your anon/public key
|
|
248
|
+
- \`SUPABASE_PROJECT_ID\` - Project ID for CLI (subdomain from your URL)
|
|
249
|
+
|
|
250
|
+
### Usage
|
|
251
|
+
|
|
252
|
+
\`\`\`tsx
|
|
253
|
+
import { useSupabase, useSupabaseQuery, useProfile } from '@/hooks';
|
|
254
|
+
|
|
255
|
+
// Direct client access
|
|
256
|
+
const supabase = useSupabase();
|
|
257
|
+
const { data } = await supabase.from('profiles').select();
|
|
258
|
+
|
|
259
|
+
// TanStack Query wrapper
|
|
260
|
+
const { data, isLoading } = useSupabaseQuery({
|
|
261
|
+
table: 'profiles',
|
|
262
|
+
queryKey: ['current'],
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
// Current user's profile
|
|
266
|
+
const { profile, isLoading, exists } = useProfile();
|
|
267
|
+
\`\`\`
|
|
268
|
+
|
|
269
|
+
### Profile Mutations
|
|
270
|
+
|
|
271
|
+
\`\`\`tsx
|
|
272
|
+
import { useUpsertProfile, useUpdateProfile, useDeleteProfile } from '@/hooks';
|
|
273
|
+
|
|
274
|
+
const upsertProfile = useUpsertProfile();
|
|
275
|
+
await upsertProfile.mutateAsync({ id: userId, email: 'user@example.com' });
|
|
276
|
+
\`\`\`
|
|
277
|
+
|
|
278
|
+
### Auto-Sync
|
|
279
|
+
|
|
280
|
+
\`\`\`tsx
|
|
281
|
+
import { ProfileSync } from '@/components/shared';
|
|
282
|
+
|
|
283
|
+
// Add to app to auto-sync Clerk user to Supabase
|
|
284
|
+
<ProfileSync />
|
|
285
|
+
\`\`\`
|
|
286
|
+
|
|
287
|
+
### Testing
|
|
288
|
+
|
|
289
|
+
\`\`\`tsx
|
|
290
|
+
import { render, setMockSupabaseData, setMockSupabaseError, createProfile, resetSupabaseMocks } from '@/test';
|
|
291
|
+
|
|
292
|
+
beforeEach(() => resetSupabaseMocks());
|
|
293
|
+
|
|
294
|
+
it('displays profile data', async () => {
|
|
295
|
+
setMockSupabaseData([createProfile({ full_name: 'Test User' })]);
|
|
296
|
+
render(<ProfileCard />);
|
|
297
|
+
// Assert profile is displayed
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
it('handles error', async () => {
|
|
301
|
+
setMockSupabaseError({ message: 'Failed', code: 'ERROR' });
|
|
302
|
+
render(<ProfileCard />);
|
|
303
|
+
// Assert error state
|
|
304
|
+
});
|
|
305
|
+
\`\`\`
|
|
306
|
+
|
|
307
|
+
See [docs/SUPABASE_INTEGRATION.md](docs/SUPABASE_INTEGRATION.md) for full details.`;
|
|
308
|
+
}
|
|
183
309
|
export function generateMcpSection(featureIds) {
|
|
184
310
|
let section = `
|
|
185
311
|
## MCP Servers (PREFER OVER WebSearch)
|
|
@@ -247,6 +373,42 @@ import { render, mockMatchMedia, server } from '@/test';
|
|
|
247
373
|
|
|
248
374
|
MSW handlers auto-reset after each test.`;
|
|
249
375
|
}
|
|
376
|
+
export function generateElectronSection() {
|
|
377
|
+
return `
|
|
378
|
+
## Electron Desktop
|
|
379
|
+
|
|
380
|
+
Electron wraps the React app as a native desktop application.
|
|
381
|
+
|
|
382
|
+
### Architecture
|
|
383
|
+
|
|
384
|
+
- \`src/main.ts\` - Electron main process (window creation, IPC handlers)
|
|
385
|
+
- \`src/preload.ts\` - Context bridge (secure API exposure to renderer)
|
|
386
|
+
- \`src/types/global.d.ts\` - TypeScript types for \`window.electronAPI\`
|
|
387
|
+
- \`forge.config.js\` - Electron Forge configuration
|
|
388
|
+
|
|
389
|
+
### Router Detection
|
|
390
|
+
|
|
391
|
+
The app automatically uses HashRouter when running in Electron (for \`file://\` protocol support):
|
|
392
|
+
|
|
393
|
+
\`\`\`tsx
|
|
394
|
+
const isElectron = window.electronAPI?.isElectron === true;
|
|
395
|
+
const Router = isElectron ? HashRouter : BrowserRouter;
|
|
396
|
+
\`\`\`
|
|
397
|
+
|
|
398
|
+
### Adding IPC Handlers
|
|
399
|
+
|
|
400
|
+
1. Add handler in \`src/main.ts\`: \`ipcMain.handle('channel', handler)\`
|
|
401
|
+
2. Expose in \`src/preload.ts\` via \`contextBridge.exposeInMainWorld\`
|
|
402
|
+
3. Update \`ElectronAPI\` interface in both \`preload.ts\` and \`global.d.ts\`
|
|
403
|
+
4. Call from renderer: \`window.electronAPI?.yourMethod()\`
|
|
404
|
+
|
|
405
|
+
### Security
|
|
406
|
+
|
|
407
|
+
- \`contextIsolation: true\` - Preload is isolated from page context
|
|
408
|
+
- \`nodeIntegration: false\` - No Node.js APIs in renderer
|
|
409
|
+
- \`sandbox: true\` - OS-level sandboxing enabled
|
|
410
|
+
`;
|
|
411
|
+
}
|
|
250
412
|
export function generateGotchasSection(featureIds) {
|
|
251
413
|
const gotchas = [];
|
|
252
414
|
if (featureIds.includes(FEATURE.DEVTOOLS)) {
|
|
@@ -254,12 +416,22 @@ export function generateGotchasSection(featureIds) {
|
|
|
254
416
|
gotchas.push('**Conventional commits** enforced by commitlint');
|
|
255
417
|
}
|
|
256
418
|
if (featureIds.includes(FEATURE.MOBILE)) {
|
|
257
|
-
gotchas.push('**Context hooks throw** outside provider (e.g., `useMobileContext()`)');
|
|
419
|
+
gotchas.push('**Context hooks throw** outside provider (e.g., `useMobileContext()`, `useSupabase()`)');
|
|
258
420
|
}
|
|
259
421
|
gotchas.push('**Barrel exports** in each directory via `index.ts`');
|
|
260
422
|
if (featureIds.includes(FEATURE.UI)) {
|
|
261
423
|
gotchas.push('**UI components** import directly: `@/components/ui/button` (no barrel)');
|
|
262
424
|
}
|
|
425
|
+
if (featureIds.includes(FEATURE.AUTH)) {
|
|
426
|
+
gotchas.push('**Clerk auth required** - set `VITE_CLERK_PUBLISHABLE_KEY` in `.env`');
|
|
427
|
+
}
|
|
428
|
+
if (featureIds.includes(FEATURE.DATABASE)) {
|
|
429
|
+
gotchas.push('**Supabase requires Clerk** - SupabaseProvider must be inside ClerkProvider');
|
|
430
|
+
gotchas.push('**RLS policies required** - All Supabase tables should have Row Level Security enabled');
|
|
431
|
+
}
|
|
432
|
+
if (featureIds.includes(FEATURE.ELECTRON)) {
|
|
433
|
+
gotchas.push('**Electron uses HashRouter** - file:// protocol requires hash-based routing');
|
|
434
|
+
}
|
|
263
435
|
return `
|
|
264
436
|
## Common Gotchas
|
|
265
437
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sections.js","sourceRoot":"","sources":["../../../../src/utils/scaffold/claude-md/sections.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGhD,gDAAgD;AAChD,MAAM,mBAAmB,GAA2B;IAClD,GAAG,EAAE,8BAA8B;IACnC,KAAK,EAAE,uCAAuC;IAC9C,OAAO,EAAE,0BAA0B;IACnC,SAAS,EAAE,iBAAiB;IAC5B,IAAI,EAAE,cAAc;IACpB,UAAU,EAAE,iBAAiB;IAC7B,MAAM,EAAE,iBAAiB;IACzB,cAAc,EAAE,gBAAgB;IAChC,IAAI,EAAE,aAAa;IACnB,YAAY,EAAE,mBAAmB;IACjC,eAAe,EAAE,0BAA0B;IAC3C,GAAG,EAAE,gBAAgB;IACrB,QAAQ,EAAE,oBAAoB;IAC9B,cAAc,EAAE,6BAA6B;IAC7C,OAAO,EAAE,wBAAwB;
|
|
1
|
+
{"version":3,"file":"sections.js","sourceRoot":"","sources":["../../../../src/utils/scaffold/claude-md/sections.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/compute.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/compute.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAqB9D;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,WAAW,GAAE,MAAiB,GAC7B,OAAO,CAAC,cAAc,CAAC,CAgDzB"}
|
|
@@ -11,7 +11,7 @@ import { resolveTemplatePath } from '../paths.js';
|
|
|
11
11
|
import { resolveFeatureDependencies, mergeDependencies, mergeScripts } from './dependencies.js';
|
|
12
12
|
import { computeFileStructure, getConfigFiles } from './file-structure.js';
|
|
13
13
|
import { getSetupCommands } from './commands.js';
|
|
14
|
-
import { generateClaudeMd, generateViteEnvDts, generateEnvTs, generateRoutesTs } from './generators.js';
|
|
14
|
+
import { generateClaudeMd, generateViteEnvDts, generateEnvTs, generateRoutesTs, generateGlobalDts, } from './generators.js';
|
|
15
15
|
async function readSourcePackageJson() {
|
|
16
16
|
const path = resolveTemplatePath('package.json');
|
|
17
17
|
const content = await readFile(path, 'utf-8');
|
|
@@ -49,7 +49,8 @@ export async function computeScaffold(selectedFeatures, projectName = 'my-app')
|
|
|
49
49
|
const claudeMd = generateClaudeMd(resolvedFeatures, projectName, scripts);
|
|
50
50
|
const viteEnvDts = generateViteEnvDts(resolvedFeatures);
|
|
51
51
|
const envTs = generateEnvTs(resolvedFeatures);
|
|
52
|
-
const routesTs = resolvedFeatures.includes(FEATURE.ROUTING) ? generateRoutesTs() : undefined;
|
|
52
|
+
const routesTs = resolvedFeatures.includes(FEATURE.ROUTING) ? generateRoutesTs(resolvedFeatures) : undefined;
|
|
53
|
+
const globalDts = generateGlobalDts(resolvedFeatures);
|
|
53
54
|
return {
|
|
54
55
|
packageJson: { name: projectName, dependencies, devDependencies, scripts, engines },
|
|
55
56
|
structure,
|
|
@@ -59,6 +60,7 @@ export async function computeScaffold(selectedFeatures, projectName = 'my-app')
|
|
|
59
60
|
viteEnvDts,
|
|
60
61
|
envTs,
|
|
61
62
|
routesTs,
|
|
63
|
+
globalDts,
|
|
62
64
|
docs,
|
|
63
65
|
};
|
|
64
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute.js","sourceRoot":"","sources":["../../../src/utils/scaffold/compute.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,
|
|
1
|
+
{"version":3,"file":"compute.js","sourceRoot":"","sources":["../../../src/utils/scaffold/compute.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,11 @@ export { generateClaudeMd } from './claude-md/index.js';
|
|
|
4
4
|
export declare function generateViteEnvDts(featureIds: FeatureId[]): string;
|
|
5
5
|
/** Generate env.ts content based on selected features. */
|
|
6
6
|
export declare function generateEnvTs(featureIds: FeatureId[]): string;
|
|
7
|
-
/** Generates routes.ts content. */
|
|
8
|
-
export declare function generateRoutesTs(): string;
|
|
7
|
+
/** Generates routes.ts content based on selected features. */
|
|
8
|
+
export declare function generateRoutesTs(featureIds: FeatureId[]): string;
|
|
9
|
+
/**
|
|
10
|
+
* Generates global.d.ts content based on selected features.
|
|
11
|
+
* Currently only includes ElectronAPI types when electron feature is selected.
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateGlobalDts(featureIds: FeatureId[]): string | undefined;
|
|
9
14
|
//# sourceMappingURL=generators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/generators.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/generators.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAqDlE;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CA2G7D;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAqBhE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,GAAG,SAAS,CAyC7E"}
|
|
@@ -30,6 +30,10 @@ export function generateViteEnvDts(featureIds) {
|
|
|
30
30
|
if (featureIds.includes(FEATURE.AUTH)) {
|
|
31
31
|
envVars.push(' readonly VITE_CLERK_PUBLISHABLE_KEY: string;');
|
|
32
32
|
}
|
|
33
|
+
if (featureIds.includes(FEATURE.DATABASE)) {
|
|
34
|
+
envVars.push(' readonly VITE_SUPABASE_DATABASE_URL: string;');
|
|
35
|
+
envVars.push(' readonly VITE_SUPABASE_ANON_KEY: string;');
|
|
36
|
+
}
|
|
33
37
|
// Vite built-in env vars (always required for TypeScript)
|
|
34
38
|
envVars.push(" readonly MODE: 'development' | 'production' | 'test';");
|
|
35
39
|
envVars.push(' readonly DEV: boolean;');
|
|
@@ -48,21 +52,20 @@ interface ImportMeta {
|
|
|
48
52
|
}
|
|
49
53
|
/** Generate env.ts content based on selected features. */
|
|
50
54
|
export function generateEnvTs(featureIds) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
];
|
|
55
|
+
// Check if we need the booleanEnv helper
|
|
56
|
+
const needsBooleanEnv = featureIds.includes(FEATURE.OBSERVABILITY) || featureIds.includes(FEATURE.PERFORMANCE);
|
|
57
|
+
const schemaFields = [' VITE_APP_NAME: z.string().min(1),', ' VITE_APP_URL: z.string().url(),'];
|
|
55
58
|
const envFields = [
|
|
56
59
|
' VITE_APP_NAME: import.meta.env.VITE_APP_NAME,',
|
|
57
60
|
' VITE_APP_URL: import.meta.env.VITE_APP_URL,',
|
|
58
61
|
];
|
|
59
62
|
if (featureIds.includes(FEATURE.API)) {
|
|
60
|
-
schemaFields.push(' VITE_API_URL: z.string().url()
|
|
63
|
+
schemaFields.push(' VITE_API_URL: z.string().url(),');
|
|
61
64
|
envFields.push(' VITE_API_URL: import.meta.env.VITE_API_URL,');
|
|
62
65
|
}
|
|
63
66
|
if (featureIds.includes(FEATURE.OBSERVABILITY)) {
|
|
64
|
-
schemaFields.push(' VITE_SENTRY_DSN: z.string().url()
|
|
65
|
-
schemaFields.push(' VITE_SENTRY_ENABLED:
|
|
67
|
+
schemaFields.push(' VITE_SENTRY_DSN: z.string().url(),');
|
|
68
|
+
schemaFields.push(' VITE_SENTRY_ENABLED: booleanEnv,');
|
|
66
69
|
envFields.push(' VITE_SENTRY_DSN: import.meta.env.VITE_SENTRY_DSN,');
|
|
67
70
|
envFields.push(' VITE_SENTRY_ENABLED: import.meta.env.VITE_SENTRY_ENABLED,');
|
|
68
71
|
}
|
|
@@ -70,20 +73,45 @@ export function generateEnvTs(featureIds) {
|
|
|
70
73
|
schemaFields.push(' VITE_CLERK_PUBLISHABLE_KEY: z.string().min(1),');
|
|
71
74
|
envFields.push(' VITE_CLERK_PUBLISHABLE_KEY: import.meta.env.VITE_CLERK_PUBLISHABLE_KEY,');
|
|
72
75
|
}
|
|
76
|
+
if (featureIds.includes(FEATURE.DATABASE)) {
|
|
77
|
+
schemaFields.push(' VITE_SUPABASE_DATABASE_URL: z.string().url(),');
|
|
78
|
+
schemaFields.push(' VITE_SUPABASE_ANON_KEY: z.string().min(1),');
|
|
79
|
+
envFields.push(' VITE_SUPABASE_DATABASE_URL: import.meta.env.VITE_SUPABASE_DATABASE_URL,');
|
|
80
|
+
envFields.push(' VITE_SUPABASE_ANON_KEY: import.meta.env.VITE_SUPABASE_ANON_KEY,');
|
|
81
|
+
}
|
|
82
|
+
if (featureIds.includes(FEATURE.PERFORMANCE)) {
|
|
83
|
+
schemaFields.push(' VITE_PERF_TEST: booleanEnv,');
|
|
84
|
+
envFields.push(' VITE_PERF_TEST: import.meta.env.VITE_PERF_TEST,');
|
|
85
|
+
}
|
|
73
86
|
// Vite built-in env vars (always included)
|
|
74
|
-
schemaFields.push(" MODE: z.enum(['development', 'production', 'test'])
|
|
75
|
-
schemaFields.push(' DEV: z.boolean()
|
|
76
|
-
schemaFields.push(' PROD: z.boolean()
|
|
87
|
+
schemaFields.push(" MODE: z.enum(['development', 'production', 'test']),");
|
|
88
|
+
schemaFields.push(' DEV: z.boolean(),');
|
|
89
|
+
schemaFields.push(' PROD: z.boolean(),');
|
|
77
90
|
envFields.push(' MODE: import.meta.env.MODE,');
|
|
78
91
|
envFields.push(' DEV: import.meta.env.DEV,');
|
|
79
92
|
envFields.push(' PROD: import.meta.env.PROD,');
|
|
93
|
+
// Build the booleanEnv helper if needed
|
|
94
|
+
const booleanEnvHelper = needsBooleanEnv
|
|
95
|
+
? `
|
|
96
|
+
/**
|
|
97
|
+
* Transforms string env var to boolean.
|
|
98
|
+
* - 'true', '1' → true
|
|
99
|
+
* - 'false', '0' → false
|
|
100
|
+
*/
|
|
101
|
+
const booleanEnv = z.enum(['true', 'false', '1', '0']).transform((val) => val === 'true' || val === '1');
|
|
102
|
+
|
|
103
|
+
`
|
|
104
|
+
: '';
|
|
80
105
|
return `/**
|
|
81
106
|
* Environment variable validation using Zod.
|
|
82
107
|
* Validates at runtime to catch missing/invalid env vars early.
|
|
108
|
+
*
|
|
109
|
+
* All env vars are REQUIRED. The MCP scaffold tool strips unused vars
|
|
110
|
+
* when scaffolding builds without certain features.
|
|
83
111
|
*/
|
|
84
112
|
|
|
85
113
|
import { z } from 'zod';
|
|
86
|
-
|
|
114
|
+
${booleanEnvHelper}
|
|
87
115
|
const envSchema = z.object({
|
|
88
116
|
${schemaFields.join('\n')}
|
|
89
117
|
});
|
|
@@ -92,7 +120,7 @@ export type Env = z.infer<typeof envSchema>;
|
|
|
92
120
|
|
|
93
121
|
/**
|
|
94
122
|
* Validate environment variables and return typed env object.
|
|
95
|
-
* Throws if
|
|
123
|
+
* Throws if any required env var is missing or invalid.
|
|
96
124
|
*/
|
|
97
125
|
export function validateEnv(): Env {
|
|
98
126
|
const env = {
|
|
@@ -102,15 +130,17 @@ ${envFields.join('\n')}
|
|
|
102
130
|
const result = envSchema.safeParse(env);
|
|
103
131
|
|
|
104
132
|
if (!result.success) {
|
|
105
|
-
const errors = result.error.
|
|
106
|
-
|
|
133
|
+
const errors = result.error.flatten();
|
|
134
|
+
const fieldErrors = Object.entries(errors.fieldErrors)
|
|
135
|
+
.map(([key, msgs]) => \`\${key}: \${(msgs as string[]).join(', ')}\`)
|
|
136
|
+
.join('; ');
|
|
137
|
+
const formErrors = errors.formErrors.join('; ');
|
|
138
|
+
const allErrors = [fieldErrors, formErrors].filter(Boolean).join('; ');
|
|
107
139
|
|
|
108
|
-
|
|
109
|
-
throw new Error('Invalid environment configuration');
|
|
110
|
-
}
|
|
140
|
+
throw new Error(\`Environment validation failed: \${allErrors}\`);
|
|
111
141
|
}
|
|
112
142
|
|
|
113
|
-
return result.data
|
|
143
|
+
return result.data;
|
|
114
144
|
}
|
|
115
145
|
|
|
116
146
|
/**
|
|
@@ -120,19 +150,67 @@ ${envFields.join('\n')}
|
|
|
120
150
|
export const env = validateEnv();
|
|
121
151
|
`;
|
|
122
152
|
}
|
|
123
|
-
/** Generates routes.ts content. */
|
|
124
|
-
export function generateRoutesTs() {
|
|
153
|
+
/** Generates routes.ts content based on selected features. */
|
|
154
|
+
export function generateRoutesTs(featureIds) {
|
|
155
|
+
const routes = [" HOME: '/',"];
|
|
156
|
+
// Add PROFILE route when database feature is selected
|
|
157
|
+
if (featureIds.includes(FEATURE.DATABASE)) {
|
|
158
|
+
routes.push(" PROFILE: '/profile',");
|
|
159
|
+
}
|
|
160
|
+
routes.push(" NOT_FOUND: '*',");
|
|
125
161
|
return `/**
|
|
126
162
|
* Typed route constants.
|
|
127
163
|
* Use these instead of hardcoded strings for type-safe navigation.
|
|
128
164
|
*/
|
|
129
165
|
|
|
130
166
|
export const ROUTES = {
|
|
131
|
-
|
|
132
|
-
NOT_FOUND: '*',
|
|
167
|
+
${routes.join('\n')}
|
|
133
168
|
} as const;
|
|
134
169
|
|
|
135
170
|
export type AppRoute = (typeof ROUTES)[keyof typeof ROUTES];
|
|
136
171
|
`;
|
|
137
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Generates global.d.ts content based on selected features.
|
|
175
|
+
* Currently only includes ElectronAPI types when electron feature is selected.
|
|
176
|
+
*/
|
|
177
|
+
export function generateGlobalDts(featureIds) {
|
|
178
|
+
const sections = [];
|
|
179
|
+
// Electron API types
|
|
180
|
+
if (featureIds.includes(FEATURE.ELECTRON)) {
|
|
181
|
+
sections.push(`/**
|
|
182
|
+
* Global type declarations for Electron integration.
|
|
183
|
+
* These types are automatically available in the renderer process
|
|
184
|
+
* when running inside Electron.
|
|
185
|
+
*/
|
|
186
|
+
|
|
187
|
+
interface ElectronWindowAPI {
|
|
188
|
+
setAlwaysOnTop: (enable: boolean) => Promise<boolean>;
|
|
189
|
+
setContentProtection: (enable: boolean) => Promise<boolean>;
|
|
190
|
+
getState: () => Promise<{
|
|
191
|
+
alwaysOnTop: boolean;
|
|
192
|
+
contentProtection: boolean;
|
|
193
|
+
}>;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
interface ElectronAPI {
|
|
197
|
+
window: ElectronWindowAPI;
|
|
198
|
+
platform: NodeJS.Platform;
|
|
199
|
+
isElectron: true;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
declare global {
|
|
203
|
+
interface Window {
|
|
204
|
+
electronAPI?: ElectronAPI;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export {};`);
|
|
209
|
+
}
|
|
210
|
+
// Return undefined if no content needed
|
|
211
|
+
if (sections.length === 0) {
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
return sections.join('\n\n') + '\n';
|
|
215
|
+
}
|
|
138
216
|
//# sourceMappingURL=generators.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generators.js","sourceRoot":"","sources":["../../../src/utils/scaffold/generators.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,iEAAiE;AACjE,MAAM,UAAU,kBAAkB,CAAC,UAAuB;IACxD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,wCAAwC;IACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC;;;EAGhB,CAAC,CAAC;IACF,CAAC;IAED,mCAAmC;IACnC,MAAM,OAAO,GAAa,CAAC,mCAAmC,EAAE,kCAAkC,CAAC,CAAC;IAEpG,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IACjE,CAAC;IAED,0DAA0D;IAC1D,OAAO,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACxE,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAE1C,QAAQ,CAAC,IAAI,CAAC;;;EAGd,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;EAMlB,CAAC,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AACtC,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,UAAuB;IACnD,MAAM,
|
|
1
|
+
{"version":3,"file":"generators.js","sourceRoot":"","sources":["../../../src/utils/scaffold/generators.ts"],"names":[],"mappings":"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"}
|