@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.
@@ -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":"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"}
@@ -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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"}