@weme-ui/weme-ui 0.2.7 → 0.2.9

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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @weme-ui/weme-ui
2
2
 
3
+ ## 0.2.9
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies []:
8
+ - @weme-ui/unocss-preset@0.6.0
9
+
10
+ ## 0.2.8
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies []:
15
+ - @weme-ui/unocss-preset@0.5.1
16
+
3
17
  ## 0.2.7
4
18
 
5
19
  ### Patch Changes
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import { defineCommand, runMain } from "citty";
3
3
 
4
4
  // package.json
5
- var version = "0.2.7";
5
+ var version = "0.2.9";
6
6
  var description = "A CLI to manage Weme UI projects.";
7
7
 
8
8
  // src/constants.ts
@@ -1 +1 @@
1
- {"version":3,"file":"project-DgAuYtns.js","names":[],"sources":["../src/utils/fetcher.ts","../src/utils/registry.ts","../src/utils/utilities.ts","../src/utils/project.ts"],"sourcesContent":["import makeFetch from 'make-fetch-happen'\nimport { CLI_TMP_DIR } from '../constants'\n\nconst fetch = makeFetch.defaults({\n cachePath: CLI_TMP_DIR,\n noProxy: ['raw.githubusercontent.com'],\n})\n\n/**\n * Fetch a URL.\n *\n * @param url - The URL to fetch.\n * @returns The text response.\n */\nexport async function fetchURL(url: string) {\n const res = await fetch(url)\n return res.text()\n}\n\n/**\n * Fetch a JSON file.\n *\n * @param url - The URL to fetch.\n * @returns The JSON response.\n */\nexport async function fetchJSON<T>(url: string) {\n const res = await fetch(url)\n return res.json() as Promise<T>\n}\n","import type {\n HashableContent,\n Prettify,\n RegistryConfig,\n RegistryItem,\n RegistryItemFile,\n} from '../types'\nimport { RegistryConfigSchema } from '@weme-ui/schema'\nimport { hash } from 'hasha'\nimport * as v from 'valibot'\nimport { DEFAULT_REGISTRY_BRANCH } from '../constants'\nimport { fetchJSON, fetchURL } from './fetcher'\n\ninterface RegistryMetadata {\n name: RegistryConfig['name']\n description: RegistryConfig['description']\n version: RegistryConfig['version']\n homepage: RegistryConfig['homepage']\n repository: RegistryConfig['repository']\n issues: RegistryConfig['issues']\n contributors: RegistryConfig['contributors']\n access: RegistryConfig['access']\n}\n\ntype ResolvedRegistryItemFile = Prettify<RegistryItemFile & HashableContent>\n\ninterface RegistryCache {\n config: RegistryConfig\n index: ReadonlyMap<string, RegistryItem>\n}\n\nclass Registry {\n /**\n * The name of the registry.\n */\n private name: string\n /**\n * The branch of the registry.\n */\n private branch: string\n /**\n * The cache of the registry.\n */\n private cache: Promise<RegistryCache> | null = null\n\n constructor(name: string, branch: string) {\n this.name = name\n this.branch = branch\n }\n\n /**\n * Get the registry metadata.\n *\n * @returns The registry metadata.\n */\n async metadata(): Promise<RegistryMetadata> {\n const { config } = await this.load()\n\n return {\n name: config.name,\n description: config.description,\n version: config.version,\n homepage: config.homepage,\n repository: config.repository,\n issues: config.issues,\n contributors: config.contributors,\n access: config.access,\n }\n }\n\n /**\n * Get the registry dependencies.\n *\n * @returns The registry dependencies.\n */\n async dependencies(): Promise<string[]> {\n return (await this.load()).config.dependencies ?? []\n }\n\n /**\n * Get the registry dev dependencies.\n *\n * @returns The registry dev dependencies.\n */\n async devDependencies(): Promise<string[]> {\n return (await this.load()).config.devDependencies ?? []\n }\n\n /**\n * Find the items in the registry.\n *\n * @param filter - The filter function.\n * @returns The items that match the filter.\n */\n async getItems(filter?: (item: RegistryItem) => boolean): Promise<RegistryItem[]> {\n const { config, index } = await this.load()\n\n const items = filter ? config.items.filter(filter) : config.items\n const visited = new Set<string>()\n const result: RegistryItem[] = []\n\n const visit = (item: RegistryItem) => {\n if (visited.has(item.name)) return\n visited.add(item.name)\n\n for (const name of item.registryDependencies ?? []) {\n const dep = index.get(name)\n if (!dep) {\n continue\n }\n visit(dep)\n }\n result.push(item)\n }\n\n items.forEach(visit)\n return result\n }\n\n /**\n * Get the files of an item.\n *\n * @param item - The item to get the files from.\n * @returns The resolved files of the item.\n */\n async getItemFiles(item: RegistryItem): Promise<ResolvedRegistryItemFile[]> {\n return await Promise.all(\n item.files.map(async (file) => {\n const result = await this.getItemFileContent(file.path)\n\n return {\n type: file.type,\n kind: file.kind,\n path: file.path,\n target: file.target,\n content: result.content,\n hash: result.hash,\n }\n }),\n )\n }\n\n /**\n * Get the content of a file.\n *\n * @param source - The source of the file.\n * @returns The content of the file.\n */\n async getItemFileContent(source: string): Promise<HashableContent> {\n const url = this.joinURL(source)\n const content = await fetchURL(url)\n const hashStr = await hash(content)\n\n return {\n content,\n hash: hashStr,\n }\n }\n\n /**\n * Load the registry cache.\n *\n * @throws If the registry cache fails to load.\n * @returns The registry cache.\n */\n private async load(): Promise<RegistryCache> {\n this.cache ??= this.fetchRegistryJson().catch((err) => {\n this.cache = null\n throw err\n })\n return this.cache\n }\n\n /**\n * Fetch the registry JSON.\n *\n * @throws If the registry JSON fails to parse.\n * @returns The registry cache.\n */\n private async fetchRegistryJson(): Promise<RegistryCache> {\n const url = this.joinURL('registry.json')\n const raw = await fetchJSON<unknown>(url)\n const parsed = v.safeParse(RegistryConfigSchema, raw)\n\n if (!parsed.success) {\n throw new Error('Failed to parse registry config', { cause: parsed.issues })\n }\n\n const config = parsed.output\n const index = new Map<string, RegistryItem>()\n for (const item of config.items) {\n if (index.has(item.name)) {\n throw new Error(`Duplicate item name: ${item.name}`)\n }\n index.set(item.name, item)\n }\n\n return { config, index }\n }\n\n /**\n * Join the URL with the name and branch.\n *\n * @param path The path to join.\n * @returns The joined URL.\n */\n private joinURL(path: string): string {\n return `https://raw.githubusercontent.com/${this.name}/refs/heads/${this.branch}/${path}`\n }\n}\n\n/**\n * Use the registry.\n *\n * @param name The name of the registry.\n * @param branch The branch of the registry.\n * @returns The registry instance.\n */\nexport function useRegistry(name: string, branch: string = DEFAULT_REGISTRY_BRANCH): Registry {\n return new Registry(name, branch)\n}\n","import { existsSync, mkdirSync } from 'node:fs'\nimport fs from 'node:fs/promises'\nimport { join, resolve } from 'node:path/posix'\nimport { cwd, exit } from 'node:process'\nimport { parseURL } from 'ufo'\nimport { DEFAULT_REGISTRY_BRANCH, DEFAULT_REGISTRY_NAME } from '../constants'\n\n/**\n * Ensure the working directory.\n *\n * @param path - The working directory to ensure.\n * @returns The ensured working directory. If the directory does not exist, it will be created.\n */\nexport function ensureDir(path: string) {\n if (path === cwd()) {\n return path\n }\n\n const resolved = resolve(path)\n\n if (!existsSync(resolved)) {\n mkdirSync(resolved, { recursive: true })\n }\n\n return resolved\n}\n\n/**\n * Check if a file exists.\n *\n * @param root - The root directory of the project.\n * @param filename - The name of the file.\n * @returns Whether the file exists.\n */\nexport async function existsFile(root: string, filename: string) {\n const filePath = resolve(root, filename)\n const exists = existsSync(filePath)\n\n if (!exists) return false\n\n const content = await fs.readFile(filePath, 'utf-8')\n\n return exists && content !== null && content.trim() !== ''\n}\n\n/**\n * Read a file.\n *\n * @param root - The root directory of the project.\n * @param filename - The name of the file.\n * @returns The content of the file. If the file does not exist, it will return `null`.\n */\nexport async function readFile(root: string, filename: string) {\n try {\n if (!(await existsFile(root, filename))) return null\n\n const content = await fs.readFile(join(ensureDir(root), filename), 'utf-8')\n\n if (!content) return null\n\n return content\n } catch {\n return null\n }\n}\n\n/**\n * Write a file.\n *\n * @param root - The root directory of the project.\n * @param filename - The name of the file.\n * @param content - The content of the file.\n * @returns Whether the file was written successfully.\n */\nexport async function writeFile(root: string, filename: string, content: string) {\n try {\n const path = join(ensureDir(root), filename)\n await fs.writeFile(path, `${content}\\n`, { encoding: 'utf-8', flag: 'w' })\n } catch {\n return false\n }\n\n return true\n}\n\n/**\n * Parse a repository URL.\n *\n * @param url - The URL to parse.\n * @returns The parsed repository URL.\n */\nexport function parseRepoURL(url?: string) {\n if (!url) {\n return {\n name: DEFAULT_REGISTRY_NAME,\n branch: DEFAULT_REGISTRY_BRANCH,\n }\n }\n\n const { host, pathname, hash } = parseURL(url)\n if ((host && host !== 'github.com') || !pathname) {\n throw new Error(`Invalid repository URL: ${url}`)\n }\n\n let branch = hash ? hash.replace(/^#/, '') : DEFAULT_REGISTRY_BRANCH\n let name = removeLeadingSlash(pathname)\n if (name.split('/').length !== 2 && name.includes('/tree/')) {\n branch = name.split('/tree/')[1]\n name = name.split('/tree/')[0]\n }\n\n return {\n name,\n branch,\n }\n}\n\n/**\n * Remove the leading slash from a path.\n *\n * @param path - The path to remove the leading slash from.\n * @returns The path without the leading slash.\n */\nexport function removeLeadingSlash(path: string) {\n return path.replace(/^\\//, '')\n}\n\n/**\n * Remove the trailing slash from a path.\n *\n * @param path - The path to remove the trailing slash from.\n * @returns The path without the trailing slash.\n */\nexport function removeTrailingSlash(path: string) {\n return path.replace(/\\/$/, '')\n}\n\n/**\n * Unwrap an error.\n *\n * @param error - The error to unwrap.\n * @returns The unwrapped error.\n */\nexport function unwrapError(error: unknown) {\n return error instanceof Error ? error.message : 'Unknown error'\n}\n\n/**\n * Call a callback when a condition is met.\n *\n * @param condition - The condition to check.\n * @param callback - The callback to call.\n * @param finalizer - The finalizer to call.\n * @returns Whether the callback was called successfully.\n */\nexport async function callWhen<T>(\n condition: boolean,\n callback: () => Promise<T>,\n finalizer?: () => Promise<void>,\n) {\n if (condition) {\n try {\n await callback()\n } catch (e) {\n console.error(unwrapError(e))\n exit(1)\n } finally {\n if (finalizer) {\n await finalizer()\n }\n }\n }\n}\n\ntype RandomColor =\n | 'black'\n | 'red'\n | 'green'\n | 'yellow'\n | 'blue'\n | 'magenta'\n | 'cyan'\n | 'white'\n | 'gray'\n\n/**\n * Generate a random color.\n *\n * @returns The random color.\n */\nexport function randomColor(): RandomColor {\n const colors: RandomColor[] = [\n 'black',\n 'red',\n 'green',\n 'yellow',\n 'blue',\n 'magenta',\n 'cyan',\n 'white',\n 'gray',\n ]\n return colors[Math.floor(Math.random() * colors.length)]\n}\n","// oxlint-disable no-await-in-loop\nimport type {\n CssVariables,\n HashableContent,\n Prettify,\n ProjectAddedItem,\n ProjectAddedItemFile,\n ProjectAddedRegistry,\n ProjectConfig,\n ProjectLockFile,\n ProjectPaths,\n RegistryItemFileKind,\n} from '../types'\nimport { LOCKFILE_SCHEMA_URL, ProjectConfigSchema, ProjectLockFileSchema } from '@weme-ui/schema'\nimport { defu } from 'defu'\nimport { hash } from 'hasha'\nimport { basename, isAbsolute, join, relative, resolve } from 'node:path/posix'\nimport { addDependency } from 'nypm'\nimport * as v from 'valibot'\nimport {\n CLI_TMP_DIR,\n DEFAULT_PATHS,\n DEFAULT_REGISTRIES,\n PROJECT_CONFIG_FILENAME,\n PROJECT_LOCKFILE_FILENAME,\n} from '../constants'\nimport { useRegistry } from './registry'\nimport { existsFile, readFile, removeLeadingSlash, writeFile } from './utilities'\n\ntype ProjectAddedItemMeta = Pick<ProjectAddedItem, 'type' | 'registry' | 'repo' | 'prefix'>\ntype ResolvedProjectAddedItemFile = Prettify<\n ProjectAddedItemMeta & ProjectAddedItemFile & HashableContent\n>\n\ninterface ProjectInfo {\n root: string\n paths: ProjectPaths\n registries: NonNullable<ProjectConfig['registries']>\n defaultRegistry: ProjectAddedRegistry\n}\n\n/**\n * Project management class.\n *\n * @example\n * ```ts\n * const project = new Project(cwd)\n * ```\n *\n * @param root - The root directory of the project.\n * @returns The project instance.\n */\nexport class Project {\n /**\n * The root directory of the project.\n */\n private root: string\n\n constructor(root: string) {\n this.root = root\n }\n\n /**\n * Get the project info.\n *\n * @returns The project info.\n */\n async info(): Promise<ProjectInfo> {\n const config = (await this.hasProjectConfig()) ? await this.loadProjectConfig() : null\n\n return {\n root: this.root,\n paths: this.resolvePaths(config?.paths),\n registries: config?.registries ?? DEFAULT_REGISTRIES,\n defaultRegistry: config?.registries?.[0] ?? DEFAULT_REGISTRIES[0],\n }\n }\n\n /**\n * Add an item to the project.\n *\n * @param name - The name of the item to add.\n * @returns Whether the item was added.\n */\n async addItem(name: string, kinds: RegistryItemFileKind[] = ['file']): Promise<boolean> {\n if (await this.hasAddedItem(name)) {\n return await this.updateItem(name)\n }\n\n const parsed = await this.parseItemName(name)\n const registry = useRegistry(parsed.registry)\n\n const items = await registry.getItems((item) => item.name === parsed.name)\n if (items.length === 0) {\n throw new Error(`Item ${parsed.name} not found in the registry ${parsed.registry}`)\n }\n\n const { paths, registries, defaultRegistry } = await this.info()\n const itemRegistry =\n registries.find((registry) => registry.registry === parsed.registry) ?? defaultRegistry\n\n // #region Add items\n const addedItems: ProjectAddedItem[] = []\n for (const item of items) {\n const files = await registry.getItemFiles(item)\n const addedItem: ProjectAddedItem = {\n name: item.name,\n type: item.type,\n registry: itemRegistry.registry,\n repo: itemRegistry.repo,\n prefix: itemRegistry.prefix,\n files: [],\n }\n\n for (const file of files) {\n if (!kinds.includes(file.kind)) {\n continue\n }\n\n const fileName = basename(file.path)\n const fileDir = paths[file.type] ?? paths['~']\n\n let filePath = fileDir\n\n if (file.type === 'component') {\n filePath = itemRegistry.prefix\n ? join(fileDir, itemRegistry.prefix, item.name)\n : join(fileDir, item.name)\n }\n\n await writeFile(this.joinPath(filePath), fileName, file.content)\n\n addedItem.files.push({\n kind: file.kind,\n source: file.path,\n dest: join(filePath, fileName),\n })\n }\n\n if (addedItem.files.length > 0) {\n addedItems.push(addedItem)\n }\n }\n\n if (addedItems.length === 0) {\n return false\n }\n\n const lockfile = (await this.loadLockfile()) ?? {\n $schema: LOCKFILE_SCHEMA_URL,\n items: [],\n }\n\n lockfile.items.push(...addedItems)\n\n const written = await writeFile(\n join(this.root, CLI_TMP_DIR),\n PROJECT_LOCKFILE_FILENAME,\n JSON.stringify(lockfile, null, 2),\n )\n // #endregion\n\n // #region Add dependencies\n const dependencies = items.flatMap((item) => item.dependencies ?? [])\n const devDependencies = items.flatMap((item) => item.devDependencies ?? [])\n\n if (dependencies.length > 0) {\n await this.addDependencies(dependencies)\n }\n\n if (devDependencies.length > 0) {\n await this.addDevDependencies(devDependencies)\n }\n // #endregion\n\n // #region Add Css Variables\n const cssVariables = items\n .map((item) => item.cssVars ?? {})\n .reduce((acc, curr) => defu(acc, curr), {})\n if (Object.keys(cssVariables).length > 0) {\n await this.addCssVariables(cssVariables)\n }\n // #endregion\n\n return written\n }\n\n /**\n * Update an added item by name in the project.\n *\n * @param name - The name of the item to update.\n * @returns Whether the item was updated.\n */\n async updateItem(name: string): Promise<boolean> {\n void name\n return false\n }\n\n /**\n * Add css variables to the project.\n *\n * @param cssVariables - The css variables to add.\n * @throws If the project config is not found.\n * @throws If the project config is not writable.\n */\n async addCssVariables(cssVariables: CssVariables): Promise<void> {\n const projectConfig = await this.loadProjectConfig()\n\n if (!projectConfig) {\n throw new Error('Project config not found')\n }\n\n projectConfig.unocss = projectConfig.unocss ?? {}\n projectConfig.unocss.cssVars = defu(projectConfig.unocss.cssVars ?? {}, cssVariables)\n\n await writeFile(this.root, PROJECT_CONFIG_FILENAME, JSON.stringify(projectConfig, null, 2))\n }\n\n /**\n * Check if an item was added to the project.\n *\n * @param name - The name of the item to check.\n * @returns Whether the item was added.\n */\n async hasAddedItem(name: string): Promise<boolean> {\n const lockfile = await this.loadLockfile()\n\n if (lockfile) {\n const parsed = await this.parseItemName(name)\n return lockfile.items.some(\n (item) => item.name === parsed.name && item.registry === parsed.registry,\n )\n }\n\n return false\n }\n\n /**\n * Get the files of an added item.\n *\n * @param itemName - The name of the item to get the files from.\n * @returns The resolved files of the item.\n * @throws If the item is not found in the lockfile.\n * @throws If the file is not found in the project.\n */\n async getAddedItemFiles(itemName: string): Promise<ResolvedProjectAddedItemFile[]> {\n const lockfile = await this.loadLockfile()\n\n if (lockfile) {\n const addedItem = lockfile.items.find((item) => item.name === itemName)\n\n if (!addedItem) {\n throw new Error(`Item ${itemName} not found in the lockfile`)\n }\n\n return await Promise.all(\n addedItem.files.map(async (file) => {\n const result = await this.getAddedItemFileContent(file.dest)\n\n return {\n type: addedItem.type,\n registry: addedItem.registry,\n repo: addedItem.repo,\n prefix: addedItem.prefix,\n kind: file.kind,\n source: file.source,\n dest: file.dest,\n content: result.content,\n hash: result.hash,\n }\n }),\n )\n }\n\n return []\n }\n\n /**\n * Get the content of an added item file by filepath.\n *\n * @param filepath - The filepath of the file.\n * @returns The content of the file.\n * @throws If the file is not found in the project.\n */\n async getAddedItemFileContent(filepath: string): Promise<HashableContent> {\n const content = await readFile(this.root, filepath)\n\n if (!content) {\n throw new Error(`File ${filepath} not found in the project`)\n }\n\n const hashStr = await hash(content)\n\n return {\n content,\n hash: hashStr,\n }\n }\n\n /**\n * Add dependencies to the project.\n *\n * @param dependencies - The dependencies to add.\n */\n async addDependencies(dependencies: string[]): Promise<void> {\n await addDependency(dependencies, {\n cwd: this.root,\n silent: true,\n })\n }\n\n /**\n * Add dev dependencies to the project.\n *\n * @param dependencies - The dev dependencies to add.\n */\n async addDevDependencies(dependencies: string[]): Promise<void> {\n await addDependency(dependencies, {\n cwd: this.root,\n silent: true,\n dev: true,\n })\n }\n\n /**\n * Check if the project is initialized.\n *\n * @returns Whether the project is initialized.\n */\n async isInitialized(): Promise<boolean> {\n const checkList = [\n this.joinPath('uno.config.ts'),\n this.joinPath(PROJECT_CONFIG_FILENAME),\n this.joinPath(CLI_TMP_DIR, PROJECT_LOCKFILE_FILENAME),\n this.joinPath('package.json'),\n this.joinPath(CLI_TMP_DIR, 'uno.config.ts'),\n ]\n\n const progress = await Promise.all(\n checkList.map(async (path) => await existsFile(this.root, path)),\n )\n\n return progress.every(Boolean)\n }\n\n /**\n * Check if the project has a package.json file.\n *\n * @returns Whether the project has a package.json file.\n */\n async hasPackageJson(): Promise<boolean> {\n return await existsFile(this.root, 'package.json')\n }\n\n /**\n * Check if the project has a project config file.\n *\n * @returns Whether the project has a project config file.\n */\n async hasProjectConfig(): Promise<boolean> {\n return await existsFile(this.root, PROJECT_CONFIG_FILENAME)\n }\n\n /**\n * Check if the project has a lockfile.\n *\n * @returns Whether the project has a lockfile.\n */\n async hasLockfile(): Promise<boolean> {\n return await existsFile(this.root, join(CLI_TMP_DIR, PROJECT_LOCKFILE_FILENAME))\n }\n\n /**\n * Check if the project has a uno config file.\n *\n * @returns Whether the project has a uno config file.\n */\n async hasUnoConfig(): Promise<boolean> {\n return await existsFile(this.root, join(CLI_TMP_DIR, 'uno.config.ts'))\n }\n\n /**\n * Load the project config file.\n *\n * @returns The loaded project config if it exists, otherwise null.\n */\n private async loadProjectConfig(): Promise<ProjectConfig | null> {\n const content = await readFile(this.root, PROJECT_CONFIG_FILENAME)\n\n if (content) {\n try {\n const configJson = JSON.parse(content)\n const parsed = v.safeParse(ProjectConfigSchema, configJson)\n\n if (parsed.success) {\n return parsed.output\n }\n\n return null\n } catch {}\n }\n\n return null\n }\n\n /**\n * Load the lockfile.\n *\n * @returns The loaded lockfile if it exists, otherwise null.\n */\n private async loadLockfile(): Promise<ProjectLockFile | null> {\n const content = await readFile(join(this.root, CLI_TMP_DIR), PROJECT_LOCKFILE_FILENAME)\n\n if (content) {\n try {\n const lockfileJson = JSON.parse(content)\n const parsed = v.safeParse(ProjectLockFileSchema, lockfileJson)\n\n if (parsed.success) {\n return parsed.output\n }\n } catch {}\n }\n\n return null\n }\n\n /**\n * Resolve project config paths to locations relative to the project root.\n *\n * @param paths - The paths from project config.\n * @returns The resolved paths.\n */\n private resolvePaths(paths?: Partial<ProjectPaths> | null): ProjectPaths {\n const merged = defu(paths ?? {}, DEFAULT_PATHS)\n const alias = this.toProjectRelative(this.root, merged['~'])\n\n return Object.fromEntries(\n Object.entries(merged).map(([key, value]) => [\n key,\n key === '~'\n ? alias\n : this.toProjectRelative(this.root, this.expandTildeAlias(value, alias)),\n ]),\n ) as ProjectPaths\n }\n\n /**\n * Expand a tilde alias.\n *\n * @param value - The value to expand.\n * @param alias - The alias to expand.\n * @returns The expanded value.\n */\n private expandTildeAlias(value: string, alias: string) {\n if (value === '~') {\n return alias\n }\n\n if (value.startsWith('~/')) {\n const rest = value.slice(2)\n return rest ? join(alias, rest) : alias\n }\n\n return value\n }\n\n /**\n * Convert a path to a project relative path.\n *\n * @param root - The project root directory.\n * @param path - The path to convert.\n * @returns The project relative path.\n */\n private toProjectRelative(root: string, path: string) {\n const abs = isAbsolute(path) ? resolve(path) : resolve(root, path)\n\n if (abs === root || abs.startsWith(`${root}/`)) {\n return relative(root, abs) || '.'\n }\n\n return abs\n }\n\n /**\n * Parse the item name.\n *\n * @param input - The item name to parse, format: `<registry>/<item-name>`.\n * @returns The parsed item name.\n */\n private async parseItemName(input: string): Promise<{ registry: string; name: string }> {\n const s = input.trim().replace(/\\/+$/, '')\n const i = s.lastIndexOf('/')\n\n if (i === -1) {\n return {\n registry: (await this.info()).defaultRegistry.registry,\n name: s,\n }\n }\n return {\n registry: s.slice(0, i),\n name: s.slice(i + 1),\n }\n }\n\n /**\n * Join a path to the workplace directory.\n *\n * @param paths - The paths to join.\n * @returns The joined path.\n */\n private joinPath(...paths: string[]) {\n return join(this.root, ...paths.map(removeLeadingSlash))\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"project-DgAuYtns.js","names":[],"sources":["../src/utils/fetcher.ts","../src/utils/registry.ts","../src/utils/utilities.ts","../src/utils/project.ts"],"sourcesContent":["import makeFetch from 'make-fetch-happen'\nimport { CLI_TMP_DIR } from '../constants'\n\nconst fetch = makeFetch.defaults({\n cachePath: CLI_TMP_DIR,\n noProxy: ['raw.githubusercontent.com'],\n})\n\n/**\n * Fetch a URL.\n *\n * @param url - The URL to fetch.\n * @returns The text response.\n */\nexport async function fetchURL(url: string) {\n const res = await fetch(url)\n return res.text()\n}\n\n/**\n * Fetch a JSON file.\n *\n * @param url - The URL to fetch.\n * @returns The JSON response.\n */\nexport async function fetchJSON<T>(url: string) {\n const res = await fetch(url)\n return res.json() as Promise<T>\n}\n","import type {\n HashableContent,\n Prettify,\n RegistryConfig,\n RegistryItem,\n RegistryItemFile,\n} from '../types'\nimport { RegistryConfigSchema } from '@weme-ui/schema'\nimport { hash } from 'hasha'\nimport * as v from 'valibot'\nimport { DEFAULT_REGISTRY_BRANCH } from '../constants'\nimport { fetchJSON, fetchURL } from './fetcher'\n\ninterface RegistryMetadata {\n name: RegistryConfig['name']\n description: RegistryConfig['description']\n version: RegistryConfig['version']\n homepage: RegistryConfig['homepage']\n repository: RegistryConfig['repository']\n issues: RegistryConfig['issues']\n contributors: RegistryConfig['contributors']\n access: RegistryConfig['access']\n}\n\ntype ResolvedRegistryItemFile = Prettify<RegistryItemFile & HashableContent>\n\ninterface RegistryCache {\n config: RegistryConfig\n index: ReadonlyMap<string, RegistryItem>\n}\n\nclass Registry {\n /**\n * The name of the registry.\n */\n private name: string\n /**\n * The branch of the registry.\n */\n private branch: string\n /**\n * The cache of the registry.\n */\n private cache: Promise<RegistryCache> | null = null\n\n constructor(name: string, branch: string) {\n this.name = name\n this.branch = branch\n }\n\n /**\n * Get the registry metadata.\n *\n * @returns The registry metadata.\n */\n async metadata(): Promise<RegistryMetadata> {\n const { config } = await this.load()\n\n return {\n name: config.name,\n description: config.description,\n version: config.version,\n homepage: config.homepage,\n repository: config.repository,\n issues: config.issues,\n contributors: config.contributors,\n access: config.access,\n }\n }\n\n /**\n * Get the registry dependencies.\n *\n * @returns The registry dependencies.\n */\n async dependencies(): Promise<string[]> {\n return (await this.load()).config.dependencies ?? []\n }\n\n /**\n * Get the registry dev dependencies.\n *\n * @returns The registry dev dependencies.\n */\n async devDependencies(): Promise<string[]> {\n return (await this.load()).config.devDependencies ?? []\n }\n\n /**\n * Find the items in the registry.\n *\n * @param filter - The filter function.\n * @returns The items that match the filter.\n */\n async getItems(filter?: (item: RegistryItem) => boolean): Promise<RegistryItem[]> {\n const { config, index } = await this.load()\n\n const items = filter ? config.items.filter(filter) : config.items\n const visited = new Set<string>()\n const result: RegistryItem[] = []\n\n const visit = (item: RegistryItem) => {\n if (visited.has(item.name)) return\n visited.add(item.name)\n\n for (const name of item.registryDependencies ?? []) {\n const dep = index.get(name)\n if (!dep) {\n continue\n }\n visit(dep)\n }\n result.push(item)\n }\n\n items.forEach(visit)\n return result\n }\n\n /**\n * Get the files of an item.\n *\n * @param item - The item to get the files from.\n * @returns The resolved files of the item.\n */\n async getItemFiles(item: RegistryItem): Promise<ResolvedRegistryItemFile[]> {\n return await Promise.all(\n item.files.map(async (file) => {\n const result = await this.getItemFileContent(file.path)\n\n return {\n type: file.type,\n kind: file.kind,\n path: file.path,\n target: file.target,\n content: result.content,\n hash: result.hash,\n }\n }),\n )\n }\n\n /**\n * Get the content of a file.\n *\n * @param source - The source of the file.\n * @returns The content of the file.\n */\n async getItemFileContent(source: string): Promise<HashableContent> {\n const url = this.joinURL(source)\n const content = await fetchURL(url)\n const hashStr = await hash(content)\n\n return {\n content,\n hash: hashStr,\n }\n }\n\n /**\n * Load the registry cache.\n *\n * @throws If the registry cache fails to load.\n * @returns The registry cache.\n */\n private async load(): Promise<RegistryCache> {\n this.cache ??= this.fetchRegistryJson().catch((err) => {\n this.cache = null\n throw err\n })\n return this.cache\n }\n\n /**\n * Fetch the registry JSON.\n *\n * @throws If the registry JSON fails to parse.\n * @returns The registry cache.\n */\n private async fetchRegistryJson(): Promise<RegistryCache> {\n const url = this.joinURL('registry.json')\n const raw = await fetchJSON<unknown>(url)\n const parsed = v.safeParse(RegistryConfigSchema, raw)\n\n if (!parsed.success) {\n throw new Error('Failed to parse registry config', { cause: parsed.issues })\n }\n\n const config = parsed.output\n const index = new Map<string, RegistryItem>()\n for (const item of config.items) {\n if (index.has(item.name)) {\n throw new Error(`Duplicate item name: ${item.name}`)\n }\n index.set(item.name, item)\n }\n\n return { config, index }\n }\n\n /**\n * Join the URL with the name and branch.\n *\n * @param path The path to join.\n * @returns The joined URL.\n */\n private joinURL(path: string): string {\n return `https://raw.githubusercontent.com/${this.name}/refs/heads/${this.branch}/${path}`\n }\n}\n\n/**\n * Use the registry.\n *\n * @param name The name of the registry.\n * @param branch The branch of the registry.\n * @returns The registry instance.\n */\nexport function useRegistry(name: string, branch: string = DEFAULT_REGISTRY_BRANCH): Registry {\n return new Registry(name, branch)\n}\n","import { existsSync, mkdirSync } from 'node:fs'\nimport fs from 'node:fs/promises'\nimport { join, resolve } from 'node:path/posix'\nimport { cwd, exit } from 'node:process'\nimport { parseURL } from 'ufo'\nimport { DEFAULT_REGISTRY_BRANCH, DEFAULT_REGISTRY_NAME } from '../constants'\n\n/**\n * Ensure the working directory.\n *\n * @param path - The working directory to ensure.\n * @returns The ensured working directory. If the directory does not exist, it will be created.\n */\nexport function ensureDir(path: string) {\n if (path === cwd()) {\n return path\n }\n\n const resolved = resolve(path)\n\n if (!existsSync(resolved)) {\n mkdirSync(resolved, { recursive: true })\n }\n\n return resolved\n}\n\n/**\n * Check if a file exists.\n *\n * @param root - The root directory of the project.\n * @param filename - The name of the file.\n * @returns Whether the file exists.\n */\nexport async function existsFile(root: string, filename: string) {\n const filePath = resolve(root, filename)\n const exists = existsSync(filePath)\n\n if (!exists) return false\n\n const content = await fs.readFile(filePath, 'utf-8')\n\n return exists && content !== null && content.trim() !== ''\n}\n\n/**\n * Read a file.\n *\n * @param root - The root directory of the project.\n * @param filename - The name of the file.\n * @returns The content of the file. If the file does not exist, it will return `null`.\n */\nexport async function readFile(root: string, filename: string) {\n try {\n if (!(await existsFile(root, filename))) return null\n\n const content = await fs.readFile(join(ensureDir(root), filename), 'utf-8')\n\n if (!content) return null\n\n return content\n } catch {\n return null\n }\n}\n\n/**\n * Write a file.\n *\n * @param root - The root directory of the project.\n * @param filename - The name of the file.\n * @param content - The content of the file.\n * @returns Whether the file was written successfully.\n */\nexport async function writeFile(root: string, filename: string, content: string) {\n try {\n const path = join(ensureDir(root), filename)\n await fs.writeFile(path, `${content}\\n`, { encoding: 'utf-8', flag: 'w' })\n } catch {\n return false\n }\n\n return true\n}\n\n/**\n * Parse a repository URL.\n *\n * @param url - The URL to parse.\n * @returns The parsed repository URL.\n */\nexport function parseRepoURL(url?: string) {\n if (!url) {\n return {\n name: DEFAULT_REGISTRY_NAME,\n branch: DEFAULT_REGISTRY_BRANCH,\n }\n }\n\n const { host, pathname, hash } = parseURL(url)\n if ((host && host !== 'github.com') || !pathname) {\n throw new Error(`Invalid repository URL: ${url}`)\n }\n\n let branch = hash ? hash.replace(/^#/, '') : DEFAULT_REGISTRY_BRANCH\n let name = removeLeadingSlash(pathname)\n if (name.split('/').length !== 2 && name.includes('/tree/')) {\n branch = name.split('/tree/')[1]\n name = name.split('/tree/')[0]\n }\n\n return {\n name,\n branch,\n }\n}\n\n/**\n * Remove the leading slash from a path.\n *\n * @param path - The path to remove the leading slash from.\n * @returns The path without the leading slash.\n */\nexport function removeLeadingSlash(path: string) {\n return path.replace(/^\\//, '')\n}\n\n/**\n * Remove the trailing slash from a path.\n *\n * @param path - The path to remove the trailing slash from.\n * @returns The path without the trailing slash.\n */\nexport function removeTrailingSlash(path: string) {\n return path.replace(/\\/$/, '')\n}\n\n/**\n * Unwrap an error.\n *\n * @param error - The error to unwrap.\n * @returns The unwrapped error.\n */\nexport function unwrapError(error: unknown) {\n return error instanceof Error ? error.message : 'Unknown error'\n}\n\n/**\n * Call a callback when a condition is met.\n *\n * @param condition - The condition to check.\n * @param callback - The callback to call.\n * @param finalizer - The finalizer to call.\n * @returns Whether the callback was called successfully.\n */\nexport async function callWhen<T>(\n condition: boolean,\n callback: () => Promise<T>,\n finalizer?: () => Promise<void>,\n) {\n if (condition) {\n try {\n await callback()\n } catch (e) {\n console.error(unwrapError(e))\n exit(1)\n } finally {\n if (finalizer) {\n await finalizer()\n }\n }\n }\n}\n\ntype RandomColor =\n | 'black'\n | 'red'\n | 'green'\n | 'yellow'\n | 'blue'\n | 'magenta'\n | 'cyan'\n | 'white'\n | 'gray'\n\n/**\n * Generate a random color.\n *\n * @returns The random color.\n */\nexport function randomColor(): RandomColor {\n const colors: RandomColor[] = [\n 'black',\n 'red',\n 'green',\n 'yellow',\n 'blue',\n 'magenta',\n 'cyan',\n 'white',\n 'gray',\n ]\n return colors[Math.floor(Math.random() * colors.length)]\n}\n","// oxlint-disable no-await-in-loop\nimport type {\n CssVariables,\n HashableContent,\n Prettify,\n ProjectAddedItem,\n ProjectAddedItemFile,\n ProjectAddedRegistry,\n ProjectConfig,\n ProjectLockFile,\n ProjectPaths,\n RegistryItemFileKind,\n} from '../types'\nimport { LOCKFILE_SCHEMA_URL, ProjectConfigSchema, ProjectLockFileSchema } from '@weme-ui/schema'\nimport { defu } from 'defu'\nimport { hash } from 'hasha'\nimport { basename, isAbsolute, join, relative, resolve } from 'node:path/posix'\nimport { addDependency } from 'nypm'\nimport * as v from 'valibot'\nimport {\n CLI_TMP_DIR,\n DEFAULT_PATHS,\n DEFAULT_REGISTRIES,\n PROJECT_CONFIG_FILENAME,\n PROJECT_LOCKFILE_FILENAME,\n} from '../constants'\nimport { useRegistry } from './registry'\nimport { existsFile, readFile, removeLeadingSlash, writeFile } from './utilities'\n\ntype ProjectAddedItemMeta = Pick<ProjectAddedItem, 'type' | 'registry' | 'repo' | 'prefix'>\ntype ResolvedProjectAddedItemFile = Prettify<\n ProjectAddedItemMeta & ProjectAddedItemFile & HashableContent\n>\n\ninterface ProjectInfo {\n root: string\n paths: ProjectPaths\n registries: NonNullable<ProjectConfig['registries']>\n defaultRegistry: ProjectAddedRegistry\n}\n\n/**\n * Project management class.\n *\n * @example\n * ```ts\n * const project = new Project(cwd)\n * ```\n *\n * @param root - The root directory of the project.\n * @returns The project instance.\n */\nexport class Project {\n /**\n * The root directory of the project.\n */\n private root: string\n\n constructor(root: string) {\n this.root = root\n }\n\n /**\n * Get the project info.\n *\n * @returns The project info.\n */\n async info(): Promise<ProjectInfo> {\n const config = (await this.hasProjectConfig()) ? await this.loadProjectConfig() : null\n\n return {\n root: this.root,\n paths: this.resolvePaths(config?.paths),\n registries: config?.registries ?? DEFAULT_REGISTRIES,\n defaultRegistry: config?.registries?.[0] ?? DEFAULT_REGISTRIES[0],\n }\n }\n\n /**\n * Add an item to the project.\n *\n * @param name - The name of the item to add.\n * @returns Whether the item was added.\n */\n async addItem(name: string, kinds: RegistryItemFileKind[] = ['file']): Promise<boolean> {\n if (await this.hasAddedItem(name)) {\n return await this.updateItem(name)\n }\n\n const parsed = await this.parseItemName(name)\n const registry = useRegistry(parsed.registry)\n\n const items = await registry.getItems((item) => item.name === parsed.name)\n if (items.length === 0) {\n throw new Error(`Item ${parsed.name} not found in the registry ${parsed.registry}`)\n }\n\n const { paths, registries, defaultRegistry } = await this.info()\n const itemRegistry =\n registries.find((registry) => registry.registry === parsed.registry) ?? defaultRegistry\n\n // #region Add items\n const addedItems: ProjectAddedItem[] = []\n for (const item of items) {\n const files = await registry.getItemFiles(item)\n const addedItem: ProjectAddedItem = {\n name: item.name,\n type: item.type,\n registry: itemRegistry.registry,\n repo: itemRegistry.repo,\n prefix: itemRegistry.prefix,\n files: [],\n }\n\n for (const file of files) {\n if (!kinds.includes(file.kind)) {\n continue\n }\n\n const fileName = basename(file.path)\n const fileDir = paths[file.type] ?? paths['~']\n\n let filePath = fileDir\n\n if (file.type === 'component') {\n filePath = itemRegistry.prefix\n ? join(fileDir, itemRegistry.prefix, item.name)\n : join(fileDir, item.name)\n }\n\n await writeFile(this.joinPath(filePath), fileName, file.content)\n\n addedItem.files.push({\n kind: file.kind,\n source: file.path,\n dest: join(filePath, fileName),\n })\n }\n\n if (addedItem.files.length > 0) {\n addedItems.push(addedItem)\n }\n }\n\n if (addedItems.length === 0) {\n return false\n }\n\n const lockfile = (await this.loadLockfile()) ?? {\n $schema: LOCKFILE_SCHEMA_URL,\n items: [],\n }\n\n lockfile.items.push(...addedItems)\n\n const written = await writeFile(\n join(this.root, CLI_TMP_DIR),\n PROJECT_LOCKFILE_FILENAME,\n JSON.stringify(lockfile, null, 2),\n )\n // #endregion\n\n // #region Add dependencies\n const dependencies = items.flatMap((item) => item.dependencies ?? [])\n const devDependencies = items.flatMap((item) => item.devDependencies ?? [])\n\n if (dependencies.length > 0) {\n await this.addDependencies(dependencies)\n }\n\n if (devDependencies.length > 0) {\n await this.addDevDependencies(devDependencies)\n }\n // #endregion\n\n // #region Add Css Variables\n const cssVariables = items\n .map((item) => item.cssVars ?? {})\n .reduce((acc, curr) => defu(acc, curr), {})\n if (Object.keys(cssVariables).length > 0) {\n await this.addCssVariables(cssVariables)\n }\n // #endregion\n\n return written\n }\n\n /**\n * Update an added item by name in the project.\n *\n * @param name - The name of the item to update.\n * @returns Whether the item was updated.\n */\n async updateItem(name: string): Promise<boolean> {\n void name\n return false\n }\n\n /**\n * Add css variables to the project.\n *\n * @param cssVariables - The css variables to add.\n * @throws If the project config is not found.\n * @throws If the project config is not writable.\n */\n async addCssVariables(cssVariables: CssVariables): Promise<void> {\n const projectConfig = await this.loadProjectConfig()\n\n if (!projectConfig) {\n throw new Error('Project config not found')\n }\n\n projectConfig.unocss = projectConfig.unocss ?? {}\n projectConfig.unocss.cssVars = defu(projectConfig.unocss.cssVars ?? {}, cssVariables)\n\n await writeFile(this.root, PROJECT_CONFIG_FILENAME, JSON.stringify(projectConfig, null, 2))\n }\n\n /**\n * Check if an item was added to the project.\n *\n * @param name - The name of the item to check.\n * @returns Whether the item was added.\n */\n async hasAddedItem(name: string): Promise<boolean> {\n const lockfile = await this.loadLockfile()\n\n if (lockfile) {\n const parsed = await this.parseItemName(name)\n return lockfile.items.some(\n (item) => item.name === parsed.name && item.registry === parsed.registry,\n )\n }\n\n return false\n }\n\n /**\n * Get the files of an added item.\n *\n * @param itemName - The name of the item to get the files from.\n * @returns The resolved files of the item.\n * @throws If the item is not found in the lockfile.\n * @throws If the file is not found in the project.\n */\n async getAddedItemFiles(itemName: string): Promise<ResolvedProjectAddedItemFile[]> {\n const lockfile = await this.loadLockfile()\n\n if (lockfile) {\n const addedItem = lockfile.items.find((item) => item.name === itemName)\n\n if (!addedItem) {\n throw new Error(`Item ${itemName} not found in the lockfile`)\n }\n\n return await Promise.all(\n addedItem.files.map(async (file) => {\n const result = await this.getAddedItemFileContent(file.dest)\n\n return {\n type: addedItem.type,\n registry: addedItem.registry,\n repo: addedItem.repo,\n prefix: addedItem.prefix,\n kind: file.kind,\n source: file.source,\n dest: file.dest,\n content: result.content,\n hash: result.hash,\n }\n }),\n )\n }\n\n return []\n }\n\n /**\n * Get the content of an added item file by filepath.\n *\n * @param filepath - The filepath of the file.\n * @returns The content of the file.\n * @throws If the file is not found in the project.\n */\n async getAddedItemFileContent(filepath: string): Promise<HashableContent> {\n const content = await readFile(this.root, filepath)\n\n if (!content) {\n throw new Error(`File ${filepath} not found in the project`)\n }\n\n const hashStr = await hash(content)\n\n return {\n content,\n hash: hashStr,\n }\n }\n\n /**\n * Add dependencies to the project.\n *\n * @param dependencies - The dependencies to add.\n */\n async addDependencies(dependencies: string[]): Promise<void> {\n await addDependency(dependencies, {\n cwd: this.root,\n silent: true,\n })\n }\n\n /**\n * Add dev dependencies to the project.\n *\n * @param dependencies - The dev dependencies to add.\n */\n async addDevDependencies(dependencies: string[]): Promise<void> {\n await addDependency(dependencies, {\n cwd: this.root,\n silent: true,\n dev: true,\n })\n }\n\n /**\n * Check if the project is initialized.\n *\n * @returns Whether the project is initialized.\n */\n async isInitialized(): Promise<boolean> {\n const checkList = [\n this.joinPath('uno.config.ts'),\n this.joinPath(PROJECT_CONFIG_FILENAME),\n this.joinPath(CLI_TMP_DIR, PROJECT_LOCKFILE_FILENAME),\n this.joinPath('package.json'),\n this.joinPath(CLI_TMP_DIR, 'uno.config.ts'),\n ]\n\n const progress = await Promise.all(\n checkList.map(async (path) => await existsFile(this.root, path)),\n )\n\n return progress.every(Boolean)\n }\n\n /**\n * Check if the project has a package.json file.\n *\n * @returns Whether the project has a package.json file.\n */\n async hasPackageJson(): Promise<boolean> {\n return await existsFile(this.root, 'package.json')\n }\n\n /**\n * Check if the project has a project config file.\n *\n * @returns Whether the project has a project config file.\n */\n async hasProjectConfig(): Promise<boolean> {\n return await existsFile(this.root, PROJECT_CONFIG_FILENAME)\n }\n\n /**\n * Check if the project has a lockfile.\n *\n * @returns Whether the project has a lockfile.\n */\n async hasLockfile(): Promise<boolean> {\n return await existsFile(this.root, join(CLI_TMP_DIR, PROJECT_LOCKFILE_FILENAME))\n }\n\n /**\n * Check if the project has a uno config file.\n *\n * @returns Whether the project has a uno config file.\n */\n async hasUnoConfig(): Promise<boolean> {\n return await existsFile(this.root, join(CLI_TMP_DIR, 'uno.config.ts'))\n }\n\n /**\n * Load the project config file.\n *\n * @returns The loaded project config if it exists, otherwise null.\n */\n private async loadProjectConfig(): Promise<ProjectConfig | null> {\n const content = await readFile(this.root, PROJECT_CONFIG_FILENAME)\n\n if (content) {\n try {\n const configJson = JSON.parse(content)\n const parsed = v.safeParse(ProjectConfigSchema, configJson)\n\n if (parsed.success) {\n return parsed.output\n }\n\n return null\n } catch {}\n }\n\n return null\n }\n\n /**\n * Load the lockfile.\n *\n * @returns The loaded lockfile if it exists, otherwise null.\n */\n private async loadLockfile(): Promise<ProjectLockFile | null> {\n const content = await readFile(join(this.root, CLI_TMP_DIR), PROJECT_LOCKFILE_FILENAME)\n\n if (content) {\n try {\n const lockfileJson = JSON.parse(content)\n const parsed = v.safeParse(ProjectLockFileSchema, lockfileJson)\n\n if (parsed.success) {\n return parsed.output\n }\n } catch {}\n }\n\n return null\n }\n\n /**\n * Resolve project config paths to locations relative to the project root.\n *\n * @param paths - The paths from project config.\n * @returns The resolved paths.\n */\n private resolvePaths(paths?: Partial<ProjectPaths> | null): ProjectPaths {\n const merged = defu(paths ?? {}, DEFAULT_PATHS)\n const alias = this.toProjectRelative(this.root, merged['~'])\n\n return Object.fromEntries(\n Object.entries(merged).map(([key, value]) => [\n key,\n key === '~'\n ? alias\n : this.toProjectRelative(this.root, this.expandTildeAlias(value, alias)),\n ]),\n ) as ProjectPaths\n }\n\n /**\n * Expand a tilde alias.\n *\n * @param value - The value to expand.\n * @param alias - The alias to expand.\n * @returns The expanded value.\n */\n private expandTildeAlias(value: string, alias: string) {\n if (value === '~') {\n return alias\n }\n\n if (value.startsWith('~/')) {\n const rest = value.slice(2)\n return rest ? join(alias, rest) : alias\n }\n\n return value\n }\n\n /**\n * Convert a path to a project relative path.\n *\n * @param root - The project root directory.\n * @param path - The path to convert.\n * @returns The project relative path.\n */\n private toProjectRelative(root: string, path: string) {\n const abs = isAbsolute(path) ? resolve(path) : resolve(root, path)\n\n if (abs === root || abs.startsWith(`${root}/`)) {\n return relative(root, abs) || '.'\n }\n\n return abs\n }\n\n /**\n * Parse the item name.\n *\n * @param input - The item name to parse, format: `<registry>/<item-name>`.\n * @returns The parsed item name.\n */\n private async parseItemName(input: string): Promise<{ registry: string; name: string }> {\n const s = input.trim().replace(/\\/+$/, '')\n const i = s.lastIndexOf('/')\n\n if (i === -1) {\n return {\n registry: (await this.info()).defaultRegistry.registry,\n name: s,\n }\n }\n return {\n registry: s.slice(0, i),\n name: s.slice(i + 1),\n }\n }\n\n /**\n * Join a path to the workplace directory.\n *\n * @param paths - The paths to join.\n * @returns The joined path.\n */\n private joinPath(...paths: string[]) {\n return join(this.root, ...paths.map(removeLeadingSlash))\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weme-ui/weme-ui",
3
- "version": "0.2.7",
3
+ "version": "0.2.9",
4
4
  "description": "A CLI to manage Weme UI projects.",
5
5
  "keywords": [
6
6
  "component",
@@ -9,7 +9,7 @@
9
9
  "typescript",
10
10
  "vue"
11
11
  ],
12
- "homepage": "https://mouji.net/weme-ui",
12
+ "homepage": "https://github.com/weme-ui/weme-ui",
13
13
  "bugs": {
14
14
  "url": "https://github.com/weme-ui/weme-ui/issues"
15
15
  },
@@ -54,14 +54,14 @@
54
54
  "scripts": {
55
55
  "build": "NODE_ENV=deploy tsdown",
56
56
  "dev": "NODE_ENV=development tsdown --watch",
57
- "typecheck": "tsc --noEmit",
57
+ "typecheck": "tsc6 --noEmit",
58
58
  "test": "NODE_ENV=test vitest run",
59
59
  "playground": "bun run src/index.ts",
60
60
  "prepack": "bun ../../scripts/materialize-catalog.ts"
61
61
  },
62
62
  "dependencies": {
63
63
  "@weme-ui/schema": "^5.0.1",
64
- "@weme-ui/unocss-preset": "^0.5.0",
64
+ "@weme-ui/unocss-preset": "^0.6.0",
65
65
  "citty": "^0.2.2",
66
66
  "defu": "^6.1.7",
67
67
  "diff": "^9.0.0",
@@ -79,9 +79,9 @@
79
79
  "@types/make-fetch-happen": "^10.0.4",
80
80
  "@types/node": "^25.9.1",
81
81
  "@types/semver": "^7.8.0",
82
+ "@typescript/typescript6": "^6.0.2",
82
83
  "pkg-types": "^2.4.0",
83
- "tsdown": "^0.22.3",
84
- "typescript": "6.0.3",
84
+ "tsdown": "^0.23.7",
85
85
  "unocss": "^66.12.0",
86
86
  "vitest": "^4.1.8"
87
87
  },