@weme-ui/weme-ui 0.1.5 → 0.2.0

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.
Files changed (46) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +19 -11
  3. package/dist/add-DESSspHh.js +56 -0
  4. package/dist/add-DESSspHh.js.map +1 -0
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.js +58 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/init-DZjeMuf3.js +219 -0
  9. package/dist/init-DZjeMuf3.js.map +1 -0
  10. package/dist/project-BZkWl9YJ.js +685 -0
  11. package/dist/project-BZkWl9YJ.js.map +1 -0
  12. package/package.json +72 -48
  13. package/LICENSE +0 -21
  14. package/dist/add-5ZrkTNC3.mjs +0 -53
  15. package/dist/add-5ZrkTNC3.mjs.map +0 -1
  16. package/dist/build-DAAgZct5.mjs +0 -23
  17. package/dist/build-DAAgZct5.mjs.map +0 -1
  18. package/dist/index.d.mts +0 -1
  19. package/dist/index.mjs +0 -31
  20. package/dist/index.mjs.map +0 -1
  21. package/dist/info-BBRg1Z-t.mjs +0 -41
  22. package/dist/info-BBRg1Z-t.mjs.map +0 -1
  23. package/dist/init-BlbSgl_W.mjs +0 -64
  24. package/dist/init-BlbSgl_W.mjs.map +0 -1
  25. package/dist/manifest-DtYvp2uU.mjs +0 -77
  26. package/dist/manifest-DtYvp2uU.mjs.map +0 -1
  27. package/dist/package-DPYgVv-f.mjs +0 -85
  28. package/dist/package-DPYgVv-f.mjs.map +0 -1
  29. package/dist/project-BpqIQqfR.mjs +0 -361
  30. package/dist/project-BpqIQqfR.mjs.map +0 -1
  31. package/dist/project-COPHBstt.mjs +0 -58
  32. package/dist/project-COPHBstt.mjs.map +0 -1
  33. package/dist/project-kIk5Kz3k.mjs +0 -148
  34. package/dist/project-kIk5Kz3k.mjs.map +0 -1
  35. package/dist/registry-CU5Ejwes.mjs +0 -82
  36. package/dist/registry-CU5Ejwes.mjs.map +0 -1
  37. package/dist/registry-DtG09FVz.mjs +0 -147
  38. package/dist/registry-DtG09FVz.mjs.map +0 -1
  39. package/dist/registry-NSadym2Q.mjs +0 -8
  40. package/dist/registry-NSadym2Q.mjs.map +0 -1
  41. package/dist/registry-bjxXghAl.mjs +0 -355
  42. package/dist/registry-bjxXghAl.mjs.map +0 -1
  43. package/dist/registry-item-B_neG4VO.mjs +0 -143
  44. package/dist/registry-item-B_neG4VO.mjs.map +0 -1
  45. package/dist/verify-CXBxJkzK.mjs +0 -78
  46. package/dist/verify-CXBxJkzK.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-BZkWl9YJ.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 { HashableContent, Prettify, RegistryConfig, RegistryItem, RegistryItemFile } 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))\n 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(item.files.map(\n 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)\n 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)))\n return null\n\n const content = await fs.readFile(join(ensureDir(root), filename), 'utf-8')\n\n if (!content)\n return null\n\n return content\n }\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 }\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 }\n catch (e) {\n console.error(unwrapError(e))\n exit(1)\n }\n finally {\n if (finalizer) {\n await finalizer()\n }\n }\n }\n}\n\ntype RandomColor = 'black' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan' | 'white' | '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","import type { CssVariables, HashableContent, Prettify, ProjectAddedItem, ProjectAddedItemFile, ProjectAddedRegistry, ProjectConfig, ProjectLockFile, ProjectPaths, RegistryItemFileKind } from '../types'\nimport { basename, isAbsolute, join, relative, resolve } from 'node:path/posix'\nimport { LOCKFILE_SCHEMA_URL, ProjectConfigSchema, ProjectLockFileSchema } from '@weme-ui/schema'\nimport { defu } from 'defu'\nimport { hash } from 'hasha'\nimport { addDependency } from 'nypm'\nimport * as v from 'valibot'\nimport { CLI_TMP_DIR, DEFAULT_PATHS, DEFAULT_REGISTRIES, PROJECT_CONFIG_FILENAME, PROJECT_LOCKFILE_FILENAME } 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<ProjectAddedItemMeta & ProjectAddedItemFile & HashableContent>\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 = 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(\n this.joinPath(filePath),\n fileName,\n file.content,\n )\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.map(item => item.dependencies ?? []).flat()\n const devDependencies = items.map(item => item.devDependencies ?? []).flat()\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.map(item => item.cssVars ?? {}).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(addedItem.files.map(\n 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(checkList.map(\n 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 }\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 }\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,11 +1,12 @@
1
1
  {
2
2
  "name": "@weme-ui/weme-ui",
3
3
  "type": "module",
4
- "version": "0.1.5",
5
- "description": "Re-usable UI components with Reka UI and UnoCSS.",
4
+ "version": "0.2.0",
5
+ "packageManager": "bun@1.4.4",
6
+ "description": "A CLI to manage Weme UI projects.",
6
7
  "author": "Allen Luo <luoyi@mouji.net>",
7
8
  "license": "MIT",
8
- "homepage": "https://github.com/weme-ui/weme-ui",
9
+ "homepage": "https://mouji.net/weme-ui",
9
10
  "repository": {
10
11
  "type": "git",
11
12
  "url": "git+https://github.com/weme-ui/weme-ui.git",
@@ -15,68 +16,91 @@
15
16
  "url": "https://github.com/weme-ui/weme-ui/issues"
16
17
  },
17
18
  "keywords": [
18
- "weme-ui",
19
- "reusable",
20
- "ui-components",
21
- "reka-ui",
22
- "unocss"
19
+ "component",
20
+ "registry",
21
+ "typescript",
22
+ "vue",
23
+ "nuxt"
23
24
  ],
24
25
  "sideEffects": false,
25
26
  "exports": {
26
27
  ".": {
27
- "types": "./dist/index.d.mts",
28
- "import": "./dist/index.mjs"
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.js"
29
30
  }
30
31
  },
31
- "main": "./dist/index.mjs",
32
- "module": "./dist/index.mjs",
33
- "types": "./dist/index.d.mts",
32
+ "main": "./dist/index.js",
33
+ "module": "./dist/index.js",
34
+ "types": "./dist/index.d.ts",
34
35
  "typesVersions": {
35
36
  "*": {
36
37
  "*": [
37
38
  "./dist/*",
38
- "./dist/index.d.mts"
39
+ "./dist/index.d.ts"
39
40
  ]
40
41
  }
41
42
  },
42
- "bin": "./dist/index.mjs",
43
+ "bin": {
44
+ "weme-ui": "./dist/index.js"
45
+ },
43
46
  "files": [
44
- "dist",
45
- "package.json"
47
+ "!dist/**/*.map",
48
+ "CHANGELOG.md",
49
+ "dist/**/*"
46
50
  ],
51
+ "publishConfig": {
52
+ "access": "public",
53
+ "provenance": true
54
+ },
55
+ "engines": {
56
+ "node": ">=22.14.0",
57
+ "bun": ">=1.3.12"
58
+ },
59
+ "scripts": {
60
+ "build": "NODE_ENV=deploy tsdown",
61
+ "dev": "NODE_ENV=development tsdown --watch",
62
+ "typecheck": "tsc --noEmit",
63
+ "test": "NODE_ENV=test vitest run",
64
+ "playground": "bun run src/index.ts",
65
+ "prepack": "bun ../../scripts/materialize-catalog.ts"
66
+ },
67
+ "peerDependencies": {
68
+ "nuxt": "^4.0.0",
69
+ "valibot": "^1.5.0",
70
+ "vue": "^3.0.0"
71
+ },
72
+ "peerDependenciesMeta": {
73
+ "nuxt": {
74
+ "optional": true
75
+ },
76
+ "vue": {
77
+ "optional": true
78
+ }
79
+ },
47
80
  "dependencies": {
48
- "@clack/prompts": "^0.11.0",
49
- "chalk": "^5.6.2",
50
- "citty": "^0.1.6",
51
- "columnify": "^1.6.0",
52
- "debug": "^4.4.3",
53
- "handlebars": "^4.7.8",
54
- "make-fetch-happen": "^15.0.3",
55
- "mkdirp": "^3.0.1",
56
- "nypm": "^0.6.2",
57
- "ora": "^9.0.0",
58
- "pathe": "2.0.3",
59
- "pkg-types": "^2.3.0",
60
- "scule": "^1.3.0",
61
- "tinyexec": "^1.0.2",
62
- "tinyglobby": "^0.2.15",
63
- "zod": "^4.1.12",
64
- "@weme-ui/schema": "0.1.5"
81
+ "@weme-ui/schema": "workspace:*",
82
+ "@weme-ui/unocss-preset": "workspace:*",
83
+ "citty": "^0.2.2",
84
+ "defu": "^6.1.7",
85
+ "diff": "^9.0.0",
86
+ "hasha": "^7.0.0",
87
+ "make-fetch-happen": "^16.0.1",
88
+ "nypm": "^0.6.12",
89
+ "ora": "^9.4.1",
90
+ "semver": "^7.8.5",
91
+ "tinyexec": "^1.3.1",
92
+ "tinyglobby": "^0.2.17",
93
+ "ufo": "^1.6.4",
94
+ "valibot": "^1.5.0"
65
95
  },
66
96
  "devDependencies": {
67
- "@types/columnify": "^1.5.4",
68
97
  "@types/make-fetch-happen": "^10.0.4",
69
- "@types/node": "24.0.15",
70
- "bumpp": "^10.3.1",
71
- "tsdown": "^0.16.6",
72
- "typescript": "^5.9.3",
73
- "vitest": "^4.0.13"
74
- },
75
- "scripts": {
76
- "build": "tsdown",
77
- "dev": "tsdown --watch",
78
- "dev:prepare": "pnpm run build",
79
- "test": "vitest",
80
- "typecheck": "tsgo --noEmit"
98
+ "@types/node": "^25.9.1",
99
+ "@types/semver": "^7.8.0",
100
+ "pkg-types": "^2.4.0",
101
+ "tsdown": "^0.22.3",
102
+ "typescript": "6.0.3",
103
+ "unocss": "66.10.5",
104
+ "vitest": "^4.1.8"
81
105
  }
82
- }
106
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 weme-ui.
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,53 +0,0 @@
1
- import { defineCommand } from "citty";
2
- import { cwd } from "node:process";
3
-
4
- //#region src/commands/add/index.ts
5
- /**
6
- * Usage
7
- *
8
- * - **Interactive add items**:
9
- * - ```weme-ui add```
10
- *
11
- * - **Add items from registry**:
12
- * - ```weme-ui add --registry weme-ui/std button```
13
- *
14
- * - **Add items from registry with repo**:
15
- * - ```weme-ui add --registry weme-ui/std --repo https://github.com/weme-ui/weme-ui button```
16
- */
17
- var add_default = defineCommand({
18
- meta: {
19
- name: "add",
20
- description: "Add items to your project from a registry."
21
- },
22
- args: {
23
- names: {
24
- type: "positional",
25
- required: false,
26
- description: "Name(s) of add items. Multiple names can be separated by `comma`."
27
- },
28
- registry: {
29
- type: "string",
30
- description: "Name of the registry.",
31
- valueHint: "STRING"
32
- },
33
- repo: {
34
- type: "string",
35
- description: "Repository of the registry.",
36
- valueHint: "STRING"
37
- },
38
- cwd: {
39
- type: "string",
40
- description: "Change working directory.",
41
- valueHint: "PATH",
42
- default: cwd()
43
- }
44
- },
45
- async setup({ args }) {
46
- if ((args.registry || args.repo) && !args.names) await import("./registry-NSadym2Q.mjs").then((r) => r.default(args));
47
- else await import("./registry-item-B_neG4VO.mjs").then((r) => r.default(args));
48
- }
49
- });
50
-
51
- //#endregion
52
- export { add_default as default };
53
- //# sourceMappingURL=add-5ZrkTNC3.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-5ZrkTNC3.mjs","names":[],"sources":["../src/commands/add/index.ts"],"sourcesContent":["import { cwd } from 'node:process'\nimport { defineCommand } from 'citty'\n\n/**\n * Usage\n *\n * - **Interactive add items**:\n * - ```weme-ui add```\n *\n * - **Add items from registry**:\n * - ```weme-ui add --registry weme-ui/std button```\n *\n * - **Add items from registry with repo**:\n * - ```weme-ui add --registry weme-ui/std --repo https://github.com/weme-ui/weme-ui button```\n */\nexport default defineCommand({\n meta: {\n name: 'add',\n description: 'Add items to your project from a registry.',\n },\n\n args: {\n names: {\n type: 'positional',\n required: false,\n description: 'Name(s) of add items. Multiple names can be separated by `comma`.',\n },\n registry: {\n type: 'string',\n description: 'Name of the registry.',\n valueHint: 'STRING',\n },\n repo: {\n type: 'string',\n description: 'Repository of the registry.',\n valueHint: 'STRING',\n },\n cwd: {\n type: 'string',\n description: 'Change working directory.',\n valueHint: 'PATH',\n default: cwd(),\n },\n },\n\n async setup({ args }) {\n if ((args.registry || args.repo) && !args.names) {\n await import('./registry').then(r => r.default(args))\n }\n else {\n await import('./registry-item').then(r => r.default(args))\n }\n },\n})\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,kBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CAED,MAAM;EACJ,OAAO;GACL,MAAM;GACN,UAAU;GACV,aAAa;GACd;EACD,UAAU;GACR,MAAM;GACN,aAAa;GACb,WAAW;GACZ;EACD,MAAM;GACJ,MAAM;GACN,aAAa;GACb,WAAW;GACZ;EACD,KAAK;GACH,MAAM;GACN,aAAa;GACb,WAAW;GACX,SAAS,KAAK;GACf;EACF;CAED,MAAM,MAAM,EAAE,QAAQ;AACpB,OAAK,KAAK,YAAY,KAAK,SAAS,CAAC,KAAK,MACxC,OAAM,OAAO,2BAAc,MAAK,MAAK,EAAE,QAAQ,KAAK,CAAC;MAGrD,OAAM,OAAO,gCAAmB,MAAK,MAAK,EAAE,QAAQ,KAAK,CAAC;;CAG/D,CAAC"}
@@ -1,23 +0,0 @@
1
- import { defineCommand } from "citty";
2
- import { cwd } from "node:process";
3
-
4
- //#region src/commands/build/index.ts
5
- var build_default = defineCommand({
6
- meta: {
7
- name: "build",
8
- description: "Build your repository."
9
- },
10
- args: { cwd: {
11
- type: "string",
12
- description: "Change working directory.",
13
- valueHint: "PATH",
14
- default: cwd()
15
- } },
16
- async setup({ args }) {
17
- await import("./manifest-DtYvp2uU.mjs").then((r) => r.default(args));
18
- }
19
- });
20
-
21
- //#endregion
22
- export { build_default as default };
23
- //# sourceMappingURL=build-DAAgZct5.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"build-DAAgZct5.mjs","names":[],"sources":["../src/commands/build/index.ts"],"sourcesContent":["import { cwd } from 'node:process'\nimport { defineCommand } from 'citty'\n\nexport default defineCommand({\n meta: {\n name: 'build',\n description: 'Build your repository.',\n },\n\n args: {\n cwd: {\n type: 'string',\n description: 'Change working directory.',\n valueHint: 'PATH',\n default: cwd(),\n },\n },\n\n async setup({ args }) {\n await import('./manifest').then(r => r.default(args))\n },\n})\n"],"mappings":";;;;AAGA,oBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CAED,MAAM,EACJ,KAAK;EACH,MAAM;EACN,aAAa;EACb,WAAW;EACX,SAAS,KAAK;EACf,EACF;CAED,MAAM,MAAM,EAAE,QAAQ;AACpB,QAAM,OAAO,2BAAc,MAAK,MAAK,EAAE,QAAQ,KAAK,CAAC;;CAExD,CAAC"}
package/dist/index.d.mts DELETED
@@ -1 +0,0 @@
1
- export { };
package/dist/index.mjs DELETED
@@ -1,31 +0,0 @@
1
- #!/usr/bin/env node
2
- import { defineCommand, runMain } from "citty";
3
-
4
- //#region package.json
5
- var version = "0.1.5";
6
- var description = "Re-usable UI components with Reka UI and UnoCSS.";
7
-
8
- //#endregion
9
- //#region src/cli.ts
10
- const cli = defineCommand({
11
- meta: {
12
- name: "weme-ui",
13
- version,
14
- description
15
- },
16
- subCommands: {
17
- add: () => import("./add-5ZrkTNC3.mjs").then((r) => r.default),
18
- init: () => import("./init-BlbSgl_W.mjs").then((r) => r.default),
19
- info: () => import("./info-BBRg1Z-t.mjs").then((r) => r.default),
20
- build: () => import("./build-DAAgZct5.mjs").then((r) => r.default),
21
- verify: () => import("./verify-CXBxJkzK.mjs").then((r) => r.default)
22
- }
23
- });
24
-
25
- //#endregion
26
- //#region src/index.ts
27
- runMain(cli);
28
-
29
- //#endregion
30
- export { };
31
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../package.json","../src/cli.ts","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@weme-ui/weme-ui\",\n \"type\": \"module\",\n \"version\": \"0.1.5\",\n \"packageManager\": \"pnpm@10.23.0\",\n \"description\": \"Re-usable UI components with Reka UI and UnoCSS.\",\n \"author\": \"Allen Luo <luoyi@mouji.net>\",\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/weme-ui/weme-ui\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/weme-ui/weme-ui.git\",\n \"directory\": \"packages/cli\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/weme-ui/weme-ui/issues\"\n },\n \"keywords\": [\n \"weme-ui\",\n \"reusable\",\n \"ui-components\",\n \"reka-ui\",\n \"unocss\"\n ],\n \"sideEffects\": false,\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.mts\",\n \"import\": \"./dist/index.mjs\"\n }\n },\n \"main\": \"./dist/index.mjs\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.mts\",\n \"typesVersions\": {\n \"*\": {\n \"*\": [\n \"./dist/*\",\n \"./dist/index.d.mts\"\n ]\n }\n },\n \"bin\": \"./dist/index.mjs\",\n \"files\": [\n \"dist\",\n \"package.json\"\n ],\n \"scripts\": {\n \"build\": \"tsdown\",\n \"dev\": \"tsdown --watch\",\n \"dev:prepare\": \"pnpm run build\",\n \"prepublishOnly\": \"pnpm run build\",\n \"test\": \"vitest\",\n \"typecheck\": \"tsgo --noEmit\"\n },\n \"dependencies\": {\n \"@clack/prompts\": \"catalog:utils\",\n \"@weme-ui/schema\": \"workspace:*\",\n \"chalk\": \"catalog:utils\",\n \"citty\": \"catalog:utils\",\n \"columnify\": \"catalog:utils\",\n \"debug\": \"catalog:utils\",\n \"handlebars\": \"catalog:utils\",\n \"make-fetch-happen\": \"catalog:utils\",\n \"mkdirp\": \"catalog:utils\",\n \"nypm\": \"catalog:utils\",\n \"ora\": \"catalog:utils\",\n \"pathe\": \"catalog:utils\",\n \"pkg-types\": \"catalog:utils\",\n \"scule\": \"catalog:utils\",\n \"tinyexec\": \"catalog:utils\",\n \"tinyglobby\": \"catalog:utils\",\n \"zod\": \"catalog:utils\"\n },\n \"devDependencies\": {\n \"@types/columnify\": \"catalog:utils\",\n \"@types/make-fetch-happen\": \"catalog:utils\",\n \"@types/node\": \"catalog:build\",\n \"bumpp\": \"catalog:build\",\n \"tsdown\": \"catalog:build\",\n \"typescript\": \"catalog:build\",\n \"vitest\": \"catalog:testing\"\n }\n}\n","import { defineCommand } from 'citty'\nimport { description, version } from '../package.json'\n\nexport const cli = defineCommand({\n meta: {\n name: 'weme-ui',\n version,\n description,\n },\n\n subCommands: {\n add: () => import('./commands/add').then(r => r.default),\n init: () => import('./commands/init').then(r => r.default),\n info: () => import('./commands/info').then(r => r.default),\n build: () => import('./commands/build').then(r => r.default),\n verify: () => import('./commands/verify').then(r => r.default),\n },\n})\n","#!/usr/bin/env node\nimport { runMain } from 'citty'\nimport { cli } from './cli'\n\nrunMain(cli)\n"],"mappings":";;;;cAGa;kBAEI;;;;ACFjB,MAAa,MAAM,cAAc;CAC/B,MAAM;EACJ,MAAM;EACN;EACA;EACD;CAED,aAAa;EACX,WAAW,OAAO,sBAAkB,MAAK,MAAK,EAAE,QAAQ;EACxD,YAAY,OAAO,uBAAmB,MAAK,MAAK,EAAE,QAAQ;EAC1D,YAAY,OAAO,uBAAmB,MAAK,MAAK,EAAE,QAAQ;EAC1D,aAAa,OAAO,wBAAoB,MAAK,MAAK,EAAE,QAAQ;EAC5D,cAAc,OAAO,yBAAqB,MAAK,MAAK,EAAE,QAAQ;EAC/D;CACF,CAAC;;;;ACbF,QAAQ,IAAI"}
@@ -1,41 +0,0 @@
1
- import { defineCommand } from "citty";
2
- import { cwd } from "node:process";
3
-
4
- //#region src/commands/info/index.ts
5
- /**
6
- * Usage
7
- *
8
- * - **Get information about current project**:
9
- * - ```weme-ui info```
10
- *
11
- * - **Get information about added registry**:
12
- * - ```weme-ui info weme-ui/std```
13
- */
14
- var info_default = defineCommand({
15
- meta: {
16
- name: "info",
17
- description: "Get information about your project or added registry."
18
- },
19
- args: {
20
- name: {
21
- type: "positional",
22
- required: false,
23
- description: "Name of the registry.",
24
- valueHint: "STRING"
25
- },
26
- cwd: {
27
- type: "string",
28
- description: "Change working directory.",
29
- valueHint: "PATH",
30
- default: cwd()
31
- }
32
- },
33
- async setup({ args }) {
34
- if (args.name) await import("./registry-CU5Ejwes.mjs").then((r) => r.default(args));
35
- else await import("./project-COPHBstt.mjs").then((r) => r.default(args));
36
- }
37
- });
38
-
39
- //#endregion
40
- export { info_default as default };
41
- //# sourceMappingURL=info-BBRg1Z-t.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"info-BBRg1Z-t.mjs","names":[],"sources":["../src/commands/info/index.ts"],"sourcesContent":["import { cwd } from 'node:process'\nimport { defineCommand } from 'citty'\n\n/**\n * Usage\n *\n * - **Get information about current project**:\n * - ```weme-ui info```\n *\n * - **Get information about added registry**:\n * - ```weme-ui info weme-ui/std```\n */\nexport default defineCommand({\n meta: {\n name: 'info',\n description: 'Get information about your project or added registry.',\n },\n\n args: {\n name: {\n type: 'positional',\n required: false,\n description: 'Name of the registry.',\n valueHint: 'STRING',\n },\n cwd: {\n type: 'string',\n description: 'Change working directory.',\n valueHint: 'PATH',\n default: cwd(),\n },\n },\n\n async setup({ args }) {\n if (args.name) {\n await import('./registry').then(r => r.default(args))\n }\n else {\n await import('./project').then(r => r.default(args))\n }\n },\n})\n"],"mappings":";;;;;;;;;;;;;AAYA,mBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CAED,MAAM;EACJ,MAAM;GACJ,MAAM;GACN,UAAU;GACV,aAAa;GACb,WAAW;GACZ;EACD,KAAK;GACH,MAAM;GACN,aAAa;GACb,WAAW;GACX,SAAS,KAAK;GACf;EACF;CAED,MAAM,MAAM,EAAE,QAAQ;AACpB,MAAI,KAAK,KACP,OAAM,OAAO,2BAAc,MAAK,MAAK,EAAE,QAAQ,KAAK,CAAC;MAGrD,OAAM,OAAO,0BAAa,MAAK,MAAK,EAAE,QAAQ,KAAK,CAAC;;CAGzD,CAAC"}
@@ -1,64 +0,0 @@
1
- import { defineCommand } from "citty";
2
- import { cwd } from "node:process";
3
-
4
- //#region src/commands/init/index.ts
5
- /**
6
- * Usage
7
- *
8
- * - **Initialize a new project**:
9
- * - ```weme-ui init```
10
- *
11
- * - **Initialize a new project with default registry**:
12
- * - ```weme-ui init weme-ui/plus --repo https://github.com/weme-ui/weme-ui```
13
- *
14
- * - **Initialize a new registry**:
15
- * - ```weme-ui init weme-ui/plus --registry```
16
- *
17
- * - **Generate component skeleton**:
18
- * - ```weme-ui init button --component```
19
- */
20
- var init_default = defineCommand({
21
- meta: {
22
- name: "init",
23
- description: "Initialize a registry or project with Weme UI."
24
- },
25
- args: {
26
- name: {
27
- type: "positional",
28
- required: false,
29
- description: "Name of the scoped registry. (i.e. `weme-ui/std`)"
30
- },
31
- repo: {
32
- type: "string",
33
- description: "Change repository of the registry.",
34
- valueHint: "STRING"
35
- },
36
- cwd: {
37
- type: "string",
38
- description: "Change working directory.",
39
- valueHint: "PATH",
40
- default: cwd()
41
- },
42
- registry: {
43
- type: "boolean",
44
- description: "Initialize a registry.",
45
- alias: "r",
46
- default: false
47
- },
48
- component: {
49
- type: "boolean",
50
- description: "Generate a component skeleton in your registry.",
51
- alias: "c",
52
- default: false
53
- }
54
- },
55
- async setup({ args }) {
56
- args.cwd = args.cwd || cwd();
57
- if (args.registry) await import("./registry-DtG09FVz.mjs").then((r) => r.default(args));
58
- else await import("./project-kIk5Kz3k.mjs").then((r) => r.default(args));
59
- }
60
- });
61
-
62
- //#endregion
63
- export { init_default as default };
64
- //# sourceMappingURL=init-BlbSgl_W.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init-BlbSgl_W.mjs","names":[],"sources":["../src/commands/init/index.ts"],"sourcesContent":["import { cwd } from 'node:process'\nimport { defineCommand } from 'citty'\n\n/**\n * Usage\n *\n * - **Initialize a new project**:\n * - ```weme-ui init```\n *\n * - **Initialize a new project with default registry**:\n * - ```weme-ui init weme-ui/plus --repo https://github.com/weme-ui/weme-ui```\n *\n * - **Initialize a new registry**:\n * - ```weme-ui init weme-ui/plus --registry```\n *\n * - **Generate component skeleton**:\n * - ```weme-ui init button --component```\n */\nexport default defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize a registry or project with Weme UI.',\n },\n\n args: {\n name: {\n type: 'positional',\n required: false,\n description: 'Name of the scoped registry. (i.e. `weme-ui/std`)',\n },\n repo: {\n type: 'string',\n description: 'Change repository of the registry.',\n valueHint: 'STRING',\n },\n cwd: {\n type: 'string',\n description: 'Change working directory.',\n valueHint: 'PATH',\n default: cwd(),\n },\n registry: {\n type: 'boolean',\n description: 'Initialize a registry.',\n alias: 'r',\n default: false,\n },\n component: {\n type: 'boolean',\n description: 'Generate a component skeleton in your registry.',\n alias: 'c',\n default: false,\n },\n },\n\n async setup({ args }) {\n args.cwd = args.cwd || cwd()\n\n if (args.registry) {\n await import('./registry').then(r => r.default(args))\n }\n else {\n await import('./project').then(r => r.default(args))\n }\n },\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA,mBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CAED,MAAM;EACJ,MAAM;GACJ,MAAM;GACN,UAAU;GACV,aAAa;GACd;EACD,MAAM;GACJ,MAAM;GACN,aAAa;GACb,WAAW;GACZ;EACD,KAAK;GACH,MAAM;GACN,aAAa;GACb,WAAW;GACX,SAAS,KAAK;GACf;EACD,UAAU;GACR,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACV;EACD,WAAW;GACT,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACV;EACF;CAED,MAAM,MAAM,EAAE,QAAQ;AACpB,OAAK,MAAM,KAAK,OAAO,KAAK;AAE5B,MAAI,KAAK,SACP,OAAM,OAAO,2BAAc,MAAK,MAAK,EAAE,QAAQ,KAAK,CAAC;MAGrD,OAAM,OAAO,0BAAa,MAAK,MAAK,EAAE,QAAQ,KAAK,CAAC;;CAGzD,CAAC"}
@@ -1,77 +0,0 @@
1
- import { a as loadRegistryConfig, t as REGISTRY_DIRNAME } from "./registry-bjxXghAl.mjs";
2
- import { n as loadPackageJson } from "./package-DPYgVv-f.mjs";
3
- import * as p from "@clack/prompts";
4
- import chalk from "chalk";
5
- import fs from "node:fs";
6
- import { DEFAULT_REGISTRY_PREFIX, MANIFEST_FILE_NAME, REGISTRY_FILE_NAME, manifestSchema } from "@weme-ui/schema";
7
- import path from "pathe";
8
- import { glob } from "tinyglobby";
9
-
10
- //#region src/commands/build/manifest.ts
11
- async function manifest_default(args) {
12
- p.intro(chalk.bold.blue("✨ Building Weme UI Repository"));
13
- const registries = await loadRegistries(args.cwd);
14
- await updateRegistries(args.cwd, registries);
15
- await updateManifest(args.cwd, registries);
16
- p.outro("🥤 All done!");
17
- }
18
- async function loadRegistries(cwd) {
19
- const spinner = p.spinner();
20
- spinner.start("Loading registries...");
21
- const registries = (await glob([`**/${REGISTRY_FILE_NAME}`], {
22
- cwd: path.resolve(cwd, REGISTRY_DIRNAME),
23
- absolute: false,
24
- onlyFiles: true,
25
- ignore: ["**/node_modules/**"]
26
- })).reduce((acc, file) => {
27
- const directory = path.dirname(file);
28
- const config = loadRegistryConfig(path.resolve(cwd, REGISTRY_DIRNAME, directory));
29
- const pkg = loadPackageJson(path.resolve(cwd, REGISTRY_DIRNAME, directory));
30
- if (config.isOk()) {
31
- const result = manifestSchema.safeParse({
32
- id: config.unwrap().id,
33
- name: config.unwrap().name,
34
- description: config.unwrap().description,
35
- version: pkg.unwrap().version || "0.0.0",
36
- directory: path.join(REGISTRY_DIRNAME, directory),
37
- prefix: config.unwrap().prefix || DEFAULT_REGISTRY_PREFIX,
38
- access: config.unwrap().access || "public",
39
- items: {
40
- components: config.unwrap().items.filter((item) => item.type === "component").length,
41
- layouts: config.unwrap().items.filter((item) => item.type === "layout").length,
42
- themes: config.unwrap().items.filter((item) => item.type === "theme").length,
43
- blocks: config.unwrap().items.filter((item) => item.type === "block").length,
44
- pages: config.unwrap().items.filter((item) => item.type === "page").length
45
- },
46
- updated: (/* @__PURE__ */ new Date()).toISOString()
47
- });
48
- if (result.success) {
49
- spinner.message(`Building ${result.data.name}...`);
50
- acc.push(result.data);
51
- }
52
- }
53
- return acc;
54
- }, []);
55
- spinner.stop("Registries loaded!");
56
- return registries;
57
- }
58
- async function updateRegistries(cwd, registries) {
59
- const spinner = p.spinner();
60
- spinner.start("Updating registries...");
61
- registries.forEach((reg) => {
62
- const registry = loadRegistryConfig(path.resolve(cwd, reg.directory)).unwrap();
63
- registry.version = reg.version;
64
- fs.writeFileSync(path.resolve(cwd, reg.directory, REGISTRY_FILE_NAME), `${JSON.stringify(registry, null, 2)}\n`);
65
- });
66
- spinner.stop("Registries updated!");
67
- }
68
- async function updateManifest(cwd, registries) {
69
- const spinner = p.spinner();
70
- spinner.start("Updating manifest...");
71
- fs.writeFileSync(path.resolve(cwd, REGISTRY_DIRNAME, MANIFEST_FILE_NAME), `${JSON.stringify(registries, null, 2)}\n`);
72
- spinner.stop("Manifest updated!");
73
- }
74
-
75
- //#endregion
76
- export { manifest_default as default };
77
- //# sourceMappingURL=manifest-DtYvp2uU.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest-DtYvp2uU.mjs","names":[],"sources":["../src/commands/build/manifest.ts"],"sourcesContent":["import type { ManifestSchema } from '@weme-ui/schema'\nimport fs from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { DEFAULT_REGISTRY_PREFIX, MANIFEST_FILE_NAME, manifestSchema, REGISTRY_FILE_NAME } from '@weme-ui/schema'\nimport chalk from 'chalk'\nimport path from 'pathe'\nimport { glob } from 'tinyglobby'\nimport { loadPackageJson } from '../../utils/schema/package'\nimport { loadRegistryConfig, REGISTRY_DIRNAME } from '../../utils/schema/registry'\n\nexport default async function (args: Record<string, any>) {\n p.intro(chalk.bold.blue('✨ Building Weme UI Repository'))\n\n const registries = await loadRegistries(args.cwd)\n await updateRegistries(args.cwd, registries)\n await updateManifest(args.cwd, registries)\n\n p.outro('🥤 All done!')\n}\n\nasync function loadRegistries(cwd: string): Promise<ManifestSchema[]> {\n const spinner = p.spinner()\n\n spinner.start('Loading registries...')\n\n const files = await glob([`**/${REGISTRY_FILE_NAME}`], {\n cwd: path.resolve(cwd, REGISTRY_DIRNAME),\n absolute: false,\n onlyFiles: true,\n ignore: ['**/node_modules/**'],\n })\n\n const registries = files.reduce(\n (acc, file) => {\n const directory = path.dirname(file)\n const config = loadRegistryConfig(path.resolve(cwd, REGISTRY_DIRNAME, directory))\n const pkg = loadPackageJson(path.resolve(cwd, REGISTRY_DIRNAME, directory))\n\n if (config.isOk()) {\n const result = manifestSchema.safeParse({\n id: config.unwrap().id,\n name: config.unwrap().name,\n description: config.unwrap().description,\n version: pkg.unwrap().version || '0.0.0',\n directory: path.join(REGISTRY_DIRNAME, directory),\n prefix: config.unwrap().prefix || DEFAULT_REGISTRY_PREFIX,\n access: config.unwrap().access || 'public',\n items: {\n components: config.unwrap().items.filter(item => item.type === 'component').length,\n layouts: config.unwrap().items.filter(item => item.type === 'layout').length,\n themes: config.unwrap().items.filter(item => item.type === 'theme').length,\n blocks: config.unwrap().items.filter(item => item.type === 'block').length,\n pages: config.unwrap().items.filter(item => item.type === 'page').length,\n },\n updated: new Date().toISOString(),\n })\n\n if (result.success) {\n spinner.message(`Building ${result.data.name}...`)\n acc.push(result.data)\n }\n }\n\n return acc\n },\n [] as ManifestSchema[],\n )\n\n spinner.stop('Registries loaded!')\n\n return registries\n}\n\nasync function updateRegistries(cwd: string, registries: ManifestSchema[]) {\n const spinner = p.spinner()\n\n spinner.start('Updating registries...')\n\n registries.forEach((reg) => {\n const registry = loadRegistryConfig(path.resolve(cwd, reg.directory)).unwrap()\n\n registry.version = reg.version\n\n fs.writeFileSync(\n path.resolve(cwd, reg.directory, REGISTRY_FILE_NAME),\n `${JSON.stringify(registry, null, 2)}\\n`,\n )\n })\n\n spinner.stop('Registries updated!')\n}\n\nasync function updateManifest(cwd: string, registries: ManifestSchema[]) {\n const spinner = p.spinner()\n\n spinner.start('Updating manifest...')\n\n fs.writeFileSync(\n path.resolve(cwd, REGISTRY_DIRNAME, MANIFEST_FILE_NAME),\n `${JSON.stringify(registries, null, 2)}\\n`,\n )\n\n spinner.stop('Manifest updated!')\n}\n"],"mappings":";;;;;;;;;;AAUA,gCAA+B,MAA2B;AACxD,GAAE,MAAM,MAAM,KAAK,KAAK,gCAAgC,CAAC;CAEzD,MAAM,aAAa,MAAM,eAAe,KAAK,IAAI;AACjD,OAAM,iBAAiB,KAAK,KAAK,WAAW;AAC5C,OAAM,eAAe,KAAK,KAAK,WAAW;AAE1C,GAAE,MAAM,eAAe;;AAGzB,eAAe,eAAe,KAAwC;CACpE,MAAM,UAAU,EAAE,SAAS;AAE3B,SAAQ,MAAM,wBAAwB;CAStC,MAAM,cAPQ,MAAM,KAAK,CAAC,MAAM,qBAAqB,EAAE;EACrD,KAAK,KAAK,QAAQ,KAAK,iBAAiB;EACxC,UAAU;EACV,WAAW;EACX,QAAQ,CAAC,qBAAqB;EAC/B,CAAC,EAEuB,QACtB,KAAK,SAAS;EACb,MAAM,YAAY,KAAK,QAAQ,KAAK;EACpC,MAAM,SAAS,mBAAmB,KAAK,QAAQ,KAAK,kBAAkB,UAAU,CAAC;EACjF,MAAM,MAAM,gBAAgB,KAAK,QAAQ,KAAK,kBAAkB,UAAU,CAAC;AAE3E,MAAI,OAAO,MAAM,EAAE;GACjB,MAAM,SAAS,eAAe,UAAU;IACtC,IAAI,OAAO,QAAQ,CAAC;IACpB,MAAM,OAAO,QAAQ,CAAC;IACtB,aAAa,OAAO,QAAQ,CAAC;IAC7B,SAAS,IAAI,QAAQ,CAAC,WAAW;IACjC,WAAW,KAAK,KAAK,kBAAkB,UAAU;IACjD,QAAQ,OAAO,QAAQ,CAAC,UAAU;IAClC,QAAQ,OAAO,QAAQ,CAAC,UAAU;IAClC,OAAO;KACL,YAAY,OAAO,QAAQ,CAAC,MAAM,QAAO,SAAQ,KAAK,SAAS,YAAY,CAAC;KAC5E,SAAS,OAAO,QAAQ,CAAC,MAAM,QAAO,SAAQ,KAAK,SAAS,SAAS,CAAC;KACtE,QAAQ,OAAO,QAAQ,CAAC,MAAM,QAAO,SAAQ,KAAK,SAAS,QAAQ,CAAC;KACpE,QAAQ,OAAO,QAAQ,CAAC,MAAM,QAAO,SAAQ,KAAK,SAAS,QAAQ,CAAC;KACpE,OAAO,OAAO,QAAQ,CAAC,MAAM,QAAO,SAAQ,KAAK,SAAS,OAAO,CAAC;KACnE;IACD,0BAAS,IAAI,MAAM,EAAC,aAAa;IAClC,CAAC;AAEF,OAAI,OAAO,SAAS;AAClB,YAAQ,QAAQ,YAAY,OAAO,KAAK,KAAK,KAAK;AAClD,QAAI,KAAK,OAAO,KAAK;;;AAIzB,SAAO;IAET,EAAE,CACH;AAED,SAAQ,KAAK,qBAAqB;AAElC,QAAO;;AAGT,eAAe,iBAAiB,KAAa,YAA8B;CACzE,MAAM,UAAU,EAAE,SAAS;AAE3B,SAAQ,MAAM,yBAAyB;AAEvC,YAAW,SAAS,QAAQ;EAC1B,MAAM,WAAW,mBAAmB,KAAK,QAAQ,KAAK,IAAI,UAAU,CAAC,CAAC,QAAQ;AAE9E,WAAS,UAAU,IAAI;AAEvB,KAAG,cACD,KAAK,QAAQ,KAAK,IAAI,WAAW,mBAAmB,EACpD,GAAG,KAAK,UAAU,UAAU,MAAM,EAAE,CAAC,IACtC;GACD;AAEF,SAAQ,KAAK,sBAAsB;;AAGrC,eAAe,eAAe,KAAa,YAA8B;CACvE,MAAM,UAAU,EAAE,SAAS;AAE3B,SAAQ,MAAM,uBAAuB;AAErC,IAAG,cACD,KAAK,QAAQ,KAAK,kBAAkB,mBAAmB,EACvD,GAAG,KAAK,UAAU,YAAY,MAAM,EAAE,CAAC,IACxC;AAED,SAAQ,KAAK,oBAAoB"}