@react-spa-scaffold/mcp 1.1.3 → 1.2.1
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/README.md +19 -15
- package/dist/constants.d.ts +35 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +35 -0
- package/dist/constants.js.map +1 -0
- package/dist/features/definitions/api.d.ts +3 -0
- package/dist/features/definitions/api.d.ts.map +1 -0
- package/dist/features/definitions/api.js +20 -0
- package/dist/features/definitions/api.js.map +1 -0
- package/dist/features/definitions/ci.d.ts +3 -0
- package/dist/features/definitions/ci.d.ts.map +1 -0
- package/dist/features/definitions/ci.js +25 -0
- package/dist/features/definitions/ci.js.map +1 -0
- package/dist/features/definitions/core.d.ts +3 -0
- package/dist/features/definitions/core.d.ts.map +1 -0
- package/dist/features/definitions/core.js +76 -0
- package/dist/features/definitions/core.js.map +1 -0
- package/dist/features/definitions/devtools.d.ts +3 -0
- package/dist/features/definitions/devtools.d.ts.map +1 -0
- package/dist/features/definitions/devtools.js +53 -0
- package/dist/features/definitions/devtools.js.map +1 -0
- package/dist/features/definitions/forms.d.ts +3 -0
- package/dist/features/definitions/forms.d.ts.map +1 -0
- package/dist/features/definitions/forms.js +32 -0
- package/dist/features/definitions/forms.js.map +1 -0
- package/dist/features/definitions/i18n.d.ts +3 -0
- package/dist/features/definitions/i18n.d.ts.map +1 -0
- package/dist/features/definitions/i18n.js +50 -0
- package/dist/features/definitions/i18n.js.map +1 -0
- package/dist/features/definitions/index.d.ts +15 -0
- package/dist/features/definitions/index.d.ts.map +1 -0
- package/dist/features/definitions/index.js +15 -0
- package/dist/features/definitions/index.js.map +1 -0
- package/dist/features/definitions/mobile.d.ts +3 -0
- package/dist/features/definitions/mobile.d.ts.map +1 -0
- package/dist/features/definitions/mobile.js +19 -0
- package/dist/features/definitions/mobile.js.map +1 -0
- package/dist/features/definitions/observability.d.ts +3 -0
- package/dist/features/definitions/observability.d.ts.map +1 -0
- package/dist/features/definitions/observability.js +21 -0
- package/dist/features/definitions/observability.js.map +1 -0
- package/dist/features/definitions/performance.d.ts +3 -0
- package/dist/features/definitions/performance.d.ts.map +1 -0
- package/dist/features/definitions/performance.js +28 -0
- package/dist/features/definitions/performance.js.map +1 -0
- package/dist/features/definitions/routing.d.ts +3 -0
- package/dist/features/definitions/routing.d.ts.map +1 -0
- package/dist/features/definitions/routing.js +25 -0
- package/dist/features/definitions/routing.js.map +1 -0
- package/dist/features/definitions/state.d.ts +3 -0
- package/dist/features/definitions/state.d.ts.map +1 -0
- package/dist/features/definitions/state.js +27 -0
- package/dist/features/definitions/state.js.map +1 -0
- package/dist/features/definitions/testing.d.ts +3 -0
- package/dist/features/definitions/testing.d.ts.map +1 -0
- package/dist/features/definitions/testing.js +56 -0
- package/dist/features/definitions/testing.js.map +1 -0
- package/dist/features/definitions/theming.d.ts +3 -0
- package/dist/features/definitions/theming.d.ts.map +1 -0
- package/dist/features/definitions/theming.js +27 -0
- package/dist/features/definitions/theming.js.map +1 -0
- package/dist/features/definitions/ui.d.ts +3 -0
- package/dist/features/definitions/ui.d.ts.map +1 -0
- package/dist/features/definitions/ui.js +44 -0
- package/dist/features/definitions/ui.js.map +1 -0
- package/dist/features/index.d.ts +3 -2
- package/dist/features/index.d.ts.map +1 -1
- package/dist/features/index.js +2 -1
- package/dist/features/index.js.map +1 -1
- package/dist/features/registry.d.ts +3 -9
- package/dist/features/registry.d.ts.map +1 -1
- package/dist/features/registry.js +3 -554
- package/dist/features/registry.js.map +1 -1
- package/dist/features/types.d.ts +17 -20
- package/dist/features/types.d.ts.map +1 -1
- package/dist/features/types.js +7 -1
- package/dist/features/types.js.map +1 -1
- package/dist/features/types.test.d.ts +5 -0
- package/dist/features/types.test.d.ts.map +1 -0
- package/dist/features/types.test.js +32 -0
- package/dist/features/types.test.js.map +1 -0
- package/dist/resources/docs.d.ts +2 -8
- package/dist/resources/docs.d.ts.map +1 -1
- package/dist/resources/docs.js +27 -49
- package/dist/resources/docs.js.map +1 -1
- package/dist/server.d.ts +2 -7
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +24 -57
- package/dist/server.js.map +1 -1
- package/dist/server.test.d.ts +2 -0
- package/dist/server.test.d.ts.map +1 -0
- package/dist/server.test.js +14 -0
- package/dist/server.test.js.map +1 -0
- package/dist/tools/get-example.d.ts +4 -15
- package/dist/tools/get-example.d.ts.map +1 -1
- package/dist/tools/get-example.js +3 -11
- package/dist/tools/get-example.js.map +1 -1
- package/dist/tools/get-example.test.d.ts +5 -0
- package/dist/tools/get-example.test.d.ts.map +1 -0
- package/dist/tools/get-example.test.js +63 -0
- package/dist/tools/get-example.test.js.map +1 -0
- package/dist/tools/get-features.d.ts +15 -14
- package/dist/tools/get-features.d.ts.map +1 -1
- package/dist/tools/get-features.js +12 -2
- package/dist/tools/get-features.js.map +1 -1
- package/dist/tools/get-features.test.d.ts +5 -0
- package/dist/tools/get-features.test.d.ts.map +1 -0
- package/dist/tools/get-features.test.js +45 -0
- package/dist/tools/get-features.test.js.map +1 -0
- package/dist/tools/get-file.d.ts +23 -0
- package/dist/tools/get-file.d.ts.map +1 -0
- package/dist/tools/get-file.js +53 -0
- package/dist/tools/get-file.js.map +1 -0
- package/dist/tools/get-file.test.d.ts +5 -0
- package/dist/tools/get-file.test.d.ts.map +1 -0
- package/dist/tools/get-file.test.js +63 -0
- package/dist/tools/get-file.test.js.map +1 -0
- package/dist/tools/get-scaffold.d.ts +8 -29
- package/dist/tools/get-scaffold.d.ts.map +1 -1
- package/dist/tools/get-scaffold.js +18 -24
- package/dist/tools/get-scaffold.js.map +1 -1
- package/dist/tools/get-scaffold.test.d.ts +5 -0
- package/dist/tools/get-scaffold.test.d.ts.map +1 -0
- package/dist/tools/get-scaffold.test.js +197 -0
- package/dist/tools/get-scaffold.test.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/registry.d.ts +13 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +47 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +41 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +8 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils/cache.d.ts +25 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +61 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/docs.d.ts +1 -3
- package/dist/utils/docs.d.ts.map +1 -1
- package/dist/utils/docs.js +3 -8
- package/dist/utils/docs.js.map +1 -1
- package/dist/utils/docs.test.d.ts +5 -0
- package/dist/utils/docs.test.d.ts.map +1 -0
- package/dist/utils/docs.test.js +37 -0
- package/dist/utils/docs.test.js.map +1 -0
- package/dist/utils/errors.d.ts +8 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +19 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/examples/api-patterns.d.ts +3 -0
- package/dist/utils/examples/api-patterns.d.ts.map +1 -0
- package/dist/utils/examples/api-patterns.js +19 -0
- package/dist/utils/examples/api-patterns.js.map +1 -0
- package/dist/utils/examples/component-patterns.d.ts +3 -0
- package/dist/utils/examples/component-patterns.d.ts.map +1 -0
- package/dist/utils/examples/component-patterns.js +71 -0
- package/dist/utils/examples/component-patterns.js.map +1 -0
- package/dist/utils/examples/context-patterns.d.ts +3 -0
- package/dist/utils/examples/context-patterns.d.ts.map +1 -0
- package/dist/utils/examples/context-patterns.js +32 -0
- package/dist/utils/examples/context-patterns.js.map +1 -0
- package/dist/utils/examples/hook-patterns.d.ts +3 -0
- package/dist/utils/examples/hook-patterns.d.ts.map +1 -0
- package/dist/utils/examples/hook-patterns.js +55 -0
- package/dist/utils/examples/hook-patterns.js.map +1 -0
- package/dist/utils/examples/i18n-patterns.d.ts +3 -0
- package/dist/utils/examples/i18n-patterns.d.ts.map +1 -0
- package/dist/utils/examples/i18n-patterns.js +43 -0
- package/dist/utils/examples/i18n-patterns.js.map +1 -0
- package/dist/utils/examples/index.d.ts +12 -0
- package/dist/utils/examples/index.d.ts.map +1 -0
- package/dist/utils/examples/index.js +65 -0
- package/dist/utils/examples/index.js.map +1 -0
- package/dist/utils/examples/mobile-patterns.d.ts +3 -0
- package/dist/utils/examples/mobile-patterns.d.ts.map +1 -0
- package/dist/utils/examples/mobile-patterns.js +38 -0
- package/dist/utils/examples/mobile-patterns.js.map +1 -0
- package/dist/utils/examples/page-patterns.d.ts +3 -0
- package/dist/utils/examples/page-patterns.d.ts.map +1 -0
- package/dist/utils/examples/page-patterns.js +34 -0
- package/dist/utils/examples/page-patterns.js.map +1 -0
- package/dist/utils/examples/patterns.test.d.ts +6 -0
- package/dist/utils/examples/patterns.test.d.ts.map +1 -0
- package/dist/utils/examples/patterns.test.js +75 -0
- package/dist/utils/examples/patterns.test.js.map +1 -0
- package/dist/utils/examples/store-patterns.d.ts +3 -0
- package/dist/utils/examples/store-patterns.d.ts.map +1 -0
- package/dist/utils/examples/store-patterns.js +40 -0
- package/dist/utils/examples/store-patterns.js.map +1 -0
- package/dist/utils/examples/test-patterns.d.ts +3 -0
- package/dist/utils/examples/test-patterns.d.ts.map +1 -0
- package/dist/utils/examples/test-patterns.js +58 -0
- package/dist/utils/examples/test-patterns.js.map +1 -0
- package/dist/utils/examples/types.d.ts +17 -0
- package/dist/utils/examples/types.d.ts.map +1 -0
- package/dist/utils/examples/types.js +2 -0
- package/dist/utils/examples/types.js.map +1 -0
- package/dist/utils/examples/utility-patterns.d.ts +3 -0
- package/dist/utils/examples/utility-patterns.d.ts.map +1 -0
- package/dist/utils/examples/utility-patterns.js +77 -0
- package/dist/utils/examples/utility-patterns.js.map +1 -0
- package/dist/utils/index.d.ts +5 -3
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +5 -3
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/paths.d.ts +13 -23
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +28 -39
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/paths.test.d.ts +2 -0
- package/dist/utils/paths.test.d.ts.map +1 -0
- package/dist/utils/paths.test.js +38 -0
- package/dist/utils/paths.test.js.map +1 -0
- package/dist/utils/scaffold/claude-md/index.d.ts +7 -0
- package/dist/utils/scaffold/claude-md/index.d.ts.map +1 -0
- package/dist/utils/scaffold/claude-md/index.js +23 -0
- package/dist/utils/scaffold/claude-md/index.js.map +1 -0
- package/dist/utils/scaffold/claude-md/sections.d.ts +16 -0
- package/dist/utils/scaffold/claude-md/sections.d.ts.map +1 -0
- package/dist/utils/scaffold/claude-md/sections.js +269 -0
- package/dist/utils/scaffold/claude-md/sections.js.map +1 -0
- package/dist/utils/scaffold/commands.d.ts +7 -0
- package/dist/utils/scaffold/commands.d.ts.map +1 -0
- package/dist/utils/scaffold/commands.js +19 -0
- package/dist/utils/scaffold/commands.js.map +1 -0
- package/dist/utils/scaffold/compute.d.ts +15 -0
- package/dist/utils/scaffold/compute.d.ts.map +1 -0
- package/dist/utils/scaffold/compute.js +63 -0
- package/dist/utils/scaffold/compute.js.map +1 -0
- package/dist/utils/scaffold/dependencies.d.ts +25 -0
- package/dist/utils/scaffold/dependencies.d.ts.map +1 -0
- package/dist/utils/scaffold/dependencies.js +101 -0
- package/dist/utils/scaffold/dependencies.js.map +1 -0
- package/dist/utils/scaffold/file-structure.d.ts +23 -0
- package/dist/utils/scaffold/file-structure.d.ts.map +1 -0
- package/dist/utils/scaffold/file-structure.js +62 -0
- package/dist/utils/scaffold/file-structure.js.map +1 -0
- package/dist/utils/scaffold/generators.d.ts +9 -0
- package/dist/utils/scaffold/generators.d.ts.map +1 -0
- package/dist/utils/scaffold/generators.js +121 -0
- package/dist/utils/scaffold/generators.js.map +1 -0
- package/dist/utils/scaffold/index.d.ts +10 -0
- package/dist/utils/scaffold/index.d.ts.map +1 -0
- package/dist/utils/scaffold/index.js +9 -0
- package/dist/utils/scaffold/index.js.map +1 -0
- package/package.json +2 -2
- package/templates/.github/workflows/release.yml +1 -1
- package/templates/e2e/tests/home.spec.ts +2 -2
- package/templates/e2e/tests/language.spec.ts +7 -3
- package/dist/utils/examples.d.ts +0 -27
- package/dist/utils/examples.d.ts.map +0 -1
- package/dist/utils/examples.js +0 -438
- package/dist/utils/examples.js.map +0 -1
- package/dist/utils/scaffold.d.ts +0 -59
- package/dist/utils/scaffold.d.ts.map +0 -1
- package/dist/utils/scaffold.js +0 -637
- package/dist/utils/scaffold.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections.js","sourceRoot":"","sources":["../../../../src/utils/scaffold/claude-md/sections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup commands utility - generates npm commands for scaffolded projects.
|
|
3
|
+
*/
|
|
4
|
+
import type { FeatureId } from '../../features/types.js';
|
|
5
|
+
/** Generate setup commands based on selected features. */
|
|
6
|
+
export declare function getSetupCommands(featureIds: FeatureId[]): string[];
|
|
7
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAgBlE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup commands utility - generates npm commands for scaffolded projects.
|
|
3
|
+
*/
|
|
4
|
+
import { FEATURE, SCRIPT } from '../../constants.js';
|
|
5
|
+
/** Generate setup commands based on selected features. */
|
|
6
|
+
export function getSetupCommands(featureIds) {
|
|
7
|
+
const commands = ['npm install'];
|
|
8
|
+
if (featureIds.includes(FEATURE.DEVTOOLS)) {
|
|
9
|
+
commands.push(`npm run ${SCRIPT.PREPARE}`);
|
|
10
|
+
}
|
|
11
|
+
if (featureIds.includes(FEATURE.TESTING)) {
|
|
12
|
+
commands.push('npx playwright install chromium');
|
|
13
|
+
}
|
|
14
|
+
if (featureIds.includes(FEATURE.I18N)) {
|
|
15
|
+
commands.push(`npm run ${SCRIPT.I18N_EXTRACT}`);
|
|
16
|
+
}
|
|
17
|
+
return commands;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/utils/scaffold/commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAGrD,0DAA0D;AAC1D,MAAM,UAAU,gBAAgB,CAAC,UAAuB;IACtD,MAAM,QAAQ,GAAa,CAAC,aAAa,CAAC,CAAC;IAE3C,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scaffold computation orchestrator - coordinates all components.
|
|
3
|
+
*
|
|
4
|
+
* Returns paths only for configFiles and docs (lazy loading).
|
|
5
|
+
* Use get_file tool to fetch actual content.
|
|
6
|
+
*/
|
|
7
|
+
import type { ScaffoldResult } from '../../features/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Computes complete scaffold for selected features.
|
|
10
|
+
*
|
|
11
|
+
* Returns paths only for configFiles and docs (lazy loading).
|
|
12
|
+
* Use get_file tool to fetch actual content when needed.
|
|
13
|
+
*/
|
|
14
|
+
export declare function computeScaffold(selectedFeatures: string[], projectName?: string): Promise<ScaffoldResult>;
|
|
15
|
+
//# sourceMappingURL=compute.d.ts.map
|
|
@@ -0,0 +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;AAe9D;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,WAAW,GAAE,MAAiB,GAC7B,OAAO,CAAC,cAAc,CAAC,CA2CzB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scaffold computation orchestrator - coordinates all components.
|
|
3
|
+
*
|
|
4
|
+
* Returns paths only for configFiles and docs (lazy loading).
|
|
5
|
+
* Use get_file tool to fetch actual content.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile } from 'fs/promises';
|
|
8
|
+
import { FEATURE } from '../../constants.js';
|
|
9
|
+
import { computeDocsForFeatures } from '../docs.js';
|
|
10
|
+
import { resolveTemplatePath } from '../paths.js';
|
|
11
|
+
import { resolveFeatureDependencies, mergeDependencies, mergeScripts } from './dependencies.js';
|
|
12
|
+
import { computeFileStructure, getConfigFiles } from './file-structure.js';
|
|
13
|
+
import { getSetupCommands } from './commands.js';
|
|
14
|
+
import { generateClaudeMd, generateViteEnvDts, generateEnvTs, generateRoutesTs } from './generators.js';
|
|
15
|
+
async function readSourcePackageJson() {
|
|
16
|
+
const path = resolveTemplatePath('package.json');
|
|
17
|
+
const content = await readFile(path, 'utf-8');
|
|
18
|
+
return JSON.parse(content);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Computes complete scaffold for selected features.
|
|
22
|
+
*
|
|
23
|
+
* Returns paths only for configFiles and docs (lazy loading).
|
|
24
|
+
* Use get_file tool to fetch actual content when needed.
|
|
25
|
+
*/
|
|
26
|
+
export async function computeScaffold(selectedFeatures, projectName = 'my-app') {
|
|
27
|
+
// Resolve all dependencies (sync)
|
|
28
|
+
const resolvedFeatures = resolveFeatureDependencies(selectedFeatures);
|
|
29
|
+
// Parallel async operations: package.json and dependencies
|
|
30
|
+
const [sourcePackageJson, depsResult] = await Promise.all([
|
|
31
|
+
readSourcePackageJson(),
|
|
32
|
+
mergeDependencies(resolvedFeatures),
|
|
33
|
+
]);
|
|
34
|
+
const engines = sourcePackageJson.engines || {};
|
|
35
|
+
const { dependencies, devDependencies, warnings } = depsResult;
|
|
36
|
+
if (warnings.length > 0) {
|
|
37
|
+
console.error('[MCP] Dependency warnings:', warnings.join('; '));
|
|
38
|
+
}
|
|
39
|
+
// Sync operations
|
|
40
|
+
const scripts = mergeScripts(resolvedFeatures);
|
|
41
|
+
const docs = computeDocsForFeatures(resolvedFeatures);
|
|
42
|
+
const structure = [...computeFileStructure(resolvedFeatures), 'CLAUDE.md', ...docs];
|
|
43
|
+
const setupCommands = getSetupCommands(resolvedFeatures);
|
|
44
|
+
// Config files: paths only (lazy loading)
|
|
45
|
+
const configFiles = getConfigFiles(resolvedFeatures);
|
|
46
|
+
// Generate content (sync)
|
|
47
|
+
const claudeMd = generateClaudeMd(resolvedFeatures, projectName, scripts);
|
|
48
|
+
const viteEnvDts = generateViteEnvDts(resolvedFeatures);
|
|
49
|
+
const envTs = generateEnvTs(resolvedFeatures);
|
|
50
|
+
const routesTs = resolvedFeatures.includes(FEATURE.ROUTING) ? generateRoutesTs() : undefined;
|
|
51
|
+
return {
|
|
52
|
+
packageJson: { name: projectName, dependencies, devDependencies, scripts, engines },
|
|
53
|
+
structure,
|
|
54
|
+
configFiles,
|
|
55
|
+
setupCommands,
|
|
56
|
+
claudeMd,
|
|
57
|
+
viteEnvDts,
|
|
58
|
+
envTs,
|
|
59
|
+
routesTs,
|
|
60
|
+
docs,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=compute.js.map
|
|
@@ -0,0 +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,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExG,KAAK,UAAU,qBAAqB;IAClC,MAAM,IAAI,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,gBAA0B,EAC1B,cAAsB,QAAQ;IAE9B,kCAAkC;IAClC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;IAEtE,2DAA2D;IAC3D,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxD,qBAAqB,EAAE;QACvB,iBAAiB,CAAC,gBAAgB,CAAC;KACpC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAI,iBAAiB,CAAC,OAAkC,IAAI,EAAE,CAAC;IAC5E,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;IAE/D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,kBAAkB;IAClB,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,CAAC,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,CAAC;IACpF,MAAM,aAAa,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAEzD,0CAA0C;IAC1C,MAAM,WAAW,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAErD,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,gBAAgB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7F,OAAO;QACL,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE;QACnF,SAAS;QACT,WAAW;QACX,aAAa;QACb,QAAQ;QACR,UAAU;QACV,KAAK;QACL,QAAQ;QACR,IAAI;KACL,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency resolution - merges features and resolves versions from package.json.
|
|
3
|
+
*/
|
|
4
|
+
import type { FeatureId } from '../../features/types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Resolves feature dependencies and auto-includes required features.
|
|
7
|
+
* Core is always included. Dependencies declared via `requires` field are resolved recursively.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveFeatureDependencies(selectedFeatures: string[]): FeatureId[];
|
|
10
|
+
/** Result of merging dependencies with any warnings. */
|
|
11
|
+
export interface MergeDependenciesResult {
|
|
12
|
+
dependencies: Record<string, string>;
|
|
13
|
+
devDependencies: Record<string, string>;
|
|
14
|
+
warnings: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Merges dependencies from multiple features.
|
|
18
|
+
* Returns structured warnings instead of logging to console.
|
|
19
|
+
*/
|
|
20
|
+
export declare function mergeDependencies(featureIds: FeatureId[]): Promise<MergeDependenciesResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Merge scripts from multiple features
|
|
23
|
+
*/
|
|
24
|
+
export declare function mergeScripts(featureIds: FeatureId[]): Record<string, string>;
|
|
25
|
+
//# sourceMappingURL=dependencies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/dependencies.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAwBzD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CA2BlF;AAED,wDAAwD;AACxD,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAuCjG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAW5E"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency resolution - merges features and resolves versions from package.json.
|
|
3
|
+
*/
|
|
4
|
+
import { readFile } from 'fs/promises';
|
|
5
|
+
import { FEATURES, isFeatureId } from '../../features/index.js';
|
|
6
|
+
import { createSingletonCache } from '../cache.js';
|
|
7
|
+
import { resolveTemplatePath } from '../paths.js';
|
|
8
|
+
const sourceDepsCache = createSingletonCache();
|
|
9
|
+
/** Read and cache the source package.json dependencies. */
|
|
10
|
+
async function getSourceDependencies() {
|
|
11
|
+
return sourceDepsCache.getOrSet(async () => {
|
|
12
|
+
const path = resolveTemplatePath('package.json');
|
|
13
|
+
const content = await readFile(path, 'utf-8');
|
|
14
|
+
const pkg = JSON.parse(content);
|
|
15
|
+
return {
|
|
16
|
+
dependencies: (pkg.dependencies || {}),
|
|
17
|
+
devDependencies: (pkg.devDependencies || {}),
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Resolves feature dependencies and auto-includes required features.
|
|
23
|
+
* Core is always included. Dependencies declared via `requires` field are resolved recursively.
|
|
24
|
+
*/
|
|
25
|
+
export function resolveFeatureDependencies(selectedFeatures) {
|
|
26
|
+
const resolved = new Set();
|
|
27
|
+
function addWithDeps(featureId) {
|
|
28
|
+
if (resolved.has(featureId))
|
|
29
|
+
return;
|
|
30
|
+
resolved.add(featureId);
|
|
31
|
+
// Recursively add dependencies declared in `requires`
|
|
32
|
+
const feature = FEATURES[featureId];
|
|
33
|
+
if (feature.requires) {
|
|
34
|
+
for (const dep of feature.requires) {
|
|
35
|
+
addWithDeps(dep);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Always include core first
|
|
40
|
+
resolved.add('core');
|
|
41
|
+
// Add selected features with their dependencies
|
|
42
|
+
for (const featureId of selectedFeatures) {
|
|
43
|
+
if (isFeatureId(featureId)) {
|
|
44
|
+
addWithDeps(featureId);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return Array.from(resolved);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Merges dependencies from multiple features.
|
|
51
|
+
* Returns structured warnings instead of logging to console.
|
|
52
|
+
*/
|
|
53
|
+
export async function mergeDependencies(featureIds) {
|
|
54
|
+
const dependencies = {};
|
|
55
|
+
const devDependencies = {};
|
|
56
|
+
const warnings = [];
|
|
57
|
+
const sourcePkg = await getSourceDependencies();
|
|
58
|
+
for (const featureId of featureIds) {
|
|
59
|
+
const feature = FEATURES[featureId];
|
|
60
|
+
if (feature.dependencyNames) {
|
|
61
|
+
for (const name of feature.dependencyNames) {
|
|
62
|
+
if (sourcePkg.dependencies[name]) {
|
|
63
|
+
dependencies[name] = sourcePkg.dependencies[name];
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
warnings.push(`Dependency "${name}" not found in source package.json (feature: ${featureId})`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (feature.devDependencyNames) {
|
|
71
|
+
for (const name of feature.devDependencyNames) {
|
|
72
|
+
if (sourcePkg.devDependencies[name]) {
|
|
73
|
+
devDependencies[name] = sourcePkg.devDependencies[name];
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
warnings.push(`DevDependency "${name}" not found in source package.json (feature: ${featureId})`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const sortObject = (obj) => Object.fromEntries(Object.entries(obj).sort(([a], [b]) => a.localeCompare(b)));
|
|
82
|
+
return {
|
|
83
|
+
dependencies: sortObject(dependencies),
|
|
84
|
+
devDependencies: sortObject(devDependencies),
|
|
85
|
+
warnings,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Merge scripts from multiple features
|
|
90
|
+
*/
|
|
91
|
+
export function mergeScripts(featureIds) {
|
|
92
|
+
const scripts = {};
|
|
93
|
+
for (const featureId of featureIds) {
|
|
94
|
+
const feature = FEATURES[featureId];
|
|
95
|
+
if (feature.scripts) {
|
|
96
|
+
Object.assign(scripts, feature.scripts);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return scripts;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../../src/utils/scaffold/dependencies.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAOlD,MAAM,eAAe,GAAG,oBAAoB,EAAc,CAAC;AAE3D,2DAA2D;AAC3D,KAAK,UAAU,qBAAqB;IAClC,OAAO,eAAe,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;QACzC,MAAM,IAAI,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO;YACL,YAAY,EAAE,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAA2B;YAChE,eAAe,EAAE,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAA2B;SACvE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,gBAA0B;IACnE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAa,CAAC;IAEtC,SAAS,WAAW,CAAC,SAAoB;QACvC,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO;QACpC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAExB,sDAAsD;QACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACnC,WAAW,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAErB,gDAAgD;IAChD,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;QACzC,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,WAAW,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AASD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAuB;IAC7D,MAAM,YAAY,GAA2B,EAAE,CAAC;IAChD,MAAM,eAAe,GAA2B,EAAE,CAAC;IACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,MAAM,SAAS,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAEhD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEpC,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC3C,IAAI,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjC,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACpD,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,CAAC,eAAe,IAAI,gDAAgD,SAAS,GAAG,CAAC,CAAC;gBACjG,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBAC9C,IAAI,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpC,eAAe,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAC1D,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,CAAC,kBAAkB,IAAI,gDAAgD,SAAS,GAAG,CAAC,CAAC;gBACpG,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,GAA2B,EAAE,EAAE,CACjD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjF,OAAO;QACL,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC;QACtC,eAAe,EAAE,UAAU,CAAC,eAAe,CAAC;QAC5C,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAAuB;IAClD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File structure utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles computing which files to include based on selected features.
|
|
5
|
+
*/
|
|
6
|
+
import type { FeatureId } from '../../features/types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Compute file structure for selected features
|
|
9
|
+
*
|
|
10
|
+
* When the 'testing' feature is selected, testFiles from all selected features
|
|
11
|
+
* are also included. This ensures scaffolded projects get tests that match
|
|
12
|
+
* their source files.
|
|
13
|
+
*/
|
|
14
|
+
export declare function computeFileStructure(featureIds: FeatureId[]): string[];
|
|
15
|
+
/**
|
|
16
|
+
* Get config files needed for selected features
|
|
17
|
+
*/
|
|
18
|
+
export declare function getConfigFiles(featureIds: FeatureId[]): string[];
|
|
19
|
+
/**
|
|
20
|
+
* Read config file content from template
|
|
21
|
+
*/
|
|
22
|
+
export declare function readConfigFileContent(configPath: string): Promise<string>;
|
|
23
|
+
//# sourceMappingURL=file-structure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-structure.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/file-structure.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGzD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAqBtE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAahE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS/E"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File structure utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles computing which files to include based on selected features.
|
|
5
|
+
*/
|
|
6
|
+
import { readFile } from 'fs/promises';
|
|
7
|
+
import { FEATURES } from '../../features/index.js';
|
|
8
|
+
import { resolveTemplatePath } from '../paths.js';
|
|
9
|
+
/**
|
|
10
|
+
* Compute file structure for selected features
|
|
11
|
+
*
|
|
12
|
+
* When the 'testing' feature is selected, testFiles from all selected features
|
|
13
|
+
* are also included. This ensures scaffolded projects get tests that match
|
|
14
|
+
* their source files.
|
|
15
|
+
*/
|
|
16
|
+
export function computeFileStructure(featureIds) {
|
|
17
|
+
const files = new Set();
|
|
18
|
+
const includeTests = featureIds.includes('testing');
|
|
19
|
+
for (const featureId of featureIds) {
|
|
20
|
+
const feature = FEATURES[featureId];
|
|
21
|
+
// Always include source files
|
|
22
|
+
for (const file of feature.files) {
|
|
23
|
+
files.add(file);
|
|
24
|
+
}
|
|
25
|
+
// Include test files only when testing feature is selected
|
|
26
|
+
if (includeTests && feature.testFiles) {
|
|
27
|
+
for (const file of feature.testFiles) {
|
|
28
|
+
files.add(file);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return Array.from(files).sort();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get config files needed for selected features
|
|
36
|
+
*/
|
|
37
|
+
export function getConfigFiles(featureIds) {
|
|
38
|
+
const configs = new Set();
|
|
39
|
+
for (const featureId of featureIds) {
|
|
40
|
+
const feature = FEATURES[featureId];
|
|
41
|
+
if (feature.configFiles) {
|
|
42
|
+
for (const config of feature.configFiles) {
|
|
43
|
+
configs.add(config);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return Array.from(configs).sort();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Read config file content from template
|
|
51
|
+
*/
|
|
52
|
+
export async function readConfigFileContent(configPath) {
|
|
53
|
+
const fullPath = resolveTemplatePath(configPath);
|
|
54
|
+
try {
|
|
55
|
+
return await readFile(fullPath, 'utf-8');
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// File might not exist if running outside react-spa-scaffold
|
|
59
|
+
return `// File not found: ${configPath}\n// Run MCP server from within react-spa-scaffold repository`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=file-structure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-structure.js","sourceRoot":"","sources":["../../../src/utils/scaffold/file-structure.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAAuB;IAC1D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEpD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEpC,8BAA8B;QAC9B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QAED,2DAA2D;QAC3D,IAAI,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACrC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAuB;IACpD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,UAAkB;IAC5D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;QAC7D,OAAO,sBAAsB,UAAU,+DAA+D,CAAC;IACzG,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FeatureId } from '../../features/types.js';
|
|
2
|
+
export { generateClaudeMd } from './claude-md/index.js';
|
|
3
|
+
/** Generate vite-env.d.ts content based on selected features. */
|
|
4
|
+
export declare function generateViteEnvDts(featureIds: FeatureId[]): string;
|
|
5
|
+
/** Generate env.ts content based on selected features. */
|
|
6
|
+
export declare function generateEnvTs(featureIds: FeatureId[]): string;
|
|
7
|
+
/** Generates routes.ts content. */
|
|
8
|
+
export declare function generateRoutesTs(): string;
|
|
9
|
+
//# sourceMappingURL=generators.d.ts.map
|
|
@@ -0,0 +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,CAgClE;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAwE7D;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,IAAI,MAAM,CAazC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// noinspection JSUnresolvedReference
|
|
2
|
+
/**
|
|
3
|
+
* Content generators for env.ts, routes.ts, vite-env.d.ts.
|
|
4
|
+
* CLAUDE.md generation moved to ./claude-md/
|
|
5
|
+
*/
|
|
6
|
+
import { FEATURE } from '../../constants.js';
|
|
7
|
+
export { generateClaudeMd } from './claude-md/index.js';
|
|
8
|
+
/** Generate vite-env.d.ts content based on selected features. */
|
|
9
|
+
export function generateViteEnvDts(featureIds) {
|
|
10
|
+
const sections = [];
|
|
11
|
+
if (featureIds.includes(FEATURE.I18N)) {
|
|
12
|
+
sections.push(`declare module '*.po' {
|
|
13
|
+
import type { Messages } from '@lingui/core';
|
|
14
|
+
export const messages: Messages;
|
|
15
|
+
}`);
|
|
16
|
+
}
|
|
17
|
+
const envVars = [' readonly VITE_APP_NAME: string;', ' readonly VITE_APP_URL: string;'];
|
|
18
|
+
if (featureIds.includes(FEATURE.API)) {
|
|
19
|
+
envVars.push(' readonly VITE_API_URL: string;');
|
|
20
|
+
}
|
|
21
|
+
if (featureIds.includes(FEATURE.OBSERVABILITY)) {
|
|
22
|
+
envVars.push(' readonly VITE_SENTRY_DSN: string;');
|
|
23
|
+
envVars.push(' readonly VITE_SENTRY_ENABLED: string;');
|
|
24
|
+
}
|
|
25
|
+
sections.push(`/// <reference types="vite/client" />
|
|
26
|
+
|
|
27
|
+
interface ImportMetaEnv {
|
|
28
|
+
${envVars.join('\n')}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface ImportMeta {
|
|
32
|
+
readonly env: ImportMetaEnv;
|
|
33
|
+
}`);
|
|
34
|
+
return sections.join('\n\n') + '\n';
|
|
35
|
+
}
|
|
36
|
+
/** Generate env.ts content based on selected features. */
|
|
37
|
+
export function generateEnvTs(featureIds) {
|
|
38
|
+
const schemaFields = [
|
|
39
|
+
' VITE_APP_NAME: z.string().min(1).optional(),',
|
|
40
|
+
' VITE_APP_URL: z.string().url().optional(),',
|
|
41
|
+
];
|
|
42
|
+
const envFields = [
|
|
43
|
+
' VITE_APP_NAME: import.meta.env.VITE_APP_NAME,',
|
|
44
|
+
' VITE_APP_URL: import.meta.env.VITE_APP_URL,',
|
|
45
|
+
];
|
|
46
|
+
if (featureIds.includes(FEATURE.API)) {
|
|
47
|
+
schemaFields.push(' VITE_API_URL: z.string().url().optional(),');
|
|
48
|
+
envFields.push(' VITE_API_URL: import.meta.env.VITE_API_URL,');
|
|
49
|
+
}
|
|
50
|
+
if (featureIds.includes(FEATURE.OBSERVABILITY)) {
|
|
51
|
+
schemaFields.push(' VITE_SENTRY_DSN: z.string().url().optional(),');
|
|
52
|
+
schemaFields.push(' VITE_SENTRY_ENABLED: z.string().optional(),');
|
|
53
|
+
envFields.push(' VITE_SENTRY_DSN: import.meta.env.VITE_SENTRY_DSN,');
|
|
54
|
+
envFields.push(' VITE_SENTRY_ENABLED: import.meta.env.VITE_SENTRY_ENABLED,');
|
|
55
|
+
}
|
|
56
|
+
// Vite built-in env vars (always included)
|
|
57
|
+
schemaFields.push(" MODE: z.enum(['development', 'production', 'test']).default('development'),");
|
|
58
|
+
schemaFields.push(' DEV: z.boolean().default(false),');
|
|
59
|
+
schemaFields.push(' PROD: z.boolean().default(false),');
|
|
60
|
+
envFields.push(' MODE: import.meta.env.MODE,');
|
|
61
|
+
envFields.push(' DEV: import.meta.env.DEV,');
|
|
62
|
+
envFields.push(' PROD: import.meta.env.PROD,');
|
|
63
|
+
return `/**
|
|
64
|
+
* Environment variable validation using Zod.
|
|
65
|
+
* Validates at runtime to catch missing/invalid env vars early.
|
|
66
|
+
*/
|
|
67
|
+
|
|
68
|
+
import { z } from 'zod';
|
|
69
|
+
|
|
70
|
+
const envSchema = z.object({
|
|
71
|
+
${schemaFields.join('\n')}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
export type Env = z.infer<typeof envSchema>;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Validate environment variables and return typed env object.
|
|
78
|
+
* Throws if validation fails in production.
|
|
79
|
+
*/
|
|
80
|
+
export function validateEnv(): Env {
|
|
81
|
+
const env = {
|
|
82
|
+
${envFields.join('\n')}
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const result = envSchema.safeParse(env);
|
|
86
|
+
|
|
87
|
+
if (!result.success) {
|
|
88
|
+
const errors = result.error.format();
|
|
89
|
+
console.error('Environment validation failed:', errors);
|
|
90
|
+
|
|
91
|
+
if (import.meta.env.PROD) {
|
|
92
|
+
throw new Error('Invalid environment configuration');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return result.data
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Validated environment variables.
|
|
101
|
+
* Access this instead of import.meta.env for type safety.
|
|
102
|
+
*/
|
|
103
|
+
export const env = validateEnv();
|
|
104
|
+
`;
|
|
105
|
+
}
|
|
106
|
+
/** Generates routes.ts content. */
|
|
107
|
+
export function generateRoutesTs() {
|
|
108
|
+
return `/**
|
|
109
|
+
* Typed route constants.
|
|
110
|
+
* Use these instead of hardcoded strings for type-safe navigation.
|
|
111
|
+
*/
|
|
112
|
+
|
|
113
|
+
export const ROUTES = {
|
|
114
|
+
HOME: '/',
|
|
115
|
+
NOT_FOUND: '*',
|
|
116
|
+
} as const;
|
|
117
|
+
|
|
118
|
+
export type AppRoute = (typeof ROUTES)[keyof typeof ROUTES];
|
|
119
|
+
`;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=generators.js.map
|
|
@@ -0,0 +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,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC;;;EAGhB,CAAC,CAAC;IACF,CAAC;IAED,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,QAAQ,CAAC,IAAI,CAAC;;;EAGd,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;EAKlB,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,YAAY,GAAa;QAC7B,gDAAgD;QAChD,8CAA8C;KAC/C,CAAC;IACF,MAAM,SAAS,GAAa;QAC1B,mDAAmD;QACnD,iDAAiD;KAClD,CAAC;IAEF,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,YAAY,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/C,YAAY,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACrE,YAAY,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QACnE,SAAS,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACxE,SAAS,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAClF,CAAC;IAED,2CAA2C;IAC3C,YAAY,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;IACnG,YAAY,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACxD,YAAY,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACzD,SAAS,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAClD,SAAS,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAChD,SAAS,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAElD,OAAO;;;;;;;;EAQP,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;EAWvB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;CAsBrB,CAAC;AACF,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,gBAAgB;IAC9B,OAAO;;;;;;;;;;;CAWR,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scaffold utilities - re-exports for convenient importing.
|
|
3
|
+
*/
|
|
4
|
+
export { resolveFeatureDependencies, mergeDependencies, mergeScripts } from './dependencies.js';
|
|
5
|
+
export type { MergeDependenciesResult } from './dependencies.js';
|
|
6
|
+
export { computeFileStructure, getConfigFiles, readConfigFileContent } from './file-structure.js';
|
|
7
|
+
export { getSetupCommands } from './commands.js';
|
|
8
|
+
export { generateClaudeMd, generateViteEnvDts, generateEnvTs, generateRoutesTs } from './generators.js';
|
|
9
|
+
export { computeScaffold } from './compute.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChG,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scaffold utilities - re-exports for convenient importing.
|
|
3
|
+
*/
|
|
4
|
+
export { resolveFeatureDependencies, mergeDependencies, mergeScripts } from './dependencies.js';
|
|
5
|
+
export { computeFileStructure, getConfigFiles, readConfigFileContent } from './file-structure.js';
|
|
6
|
+
export { getSetupCommands } from './commands.js';
|
|
7
|
+
export { generateClaudeMd, generateViteEnvDts, generateEnvTs, generateRoutesTs } from './generators.js';
|
|
8
|
+
export { computeScaffold } from './compute.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/scaffold/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEhG,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-spa-scaffold/mcp",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "MCP server for scaffolding projects based on react-spa-scaffold template",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"zod": "^4.2.1"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@types/node": "^22.15.0",
|
|
47
46
|
"@react-spa-scaffold/tsconfig": "*",
|
|
47
|
+
"@types/node": "^22.15.0",
|
|
48
48
|
"typescript": "~5.9.0",
|
|
49
49
|
"vitest": "^4.0.16"
|
|
50
50
|
},
|
|
@@ -16,8 +16,8 @@ test.describe('Home Page', () => {
|
|
|
16
16
|
// Main content area
|
|
17
17
|
await expect(page.getByRole('main')).toBeVisible();
|
|
18
18
|
|
|
19
|
-
// App title in header
|
|
20
|
-
await expect(page.getByRole('heading', { level: 1 })).toBeVisible();
|
|
19
|
+
// App title in header (specific to header to avoid conflict with page heading)
|
|
20
|
+
await expect(page.getByRole('banner').getByRole('heading', { level: 1 })).toBeVisible();
|
|
21
21
|
});
|
|
22
22
|
|
|
23
23
|
test('skip link navigates to main content', async ({ page }) => {
|
|
@@ -21,16 +21,20 @@ test.describe('Language Switcher', () => {
|
|
|
21
21
|
|
|
22
22
|
test('closes dropdown after selection', async ({ page }) => {
|
|
23
23
|
await page.getByRole('button', { name: /change language/i }).click();
|
|
24
|
-
|
|
24
|
+
|
|
25
|
+
// Wait for dropdown to fully appear before clicking
|
|
26
|
+
const menuItem = page.getByRole('menuitem', { name: 'Español' });
|
|
27
|
+
await expect(menuItem).toBeVisible();
|
|
28
|
+
await menuItem.click();
|
|
25
29
|
|
|
26
30
|
// Dropdown should close - other options not visible
|
|
27
|
-
await expect(page.
|
|
31
|
+
await expect(page.getByRole('menuitem', { name: 'Deutsch' })).not.toBeVisible();
|
|
28
32
|
});
|
|
29
33
|
|
|
30
34
|
test('persists language preference across reload', async ({ page }) => {
|
|
31
35
|
// Change to Spanish
|
|
32
36
|
await page.getByRole('button', { name: /change language/i }).click();
|
|
33
|
-
await page.
|
|
37
|
+
await page.getByRole('menuitem', { name: 'Español' }).click();
|
|
34
38
|
|
|
35
39
|
// Wait for language change to apply
|
|
36
40
|
await expect(page.getByRole('heading', { name: /bienvenido/i })).toBeVisible();
|
package/dist/utils/examples.d.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Code example utilities
|
|
3
|
-
*
|
|
4
|
-
* Maps pattern types to actual files in the react-spa-scaffold repository.
|
|
5
|
-
* When the MCP server runs, it reads these files to provide real,
|
|
6
|
-
* working examples to AI agents.
|
|
7
|
-
*/
|
|
8
|
-
export interface CodeExample {
|
|
9
|
-
pattern: string;
|
|
10
|
-
description: string;
|
|
11
|
-
filePath: string;
|
|
12
|
-
code: string;
|
|
13
|
-
keyPoints: string[];
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Get available pattern types
|
|
17
|
-
*/
|
|
18
|
-
export declare function getAvailablePatterns(): string[];
|
|
19
|
-
/**
|
|
20
|
-
* Get code example for a pattern
|
|
21
|
-
*/
|
|
22
|
-
export declare function getCodeExample(pattern: string): Promise<CodeExample | null>;
|
|
23
|
-
/**
|
|
24
|
-
* Get all examples for a feature's patterns
|
|
25
|
-
*/
|
|
26
|
-
export declare function getFeatureExamples(patterns: string[]): Promise<CodeExample[]>;
|
|
27
|
-
//# sourceMappingURL=examples.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../../src/utils/examples.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAoZD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA4BjF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAWnF"}
|