@tutti-os/ui-system 0.0.7 → 0.0.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/AGENTS.md +3 -3
- package/README.md +11 -11
- package/agent/install-skill.mjs +8 -8
- package/agent/{nextop-ui-system → tutti-ui-system}/SKILL.md +4 -4
- package/agent/{nextop-ui-system → tutti-ui-system}/scripts/create-business-preview.mjs +8 -8
- package/dist/{chunk-GX3U3V36.js → chunk-K57FUMQG.js} +11 -11
- package/dist/chunk-K57FUMQG.js.map +1 -0
- package/dist/{chunk-XHA7R2WC.js → chunk-RKQ4FPGY.js} +4 -4
- package/dist/chunk-RKQ4FPGY.js.map +1 -0
- package/dist/{chunk-QXXI5OBT.js → chunk-YIAY5DKS.js} +2 -2
- package/dist/chunk-YIAY5DKS.js.map +1 -0
- package/dist/components/index.js +1 -1
- package/dist/date-format.d.ts +5 -5
- package/dist/date-format.js +7 -7
- package/dist/dev-vite.d.ts +3 -3
- package/dist/dev-vite.js +6 -6
- package/dist/dev-vite.js.map +1 -1
- package/dist/icons/index.d.ts +2 -2
- package/dist/icons/index.js +3 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.js +11 -11
- package/dist/metadata/components.json +5 -5
- package/dist/metadata/components.schema.json +2 -2
- package/dist/metadata/index.js +5 -5
- package/dist/metadata/index.js.map +1 -1
- package/dist/styles/base.css +5 -5
- package/package.json +3 -3
- package/ui-system.md +18 -18
- package/dist/chunk-GX3U3V36.js.map +0 -1
- package/dist/chunk-QXXI5OBT.js.map +0 -1
- package/dist/chunk-XHA7R2WC.js.map +0 -1
- /package/agent/{nextop-ui-system → tutti-ui-system}/references/extract-base-component.md +0 -0
- /package/agent/{nextop-ui-system → tutti-ui-system}/references/maintain-inventory.md +0 -0
- /package/agent/{nextop-ui-system → tutti-ui-system}/references/promote-business-component.md +0 -0
- /package/agent/{nextop-ui-system → tutti-ui-system}/references/use-existing-component.md +0 -0
package/dist/dev-vite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/vite.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport {\n lstat,\n mkdir,\n readdir,\n readFile,\n realpath,\n rm,\n writeFile\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { Plugin, ViteDevServer } from \"vite\";\nimport { WebSocket } from \"ws\";\n\nimport type {\n UISystemDevEvent,\n UISystemDevFile,\n UISystemDevManifest\n} from \"../dev-server/protocol.js\";\n\nexport type NextopUISystemDevOptions = {\n serverUrl?: string;\n cacheDir?: string;\n};\n\nconst defaultServerUrl = \"http://127.0.0.1:4100\";\nconst defaultCacheDir = \".nextop-ui-system-dev\";\nconst cacheMarkerFileName = \".nextop-ui-system-dev-cache\";\nconst packageName = \"@tutti-os/ui-system\";\nconst packageRequire = createRequire(import.meta.url);\nconst stableEntrypoints = [\n \".\",\n \"./components\",\n \"./icons\",\n \"./styles.css\",\n \"./utils\"\n] as const;\nconst packageDependencyAliases = [\n \"class-variance-authority\",\n \"clsx\",\n \"radix-ui\",\n \"react-resizable-panels\",\n \"tailwind-merge\"\n] as const;\nconst packageStyleDependencyAliases = [\"tw-animate-css\"] as const;\nconst packageDependencyAliasSet = new Set<string>(packageDependencyAliases);\nconst packageStyleDependencyAliasSet = new Set<string>(\n packageStyleDependencyAliases\n);\n\ntype StableEntrypoint = (typeof stableEntrypoints)[number];\ntype DevSyncState = {\n cacheRoot: string;\n realCacheRoot: string;\n serverUrl: URL;\n};\n\nexport function nextopUISystemDev(\n options: NextopUISystemDevOptions = {}\n): Plugin {\n const serverUrl = normalizeServerUrl(options.serverUrl ?? defaultServerUrl);\n const cacheDir = options.cacheDir ?? defaultCacheDir;\n let syncState: DevSyncState | null = null;\n\n return {\n name: \"nextop-ui-system-dev\",\n async config(config, env) {\n if (env.command !== \"serve\") {\n syncState = null;\n return {};\n }\n\n if (!(await probeHealth(serverUrl))) {\n syncState = null;\n return {};\n }\n\n const projectRoot = path.resolve(config.root ?? process.cwd());\n const cacheState = await prepareCacheRoot(projectRoot, cacheDir);\n const manifest = await fetchJson<UISystemDevManifest>(\n serverUrl,\n \"/manifest\"\n );\n\n validateManifest(manifest);\n await syncFiles(serverUrl, cacheState);\n await fetchComponentsMetadata(serverUrl);\n syncState = { ...cacheState, serverUrl };\n\n return {\n resolve: {\n alias: stableEntrypoints\n .map((entrypoint) => ({\n find: entrypointAlias(entrypoint),\n replacement: path.join(\n cacheState.cacheRoot,\n manifest.entrypoints[entrypoint]\n )\n }))\n .concat(\n packageStyleDependencyAliases.map((dependencyName) => ({\n find: dependencyAlias(dependencyName),\n replacement: dependencyName,\n customResolver: (\n _source: string,\n importer: string | undefined\n ) =>\n isCacheImporter(syncState, importer)\n ? resolvePackageStyleDependency(dependencyName)\n : null\n }))\n )\n }\n };\n },\n async resolveId(source, importer) {\n if (syncState === null || !isCacheImporter(syncState, importer)) {\n return null;\n }\n\n if (packageDependencyAliasSet.has(source)) {\n return packageRequire.resolve(source);\n }\n\n if (packageStyleDependencyAliasSet.has(source)) {\n const resolved = await this.resolve(source, packageContextImporter(), {\n skipSelf: true\n });\n\n return resolved?.id ?? null;\n }\n\n return null;\n },\n configureServer(server) {\n if (syncState === null) {\n return;\n }\n\n subscribeToEvents(server, syncState);\n }\n };\n}\n\nasync function probeHealth(serverUrl: URL): Promise<boolean> {\n try {\n const response = await fetch(new URL(\"/health\", serverUrl));\n\n if (!response.ok) {\n return false;\n }\n\n const payload = (await response.json()) as { packageName?: unknown };\n\n return payload.packageName === packageName;\n } catch {\n return false;\n }\n}\n\nasync function syncFiles(\n serverUrl: URL,\n cacheState: Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">\n): Promise<void> {\n const files = await fetchJson<UISystemDevFile[]>(serverUrl, \"/files\");\n\n if (!Array.isArray(files)) {\n throw new Error(\n \"@tutti-os/ui-system dev server returned invalid files list\"\n );\n }\n\n const syncPaths = new Set<string>();\n\n await Promise.all(\n files.map(async (file) => {\n validateSyncFile(file);\n syncPaths.add(file.path);\n\n const destination = resolveCacheFile(cacheState.cacheRoot, file.path);\n await prepareCacheFileTarget(cacheState, destination);\n\n const currentHash = await readCachedHash(destination);\n\n if (currentHash === file.hash) {\n return;\n }\n\n const bytes = await fetchFile(serverUrl, file.path);\n const downloadedHash = hashBytes(bytes);\n\n if (downloadedHash !== file.hash) {\n throw new Error(\n `Hash mismatch while syncing @tutti-os/ui-system file: ${file.path}`\n );\n }\n\n await writeFile(destination, bytes);\n })\n );\n\n await removeStaleCacheFiles(cacheState, syncPaths);\n}\n\nasync function syncChangedFile(\n server: ViteDevServer,\n state: DevSyncState,\n event: Extract<UISystemDevEvent, { type: \"fileChanged\" }>\n): Promise<void> {\n validateEventPath(event.path);\n\n const destination = resolveCacheFile(state.cacheRoot, event.path);\n await prepareCacheFileTarget(state, destination);\n\n const bytes = await fetchFile(state.serverUrl, event.path);\n const downloadedHash = hashBytes(bytes);\n\n if (downloadedHash !== event.hash) {\n throw new Error(\n `Hash mismatch while syncing @tutti-os/ui-system file: ${event.path}`\n );\n }\n\n await writeFile(destination, bytes);\n invalidateFile(server, destination);\n}\n\nasync function removeDeletedFile(\n server: ViteDevServer,\n state: DevSyncState,\n event: Extract<UISystemDevEvent, { type: \"fileDeleted\" }>\n): Promise<void> {\n validateEventPath(event.path);\n\n const destination = resolveCacheFile(state.cacheRoot, event.path);\n\n invalidateFile(server, destination);\n await removeCacheFile(state, destination);\n}\n\nfunction subscribeToEvents(server: ViteDevServer, state: DevSyncState): void {\n let closed = false;\n let reconnectTimer: NodeJS.Timeout | null = null;\n let websocket: WebSocket | null = null;\n\n const close = (): void => {\n closed = true;\n\n if (reconnectTimer !== null) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n\n websocket?.close();\n websocket = null;\n };\n\n const reconnect = (): void => {\n if (closed || reconnectTimer !== null) {\n return;\n }\n\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n connect();\n }, 1000);\n };\n\n const connect = (): void => {\n if (closed) {\n return;\n }\n\n websocket = new WebSocket(eventUrl(state.serverUrl));\n\n websocket.on(\"message\", (message) => {\n void handleEventMessage(server, state, message).catch(() => {\n // Event sync is best-effort; the initial HTTP sync remains authoritative.\n });\n });\n\n websocket.on(\"close\", reconnect);\n websocket.on(\"error\", () => {\n websocket?.close();\n });\n };\n\n connect();\n server.httpServer?.once(\"close\", close);\n}\n\nasync function handleEventMessage(\n server: ViteDevServer,\n state: DevSyncState,\n message: WebSocket.RawData\n): Promise<void> {\n const event = parseEvent(message);\n\n if (event === null) {\n return;\n }\n\n if (event.type === \"fileChanged\") {\n await syncChangedFile(server, state, event);\n return;\n }\n\n if (event.type === \"fileDeleted\") {\n await removeDeletedFile(server, state, event);\n }\n}\n\nfunction parseEvent(message: WebSocket.RawData): UISystemDevEvent | null {\n try {\n const event = JSON.parse(rawMessageToString(message)) as UISystemDevEvent;\n\n if (!isDevEvent(event)) {\n return null;\n }\n\n return event;\n } catch {\n return null;\n }\n}\n\nfunction rawMessageToString(message: WebSocket.RawData): string {\n if (Buffer.isBuffer(message)) {\n return message.toString(\"utf8\");\n }\n\n if (Array.isArray(message)) {\n return Buffer.concat(message).toString(\"utf8\");\n }\n\n return Buffer.from(message).toString(\"utf8\");\n}\n\nfunction isDevEvent(event: UISystemDevEvent): event is UISystemDevEvent {\n if (event === null || typeof event !== \"object\") {\n return false;\n }\n\n if (event.type === \"fileChanged\") {\n return typeof event.path === \"string\" && typeof event.hash === \"string\";\n }\n\n if (event.type === \"fileDeleted\") {\n return typeof event.path === \"string\";\n }\n\n return event.type === \"manifestChanged\" || event.type === \"componentsChanged\";\n}\n\nfunction invalidateFile(server: ViteDevServer, filePath: string): void {\n const modules = server.moduleGraph.getModulesByFile(filePath);\n\n if (modules === undefined) {\n return;\n }\n\n for (const moduleNode of modules) {\n server.moduleGraph.invalidateModule(moduleNode);\n }\n}\n\nasync function fetchComponentsMetadata(serverUrl: URL): Promise<void> {\n try {\n await fetchJson<unknown>(serverUrl, \"/components\");\n } catch {\n // Component diagnostics are best-effort; source sync and aliases are sufficient.\n }\n}\n\nasync function fetchJson<T>(serverUrl: URL, endpoint: string): Promise<T> {\n const response = await fetch(new URL(endpoint, serverUrl));\n\n if (!response.ok) {\n throw new Error(\n `@tutti-os/ui-system dev server ${endpoint} failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T;\n}\n\nasync function fetchFile(serverUrl: URL, syncPath: string): Promise<Buffer> {\n const response = await fetch(\n new URL(`/files/${encodeSyncPath(syncPath)}`, serverUrl)\n );\n\n if (!response.ok) {\n throw new Error(\n `@tutti-os/ui-system dev server file fetch failed for ${syncPath}`\n );\n }\n\n return Buffer.from(await response.arrayBuffer());\n}\n\nasync function readCachedHash(filePath: string): Promise<string | null> {\n try {\n return hashBytes(await readFile(filePath));\n } catch {\n return null;\n }\n}\n\nfunction validateManifest(\n manifest: UISystemDevManifest\n): asserts manifest is UISystemDevManifest & {\n entrypoints: Record<StableEntrypoint, string>;\n} {\n if (\n manifest === null ||\n typeof manifest !== \"object\" ||\n manifest.packageName !== packageName ||\n typeof manifest.entrypoints !== \"object\" ||\n manifest.entrypoints === null\n ) {\n throw new Error(\"@tutti-os/ui-system dev server returned invalid manifest\");\n }\n\n for (const entrypoint of stableEntrypoints) {\n const syncPath = manifest.entrypoints[entrypoint];\n\n if (typeof syncPath !== \"string\" || normalizeSyncPath(syncPath) === null) {\n throw new Error(\n `@tutti-os/ui-system dev server manifest is missing ${entrypoint}`\n );\n }\n }\n}\n\nfunction validateSyncFile(file: UISystemDevFile): void {\n if (\n file === null ||\n typeof file !== \"object\" ||\n typeof file.path !== \"string\" ||\n typeof file.hash !== \"string\" ||\n typeof file.size !== \"number\" ||\n normalizeSyncPath(file.path) === null\n ) {\n throw new Error(\n \"@tutti-os/ui-system dev server returned invalid file entry\"\n );\n }\n}\n\nfunction validateEventPath(syncPath: string): void {\n if (normalizeSyncPath(syncPath) === null) {\n throw new Error(\n `Refusing unsafe @tutti-os/ui-system event path: ${syncPath}`\n );\n }\n}\n\nasync function prepareCacheRoot(\n projectRoot: string,\n cacheDir: string\n): Promise<Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">> {\n const cacheRoot = resolveCacheRoot(projectRoot, cacheDir);\n\n await ensureNoSymlinkAncestors(projectRoot, path.dirname(cacheRoot));\n await mkdir(cacheRoot, { recursive: true });\n await ensureNoSymlinkAncestors(projectRoot, cacheRoot);\n\n const cacheStat = await lstat(cacheRoot);\n\n if (!cacheStat.isDirectory() || cacheStat.isSymbolicLink()) {\n throw new Error(\n \"@tutti-os/ui-system dev cacheDir must be a real directory\"\n );\n }\n\n const realProjectRoot = await realpath(projectRoot);\n const realCacheRoot = await realpath(cacheRoot);\n\n if (!isPathInside(realProjectRoot, realCacheRoot)) {\n throw new Error(\n \"@tutti-os/ui-system dev cacheDir must resolve inside the Vite project root\"\n );\n }\n\n await ensureOwnedCacheRoot(cacheRoot);\n\n return { cacheRoot, realCacheRoot };\n}\n\nfunction resolveCacheRoot(projectRoot: string, cacheDir: string): string {\n const cacheRoot = path.resolve(projectRoot, cacheDir);\n const relative = path.relative(projectRoot, cacheRoot);\n\n if (\n relative === \"\" ||\n relative.startsWith(\"..\") ||\n path.isAbsolute(relative)\n ) {\n throw new Error(\n \"@tutti-os/ui-system dev cacheDir must resolve inside the Vite project root\"\n );\n }\n\n return cacheRoot;\n}\n\nasync function prepareCacheFileTarget(\n cacheState: Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">,\n destination: string\n): Promise<void> {\n const parent = path.dirname(destination);\n\n await ensureNoSymlinkAncestors(cacheState.cacheRoot, parent);\n await mkdir(parent, { recursive: true });\n await ensureNoSymlinkAncestors(cacheState.cacheRoot, parent);\n\n const realParent = await realpath(parent);\n\n if (!isPathInside(cacheState.realCacheRoot, realParent)) {\n throw new Error(\n \"@tutti-os/ui-system dev cache file resolved outside cacheDir\"\n );\n }\n\n await rejectExistingSymlink(destination);\n}\n\nasync function removeCacheFile(\n cacheState: Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">,\n destination: string\n): Promise<void> {\n const parent = path.dirname(destination);\n\n await ensureNoSymlinkAncestors(cacheState.cacheRoot, parent);\n\n const realParent = await realpath(parent).catch(() => null);\n\n if (\n realParent === null ||\n !isPathInside(cacheState.realCacheRoot, realParent)\n ) {\n throw new Error(\n \"@tutti-os/ui-system dev cache file resolved outside cacheDir\"\n );\n }\n\n await rejectExistingSymlink(destination);\n await rm(destination, { force: true });\n}\n\nasync function removeStaleCacheFiles(\n cacheState: Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">,\n authoritativePaths: Set<string>\n): Promise<void> {\n await ensureOwnedCacheRoot(cacheState.cacheRoot);\n\n const cachedFiles = await listCacheFiles(cacheState.cacheRoot);\n\n await Promise.all(\n cachedFiles.map(async (cachedFile) => {\n if (authoritativePaths.has(cachedFile)) {\n return;\n }\n\n await removeCacheFile(\n cacheState,\n resolveCacheFile(cacheState.cacheRoot, cachedFile)\n );\n })\n );\n}\n\nasync function listCacheFiles(\n directory: string,\n prefix = \"\"\n): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const paths = await Promise.all(\n entries.map(async (entry) => {\n const syncPath = prefix === \"\" ? entry.name : `${prefix}/${entry.name}`;\n const absolutePath = path.join(directory, entry.name);\n\n if (syncPath === cacheMarkerFileName) {\n return [];\n }\n\n if (entry.isSymbolicLink()) {\n throw new Error(\n `Refusing symlink in @tutti-os/ui-system dev cache: ${syncPath}`\n );\n }\n\n if (entry.isDirectory()) {\n return listCacheFiles(absolutePath, syncPath);\n }\n\n return entry.isFile() ? [syncPath] : [];\n })\n );\n\n return paths.flat();\n}\n\nasync function ensureOwnedCacheRoot(cacheRoot: string): Promise<void> {\n const markerPath = path.join(cacheRoot, cacheMarkerFileName);\n\n try {\n const markerStat = await lstat(markerPath);\n\n if (markerStat.isSymbolicLink() || !markerStat.isFile()) {\n throw new Error(\n \"@tutti-os/ui-system dev cacheDir contains an unsafe ownership marker\"\n );\n }\n\n return;\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n\n const entries = await readdir(cacheRoot);\n\n if (entries.length > 0) {\n throw new Error(\n \"@tutti-os/ui-system dev cacheDir must be empty or contain a Nextop UI cache marker before stale cleanup\"\n );\n }\n\n await writeFile(\n markerPath,\n JSON.stringify({ packageName, cache: \"ui-system-dev\" }, null, 2)\n );\n}\n\nfunction resolveCacheFile(cacheRoot: string, syncPath: string): string {\n const normalized = normalizeSyncPath(syncPath);\n\n if (normalized === null) {\n throw new Error(\n `Refusing to sync unsafe @tutti-os/ui-system path: ${syncPath}`\n );\n }\n\n const destination = path.resolve(cacheRoot, normalized);\n const relative = path.relative(cacheRoot, destination);\n\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Refusing to sync @tutti-os/ui-system path: ${syncPath}`);\n }\n\n return destination;\n}\n\nasync function ensureNoSymlinkAncestors(\n root: string,\n target: string\n): Promise<void> {\n const relative = path.relative(root, target);\n\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(\"@tutti-os/ui-system dev cache path escaped cacheDir\");\n }\n\n const segments = relative === \"\" ? [] : relative.split(path.sep);\n let current = root;\n\n for (const segment of segments) {\n current = path.join(current, segment);\n\n try {\n const stat = await lstat(current);\n\n if (stat.isSymbolicLink()) {\n throw new Error(\n `Refusing symlink in @tutti-os/ui-system dev cache path: ${current}`\n );\n }\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return;\n }\n\n throw error;\n }\n }\n}\n\nasync function rejectExistingSymlink(filePath: string): Promise<void> {\n try {\n const stat = await lstat(filePath);\n\n if (stat.isSymbolicLink() || !stat.isFile()) {\n throw new Error(\n `Refusing unsafe @tutti-os/ui-system cache file: ${filePath}`\n );\n }\n } catch (error) {\n if (isNotFoundError(error)) {\n return;\n }\n\n throw error;\n }\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction isPathInside(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n\n return (\n relative === \"\" ||\n (!relative.startsWith(\"..\") && !path.isAbsolute(relative))\n );\n}\n\nfunction normalizeSyncPath(input: string): string | null {\n if (input.includes(\"\\0\")) {\n return null;\n }\n\n const slashPath = input.replaceAll(\"\\\\\", \"/\").replace(/^\\/+/, \"\");\n const normalized = path.posix.normalize(slashPath);\n\n if (\n normalized === \".\" ||\n normalized.startsWith(\"../\") ||\n normalized.split(\"/\").includes(\"..\")\n ) {\n return null;\n }\n\n return normalized;\n}\n\nfunction encodeSyncPath(syncPath: string): string {\n return syncPath.split(\"/\").map(encodeURIComponent).join(\"/\");\n}\n\nfunction hashBytes(bytes: Buffer): string {\n return `sha256:${createHash(\"sha256\").update(bytes).digest(\"hex\")}`;\n}\n\nfunction normalizeServerUrl(serverUrl: string): URL {\n return new URL(serverUrl);\n}\n\nfunction eventUrl(serverUrl: URL): string {\n const url = new URL(\"/events\", serverUrl);\n\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n\n return url.href;\n}\n\nfunction entrypointAlias(entrypoint: StableEntrypoint): RegExp {\n const specifier =\n entrypoint === \".\" ? packageName : `${packageName}${entrypoint.slice(1)}`;\n\n return new RegExp(`^${escapeRegExp(specifier)}$`);\n}\n\nfunction isCacheImporter(\n state: DevSyncState | null,\n importer: string | undefined\n): boolean {\n if (state === null || importer === undefined) {\n return false;\n }\n\n const importerPath = stripViteIdQuery(importer);\n\n if (!path.isAbsolute(importerPath)) {\n return false;\n }\n\n return isPathInside(state.cacheRoot, path.resolve(importerPath));\n}\n\nfunction stripViteIdQuery(id: string): string {\n const [pathWithoutQuery = \"\"] = id.split(\"?\", 1);\n\n return pathWithoutQuery;\n}\n\nfunction packageContextImporter(): string {\n return fileURLToPath(new URL(\"../styles/index.css\", import.meta.url));\n}\n\nfunction resolvePackageStyleDependency(dependencyName: string): string {\n const packageDirectory = findDependencyPackageDirectory(dependencyName);\n const manifest = JSON.parse(\n readFileSync(path.join(packageDirectory, \"package.json\"), \"utf8\")\n ) as {\n exports?: {\n \".\"?: {\n style?: unknown;\n };\n };\n };\n const styleExport = manifest.exports?.[\".\"]?.style;\n\n if (typeof styleExport !== \"string\") {\n throw new Error(`${dependencyName} does not expose a style export`);\n }\n\n return path.join(packageDirectory, styleExport);\n}\n\nfunction findDependencyPackageDirectory(dependencyName: string): string {\n const searchPaths = packageRequire.resolve.paths(dependencyName) ?? [];\n\n for (const searchPath of searchPaths) {\n const packageDirectory = path.join(searchPath, dependencyName);\n\n try {\n const manifest = JSON.parse(\n readFileSync(path.join(packageDirectory, \"package.json\"), \"utf8\")\n ) as { name?: unknown };\n\n if (manifest.name === dependencyName) {\n return packageDirectory;\n }\n } catch {\n // Try the next Node resolution search path.\n }\n }\n\n throw new Error(`Could not resolve ${dependencyName} from ${packageName}`);\n}\n\nfunction dependencyAlias(dependencyName: string): RegExp {\n return new RegExp(`^${escapeRegExp(dependencyName)}$`);\n}\n\nfunction escapeRegExp(input: string): string {\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/plugins/vite.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport {\n lstat,\n mkdir,\n readdir,\n readFile,\n realpath,\n rm,\n writeFile\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { Plugin, ViteDevServer } from \"vite\";\nimport { WebSocket } from \"ws\";\n\nimport type {\n UISystemDevEvent,\n UISystemDevFile,\n UISystemDevManifest\n} from \"../dev-server/protocol.js\";\n\nexport type TuttiUISystemDevOptions = {\n serverUrl?: string;\n cacheDir?: string;\n};\n\nconst defaultServerUrl = \"http://127.0.0.1:4100\";\nconst defaultCacheDir = \".tutti-ui-system-dev\";\nconst cacheMarkerFileName = \".tutti-ui-system-dev-cache\";\nconst packageName = \"@tutti-os/ui-system\";\nconst packageRequire = createRequire(import.meta.url);\nconst stableEntrypoints = [\n \".\",\n \"./components\",\n \"./icons\",\n \"./styles.css\",\n \"./utils\"\n] as const;\nconst packageDependencyAliases = [\n \"class-variance-authority\",\n \"clsx\",\n \"radix-ui\",\n \"react-resizable-panels\",\n \"tailwind-merge\"\n] as const;\nconst packageStyleDependencyAliases = [\"tw-animate-css\"] as const;\nconst packageDependencyAliasSet = new Set<string>(packageDependencyAliases);\nconst packageStyleDependencyAliasSet = new Set<string>(\n packageStyleDependencyAliases\n);\n\ntype StableEntrypoint = (typeof stableEntrypoints)[number];\ntype DevSyncState = {\n cacheRoot: string;\n realCacheRoot: string;\n serverUrl: URL;\n};\n\nexport function tuttiUISystemDev(\n options: TuttiUISystemDevOptions = {}\n): Plugin {\n const serverUrl = normalizeServerUrl(options.serverUrl ?? defaultServerUrl);\n const cacheDir = options.cacheDir ?? defaultCacheDir;\n let syncState: DevSyncState | null = null;\n\n return {\n name: \"tutti-ui-system-dev\",\n async config(config, env) {\n if (env.command !== \"serve\") {\n syncState = null;\n return {};\n }\n\n if (!(await probeHealth(serverUrl))) {\n syncState = null;\n return {};\n }\n\n const projectRoot = path.resolve(config.root ?? process.cwd());\n const cacheState = await prepareCacheRoot(projectRoot, cacheDir);\n const manifest = await fetchJson<UISystemDevManifest>(\n serverUrl,\n \"/manifest\"\n );\n\n validateManifest(manifest);\n await syncFiles(serverUrl, cacheState);\n await fetchComponentsMetadata(serverUrl);\n syncState = { ...cacheState, serverUrl };\n\n return {\n resolve: {\n alias: stableEntrypoints\n .map((entrypoint) => ({\n find: entrypointAlias(entrypoint),\n replacement: path.join(\n cacheState.cacheRoot,\n manifest.entrypoints[entrypoint]\n )\n }))\n .concat(\n packageStyleDependencyAliases.map((dependencyName) => ({\n find: dependencyAlias(dependencyName),\n replacement: dependencyName,\n customResolver: (\n _source: string,\n importer: string | undefined\n ) =>\n isCacheImporter(syncState, importer)\n ? resolvePackageStyleDependency(dependencyName)\n : null\n }))\n )\n }\n };\n },\n async resolveId(source, importer) {\n if (syncState === null || !isCacheImporter(syncState, importer)) {\n return null;\n }\n\n if (packageDependencyAliasSet.has(source)) {\n return packageRequire.resolve(source);\n }\n\n if (packageStyleDependencyAliasSet.has(source)) {\n const resolved = await this.resolve(source, packageContextImporter(), {\n skipSelf: true\n });\n\n return resolved?.id ?? null;\n }\n\n return null;\n },\n configureServer(server) {\n if (syncState === null) {\n return;\n }\n\n subscribeToEvents(server, syncState);\n }\n };\n}\n\nasync function probeHealth(serverUrl: URL): Promise<boolean> {\n try {\n const response = await fetch(new URL(\"/health\", serverUrl));\n\n if (!response.ok) {\n return false;\n }\n\n const payload = (await response.json()) as { packageName?: unknown };\n\n return payload.packageName === packageName;\n } catch {\n return false;\n }\n}\n\nasync function syncFiles(\n serverUrl: URL,\n cacheState: Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">\n): Promise<void> {\n const files = await fetchJson<UISystemDevFile[]>(serverUrl, \"/files\");\n\n if (!Array.isArray(files)) {\n throw new Error(\n \"@tutti-os/ui-system dev server returned invalid files list\"\n );\n }\n\n const syncPaths = new Set<string>();\n\n await Promise.all(\n files.map(async (file) => {\n validateSyncFile(file);\n syncPaths.add(file.path);\n\n const destination = resolveCacheFile(cacheState.cacheRoot, file.path);\n await prepareCacheFileTarget(cacheState, destination);\n\n const currentHash = await readCachedHash(destination);\n\n if (currentHash === file.hash) {\n return;\n }\n\n const bytes = await fetchFile(serverUrl, file.path);\n const downloadedHash = hashBytes(bytes);\n\n if (downloadedHash !== file.hash) {\n throw new Error(\n `Hash mismatch while syncing @tutti-os/ui-system file: ${file.path}`\n );\n }\n\n await writeFile(destination, bytes);\n })\n );\n\n await removeStaleCacheFiles(cacheState, syncPaths);\n}\n\nasync function syncChangedFile(\n server: ViteDevServer,\n state: DevSyncState,\n event: Extract<UISystemDevEvent, { type: \"fileChanged\" }>\n): Promise<void> {\n validateEventPath(event.path);\n\n const destination = resolveCacheFile(state.cacheRoot, event.path);\n await prepareCacheFileTarget(state, destination);\n\n const bytes = await fetchFile(state.serverUrl, event.path);\n const downloadedHash = hashBytes(bytes);\n\n if (downloadedHash !== event.hash) {\n throw new Error(\n `Hash mismatch while syncing @tutti-os/ui-system file: ${event.path}`\n );\n }\n\n await writeFile(destination, bytes);\n invalidateFile(server, destination);\n}\n\nasync function removeDeletedFile(\n server: ViteDevServer,\n state: DevSyncState,\n event: Extract<UISystemDevEvent, { type: \"fileDeleted\" }>\n): Promise<void> {\n validateEventPath(event.path);\n\n const destination = resolveCacheFile(state.cacheRoot, event.path);\n\n invalidateFile(server, destination);\n await removeCacheFile(state, destination);\n}\n\nfunction subscribeToEvents(server: ViteDevServer, state: DevSyncState): void {\n let closed = false;\n let reconnectTimer: NodeJS.Timeout | null = null;\n let websocket: WebSocket | null = null;\n\n const close = (): void => {\n closed = true;\n\n if (reconnectTimer !== null) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n\n websocket?.close();\n websocket = null;\n };\n\n const reconnect = (): void => {\n if (closed || reconnectTimer !== null) {\n return;\n }\n\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n connect();\n }, 1000);\n };\n\n const connect = (): void => {\n if (closed) {\n return;\n }\n\n websocket = new WebSocket(eventUrl(state.serverUrl));\n\n websocket.on(\"message\", (message) => {\n void handleEventMessage(server, state, message).catch(() => {\n // Event sync is best-effort; the initial HTTP sync remains authoritative.\n });\n });\n\n websocket.on(\"close\", reconnect);\n websocket.on(\"error\", () => {\n websocket?.close();\n });\n };\n\n connect();\n server.httpServer?.once(\"close\", close);\n}\n\nasync function handleEventMessage(\n server: ViteDevServer,\n state: DevSyncState,\n message: WebSocket.RawData\n): Promise<void> {\n const event = parseEvent(message);\n\n if (event === null) {\n return;\n }\n\n if (event.type === \"fileChanged\") {\n await syncChangedFile(server, state, event);\n return;\n }\n\n if (event.type === \"fileDeleted\") {\n await removeDeletedFile(server, state, event);\n }\n}\n\nfunction parseEvent(message: WebSocket.RawData): UISystemDevEvent | null {\n try {\n const event = JSON.parse(rawMessageToString(message)) as UISystemDevEvent;\n\n if (!isDevEvent(event)) {\n return null;\n }\n\n return event;\n } catch {\n return null;\n }\n}\n\nfunction rawMessageToString(message: WebSocket.RawData): string {\n if (Buffer.isBuffer(message)) {\n return message.toString(\"utf8\");\n }\n\n if (Array.isArray(message)) {\n return Buffer.concat(message).toString(\"utf8\");\n }\n\n return Buffer.from(message).toString(\"utf8\");\n}\n\nfunction isDevEvent(event: UISystemDevEvent): event is UISystemDevEvent {\n if (event === null || typeof event !== \"object\") {\n return false;\n }\n\n if (event.type === \"fileChanged\") {\n return typeof event.path === \"string\" && typeof event.hash === \"string\";\n }\n\n if (event.type === \"fileDeleted\") {\n return typeof event.path === \"string\";\n }\n\n return event.type === \"manifestChanged\" || event.type === \"componentsChanged\";\n}\n\nfunction invalidateFile(server: ViteDevServer, filePath: string): void {\n const modules = server.moduleGraph.getModulesByFile(filePath);\n\n if (modules === undefined) {\n return;\n }\n\n for (const moduleNode of modules) {\n server.moduleGraph.invalidateModule(moduleNode);\n }\n}\n\nasync function fetchComponentsMetadata(serverUrl: URL): Promise<void> {\n try {\n await fetchJson<unknown>(serverUrl, \"/components\");\n } catch {\n // Component diagnostics are best-effort; source sync and aliases are sufficient.\n }\n}\n\nasync function fetchJson<T>(serverUrl: URL, endpoint: string): Promise<T> {\n const response = await fetch(new URL(endpoint, serverUrl));\n\n if (!response.ok) {\n throw new Error(\n `@tutti-os/ui-system dev server ${endpoint} failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T;\n}\n\nasync function fetchFile(serverUrl: URL, syncPath: string): Promise<Buffer> {\n const response = await fetch(\n new URL(`/files/${encodeSyncPath(syncPath)}`, serverUrl)\n );\n\n if (!response.ok) {\n throw new Error(\n `@tutti-os/ui-system dev server file fetch failed for ${syncPath}`\n );\n }\n\n return Buffer.from(await response.arrayBuffer());\n}\n\nasync function readCachedHash(filePath: string): Promise<string | null> {\n try {\n return hashBytes(await readFile(filePath));\n } catch {\n return null;\n }\n}\n\nfunction validateManifest(\n manifest: UISystemDevManifest\n): asserts manifest is UISystemDevManifest & {\n entrypoints: Record<StableEntrypoint, string>;\n} {\n if (\n manifest === null ||\n typeof manifest !== \"object\" ||\n manifest.packageName !== packageName ||\n typeof manifest.entrypoints !== \"object\" ||\n manifest.entrypoints === null\n ) {\n throw new Error(\"@tutti-os/ui-system dev server returned invalid manifest\");\n }\n\n for (const entrypoint of stableEntrypoints) {\n const syncPath = manifest.entrypoints[entrypoint];\n\n if (typeof syncPath !== \"string\" || normalizeSyncPath(syncPath) === null) {\n throw new Error(\n `@tutti-os/ui-system dev server manifest is missing ${entrypoint}`\n );\n }\n }\n}\n\nfunction validateSyncFile(file: UISystemDevFile): void {\n if (\n file === null ||\n typeof file !== \"object\" ||\n typeof file.path !== \"string\" ||\n typeof file.hash !== \"string\" ||\n typeof file.size !== \"number\" ||\n normalizeSyncPath(file.path) === null\n ) {\n throw new Error(\n \"@tutti-os/ui-system dev server returned invalid file entry\"\n );\n }\n}\n\nfunction validateEventPath(syncPath: string): void {\n if (normalizeSyncPath(syncPath) === null) {\n throw new Error(\n `Refusing unsafe @tutti-os/ui-system event path: ${syncPath}`\n );\n }\n}\n\nasync function prepareCacheRoot(\n projectRoot: string,\n cacheDir: string\n): Promise<Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">> {\n const cacheRoot = resolveCacheRoot(projectRoot, cacheDir);\n\n await ensureNoSymlinkAncestors(projectRoot, path.dirname(cacheRoot));\n await mkdir(cacheRoot, { recursive: true });\n await ensureNoSymlinkAncestors(projectRoot, cacheRoot);\n\n const cacheStat = await lstat(cacheRoot);\n\n if (!cacheStat.isDirectory() || cacheStat.isSymbolicLink()) {\n throw new Error(\n \"@tutti-os/ui-system dev cacheDir must be a real directory\"\n );\n }\n\n const realProjectRoot = await realpath(projectRoot);\n const realCacheRoot = await realpath(cacheRoot);\n\n if (!isPathInside(realProjectRoot, realCacheRoot)) {\n throw new Error(\n \"@tutti-os/ui-system dev cacheDir must resolve inside the Vite project root\"\n );\n }\n\n await ensureOwnedCacheRoot(cacheRoot);\n\n return { cacheRoot, realCacheRoot };\n}\n\nfunction resolveCacheRoot(projectRoot: string, cacheDir: string): string {\n const cacheRoot = path.resolve(projectRoot, cacheDir);\n const relative = path.relative(projectRoot, cacheRoot);\n\n if (\n relative === \"\" ||\n relative.startsWith(\"..\") ||\n path.isAbsolute(relative)\n ) {\n throw new Error(\n \"@tutti-os/ui-system dev cacheDir must resolve inside the Vite project root\"\n );\n }\n\n return cacheRoot;\n}\n\nasync function prepareCacheFileTarget(\n cacheState: Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">,\n destination: string\n): Promise<void> {\n const parent = path.dirname(destination);\n\n await ensureNoSymlinkAncestors(cacheState.cacheRoot, parent);\n await mkdir(parent, { recursive: true });\n await ensureNoSymlinkAncestors(cacheState.cacheRoot, parent);\n\n const realParent = await realpath(parent);\n\n if (!isPathInside(cacheState.realCacheRoot, realParent)) {\n throw new Error(\n \"@tutti-os/ui-system dev cache file resolved outside cacheDir\"\n );\n }\n\n await rejectExistingSymlink(destination);\n}\n\nasync function removeCacheFile(\n cacheState: Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">,\n destination: string\n): Promise<void> {\n const parent = path.dirname(destination);\n\n await ensureNoSymlinkAncestors(cacheState.cacheRoot, parent);\n\n const realParent = await realpath(parent).catch(() => null);\n\n if (\n realParent === null ||\n !isPathInside(cacheState.realCacheRoot, realParent)\n ) {\n throw new Error(\n \"@tutti-os/ui-system dev cache file resolved outside cacheDir\"\n );\n }\n\n await rejectExistingSymlink(destination);\n await rm(destination, { force: true });\n}\n\nasync function removeStaleCacheFiles(\n cacheState: Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">,\n authoritativePaths: Set<string>\n): Promise<void> {\n await ensureOwnedCacheRoot(cacheState.cacheRoot);\n\n const cachedFiles = await listCacheFiles(cacheState.cacheRoot);\n\n await Promise.all(\n cachedFiles.map(async (cachedFile) => {\n if (authoritativePaths.has(cachedFile)) {\n return;\n }\n\n await removeCacheFile(\n cacheState,\n resolveCacheFile(cacheState.cacheRoot, cachedFile)\n );\n })\n );\n}\n\nasync function listCacheFiles(\n directory: string,\n prefix = \"\"\n): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const paths = await Promise.all(\n entries.map(async (entry) => {\n const syncPath = prefix === \"\" ? entry.name : `${prefix}/${entry.name}`;\n const absolutePath = path.join(directory, entry.name);\n\n if (syncPath === cacheMarkerFileName) {\n return [];\n }\n\n if (entry.isSymbolicLink()) {\n throw new Error(\n `Refusing symlink in @tutti-os/ui-system dev cache: ${syncPath}`\n );\n }\n\n if (entry.isDirectory()) {\n return listCacheFiles(absolutePath, syncPath);\n }\n\n return entry.isFile() ? [syncPath] : [];\n })\n );\n\n return paths.flat();\n}\n\nasync function ensureOwnedCacheRoot(cacheRoot: string): Promise<void> {\n const markerPath = path.join(cacheRoot, cacheMarkerFileName);\n\n try {\n const markerStat = await lstat(markerPath);\n\n if (markerStat.isSymbolicLink() || !markerStat.isFile()) {\n throw new Error(\n \"@tutti-os/ui-system dev cacheDir contains an unsafe ownership marker\"\n );\n }\n\n return;\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n\n const entries = await readdir(cacheRoot);\n\n if (entries.length > 0) {\n throw new Error(\n \"@tutti-os/ui-system dev cacheDir must be empty or contain a Tutti UI cache marker before stale cleanup\"\n );\n }\n\n await writeFile(\n markerPath,\n JSON.stringify({ packageName, cache: \"ui-system-dev\" }, null, 2)\n );\n}\n\nfunction resolveCacheFile(cacheRoot: string, syncPath: string): string {\n const normalized = normalizeSyncPath(syncPath);\n\n if (normalized === null) {\n throw new Error(\n `Refusing to sync unsafe @tutti-os/ui-system path: ${syncPath}`\n );\n }\n\n const destination = path.resolve(cacheRoot, normalized);\n const relative = path.relative(cacheRoot, destination);\n\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Refusing to sync @tutti-os/ui-system path: ${syncPath}`);\n }\n\n return destination;\n}\n\nasync function ensureNoSymlinkAncestors(\n root: string,\n target: string\n): Promise<void> {\n const relative = path.relative(root, target);\n\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(\"@tutti-os/ui-system dev cache path escaped cacheDir\");\n }\n\n const segments = relative === \"\" ? [] : relative.split(path.sep);\n let current = root;\n\n for (const segment of segments) {\n current = path.join(current, segment);\n\n try {\n const stat = await lstat(current);\n\n if (stat.isSymbolicLink()) {\n throw new Error(\n `Refusing symlink in @tutti-os/ui-system dev cache path: ${current}`\n );\n }\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return;\n }\n\n throw error;\n }\n }\n}\n\nasync function rejectExistingSymlink(filePath: string): Promise<void> {\n try {\n const stat = await lstat(filePath);\n\n if (stat.isSymbolicLink() || !stat.isFile()) {\n throw new Error(\n `Refusing unsafe @tutti-os/ui-system cache file: ${filePath}`\n );\n }\n } catch (error) {\n if (isNotFoundError(error)) {\n return;\n }\n\n throw error;\n }\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction isPathInside(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n\n return (\n relative === \"\" ||\n (!relative.startsWith(\"..\") && !path.isAbsolute(relative))\n );\n}\n\nfunction normalizeSyncPath(input: string): string | null {\n if (input.includes(\"\\0\")) {\n return null;\n }\n\n const slashPath = input.replaceAll(\"\\\\\", \"/\").replace(/^\\/+/, \"\");\n const normalized = path.posix.normalize(slashPath);\n\n if (\n normalized === \".\" ||\n normalized.startsWith(\"../\") ||\n normalized.split(\"/\").includes(\"..\")\n ) {\n return null;\n }\n\n return normalized;\n}\n\nfunction encodeSyncPath(syncPath: string): string {\n return syncPath.split(\"/\").map(encodeURIComponent).join(\"/\");\n}\n\nfunction hashBytes(bytes: Buffer): string {\n return `sha256:${createHash(\"sha256\").update(bytes).digest(\"hex\")}`;\n}\n\nfunction normalizeServerUrl(serverUrl: string): URL {\n return new URL(serverUrl);\n}\n\nfunction eventUrl(serverUrl: URL): string {\n const url = new URL(\"/events\", serverUrl);\n\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n\n return url.href;\n}\n\nfunction entrypointAlias(entrypoint: StableEntrypoint): RegExp {\n const specifier =\n entrypoint === \".\" ? packageName : `${packageName}${entrypoint.slice(1)}`;\n\n return new RegExp(`^${escapeRegExp(specifier)}$`);\n}\n\nfunction isCacheImporter(\n state: DevSyncState | null,\n importer: string | undefined\n): boolean {\n if (state === null || importer === undefined) {\n return false;\n }\n\n const importerPath = stripViteIdQuery(importer);\n\n if (!path.isAbsolute(importerPath)) {\n return false;\n }\n\n return isPathInside(state.cacheRoot, path.resolve(importerPath));\n}\n\nfunction stripViteIdQuery(id: string): string {\n const [pathWithoutQuery = \"\"] = id.split(\"?\", 1);\n\n return pathWithoutQuery;\n}\n\nfunction packageContextImporter(): string {\n return fileURLToPath(new URL(\"../styles/index.css\", import.meta.url));\n}\n\nfunction resolvePackageStyleDependency(dependencyName: string): string {\n const packageDirectory = findDependencyPackageDirectory(dependencyName);\n const manifest = JSON.parse(\n readFileSync(path.join(packageDirectory, \"package.json\"), \"utf8\")\n ) as {\n exports?: {\n \".\"?: {\n style?: unknown;\n };\n };\n };\n const styleExport = manifest.exports?.[\".\"]?.style;\n\n if (typeof styleExport !== \"string\") {\n throw new Error(`${dependencyName} does not expose a style export`);\n }\n\n return path.join(packageDirectory, styleExport);\n}\n\nfunction findDependencyPackageDirectory(dependencyName: string): string {\n const searchPaths = packageRequire.resolve.paths(dependencyName) ?? [];\n\n for (const searchPath of searchPaths) {\n const packageDirectory = path.join(searchPath, dependencyName);\n\n try {\n const manifest = JSON.parse(\n readFileSync(path.join(packageDirectory, \"package.json\"), \"utf8\")\n ) as { name?: unknown };\n\n if (manifest.name === dependencyName) {\n return packageDirectory;\n }\n } catch {\n // Try the next Node resolution search path.\n }\n }\n\n throw new Error(`Could not resolve ${dependencyName} from ${packageName}`);\n}\n\nfunction dependencyAlias(dependencyName: string): RegExp {\n return new RegExp(`^${escapeRegExp(dependencyName)}$`);\n}\n\nfunction escapeRegExp(input: string): string {\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n"],"mappings":"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","names":[]}
|
package/dist/icons/index.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ interface LayoutPresetIconProps extends IconProps {
|
|
|
13
13
|
}
|
|
14
14
|
declare function LayoutPresetIcon({ className, selectedCount, size, title, variant, ...props }: LayoutPresetIconProps): react_jsx_runtime.JSX.Element;
|
|
15
15
|
|
|
16
|
-
declare function
|
|
16
|
+
declare function TuttiMark({ className, size, title, ...props }: IconProps): react_jsx_runtime.JSX.Element;
|
|
17
17
|
|
|
18
18
|
declare function LaunchIcon(props: IconProps): react_jsx_runtime.JSX.Element;
|
|
19
19
|
declare function PlayIcon(props: IconProps): react_jsx_runtime.JSX.Element;
|
|
@@ -111,4 +111,4 @@ declare function AskLinedIcon(props: IconProps): react_jsx_runtime.JSX.Element;
|
|
|
111
111
|
declare function GoogleBrandIcon(props: IconProps): react_jsx_runtime.JSX.Element;
|
|
112
112
|
declare function GitHubBrandIcon(props: IconProps): react_jsx_runtime.JSX.Element;
|
|
113
113
|
|
|
114
|
-
export { AddIcon, AgentSessionsIcon, AppWindowIcon, ArrowLeftIcon, ArrowRightIcon, AskLinedIcon, CapabilityIcon, ChatIcon, CheckIcon, ChevronDownIcon, ChevronUpIcon, CloseIcon, CopyIcon, CreateChatIcon, DarkModeIcon, DashboardIcon, DeleteIcon, DirectoryIcon, DownloadIcon, EditIcon, EyeIcon, FailedFilledIcon, FailedLinedIcon, FileCodeIcon, FileCreateIcon, FileIcon, FileLinedIcon, FileTextIcon, FolderFailedIcon, FolderFilledIcon, FolderIcon, GitHubBrandIcon, GoogleBrandIcon, GridBottomLinedIcon, GridHorizontalLinedIcon, GridLeftLinedIcon, GridRightLinedIcon, GridTopLinedIcon, GridVerticalLinedIcon, GuideIcon, HealthIcon, type IconProps, ImageFileIcon, ImageGenerateIcon, IssueIcon, KeyboardIcon, LaunchIcon, LayoutMenuIcon, LayoutPresetIcon, type LayoutPresetIconProps, LightModeIcon, LinkIcon, LoadingIcon, type LoadingIconProps, LocateFolderIcon, MaximizeIcon, MinimizeIcon, MoreHorizontalIcon, NavAgentsIcon, NavApplicationsFilledIcon, NavApplicationsLinedIcon, NavLaunchIcon, NewWorkspaceIcon, NewWorkspaceLinedIcon,
|
|
114
|
+
export { AddIcon, AgentSessionsIcon, AppWindowIcon, ArrowLeftIcon, ArrowRightIcon, AskLinedIcon, CapabilityIcon, ChatIcon, CheckIcon, ChevronDownIcon, ChevronUpIcon, CloseIcon, CopyIcon, CreateChatIcon, DarkModeIcon, DashboardIcon, DeleteIcon, DirectoryIcon, DownloadIcon, EditIcon, EyeIcon, FailedFilledIcon, FailedLinedIcon, FileCodeIcon, FileCreateIcon, FileIcon, FileLinedIcon, FileTextIcon, FolderFailedIcon, FolderFilledIcon, FolderIcon, GitHubBrandIcon, GoogleBrandIcon, GridBottomLinedIcon, GridHorizontalLinedIcon, GridLeftLinedIcon, GridRightLinedIcon, GridTopLinedIcon, GridVerticalLinedIcon, GuideIcon, HealthIcon, type IconProps, ImageFileIcon, ImageGenerateIcon, IssueIcon, KeyboardIcon, LaunchIcon, LayoutMenuIcon, LayoutPresetIcon, type LayoutPresetIconProps, LightModeIcon, LinkIcon, LoadingIcon, type LoadingIconProps, LocateFolderIcon, MaximizeIcon, MinimizeIcon, MoreHorizontalIcon, NavAgentsIcon, NavApplicationsFilledIcon, NavApplicationsLinedIcon, NavLaunchIcon, NewWorkspaceIcon, NewWorkspaceLinedIcon, NoWorkspaceLinedIcon, OpenSessionsIcon, OverviewLayoutIcon, PanelIcon, PauseIcon, PinFilledIcon, PinIcon, PlatformIcon, PlayIcon, ProductDocIcon, ProductIcon, RefreshIcon, RestoreIcon, RoomsHintIcon, SearchIcon, SettingsIcon, SuccessFilledIcon, SuccessLinedIcon, TaskIcon, ThinkingIcon, ToolsIcon, TuttiMark, UnavailableChatIcon, UninstallIcon, UploadFolderIcon, UploadIcon, VideoFileIcon, ViewGridLinedIcon, ViewListLinedIcon, WarningFilledIcon, WarningLinedIcon, WebIcon, WebScrapeIcon };
|
package/dist/icons/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
LayoutPresetIcon,
|
|
3
|
-
|
|
4
|
-
} from "../chunk-
|
|
3
|
+
TuttiMark
|
|
4
|
+
} from "../chunk-RKQ4FPGY.js";
|
|
5
5
|
import {
|
|
6
6
|
AddIcon,
|
|
7
7
|
AgentSessionsIcon,
|
|
@@ -158,7 +158,6 @@ export {
|
|
|
158
158
|
NavLaunchIcon,
|
|
159
159
|
NewWorkspaceIcon,
|
|
160
160
|
NewWorkspaceLinedIcon,
|
|
161
|
-
NextopMark,
|
|
162
161
|
NoWorkspaceLinedIcon,
|
|
163
162
|
OpenSessionsIcon,
|
|
164
163
|
OverviewLayoutIcon,
|
|
@@ -180,6 +179,7 @@ export {
|
|
|
180
179
|
TaskIcon,
|
|
181
180
|
ThinkingIcon,
|
|
182
181
|
ToolsIcon,
|
|
182
|
+
TuttiMark,
|
|
183
183
|
UnavailableChatIcon,
|
|
184
184
|
UninstallIcon,
|
|
185
185
|
UploadFolderIcon,
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { Badge, BareIconButton, BareIconButtonProps, Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, ConfirmationDialog, ConfirmationDialogTone, DatePicker, DatePickerLabels, DatePickerProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Input, MentionPill, MentionPillFileKind, MentionPillKind, MentionPillProps, MenuPoint, MenuPointAlignment, MenuSize, MenuSurface, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, SectionTabItem, SectionTabs, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectSplitColumn, SelectSplitColumnItems, SelectSplitColumnLabel, SelectSplitDivider, SelectSplitLayout, SelectTrigger, SelectValue, Separator, ShortcutBadge, Spinner, SpinnerProps, StatusDot, Switch, Textarea, ToastClose, ToastDescription, ToastProvider, ToastRoot, ToastTitle, ToastViewport, Toaster, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, UnderlineTabItem, UnderlineTabs, ViewportMenuPlacement, ViewportMenuSurface, ViewportMenuSurfaceProps, badgeVariants, buttonVariants, menuItemClassName, menuItemIndicatorClassName, menuItemWithIndicatorClassName, menuSurfaceClassName, statusDotVariants, toastVariants } from './components/index.js';
|
|
2
|
-
export { AddIcon, AgentSessionsIcon, AppWindowIcon, ArrowLeftIcon, ArrowRightIcon, AskLinedIcon, CapabilityIcon, ChatIcon, CheckIcon, ChevronDownIcon, ChevronUpIcon, CloseIcon, CopyIcon, CreateChatIcon, DarkModeIcon, DashboardIcon, DeleteIcon, DirectoryIcon, DownloadIcon, EditIcon, EyeIcon, FailedFilledIcon, FailedLinedIcon, FileCodeIcon, FileCreateIcon, FileIcon, FileLinedIcon, FileTextIcon, FolderFailedIcon, FolderFilledIcon, FolderIcon, GitHubBrandIcon, GoogleBrandIcon, GridBottomLinedIcon, GridHorizontalLinedIcon, GridLeftLinedIcon, GridRightLinedIcon, GridTopLinedIcon, GridVerticalLinedIcon, GuideIcon, HealthIcon, IconProps, ImageFileIcon, ImageGenerateIcon, IssueIcon, KeyboardIcon, LaunchIcon, LayoutMenuIcon, LayoutPresetIcon, LayoutPresetIconProps, LightModeIcon, LinkIcon, LoadingIcon, LoadingIconProps, LocateFolderIcon, MaximizeIcon, MinimizeIcon, MoreHorizontalIcon, NavAgentsIcon, NavApplicationsFilledIcon, NavApplicationsLinedIcon, NavLaunchIcon, NewWorkspaceIcon, NewWorkspaceLinedIcon,
|
|
3
|
-
export {
|
|
2
|
+
export { AddIcon, AgentSessionsIcon, AppWindowIcon, ArrowLeftIcon, ArrowRightIcon, AskLinedIcon, CapabilityIcon, ChatIcon, CheckIcon, ChevronDownIcon, ChevronUpIcon, CloseIcon, CopyIcon, CreateChatIcon, DarkModeIcon, DashboardIcon, DeleteIcon, DirectoryIcon, DownloadIcon, EditIcon, EyeIcon, FailedFilledIcon, FailedLinedIcon, FileCodeIcon, FileCreateIcon, FileIcon, FileLinedIcon, FileTextIcon, FolderFailedIcon, FolderFilledIcon, FolderIcon, GitHubBrandIcon, GoogleBrandIcon, GridBottomLinedIcon, GridHorizontalLinedIcon, GridLeftLinedIcon, GridRightLinedIcon, GridTopLinedIcon, GridVerticalLinedIcon, GuideIcon, HealthIcon, IconProps, ImageFileIcon, ImageGenerateIcon, IssueIcon, KeyboardIcon, LaunchIcon, LayoutMenuIcon, LayoutPresetIcon, LayoutPresetIconProps, LightModeIcon, LinkIcon, LoadingIcon, LoadingIconProps, LocateFolderIcon, MaximizeIcon, MinimizeIcon, MoreHorizontalIcon, NavAgentsIcon, NavApplicationsFilledIcon, NavApplicationsLinedIcon, NavLaunchIcon, NewWorkspaceIcon, NewWorkspaceLinedIcon, NoWorkspaceLinedIcon, OpenSessionsIcon, OverviewLayoutIcon, PanelIcon, PauseIcon, PinFilledIcon, PinIcon, PlatformIcon, PlayIcon, ProductDocIcon, ProductIcon, RefreshIcon, RestoreIcon, RoomsHintIcon, SearchIcon, SettingsIcon, SuccessFilledIcon, SuccessLinedIcon, TaskIcon, ThinkingIcon, ToolsIcon, TuttiMark, UnavailableChatIcon, UninstallIcon, UploadFolderIcon, UploadIcon, VideoFileIcon, ViewGridLinedIcon, ViewListLinedIcon, WarningFilledIcon, WarningLinedIcon, WebIcon, WebScrapeIcon } from './icons/index.js';
|
|
3
|
+
export { TuttiDateLocale, formatTuttiDateTime, formatTuttiShortDateTime, getCurrentTuttiDateLocale } from './date-format.js';
|
|
4
4
|
export { cn } from './utils.js';
|
|
5
5
|
export { ExternalToast, ToasterProps, toast } from 'sonner';
|
|
6
6
|
import 'react/jsx-runtime';
|
package/dist/index.js
CHANGED
|
@@ -106,16 +106,16 @@ import {
|
|
|
106
106
|
statusDotVariants,
|
|
107
107
|
toast,
|
|
108
108
|
toastVariants
|
|
109
|
-
} from "./chunk-
|
|
109
|
+
} from "./chunk-YIAY5DKS.js";
|
|
110
110
|
import {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
} from "./chunk-
|
|
111
|
+
formatTuttiDateTime,
|
|
112
|
+
formatTuttiShortDateTime,
|
|
113
|
+
getCurrentTuttiDateLocale
|
|
114
|
+
} from "./chunk-K57FUMQG.js";
|
|
115
115
|
import {
|
|
116
116
|
LayoutPresetIcon,
|
|
117
|
-
|
|
118
|
-
} from "./chunk-
|
|
117
|
+
TuttiMark
|
|
118
|
+
} from "./chunk-RKQ4FPGY.js";
|
|
119
119
|
import {
|
|
120
120
|
AddIcon,
|
|
121
121
|
AgentSessionsIcon,
|
|
@@ -326,7 +326,6 @@ export {
|
|
|
326
326
|
NavLaunchIcon,
|
|
327
327
|
NewWorkspaceIcon,
|
|
328
328
|
NewWorkspaceLinedIcon,
|
|
329
|
-
NextopMark,
|
|
330
329
|
NoWorkspaceLinedIcon,
|
|
331
330
|
OpenSessionsIcon,
|
|
332
331
|
OverviewLayoutIcon,
|
|
@@ -393,6 +392,7 @@ export {
|
|
|
393
392
|
TooltipPortal,
|
|
394
393
|
TooltipProvider,
|
|
395
394
|
TooltipTrigger,
|
|
395
|
+
TuttiMark,
|
|
396
396
|
UnavailableChatIcon,
|
|
397
397
|
UnderlineTabs,
|
|
398
398
|
UninstallIcon,
|
|
@@ -409,9 +409,9 @@ export {
|
|
|
409
409
|
badgeVariants,
|
|
410
410
|
buttonVariants,
|
|
411
411
|
cn,
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
412
|
+
formatTuttiDateTime,
|
|
413
|
+
formatTuttiShortDateTime,
|
|
414
|
+
getCurrentTuttiDateLocale,
|
|
415
415
|
menuItemClassName,
|
|
416
416
|
menuItemIndicatorClassName,
|
|
417
417
|
menuItemWithIndicatorClassName,
|
|
@@ -1494,15 +1494,15 @@
|
|
|
1494
1494
|
"storyboard": true
|
|
1495
1495
|
},
|
|
1496
1496
|
{
|
|
1497
|
-
"id": "
|
|
1497
|
+
"id": "tutti-mark-filled-icon",
|
|
1498
1498
|
"layer": "base",
|
|
1499
|
-
"name": "
|
|
1500
|
-
"export": "
|
|
1499
|
+
"name": "TuttiMark",
|
|
1500
|
+
"export": "TuttiMark",
|
|
1501
1501
|
"from": "@tutti-os/ui-system/icons",
|
|
1502
1502
|
"category": "icon",
|
|
1503
1503
|
"status": "stable",
|
|
1504
|
-
"source": "src/icons/
|
|
1505
|
-
"description": "
|
|
1504
|
+
"source": "src/icons/tutti-mark.tsx",
|
|
1505
|
+
"description": "Tutti brand mark SVG icon.",
|
|
1506
1506
|
"useCases": ["Brand marks", "Application identity"],
|
|
1507
1507
|
"migrationHints": [],
|
|
1508
1508
|
"iconVariant": "filled"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://
|
|
4
|
-
"title": "
|
|
3
|
+
"$id": "https://tutti.dev/schemas/ui-system-components.schema.json",
|
|
4
|
+
"title": "Tutti UI System Component Metadata",
|
|
5
5
|
"type": "object",
|
|
6
6
|
"additionalProperties": false,
|
|
7
7
|
"required": ["schemaVersion", "components"],
|
package/dist/metadata/index.js
CHANGED
|
@@ -1495,15 +1495,15 @@ var components_default = {
|
|
|
1495
1495
|
storyboard: true
|
|
1496
1496
|
},
|
|
1497
1497
|
{
|
|
1498
|
-
id: "
|
|
1498
|
+
id: "tutti-mark-filled-icon",
|
|
1499
1499
|
layer: "base",
|
|
1500
|
-
name: "
|
|
1501
|
-
export: "
|
|
1500
|
+
name: "TuttiMark",
|
|
1501
|
+
export: "TuttiMark",
|
|
1502
1502
|
from: "@tutti-os/ui-system/icons",
|
|
1503
1503
|
category: "icon",
|
|
1504
1504
|
status: "stable",
|
|
1505
|
-
source: "src/icons/
|
|
1506
|
-
description: "
|
|
1505
|
+
source: "src/icons/tutti-mark.tsx",
|
|
1506
|
+
description: "Tutti brand mark SVG icon.",
|
|
1507
1507
|
useCases: ["Brand marks", "Application identity"],
|
|
1508
1508
|
migrationHints: [],
|
|
1509
1509
|
iconVariant: "filled"
|