@weme-ui/weme-ui 0.1.1-beta.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/LICENSE +21 -0
- package/README.md +36 -0
- package/dist/build-DPZMEzzf.mjs +23 -0
- package/dist/build-DPZMEzzf.mjs.map +1 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.mjs +29 -0
- package/dist/index.mjs.map +1 -0
- package/dist/info-Bz7qrvGn.mjs +41 -0
- package/dist/info-Bz7qrvGn.mjs.map +1 -0
- package/dist/init-BHl8Lwuu.mjs +64 -0
- package/dist/init-BHl8Lwuu.mjs.map +1 -0
- package/dist/manifest-BtSx8-dp.mjs +63 -0
- package/dist/manifest-BtSx8-dp.mjs.map +1 -0
- package/dist/package-e8qxd1tJ.mjs +85 -0
- package/dist/package-e8qxd1tJ.mjs.map +1 -0
- package/dist/project-2Uhjf6-l.mjs +58 -0
- package/dist/project-2Uhjf6-l.mjs.map +1 -0
- package/dist/project-BV4nSHdV.mjs +342 -0
- package/dist/project-BV4nSHdV.mjs.map +1 -0
- package/dist/project-DH8JkbwF.mjs +141 -0
- package/dist/project-DH8JkbwF.mjs.map +1 -0
- package/dist/registry-BChtLWfr.mjs +341 -0
- package/dist/registry-BChtLWfr.mjs.map +1 -0
- package/dist/registry-Cm_OqNvK.mjs +147 -0
- package/dist/registry-Cm_OqNvK.mjs.map +1 -0
- package/dist/registry-CqjT93gC.mjs +82 -0
- package/dist/registry-CqjT93gC.mjs.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import { c as runStep, f as fetchURL, l as Err, n as fetchManifestConfig, p as getGithubRepoName, r as fetchRegistryItems, u as Ok } from "./registry-BChtLWfr.mjs";
|
|
2
|
+
import { n as loadPackageJson, t as installDependencies } from "./package-e8qxd1tJ.mjs";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import * as p from "@clack/prompts";
|
|
5
|
+
import { PROJECT_FILE_NAME, projectPaths, projectSchema } from "@weme-ui/schema";
|
|
6
|
+
import path from "pathe";
|
|
7
|
+
import { glob } from "tinyglobby";
|
|
8
|
+
import ora from "ora";
|
|
9
|
+
|
|
10
|
+
//#region ../../node_modules/.pnpm/defu@6.1.4/node_modules/defu/dist/defu.mjs
|
|
11
|
+
function isPlainObject(value) {
|
|
12
|
+
if (value === null || typeof value !== "object") return false;
|
|
13
|
+
const prototype = Object.getPrototypeOf(value);
|
|
14
|
+
if (prototype !== null && prototype !== Object.prototype && Object.getPrototypeOf(prototype) !== null) return false;
|
|
15
|
+
if (Symbol.iterator in value) return false;
|
|
16
|
+
if (Symbol.toStringTag in value) return Object.prototype.toString.call(value) === "[object Module]";
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
function _defu(baseObject, defaults, namespace = ".", merger) {
|
|
20
|
+
if (!isPlainObject(defaults)) return _defu(baseObject, {}, namespace, merger);
|
|
21
|
+
const object = Object.assign({}, defaults);
|
|
22
|
+
for (const key in baseObject) {
|
|
23
|
+
if (key === "__proto__" || key === "constructor") continue;
|
|
24
|
+
const value = baseObject[key];
|
|
25
|
+
if (value === null || value === void 0) continue;
|
|
26
|
+
if (merger && merger(object, key, value, namespace)) continue;
|
|
27
|
+
if (Array.isArray(value) && Array.isArray(object[key])) object[key] = [...value, ...object[key]];
|
|
28
|
+
else if (isPlainObject(value) && isPlainObject(object[key])) object[key] = _defu(value, object[key], (namespace ? `${namespace}.` : "") + key.toString(), merger);
|
|
29
|
+
else object[key] = value;
|
|
30
|
+
}
|
|
31
|
+
return object;
|
|
32
|
+
}
|
|
33
|
+
function createDefu(merger) {
|
|
34
|
+
return (...arguments_) => arguments_.reduce((p$1, c) => _defu(p$1, c, "", merger), {});
|
|
35
|
+
}
|
|
36
|
+
const defu = createDefu();
|
|
37
|
+
const defuFn = createDefu((object, key, currentValue) => {
|
|
38
|
+
if (object[key] !== void 0 && typeof currentValue === "function") {
|
|
39
|
+
object[key] = currentValue(object[key]);
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
const defuArrayFn = createDefu((object, key, currentValue) => {
|
|
44
|
+
if (Array.isArray(object[key]) && typeof currentValue === "function") {
|
|
45
|
+
object[key] = currentValue(object[key]);
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
//#region src/utils/schema/project.ts
|
|
52
|
+
/**
|
|
53
|
+
* Load `weme.config.json` from current working directory.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* const config = loadProjectConfig(process.cwd())
|
|
58
|
+
*
|
|
59
|
+
* if (config.isErr()) {
|
|
60
|
+
* console.error(config.unwrapErr())
|
|
61
|
+
* return
|
|
62
|
+
* }
|
|
63
|
+
*
|
|
64
|
+
* console.log(config.unwrap().name)
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* @param cwd - Current working directory
|
|
68
|
+
* @return {Result<ProjectSchema, string>}
|
|
69
|
+
*/
|
|
70
|
+
function loadProjectConfig(cwd) {
|
|
71
|
+
const configPath = path.join(cwd, PROJECT_FILE_NAME);
|
|
72
|
+
if (!fs.existsSync(configPath)) return Err("Could not find your project configuration file!");
|
|
73
|
+
try {
|
|
74
|
+
const json = JSON.parse(fs.readFileSync(configPath, "utf8").toString());
|
|
75
|
+
const config = projectSchema.safeParse(json);
|
|
76
|
+
if (!config.success) return Err(config.error.message);
|
|
77
|
+
return Ok(config.data);
|
|
78
|
+
} catch (e) {
|
|
79
|
+
return Err(e.message);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Load project information from current working directory.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* const info = await loadProjectInfo(process.cwd())
|
|
88
|
+
*
|
|
89
|
+
* if (info.isErr()) {
|
|
90
|
+
* console.error(info.unwrapErr())
|
|
91
|
+
* return
|
|
92
|
+
* }
|
|
93
|
+
*
|
|
94
|
+
* console.log(info.unwrap().name)
|
|
95
|
+
* ```
|
|
96
|
+
*
|
|
97
|
+
* @param cwd - Current working directory
|
|
98
|
+
* @return {Promise<Result<ProjectInfo, string>>}
|
|
99
|
+
*/
|
|
100
|
+
async function loadProjectInfo(cwd) {
|
|
101
|
+
const spinner = ora().start("Fetching project information...");
|
|
102
|
+
try {
|
|
103
|
+
const pkg = loadPackageJson(cwd);
|
|
104
|
+
const config = loadProjectConfig(cwd);
|
|
105
|
+
if (pkg.isErr() || config.isErr()) return Err("Could not find your project configuration file!");
|
|
106
|
+
const repos = config.unwrap().repos || [];
|
|
107
|
+
const paths = resolvePaths(cwd, config.unwrap().paths);
|
|
108
|
+
if (paths.isErr()) return Err(paths.unwrapErr());
|
|
109
|
+
const registries = await Promise.all(repos.map(async (r) => {
|
|
110
|
+
const manifest = await fetchManifestConfig(r.repo);
|
|
111
|
+
if (manifest.isErr()) throw new Error(manifest.unwrapErr());
|
|
112
|
+
const registry = manifest.unwrap().find((m) => m.name === r.registry);
|
|
113
|
+
if (!registry) throw new Error(`${r.registry} not found.`);
|
|
114
|
+
const installed = await glob(`**/*.vue`, {
|
|
115
|
+
cwd: path.join(paths.unwrap().components, r.prefix || "ui"),
|
|
116
|
+
absolute: false,
|
|
117
|
+
onlyFiles: true
|
|
118
|
+
}).then((files) => files.length);
|
|
119
|
+
return {
|
|
120
|
+
name: r.registry,
|
|
121
|
+
repo: r.repo,
|
|
122
|
+
version: registry.version || "0.0.0",
|
|
123
|
+
description: registry.description || "",
|
|
124
|
+
prefix: r.prefix || registry.prefix,
|
|
125
|
+
access: registry.access,
|
|
126
|
+
default: !!r.default,
|
|
127
|
+
available: Object.entries(registry.items).reduce((acc, [, count]) => acc + count, 0),
|
|
128
|
+
installed
|
|
129
|
+
};
|
|
130
|
+
}));
|
|
131
|
+
return Ok({
|
|
132
|
+
name: pkg.unwrap().name || "",
|
|
133
|
+
description: pkg.unwrap().description || "",
|
|
134
|
+
version: pkg.unwrap().version || "0.0.0",
|
|
135
|
+
repos: repos.map((r) => r.repo),
|
|
136
|
+
registries
|
|
137
|
+
});
|
|
138
|
+
} catch (e) {
|
|
139
|
+
spinner.stop();
|
|
140
|
+
return Err(e.message);
|
|
141
|
+
} finally {
|
|
142
|
+
spinner.stop();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Update `weme.config.json` from current working directory.
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```ts
|
|
150
|
+
* await updateProjectConfig(process.cwd(), project, {
|
|
151
|
+
* repo: {
|
|
152
|
+
* repo: 'https://github.com/weme-ui/weme-ui',
|
|
153
|
+
* registry: 'weme-ui/std',
|
|
154
|
+
* prefix: 'ui',
|
|
155
|
+
* default: true,
|
|
156
|
+
* },
|
|
157
|
+
* cssVars: {
|
|
158
|
+
* colors: {
|
|
159
|
+
* primary: 'blue',
|
|
160
|
+
* },
|
|
161
|
+
* },
|
|
162
|
+
* })
|
|
163
|
+
* ```
|
|
164
|
+
*
|
|
165
|
+
* @param cwd - Current working directory
|
|
166
|
+
* @param project - Project configuration
|
|
167
|
+
* @param updates - Updates to apply
|
|
168
|
+
* @param updates.repo - Repository configuration to update
|
|
169
|
+
* @param updates.cssVars - CSS variables to update
|
|
170
|
+
*/
|
|
171
|
+
async function updateProjectConfig(cwd, project, updates) {
|
|
172
|
+
await runStep("Updating project configuration...", async (spinner) => {
|
|
173
|
+
if (updates.repo && project.repos.findIndex((r) => r.repo === updates.repo?.repo && r.registry === updates.repo?.registry) === -1) {
|
|
174
|
+
project.repos.push(updates.repo);
|
|
175
|
+
if (updates.repo.default) project.repos.forEach((repo) => {
|
|
176
|
+
repo.default = repo.registry === updates.repo?.registry;
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
if (updates.cssVars) {
|
|
180
|
+
project.unocss = project.unocss || {};
|
|
181
|
+
project.unocss.cssVars = defu(project.unocss.cssVars || {}, updates.cssVars);
|
|
182
|
+
}
|
|
183
|
+
fs.writeFileSync(path.join(cwd, PROJECT_FILE_NAME), `${JSON.stringify(project, null, 2)}\n`, {
|
|
184
|
+
encoding: "utf8",
|
|
185
|
+
flag: "w"
|
|
186
|
+
});
|
|
187
|
+
spinner.stop("Project configuration updated!");
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Parse project paths.
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* ```ts
|
|
195
|
+
* const paths = parsePaths(project.paths)
|
|
196
|
+
*
|
|
197
|
+
* if (paths.isErr()) {
|
|
198
|
+
* console.error(paths.unwrapErr())
|
|
199
|
+
* return
|
|
200
|
+
* }
|
|
201
|
+
*
|
|
202
|
+
* console.log(paths.unwrap().components)
|
|
203
|
+
* ```
|
|
204
|
+
*
|
|
205
|
+
* @param paths - Project paths
|
|
206
|
+
* @return {Result<Required<ProjectPaths>, string>}
|
|
207
|
+
*/
|
|
208
|
+
function parsePaths(paths) {
|
|
209
|
+
const result = projectPaths.safeParse(paths);
|
|
210
|
+
if (!result.success) return Err(result.error.message);
|
|
211
|
+
return Ok(result.data);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Resolve project paths.
|
|
215
|
+
*
|
|
216
|
+
* @example
|
|
217
|
+
* ```ts
|
|
218
|
+
* const paths = resolvePaths(process.cwd(), project.paths)
|
|
219
|
+
*
|
|
220
|
+
* if (paths.isErr()) {
|
|
221
|
+
* console.error(paths.unwrapErr())
|
|
222
|
+
* return
|
|
223
|
+
* }
|
|
224
|
+
*
|
|
225
|
+
* console.log(paths.unwrap().components)
|
|
226
|
+
* ```
|
|
227
|
+
*
|
|
228
|
+
* @param cwd - Current working directory
|
|
229
|
+
* @param paths - Project paths
|
|
230
|
+
* @return {Result<Required<ProjectPaths>, string>}
|
|
231
|
+
*/
|
|
232
|
+
function resolvePaths(cwd, paths) {
|
|
233
|
+
const resolved = parsePaths(paths);
|
|
234
|
+
if (resolved.isErr()) return Err(resolved.unwrapErr());
|
|
235
|
+
return Ok(Object.entries(resolved.unwrap()).reduce((acc, [key, value]) => {
|
|
236
|
+
acc[key] = path.resolve(cwd, value.replace("~", "app"));
|
|
237
|
+
return acc;
|
|
238
|
+
}, {}));
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Install registry items.
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* ```ts
|
|
245
|
+
* await installRegistryItems(
|
|
246
|
+
* process.cwd(),
|
|
247
|
+
* 'weme-ui/weme-ui',
|
|
248
|
+
* 'weme-ui/std',
|
|
249
|
+
* { name: 'button' },
|
|
250
|
+
* )
|
|
251
|
+
* ```
|
|
252
|
+
*
|
|
253
|
+
* @param cwd - Current working directory
|
|
254
|
+
* @param repo - Repository name
|
|
255
|
+
* @param registryName - Registry name
|
|
256
|
+
* @param project - Project configuration
|
|
257
|
+
* @param options - Options
|
|
258
|
+
* @param options.name - Registry item name
|
|
259
|
+
* @param options.type - Registry item type
|
|
260
|
+
*/
|
|
261
|
+
async function installRegistryItems(cwd, repo, registryName, project, options) {
|
|
262
|
+
const manifest = await fetchManifestConfig(repo);
|
|
263
|
+
if (manifest.isErr()) {
|
|
264
|
+
p.log.error(manifest.unwrapErr());
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const registry = manifest.unwrap().find((r) => r.name === registryName);
|
|
268
|
+
if (!registry) {
|
|
269
|
+
p.log.error("Registry not found.");
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const { dependencies, devDependencies, files, cssVars } = await fetchRegistryItems(repo, registry.name, options);
|
|
273
|
+
await runStep("Creating registry item files...", async (spinner) => {
|
|
274
|
+
const paths = resolvePaths(cwd, project.paths);
|
|
275
|
+
if (paths.isErr()) {
|
|
276
|
+
p.log.error(paths.unwrapErr());
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const prefix = project.repos.find((r) => r.registry === registry.name).prefix || "ui";
|
|
280
|
+
await Promise.all(files.map(async (file) => {
|
|
281
|
+
spinner.message(`Creating ${file.path}...`);
|
|
282
|
+
const content = await fetchURL(`https://raw.githubusercontent.com/${getGithubRepoName(repo)}/refs/heads/main/${registry.directory}/${file.path}`);
|
|
283
|
+
if (!content) {
|
|
284
|
+
p.log.error(`Failed to fetch ${file.path}.`);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
switch (file.type) {
|
|
288
|
+
case "component":
|
|
289
|
+
case "type":
|
|
290
|
+
case "style":
|
|
291
|
+
createFile(content, file.path.replace("components", path.join(paths.unwrap().components, prefix)));
|
|
292
|
+
break;
|
|
293
|
+
case "composable":
|
|
294
|
+
createFile(content, file.path.replace("composables", paths.unwrap().composables));
|
|
295
|
+
break;
|
|
296
|
+
case "plugin":
|
|
297
|
+
createFile(content, file.path.replace("plugins", paths.unwrap().plugins));
|
|
298
|
+
break;
|
|
299
|
+
case "util":
|
|
300
|
+
createFile(content, file.path.replace("utils", paths.unwrap().utils));
|
|
301
|
+
break;
|
|
302
|
+
case "file":
|
|
303
|
+
p.log.warn("File type is not supported yet.");
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
}));
|
|
307
|
+
spinner.stop("Registry item files created!");
|
|
308
|
+
});
|
|
309
|
+
await runStep("Installing dependencies...", async (spinner) => {
|
|
310
|
+
await installDependencies({
|
|
311
|
+
dependencies,
|
|
312
|
+
devDependencies
|
|
313
|
+
}, { cwd });
|
|
314
|
+
spinner.stop("Dependencies installed!");
|
|
315
|
+
});
|
|
316
|
+
await updateProjectConfig(cwd, project, { cssVars });
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Create file.
|
|
320
|
+
*
|
|
321
|
+
* @example
|
|
322
|
+
* ```ts
|
|
323
|
+
* createFile(content, 'components/ui/button.vue')
|
|
324
|
+
* ```
|
|
325
|
+
*
|
|
326
|
+
* @param content - File content
|
|
327
|
+
* @param dest - File destination
|
|
328
|
+
*/
|
|
329
|
+
function createFile(content, dest) {
|
|
330
|
+
if (!content) return;
|
|
331
|
+
if (fs.existsSync(dest)) return;
|
|
332
|
+
const dirname = path.dirname(dest);
|
|
333
|
+
if (!fs.existsSync(dirname)) fs.mkdirSync(dirname, { recursive: true });
|
|
334
|
+
fs.writeFileSync(dest, content, {
|
|
335
|
+
encoding: "utf8",
|
|
336
|
+
flag: "w"
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
//#endregion
|
|
341
|
+
export { loadProjectInfo as n, installRegistryItems as t };
|
|
342
|
+
//# sourceMappingURL=project-BV4nSHdV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-BV4nSHdV.mjs","names":["p","e: any"],"sources":["../../../node_modules/.pnpm/defu@6.1.4/node_modules/defu/dist/defu.mjs","../src/utils/schema/project.ts"],"sourcesContent":["function isPlainObject(value) {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== null && prototype !== Object.prototype && Object.getPrototypeOf(prototype) !== null) {\n return false;\n }\n if (Symbol.iterator in value) {\n return false;\n }\n if (Symbol.toStringTag in value) {\n return Object.prototype.toString.call(value) === \"[object Module]\";\n }\n return true;\n}\n\nfunction _defu(baseObject, defaults, namespace = \".\", merger) {\n if (!isPlainObject(defaults)) {\n return _defu(baseObject, {}, namespace, merger);\n }\n const object = Object.assign({}, defaults);\n for (const key in baseObject) {\n if (key === \"__proto__\" || key === \"constructor\") {\n continue;\n }\n const value = baseObject[key];\n if (value === null || value === void 0) {\n continue;\n }\n if (merger && merger(object, key, value, namespace)) {\n continue;\n }\n if (Array.isArray(value) && Array.isArray(object[key])) {\n object[key] = [...value, ...object[key]];\n } else if (isPlainObject(value) && isPlainObject(object[key])) {\n object[key] = _defu(\n value,\n object[key],\n (namespace ? `${namespace}.` : \"\") + key.toString(),\n merger\n );\n } else {\n object[key] = value;\n }\n }\n return object;\n}\nfunction createDefu(merger) {\n return (...arguments_) => (\n // eslint-disable-next-line unicorn/no-array-reduce\n arguments_.reduce((p, c) => _defu(p, c, \"\", merger), {})\n );\n}\nconst defu = createDefu();\nconst defuFn = createDefu((object, key, currentValue) => {\n if (object[key] !== void 0 && typeof currentValue === \"function\") {\n object[key] = currentValue(object[key]);\n return true;\n }\n});\nconst defuArrayFn = createDefu((object, key, currentValue) => {\n if (Array.isArray(object[key]) && typeof currentValue === \"function\") {\n object[key] = currentValue(object[key]);\n return true;\n }\n});\n\nexport { createDefu, defu as default, defu, defuArrayFn, defuFn };\n","import type { InlineCssVars, ProjectPaths, ProjectSchema, RegistryItemType } from '@weme-ui/schema'\nimport type { Result } from '../result'\nimport fs from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { PROJECT_FILE_NAME, projectPaths, projectSchema } from '@weme-ui/schema'\nimport { defu } from 'defu'\nimport ora from 'ora'\nimport path from 'pathe'\nimport { glob } from 'tinyglobby'\nimport { fetchURL, getGithubRepoName } from '../fetch'\nimport { Err, Ok } from '../result'\nimport { runStep } from '../utilities'\nimport { installDependencies, loadPackageJson } from './package'\nimport { fetchManifestConfig, fetchRegistryItems } from './registry'\n\nexport interface ProjectInfo {\n name: string\n description: string\n version: string\n repos: string[]\n registries: {\n name: string\n repo: string\n version: string\n description: string\n prefix: string\n access: string\n default: boolean\n available: number\n installed: number\n }[]\n}\n\n/**\n * Load `weme.config.json` from current working directory.\n *\n * @example\n * ```ts\n * const config = loadProjectConfig(process.cwd())\n *\n * if (config.isErr()) {\n * console.error(config.unwrapErr())\n * return\n * }\n *\n * console.log(config.unwrap().name)\n * ```\n *\n * @param cwd - Current working directory\n * @return {Result<ProjectSchema, string>}\n */\nexport function loadProjectConfig(cwd: string): Result<ProjectSchema, string> {\n const configPath = path.join(cwd, PROJECT_FILE_NAME)\n\n if (!fs.existsSync(configPath)) {\n return Err('Could not find your project configuration file!')\n }\n\n try {\n const json = JSON.parse(fs.readFileSync(configPath, 'utf8').toString())\n const config = projectSchema.safeParse(json)\n\n if (!config.success) {\n return Err(config.error.message)\n }\n\n return Ok(config.data)\n }\n catch (e: any) {\n return Err(e.message)\n }\n}\n\n/**\n * Load project information from current working directory.\n *\n * @example\n * ```ts\n * const info = await loadProjectInfo(process.cwd())\n *\n * if (info.isErr()) {\n * console.error(info.unwrapErr())\n * return\n * }\n *\n * console.log(info.unwrap().name)\n * ```\n *\n * @param cwd - Current working directory\n * @return {Promise<Result<ProjectInfo, string>>}\n */\nexport async function loadProjectInfo(cwd: string): Promise<Result<ProjectInfo, string>> {\n const spinner = ora().start('Fetching project information...')\n\n try {\n const pkg = loadPackageJson(cwd)\n const config = loadProjectConfig(cwd)\n\n if (pkg.isErr() || config.isErr()) {\n return Err('Could not find your project configuration file!')\n }\n\n const repos = config.unwrap().repos || []\n const paths = resolvePaths(cwd, config.unwrap().paths)\n\n if (paths.isErr()) {\n return Err(paths.unwrapErr())\n }\n\n const registries = await Promise.all(repos.map(async (r) => {\n const manifest = await fetchManifestConfig(r.repo)\n\n if (manifest.isErr()) {\n throw new Error(manifest.unwrapErr())\n }\n\n const registry = manifest.unwrap().find(m => m.name === r.registry)\n\n if (!registry) {\n throw new Error(`${r.registry} not found.`)\n }\n\n const installed = await glob(`**/*.vue`, {\n cwd: path.join(paths.unwrap().components, r.prefix || 'ui'),\n absolute: false,\n onlyFiles: true,\n }).then(\n files => files.length,\n )\n\n return {\n name: r.registry,\n repo: r.repo,\n version: registry.version || '0.0.0',\n description: registry.description || '',\n prefix: r.prefix || registry.prefix,\n access: registry.access,\n default: !!r.default,\n available: Object.entries(registry.items).reduce(\n (acc, [,count]) => acc + count,\n 0,\n ),\n installed,\n } satisfies ProjectInfo['registries'][number]\n }))\n\n return Ok({\n name: pkg.unwrap().name || '',\n description: pkg.unwrap().description || '',\n version: pkg.unwrap().version || '0.0.0',\n repos: repos.map(r => r.repo),\n registries,\n })\n }\n catch (e: any) {\n spinner.stop()\n return Err(e.message)\n }\n finally {\n spinner.stop()\n }\n}\n\n/**\n * Update `weme.config.json` from current working directory.\n *\n * @example\n * ```ts\n * await updateProjectConfig(process.cwd(), project, {\n * repo: {\n * repo: 'https://github.com/weme-ui/weme-ui',\n * registry: 'weme-ui/std',\n * prefix: 'ui',\n * default: true,\n * },\n * cssVars: {\n * colors: {\n * primary: 'blue',\n * },\n * },\n * })\n * ```\n *\n * @param cwd - Current working directory\n * @param project - Project configuration\n * @param updates - Updates to apply\n * @param updates.repo - Repository configuration to update\n * @param updates.cssVars - CSS variables to update\n */\nexport async function updateProjectConfig(\n cwd: string,\n project: ProjectSchema,\n updates: {\n repo?: ProjectSchema['repos'][number]\n cssVars?: InlineCssVars\n },\n) {\n await runStep('Updating project configuration...', async (spinner) => {\n if (\n updates.repo\n && project.repos.findIndex(\n r => r.repo === updates.repo?.repo\n && r.registry === updates.repo?.registry,\n ) === -1\n ) {\n project.repos.push(updates.repo)\n\n if (updates.repo.default) {\n project.repos.forEach((repo) => {\n repo.default = repo.registry === updates.repo?.registry\n })\n }\n }\n\n if (updates.cssVars) {\n project.unocss = project.unocss || {}\n project.unocss.cssVars = defu(project.unocss.cssVars || {}, updates.cssVars)\n }\n\n fs.writeFileSync(\n path.join(cwd, PROJECT_FILE_NAME),\n `${JSON.stringify(project, null, 2)}\\n`,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n )\n\n spinner.stop('Project configuration updated!')\n })\n}\n\n/**\n * Parse project paths.\n *\n * @example\n * ```ts\n * const paths = parsePaths(project.paths)\n *\n * if (paths.isErr()) {\n * console.error(paths.unwrapErr())\n * return\n * }\n *\n * console.log(paths.unwrap().components)\n * ```\n *\n * @param paths - Project paths\n * @return {Result<Required<ProjectPaths>, string>}\n */\nexport function parsePaths(paths: ProjectPaths): Result<Required<ProjectPaths>, string> {\n const result = projectPaths.safeParse(paths)\n\n if (!result.success) {\n return Err(result.error.message)\n }\n\n return Ok(result.data as Required<ProjectPaths>)\n}\n\n/**\n * Resolve project paths.\n *\n * @example\n * ```ts\n * const paths = resolvePaths(process.cwd(), project.paths)\n *\n * if (paths.isErr()) {\n * console.error(paths.unwrapErr())\n * return\n * }\n *\n * console.log(paths.unwrap().components)\n * ```\n *\n * @param cwd - Current working directory\n * @param paths - Project paths\n * @return {Result<Required<ProjectPaths>, string>}\n */\nexport function resolvePaths(cwd: string, paths: ProjectPaths): Result<Required<ProjectPaths>, string> {\n const resolved = parsePaths(paths)\n\n if (resolved.isErr()) {\n return Err(resolved.unwrapErr())\n }\n\n return Ok(\n Object.entries(resolved.unwrap())\n .reduce((acc, [key, value]) => {\n acc[key as keyof ProjectPaths] = path.resolve(cwd, value.replace('~', 'app'))\n return acc\n }, {} as Required<ProjectPaths>),\n )\n}\n\n/**\n * Resolve project paths.\n *\n * @example\n * ```ts\n * const paths = resolveProjectPaths(process.cwd())\n *\n * if (paths.isErr()) {\n * console.error(paths.unwrapErr())\n * return\n * }\n *\n * console.log(paths.unwrap().components)\n * ```\n *\n * @param cwd - Current working directory\n * @param resolved - Resolve paths\n * @return {Result<Required<ProjectPaths>, string>}\n */\nexport function resolveProjectPaths(cwd: string, resolved = false): Result<Required<ProjectPaths>, string> {\n const project = loadProjectConfig(cwd)\n\n if (project.isErr()) {\n return Err(project.unwrapErr())\n }\n\n return Ok(\n resolved\n ? resolvePaths(cwd, project.unwrap().paths).unwrap()\n : project.unwrap().paths as Required<ProjectPaths>,\n )\n}\n\n/**\n * Install registry items.\n *\n * @example\n * ```ts\n * await installRegistryItems(\n * process.cwd(),\n * 'weme-ui/weme-ui',\n * 'weme-ui/std',\n * { name: 'button' },\n * )\n * ```\n *\n * @param cwd - Current working directory\n * @param repo - Repository name\n * @param registryName - Registry name\n * @param project - Project configuration\n * @param options - Options\n * @param options.name - Registry item name\n * @param options.type - Registry item type\n */\nexport async function installRegistryItems(\n cwd: string,\n repo: string,\n registryName: string,\n project: ProjectSchema,\n options?: {\n name?: string | string[]\n type?: RegistryItemType\n },\n) {\n const manifest = await fetchManifestConfig(repo)\n\n if (manifest.isErr()) {\n p.log.error(manifest.unwrapErr())\n return\n }\n\n const registry = manifest.unwrap().find(r => r.name === registryName)\n\n if (!registry) {\n p.log.error('Registry not found.')\n return\n }\n\n const { dependencies, devDependencies, files, cssVars } = await fetchRegistryItems(\n repo,\n registry.name,\n options,\n )\n\n await runStep('Creating registry item files...', async (spinner) => {\n const paths = resolvePaths(cwd, project.paths)\n\n if (paths.isErr()) {\n p.log.error(paths.unwrapErr())\n return\n }\n\n const prefix = project.repos.find(r => r.registry === registry.name)!.prefix || 'ui'\n\n await Promise.all(files.map(async (file) => {\n spinner.message(`Creating ${file.path}...`)\n\n const content = await fetchURL(\n `https://raw.githubusercontent.com/${getGithubRepoName(repo)}/refs/heads/main/${registry.directory}/${file.path}`,\n )\n\n if (!content) {\n p.log.error(`Failed to fetch ${file.path}.`)\n return\n }\n\n switch (file.type) {\n case 'component':\n case 'type':\n case 'style':\n createFile(content, file.path.replace('components', path.join(paths.unwrap().components, prefix)))\n break\n\n case 'composable':\n createFile(content, file.path.replace('composables', paths.unwrap().composables))\n break\n\n case 'plugin':\n createFile(content, file.path.replace('plugins', paths.unwrap().plugins))\n break\n\n case 'util':\n createFile(content, file.path.replace('utils', paths.unwrap().utils))\n break\n\n case 'file':\n p.log.warn('File type is not supported yet.')\n break\n }\n }))\n\n spinner.stop('Registry item files created!')\n })\n\n await runStep('Installing dependencies...', async (spinner) => {\n await installDependencies({\n dependencies,\n devDependencies,\n }, { cwd })\n\n spinner.stop('Dependencies installed!')\n })\n\n await updateProjectConfig(cwd, project, { cssVars })\n}\n\n/**\n * Create file.\n *\n * @example\n * ```ts\n * createFile(content, 'components/ui/button.vue')\n * ```\n *\n * @param content - File content\n * @param dest - File destination\n */\nfunction createFile(content: string, dest: string) {\n if (!content)\n return\n\n if (fs.existsSync(dest))\n return\n\n const dirname = path.dirname(dest)\n\n if (!fs.existsSync(dirname))\n fs.mkdirSync(dirname, { recursive: true })\n\n fs.writeFileSync(dest, content, {\n encoding: 'utf8',\n flag: 'w',\n })\n}\n"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;AAAA,SAAS,cAAc,OAAO;AAC5B,KAAI,UAAU,QAAQ,OAAO,UAAU,SACrC,QAAO;CAET,MAAM,YAAY,OAAO,eAAe,MAAM;AAC9C,KAAI,cAAc,QAAQ,cAAc,OAAO,aAAa,OAAO,eAAe,UAAU,KAAK,KAC/F,QAAO;AAET,KAAI,OAAO,YAAY,MACrB,QAAO;AAET,KAAI,OAAO,eAAe,MACxB,QAAO,OAAO,UAAU,SAAS,KAAK,MAAM,KAAK;AAEnD,QAAO;;AAGT,SAAS,MAAM,YAAY,UAAU,YAAY,KAAK,QAAQ;AAC5D,KAAI,CAAC,cAAc,SAAS,CAC1B,QAAO,MAAM,YAAY,EAAE,EAAE,WAAW,OAAO;CAEjD,MAAM,SAAS,OAAO,OAAO,EAAE,EAAE,SAAS;AAC1C,MAAK,MAAM,OAAO,YAAY;AAC5B,MAAI,QAAQ,eAAe,QAAQ,cACjC;EAEF,MAAM,QAAQ,WAAW;AACzB,MAAI,UAAU,QAAQ,UAAU,KAAK,EACnC;AAEF,MAAI,UAAU,OAAO,QAAQ,KAAK,OAAO,UAAU,CACjD;AAEF,MAAI,MAAM,QAAQ,MAAM,IAAI,MAAM,QAAQ,OAAO,KAAK,CACpD,QAAO,OAAO,CAAC,GAAG,OAAO,GAAG,OAAO,KAAK;WAC/B,cAAc,MAAM,IAAI,cAAc,OAAO,KAAK,CAC3D,QAAO,OAAO,MACZ,OACA,OAAO,OACN,YAAY,GAAG,UAAU,KAAK,MAAM,IAAI,UAAU,EACnD,OACD;MAED,QAAO,OAAO;;AAGlB,QAAO;;AAET,SAAS,WAAW,QAAQ;AAC1B,SAAQ,GAAG,eAET,WAAW,QAAQ,KAAG,MAAM,MAAMA,KAAG,GAAG,IAAI,OAAO,EAAE,EAAE,CAAC;;AAG5D,MAAM,OAAO,YAAY;AACzB,MAAM,SAAS,YAAY,QAAQ,KAAK,iBAAiB;AACvD,KAAI,OAAO,SAAS,KAAK,KAAK,OAAO,iBAAiB,YAAY;AAChE,SAAO,OAAO,aAAa,OAAO,KAAK;AACvC,SAAO;;EAET;AACF,MAAM,cAAc,YAAY,QAAQ,KAAK,iBAAiB;AAC5D,KAAI,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,iBAAiB,YAAY;AACpE,SAAO,OAAO,aAAa,OAAO,KAAK;AACvC,SAAO;;EAET;;;;;;;;;;;;;;;;;;;;;;ACfF,SAAgB,kBAAkB,KAA4C;CAC5E,MAAM,aAAa,KAAK,KAAK,KAAK,kBAAkB;AAEpD,KAAI,CAAC,GAAG,WAAW,WAAW,CAC5B,QAAO,IAAI,kDAAkD;AAG/D,KAAI;EACF,MAAM,OAAO,KAAK,MAAM,GAAG,aAAa,YAAY,OAAO,CAAC,UAAU,CAAC;EACvE,MAAM,SAAS,cAAc,UAAU,KAAK;AAE5C,MAAI,CAAC,OAAO,QACV,QAAO,IAAI,OAAO,MAAM,QAAQ;AAGlC,SAAO,GAAG,OAAO,KAAK;UAEjBC,GAAQ;AACb,SAAO,IAAI,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;AAsBzB,eAAsB,gBAAgB,KAAmD;CACvF,MAAM,UAAU,KAAK,CAAC,MAAM,kCAAkC;AAE9D,KAAI;EACF,MAAM,MAAM,gBAAgB,IAAI;EAChC,MAAM,SAAS,kBAAkB,IAAI;AAErC,MAAI,IAAI,OAAO,IAAI,OAAO,OAAO,CAC/B,QAAO,IAAI,kDAAkD;EAG/D,MAAM,QAAQ,OAAO,QAAQ,CAAC,SAAS,EAAE;EACzC,MAAM,QAAQ,aAAa,KAAK,OAAO,QAAQ,CAAC,MAAM;AAEtD,MAAI,MAAM,OAAO,CACf,QAAO,IAAI,MAAM,WAAW,CAAC;EAG/B,MAAM,aAAa,MAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,MAAM;GAC1D,MAAM,WAAW,MAAM,oBAAoB,EAAE,KAAK;AAElD,OAAI,SAAS,OAAO,CAClB,OAAM,IAAI,MAAM,SAAS,WAAW,CAAC;GAGvC,MAAM,WAAW,SAAS,QAAQ,CAAC,MAAK,MAAK,EAAE,SAAS,EAAE,SAAS;AAEnE,OAAI,CAAC,SACH,OAAM,IAAI,MAAM,GAAG,EAAE,SAAS,aAAa;GAG7C,MAAM,YAAY,MAAM,KAAK,YAAY;IACvC,KAAK,KAAK,KAAK,MAAM,QAAQ,CAAC,YAAY,EAAE,UAAU,KAAK;IAC3D,UAAU;IACV,WAAW;IACZ,CAAC,CAAC,MACD,UAAS,MAAM,OAChB;AAED,UAAO;IACL,MAAM,EAAE;IACR,MAAM,EAAE;IACR,SAAS,SAAS,WAAW;IAC7B,aAAa,SAAS,eAAe;IACrC,QAAQ,EAAE,UAAU,SAAS;IAC7B,QAAQ,SAAS;IACjB,SAAS,CAAC,CAAC,EAAE;IACb,WAAW,OAAO,QAAQ,SAAS,MAAM,CAAC,QACvC,KAAK,GAAE,WAAW,MAAM,OACzB,EACD;IACD;IACD;IACD,CAAC;AAEH,SAAO,GAAG;GACR,MAAM,IAAI,QAAQ,CAAC,QAAQ;GAC3B,aAAa,IAAI,QAAQ,CAAC,eAAe;GACzC,SAAS,IAAI,QAAQ,CAAC,WAAW;GACjC,OAAO,MAAM,KAAI,MAAK,EAAE,KAAK;GAC7B;GACD,CAAC;UAEGA,GAAQ;AACb,UAAQ,MAAM;AACd,SAAO,IAAI,EAAE,QAAQ;WAEf;AACN,UAAQ,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BlB,eAAsB,oBACpB,KACA,SACA,SAIA;AACA,OAAM,QAAQ,qCAAqC,OAAO,YAAY;AACpE,MACE,QAAQ,QACL,QAAQ,MAAM,WACf,MAAK,EAAE,SAAS,QAAQ,MAAM,QACzB,EAAE,aAAa,QAAQ,MAAM,SACnC,KAAK,IACN;AACA,WAAQ,MAAM,KAAK,QAAQ,KAAK;AAEhC,OAAI,QAAQ,KAAK,QACf,SAAQ,MAAM,SAAS,SAAS;AAC9B,SAAK,UAAU,KAAK,aAAa,QAAQ,MAAM;KAC/C;;AAIN,MAAI,QAAQ,SAAS;AACnB,WAAQ,SAAS,QAAQ,UAAU,EAAE;AACrC,WAAQ,OAAO,UAAU,KAAK,QAAQ,OAAO,WAAW,EAAE,EAAE,QAAQ,QAAQ;;AAG9E,KAAG,cACD,KAAK,KAAK,KAAK,kBAAkB,EACjC,GAAG,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC,KACpC;GACE,UAAU;GACV,MAAM;GACP,CACF;AAED,UAAQ,KAAK,iCAAiC;GAC9C;;;;;;;;;;;;;;;;;;;;AAqBJ,SAAgB,WAAW,OAA6D;CACtF,MAAM,SAAS,aAAa,UAAU,MAAM;AAE5C,KAAI,CAAC,OAAO,QACV,QAAO,IAAI,OAAO,MAAM,QAAQ;AAGlC,QAAO,GAAG,OAAO,KAA+B;;;;;;;;;;;;;;;;;;;;;AAsBlD,SAAgB,aAAa,KAAa,OAA6D;CACrG,MAAM,WAAW,WAAW,MAAM;AAElC,KAAI,SAAS,OAAO,CAClB,QAAO,IAAI,SAAS,WAAW,CAAC;AAGlC,QAAO,GACL,OAAO,QAAQ,SAAS,QAAQ,CAAC,CAC9B,QAAQ,KAAK,CAAC,KAAK,WAAW;AAC7B,MAAI,OAA6B,KAAK,QAAQ,KAAK,MAAM,QAAQ,KAAK,MAAM,CAAC;AAC7E,SAAO;IACN,EAAE,CAA2B,CACnC;;;;;;;;;;;;;;;;;;;;;;;AAyDH,eAAsB,qBACpB,KACA,MACA,cACA,SACA,SAIA;CACA,MAAM,WAAW,MAAM,oBAAoB,KAAK;AAEhD,KAAI,SAAS,OAAO,EAAE;AACpB,IAAE,IAAI,MAAM,SAAS,WAAW,CAAC;AACjC;;CAGF,MAAM,WAAW,SAAS,QAAQ,CAAC,MAAK,MAAK,EAAE,SAAS,aAAa;AAErE,KAAI,CAAC,UAAU;AACb,IAAE,IAAI,MAAM,sBAAsB;AAClC;;CAGF,MAAM,EAAE,cAAc,iBAAiB,OAAO,YAAY,MAAM,mBAC9D,MACA,SAAS,MACT,QACD;AAED,OAAM,QAAQ,mCAAmC,OAAO,YAAY;EAClE,MAAM,QAAQ,aAAa,KAAK,QAAQ,MAAM;AAE9C,MAAI,MAAM,OAAO,EAAE;AACjB,KAAE,IAAI,MAAM,MAAM,WAAW,CAAC;AAC9B;;EAGF,MAAM,SAAS,QAAQ,MAAM,MAAK,MAAK,EAAE,aAAa,SAAS,KAAK,CAAE,UAAU;AAEhF,QAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,SAAS;AAC1C,WAAQ,QAAQ,YAAY,KAAK,KAAK,KAAK;GAE3C,MAAM,UAAU,MAAM,SACpB,qCAAqC,kBAAkB,KAAK,CAAC,mBAAmB,SAAS,UAAU,GAAG,KAAK,OAC5G;AAED,OAAI,CAAC,SAAS;AACZ,MAAE,IAAI,MAAM,mBAAmB,KAAK,KAAK,GAAG;AAC5C;;AAGF,WAAQ,KAAK,MAAb;IACE,KAAK;IACL,KAAK;IACL,KAAK;AACH,gBAAW,SAAS,KAAK,KAAK,QAAQ,cAAc,KAAK,KAAK,MAAM,QAAQ,CAAC,YAAY,OAAO,CAAC,CAAC;AAClG;IAEF,KAAK;AACH,gBAAW,SAAS,KAAK,KAAK,QAAQ,eAAe,MAAM,QAAQ,CAAC,YAAY,CAAC;AACjF;IAEF,KAAK;AACH,gBAAW,SAAS,KAAK,KAAK,QAAQ,WAAW,MAAM,QAAQ,CAAC,QAAQ,CAAC;AACzE;IAEF,KAAK;AACH,gBAAW,SAAS,KAAK,KAAK,QAAQ,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC;AACrE;IAEF,KAAK;AACH,OAAE,IAAI,KAAK,kCAAkC;AAC7C;;IAEJ,CAAC;AAEH,UAAQ,KAAK,+BAA+B;GAC5C;AAEF,OAAM,QAAQ,8BAA8B,OAAO,YAAY;AAC7D,QAAM,oBAAoB;GACxB;GACA;GACD,EAAE,EAAE,KAAK,CAAC;AAEX,UAAQ,KAAK,0BAA0B;GACvC;AAEF,OAAM,oBAAoB,KAAK,SAAS,EAAE,SAAS,CAAC;;;;;;;;;;;;;AActD,SAAS,WAAW,SAAiB,MAAc;AACjD,KAAI,CAAC,QACH;AAEF,KAAI,GAAG,WAAW,KAAK,CACrB;CAEF,MAAM,UAAU,KAAK,QAAQ,KAAK;AAElC,KAAI,CAAC,GAAG,WAAW,QAAQ,CACzB,IAAG,UAAU,SAAS,EAAE,WAAW,MAAM,CAAC;AAE5C,IAAG,cAAc,MAAM,SAAS;EAC9B,UAAU;EACV,MAAM;EACP,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { a as selectRegistry, c as runStep, d as fetchBinary, f as fetchURL } from "./registry-BChtLWfr.mjs";
|
|
2
|
+
import { t as installRegistryItems } from "./project-BV4nSHdV.mjs";
|
|
3
|
+
import { r as runDevPrepare } from "./package-e8qxd1tJ.mjs";
|
|
4
|
+
import { exit } from "node:process";
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import * as p from "@clack/prompts";
|
|
7
|
+
import { PROJECT_FILE_NAME, PROJECT_SCHEMA_URL, projectSchema } from "@weme-ui/schema";
|
|
8
|
+
import chalk from "chalk";
|
|
9
|
+
import path from "pathe";
|
|
10
|
+
import { Buffer } from "node:buffer";
|
|
11
|
+
|
|
12
|
+
//#region src/commands/init/project/context.ts
|
|
13
|
+
async function createContext(args) {
|
|
14
|
+
const cwd$1 = path.resolve(args.cwd);
|
|
15
|
+
if (!fs.existsSync(cwd$1)) fs.mkdirSync(cwd$1, { recursive: true });
|
|
16
|
+
const components = await p.text({
|
|
17
|
+
message: "Please enter a default path to install the components.",
|
|
18
|
+
placeholder: "~/components",
|
|
19
|
+
defaultValue: "~/components",
|
|
20
|
+
validate: (value) => {
|
|
21
|
+
if (!value) return "Path is required!";
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
if (p.isCancel(components)) {
|
|
25
|
+
p.cancel("Operation cancelled.");
|
|
26
|
+
exit(0);
|
|
27
|
+
}
|
|
28
|
+
const repo = args.repo || "weme-ui/weme-ui";
|
|
29
|
+
const registry = await selectRegistry(repo);
|
|
30
|
+
const prefix = await p.text({
|
|
31
|
+
message: "What is the prefix of the registry?",
|
|
32
|
+
placeholder: registry.prefix,
|
|
33
|
+
defaultValue: registry.prefix
|
|
34
|
+
});
|
|
35
|
+
if (p.isCancel(prefix)) {
|
|
36
|
+
p.cancel("Operation cancelled.");
|
|
37
|
+
exit(0);
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
repo,
|
|
41
|
+
registry: registry.name,
|
|
42
|
+
directory: registry.directory,
|
|
43
|
+
prefix,
|
|
44
|
+
access: registry.access,
|
|
45
|
+
paths: { components },
|
|
46
|
+
cwd: cwd$1
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
//#region src/commands/init/project/files.ts
|
|
52
|
+
async function createFiles(ctx) {
|
|
53
|
+
await runStep("Generating project files...", async (spinner) => {
|
|
54
|
+
await Promise.all([
|
|
55
|
+
"app/app.vue",
|
|
56
|
+
"public/robots.txt",
|
|
57
|
+
"public/favicon.ico",
|
|
58
|
+
"package.json",
|
|
59
|
+
"tsconfig.json",
|
|
60
|
+
".gitignore",
|
|
61
|
+
"README.md"
|
|
62
|
+
].map(async (file) => {
|
|
63
|
+
spinner.message(`Generating ${chalk.cyan(file)}...`);
|
|
64
|
+
const isFavicon = file === "public/favicon.ico";
|
|
65
|
+
const content = await (isFavicon ? fetchBinary : fetchURL)(`https://raw.githubusercontent.com/weme-ui/templates/refs/heads/main/project/${file}`);
|
|
66
|
+
if (content) {
|
|
67
|
+
const filePath = path.join(ctx.cwd, file);
|
|
68
|
+
const dirname = path.dirname(filePath);
|
|
69
|
+
if (!fs.existsSync(dirname)) fs.mkdirSync(dirname, { recursive: true });
|
|
70
|
+
if (isFavicon) {
|
|
71
|
+
const buffer = Buffer.from(content);
|
|
72
|
+
fs.writeFileSync(filePath, buffer, { flag: "w" });
|
|
73
|
+
} else fs.writeFileSync(path.join(ctx.cwd, file), content, {
|
|
74
|
+
encoding: "utf8",
|
|
75
|
+
flag: "w"
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}));
|
|
79
|
+
spinner.stop("Project files generated!");
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async function createNuxtConfig(ctx) {
|
|
83
|
+
await runStep(`Generating ${chalk.cyan("nuxt.config.ts")}...`, async (spinner) => {
|
|
84
|
+
const lines = [
|
|
85
|
+
"export default defineNuxtConfig({",
|
|
86
|
+
" devtools: {",
|
|
87
|
+
" enabled: true,",
|
|
88
|
+
" },",
|
|
89
|
+
` compatibilityDate: ${JSON.stringify((/* @__PURE__ */ new Date()).toISOString().slice(0, 10))},`,
|
|
90
|
+
"})"
|
|
91
|
+
];
|
|
92
|
+
fs.writeFileSync(path.join(ctx.cwd, "nuxt.config.ts"), `${lines.join("\n")}\n`, {
|
|
93
|
+
encoding: "utf8",
|
|
94
|
+
flag: "w"
|
|
95
|
+
});
|
|
96
|
+
spinner.stop(`${chalk.cyan("nuxt.config.ts")} generated!`);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
async function createProjectConfig(ctx) {
|
|
100
|
+
return await runStep(`Generating ${chalk.cyan(PROJECT_FILE_NAME)}...`, async (spinner) => {
|
|
101
|
+
const config = projectSchema.safeParse({
|
|
102
|
+
$schema: PROJECT_SCHEMA_URL,
|
|
103
|
+
repos: [{
|
|
104
|
+
repo: ctx.repo,
|
|
105
|
+
registry: ctx.registry,
|
|
106
|
+
prefix: ctx.prefix,
|
|
107
|
+
default: true
|
|
108
|
+
}],
|
|
109
|
+
paths: ctx.paths
|
|
110
|
+
});
|
|
111
|
+
if (!config.success) {
|
|
112
|
+
p.log.error(config.error.message);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
fs.writeFileSync(path.join(ctx.cwd, PROJECT_FILE_NAME), `${JSON.stringify(config.data, null, 2)}\n`, {
|
|
116
|
+
encoding: "utf8",
|
|
117
|
+
flag: "w"
|
|
118
|
+
});
|
|
119
|
+
spinner.stop(`${chalk.cyan(PROJECT_FILE_NAME)} generated!`);
|
|
120
|
+
return config.data;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
//#endregion
|
|
125
|
+
//#region src/commands/init/project/index.ts
|
|
126
|
+
async function project_default(args) {
|
|
127
|
+
p.intro(chalk.bold.blue("✨ Initializing Weme UI Project"));
|
|
128
|
+
const ctx = await createContext(args);
|
|
129
|
+
const project = await createProjectConfig(ctx);
|
|
130
|
+
if (project) {
|
|
131
|
+
await createFiles(ctx);
|
|
132
|
+
await createNuxtConfig(ctx);
|
|
133
|
+
await installRegistryItems(ctx.cwd, ctx.repo, ctx.registry, project, { type: "init" });
|
|
134
|
+
await runDevPrepare(ctx.cwd);
|
|
135
|
+
} else p.log.error("Failed to create project configuration file.");
|
|
136
|
+
p.outro("🥤 All done!");
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
//#endregion
|
|
140
|
+
export { project_default as default };
|
|
141
|
+
//# sourceMappingURL=project-DH8JkbwF.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-DH8JkbwF.mjs","names":["cwd","lines: string[]"],"sources":["../src/commands/init/project/context.ts","../src/commands/init/project/files.ts","../src/commands/init/project/index.ts"],"sourcesContent":["import type { ProjectPaths } from '@weme-ui/schema'\nimport fs from 'node:fs'\nimport { exit } from 'node:process'\nimport * as p from '@clack/prompts'\nimport path from 'pathe'\nimport { selectRegistry } from '../../../utils/schema/registry'\n\nexport interface InitProjectContext {\n repo: string\n registry: string\n directory: string\n prefix: string\n access: string\n paths: ProjectPaths\n cwd: string\n}\n\nexport async function createContext(args: Record<string, any>): Promise<InitProjectContext> {\n const cwd = path.resolve(args.cwd)\n\n if (!fs.existsSync(cwd))\n fs.mkdirSync(cwd, { recursive: true })\n\n const components = await p.text({\n message: 'Please enter a default path to install the components.',\n placeholder: '~/components',\n defaultValue: '~/components',\n validate: (value: string) => {\n if (!value)\n return 'Path is required!'\n },\n })\n\n if (p.isCancel(components)) {\n p.cancel('Operation cancelled.')\n exit(0)\n }\n\n const repo = args.repo || 'weme-ui/weme-ui'\n const registry = await selectRegistry(repo)\n\n const prefix = await p.text({\n message: 'What is the prefix of the registry?',\n placeholder: registry.prefix,\n defaultValue: registry.prefix,\n })\n\n if (p.isCancel(prefix)) {\n p.cancel('Operation cancelled.')\n exit(0)\n }\n\n return {\n repo,\n registry: registry.name,\n directory: registry.directory,\n prefix,\n access: registry.access,\n paths: {\n components,\n },\n cwd,\n }\n}\n","import type { InitProjectContext } from './context'\nimport { Buffer } from 'node:buffer'\nimport fs from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { PROJECT_FILE_NAME, PROJECT_SCHEMA_URL, projectSchema } from '@weme-ui/schema'\nimport chalk from 'chalk'\nimport path from 'pathe'\nimport { fetchBinary, fetchURL } from '../../../utils/fetch'\nimport { runStep } from '../../../utils/utilities'\n\nexport async function createFiles(ctx: InitProjectContext) {\n await runStep('Generating project files...', async (spinner) => {\n await Promise.all([\n 'app/app.vue',\n 'public/robots.txt',\n 'public/favicon.ico',\n 'package.json',\n 'tsconfig.json',\n '.gitignore',\n 'README.md',\n ].map(async (file) => {\n spinner.message(`Generating ${chalk.cyan(file)}...`)\n\n const isFavicon = file === 'public/favicon.ico'\n const fetchFn = isFavicon ? fetchBinary : fetchURL\n\n const content = await fetchFn(\n `https://raw.githubusercontent.com/weme-ui/templates/refs/heads/main/project/${file}`,\n )\n\n if (content) {\n const filePath = path.join(ctx.cwd, file)\n const dirname = path.dirname(filePath)\n\n if (!fs.existsSync(dirname))\n fs.mkdirSync(dirname, { recursive: true })\n\n if (isFavicon) {\n const buffer = Buffer.from(content as ArrayBuffer)\n fs.writeFileSync(filePath, buffer, {\n flag: 'w',\n })\n }\n else {\n fs.writeFileSync(\n path.join(ctx.cwd, file),\n content as string,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n )\n }\n }\n }))\n\n spinner.stop('Project files generated!')\n })\n}\n\nexport async function createNuxtConfig(ctx: InitProjectContext) {\n await runStep(`Generating ${chalk.cyan('nuxt.config.ts')}...`, async (spinner) => {\n const lines: string[] = [\n 'export default defineNuxtConfig({',\n ' devtools: {',\n ' enabled: true,',\n ' },',\n ` compatibilityDate: ${JSON.stringify(new Date().toISOString().slice(0, 10))},`,\n '})',\n ]\n\n fs.writeFileSync(\n path.join(ctx.cwd, 'nuxt.config.ts'),\n `${lines.join('\\n')}\\n`,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n )\n\n spinner.stop(`${chalk.cyan('nuxt.config.ts')} generated!`)\n })\n}\n\nexport async function createProjectConfig(ctx: InitProjectContext) {\n return await runStep(`Generating ${chalk.cyan(PROJECT_FILE_NAME)}...`, async (spinner) => {\n const config = projectSchema.safeParse({\n $schema: PROJECT_SCHEMA_URL,\n repos: [\n {\n repo: ctx.repo,\n registry: ctx.registry,\n prefix: ctx.prefix,\n default: true,\n },\n ],\n paths: ctx.paths,\n })\n\n if (!config.success) {\n p.log.error(config.error.message)\n return\n }\n\n fs.writeFileSync(\n path.join(ctx.cwd, PROJECT_FILE_NAME),\n `${JSON.stringify(config.data, null, 2)}\\n`,\n {\n encoding: 'utf8',\n flag: 'w',\n },\n )\n\n spinner.stop(`${chalk.cyan(PROJECT_FILE_NAME)} generated!`)\n\n return config.data\n })\n}\n","import * as p from '@clack/prompts'\nimport chalk from 'chalk'\nimport { runDevPrepare } from '../../../utils/schema/package'\nimport { installRegistryItems } from '../../../utils/schema/project'\nimport { createContext } from './context'\nimport { createFiles, createNuxtConfig, createProjectConfig } from './files'\n\nexport default async function (args: Record<string, any>) {\n p.intro(chalk.bold.blue('✨ Initializing Weme UI Project'))\n\n const ctx = await createContext(args)\n const project = await createProjectConfig(ctx)\n\n if (project) {\n await createFiles(ctx)\n await createNuxtConfig(ctx)\n\n await installRegistryItems(\n ctx.cwd,\n ctx.repo,\n ctx.registry,\n project,\n { type: 'init' },\n )\n\n await runDevPrepare(ctx.cwd)\n }\n else {\n p.log.error('Failed to create project configuration file.')\n }\n\n p.outro('🥤 All done!')\n}\n"],"mappings":"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"}
|