galaxy-design 0.2.73 → 0.2.74
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 +113 -95
- package/dist/bin.js +17 -1
- package/dist/bin.js.map +1 -1
- package/dist/commands/add.js +59 -99
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/init.js +120 -611
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate-tailwind.js +90 -0
- package/dist/commands/migrate-tailwind.js.map +1 -0
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/registries/registry-angular.json +145 -537
- package/dist/registry-angular.json +145 -537
- package/dist/schemas/components-schema.json +66 -11
- package/dist/schemas/registry-framework-schema.json +17 -7
- package/dist/utils/angular-provider-manager.js +1 -1
- package/dist/utils/angular-provider-manager.js.map +1 -1
- package/dist/utils/component-copier.js +102 -62
- package/dist/utils/component-copier.js.map +1 -1
- package/dist/utils/component-transformer.js +86 -16
- package/dist/utils/component-transformer.js.map +1 -1
- package/dist/utils/config-schema.js +160 -9
- package/dist/utils/config-schema.js.map +1 -1
- package/dist/utils/framework-registry-service.js +181 -0
- package/dist/utils/framework-registry-service.js.map +1 -0
- package/dist/utils/framework-registry.js +1 -138
- package/dist/utils/framework-registry.js.map +1 -1
- package/dist/utils/github-fetcher.js +55 -27
- package/dist/utils/github-fetcher.js.map +1 -1
- package/dist/utils/index.js +4 -3
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/init-runtime.js +477 -0
- package/dist/utils/init-runtime.js.map +1 -0
- package/dist/utils/init-scaffold.js +115 -0
- package/dist/utils/init-scaffold.js.map +1 -0
- package/dist/utils/init-workflow.js +189 -0
- package/dist/utils/init-workflow.js.map +1 -0
- package/dist/utils/package-manager.js +77 -2
- package/dist/utils/package-manager.js.map +1 -1
- package/dist/utils/platform-detector.js +12 -8
- package/dist/utils/platform-detector.js.map +1 -1
- package/dist/utils/registry-loader.js +20 -41
- package/dist/utils/registry-loader.js.map +1 -1
- package/dist/utils/tailwind-detector.js +162 -0
- package/dist/utils/tailwind-detector.js.map +1 -0
- package/dist/utils/tailwind-migration.js +401 -0
- package/dist/utils/tailwind-migration.js.map +1 -0
- package/dist/utils/tailwind-scaffold.js +398 -0
- package/dist/utils/tailwind-scaffold.js.map +1 -0
- package/package.json +20 -2
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
import { existsSync, readFileSync } from 'fs';
|
|
3
|
+
import { resolve } from 'path';
|
|
4
|
+
import { detectFramework, detectPackageManager, hasSrcDirectory } from './detect.js';
|
|
5
|
+
import { getDefaultConfig } from './config-schema.js';
|
|
6
|
+
import { detectTailwindVersion, resolveTailwindMode } from './tailwind-detector.js';
|
|
7
|
+
import { ensureDir } from './files.js';
|
|
8
|
+
function mapDetectedFramework(detectedFramework) {
|
|
9
|
+
const frameworkMap = {
|
|
10
|
+
angular: 'angular',
|
|
11
|
+
react: 'react',
|
|
12
|
+
vue: 'vue',
|
|
13
|
+
'react-native': 'react-native',
|
|
14
|
+
flutter: 'flutter',
|
|
15
|
+
nextjs: 'nextjs',
|
|
16
|
+
nuxtjs: 'nuxtjs',
|
|
17
|
+
unknown: null
|
|
18
|
+
};
|
|
19
|
+
return frameworkMap[detectedFramework];
|
|
20
|
+
}
|
|
21
|
+
export function detectExpoProject(cwd) {
|
|
22
|
+
const packageJsonPath = resolve(cwd, 'package.json');
|
|
23
|
+
if (!existsSync(packageJsonPath)) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
28
|
+
const deps = _extends({}, packageJson.dependencies, packageJson.devDependencies);
|
|
29
|
+
return Boolean(deps.expo || deps['expo-router']);
|
|
30
|
+
} catch (e) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function resolveInitProjectContext(cwd) {
|
|
35
|
+
const detectedFramework = detectFramework(cwd);
|
|
36
|
+
if (detectedFramework === 'unknown') {
|
|
37
|
+
throw new Error('Could not detect framework. Please ensure you are in a valid Angular, React, Vue, Next.js, Nuxt.js, React Native, or Flutter project.');
|
|
38
|
+
}
|
|
39
|
+
const framework = mapDetectedFramework(detectedFramework);
|
|
40
|
+
if (!framework) {
|
|
41
|
+
throw new Error('Unsupported framework detected.');
|
|
42
|
+
}
|
|
43
|
+
const packageManager = detectPackageManager(cwd);
|
|
44
|
+
const usesSrcDir = hasSrcDirectory(cwd);
|
|
45
|
+
const isExpoProject = framework === 'react-native' ? detectExpoProject(cwd) : false;
|
|
46
|
+
let config = getDefaultConfig(framework);
|
|
47
|
+
const tailwindDetection = framework === 'flutter' ? {
|
|
48
|
+
installed: false,
|
|
49
|
+
version: null,
|
|
50
|
+
source: 'unknown'
|
|
51
|
+
} : framework === 'react-native' ? {
|
|
52
|
+
installed: false,
|
|
53
|
+
version: 3,
|
|
54
|
+
source: 'unknown'
|
|
55
|
+
} : detectTailwindVersion(cwd, [
|
|
56
|
+
config.tailwind.css
|
|
57
|
+
]);
|
|
58
|
+
const tailwindMode = framework === 'flutter' ? null : framework === 'react-native' ? 'v3' : resolveTailwindMode(tailwindDetection);
|
|
59
|
+
if (framework !== 'flutter') {
|
|
60
|
+
if (tailwindDetection.cssPath) {
|
|
61
|
+
config = _extends({}, config, {
|
|
62
|
+
tailwind: _extends({}, config.tailwind, {
|
|
63
|
+
css: tailwindDetection.cssPath
|
|
64
|
+
})
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
if (tailwindDetection.configPath) {
|
|
68
|
+
config = _extends({}, config, {
|
|
69
|
+
tailwind: _extends({}, config.tailwind, {
|
|
70
|
+
config: tailwindDetection.configPath
|
|
71
|
+
})
|
|
72
|
+
});
|
|
73
|
+
} else if (tailwindMode === 'v4') {
|
|
74
|
+
config = _extends({}, config, {
|
|
75
|
+
tailwind: _extends({}, config.tailwind, {
|
|
76
|
+
config: ''
|
|
77
|
+
})
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
config = _extends({}, config, {
|
|
81
|
+
tailwind: _extends({}, config.tailwind, {
|
|
82
|
+
version: tailwindMode === 'v3' ? 3 : 4
|
|
83
|
+
})
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
detectedFramework,
|
|
88
|
+
framework,
|
|
89
|
+
packageManager,
|
|
90
|
+
usesSrcDir,
|
|
91
|
+
isExpoProject,
|
|
92
|
+
tailwindDetection,
|
|
93
|
+
tailwindMode,
|
|
94
|
+
config
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export function getInitPromptQuestions(framework, config) {
|
|
98
|
+
const promptQuestions = [];
|
|
99
|
+
if (framework !== 'flutter') {
|
|
100
|
+
promptQuestions.push({
|
|
101
|
+
type: 'toggle',
|
|
102
|
+
name: 'typescript',
|
|
103
|
+
message: 'Would you like to use TypeScript?',
|
|
104
|
+
initial: true,
|
|
105
|
+
active: 'yes',
|
|
106
|
+
inactive: 'no'
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
promptQuestions.push({
|
|
110
|
+
type: 'select',
|
|
111
|
+
name: 'baseColor',
|
|
112
|
+
message: 'Which base color would you like to use?',
|
|
113
|
+
choices: [
|
|
114
|
+
{
|
|
115
|
+
title: 'Slate',
|
|
116
|
+
value: 'slate'
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
title: 'Gray',
|
|
120
|
+
value: 'gray'
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
title: 'Zinc',
|
|
124
|
+
value: 'zinc'
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
title: 'Neutral',
|
|
128
|
+
value: 'neutral'
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
title: 'Stone',
|
|
132
|
+
value: 'stone'
|
|
133
|
+
}
|
|
134
|
+
],
|
|
135
|
+
initial: 0
|
|
136
|
+
});
|
|
137
|
+
if (framework !== 'flutter') {
|
|
138
|
+
promptQuestions.push({
|
|
139
|
+
type: 'select',
|
|
140
|
+
name: 'iconLibrary',
|
|
141
|
+
message: 'Which icon library would you like to use?',
|
|
142
|
+
choices: [
|
|
143
|
+
{
|
|
144
|
+
title: 'Lucide (Recommended)',
|
|
145
|
+
value: 'lucide'
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
title: 'Heroicons',
|
|
149
|
+
value: 'heroicons'
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
title: 'Radix Icons',
|
|
153
|
+
value: 'radix-icons'
|
|
154
|
+
}
|
|
155
|
+
],
|
|
156
|
+
initial: 0
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
if (framework !== 'flutter' && config.tailwind.css) {
|
|
160
|
+
promptQuestions.push({
|
|
161
|
+
type: 'text',
|
|
162
|
+
name: 'cssFile',
|
|
163
|
+
message: framework === 'react-native' ? 'Where is your global CSS file (for NativeWind)?' : 'Where is your global CSS file?',
|
|
164
|
+
initial: config.tailwind.css
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return promptQuestions;
|
|
168
|
+
}
|
|
169
|
+
export function applyInitPromptAnswers(config, answers) {
|
|
170
|
+
var _answers_typescript, _answers_iconLibrary, _answers_baseColor, _answers_cssFile;
|
|
171
|
+
return _extends({}, config, {
|
|
172
|
+
typescript: (_answers_typescript = answers.typescript) != null ? _answers_typescript : config.typescript,
|
|
173
|
+
iconLibrary: (_answers_iconLibrary = answers.iconLibrary) != null ? _answers_iconLibrary : config.iconLibrary,
|
|
174
|
+
tailwind: _extends({}, config.tailwind, {
|
|
175
|
+
baseColor: (_answers_baseColor = answers.baseColor) != null ? _answers_baseColor : config.tailwind.baseColor,
|
|
176
|
+
css: (_answers_cssFile = answers.cssFile) != null ? _answers_cssFile : config.tailwind.css
|
|
177
|
+
})
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
export function ensureInitDirectories(cwd, config, usesSrcDir) {
|
|
181
|
+
const baseDir = usesSrcDir ? 'src/' : '';
|
|
182
|
+
const componentsPath = resolve(cwd, baseDir + config.aliases.components.replace('@/', ''));
|
|
183
|
+
const utilsPath = resolve(cwd, baseDir + config.aliases.utils.replace('@/', ''));
|
|
184
|
+
ensureDir(componentsPath);
|
|
185
|
+
ensureDir(resolve(componentsPath, 'ui'));
|
|
186
|
+
ensureDir(utilsPath.replace('/utils', ''));
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
//# sourceMappingURL=init-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/init-workflow.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'fs';\nimport prompts from 'prompts';\nimport { resolve } from 'path';\nimport {\n detectFramework,\n detectPackageManager,\n hasSrcDirectory,\n type Framework as DetectedFramework,\n} from './detect.js';\nimport {\n getDefaultConfig,\n type BaseColor,\n type ComponentsConfig,\n type Framework,\n type IconLibrary,\n} from './config-schema.js';\nimport {\n detectTailwindVersion,\n resolveTailwindMode,\n type TailwindDetectionResult,\n} from './tailwind-detector.js';\nimport { ensureDir } from './files.js';\n\nexport interface InitProjectContext {\n detectedFramework: DetectedFramework;\n framework: Framework;\n packageManager: ReturnType<typeof detectPackageManager>;\n usesSrcDir: boolean;\n isExpoProject: boolean;\n tailwindDetection: TailwindDetectionResult;\n tailwindMode: 'v3' | 'v4' | null;\n config: ComponentsConfig;\n}\n\nfunction mapDetectedFramework(\n detectedFramework: DetectedFramework,\n): Framework | null {\n const frameworkMap: Record<DetectedFramework, Framework | null> = {\n angular: 'angular',\n react: 'react',\n vue: 'vue',\n 'react-native': 'react-native',\n flutter: 'flutter',\n nextjs: 'nextjs',\n nuxtjs: 'nuxtjs',\n unknown: null,\n };\n\n return frameworkMap[detectedFramework];\n}\n\nexport function detectExpoProject(cwd: string): boolean {\n const packageJsonPath = resolve(cwd, 'package.json');\n if (!existsSync(packageJsonPath)) {\n return false;\n }\n\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n return Boolean(deps.expo || deps['expo-router']);\n } catch {\n return false;\n }\n}\n\nexport function resolveInitProjectContext(cwd: string): InitProjectContext {\n const detectedFramework = detectFramework(cwd);\n if (detectedFramework === 'unknown') {\n throw new Error(\n 'Could not detect framework. Please ensure you are in a valid Angular, React, Vue, Next.js, Nuxt.js, React Native, or Flutter project.',\n );\n }\n\n const framework = mapDetectedFramework(detectedFramework);\n if (!framework) {\n throw new Error('Unsupported framework detected.');\n }\n\n const packageManager = detectPackageManager(cwd);\n const usesSrcDir = hasSrcDirectory(cwd);\n const isExpoProject =\n framework === 'react-native' ? detectExpoProject(cwd) : false;\n\n let config = getDefaultConfig(framework);\n\n const tailwindDetection: TailwindDetectionResult =\n framework === 'flutter'\n ? {\n installed: false,\n version: null,\n source: 'unknown',\n }\n : framework === 'react-native'\n ? {\n installed: false,\n version: 3,\n source: 'unknown',\n }\n : detectTailwindVersion(cwd, [config.tailwind.css]);\n\n const tailwindMode =\n framework === 'flutter'\n ? null\n : framework === 'react-native'\n ? 'v3'\n : resolveTailwindMode(tailwindDetection);\n\n if (framework !== 'flutter') {\n if (tailwindDetection.cssPath) {\n config = {\n ...config,\n tailwind: {\n ...config.tailwind,\n css: tailwindDetection.cssPath,\n },\n };\n }\n\n if (tailwindDetection.configPath) {\n config = {\n ...config,\n tailwind: {\n ...config.tailwind,\n config: tailwindDetection.configPath,\n },\n };\n } else if (tailwindMode === 'v4') {\n config = {\n ...config,\n tailwind: {\n ...config.tailwind,\n config: '',\n },\n };\n }\n\n config = {\n ...config,\n tailwind: {\n ...config.tailwind,\n version: tailwindMode === 'v3' ? 3 : 4,\n },\n };\n }\n\n return {\n detectedFramework,\n framework,\n packageManager,\n usesSrcDir,\n isExpoProject,\n tailwindDetection,\n tailwindMode,\n config,\n };\n}\n\nexport function getInitPromptQuestions(\n framework: Framework,\n config: ComponentsConfig,\n): prompts.PromptObject[] {\n const promptQuestions: prompts.PromptObject[] = [];\n\n if (framework !== 'flutter') {\n promptQuestions.push({\n type: 'toggle',\n name: 'typescript',\n message: 'Would you like to use TypeScript?',\n initial: true,\n active: 'yes',\n inactive: 'no',\n });\n }\n\n promptQuestions.push({\n type: 'select',\n name: 'baseColor',\n message: 'Which base color would you like to use?',\n choices: [\n { title: 'Slate', value: 'slate' },\n { title: 'Gray', value: 'gray' },\n { title: 'Zinc', value: 'zinc' },\n { title: 'Neutral', value: 'neutral' },\n { title: 'Stone', value: 'stone' },\n ],\n initial: 0,\n });\n\n if (framework !== 'flutter') {\n promptQuestions.push({\n type: 'select',\n name: 'iconLibrary',\n message: 'Which icon library would you like to use?',\n choices: [\n { title: 'Lucide (Recommended)', value: 'lucide' },\n { title: 'Heroicons', value: 'heroicons' },\n { title: 'Radix Icons', value: 'radix-icons' },\n ],\n initial: 0,\n });\n }\n\n if (framework !== 'flutter' && config.tailwind.css) {\n promptQuestions.push({\n type: 'text',\n name: 'cssFile',\n message:\n framework === 'react-native'\n ? 'Where is your global CSS file (for NativeWind)?'\n : 'Where is your global CSS file?',\n initial: config.tailwind.css,\n });\n }\n\n return promptQuestions;\n}\n\nexport function applyInitPromptAnswers(\n config: ComponentsConfig,\n answers: Record<string, unknown>,\n): ComponentsConfig {\n return {\n ...config,\n typescript:\n (answers.typescript as boolean | undefined) ?? config.typescript,\n iconLibrary:\n (answers.iconLibrary as IconLibrary | undefined) ?? config.iconLibrary,\n tailwind: {\n ...config.tailwind,\n baseColor:\n (answers.baseColor as BaseColor | undefined) ??\n config.tailwind.baseColor,\n css: (answers.cssFile as string | undefined) ?? config.tailwind.css,\n },\n };\n}\n\nexport function ensureInitDirectories(\n cwd: string,\n config: ComponentsConfig,\n usesSrcDir: boolean,\n): void {\n const baseDir = usesSrcDir ? 'src/' : '';\n const componentsPath = resolve(\n cwd,\n baseDir + config.aliases.components.replace('@/', ''),\n );\n const utilsPath = resolve(\n cwd,\n baseDir + config.aliases.utils.replace('@/', ''),\n );\n\n ensureDir(componentsPath);\n ensureDir(resolve(componentsPath, 'ui'));\n ensureDir(utilsPath.replace('/utils', ''));\n}\n"],"names":["existsSync","readFileSync","resolve","detectFramework","detectPackageManager","hasSrcDirectory","getDefaultConfig","detectTailwindVersion","resolveTailwindMode","ensureDir","mapDetectedFramework","detectedFramework","frameworkMap","angular","react","vue","flutter","nextjs","nuxtjs","unknown","detectExpoProject","cwd","packageJsonPath","packageJson","JSON","parse","deps","dependencies","devDependencies","Boolean","expo","resolveInitProjectContext","Error","framework","packageManager","usesSrcDir","isExpoProject","config","tailwindDetection","installed","version","source","tailwind","css","tailwindMode","cssPath","configPath","getInitPromptQuestions","promptQuestions","push","type","name","message","initial","active","inactive","choices","title","value","applyInitPromptAnswers","answers","typescript","iconLibrary","baseColor","cssFile","ensureInitDirectories","baseDir","componentsPath","aliases","components","replace","utilsPath","utils"],"mappings":"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"}
|
|
@@ -4,6 +4,9 @@ import { join } from 'path';
|
|
|
4
4
|
/**
|
|
5
5
|
* Detect which package manager is being used in the project
|
|
6
6
|
*/ export function detectPackageManager(cwd = process.cwd()) {
|
|
7
|
+
if (existsSync(join(cwd, 'pubspec.yaml'))) {
|
|
8
|
+
return 'pub';
|
|
9
|
+
}
|
|
7
10
|
// Check for lock files
|
|
8
11
|
if (existsSync(join(cwd, 'bun.lockb')) || existsSync(join(cwd, 'bun.lock'))) {
|
|
9
12
|
return 'bun';
|
|
@@ -24,6 +27,13 @@ import { join } from 'path';
|
|
|
24
27
|
* Get the install command for the detected package manager
|
|
25
28
|
*/ export function getInstallCommand(packageManager, packages) {
|
|
26
29
|
switch(packageManager){
|
|
30
|
+
case 'pub':
|
|
31
|
+
return [
|
|
32
|
+
'flutter',
|
|
33
|
+
'pub',
|
|
34
|
+
'add',
|
|
35
|
+
...packages
|
|
36
|
+
];
|
|
27
37
|
case 'bun':
|
|
28
38
|
return [
|
|
29
39
|
'bun',
|
|
@@ -51,6 +61,57 @@ import { join } from 'path';
|
|
|
51
61
|
];
|
|
52
62
|
}
|
|
53
63
|
}
|
|
64
|
+
export function formatInstallCommand(packageManager, packages, dev = false) {
|
|
65
|
+
switch(packageManager){
|
|
66
|
+
case 'pub':
|
|
67
|
+
return [
|
|
68
|
+
'flutter',
|
|
69
|
+
'pub',
|
|
70
|
+
'add',
|
|
71
|
+
...dev ? [
|
|
72
|
+
'--dev'
|
|
73
|
+
] : [],
|
|
74
|
+
...packages
|
|
75
|
+
].join(' ');
|
|
76
|
+
case 'bun':
|
|
77
|
+
return [
|
|
78
|
+
'bun',
|
|
79
|
+
'add',
|
|
80
|
+
...dev ? [
|
|
81
|
+
'-D'
|
|
82
|
+
] : [],
|
|
83
|
+
...packages
|
|
84
|
+
].join(' ');
|
|
85
|
+
case 'pnpm':
|
|
86
|
+
return [
|
|
87
|
+
'pnpm',
|
|
88
|
+
'add',
|
|
89
|
+
...dev ? [
|
|
90
|
+
'-D'
|
|
91
|
+
] : [],
|
|
92
|
+
...packages
|
|
93
|
+
].join(' ');
|
|
94
|
+
case 'yarn':
|
|
95
|
+
return [
|
|
96
|
+
'yarn',
|
|
97
|
+
'add',
|
|
98
|
+
...dev ? [
|
|
99
|
+
'-D'
|
|
100
|
+
] : [],
|
|
101
|
+
...packages
|
|
102
|
+
].join(' ');
|
|
103
|
+
case 'npm':
|
|
104
|
+
default:
|
|
105
|
+
return [
|
|
106
|
+
'npm',
|
|
107
|
+
'install',
|
|
108
|
+
...dev ? [
|
|
109
|
+
'--save-dev'
|
|
110
|
+
] : [],
|
|
111
|
+
...packages
|
|
112
|
+
].join(' ');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
54
115
|
/**
|
|
55
116
|
* Install dependencies using the detected package manager
|
|
56
117
|
*/ export async function installDependencies(packages, options = {}) {
|
|
@@ -62,6 +123,19 @@ import { join } from 'path';
|
|
|
62
123
|
let command;
|
|
63
124
|
let args;
|
|
64
125
|
switch(packageManager){
|
|
126
|
+
case 'pub':
|
|
127
|
+
command = [
|
|
128
|
+
'flutter'
|
|
129
|
+
];
|
|
130
|
+
args = [
|
|
131
|
+
'pub',
|
|
132
|
+
'add',
|
|
133
|
+
...dev ? [
|
|
134
|
+
'--dev'
|
|
135
|
+
] : [],
|
|
136
|
+
...packages
|
|
137
|
+
];
|
|
138
|
+
break;
|
|
65
139
|
case 'bun':
|
|
66
140
|
command = [
|
|
67
141
|
'bun'
|
|
@@ -153,13 +227,14 @@ import { join } from 'path';
|
|
|
153
227
|
/**
|
|
154
228
|
* Get the package manager executable name
|
|
155
229
|
*/ export function getPackageManagerExecutable(packageManager) {
|
|
156
|
-
return packageManager;
|
|
230
|
+
return packageManager === 'pub' ? 'flutter' : packageManager;
|
|
157
231
|
}
|
|
158
232
|
/**
|
|
159
233
|
* Check if a package manager is available
|
|
160
234
|
*/ export async function isPackageManagerAvailable(packageManager) {
|
|
161
235
|
try {
|
|
162
|
-
|
|
236
|
+
const executable = packageManager === 'pub' ? 'flutter' : packageManager;
|
|
237
|
+
await execa(executable, [
|
|
163
238
|
'--version'
|
|
164
239
|
], {
|
|
165
240
|
stdio: 'ignore'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/package-manager.ts"],"sourcesContent":["import { execa } from 'execa';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\n/**\n * Detect which package manager is being used in the project\n */\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManager {\n // Check for lock files\n if (existsSync(join(cwd, 'bun.lockb')) || existsSync(join(cwd, 'bun.lock'))) {\n return 'bun';\n }\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm';\n }\n if (existsSync(join(cwd, 'yarn.lock'))) {\n return 'yarn';\n }\n if (existsSync(join(cwd, 'package-lock.json'))) {\n return 'npm';\n }\n\n // Default to npm\n return 'npm';\n}\n\n/**\n * Get the install command for the detected package manager\n */\nexport function getInstallCommand(packageManager: PackageManager
|
|
1
|
+
{"version":3,"sources":["../../src/utils/package-manager.ts"],"sourcesContent":["import { execa } from 'execa';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun' | 'pub';\n\n/**\n * Detect which package manager is being used in the project\n */\nexport function detectPackageManager(\n cwd: string = process.cwd(),\n): PackageManager {\n if (existsSync(join(cwd, 'pubspec.yaml'))) {\n return 'pub';\n }\n\n // Check for lock files\n if (existsSync(join(cwd, 'bun.lockb')) || existsSync(join(cwd, 'bun.lock'))) {\n return 'bun';\n }\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm';\n }\n if (existsSync(join(cwd, 'yarn.lock'))) {\n return 'yarn';\n }\n if (existsSync(join(cwd, 'package-lock.json'))) {\n return 'npm';\n }\n\n // Default to npm\n return 'npm';\n}\n\n/**\n * Get the install command for the detected package manager\n */\nexport function getInstallCommand(\n packageManager: PackageManager,\n packages: string[],\n): string[] {\n switch (packageManager) {\n case 'pub':\n return ['flutter', 'pub', 'add', ...packages];\n case 'bun':\n return ['bun', 'add', ...packages];\n case 'pnpm':\n return ['pnpm', 'add', ...packages];\n case 'yarn':\n return ['yarn', 'add', ...packages];\n case 'npm':\n default:\n return ['npm', 'install', ...packages];\n }\n}\n\nexport function formatInstallCommand(\n packageManager: PackageManager,\n packages: string[],\n dev: boolean = false,\n): string {\n switch (packageManager) {\n case 'pub':\n return [\n 'flutter',\n 'pub',\n 'add',\n ...(dev ? ['--dev'] : []),\n ...packages,\n ].join(' ');\n case 'bun':\n return ['bun', 'add', ...(dev ? ['-D'] : []), ...packages].join(' ');\n case 'pnpm':\n return ['pnpm', 'add', ...(dev ? ['-D'] : []), ...packages].join(' ');\n case 'yarn':\n return ['yarn', 'add', ...(dev ? ['-D'] : []), ...packages].join(' ');\n case 'npm':\n default:\n return [\n 'npm',\n 'install',\n ...(dev ? ['--save-dev'] : []),\n ...packages,\n ].join(' ');\n }\n}\n\n/**\n * Install dependencies using the detected package manager\n */\nexport async function installDependencies(\n packages: string[],\n options: {\n cwd?: string;\n dev?: boolean;\n silent?: boolean;\n } = {},\n): Promise<void> {\n const { cwd = process.cwd(), dev = false, silent = false } = options;\n\n if (packages.length === 0) {\n return;\n }\n\n const packageManager = detectPackageManager(cwd);\n let command: string[];\n let args: string[];\n\n switch (packageManager) {\n case 'pub':\n command = ['flutter'];\n args = ['pub', 'add', ...(dev ? ['--dev'] : []), ...packages];\n break;\n case 'bun':\n command = ['bun'];\n args = ['add', ...(dev ? ['-D'] : []), ...packages];\n break;\n case 'pnpm':\n command = ['pnpm'];\n args = ['add', ...(dev ? ['-D'] : []), ...packages];\n break;\n case 'yarn':\n command = ['yarn'];\n args = ['add', ...(dev ? ['-D'] : []), ...packages];\n break;\n case 'npm':\n default:\n command = ['npm'];\n args = ['install', ...(dev ? ['--save-dev'] : []), ...packages];\n break;\n }\n\n if (!silent) {\n console.log(`Installing dependencies with ${packageManager}...`);\n }\n\n try {\n // For bun, try to use full path if available\n let executable = command[0];\n if (packageManager === 'bun') {\n const bunPaths = [\n process.env.BUN_INSTALL\n ? `${process.env.BUN_INSTALL}/.bun/bin/bun`\n : null,\n process.env.HOME ? `${process.env.HOME}/.bun/bin/bun` : null,\n '/Users/buitronghieu/.bun/bin/bun',\n ].filter(Boolean) as string[];\n\n for (const bunPath of bunPaths) {\n try {\n await execa(bunPath, ['--version'], { stdio: 'ignore' });\n executable = bunPath;\n break;\n } catch {\n // Try next path\n }\n }\n }\n\n await execa(executable, args, {\n cwd,\n stdio: silent ? 'ignore' : 'inherit',\n });\n\n if (!silent) {\n console.log('✓ Dependencies installed successfully');\n }\n } catch (error) {\n console.error('Failed to install dependencies:', error);\n throw error;\n }\n}\n\n/**\n * Get the package manager executable name\n */\nexport function getPackageManagerExecutable(\n packageManager: PackageManager,\n): string {\n return packageManager === 'pub' ? 'flutter' : packageManager;\n}\n\n/**\n * Check if a package manager is available\n */\nexport async function isPackageManagerAvailable(\n packageManager: PackageManager,\n): Promise<boolean> {\n try {\n const executable = packageManager === 'pub' ? 'flutter' : packageManager;\n await execa(executable, ['--version'], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n"],"names":["execa","existsSync","join","detectPackageManager","cwd","process","getInstallCommand","packageManager","packages","formatInstallCommand","dev","installDependencies","options","silent","length","command","args","console","log","executable","bunPaths","env","BUN_INSTALL","HOME","filter","Boolean","bunPath","stdio","error","getPackageManagerExecutable","isPackageManagerAvailable"],"mappings":"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"}
|
|
@@ -146,13 +146,13 @@ import { join } from 'path';
|
|
|
146
146
|
*/ export function getPlatformDisplayName(platform) {
|
|
147
147
|
const names = {
|
|
148
148
|
'react-native': 'React Native',
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
149
|
+
flutter: 'Flutter',
|
|
150
|
+
vue: 'Vue.js',
|
|
151
|
+
react: 'React',
|
|
152
|
+
angular: 'Angular',
|
|
153
|
+
nextjs: 'Next.js',
|
|
154
|
+
nuxtjs: 'Nuxt.js',
|
|
155
|
+
unknown: 'Unknown'
|
|
156
156
|
};
|
|
157
157
|
return names[platform];
|
|
158
158
|
}
|
|
@@ -175,11 +175,15 @@ import { join } from 'path';
|
|
|
175
175
|
case 'flutter':
|
|
176
176
|
return 'registry-flutter.json';
|
|
177
177
|
case 'vue':
|
|
178
|
+
return 'registry-vue.json';
|
|
178
179
|
case 'nuxtjs':
|
|
180
|
+
return 'registry-vue.json';
|
|
179
181
|
case 'react':
|
|
182
|
+
return 'registry-react.json';
|
|
180
183
|
case 'nextjs':
|
|
184
|
+
return 'registry-react.json';
|
|
181
185
|
case 'angular':
|
|
182
|
-
return 'registry.json';
|
|
186
|
+
return 'registry-angular.json';
|
|
183
187
|
default:
|
|
184
188
|
return 'registry.json';
|
|
185
189
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/platform-detector.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport { join } from 'path';\n\n/**\n * Supported platforms for Galaxy UI CLI\n */\nexport type Platform = 'react-native' | 'flutter' | 'vue' | 'react' | 'angular' | 'nextjs' | 'nuxtjs' | 'unknown';\n\n/**\n * Platform detection result with confidence level\n */\nexport interface PlatformDetectionResult {\n\tplatform: Platform;\n\tconfidence: 'high' | 'medium' | 'low';\n\tevidence: string[];\n\tframework?: string; // For web platforms: vue, react, angular\n}\n\n/**\n * Detect project platform based on file structure and config files\n *\n * Detection priority:\n * 1. Mobile platforms (React Native, Flutter) - highest priority\n * 2. Web frameworks (Vue, React, Angular)\n * 3. Unknown\n */\nexport function detectPlatform(cwd: string): PlatformDetectionResult {\n\tconst evidence: string[] = [];\n\n\t// Check for Flutter (highest priority for mobile)\n\tif (existsSync(join(cwd, 'pubspec.yaml'))) {\n\t\tevidence.push('Found pubspec.yaml (Flutter project file)');\n\n\t\t// Additional Flutter indicators\n\t\tif (existsSync(join(cwd, 'lib'))) {\n\t\t\tevidence.push('Found lib/ directory (Flutter source directory)');\n\t\t}\n\t\tif (existsSync(join(cwd, 'android')) && existsSync(join(cwd, 'ios'))) {\n\t\t\tevidence.push('Found android/ and ios/ directories (Flutter mobile platforms)');\n\t\t}\n\n\t\treturn {\n\t\t\tplatform: 'flutter',\n\t\t\tconfidence: 'high',\n\t\t\tevidence,\n\t\t};\n\t}\n\n\t// Check for React Native\n\tconst hasPackageJson = existsSync(join(cwd, 'package.json'));\n\tconst hasIosDir = existsSync(join(cwd, 'ios'));\n\tconst hasAndroidDir = existsSync(join(cwd, 'android'));\n\tconst hasAppJson = existsSync(join(cwd, 'app.json'));\n\n\tif (hasPackageJson && (hasIosDir || hasAndroidDir)) {\n\t\tevidence.push('Found package.json with mobile platform directories');\n\n\t\tif (hasIosDir) evidence.push('Found ios/ directory');\n\t\tif (hasAndroidDir) evidence.push('Found android/ directory');\n\t\tif (hasAppJson) evidence.push('Found app.json (React Native config)');\n\n\t\t// Check package.json for react-native dependency\n\t\ttry {\n\t\t\tconst packageJson = require(join(cwd, 'package.json'));\n\t\t\tif (packageJson.dependencies?.['react-native']) {\n\t\t\t\tevidence.push('Found react-native in dependencies');\n\t\t\t\treturn {\n\t\t\t\t\tplatform: 'react-native',\n\t\t\t\t\tconfidence: 'high',\n\t\t\t\t\tevidence,\n\t\t\t\t};\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Ignore JSON parse errors\n\t\t}\n\n\t\t// If has mobile dirs but no react-native dep, still consider it RN with medium confidence\n\t\treturn {\n\t\t\tplatform: 'react-native',\n\t\t\tconfidence: 'medium',\n\t\t\tevidence,\n\t\t};\n\t}\n\n\t// Check for Web frameworks (only if not mobile)\n\tif (hasPackageJson) {\n\t\ttry {\n\t\t\tconst packageJson = require(join(cwd, 'package.json'));\n\t\t\tconst deps = { ...packageJson.dependencies, ...packageJson.devDependencies };\n\n\t\t\t// Check for Next.js (must be before React check)\n\t\t\tif (deps['next']) {\n\t\t\t\tevidence.push('Found Next.js in dependencies');\n\t\t\t\tif (existsSync(join(cwd, 'next.config.js')) || existsSync(join(cwd, 'next.config.ts'))) {\n\t\t\t\t\tevidence.push('Found next.config (Next.js config)');\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tplatform: 'nextjs',\n\t\t\t\t\tconfidence: 'high',\n\t\t\t\t\tevidence,\n\t\t\t\t\tframework: 'nextjs',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Check for Nuxt.js (must be before Vue check)\n\t\t\tif (deps['nuxt'] || deps['nuxt3']) {\n\t\t\t\tevidence.push('Found Nuxt.js in dependencies');\n\t\t\t\tif (existsSync(join(cwd, 'nuxt.config.ts')) || existsSync(join(cwd, 'nuxt.config.js'))) {\n\t\t\t\t\tevidence.push('Found nuxt.config (Nuxt.js config)');\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tplatform: 'nuxtjs',\n\t\t\t\t\tconfidence: 'high',\n\t\t\t\t\tevidence,\n\t\t\t\t\tframework: 'nuxtjs',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Check for Vue\n\t\t\tif (deps['vue'] || deps['@vue/cli']) {\n\t\t\t\tevidence.push('Found Vue in dependencies');\n\t\t\t\tif (existsSync(join(cwd, 'vite.config.ts')) || existsSync(join(cwd, 'vite.config.js'))) {\n\t\t\t\t\tevidence.push('Found vite.config (Vue + Vite)');\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tplatform: 'vue',\n\t\t\t\t\tconfidence: 'high',\n\t\t\t\t\tevidence,\n\t\t\t\t\tframework: 'vue',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Check for Angular\n\t\t\tif (deps['@angular/core']) {\n\t\t\t\tevidence.push('Found @angular/core in dependencies');\n\t\t\t\tif (existsSync(join(cwd, 'angular.json'))) {\n\t\t\t\t\tevidence.push('Found angular.json (Angular config)');\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tplatform: 'angular',\n\t\t\t\t\tconfidence: 'high',\n\t\t\t\t\tevidence,\n\t\t\t\t\tframework: 'angular',\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Check for React (web)\n\t\t\tif (deps['react'] && !hasIosDir && !hasAndroidDir) {\n\t\t\t\tevidence.push('Found React in dependencies (web project)');\n\t\t\t\tif (existsSync(join(cwd, 'vite.config.ts')) || existsSync(join(cwd, 'vite.config.js'))) {\n\t\t\t\t\tevidence.push('Found vite.config (React + Vite)');\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tplatform: 'react',\n\t\t\t\t\tconfidence: 'high',\n\t\t\t\t\tevidence,\n\t\t\t\t\tframework: 'react',\n\t\t\t\t};\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Ignore errors\n\t\t}\n\t}\n\n\t// Unknown platform\n\treturn {\n\t\tplatform: 'unknown',\n\t\tconfidence: 'low',\n\t\tevidence: ['No recognized project structure found'],\n\t};\n}\n\n/**\n * Get human-readable platform name\n */\nexport function getPlatformDisplayName(platform: Platform): string {\n\tconst names: Record<Platform, string> = {\n\t\t'react-native': 'React Native',\n\t\t'flutter': 'Flutter',\n\t\t'vue': 'Vue.js',\n\t\t'react': 'React',\n\t\t'angular': 'Angular',\n\t\t'nextjs': 'Next.js',\n\t\t'nuxtjs': 'Nuxt.js',\n\t\t'unknown': 'Unknown',\n\t};\n\treturn names[platform];\n}\n\n/**\n * Check if platform is mobile\n */\nexport function isMobilePlatform(platform: Platform): boolean {\n\treturn platform === 'react-native' || platform === 'flutter';\n}\n\n/**\n * Check if platform is web\n */\nexport function isWebPlatform(platform: Platform): boolean {\n\treturn platform === 'vue' || platform === 'react' || platform === 'angular' || platform === 'nextjs' || platform === 'nuxtjs';\n}\n\n/**\n * Get registry file name for platform\n */\nexport function getRegistryFileName(platform: Platform): string {\n\tswitch (platform) {\n\t\tcase 'react-native':\n\t\t\treturn 'registry-react-native.json';\n\t\tcase 'flutter':\n\t\t\treturn 'registry-flutter.json';\n\t\tcase 'vue':\n\t\tcase 'nuxtjs':\n\t\tcase 'react':\n\t\tcase 'nextjs':\n\t\tcase 'angular':\n\t\t\treturn 'registry.json'; // Web platforms use same registry\n\t\tdefault:\n\t\t\treturn 'registry.json';\n\t}\n}\n\n/**\n * Get component source directory for platform\n */\nexport function getComponentSourceDir(platform: Platform): string {\n\tswitch (platform) {\n\t\tcase 'react-native':\n\t\t\treturn 'packages/react-native/src/components';\n\t\tcase 'flutter':\n\t\t\treturn 'packages/flutter/lib/components';\n\t\tcase 'vue':\n\t\tcase 'nuxtjs':\n\t\t\treturn 'packages/vue/src/components';\n\t\tcase 'react':\n\t\tcase 'nextjs':\n\t\t\treturn 'packages/react/src/components';\n\t\tcase 'angular':\n\t\t\treturn 'packages/angular/src/components';\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown platform: ${platform}`);\n\t}\n}\n"],"names":["existsSync","join","detectPlatform","cwd","evidence","push","platform","confidence","hasPackageJson","hasIosDir","hasAndroidDir","hasAppJson","packageJson","require","dependencies","error","deps","devDependencies","framework","getPlatformDisplayName","names","isMobilePlatform","isWebPlatform","getRegistryFileName","getComponentSourceDir","Error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/platform-detector.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport { join } from 'path';\n\n/**\n * Supported platforms for Galaxy UI CLI\n */\nexport type Platform =\n | 'react-native'\n | 'flutter'\n | 'vue'\n | 'react'\n | 'angular'\n | 'nextjs'\n | 'nuxtjs'\n | 'unknown';\n\n/**\n * Platform detection result with confidence level\n */\nexport interface PlatformDetectionResult {\n platform: Platform;\n confidence: 'high' | 'medium' | 'low';\n evidence: string[];\n framework?: string; // For web platforms: vue, react, angular\n}\n\n/**\n * Detect project platform based on file structure and config files\n *\n * Detection priority:\n * 1. Mobile platforms (React Native, Flutter) - highest priority\n * 2. Web frameworks (Vue, React, Angular)\n * 3. Unknown\n */\nexport function detectPlatform(cwd: string): PlatformDetectionResult {\n const evidence: string[] = [];\n\n // Check for Flutter (highest priority for mobile)\n if (existsSync(join(cwd, 'pubspec.yaml'))) {\n evidence.push('Found pubspec.yaml (Flutter project file)');\n\n // Additional Flutter indicators\n if (existsSync(join(cwd, 'lib'))) {\n evidence.push('Found lib/ directory (Flutter source directory)');\n }\n if (existsSync(join(cwd, 'android')) && existsSync(join(cwd, 'ios'))) {\n evidence.push(\n 'Found android/ and ios/ directories (Flutter mobile platforms)',\n );\n }\n\n return {\n platform: 'flutter',\n confidence: 'high',\n evidence,\n };\n }\n\n // Check for React Native\n const hasPackageJson = existsSync(join(cwd, 'package.json'));\n const hasIosDir = existsSync(join(cwd, 'ios'));\n const hasAndroidDir = existsSync(join(cwd, 'android'));\n const hasAppJson = existsSync(join(cwd, 'app.json'));\n\n if (hasPackageJson && (hasIosDir || hasAndroidDir)) {\n evidence.push('Found package.json with mobile platform directories');\n\n if (hasIosDir) evidence.push('Found ios/ directory');\n if (hasAndroidDir) evidence.push('Found android/ directory');\n if (hasAppJson) evidence.push('Found app.json (React Native config)');\n\n // Check package.json for react-native dependency\n try {\n const packageJson = require(join(cwd, 'package.json'));\n if (packageJson.dependencies?.['react-native']) {\n evidence.push('Found react-native in dependencies');\n return {\n platform: 'react-native',\n confidence: 'high',\n evidence,\n };\n }\n } catch (error) {\n // Ignore JSON parse errors\n }\n\n // If has mobile dirs but no react-native dep, still consider it RN with medium confidence\n return {\n platform: 'react-native',\n confidence: 'medium',\n evidence,\n };\n }\n\n // Check for Web frameworks (only if not mobile)\n if (hasPackageJson) {\n try {\n const packageJson = require(join(cwd, 'package.json'));\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n // Check for Next.js (must be before React check)\n if (deps['next']) {\n evidence.push('Found Next.js in dependencies');\n if (\n existsSync(join(cwd, 'next.config.js')) ||\n existsSync(join(cwd, 'next.config.ts'))\n ) {\n evidence.push('Found next.config (Next.js config)');\n }\n return {\n platform: 'nextjs',\n confidence: 'high',\n evidence,\n framework: 'nextjs',\n };\n }\n\n // Check for Nuxt.js (must be before Vue check)\n if (deps['nuxt'] || deps['nuxt3']) {\n evidence.push('Found Nuxt.js in dependencies');\n if (\n existsSync(join(cwd, 'nuxt.config.ts')) ||\n existsSync(join(cwd, 'nuxt.config.js'))\n ) {\n evidence.push('Found nuxt.config (Nuxt.js config)');\n }\n return {\n platform: 'nuxtjs',\n confidence: 'high',\n evidence,\n framework: 'nuxtjs',\n };\n }\n\n // Check for Vue\n if (deps['vue'] || deps['@vue/cli']) {\n evidence.push('Found Vue in dependencies');\n if (\n existsSync(join(cwd, 'vite.config.ts')) ||\n existsSync(join(cwd, 'vite.config.js'))\n ) {\n evidence.push('Found vite.config (Vue + Vite)');\n }\n return {\n platform: 'vue',\n confidence: 'high',\n evidence,\n framework: 'vue',\n };\n }\n\n // Check for Angular\n if (deps['@angular/core']) {\n evidence.push('Found @angular/core in dependencies');\n if (existsSync(join(cwd, 'angular.json'))) {\n evidence.push('Found angular.json (Angular config)');\n }\n return {\n platform: 'angular',\n confidence: 'high',\n evidence,\n framework: 'angular',\n };\n }\n\n // Check for React (web)\n if (deps['react'] && !hasIosDir && !hasAndroidDir) {\n evidence.push('Found React in dependencies (web project)');\n if (\n existsSync(join(cwd, 'vite.config.ts')) ||\n existsSync(join(cwd, 'vite.config.js'))\n ) {\n evidence.push('Found vite.config (React + Vite)');\n }\n return {\n platform: 'react',\n confidence: 'high',\n evidence,\n framework: 'react',\n };\n }\n } catch (error) {\n // Ignore errors\n }\n }\n\n // Unknown platform\n return {\n platform: 'unknown',\n confidence: 'low',\n evidence: ['No recognized project structure found'],\n };\n}\n\n/**\n * Get human-readable platform name\n */\nexport function getPlatformDisplayName(platform: Platform): string {\n const names: Record<Platform, string> = {\n 'react-native': 'React Native',\n flutter: 'Flutter',\n vue: 'Vue.js',\n react: 'React',\n angular: 'Angular',\n nextjs: 'Next.js',\n nuxtjs: 'Nuxt.js',\n unknown: 'Unknown',\n };\n return names[platform];\n}\n\n/**\n * Check if platform is mobile\n */\nexport function isMobilePlatform(platform: Platform): boolean {\n return platform === 'react-native' || platform === 'flutter';\n}\n\n/**\n * Check if platform is web\n */\nexport function isWebPlatform(platform: Platform): boolean {\n return (\n platform === 'vue' ||\n platform === 'react' ||\n platform === 'angular' ||\n platform === 'nextjs' ||\n platform === 'nuxtjs'\n );\n}\n\n/**\n * Get registry file name for platform\n */\nexport function getRegistryFileName(platform: Platform): string {\n switch (platform) {\n case 'react-native':\n return 'registry-react-native.json';\n case 'flutter':\n return 'registry-flutter.json';\n case 'vue':\n return 'registry-vue.json';\n case 'nuxtjs':\n return 'registry-vue.json';\n case 'react':\n return 'registry-react.json';\n case 'nextjs':\n return 'registry-react.json';\n case 'angular':\n return 'registry-angular.json';\n default:\n return 'registry.json';\n }\n}\n\n/**\n * Get component source directory for platform\n */\nexport function getComponentSourceDir(platform: Platform): string {\n switch (platform) {\n case 'react-native':\n return 'packages/react-native/src/components';\n case 'flutter':\n return 'packages/flutter/lib/components';\n case 'vue':\n case 'nuxtjs':\n return 'packages/vue/src/components';\n case 'react':\n case 'nextjs':\n return 'packages/react/src/components';\n case 'angular':\n return 'packages/angular/src/components';\n default:\n throw new Error(`Unknown platform: ${platform}`);\n }\n}\n"],"names":["existsSync","join","detectPlatform","cwd","evidence","push","platform","confidence","hasPackageJson","hasIosDir","hasAndroidDir","hasAppJson","packageJson","require","dependencies","error","deps","devDependencies","framework","getPlatformDisplayName","names","flutter","vue","react","angular","nextjs","nuxtjs","unknown","isMobilePlatform","isWebPlatform","getRegistryFileName","getComponentSourceDir","Error"],"mappings":"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"}
|
|
@@ -1,22 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { getRegistryFileName } from './platform-detector';
|
|
1
|
+
import { getAllFrameworkGroups, getAllFrameworkComponents, getFrameworkComponent, loadFrameworkRegistry, validateFrameworkComponentDependencies } from './framework-registry-service.js';
|
|
4
2
|
/**
|
|
3
|
+
* Component metadata from registry
|
|
4
|
+
*/ /**
|
|
5
5
|
* Load registry for specific platform
|
|
6
6
|
*
|
|
7
7
|
* @param platform - Target platform
|
|
8
8
|
* @param registryDir - Directory containing registry files (default: CLI src dir)
|
|
9
9
|
* @returns Registry data
|
|
10
10
|
*/ export function loadRegistry(platform, registryDir) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const content = readFileSync(registryPath, 'utf-8');
|
|
15
|
-
const registry = JSON.parse(content);
|
|
16
|
-
return registry;
|
|
17
|
-
} catch (error) {
|
|
18
|
-
throw new Error(`Failed to load registry for platform "${platform}": ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
19
|
-
}
|
|
11
|
+
return loadFrameworkRegistry(platform, {
|
|
12
|
+
registryDir
|
|
13
|
+
});
|
|
20
14
|
}
|
|
21
15
|
/**
|
|
22
16
|
* Get component metadata from registry
|
|
@@ -26,8 +20,9 @@ import { getRegistryFileName } from './platform-detector';
|
|
|
26
20
|
* @param registryDir - Optional registry directory
|
|
27
21
|
* @returns Component metadata or undefined if not found
|
|
28
22
|
*/ export function getComponent(componentName, platform, registryDir) {
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
return getFrameworkComponent(platform, componentName, {
|
|
24
|
+
registryDir
|
|
25
|
+
});
|
|
31
26
|
}
|
|
32
27
|
/**
|
|
33
28
|
* List all components for platform
|
|
@@ -37,14 +32,13 @@ import { getRegistryFileName } from './platform-detector';
|
|
|
37
32
|
* @param registryDir - Optional registry directory
|
|
38
33
|
* @returns Array of component names
|
|
39
34
|
*/ export function listComponents(platform, category, registryDir) {
|
|
40
|
-
const
|
|
35
|
+
const components = getAllFrameworkComponents(platform, {
|
|
36
|
+
registryDir
|
|
37
|
+
});
|
|
41
38
|
if (category) {
|
|
42
|
-
|
|
43
|
-
const components = Object.entries(registry.components).filter(([, meta])=>meta.type === category).map(([name])=>name);
|
|
44
|
-
return components.sort();
|
|
39
|
+
return Object.entries(components).filter(([, meta])=>meta.type === category).map(([name])=>name).sort();
|
|
45
40
|
}
|
|
46
|
-
|
|
47
|
-
return Object.keys(registry.components).sort();
|
|
41
|
+
return Object.keys(components).sort();
|
|
48
42
|
}
|
|
49
43
|
/**
|
|
50
44
|
* Get all component groups/categories
|
|
@@ -53,8 +47,9 @@ import { getRegistryFileName } from './platform-detector';
|
|
|
53
47
|
* @param registryDir - Optional registry directory
|
|
54
48
|
* @returns Component groups
|
|
55
49
|
*/ export function getGroups(platform, registryDir) {
|
|
56
|
-
|
|
57
|
-
|
|
50
|
+
return getAllFrameworkGroups(platform, {
|
|
51
|
+
registryDir
|
|
52
|
+
});
|
|
58
53
|
}
|
|
59
54
|
/**
|
|
60
55
|
* Search components by name or description
|
|
@@ -100,25 +95,9 @@ import { getRegistryFileName } from './platform-detector';
|
|
|
100
95
|
* @param registryDir - Optional registry directory
|
|
101
96
|
* @returns Validation result with missing dependencies
|
|
102
97
|
*/ export function validateComponentDependencies(componentName, platform, registryDir) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
valid: false,
|
|
107
|
-
missing: []
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
// Check internal component dependencies
|
|
111
|
-
const missing = [];
|
|
112
|
-
const registry = loadRegistry(platform, registryDir);
|
|
113
|
-
for (const dep of component.dependencies){
|
|
114
|
-
if (!registry.components[dep]) {
|
|
115
|
-
missing.push(dep);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
return {
|
|
119
|
-
valid: missing.length === 0,
|
|
120
|
-
missing
|
|
121
|
-
};
|
|
98
|
+
return validateFrameworkComponentDependencies(platform, componentName, {
|
|
99
|
+
registryDir
|
|
100
|
+
});
|
|
122
101
|
}
|
|
123
102
|
/**
|
|
124
103
|
* Get component statistics for platform
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/registry-loader.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../src/utils/registry-loader.ts"],"sourcesContent":["import type { Platform } from './platform-detector.js';\nimport {\n getAllFrameworkGroups,\n getAllFrameworkComponents,\n getFrameworkComponent,\n getFrameworkComponentsByType,\n loadFrameworkRegistry,\n validateFrameworkComponentDependencies,\n type FrameworkComponentGroup as ComponentGroup,\n type FrameworkRegistry as Registry,\n type FrameworkRegistryComponent as ComponentMetadata,\n} from './framework-registry-service.js';\n\n/**\n * Component metadata from registry\n */\n/**\n * Load registry for specific platform\n *\n * @param platform - Target platform\n * @param registryDir - Directory containing registry files (default: CLI src dir)\n * @returns Registry data\n */\nexport function loadRegistry(\n platform: Platform,\n registryDir?: string,\n): Registry {\n return loadFrameworkRegistry(platform, { registryDir });\n}\n\n/**\n * Get component metadata from registry\n *\n * @param componentName - Name of component to get\n * @param platform - Target platform\n * @param registryDir - Optional registry directory\n * @returns Component metadata or undefined if not found\n */\nexport function getComponent(\n componentName: string,\n platform: Platform,\n registryDir?: string,\n): ComponentMetadata | undefined {\n return getFrameworkComponent(platform, componentName, { registryDir });\n}\n\n/**\n * List all components for platform\n *\n * @param platform - Target platform\n * @param category - Optional category filter\n * @param registryDir - Optional registry directory\n * @returns Array of component names\n */\nexport function listComponents(\n platform: Platform,\n category?: string,\n registryDir?: string,\n): string[] {\n const components = getAllFrameworkComponents(platform, { registryDir });\n\n if (category) {\n return Object.entries(components)\n .filter(([, meta]) => meta.type === category)\n .map(([name]) => name)\n .sort();\n }\n\n return Object.keys(components).sort();\n}\n\n/**\n * Get all component groups/categories\n *\n * @param platform - Target platform\n * @param registryDir - Optional registry directory\n * @returns Component groups\n */\nexport function getGroups(\n platform: Platform,\n registryDir?: string,\n): Record<string, ComponentGroup> {\n return getAllFrameworkGroups(platform, { registryDir });\n}\n\n/**\n * Search components by name or description\n *\n * @param query - Search query\n * @param platform - Target platform\n * @param registryDir - Optional registry directory\n * @returns Array of matching component names\n */\nexport function searchComponents(\n query: string,\n platform: Platform,\n registryDir?: string,\n): Array<{ name: string; relevance: 'high' | 'medium' | 'low' }> {\n const registry = loadRegistry(platform, registryDir);\n const lowerQuery = query.toLowerCase();\n\n const results = Object.entries(registry.components)\n .map(([name, meta]) => {\n const nameMatch = name.toLowerCase().includes(lowerQuery);\n const descMatch = meta.description.toLowerCase().includes(lowerQuery);\n const typeMatch = meta.type.toLowerCase().includes(lowerQuery);\n\n let relevance: 'high' | 'medium' | 'low' = 'low';\n if (nameMatch) relevance = 'high';\n else if (typeMatch) relevance = 'medium';\n else if (descMatch) relevance = 'low';\n\n const isMatch = nameMatch || descMatch || typeMatch;\n\n return { name, relevance, isMatch };\n })\n .filter((result) => result.isMatch)\n .sort((a, b) => {\n const order = { high: 0, medium: 1, low: 2 };\n return order[a.relevance] - order[b.relevance];\n });\n\n return results;\n}\n\n/**\n * Validate component dependencies\n *\n * Check if all component dependencies are available\n *\n * @param componentName - Component to validate\n * @param platform - Target platform\n * @param registryDir - Optional registry directory\n * @returns Validation result with missing dependencies\n */\nexport function validateComponentDependencies(\n componentName: string,\n platform: Platform,\n registryDir?: string,\n): { valid: boolean; missing: string[] } {\n return validateFrameworkComponentDependencies(platform, componentName, {\n registryDir,\n });\n}\n\n/**\n * Get component statistics for platform\n *\n * @param platform - Target platform\n * @param registryDir - Optional registry directory\n * @returns Statistics object\n */\nexport function getRegistryStats(\n platform: Platform,\n registryDir?: string,\n): {\n totalComponents: number;\n groupCounts: Record<string, number>;\n platform: string;\n version: string;\n} {\n const registry = loadRegistry(platform, registryDir);\n\n const groupCounts: Record<string, number> = {};\n for (const [groupName, group] of Object.entries(registry.groups)) {\n groupCounts[groupName] = group.components.length;\n }\n\n return {\n totalComponents: Object.keys(registry.components).length,\n groupCounts,\n platform: registry.platform || platform,\n version: registry.version || 'unknown',\n };\n}\n"],"names":["getAllFrameworkGroups","getAllFrameworkComponents","getFrameworkComponent","loadFrameworkRegistry","validateFrameworkComponentDependencies","loadRegistry","platform","registryDir","getComponent","componentName","listComponents","category","components","Object","entries","filter","meta","type","map","name","sort","keys","getGroups","searchComponents","query","registry","lowerQuery","toLowerCase","results","nameMatch","includes","descMatch","description","typeMatch","relevance","isMatch","result","a","b","order","high","medium","low","validateComponentDependencies","getRegistryStats","groupCounts","groupName","group","groups","length","totalComponents","version"],"mappings":"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"}
|