@vocoder/cli 0.2.1 → 0.2.2
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/bin.mjs +23 -11
- package/dist/bin.mjs.map +1 -1
- package/dist/{chunk-LHEEDIEX.mjs → chunk-TFAPB25S.mjs} +20 -14
- package/dist/chunk-TFAPB25S.mjs.map +1 -0
- package/dist/lib.d.mts +11 -3
- package/dist/lib.mjs +1 -1
- package/package.json +3 -3
- package/dist/chunk-LHEEDIEX.mjs.map +0 -1
|
@@ -11,6 +11,8 @@ function detectLocalEcosystem(cwd = process.cwd()) {
|
|
|
11
11
|
packageManager,
|
|
12
12
|
uiPackage: null,
|
|
13
13
|
hasUnplugin: false,
|
|
14
|
+
hasExtractor: false,
|
|
15
|
+
hasConfig: false,
|
|
14
16
|
hasUiPackage: false,
|
|
15
17
|
sourceLocale: null
|
|
16
18
|
};
|
|
@@ -20,6 +22,8 @@ function detectLocalEcosystem(cwd = process.cwd()) {
|
|
|
20
22
|
...pkg.devDependencies ?? {}
|
|
21
23
|
};
|
|
22
24
|
const hasUnplugin = "@vocoder/plugin" in allDeps;
|
|
25
|
+
const hasExtractor = "@vocoder/extractor" in allDeps;
|
|
26
|
+
const hasConfig = "@vocoder/config" in allDeps;
|
|
23
27
|
const { ecosystem, framework, uiPackage } = detectFromDeps(allDeps, cwd);
|
|
24
28
|
const hasUiPackage = uiPackage !== null && uiPackage in allDeps;
|
|
25
29
|
return {
|
|
@@ -28,6 +32,8 @@ function detectLocalEcosystem(cwd = process.cwd()) {
|
|
|
28
32
|
packageManager,
|
|
29
33
|
uiPackage,
|
|
30
34
|
hasUnplugin,
|
|
35
|
+
hasExtractor,
|
|
36
|
+
hasConfig,
|
|
31
37
|
hasUiPackage,
|
|
32
38
|
sourceLocale: null
|
|
33
39
|
};
|
|
@@ -74,30 +80,30 @@ function detectFromDeps(allDeps, cwd) {
|
|
|
74
80
|
}
|
|
75
81
|
return { ecosystem: null, framework: null, uiPackage: null };
|
|
76
82
|
}
|
|
77
|
-
function buildInstallCommand(packageManager, packages) {
|
|
83
|
+
function buildInstallCommand(packageManager, packages, dev = false) {
|
|
78
84
|
if (packages.length === 0) return "";
|
|
79
85
|
const pkgList = packages.join(" ");
|
|
86
|
+
const devFlag = dev ? " -D" : "";
|
|
80
87
|
switch (packageManager) {
|
|
81
88
|
case "pnpm":
|
|
82
|
-
return `pnpm add ${pkgList}`;
|
|
89
|
+
return `pnpm add${devFlag} ${pkgList}`;
|
|
83
90
|
case "yarn":
|
|
84
|
-
return `yarn add ${pkgList}`;
|
|
91
|
+
return `yarn add${devFlag} ${pkgList}`;
|
|
85
92
|
case "bun":
|
|
86
|
-
return `bun add ${pkgList}`;
|
|
93
|
+
return `bun add${devFlag} ${pkgList}`;
|
|
87
94
|
default:
|
|
88
|
-
return `npm install ${pkgList}`;
|
|
95
|
+
return `npm install${devFlag} ${pkgList}`;
|
|
89
96
|
}
|
|
90
97
|
}
|
|
91
98
|
function getPackagesToInstall(detection) {
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}
|
|
99
|
+
const devPackages = [];
|
|
100
|
+
const runtimePackages = [];
|
|
101
|
+
if (!detection.hasUnplugin) devPackages.push("@vocoder/plugin");
|
|
102
|
+
if (!detection.hasExtractor) devPackages.push("@vocoder/extractor");
|
|
103
|
+
if (!detection.hasConfig) devPackages.push("@vocoder/config");
|
|
98
104
|
if (detection.uiPackage && !detection.hasUiPackage)
|
|
99
|
-
|
|
100
|
-
return
|
|
105
|
+
runtimePackages.push(detection.uiPackage);
|
|
106
|
+
return { devPackages, runtimePackages };
|
|
101
107
|
}
|
|
102
108
|
|
|
103
109
|
// src/utils/setup-snippets.ts
|
|
@@ -268,4 +274,4 @@ export {
|
|
|
268
274
|
getSetupSnippets,
|
|
269
275
|
StringExtractor
|
|
270
276
|
};
|
|
271
|
-
//# sourceMappingURL=chunk-
|
|
277
|
+
//# sourceMappingURL=chunk-TFAPB25S.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/detect-local.ts","../src/utils/setup-snippets.ts","../src/utils/extract.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport type PackageManager = \"pnpm\" | \"npm\" | \"yarn\" | \"bun\";\n\nexport type DetectedFramework =\n\t| \"nextjs\"\n\t| \"vite\"\n\t| \"remix\"\n\t| \"nuxt\"\n\t| \"sveltekit\"\n\t| \"gatsby\"\n\t| \"angular\"\n\t| null;\n\nexport type DetectedEcosystem = \"react\" | \"vue\" | \"svelte\" | \"angular\" | null;\n\nexport interface LocalDetectionResult {\n\tecosystem: DetectedEcosystem;\n\tframework: DetectedFramework;\n\tpackageManager: PackageManager;\n\tuiPackage: string | null;\n\thasUnplugin: boolean;\n\thasExtractor: boolean;\n\thasConfig: boolean;\n\thasUiPackage: boolean;\n\tsourceLocale: string | null;\n}\n\n/**\n * Detect the local project's ecosystem, framework, and package manager\n * by inspecting filesystem artifacts. No network calls.\n */\nexport function detectLocalEcosystem(\n\tcwd: string = process.cwd(),\n): LocalDetectionResult {\n\tconst packageManager = detectPackageManager(cwd);\n\tconst pkg = readPackageJson(cwd);\n\n\tif (!pkg) {\n\t\treturn {\n\t\t\tecosystem: null,\n\t\t\tframework: null,\n\t\t\tpackageManager,\n\t\t\tuiPackage: null,\n\t\t\thasUnplugin: false,\n\t\t\thasExtractor: false,\n\t\t\thasConfig: false,\n\t\t\thasUiPackage: false,\n\t\t\tsourceLocale: null,\n\t\t};\n\t}\n\n\tconst allDeps = {\n\t\t...((pkg.dependencies as Record<string, string>) ?? {}),\n\t\t...((pkg.devDependencies as Record<string, string>) ?? {}),\n\t};\n\n\tconst hasUnplugin = \"@vocoder/plugin\" in allDeps;\n\tconst hasExtractor = \"@vocoder/extractor\" in allDeps;\n\tconst hasConfig = \"@vocoder/config\" in allDeps;\n\n\t// Detect ecosystem + framework\n\tconst { ecosystem, framework, uiPackage } = detectFromDeps(allDeps, cwd);\n\tconst hasUiPackage = uiPackage !== null && uiPackage in allDeps;\n\n\treturn {\n\t\tecosystem,\n\t\tframework,\n\t\tpackageManager,\n\t\tuiPackage,\n\t\thasUnplugin,\n\t\thasExtractor,\n\t\thasConfig,\n\t\thasUiPackage,\n\t\tsourceLocale: null,\n\t};\n}\n\nfunction detectPackageManager(cwd: string): PackageManager {\n\tif (existsSync(join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n\tif (existsSync(join(cwd, \"bun.lockb\")) || existsSync(join(cwd, \"bun.lock\")))\n\t\treturn \"bun\";\n\tif (existsSync(join(cwd, \"yarn.lock\"))) return \"yarn\";\n\treturn \"npm\";\n}\n\nfunction readPackageJson(cwd: string): Record<string, unknown> | null {\n\tconst pkgPath = join(cwd, \"package.json\");\n\tif (!existsSync(pkgPath)) return null;\n\ttry {\n\t\treturn JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction detectFromDeps(\n\tallDeps: Record<string, string>,\n\tcwd: string,\n): {\n\tecosystem: DetectedEcosystem;\n\tframework: DetectedFramework;\n\tuiPackage: string | null;\n} {\n\t// Vue ecosystem\n\tif (\"vue\" in allDeps) {\n\t\tconst framework = \"nuxt\" in allDeps ? (\"nuxt\" as const) : null;\n\t\treturn { ecosystem: \"vue\", framework, uiPackage: \"@vocoder/vue\" };\n\t}\n\n\t// Svelte ecosystem\n\tif (\"svelte\" in allDeps) {\n\t\tconst framework =\n\t\t\t\"@sveltejs/kit\" in allDeps ? (\"sveltekit\" as const) : null;\n\t\treturn { ecosystem: \"svelte\", framework, uiPackage: \"@vocoder/svelte\" };\n\t}\n\n\t// Angular ecosystem\n\tif (\"@angular/core\" in allDeps || existsSync(join(cwd, \"angular.json\"))) {\n\t\treturn {\n\t\t\tecosystem: \"angular\",\n\t\t\tframework: \"angular\",\n\t\t\tuiPackage: \"@vocoder/angular\",\n\t\t};\n\t}\n\n\t// React ecosystem (most common — check last)\n\tif (\"react\" in allDeps) {\n\t\tlet framework: DetectedFramework = null;\n\t\tif (\"next\" in allDeps) framework = \"nextjs\";\n\t\telse if (\"@remix-run/react\" in allDeps) framework = \"remix\";\n\t\telse if (\"gatsby\" in allDeps) framework = \"gatsby\";\n\t\telse if (\"vite\" in allDeps) framework = \"vite\";\n\t\treturn { ecosystem: \"react\", framework, uiPackage: \"@vocoder/react\" };\n\t}\n\n\treturn { ecosystem: null, framework: null, uiPackage: null };\n}\n\n/**\n * Build the install command for packages that aren't already installed.\n * Pass dev=true for devDependencies (-D flag).\n */\nexport function buildInstallCommand(\n\tpackageManager: PackageManager,\n\tpackages: string[],\n\tdev = false,\n): string {\n\tif (packages.length === 0) return \"\";\n\tconst pkgList = packages.join(\" \");\n\tconst devFlag = dev ? \" -D\" : \"\";\n\tswitch (packageManager) {\n\t\tcase \"pnpm\":\n\t\t\treturn `pnpm add${devFlag} ${pkgList}`;\n\t\tcase \"yarn\":\n\t\t\treturn `yarn add${devFlag} ${pkgList}`;\n\t\tcase \"bun\":\n\t\t\treturn `bun add${devFlag} ${pkgList}`;\n\t\tdefault:\n\t\t\treturn `npm install${devFlag} ${pkgList}`;\n\t}\n}\n\n/**\n * Get the lists of packages that need to be installed, split by dep type.\n * devPackages → devDependencies (build tools)\n * runtimePackages → dependencies (used at runtime in the app)\n */\nexport function getPackagesToInstall(detection: LocalDetectionResult): {\n\tdevPackages: string[];\n\truntimePackages: string[];\n} {\n\tconst devPackages: string[] = [];\n\tconst runtimePackages: string[] = [];\n\n\tif (!detection.hasUnplugin) devPackages.push(\"@vocoder/plugin\");\n\tif (!detection.hasExtractor) devPackages.push(\"@vocoder/extractor\");\n\tif (!detection.hasConfig) devPackages.push(\"@vocoder/config\");\n\n\tif (detection.uiPackage && !detection.hasUiPackage)\n\t\truntimePackages.push(detection.uiPackage);\n\n\treturn { devPackages, runtimePackages };\n}\n","import type { DetectedEcosystem, DetectedFramework } from \"./detect-local.js\";\n\nexport interface SetupSnippets {\n\tpluginStep: { file: string; code: string } | null;\n\tproviderStep: { file: string; code: string } | null;\n\twrapStep: { code: string };\n\twhatsNext: string;\n}\n\n/**\n * Generate framework-specific setup snippets.\n */\nexport function getSetupSnippets(params: {\n\tframework: DetectedFramework;\n\tecosystem: DetectedEcosystem;\n\tsourceLocale: string;\n\ttargetBranches: string[];\n}): SetupSnippets {\n\tconst { framework, ecosystem, sourceLocale } = params;\n\n\treturn {\n\t\tpluginStep: getPluginSnippet(framework, ecosystem),\n\t\tproviderStep: getProviderSnippet(ecosystem, sourceLocale),\n\t\twrapStep: getWrapSnippet(ecosystem),\n\t\twhatsNext: \"Push to a target branch to trigger translations.\",\n\t};\n}\n\nfunction getPluginSnippet(\n\tframework: DetectedFramework,\n\tecosystem: DetectedEcosystem,\n): { file: string; code: string } | null {\n\tswitch (framework) {\n\t\tcase \"nextjs\":\n\t\t\treturn {\n\t\t\t\tfile: \"next.config.ts\",\n\t\t\t\tcode: `import { withVocoder } from '@vocoder/plugin/next';\n\nexport default withVocoder({\n // your existing Next.js config\n});`,\n\t\t\t};\n\n\t\tcase \"vite\":\n\t\tcase \"remix\":\n\t\t\treturn {\n\t\t\t\tfile: \"vite.config.ts\",\n\t\t\t\tcode: `import vocoder from '@vocoder/plugin/vite';\n\nexport default defineConfig({\n plugins: [\n vocoder(),\n // your other plugins\n ],\n});`,\n\t\t\t};\n\n\t\tcase \"nuxt\":\n\t\t\treturn {\n\t\t\t\tfile: \"nuxt.config.ts\",\n\t\t\t\tcode: `import vocoder from '@vocoder/plugin/vite';\n\nexport default defineNuxtConfig({\n vite: {\n plugins: [vocoder()],\n },\n});`,\n\t\t\t};\n\n\t\tcase \"sveltekit\":\n\t\t\treturn {\n\t\t\t\tfile: \"vite.config.ts\",\n\t\t\t\tcode: `import vocoder from '@vocoder/plugin/vite';\nimport { sveltekit } from '@sveltejs/kit/vite';\n\nexport default defineConfig({\n plugins: [\n sveltekit(),\n vocoder(),\n ],\n});`,\n\t\t\t};\n\n\t\tcase \"gatsby\":\n\t\t\treturn {\n\t\t\t\tfile: \"gatsby-node.js\",\n\t\t\t\tcode: `const vocoder = require('@vocoder/plugin/webpack');\n\nexports.onCreateWebpackConfig = ({ actions }) => {\n actions.setWebpackConfig({\n plugins: [vocoder()],\n });\n};`,\n\t\t\t};\n\n\t\tcase \"angular\":\n\t\t\treturn null; // Angular CLI doesn't expose plugin config easily\n\n\t\tdefault:\n\t\t\t// No known framework — if they have React/Vue/Svelte, they likely have a bundler\n\t\t\t// but we can't guess which config file. Give generic advice.\n\t\t\tif (ecosystem) {\n\t\t\t\treturn {\n\t\t\t\t\tfile: \"your bundler config\",\n\t\t\t\t\tcode: `// Vite\nimport vocoder from '@vocoder/plugin/vite';\n// Webpack\nconst vocoder = require('@vocoder/plugin/webpack');\n\n// Add vocoder() to your plugins array`,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn null;\n\t}\n}\n\nfunction getProviderSnippet(\n\tecosystem: DetectedEcosystem,\n\tsourceLocale: string,\n): { file: string; code: string } | null {\n\tswitch (ecosystem) {\n\t\tcase \"react\":\n\t\t\treturn {\n\t\t\t\tfile: \"your root layout or App component\",\n\t\t\t\tcode: `import { VocoderProvider } from '@vocoder/react';\n\n<VocoderProvider defaultLocale=\"${sourceLocale}\">\n {children}\n</VocoderProvider>`,\n\t\t\t};\n\n\t\tcase \"vue\":\n\t\t\treturn {\n\t\t\t\tfile: \"your app entry\",\n\t\t\t\tcode: `import { createVocoder } from '@vocoder/vue';\n\nconst vocoder = createVocoder({\n defaultLocale: '${sourceLocale}',\n});\n\napp.use(vocoder);`,\n\t\t\t};\n\n\t\tcase \"svelte\":\n\t\t\treturn {\n\t\t\t\tfile: \"your root layout\",\n\t\t\t\tcode: `<script>\n import { VocoderProvider } from '@vocoder/svelte';\n</script>\n\n<VocoderProvider defaultLocale=\"${sourceLocale}\">\n <slot />\n</VocoderProvider>`,\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\nfunction getWrapSnippet(ecosystem: DetectedEcosystem): { code: string } {\n\tswitch (ecosystem) {\n\t\tcase \"react\":\n\t\t\treturn {\n\t\t\t\tcode: `import { T } from '@vocoder/react';\n\n<T>Hello, world!</T>`,\n\t\t\t};\n\n\t\tcase \"vue\":\n\t\t\treturn {\n\t\t\t\tcode: `<template>\n <T>Hello, world!</T>\n</template>\n\n<script setup>\nimport { T } from '@vocoder/vue';\n</script>`,\n\t\t\t};\n\n\t\tcase \"svelte\":\n\t\t\treturn {\n\t\t\t\tcode: `<script>\n import { T } from '@vocoder/svelte';\n</script>\n\n<T>Hello, world!</T>`,\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tcode: `// Wrap translatable strings with <T>\n<T>Hello, world!</T>`,\n\t\t\t};\n\t}\n}\n","export { type ExtractedString, StringExtractor } from \"@vocoder/extractor\";\n"],"mappings":"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","names":[]}
|
package/dist/lib.d.mts
CHANGED
|
@@ -84,6 +84,8 @@ interface LocalDetectionResult {
|
|
|
84
84
|
packageManager: PackageManager;
|
|
85
85
|
uiPackage: string | null;
|
|
86
86
|
hasUnplugin: boolean;
|
|
87
|
+
hasExtractor: boolean;
|
|
88
|
+
hasConfig: boolean;
|
|
87
89
|
hasUiPackage: boolean;
|
|
88
90
|
sourceLocale: string | null;
|
|
89
91
|
}
|
|
@@ -94,12 +96,18 @@ interface LocalDetectionResult {
|
|
|
94
96
|
declare function detectLocalEcosystem(cwd?: string): LocalDetectionResult;
|
|
95
97
|
/**
|
|
96
98
|
* Build the install command for packages that aren't already installed.
|
|
99
|
+
* Pass dev=true for devDependencies (-D flag).
|
|
97
100
|
*/
|
|
98
|
-
declare function buildInstallCommand(packageManager: PackageManager, packages: string[]): string;
|
|
101
|
+
declare function buildInstallCommand(packageManager: PackageManager, packages: string[], dev?: boolean): string;
|
|
99
102
|
/**
|
|
100
|
-
* Get the
|
|
103
|
+
* Get the lists of packages that need to be installed, split by dep type.
|
|
104
|
+
* devPackages → devDependencies (build tools)
|
|
105
|
+
* runtimePackages → dependencies (used at runtime in the app)
|
|
101
106
|
*/
|
|
102
|
-
declare function getPackagesToInstall(detection: LocalDetectionResult):
|
|
107
|
+
declare function getPackagesToInstall(detection: LocalDetectionResult): {
|
|
108
|
+
devPackages: string[];
|
|
109
|
+
runtimePackages: string[];
|
|
110
|
+
};
|
|
103
111
|
|
|
104
112
|
interface SetupSnippets {
|
|
105
113
|
pluginStep: {
|
package/dist/lib.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vocoder/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "CLI tool for Vocoder translation workflow",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
"commander": "^11.1.0",
|
|
46
46
|
"dotenv": "^16.3.1",
|
|
47
47
|
"tsx": "^4.7.0",
|
|
48
|
-
"@vocoder/
|
|
49
|
-
"@vocoder/
|
|
48
|
+
"@vocoder/config": "0.1.1",
|
|
49
|
+
"@vocoder/extractor": "0.2.1"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/node": "^20.19.9",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/detect-local.ts","../src/utils/setup-snippets.ts","../src/utils/extract.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport type PackageManager = \"pnpm\" | \"npm\" | \"yarn\" | \"bun\";\n\nexport type DetectedFramework =\n\t| \"nextjs\"\n\t| \"vite\"\n\t| \"remix\"\n\t| \"nuxt\"\n\t| \"sveltekit\"\n\t| \"gatsby\"\n\t| \"angular\"\n\t| null;\n\nexport type DetectedEcosystem = \"react\" | \"vue\" | \"svelte\" | \"angular\" | null;\n\nexport interface LocalDetectionResult {\n\tecosystem: DetectedEcosystem;\n\tframework: DetectedFramework;\n\tpackageManager: PackageManager;\n\tuiPackage: string | null;\n\thasUnplugin: boolean;\n\thasUiPackage: boolean;\n\tsourceLocale: string | null;\n}\n\n/**\n * Detect the local project's ecosystem, framework, and package manager\n * by inspecting filesystem artifacts. No network calls.\n */\nexport function detectLocalEcosystem(\n\tcwd: string = process.cwd(),\n): LocalDetectionResult {\n\tconst packageManager = detectPackageManager(cwd);\n\tconst pkg = readPackageJson(cwd);\n\n\tif (!pkg) {\n\t\treturn {\n\t\t\tecosystem: null,\n\t\t\tframework: null,\n\t\t\tpackageManager,\n\t\t\tuiPackage: null,\n\t\t\thasUnplugin: false,\n\t\t\thasUiPackage: false,\n\t\t\tsourceLocale: null,\n\t\t};\n\t}\n\n\tconst allDeps = {\n\t\t...((pkg.dependencies as Record<string, string>) ?? {}),\n\t\t...((pkg.devDependencies as Record<string, string>) ?? {}),\n\t};\n\n\tconst hasUnplugin = \"@vocoder/plugin\" in allDeps;\n\n\t// Detect ecosystem + framework\n\tconst { ecosystem, framework, uiPackage } = detectFromDeps(allDeps, cwd);\n\tconst hasUiPackage = uiPackage !== null && uiPackage in allDeps;\n\n\treturn {\n\t\tecosystem,\n\t\tframework,\n\t\tpackageManager,\n\t\tuiPackage,\n\t\thasUnplugin,\n\t\thasUiPackage,\n\t\tsourceLocale: null,\n\t};\n}\n\nfunction detectPackageManager(cwd: string): PackageManager {\n\tif (existsSync(join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n\tif (existsSync(join(cwd, \"bun.lockb\")) || existsSync(join(cwd, \"bun.lock\")))\n\t\treturn \"bun\";\n\tif (existsSync(join(cwd, \"yarn.lock\"))) return \"yarn\";\n\treturn \"npm\";\n}\n\nfunction readPackageJson(cwd: string): Record<string, unknown> | null {\n\tconst pkgPath = join(cwd, \"package.json\");\n\tif (!existsSync(pkgPath)) return null;\n\ttry {\n\t\treturn JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction detectFromDeps(\n\tallDeps: Record<string, string>,\n\tcwd: string,\n): {\n\tecosystem: DetectedEcosystem;\n\tframework: DetectedFramework;\n\tuiPackage: string | null;\n} {\n\t// Vue ecosystem\n\tif (\"vue\" in allDeps) {\n\t\tconst framework = \"nuxt\" in allDeps ? (\"nuxt\" as const) : null;\n\t\treturn { ecosystem: \"vue\", framework, uiPackage: \"@vocoder/vue\" };\n\t}\n\n\t// Svelte ecosystem\n\tif (\"svelte\" in allDeps) {\n\t\tconst framework =\n\t\t\t\"@sveltejs/kit\" in allDeps ? (\"sveltekit\" as const) : null;\n\t\treturn { ecosystem: \"svelte\", framework, uiPackage: \"@vocoder/svelte\" };\n\t}\n\n\t// Angular ecosystem\n\tif (\"@angular/core\" in allDeps || existsSync(join(cwd, \"angular.json\"))) {\n\t\treturn {\n\t\t\tecosystem: \"angular\",\n\t\t\tframework: \"angular\",\n\t\t\tuiPackage: \"@vocoder/angular\",\n\t\t};\n\t}\n\n\t// React ecosystem (most common — check last)\n\tif (\"react\" in allDeps) {\n\t\tlet framework: DetectedFramework = null;\n\t\tif (\"next\" in allDeps) framework = \"nextjs\";\n\t\telse if (\"@remix-run/react\" in allDeps) framework = \"remix\";\n\t\telse if (\"gatsby\" in allDeps) framework = \"gatsby\";\n\t\telse if (\"vite\" in allDeps) framework = \"vite\";\n\t\treturn { ecosystem: \"react\", framework, uiPackage: \"@vocoder/react\" };\n\t}\n\n\treturn { ecosystem: null, framework: null, uiPackage: null };\n}\n\n/**\n * Build the install command for packages that aren't already installed.\n */\nexport function buildInstallCommand(\n\tpackageManager: PackageManager,\n\tpackages: string[],\n): string {\n\tif (packages.length === 0) return \"\";\n\tconst pkgList = packages.join(\" \");\n\tswitch (packageManager) {\n\t\tcase \"pnpm\":\n\t\t\treturn `pnpm add ${pkgList}`;\n\t\tcase \"yarn\":\n\t\t\treturn `yarn add ${pkgList}`;\n\t\tcase \"bun\":\n\t\t\treturn `bun add ${pkgList}`;\n\t\tdefault:\n\t\t\treturn `npm install ${pkgList}`;\n\t}\n}\n\n/**\n * Get the list of packages that need to be installed.\n */\nexport function getPackagesToInstall(\n\tdetection: LocalDetectionResult,\n): string[] {\n\tconst packages: string[] = [];\n\tif (!detection.hasUnplugin) {\n\t\tpackages.push(\"@vocoder/plugin\");\n\t\tpackages.push(\"@vocoder/extractor\");\n\t\tpackages.push(\"@vocoder/config\");\n\t}\n\tif (detection.uiPackage && !detection.hasUiPackage)\n\t\tpackages.push(detection.uiPackage);\n\treturn packages;\n}\n","import type { DetectedEcosystem, DetectedFramework } from \"./detect-local.js\";\n\nexport interface SetupSnippets {\n\tpluginStep: { file: string; code: string } | null;\n\tproviderStep: { file: string; code: string } | null;\n\twrapStep: { code: string };\n\twhatsNext: string;\n}\n\n/**\n * Generate framework-specific setup snippets.\n */\nexport function getSetupSnippets(params: {\n\tframework: DetectedFramework;\n\tecosystem: DetectedEcosystem;\n\tsourceLocale: string;\n\ttargetBranches: string[];\n}): SetupSnippets {\n\tconst { framework, ecosystem, sourceLocale } = params;\n\n\treturn {\n\t\tpluginStep: getPluginSnippet(framework, ecosystem),\n\t\tproviderStep: getProviderSnippet(ecosystem, sourceLocale),\n\t\twrapStep: getWrapSnippet(ecosystem),\n\t\twhatsNext: \"Push to a target branch to trigger translations.\",\n\t};\n}\n\nfunction getPluginSnippet(\n\tframework: DetectedFramework,\n\tecosystem: DetectedEcosystem,\n): { file: string; code: string } | null {\n\tswitch (framework) {\n\t\tcase \"nextjs\":\n\t\t\treturn {\n\t\t\t\tfile: \"next.config.ts\",\n\t\t\t\tcode: `import { withVocoder } from '@vocoder/plugin/next';\n\nexport default withVocoder({\n // your existing Next.js config\n});`,\n\t\t\t};\n\n\t\tcase \"vite\":\n\t\tcase \"remix\":\n\t\t\treturn {\n\t\t\t\tfile: \"vite.config.ts\",\n\t\t\t\tcode: `import vocoder from '@vocoder/plugin/vite';\n\nexport default defineConfig({\n plugins: [\n vocoder(),\n // your other plugins\n ],\n});`,\n\t\t\t};\n\n\t\tcase \"nuxt\":\n\t\t\treturn {\n\t\t\t\tfile: \"nuxt.config.ts\",\n\t\t\t\tcode: `import vocoder from '@vocoder/plugin/vite';\n\nexport default defineNuxtConfig({\n vite: {\n plugins: [vocoder()],\n },\n});`,\n\t\t\t};\n\n\t\tcase \"sveltekit\":\n\t\t\treturn {\n\t\t\t\tfile: \"vite.config.ts\",\n\t\t\t\tcode: `import vocoder from '@vocoder/plugin/vite';\nimport { sveltekit } from '@sveltejs/kit/vite';\n\nexport default defineConfig({\n plugins: [\n sveltekit(),\n vocoder(),\n ],\n});`,\n\t\t\t};\n\n\t\tcase \"gatsby\":\n\t\t\treturn {\n\t\t\t\tfile: \"gatsby-node.js\",\n\t\t\t\tcode: `const vocoder = require('@vocoder/plugin/webpack');\n\nexports.onCreateWebpackConfig = ({ actions }) => {\n actions.setWebpackConfig({\n plugins: [vocoder()],\n });\n};`,\n\t\t\t};\n\n\t\tcase \"angular\":\n\t\t\treturn null; // Angular CLI doesn't expose plugin config easily\n\n\t\tdefault:\n\t\t\t// No known framework — if they have React/Vue/Svelte, they likely have a bundler\n\t\t\t// but we can't guess which config file. Give generic advice.\n\t\t\tif (ecosystem) {\n\t\t\t\treturn {\n\t\t\t\t\tfile: \"your bundler config\",\n\t\t\t\t\tcode: `// Vite\nimport vocoder from '@vocoder/plugin/vite';\n// Webpack\nconst vocoder = require('@vocoder/plugin/webpack');\n\n// Add vocoder() to your plugins array`,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn null;\n\t}\n}\n\nfunction getProviderSnippet(\n\tecosystem: DetectedEcosystem,\n\tsourceLocale: string,\n): { file: string; code: string } | null {\n\tswitch (ecosystem) {\n\t\tcase \"react\":\n\t\t\treturn {\n\t\t\t\tfile: \"your root layout or App component\",\n\t\t\t\tcode: `import { VocoderProvider } from '@vocoder/react';\n\n<VocoderProvider defaultLocale=\"${sourceLocale}\">\n {children}\n</VocoderProvider>`,\n\t\t\t};\n\n\t\tcase \"vue\":\n\t\t\treturn {\n\t\t\t\tfile: \"your app entry\",\n\t\t\t\tcode: `import { createVocoder } from '@vocoder/vue';\n\nconst vocoder = createVocoder({\n defaultLocale: '${sourceLocale}',\n});\n\napp.use(vocoder);`,\n\t\t\t};\n\n\t\tcase \"svelte\":\n\t\t\treturn {\n\t\t\t\tfile: \"your root layout\",\n\t\t\t\tcode: `<script>\n import { VocoderProvider } from '@vocoder/svelte';\n</script>\n\n<VocoderProvider defaultLocale=\"${sourceLocale}\">\n <slot />\n</VocoderProvider>`,\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\nfunction getWrapSnippet(ecosystem: DetectedEcosystem): { code: string } {\n\tswitch (ecosystem) {\n\t\tcase \"react\":\n\t\t\treturn {\n\t\t\t\tcode: `import { T } from '@vocoder/react';\n\n<T>Hello, world!</T>`,\n\t\t\t};\n\n\t\tcase \"vue\":\n\t\t\treturn {\n\t\t\t\tcode: `<template>\n <T>Hello, world!</T>\n</template>\n\n<script setup>\nimport { T } from '@vocoder/vue';\n</script>`,\n\t\t\t};\n\n\t\tcase \"svelte\":\n\t\t\treturn {\n\t\t\t\tcode: `<script>\n import { T } from '@vocoder/svelte';\n</script>\n\n<T>Hello, world!</T>`,\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tcode: `// Wrap translatable strings with <T>\n<T>Hello, world!</T>`,\n\t\t\t};\n\t}\n}\n","export { type ExtractedString, StringExtractor } from \"@vocoder/extractor\";\n"],"mappings":"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","names":[]}
|