@better-fullstack/template-generator 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.d.mts +1 -1
- package/dist/browser.mjs +1 -1
- package/dist/index.d.mts +170 -160
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -2
- package/dist/index.mjs.map +1 -1
- package/dist/{preflight-validation-BMDvJUQV.d.mts → preflight-validation-BAJGifyk.d.mts} +16 -7
- package/dist/preflight-validation-BAJGifyk.d.mts.map +1 -0
- package/dist/{preflight-validation-DswL2anV.mjs → preflight-validation-DR_bnBRo.mjs} +68719 -63325
- package/dist/preflight-validation-DR_bnBRo.mjs.map +1 -0
- package/package.json +2 -4
- package/dist/preflight-validation-BMDvJUQV.d.mts.map +0 -1
- package/dist/preflight-validation-DswL2anV.mjs.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as processAddonTemplates, c as Handlebars, d as nativeApplicationId, f as normalizeElixirAppName, g as VirtualFileSystem, h as transformFilename, i as generateVirtualProject, l as elixirModuleName, m as processTemplateString, n as EMBEDDED_TEMPLATES, o as processAddonsDeps, p as processFileContent, r as TEMPLATE_COUNT, s as dependencyVersionMap, t as validatePreflightConfig, u as isBinaryFile } from "./preflight-validation-
|
|
1
|
+
import { a as processAddonTemplates, c as Handlebars, d as nativeApplicationId, f as normalizeElixirAppName, g as VirtualFileSystem, h as transformFilename, i as generateVirtualProject, l as elixirModuleName, m as processTemplateString, n as EMBEDDED_TEMPLATES, o as processAddonsDeps, p as processFileContent, r as TEMPLATE_COUNT, s as dependencyVersionMap, t as validatePreflightConfig, u as isBinaryFile } from "./preflight-validation-DR_bnBRo.mjs";
|
|
2
2
|
import fs from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
|
|
@@ -12,7 +12,6 @@ import path from "node:path";
|
|
|
12
12
|
const ECOSYSTEM_GROUPS = {
|
|
13
13
|
effect: [
|
|
14
14
|
"effect",
|
|
15
|
-
"@effect/schema",
|
|
16
15
|
"@effect/platform",
|
|
17
16
|
"@effect/platform-node",
|
|
18
17
|
"@effect/platform-bun",
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["ECOSYSTEM_GROUPS: Record<string, string[]>","templateOnly: Record<string, string>","versionMismatches: { name: string; mapVersion: string; templateVersion: string; file: string }[]","entries: fs.Dirent[]","results: { filePath: string; version: string }[]","grouped: Record<string, string[]>","other: string[]","allPackages: Record<string, { version: string; source: string }>","result: CheckResult","ecosystem","typeOrder: Record<UpdateType, number>","lines: string[]","byType: Record<UpdateType, VersionInfo[]>"],"sources":["../src/utils/dependency-checker.ts"],"sourcesContent":["/**\n * Dependency Version Checker\n *\n * Core library for checking and updating dependency versions.\n * Used by both the CLI command and GitHub Action.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport { dependencyVersionMap } from \"./add-deps\";\n\n// Types\nexport type UpdateType = \"downgrade\" | \"major\" | \"minor\" | \"patch\" | \"none\";\n\nexport type VersionInfo = {\n name: string;\n current: string;\n latest: string;\n updateType: UpdateType;\n ecosystem?: string;\n source?: string;\n};\n\nexport type VersionMismatch = {\n name: string;\n mapVersion: string;\n templateVersion: string;\n file: string;\n};\n\nexport type CheckResult = {\n outdated: VersionInfo[];\n upToDate: VersionInfo[];\n errors: { name: string; error: string }[];\n versionMismatches?: VersionMismatch[];\n};\n\nexport type NpmPackageInfo = {\n name: string;\n \"dist-tags\": {\n latest: string;\n [tag: string]: string;\n };\n versions: Record<string, unknown>;\n};\n\n// Ecosystem groups for organizing related packages\nexport const ECOSYSTEM_GROUPS: Record<string, string[]> = {\n effect: [\n \"effect\",\n \"@effect/schema\",\n \"@effect/platform\",\n \"@effect/platform-node\",\n \"@effect/platform-bun\",\n \"@effect/platform-browser\",\n \"@effect/sql\",\n \"@effect/sql-sqlite-node\",\n \"@effect/sql-sqlite-bun\",\n \"@effect/sql-pg\",\n \"@effect/sql-mysql2\",\n \"@effect/sql-libsql\",\n \"@effect/sql-drizzle\",\n \"@effect/cli\",\n \"@effect/vitest\",\n \"@effect/opentelemetry\",\n \"@effect/rpc\",\n \"@effect/rpc-http\",\n \"@effect/cluster\",\n \"@effect/workflow\",\n \"@effect/ai\",\n \"@effect/ai-openai\",\n \"@effect/ai-anthropic\",\n ],\n tanstack: [\n \"@tanstack/react-query\",\n \"@tanstack/react-query-devtools\",\n \"@tanstack/vue-query\",\n \"@tanstack/vue-query-devtools\",\n \"@tanstack/svelte-query\",\n \"@tanstack/svelte-query-devtools\",\n \"@tanstack/solid-query\",\n \"@tanstack/solid-query-devtools\",\n \"@tanstack/solid-router-devtools\",\n \"@tanstack/react-router-ssr-query\",\n \"@tanstack/store\",\n \"@tanstack/react-store\",\n ],\n prisma: [\n \"prisma\",\n \"@prisma/client\",\n \"@prisma/adapter-d1\",\n \"@prisma/adapter-neon\",\n \"@prisma/adapter-mariadb\",\n \"@prisma/adapter-libsql\",\n \"@prisma/adapter-better-sqlite3\",\n \"@prisma/adapter-pg\",\n \"@prisma/adapter-planetscale\",\n ],\n drizzle: [\"drizzle-orm\", \"drizzle-kit\"],\n clerk: [\n \"@clerk/nextjs\",\n \"@clerk/clerk-react\",\n \"@clerk/tanstack-react-start\",\n \"@clerk/clerk-expo\",\n ],\n radix: [\n \"@radix-ui/react-dialog\",\n \"@radix-ui/react-dropdown-menu\",\n \"@radix-ui/react-slot\",\n \"@radix-ui/react-label\",\n \"@radix-ui/react-checkbox\",\n \"@radix-ui/react-select\",\n \"@radix-ui/react-toast\",\n \"@radix-ui/react-popover\",\n \"@radix-ui/react-switch\",\n \"@radix-ui/react-tabs\",\n ],\n opentelemetry: [\n \"@opentelemetry/api\",\n \"@opentelemetry/sdk-node\",\n \"@opentelemetry/auto-instrumentations-node\",\n \"@opentelemetry/exporter-trace-otlp-http\",\n \"@opentelemetry/exporter-metrics-otlp-http\",\n \"@opentelemetry/resources\",\n \"@opentelemetry/semantic-conventions\",\n ],\n testing: [\n \"vitest\",\n \"@vitest/ui\",\n \"@vitest/coverage-v8\",\n \"playwright\",\n \"@playwright/test\",\n \"jest\",\n \"@types/jest\",\n \"ts-jest\",\n \"@jest/globals\",\n \"jest-environment-jsdom\",\n \"cypress\",\n ],\n storybook: [\n \"storybook\",\n \"@storybook/react\",\n \"@storybook/react-vite\",\n \"@storybook/vue3-vite\",\n \"@storybook/svelte-vite\",\n \"@storybook/nextjs\",\n \"@storybook/addon-essentials\",\n \"@storybook/addon-interactions\",\n \"@storybook/test\",\n ],\n trpc: [\"@trpc/server\", \"@trpc/client\", \"@trpc/tanstack-react-query\"],\n orpc: [\"@orpc/server\", \"@orpc/client\", \"@orpc/openapi\", \"@orpc/zod\", \"@orpc/tanstack-query\"],\n \"ts-rest\": [\"@ts-rest/core\", \"@ts-rest/react-query\", \"@ts-rest/serverless\", \"@ts-rest/next\"],\n angular: [\n \"@angular/core\",\n \"@angular/common\",\n \"@angular/compiler\",\n \"@angular/platform-browser\",\n \"@angular/platform-browser-dynamic\",\n \"@angular/router\",\n \"@angular/forms\",\n \"@angular/animations\",\n \"@angular-devkit/build-angular\",\n \"@angular/cli\",\n \"@angular/compiler-cli\",\n ],\n nestjs: [\"@nestjs/core\", \"@nestjs/common\", \"@nestjs/platform-express\"],\n mikro: [\n \"@mikro-orm/core\",\n \"@mikro-orm/sqlite\",\n \"@mikro-orm/postgresql\",\n \"@mikro-orm/mysql\",\n \"@mikro-orm/better-sqlite\",\n ],\n mantine: [\"@mantine/core\", \"@mantine/hooks\"],\n ark: [\"@ark-ui/react\", \"@ark-ui/vue\", \"@ark-ui/solid\", \"@ark-ui/svelte\"],\n uppy: [\n \"@uppy/core\",\n \"@uppy/dashboard\",\n \"@uppy/drag-drop\",\n \"@uppy/progress-bar\",\n \"@uppy/xhr-upload\",\n \"@uppy/tus\",\n \"@uppy/react\",\n \"@uppy/svelte\",\n \"@uppy/vue\",\n \"@uppy/angular\",\n ],\n uploadthing: [\n \"uploadthing\",\n \"@uploadthing/react\",\n \"@uploadthing/svelte\",\n \"@uploadthing/vue\",\n \"@uploadthing/solid\",\n \"@uploadthing/nuxt\",\n \"@uploadthing/expo\",\n ],\n payload: [\n \"payload\",\n \"@payloadcms/next\",\n \"@payloadcms/richtext-lexical\",\n \"@payloadcms/db-postgres\",\n \"@payloadcms/db-mongodb\",\n \"@payloadcms/db-sqlite\",\n \"@payloadcms/plugin-seo\",\n \"@payloadcms/storage-s3\",\n ],\n redwood: [\n \"@redwoodjs/core\",\n \"@redwoodjs/web\",\n \"@redwoodjs/api\",\n \"@redwoodjs/router\",\n \"@redwoodjs/forms\",\n \"@redwoodjs/graphql-server\",\n \"@redwoodjs/vite\",\n \"@redwoodjs/project-config\",\n ],\n convex: [\n \"convex\",\n \"@convex-dev/react-query\",\n \"@convex-dev/agent\",\n \"convex-svelte\",\n \"convex-nuxt\",\n \"convex-vue\",\n \"@convex-dev/better-auth\",\n ],\n cloudflare: [\n \"wrangler\",\n \"@cloudflare/vite-plugin\",\n \"@opennextjs/cloudflare\",\n \"nitro-cloudflare-dev\",\n \"@sveltejs/adapter-cloudflare\",\n \"@cloudflare/workers-types\",\n ],\n liveblocks: [\"@liveblocks/client\", \"@liveblocks/react\", \"@liveblocks/node\"],\n temporal: [\n \"@temporalio/client\",\n \"@temporalio/worker\",\n \"@temporalio/workflow\",\n \"@temporalio/activity\",\n ],\n};\n\nconst SKIP_FIELDS = new Set([\n \"name\", \"version\", \"private\", \"type\", \"main\", \"module\", \"types\",\n \"exports\", \"scripts\", \"workspaces\", \"engines\", \"packageManager\",\n \"author\", \"license\", \"description\", \"homepage\", \"repository\",\n \"bugs\", \"keywords\", \"files\", \"sideEffects\", \"browserslist\",\n \"eslintConfig\", \"prettier\", \"jest\", \"babel\",\n]);\n\nconst DEP_PATTERN = /\"(@?[a-z][a-z0-9._-]*(?:\\/[a-z][a-z0-9._-]*)?)\"\\s*:\\s*\"([~^]?[\\d][^\"]+)\"/g;\n\nexport function scanTemplateVersions(templatesDir: string): {\n templateOnly: Record<string, string>;\n versionMismatches: { name: string; mapVersion: string; templateVersion: string; file: string }[];\n} {\n const templateOnly: Record<string, string> = {};\n const versionMismatches: { name: string; mapVersion: string; templateVersion: string; file: string }[] = [];\n const seenMismatches = new Set<string>();\n\n function walkDir(dir: string) {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n walkDir(fullPath);\n } else if (entry.name === \"package.json.hbs\") {\n extractVersions(fullPath);\n }\n }\n }\n\n function extractVersions(filePath: string) {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const relPath = path.relative(templatesDir, filePath);\n\n DEP_PATTERN.lastIndex = 0;\n let match;\n\n while ((match = DEP_PATTERN.exec(content)) !== null) {\n const [, pkg, version] = match;\n if (!pkg || !version) continue;\n\n if (SKIP_FIELDS.has(pkg)) continue;\n\n if (pkg in dependencyVersionMap) {\n const mapVersion = dependencyVersionMap[pkg as keyof typeof dependencyVersionMap];\n const mismatchKey = `${relPath}|${pkg}|${version}`;\n if (mapVersion !== version && !seenMismatches.has(mismatchKey)) {\n seenMismatches.add(mismatchKey);\n versionMismatches.push({ name: pkg, mapVersion, templateVersion: version, file: relPath });\n }\n } else {\n const existing = templateOnly[pkg];\n if (!existing || compareVersions(version, existing) > 0) {\n templateOnly[pkg] = version;\n }\n }\n }\n }\n\n walkDir(templatesDir);\n return { templateOnly, versionMismatches };\n}\n\nexport function findTemplateFilesWithPackage(\n templatesDir: string,\n packageName: string,\n): { filePath: string; version: string }[] {\n const results: { filePath: string; version: string }[] = [];\n\n function walkDir(dir: string) {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n walkDir(fullPath);\n } else if (entry.name === \"package.json.hbs\") {\n const content = fs.readFileSync(fullPath, \"utf-8\");\n const escapedName = packageName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const pattern = new RegExp(`\"${escapedName}\"\\\\s*:\\\\s*\"([~^]?[\\\\d][^\"]+)\"`, \"g\");\n let match;\n while ((match = pattern.exec(content)) !== null) {\n if (match[1]) {\n results.push({ filePath: fullPath, version: match[1] });\n }\n }\n }\n }\n }\n\n walkDir(templatesDir);\n return results;\n}\n\nconst LOCKSTEP_ECOSYSTEMS = new Set([\"storybook\"]);\n\n// Cache for npm registry responses\nconst versionCache = new Map<string, { info: NpmPackageInfo; timestamp: number }>();\nconst lockstepVersionCache = new Map<string, { latest: string; timestamp: number }>();\nconst CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Parse a version string, removing any leading ^, ~, or other specifiers\n */\nexport function parseVersion(versionSpec: string): {\n major: number;\n minor: number;\n patch: number;\n raw: string;\n} {\n const raw = versionSpec.replace(/^[\\^~>=<]+/, \"\").split(\" \")[0] ?? \"\";\n const parts = raw.split(\".\");\n return {\n major: parseInt(parts[0] || \"0\", 10),\n minor: parseInt(parts[1] || \"0\", 10),\n patch: parseInt(parts[2] || \"0\", 10),\n raw,\n };\n}\n\ntype ParsedSemver = {\n major: number;\n minor: number;\n patch: number;\n prerelease: Array<number | string>;\n};\n\nfunction parseSemver(versionSpec: string): ParsedSemver {\n const raw = parseVersion(versionSpec).raw;\n const withoutBuild = raw.split(\"+\")[0] ?? raw;\n const dashIndex = withoutBuild.indexOf(\"-\");\n const core = dashIndex === -1 ? withoutBuild : withoutBuild.slice(0, dashIndex);\n const prereleasePart = dashIndex === -1 ? \"\" : withoutBuild.slice(dashIndex + 1);\n const [major = \"0\", minor = \"0\", patch = \"0\"] = core.split(\".\");\n\n return {\n major: parseInt(major, 10) || 0,\n minor: parseInt(minor, 10) || 0,\n patch: parseInt(patch, 10) || 0,\n prerelease: prereleasePart\n ? prereleasePart\n .split(\".\")\n .filter(Boolean)\n .map((id) => (/^\\d+$/.test(id) ? parseInt(id, 10) : id))\n : [],\n };\n}\n\nfunction comparePrerelease(a: Array<number | string>, b: Array<number | string>): number {\n if (a.length === 0 && b.length === 0) return 0;\n if (a.length === 0) return 1;\n if (b.length === 0) return -1;\n\n const length = Math.max(a.length, b.length);\n for (let i = 0; i < length; i++) {\n const ai = a[i];\n const bi = b[i];\n\n if (ai === undefined) return -1;\n if (bi === undefined) return 1;\n\n if (typeof ai === \"number\" && typeof bi === \"number\") {\n if (ai !== bi) return ai > bi ? 1 : -1;\n continue;\n }\n\n if (typeof ai === \"number\") return -1;\n if (typeof bi === \"number\") return 1;\n if (ai !== bi) return ai > bi ? 1 : -1;\n }\n\n return 0;\n}\n\n/**\n * Compare two semver-like specs after removing range operators.\n * Returns >0 when a > b, <0 when a < b, and 0 when equal.\n */\nexport function compareVersions(a: string, b: string): number {\n const pa = parseSemver(a);\n const pb = parseSemver(b);\n\n if (pa.major !== pb.major) return pa.major - pb.major;\n if (pa.minor !== pb.minor) return pa.minor - pb.minor;\n if (pa.patch !== pb.patch) return pa.patch - pb.patch;\n return comparePrerelease(pa.prerelease, pb.prerelease);\n}\n\n/**\n * Determine the type of update between two versions\n */\nexport function getUpdateType(current: string, latest: string): UpdateType {\n const comparison = compareVersions(latest, current);\n const curr = parseVersion(current);\n const lat = parseVersion(latest);\n\n if (comparison === 0 && curr.raw === lat.raw) return \"none\";\n if (comparison < 0) return \"downgrade\";\n if (comparison === 0) return \"patch\";\n if (lat.major > curr.major) return \"major\";\n if (lat.minor > curr.minor) return \"minor\";\n if (lat.patch > curr.patch) return \"patch\";\n if (comparison > 0) return \"patch\";\n return \"none\";\n}\n\n/**\n * Fetch the latest version of a package from npm registry\n */\nasync function fetchPackageInfo(packageName: string): Promise<NpmPackageInfo> {\n const cached = versionCache.get(packageName);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {\n return cached.info;\n }\n\n const encodedName = encodeURIComponent(packageName).replace(\"%40\", \"@\");\n const url = `https://registry.npmjs.org/${encodedName}`;\n\n const response = await fetch(url, {\n headers: { Accept: \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(`Package ${packageName} not found (${response.status})`);\n }\n\n const info = (await response.json()) as NpmPackageInfo;\n\n versionCache.set(packageName, { info, timestamp: Date.now() });\n return info;\n}\n\nfunction getStableVersionsDescending(info: NpmPackageInfo): string[] {\n return Object.keys(info.versions || {})\n .filter((version) => !/-(alpha|beta|rc|next|canary)/.test(version))\n .sort((a, b) => compareVersions(b, a));\n}\n\nasync function fetchLatestCompatibleEcosystemVersion(ecosystem: string): Promise<string | undefined> {\n const cached = lockstepVersionCache.get(ecosystem);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {\n return cached.latest;\n }\n\n const ecosystemPackages = ECOSYSTEM_GROUPS[ecosystem]?.filter((pkg) => !pkg.endsWith(\"/*\")) ?? [];\n if (ecosystemPackages.length === 0) return undefined;\n\n const packageInfos = await Promise.all(ecosystemPackages.map((pkg) => fetchPackageInfo(pkg)));\n const [firstInfo, ...remainingInfos] = packageInfos;\n if (!firstInfo) return undefined;\n\n const sharedVersions = getStableVersionsDescending(firstInfo);\n\n for (const info of remainingInfos) {\n const stableVersions = new Set(getStableVersionsDescending(info));\n for (let i = sharedVersions.length - 1; i >= 0; i--) {\n const version = sharedVersions[i];\n if (!version || !stableVersions.has(version)) {\n sharedVersions.splice(i, 1);\n }\n }\n }\n\n const latest = sharedVersions[0];\n if (latest) {\n lockstepVersionCache.set(ecosystem, { latest, timestamp: Date.now() });\n }\n\n return latest;\n}\n\nexport async function fetchLatestVersion(\n packageName: string,\n options: { skipPrerelease?: boolean } = {},\n): Promise<string> {\n const { skipPrerelease = true } = options;\n const data = await fetchPackageInfo(packageName);\n let latest = data[\"dist-tags\"]?.latest;\n\n // If the latest is a prerelease and we want to skip prereleases,\n // find the highest stable version\n if (skipPrerelease && latest && /-(alpha|beta|rc|next|canary)/.test(latest)) {\n const versions = getStableVersionsDescending(data);\n if (versions.length > 0 && versions[0]) {\n latest = versions[0];\n }\n }\n\n if (!latest) {\n throw new Error(`No versions found for ${packageName}`);\n }\n\n return latest;\n}\n\nasync function resolveLatestVersion(packageName: string, ecosystem?: string): Promise<string> {\n if (ecosystem && LOCKSTEP_ECOSYSTEMS.has(ecosystem)) {\n const compatibleVersion = await fetchLatestCompatibleEcosystemVersion(ecosystem);\n if (compatibleVersion) {\n return compatibleVersion;\n }\n }\n\n return fetchLatestVersion(packageName);\n}\n\n/**\n * Check if a specific version exists on npm\n */\nexport async function checkVersionExists(\n packageName: string,\n versionSpec: string,\n): Promise<boolean> {\n try {\n const cleanVersion = parseVersion(versionSpec).raw;\n const encodedName = encodeURIComponent(packageName).replace(\"%40\", \"@\");\n const url = `https://registry.npmjs.org/${encodedName}`;\n\n const response = await fetch(url, {\n headers: { Accept: \"application/json\" },\n });\n\n if (!response.ok) return false;\n\n const data = (await response.json()) as NpmPackageInfo;\n const versions = Object.keys(data.versions || {});\n\n // For caret versions, check if any version satisfies the range\n if (versionSpec.startsWith(\"^\")) {\n const { major, minor, patch } = parseVersion(versionSpec);\n\n return versions.some((v) => {\n const parsed = parseVersion(v);\n if (major === 0) {\n // For ^0.Y.Z, only minor must match, patch can be >= specified\n return parsed.major === 0 && parsed.minor === minor && parsed.patch >= patch;\n } else {\n // For ^X.Y.Z (X > 0), major must match, rest can be >=\n return (\n parsed.major === major &&\n (parsed.minor > minor || (parsed.minor === minor && parsed.patch >= patch))\n );\n }\n });\n }\n\n return versions.includes(cleanVersion);\n } catch {\n return false;\n }\n}\n\n/**\n * Get the ecosystem group for a package\n */\nexport function getEcosystem(packageName: string): string | undefined {\n for (const [ecosystem, packages] of Object.entries(ECOSYSTEM_GROUPS)) {\n if (packages.includes(packageName)) {\n return ecosystem;\n }\n // Check for glob patterns like @effect/*\n for (const pattern of packages) {\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -2);\n if (packageName.startsWith(prefix + \"/\")) {\n return ecosystem;\n }\n }\n }\n }\n return undefined;\n}\n\n/**\n * Group packages by their ecosystem\n */\nexport function groupByEcosystem(packages: string[]): Record<string, string[]> {\n const grouped: Record<string, string[]> = {};\n const other: string[] = [];\n\n for (const pkg of packages) {\n const ecosystem = getEcosystem(pkg);\n if (ecosystem) {\n if (!grouped[ecosystem]) grouped[ecosystem] = [];\n grouped[ecosystem]!.push(pkg);\n } else {\n other.push(pkg);\n }\n }\n\n // Add other group if not empty\n if (other.length > 0) {\n grouped.other = other;\n }\n\n return grouped;\n}\n\nexport async function checkAllVersions(options: {\n versionMap?: Record<string, string>;\n templateVersions?: Record<string, string>;\n filter?: string[];\n ecosystem?: string;\n concurrency?: number;\n onProgress?: (checked: number, total: number, current: string) => void;\n delayMs?: number;\n}): Promise<CheckResult> {\n const {\n versionMap = dependencyVersionMap,\n templateVersions = {},\n filter,\n ecosystem,\n concurrency = 5,\n onProgress,\n delayMs = 100,\n } = options;\n\n const allPackages: Record<string, { version: string; source: string }> = {};\n for (const [pkg, version] of Object.entries(versionMap)) {\n allPackages[pkg] = { version, source: \"map\" };\n }\n for (const [pkg, version] of Object.entries(templateVersions)) {\n if (!(pkg in allPackages)) {\n allPackages[pkg] = { version, source: \"template\" };\n }\n }\n\n let packages = Object.keys(allPackages);\n\n // Filter by specific packages\n if (filter && filter.length > 0) {\n packages = packages.filter((p) => filter.includes(p));\n }\n\n // Filter by ecosystem\n if (ecosystem) {\n const ecosystemPackages = ECOSYSTEM_GROUPS[ecosystem];\n if (ecosystemPackages) {\n packages = packages.filter((p) => {\n if (ecosystemPackages.includes(p)) return true;\n // Check glob patterns\n for (const pattern of ecosystemPackages) {\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -2);\n if (p.startsWith(prefix + \"/\")) return true;\n }\n }\n return false;\n });\n }\n }\n\n const result: CheckResult = {\n outdated: [],\n upToDate: [],\n errors: [],\n };\n\n const total = packages.length;\n let checked = 0;\n\n // Process in batches for rate limiting\n for (let i = 0; i < packages.length; i += concurrency) {\n const batch = packages.slice(i, i + concurrency);\n\n const batchResults = await Promise.allSettled(\n batch.map(async (pkg) => {\n const entry = allPackages[pkg]!;\n try {\n const ecosystem = getEcosystem(pkg);\n const latest = await resolveLatestVersion(pkg, ecosystem);\n const updateType = getUpdateType(entry.version, latest);\n\n return {\n name: pkg,\n current: entry.version,\n latest: `^${latest}`,\n updateType,\n ecosystem,\n source: entry.source,\n };\n } catch (error) {\n throw { name: pkg, error: String(error) };\n }\n }),\n );\n\n for (const settled of batchResults) {\n if (settled.status === \"fulfilled\") {\n const info = settled.value as VersionInfo;\n if (info.updateType === \"none\") {\n result.upToDate.push(info);\n } else {\n result.outdated.push(info);\n }\n } else {\n const err = settled.reason as { name: string; error: string };\n result.errors.push(err);\n }\n checked++;\n onProgress?.(checked, total, batch[0] ?? \"\");\n }\n\n // Rate limiting delay between batches\n if (i + concurrency < packages.length && delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n // Sort outdated by update type (downgrade > major > minor > patch)\n const typeOrder: Record<UpdateType, number> = {\n downgrade: 0,\n major: 1,\n minor: 2,\n patch: 3,\n none: 4,\n };\n result.outdated.sort((a, b) => typeOrder[a.updateType] - typeOrder[b.updateType]);\n\n return result;\n}\n\n/**\n * Generate a markdown report of the check results\n */\nexport function generateMarkdownReport(result: CheckResult): string {\n const lines: string[] = [];\n\n lines.push(\"# Dependency Version Check Report\\n\");\n lines.push(`Generated: ${new Date().toISOString()}\\n`);\n\n // Summary\n lines.push(\"## Summary\\n\");\n const downgradeCount = result.outdated.filter((info) => info.updateType === \"downgrade\").length;\n const templateOnlyCount = result.outdated.filter((info) => info.source === \"template\").length;\n lines.push(`- **Outdated**: ${result.outdated.length}`);\n if (templateOnlyCount > 0) {\n lines.push(`- **Template-only** (not in version map): ${templateOnlyCount}`);\n }\n lines.push(`- **Downgrades detected**: ${downgradeCount}`);\n lines.push(`- **Up to date**: ${result.upToDate.length}`);\n lines.push(`- **Errors**: ${result.errors.length}\\n`);\n\n // Outdated packages\n if (result.outdated.length > 0) {\n lines.push(\"## Outdated Packages\\n\");\n\n // Group by update type\n const byType: Record<UpdateType, VersionInfo[]> = {\n downgrade: [],\n major: [],\n minor: [],\n patch: [],\n none: [],\n };\n for (const info of result.outdated) {\n byType[info.updateType].push(info);\n }\n\n if (byType.downgrade.length > 0) {\n lines.push(\"### Downgrades Detected (Manual Review Required)\\n\");\n lines.push(\"| Package | Current | Latest | Ecosystem | Source |\");\n lines.push(\"|---------|---------|--------|-----------|--------|\");\n for (const info of byType.downgrade) {\n lines.push(\n `| ${info.name} | ${info.current} | ${info.latest} | ${info.ecosystem || \"-\"} | ${info.source === \"template\" ? \"template\" : \"map\"} |`,\n );\n }\n lines.push(\"\");\n }\n\n if (byType.major.length > 0) {\n lines.push(\"### Major Updates (Breaking Changes Possible)\\n\");\n lines.push(\"| Package | Current | Latest | Ecosystem | Source |\");\n lines.push(\"|---------|---------|--------|-----------|--------|\");\n for (const info of byType.major) {\n lines.push(\n `| ${info.name} | ${info.current} | ${info.latest} | ${info.ecosystem || \"-\"} | ${info.source === \"template\" ? \"template\" : \"map\"} |`,\n );\n }\n lines.push(\"\");\n }\n\n if (byType.minor.length > 0) {\n lines.push(\"### Minor Updates\\n\");\n lines.push(\"| Package | Current | Latest | Ecosystem | Source |\");\n lines.push(\"|---------|---------|--------|-----------|--------|\");\n for (const info of byType.minor) {\n lines.push(\n `| ${info.name} | ${info.current} | ${info.latest} | ${info.ecosystem || \"-\"} | ${info.source === \"template\" ? \"template\" : \"map\"} |`,\n );\n }\n lines.push(\"\");\n }\n\n if (byType.patch.length > 0) {\n lines.push(\"### Patch Updates\\n\");\n lines.push(\"| Package | Current | Latest | Ecosystem | Source |\");\n lines.push(\"|---------|---------|--------|-----------|--------|\");\n for (const info of byType.patch) {\n lines.push(\n `| ${info.name} | ${info.current} | ${info.latest} | ${info.ecosystem || \"-\"} | ${info.source === \"template\" ? \"template\" : \"map\"} |`,\n );\n }\n lines.push(\"\");\n }\n }\n\n if (result.versionMismatches && result.versionMismatches.length > 0) {\n lines.push(\"## Version Mismatches (map vs template)\\n\");\n lines.push(\"| Package | Map Version | Template Version | Template File |\");\n lines.push(\"|---------|-------------|------------------|---------------|\");\n for (const m of result.versionMismatches) {\n lines.push(`| ${m.name} | ${m.mapVersion} | ${m.templateVersion} | ${m.file} |`);\n }\n lines.push(\"\");\n }\n\n // Errors\n if (result.errors.length > 0) {\n lines.push(\"## Errors\\n\");\n lines.push(\"| Package | Error |\");\n lines.push(\"|---------|-------|\");\n for (const err of result.errors) {\n lines.push(`| ${err.name} | ${err.error} |`);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generate a CLI-friendly table report\n */\nexport function generateCliReport(result: CheckResult): string {\n const lines: string[] = [];\n\n if (result.outdated.length === 0 && result.errors.length === 0) {\n lines.push(\"All dependencies are up to date!\");\n return lines.join(\"\\n\");\n }\n\n if (result.outdated.length > 0) {\n // Group by update type\n const byType: Record<UpdateType, VersionInfo[]> = {\n downgrade: [],\n major: [],\n minor: [],\n patch: [],\n none: [],\n };\n for (const info of result.outdated) {\n byType[info.updateType].push(info);\n }\n\n const formatRow = (info: VersionInfo) => {\n const label =\n info.updateType === \"downgrade\"\n ? \"[DOWNGRADE]\"\n : info.updateType === \"major\"\n ? \"[MAJOR]\"\n : info.updateType === \"minor\"\n ? \"[MINOR]\"\n : \"[PATCH]\";\n return ` ${label.padEnd(8)} ${info.name.padEnd(45)} ${info.current.padEnd(15)} -> ${info.latest}`;\n };\n\n if (byType.downgrade.length > 0) {\n lines.push(\"\\nDowngrades Detected (Manual Review Required):\");\n for (const info of byType.downgrade) {\n lines.push(formatRow(info));\n }\n }\n\n if (byType.major.length > 0) {\n lines.push(\"\\nMajor Updates (Breaking Changes Possible):\");\n for (const info of byType.major) {\n lines.push(formatRow(info));\n }\n }\n\n if (byType.minor.length > 0) {\n lines.push(\"\\nMinor Updates:\");\n for (const info of byType.minor) {\n lines.push(formatRow(info));\n }\n }\n\n if (byType.patch.length > 0) {\n lines.push(\"\\nPatch Updates:\");\n for (const info of byType.patch) {\n lines.push(formatRow(info));\n }\n }\n }\n\n if (result.versionMismatches && result.versionMismatches.length > 0) {\n lines.push(\"\\nVersion Mismatches (map vs template):\");\n for (const m of result.versionMismatches) {\n lines.push(` ${m.name.padEnd(45)} map: ${m.mapVersion.padEnd(15)} template: ${m.templateVersion.padEnd(15)} ${m.file}`);\n }\n }\n\n if (result.errors.length > 0) {\n lines.push(\"\\nErrors:\");\n for (const err of result.errors) {\n lines.push(` ${err.name}: ${err.error}`);\n }\n }\n\n const mismatchCount = result.versionMismatches?.length ?? 0;\n lines.push(\n `\\nSummary: ${result.outdated.length} outdated, ${result.upToDate.length} up to date, ${mismatchCount} mismatches, ${result.errors.length} errors`,\n );\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generate updated code for add-deps.ts with new versions\n */\nexport function generateUpdatedVersionMap(\n updates: VersionInfo[],\n currentMap: Record<string, string>,\n): Record<string, string> {\n const newMap = { ...currentMap };\n for (const update of updates) {\n if (update.updateType !== \"none\") {\n newMap[update.name] = update.latest;\n }\n }\n return newMap;\n}\n\n/**\n * Get the current dependency version map\n */\nexport function getDependencyVersionMap(): Record<string, string> {\n return { ...dependencyVersionMap };\n}\n\n/**\n * List all available ecosystems\n */\nexport function listEcosystems(): string[] {\n return Object.keys(ECOSYSTEM_GROUPS);\n}\n"],"mappings":";;;;;;;;;;;AAgDA,MAAaA,mBAA6C;CACxD,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS,CAAC,eAAe,cAAc;CACvC,OAAO;EACL;EACA;EACA;EACA;EACD;CACD,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,eAAe;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,WAAW;EACT;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EAAC;EAAgB;EAAgB;EAA6B;CACpE,MAAM;EAAC;EAAgB;EAAgB;EAAiB;EAAa;EAAuB;CAC5F,WAAW;EAAC;EAAiB;EAAwB;EAAuB;EAAgB;CAC5F,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,QAAQ;EAAC;EAAgB;EAAkB;EAA2B;CACtE,OAAO;EACL;EACA;EACA;EACA;EACA;EACD;CACD,SAAS,CAAC,iBAAiB,iBAAiB;CAC5C,KAAK;EAAC;EAAiB;EAAe;EAAiB;EAAiB;CACxE,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,aAAa;EACX;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;E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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["ECOSYSTEM_GROUPS: Record<string, string[]>","templateOnly: Record<string, string>","versionMismatches: { name: string; mapVersion: string; templateVersion: string; file: string }[]","entries: fs.Dirent[]","results: { filePath: string; version: string }[]","grouped: Record<string, string[]>","other: string[]","allPackages: Record<string, { version: string; source: string }>","result: CheckResult","ecosystem","typeOrder: Record<UpdateType, number>","lines: string[]","byType: Record<UpdateType, VersionInfo[]>"],"sources":["../src/utils/dependency-checker.ts"],"sourcesContent":["/**\n * Dependency Version Checker\n *\n * Core library for checking and updating dependency versions.\n * Used by both the CLI command and GitHub Action.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport { dependencyVersionMap } from \"./add-deps\";\n\n// Types\nexport type UpdateType = \"downgrade\" | \"major\" | \"minor\" | \"patch\" | \"none\";\n\nexport type VersionInfo = {\n name: string;\n current: string;\n latest: string;\n updateType: UpdateType;\n ecosystem?: string;\n source?: string;\n};\n\nexport type VersionMismatch = {\n name: string;\n mapVersion: string;\n templateVersion: string;\n file: string;\n};\n\nexport type CheckResult = {\n outdated: VersionInfo[];\n upToDate: VersionInfo[];\n errors: { name: string; error: string }[];\n versionMismatches?: VersionMismatch[];\n};\n\nexport type NpmPackageInfo = {\n name: string;\n \"dist-tags\": {\n latest: string;\n [tag: string]: string;\n };\n versions: Record<string, unknown>;\n};\n\n// Ecosystem groups for organizing related packages\nexport const ECOSYSTEM_GROUPS: Record<string, string[]> = {\n effect: [\n \"effect\",\n \"@effect/platform\",\n \"@effect/platform-node\",\n \"@effect/platform-bun\",\n \"@effect/platform-browser\",\n \"@effect/sql\",\n \"@effect/sql-sqlite-node\",\n \"@effect/sql-sqlite-bun\",\n \"@effect/sql-pg\",\n \"@effect/sql-mysql2\",\n \"@effect/sql-libsql\",\n \"@effect/sql-drizzle\",\n \"@effect/cli\",\n \"@effect/vitest\",\n \"@effect/opentelemetry\",\n \"@effect/rpc\",\n \"@effect/rpc-http\",\n \"@effect/cluster\",\n \"@effect/workflow\",\n \"@effect/ai\",\n \"@effect/ai-openai\",\n \"@effect/ai-anthropic\",\n ],\n tanstack: [\n \"@tanstack/react-query\",\n \"@tanstack/react-query-devtools\",\n \"@tanstack/vue-query\",\n \"@tanstack/vue-query-devtools\",\n \"@tanstack/svelte-query\",\n \"@tanstack/svelte-query-devtools\",\n \"@tanstack/solid-query\",\n \"@tanstack/solid-query-devtools\",\n \"@tanstack/solid-router-devtools\",\n \"@tanstack/react-router-ssr-query\",\n \"@tanstack/store\",\n \"@tanstack/react-store\",\n ],\n prisma: [\n \"prisma\",\n \"@prisma/client\",\n \"@prisma/adapter-d1\",\n \"@prisma/adapter-neon\",\n \"@prisma/adapter-mariadb\",\n \"@prisma/adapter-libsql\",\n \"@prisma/adapter-better-sqlite3\",\n \"@prisma/adapter-pg\",\n \"@prisma/adapter-planetscale\",\n ],\n drizzle: [\"drizzle-orm\", \"drizzle-kit\"],\n clerk: [\n \"@clerk/nextjs\",\n \"@clerk/clerk-react\",\n \"@clerk/tanstack-react-start\",\n \"@clerk/clerk-expo\",\n ],\n radix: [\n \"@radix-ui/react-dialog\",\n \"@radix-ui/react-dropdown-menu\",\n \"@radix-ui/react-slot\",\n \"@radix-ui/react-label\",\n \"@radix-ui/react-checkbox\",\n \"@radix-ui/react-select\",\n \"@radix-ui/react-toast\",\n \"@radix-ui/react-popover\",\n \"@radix-ui/react-switch\",\n \"@radix-ui/react-tabs\",\n ],\n opentelemetry: [\n \"@opentelemetry/api\",\n \"@opentelemetry/sdk-node\",\n \"@opentelemetry/auto-instrumentations-node\",\n \"@opentelemetry/exporter-trace-otlp-http\",\n \"@opentelemetry/exporter-metrics-otlp-http\",\n \"@opentelemetry/resources\",\n \"@opentelemetry/semantic-conventions\",\n ],\n testing: [\n \"vitest\",\n \"@vitest/ui\",\n \"@vitest/coverage-v8\",\n \"playwright\",\n \"@playwright/test\",\n \"jest\",\n \"@types/jest\",\n \"ts-jest\",\n \"@jest/globals\",\n \"jest-environment-jsdom\",\n \"cypress\",\n ],\n storybook: [\n \"storybook\",\n \"@storybook/react\",\n \"@storybook/react-vite\",\n \"@storybook/vue3-vite\",\n \"@storybook/svelte-vite\",\n \"@storybook/nextjs\",\n \"@storybook/addon-essentials\",\n \"@storybook/addon-interactions\",\n \"@storybook/test\",\n ],\n trpc: [\"@trpc/server\", \"@trpc/client\", \"@trpc/tanstack-react-query\"],\n orpc: [\"@orpc/server\", \"@orpc/client\", \"@orpc/openapi\", \"@orpc/zod\", \"@orpc/tanstack-query\"],\n \"ts-rest\": [\"@ts-rest/core\", \"@ts-rest/react-query\", \"@ts-rest/serverless\", \"@ts-rest/next\"],\n angular: [\n \"@angular/core\",\n \"@angular/common\",\n \"@angular/compiler\",\n \"@angular/platform-browser\",\n \"@angular/platform-browser-dynamic\",\n \"@angular/router\",\n \"@angular/forms\",\n \"@angular/animations\",\n \"@angular-devkit/build-angular\",\n \"@angular/cli\",\n \"@angular/compiler-cli\",\n ],\n nestjs: [\"@nestjs/core\", \"@nestjs/common\", \"@nestjs/platform-express\"],\n mikro: [\n \"@mikro-orm/core\",\n \"@mikro-orm/sqlite\",\n \"@mikro-orm/postgresql\",\n \"@mikro-orm/mysql\",\n \"@mikro-orm/better-sqlite\",\n ],\n mantine: [\"@mantine/core\", \"@mantine/hooks\"],\n ark: [\"@ark-ui/react\", \"@ark-ui/vue\", \"@ark-ui/solid\", \"@ark-ui/svelte\"],\n uppy: [\n \"@uppy/core\",\n \"@uppy/dashboard\",\n \"@uppy/drag-drop\",\n \"@uppy/progress-bar\",\n \"@uppy/xhr-upload\",\n \"@uppy/tus\",\n \"@uppy/react\",\n \"@uppy/svelte\",\n \"@uppy/vue\",\n \"@uppy/angular\",\n ],\n uploadthing: [\n \"uploadthing\",\n \"@uploadthing/react\",\n \"@uploadthing/svelte\",\n \"@uploadthing/vue\",\n \"@uploadthing/solid\",\n \"@uploadthing/nuxt\",\n \"@uploadthing/expo\",\n ],\n payload: [\n \"payload\",\n \"@payloadcms/next\",\n \"@payloadcms/richtext-lexical\",\n \"@payloadcms/db-postgres\",\n \"@payloadcms/db-mongodb\",\n \"@payloadcms/db-sqlite\",\n \"@payloadcms/plugin-seo\",\n \"@payloadcms/storage-s3\",\n ],\n redwood: [\n \"@redwoodjs/core\",\n \"@redwoodjs/web\",\n \"@redwoodjs/api\",\n \"@redwoodjs/router\",\n \"@redwoodjs/forms\",\n \"@redwoodjs/graphql-server\",\n \"@redwoodjs/vite\",\n \"@redwoodjs/project-config\",\n ],\n convex: [\n \"convex\",\n \"@convex-dev/react-query\",\n \"@convex-dev/agent\",\n \"convex-svelte\",\n \"convex-nuxt\",\n \"convex-vue\",\n \"@convex-dev/better-auth\",\n ],\n cloudflare: [\n \"wrangler\",\n \"@cloudflare/vite-plugin\",\n \"@opennextjs/cloudflare\",\n \"nitro-cloudflare-dev\",\n \"@sveltejs/adapter-cloudflare\",\n \"@cloudflare/workers-types\",\n ],\n liveblocks: [\"@liveblocks/client\", \"@liveblocks/react\", \"@liveblocks/node\"],\n temporal: [\n \"@temporalio/client\",\n \"@temporalio/worker\",\n \"@temporalio/workflow\",\n \"@temporalio/activity\",\n ],\n};\n\nconst SKIP_FIELDS = new Set([\n \"name\", \"version\", \"private\", \"type\", \"main\", \"module\", \"types\",\n \"exports\", \"scripts\", \"workspaces\", \"engines\", \"packageManager\",\n \"author\", \"license\", \"description\", \"homepage\", \"repository\",\n \"bugs\", \"keywords\", \"files\", \"sideEffects\", \"browserslist\",\n \"eslintConfig\", \"prettier\", \"jest\", \"babel\",\n]);\n\nconst DEP_PATTERN = /\"(@?[a-z][a-z0-9._-]*(?:\\/[a-z][a-z0-9._-]*)?)\"\\s*:\\s*\"([~^]?[\\d][^\"]+)\"/g;\n\nexport function scanTemplateVersions(templatesDir: string): {\n templateOnly: Record<string, string>;\n versionMismatches: { name: string; mapVersion: string; templateVersion: string; file: string }[];\n} {\n const templateOnly: Record<string, string> = {};\n const versionMismatches: { name: string; mapVersion: string; templateVersion: string; file: string }[] = [];\n const seenMismatches = new Set<string>();\n\n function walkDir(dir: string) {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n walkDir(fullPath);\n } else if (entry.name === \"package.json.hbs\") {\n extractVersions(fullPath);\n }\n }\n }\n\n function extractVersions(filePath: string) {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const relPath = path.relative(templatesDir, filePath);\n\n DEP_PATTERN.lastIndex = 0;\n let match;\n\n while ((match = DEP_PATTERN.exec(content)) !== null) {\n const [, pkg, version] = match;\n if (!pkg || !version) continue;\n\n if (SKIP_FIELDS.has(pkg)) continue;\n\n if (pkg in dependencyVersionMap) {\n const mapVersion = dependencyVersionMap[pkg as keyof typeof dependencyVersionMap];\n const mismatchKey = `${relPath}|${pkg}|${version}`;\n if (mapVersion !== version && !seenMismatches.has(mismatchKey)) {\n seenMismatches.add(mismatchKey);\n versionMismatches.push({ name: pkg, mapVersion, templateVersion: version, file: relPath });\n }\n } else {\n const existing = templateOnly[pkg];\n if (!existing || compareVersions(version, existing) > 0) {\n templateOnly[pkg] = version;\n }\n }\n }\n }\n\n walkDir(templatesDir);\n return { templateOnly, versionMismatches };\n}\n\nexport function findTemplateFilesWithPackage(\n templatesDir: string,\n packageName: string,\n): { filePath: string; version: string }[] {\n const results: { filePath: string; version: string }[] = [];\n\n function walkDir(dir: string) {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n walkDir(fullPath);\n } else if (entry.name === \"package.json.hbs\") {\n const content = fs.readFileSync(fullPath, \"utf-8\");\n const escapedName = packageName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const pattern = new RegExp(`\"${escapedName}\"\\\\s*:\\\\s*\"([~^]?[\\\\d][^\"]+)\"`, \"g\");\n let match;\n while ((match = pattern.exec(content)) !== null) {\n if (match[1]) {\n results.push({ filePath: fullPath, version: match[1] });\n }\n }\n }\n }\n }\n\n walkDir(templatesDir);\n return results;\n}\n\nconst LOCKSTEP_ECOSYSTEMS = new Set([\"storybook\"]);\n\n// Cache for npm registry responses\nconst versionCache = new Map<string, { info: NpmPackageInfo; timestamp: number }>();\nconst lockstepVersionCache = new Map<string, { latest: string; timestamp: number }>();\nconst CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Parse a version string, removing any leading ^, ~, or other specifiers\n */\nexport function parseVersion(versionSpec: string): {\n major: number;\n minor: number;\n patch: number;\n raw: string;\n} {\n const raw = versionSpec.replace(/^[\\^~>=<]+/, \"\").split(\" \")[0] ?? \"\";\n const parts = raw.split(\".\");\n return {\n major: parseInt(parts[0] || \"0\", 10),\n minor: parseInt(parts[1] || \"0\", 10),\n patch: parseInt(parts[2] || \"0\", 10),\n raw,\n };\n}\n\ntype ParsedSemver = {\n major: number;\n minor: number;\n patch: number;\n prerelease: Array<number | string>;\n};\n\nfunction parseSemver(versionSpec: string): ParsedSemver {\n const raw = parseVersion(versionSpec).raw;\n const withoutBuild = raw.split(\"+\")[0] ?? raw;\n const dashIndex = withoutBuild.indexOf(\"-\");\n const core = dashIndex === -1 ? withoutBuild : withoutBuild.slice(0, dashIndex);\n const prereleasePart = dashIndex === -1 ? \"\" : withoutBuild.slice(dashIndex + 1);\n const [major = \"0\", minor = \"0\", patch = \"0\"] = core.split(\".\");\n\n return {\n major: parseInt(major, 10) || 0,\n minor: parseInt(minor, 10) || 0,\n patch: parseInt(patch, 10) || 0,\n prerelease: prereleasePart\n ? prereleasePart\n .split(\".\")\n .filter(Boolean)\n .map((id) => (/^\\d+$/.test(id) ? parseInt(id, 10) : id))\n : [],\n };\n}\n\nfunction comparePrerelease(a: Array<number | string>, b: Array<number | string>): number {\n if (a.length === 0 && b.length === 0) return 0;\n if (a.length === 0) return 1;\n if (b.length === 0) return -1;\n\n const length = Math.max(a.length, b.length);\n for (let i = 0; i < length; i++) {\n const ai = a[i];\n const bi = b[i];\n\n if (ai === undefined) return -1;\n if (bi === undefined) return 1;\n\n if (typeof ai === \"number\" && typeof bi === \"number\") {\n if (ai !== bi) return ai > bi ? 1 : -1;\n continue;\n }\n\n if (typeof ai === \"number\") return -1;\n if (typeof bi === \"number\") return 1;\n if (ai !== bi) return ai > bi ? 1 : -1;\n }\n\n return 0;\n}\n\n/**\n * Compare two semver-like specs after removing range operators.\n * Returns >0 when a > b, <0 when a < b, and 0 when equal.\n */\nexport function compareVersions(a: string, b: string): number {\n const pa = parseSemver(a);\n const pb = parseSemver(b);\n\n if (pa.major !== pb.major) return pa.major - pb.major;\n if (pa.minor !== pb.minor) return pa.minor - pb.minor;\n if (pa.patch !== pb.patch) return pa.patch - pb.patch;\n return comparePrerelease(pa.prerelease, pb.prerelease);\n}\n\n/**\n * Determine the type of update between two versions\n */\nexport function getUpdateType(current: string, latest: string): UpdateType {\n const comparison = compareVersions(latest, current);\n const curr = parseVersion(current);\n const lat = parseVersion(latest);\n\n if (comparison === 0 && curr.raw === lat.raw) return \"none\";\n if (comparison < 0) return \"downgrade\";\n if (comparison === 0) return \"patch\";\n if (lat.major > curr.major) return \"major\";\n if (lat.minor > curr.minor) return \"minor\";\n if (lat.patch > curr.patch) return \"patch\";\n if (comparison > 0) return \"patch\";\n return \"none\";\n}\n\n/**\n * Fetch the latest version of a package from npm registry\n */\nasync function fetchPackageInfo(packageName: string): Promise<NpmPackageInfo> {\n const cached = versionCache.get(packageName);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {\n return cached.info;\n }\n\n const encodedName = encodeURIComponent(packageName).replace(\"%40\", \"@\");\n const url = `https://registry.npmjs.org/${encodedName}`;\n\n const response = await fetch(url, {\n headers: { Accept: \"application/json\" },\n });\n\n if (!response.ok) {\n throw new Error(`Package ${packageName} not found (${response.status})`);\n }\n\n const info = (await response.json()) as NpmPackageInfo;\n\n versionCache.set(packageName, { info, timestamp: Date.now() });\n return info;\n}\n\nfunction getStableVersionsDescending(info: NpmPackageInfo): string[] {\n return Object.keys(info.versions || {})\n .filter((version) => !/-(alpha|beta|rc|next|canary)/.test(version))\n .sort((a, b) => compareVersions(b, a));\n}\n\nasync function fetchLatestCompatibleEcosystemVersion(ecosystem: string): Promise<string | undefined> {\n const cached = lockstepVersionCache.get(ecosystem);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {\n return cached.latest;\n }\n\n const ecosystemPackages = ECOSYSTEM_GROUPS[ecosystem]?.filter((pkg) => !pkg.endsWith(\"/*\")) ?? [];\n if (ecosystemPackages.length === 0) return undefined;\n\n const packageInfos = await Promise.all(ecosystemPackages.map((pkg) => fetchPackageInfo(pkg)));\n const [firstInfo, ...remainingInfos] = packageInfos;\n if (!firstInfo) return undefined;\n\n const sharedVersions = getStableVersionsDescending(firstInfo);\n\n for (const info of remainingInfos) {\n const stableVersions = new Set(getStableVersionsDescending(info));\n for (let i = sharedVersions.length - 1; i >= 0; i--) {\n const version = sharedVersions[i];\n if (!version || !stableVersions.has(version)) {\n sharedVersions.splice(i, 1);\n }\n }\n }\n\n const latest = sharedVersions[0];\n if (latest) {\n lockstepVersionCache.set(ecosystem, { latest, timestamp: Date.now() });\n }\n\n return latest;\n}\n\nexport async function fetchLatestVersion(\n packageName: string,\n options: { skipPrerelease?: boolean } = {},\n): Promise<string> {\n const { skipPrerelease = true } = options;\n const data = await fetchPackageInfo(packageName);\n let latest = data[\"dist-tags\"]?.latest;\n\n // If the latest is a prerelease and we want to skip prereleases,\n // find the highest stable version\n if (skipPrerelease && latest && /-(alpha|beta|rc|next|canary)/.test(latest)) {\n const versions = getStableVersionsDescending(data);\n if (versions.length > 0 && versions[0]) {\n latest = versions[0];\n }\n }\n\n if (!latest) {\n throw new Error(`No versions found for ${packageName}`);\n }\n\n return latest;\n}\n\nasync function resolveLatestVersion(packageName: string, ecosystem?: string): Promise<string> {\n if (ecosystem && LOCKSTEP_ECOSYSTEMS.has(ecosystem)) {\n const compatibleVersion = await fetchLatestCompatibleEcosystemVersion(ecosystem);\n if (compatibleVersion) {\n return compatibleVersion;\n }\n }\n\n return fetchLatestVersion(packageName);\n}\n\n/**\n * Check if a specific version exists on npm\n */\nexport async function checkVersionExists(\n packageName: string,\n versionSpec: string,\n): Promise<boolean> {\n try {\n const cleanVersion = parseVersion(versionSpec).raw;\n const encodedName = encodeURIComponent(packageName).replace(\"%40\", \"@\");\n const url = `https://registry.npmjs.org/${encodedName}`;\n\n const response = await fetch(url, {\n headers: { Accept: \"application/json\" },\n });\n\n if (!response.ok) return false;\n\n const data = (await response.json()) as NpmPackageInfo;\n const versions = Object.keys(data.versions || {});\n\n // For caret versions, check if any version satisfies the range\n if (versionSpec.startsWith(\"^\")) {\n const { major, minor, patch } = parseVersion(versionSpec);\n\n return versions.some((v) => {\n const parsed = parseVersion(v);\n if (major === 0) {\n // For ^0.Y.Z, only minor must match, patch can be >= specified\n return parsed.major === 0 && parsed.minor === minor && parsed.patch >= patch;\n } else {\n // For ^X.Y.Z (X > 0), major must match, rest can be >=\n return (\n parsed.major === major &&\n (parsed.minor > minor || (parsed.minor === minor && parsed.patch >= patch))\n );\n }\n });\n }\n\n return versions.includes(cleanVersion);\n } catch {\n return false;\n }\n}\n\n/**\n * Get the ecosystem group for a package\n */\nexport function getEcosystem(packageName: string): string | undefined {\n for (const [ecosystem, packages] of Object.entries(ECOSYSTEM_GROUPS)) {\n if (packages.includes(packageName)) {\n return ecosystem;\n }\n // Check for glob patterns like @effect/*\n for (const pattern of packages) {\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -2);\n if (packageName.startsWith(prefix + \"/\")) {\n return ecosystem;\n }\n }\n }\n }\n return undefined;\n}\n\n/**\n * Group packages by their ecosystem\n */\nexport function groupByEcosystem(packages: string[]): Record<string, string[]> {\n const grouped: Record<string, string[]> = {};\n const other: string[] = [];\n\n for (const pkg of packages) {\n const ecosystem = getEcosystem(pkg);\n if (ecosystem) {\n if (!grouped[ecosystem]) grouped[ecosystem] = [];\n grouped[ecosystem]!.push(pkg);\n } else {\n other.push(pkg);\n }\n }\n\n // Add other group if not empty\n if (other.length > 0) {\n grouped.other = other;\n }\n\n return grouped;\n}\n\nexport async function checkAllVersions(options: {\n versionMap?: Record<string, string>;\n templateVersions?: Record<string, string>;\n filter?: string[];\n ecosystem?: string;\n concurrency?: number;\n onProgress?: (checked: number, total: number, current: string) => void;\n delayMs?: number;\n}): Promise<CheckResult> {\n const {\n versionMap = dependencyVersionMap,\n templateVersions = {},\n filter,\n ecosystem,\n concurrency = 5,\n onProgress,\n delayMs = 100,\n } = options;\n\n const allPackages: Record<string, { version: string; source: string }> = {};\n for (const [pkg, version] of Object.entries(versionMap)) {\n allPackages[pkg] = { version, source: \"map\" };\n }\n for (const [pkg, version] of Object.entries(templateVersions)) {\n if (!(pkg in allPackages)) {\n allPackages[pkg] = { version, source: \"template\" };\n }\n }\n\n let packages = Object.keys(allPackages);\n\n // Filter by specific packages\n if (filter && filter.length > 0) {\n packages = packages.filter((p) => filter.includes(p));\n }\n\n // Filter by ecosystem\n if (ecosystem) {\n const ecosystemPackages = ECOSYSTEM_GROUPS[ecosystem];\n if (ecosystemPackages) {\n packages = packages.filter((p) => {\n if (ecosystemPackages.includes(p)) return true;\n // Check glob patterns\n for (const pattern of ecosystemPackages) {\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -2);\n if (p.startsWith(prefix + \"/\")) return true;\n }\n }\n return false;\n });\n }\n }\n\n const result: CheckResult = {\n outdated: [],\n upToDate: [],\n errors: [],\n };\n\n const total = packages.length;\n let checked = 0;\n\n // Process in batches for rate limiting\n for (let i = 0; i < packages.length; i += concurrency) {\n const batch = packages.slice(i, i + concurrency);\n\n const batchResults = await Promise.allSettled(\n batch.map(async (pkg) => {\n const entry = allPackages[pkg]!;\n try {\n const ecosystem = getEcosystem(pkg);\n const latest = await resolveLatestVersion(pkg, ecosystem);\n const updateType = getUpdateType(entry.version, latest);\n\n return {\n name: pkg,\n current: entry.version,\n latest: `^${latest}`,\n updateType,\n ecosystem,\n source: entry.source,\n };\n } catch (error) {\n throw { name: pkg, error: String(error) };\n }\n }),\n );\n\n for (const settled of batchResults) {\n if (settled.status === \"fulfilled\") {\n const info = settled.value as VersionInfo;\n if (info.updateType === \"none\") {\n result.upToDate.push(info);\n } else {\n result.outdated.push(info);\n }\n } else {\n const err = settled.reason as { name: string; error: string };\n result.errors.push(err);\n }\n checked++;\n onProgress?.(checked, total, batch[0] ?? \"\");\n }\n\n // Rate limiting delay between batches\n if (i + concurrency < packages.length && delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n // Sort outdated by update type (downgrade > major > minor > patch)\n const typeOrder: Record<UpdateType, number> = {\n downgrade: 0,\n major: 1,\n minor: 2,\n patch: 3,\n none: 4,\n };\n result.outdated.sort((a, b) => typeOrder[a.updateType] - typeOrder[b.updateType]);\n\n return result;\n}\n\n/**\n * Generate a markdown report of the check results\n */\nexport function generateMarkdownReport(result: CheckResult): string {\n const lines: string[] = [];\n\n lines.push(\"# Dependency Version Check Report\\n\");\n lines.push(`Generated: ${new Date().toISOString()}\\n`);\n\n // Summary\n lines.push(\"## Summary\\n\");\n const downgradeCount = result.outdated.filter((info) => info.updateType === \"downgrade\").length;\n const templateOnlyCount = result.outdated.filter((info) => info.source === \"template\").length;\n lines.push(`- **Outdated**: ${result.outdated.length}`);\n if (templateOnlyCount > 0) {\n lines.push(`- **Template-only** (not in version map): ${templateOnlyCount}`);\n }\n lines.push(`- **Downgrades detected**: ${downgradeCount}`);\n lines.push(`- **Up to date**: ${result.upToDate.length}`);\n lines.push(`- **Errors**: ${result.errors.length}\\n`);\n\n // Outdated packages\n if (result.outdated.length > 0) {\n lines.push(\"## Outdated Packages\\n\");\n\n // Group by update type\n const byType: Record<UpdateType, VersionInfo[]> = {\n downgrade: [],\n major: [],\n minor: [],\n patch: [],\n none: [],\n };\n for (const info of result.outdated) {\n byType[info.updateType].push(info);\n }\n\n if (byType.downgrade.length > 0) {\n lines.push(\"### Downgrades Detected (Manual Review Required)\\n\");\n lines.push(\"| Package | Current | Latest | Ecosystem | Source |\");\n lines.push(\"|---------|---------|--------|-----------|--------|\");\n for (const info of byType.downgrade) {\n lines.push(\n `| ${info.name} | ${info.current} | ${info.latest} | ${info.ecosystem || \"-\"} | ${info.source === \"template\" ? \"template\" : \"map\"} |`,\n );\n }\n lines.push(\"\");\n }\n\n if (byType.major.length > 0) {\n lines.push(\"### Major Updates (Breaking Changes Possible)\\n\");\n lines.push(\"| Package | Current | Latest | Ecosystem | Source |\");\n lines.push(\"|---------|---------|--------|-----------|--------|\");\n for (const info of byType.major) {\n lines.push(\n `| ${info.name} | ${info.current} | ${info.latest} | ${info.ecosystem || \"-\"} | ${info.source === \"template\" ? \"template\" : \"map\"} |`,\n );\n }\n lines.push(\"\");\n }\n\n if (byType.minor.length > 0) {\n lines.push(\"### Minor Updates\\n\");\n lines.push(\"| Package | Current | Latest | Ecosystem | Source |\");\n lines.push(\"|---------|---------|--------|-----------|--------|\");\n for (const info of byType.minor) {\n lines.push(\n `| ${info.name} | ${info.current} | ${info.latest} | ${info.ecosystem || \"-\"} | ${info.source === \"template\" ? \"template\" : \"map\"} |`,\n );\n }\n lines.push(\"\");\n }\n\n if (byType.patch.length > 0) {\n lines.push(\"### Patch Updates\\n\");\n lines.push(\"| Package | Current | Latest | Ecosystem | Source |\");\n lines.push(\"|---------|---------|--------|-----------|--------|\");\n for (const info of byType.patch) {\n lines.push(\n `| ${info.name} | ${info.current} | ${info.latest} | ${info.ecosystem || \"-\"} | ${info.source === \"template\" ? \"template\" : \"map\"} |`,\n );\n }\n lines.push(\"\");\n }\n }\n\n if (result.versionMismatches && result.versionMismatches.length > 0) {\n lines.push(\"## Version Mismatches (map vs template)\\n\");\n lines.push(\"| Package | Map Version | Template Version | Template File |\");\n lines.push(\"|---------|-------------|------------------|---------------|\");\n for (const m of result.versionMismatches) {\n lines.push(`| ${m.name} | ${m.mapVersion} | ${m.templateVersion} | ${m.file} |`);\n }\n lines.push(\"\");\n }\n\n // Errors\n if (result.errors.length > 0) {\n lines.push(\"## Errors\\n\");\n lines.push(\"| Package | Error |\");\n lines.push(\"|---------|-------|\");\n for (const err of result.errors) {\n lines.push(`| ${err.name} | ${err.error} |`);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generate a CLI-friendly table report\n */\nexport function generateCliReport(result: CheckResult): string {\n const lines: string[] = [];\n\n if (result.outdated.length === 0 && result.errors.length === 0) {\n lines.push(\"All dependencies are up to date!\");\n return lines.join(\"\\n\");\n }\n\n if (result.outdated.length > 0) {\n // Group by update type\n const byType: Record<UpdateType, VersionInfo[]> = {\n downgrade: [],\n major: [],\n minor: [],\n patch: [],\n none: [],\n };\n for (const info of result.outdated) {\n byType[info.updateType].push(info);\n }\n\n const formatRow = (info: VersionInfo) => {\n const label =\n info.updateType === \"downgrade\"\n ? \"[DOWNGRADE]\"\n : info.updateType === \"major\"\n ? \"[MAJOR]\"\n : info.updateType === \"minor\"\n ? \"[MINOR]\"\n : \"[PATCH]\";\n return ` ${label.padEnd(8)} ${info.name.padEnd(45)} ${info.current.padEnd(15)} -> ${info.latest}`;\n };\n\n if (byType.downgrade.length > 0) {\n lines.push(\"\\nDowngrades Detected (Manual Review Required):\");\n for (const info of byType.downgrade) {\n lines.push(formatRow(info));\n }\n }\n\n if (byType.major.length > 0) {\n lines.push(\"\\nMajor Updates (Breaking Changes Possible):\");\n for (const info of byType.major) {\n lines.push(formatRow(info));\n }\n }\n\n if (byType.minor.length > 0) {\n lines.push(\"\\nMinor Updates:\");\n for (const info of byType.minor) {\n lines.push(formatRow(info));\n }\n }\n\n if (byType.patch.length > 0) {\n lines.push(\"\\nPatch Updates:\");\n for (const info of byType.patch) {\n lines.push(formatRow(info));\n }\n }\n }\n\n if (result.versionMismatches && result.versionMismatches.length > 0) {\n lines.push(\"\\nVersion Mismatches (map vs template):\");\n for (const m of result.versionMismatches) {\n lines.push(` ${m.name.padEnd(45)} map: ${m.mapVersion.padEnd(15)} template: ${m.templateVersion.padEnd(15)} ${m.file}`);\n }\n }\n\n if (result.errors.length > 0) {\n lines.push(\"\\nErrors:\");\n for (const err of result.errors) {\n lines.push(` ${err.name}: ${err.error}`);\n }\n }\n\n const mismatchCount = result.versionMismatches?.length ?? 0;\n lines.push(\n `\\nSummary: ${result.outdated.length} outdated, ${result.upToDate.length} up to date, ${mismatchCount} mismatches, ${result.errors.length} errors`,\n );\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generate updated code for add-deps.ts with new versions\n */\nexport function generateUpdatedVersionMap(\n updates: VersionInfo[],\n currentMap: Record<string, string>,\n): Record<string, string> {\n const newMap = { ...currentMap };\n for (const update of updates) {\n if (update.updateType !== \"none\") {\n newMap[update.name] = update.latest;\n }\n }\n return newMap;\n}\n\n/**\n * Get the current dependency version map\n */\nexport function getDependencyVersionMap(): Record<string, string> {\n return { ...dependencyVersionMap };\n}\n\n/**\n * List all available ecosystems\n */\nexport function listEcosystems(): string[] {\n return Object.keys(ECOSYSTEM_GROUPS);\n}\n"],"mappings":";;;;;;;;;;;AAgDA,MAAaA,mBAA6C;CACxD,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS,CAAC,eAAe,cAAc;CACvC,OAAO;EACL;EACA;EACA;EACA;EACD;CACD,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,eAAe;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,WAAW;EACT;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EAAC;EAAgB;EAAgB;EAA6B;CACpE,MAAM;EAAC;EAAgB;EAAgB;EAAiB;EAAa;EAAuB;CAC5F,WAAW;EAAC;EAAiB;EAAwB;EAAuB;EAAgB;CAC5F,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,QAAQ;EAAC;EAAgB;EAAkB;EAA2B;CACtE,OAAO;EACL;EACA;EACA;EACA;EACA;EACD;CACD,SAAS,CAAC,iBAAiB,iBAAiB;CAC5C,KAAK;EAAC;EAAiB;EAAe;EAAiB;EAAiB;CACxE,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,aAAa;EACX;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACD;CACD,YAAY;EAAC;EAAsB;EAAqB;EAAmB;CAC3E,UAAU;EACR;EACA;EACA;EACA;EACD;CACF;AAED,MAAM,cAAc,IAAI,IAAI;CAC1B;CAAQ;CAAW;CAAW;CAAQ;CAAQ;CAAU;CACxD;CAAW;CAAW;CAAc;CAAW;CAC/C;CAAU;CAAW;CAAe;CAAY;CAChD;CAAQ;CAAY;CAAS;CAAe;CAC5C;CAAgB;CAAY;CAAQ;CACrC,CAAC;AAEF,MAAM,cAAc;AAEpB,SAAgB,qBAAqB,cAGnC;CACA,MAAMC,eAAuC,EAAE;CAC/C,MAAMC,oBAAmG,EAAE;CAC3G,MAAM,iCAAiB,IAAI,KAAa;CAExC,SAAS,QAAQ,KAAa;EAC5B,IAAIC;AACJ,MAAI;AACF,aAAU,GAAG,YAAY,KAAK,EAAE,eAAe,MAAM,CAAC;UAChD;AACN;;AAEF,OAAK,MAAM,SAAS,SAAS;GAC3B,MAAM,WAAW,KAAK,KAAK,KAAK,MAAM,KAAK;AAC3C,OAAI,MAAM,aAAa,CACrB,SAAQ,SAAS;YACR,MAAM,SAAS,mBACxB,iBAAgB,SAAS;;;CAK/B,SAAS,gBAAgB,UAAkB;EACzC,MAAM,UAAU,GAAG,aAAa,UAAU,QAAQ;EAClD,MAAM,UAAU,KAAK,SAAS,cAAc,SAAS;AAErD,cAAY,YAAY;EACxB,IAAI;AAEJ,UAAQ,QAAQ,YAAY,KAAK,QAAQ,MAAM,MAAM;GACnD,MAAM,GAAG,KAAK,WAAW;AACzB,OAAI,CAAC,OAAO,CAAC,QAAS;AAEtB,OAAI,YAAY,IAAI,IAAI,CAAE;AAE1B,OAAI,OAAO,sBAAsB;IAC/B,MAAM,aAAa,qBAAqB;IACxC,MAAM,cAAc,GAAG,QAAQ,GAAG,IAAI,GAAG;AACzC,QAAI,eAAe,WAAW,CAAC,eAAe,IAAI,YAAY,EAAE;AAC9D,oBAAe,IAAI,YAAY;AAC/B,uBAAkB,KAAK;MAAE,MAAM;MAAK;MAAY,iBAAiB;MAAS,MAAM;MAAS,CAAC;;UAEvF;IACL,MAAM,WAAW,aAAa;AAC9B,QAAI,CAAC,YAAY,gBAAgB,SAAS,SAAS,GAAG,EACpD,cAAa,OAAO;;;;AAM5B,SAAQ,aAAa;AACrB,QAAO;EAAE;EAAc;EAAmB;;AAG5C,SAAgB,6BACd,cACA,aACyC;CACzC,MAAMC,UAAmD,EAAE;CAE3D,SAAS,QAAQ,KAAa;EAC5B,IAAID;AACJ,MAAI;AACF,aAAU,GAAG,YAAY,KAAK,EAAE,eAAe,MAAM,CAAC;UAChD;AACN;;AAEF,OAAK,MAAM,SAAS,SAAS;GAC3B,MAAM,WAAW,KAAK,KAAK,KAAK,MAAM,KAAK;AAC3C,OAAI,MAAM,aAAa,CACrB,SAAQ,SAAS;YACR,MAAM,SAAS,oBAAoB;IAC5C,MAAM,UAAU,GAAG,aAAa,UAAU,QAAQ;IAClD,MAAM,cAAc,YAAY,QAAQ,uBAAuB,OAAO;IACtE,MAAM,UAAU,IAAI,OAAO,IAAI,YAAY,gCAAgC,IAAI;IAC/E,IAAI;AACJ,YAAQ,QAAQ,QAAQ,KAAK,QAAQ,MAAM,KACzC,KAAI,MAAM,GACR,SAAQ,KAAK;KAAE,UAAU;KAAU,SAAS,MAAM;KAAI,CAAC;;;;AAOjE,SAAQ,aAAa;AACrB,QAAO;;AAGT,MAAM,sBAAsB,IAAI,IAAI,CAAC,YAAY,CAAC;AAGlD,MAAM,+BAAe,IAAI,KAA0D;AACnF,MAAM,uCAAuB,IAAI,KAAoD;AACrF,MAAM,eAAe,MAAS;;;;AAK9B,SAAgB,aAAa,aAK3B;CACA,MAAM,MAAM,YAAY,QAAQ,cAAc,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM;CACnE,MAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,QAAO;EACL,OAAO,SAAS,MAAM,MAAM,KAAK,GAAG;EACpC,OAAO,SAAS,MAAM,MAAM,KAAK,GAAG;EACpC,OAAO,SAAS,MAAM,MAAM,KAAK,GAAG;EACpC;EACD;;AAUH,SAAS,YAAY,aAAmC;CACtD,MAAM,MAAM,aAAa,YAAY,CAAC;CACtC,MAAM,eAAe,IAAI,MAAM,IAAI,CAAC,MAAM;CAC1C,MAAM,YAAY,aAAa,QAAQ,IAAI;CAC3C,MAAM,OAAO,cAAc,KAAK,eAAe,aAAa,MAAM,GAAG,UAAU;CAC/E,MAAM,iBAAiB,cAAc,KAAK,KAAK,aAAa,MAAM,YAAY,EAAE;CAChF,MAAM,CAAC,QAAQ,KAAK,QAAQ,KAAK,QAAQ,OAAO,KAAK,MAAM,IAAI;AAE/D,QAAO;EACL,OAAO,SAAS,OAAO,GAAG,IAAI;EAC9B,OAAO,SAAS,OAAO,GAAG,IAAI;EAC9B,OAAO,SAAS,OAAO,GAAG,IAAI;EAC9B,YAAY,iBACR,eACG,MAAM,IAAI,CACV,OAAO,QAAQ,CACf,KAAK,OAAQ,QAAQ,KAAK,GAAG,GAAG,SAAS,IAAI,GAAG,GAAG,GAAI,GAC1D,EAAE;EACP;;AAGH,SAAS,kBAAkB,GAA2B,GAAmC;AACvF,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EAAG,QAAO;AAC7C,KAAI,EAAE,WAAW,EAAG,QAAO;AAC3B,KAAI,EAAE,WAAW,EAAG,QAAO;CAE3B,MAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,EAAE,OAAO;AAC3C,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;EAC/B,MAAM,KAAK,EAAE;EACb,MAAM,KAAK,EAAE;AAEb,MAAI,OAAO,OAAW,QAAO;AAC7B,MAAI,OAAO,OAAW,QAAO;AAE7B,MAAI,OAAO,OAAO,YAAY,OAAO,OAAO,UAAU;AACpD,OAAI,OAAO,GAAI,QAAO,KAAK,KAAK,IAAI;AACpC;;AAGF,MAAI,OAAO,OAAO,SAAU,QAAO;AACnC,MAAI,OAAO,OAAO,SAAU,QAAO;AACnC,MAAI,OAAO,GAAI,QAAO,KAAK,KAAK,IAAI;;AAGtC,QAAO;;;;;;AAOT,SAAgB,gBAAgB,GAAW,GAAmB;CAC5D,MAAM,KAAK,YAAY,EAAE;CACzB,MAAM,KAAK,YAAY,EAAE;AAEzB,KAAI,GAAG,UAAU,GAAG,MAAO,QAAO,GAAG,QAAQ,GAAG;AAChD,KAAI,GAAG,UAAU,GAAG,MAAO,QAAO,GAAG,QAAQ,GAAG;AAChD,KAAI,GAAG,UAAU,GAAG,MAAO,QAAO,GAAG,QAAQ,GAAG;AAChD,QAAO,kBAAkB,GAAG,YAAY,GAAG,WAAW;;;;;AAMxD,SAAgB,cAAc,SAAiB,QAA4B;CACzE,MAAM,aAAa,gBAAgB,QAAQ,QAAQ;CACnD,MAAM,OAAO,aAAa,QAAQ;CAClC,MAAM,MAAM,aAAa,OAAO;AAEhC,KAAI,eAAe,KAAK,KAAK,QAAQ,IAAI,IAAK,QAAO;AACrD,KAAI,aAAa,EAAG,QAAO;AAC3B,KAAI,eAAe,EAAG,QAAO;AAC7B,KAAI,IAAI,QAAQ,KAAK,MAAO,QAAO;AACnC,KAAI,IAAI,QAAQ,KAAK,MAAO,QAAO;AACnC,KAAI,IAAI,QAAQ,KAAK,MAAO,QAAO;AACnC,KAAI,aAAa,EAAG,QAAO;AAC3B,QAAO;;;;;AAMT,eAAe,iBAAiB,aAA8C;CAC5E,MAAM,SAAS,aAAa,IAAI,YAAY;AAC5C,KAAI,UAAU,KAAK,KAAK,GAAG,OAAO,YAAY,aAC5C,QAAO,OAAO;CAIhB,MAAM,MAAM,8BADQ,mBAAmB,YAAY,CAAC,QAAQ,OAAO,IAAI;CAGvE,MAAM,WAAW,MAAM,MAAM,KAAK,EAChC,SAAS,EAAE,QAAQ,oBAAoB,EACxC,CAAC;AAEF,KAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,WAAW,YAAY,cAAc,SAAS,OAAO,GAAG;CAG1E,MAAM,OAAQ,MAAM,SAAS,MAAM;AAEnC,cAAa,IAAI,aAAa;EAAE;EAAM,WAAW,KAAK,KAAK;EAAE,CAAC;AAC9D,QAAO;;AAGT,SAAS,4BAA4B,MAAgC;AACnE,QAAO,OAAO,KAAK,KAAK,YAAY,EAAE,CAAC,CACpC,QAAQ,YAAY,CAAC,+BAA+B,KAAK,QAAQ,CAAC,CAClE,MAAM,GAAG,MAAM,gBAAgB,GAAG,EAAE,CAAC;;AAG1C,eAAe,sCAAsC,WAAgD;CACnG,MAAM,SAAS,qBAAqB,IAAI,UAAU;AAClD,KAAI,UAAU,KAAK,KAAK,GAAG,OAAO,YAAY,aAC5C,QAAO,OAAO;CAGhB,MAAM,oBAAoB,iBAAiB,YAAY,QAAQ,QAAQ,CAAC,IAAI,SAAS,KAAK,CAAC,IAAI,EAAE;AACjG,KAAI,kBAAkB,WAAW,EAAG,QAAO;CAG3C,MAAM,CAAC,WAAW,GAAG,kBADA,MAAM,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,iBAAiB,IAAI,CAAC,CAAC;AAE7F,KAAI,CAAC,UAAW,QAAO;CAEvB,MAAM,iBAAiB,4BAA4B,UAAU;AAE7D,MAAK,MAAM,QAAQ,gBAAgB;EACjC,MAAM,iBAAiB,IAAI,IAAI,4BAA4B,KAAK,CAAC;AACjE,OAAK,IAAI,IAAI,eAAe,SAAS,GAAG,KAAK,GAAG,KAAK;GACnD,MAAM,UAAU,eAAe;AAC/B,OAAI,CAAC,WAAW,CAAC,eAAe,IAAI,QAAQ,CAC1C,gBAAe,OAAO,GAAG,EAAE;;;CAKjC,MAAM,SAAS,eAAe;AAC9B,KAAI,OACF,sBAAqB,IAAI,WAAW;EAAE;EAAQ,WAAW,KAAK,KAAK;EAAE,CAAC;AAGxE,QAAO;;AAGT,eAAsB,mBACpB,aACA,UAAwC,EAAE,EACzB;CACjB,MAAM,EAAE,iBAAiB,SAAS;CAClC,MAAM,OAAO,MAAM,iBAAiB,YAAY;CAChD,IAAI,SAAS,KAAK,cAAc;AAIhC,KAAI,kBAAkB,UAAU,+BAA+B,KAAK,OAAO,EAAE;EAC3E,MAAM,WAAW,4BAA4B,KAAK;AAClD,MAAI,SAAS,SAAS,KAAK,SAAS,GAClC,UAAS,SAAS;;AAItB,KAAI,CAAC,OACH,OAAM,IAAI,MAAM,yBAAyB,cAAc;AAGzD,QAAO;;AAGT,eAAe,qBAAqB,aAAqB,WAAqC;AAC5F,KAAI,aAAa,oBAAoB,IAAI,UAAU,EAAE;EACnD,MAAM,oBAAoB,MAAM,sCAAsC,UAAU;AAChF,MAAI,kBACF,QAAO;;AAIX,QAAO,mBAAmB,YAAY;;;;;AAMxC,eAAsB,mBACpB,aACA,aACkB;AAClB,KAAI;EACF,MAAM,eAAe,aAAa,YAAY,CAAC;EAE/C,MAAM,MAAM,8BADQ,mBAAmB,YAAY,CAAC,QAAQ,OAAO,IAAI;EAGvE,MAAM,WAAW,MAAM,MAAM,KAAK,EAChC,SAAS,EAAE,QAAQ,oBAAoB,EACxC,CAAC;AAEF,MAAI,CAAC,SAAS,GAAI,QAAO;EAEzB,MAAM,OAAQ,MAAM,SAAS,MAAM;EACnC,MAAM,WAAW,OAAO,KAAK,KAAK,YAAY,EAAE,CAAC;AAGjD,MAAI,YAAY,WAAW,IAAI,EAAE;GAC/B,MAAM,EAAE,OAAO,OAAO,UAAU,aAAa,YAAY;AAEzD,UAAO,SAAS,MAAM,MAAM;IAC1B,MAAM,SAAS,aAAa,EAAE;AAC9B,QAAI,UAAU,EAEZ,QAAO,OAAO,UAAU,KAAK,OAAO,UAAU,SAAS,OAAO,SAAS;QAGvE,QACE,OAAO,UAAU,UAChB,OAAO,QAAQ,SAAU,OAAO,UAAU,SAAS,OAAO,SAAS;KAGxE;;AAGJ,SAAO,SAAS,SAAS,aAAa;SAChC;AACN,SAAO;;;;;;AAOX,SAAgB,aAAa,aAAyC;AACpE,MAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,iBAAiB,EAAE;AACpE,MAAI,SAAS,SAAS,YAAY,CAChC,QAAO;AAGT,OAAK,MAAM,WAAW,SACpB,KAAI,QAAQ,SAAS,KAAK,EAAE;GAC1B,MAAM,SAAS,QAAQ,MAAM,GAAG,GAAG;AACnC,OAAI,YAAY,WAAW,SAAS,IAAI,CACtC,QAAO;;;;;;;AAWjB,SAAgB,iBAAiB,UAA8C;CAC7E,MAAME,UAAoC,EAAE;CAC5C,MAAMC,QAAkB,EAAE;AAE1B,MAAK,MAAM,OAAO,UAAU;EAC1B,MAAM,YAAY,aAAa,IAAI;AACnC,MAAI,WAAW;AACb,OAAI,CAAC,QAAQ,WAAY,SAAQ,aAAa,EAAE;AAChD,WAAQ,WAAY,KAAK,IAAI;QAE7B,OAAM,KAAK,IAAI;;AAKnB,KAAI,MAAM,SAAS,EACjB,SAAQ,QAAQ;AAGlB,QAAO;;AAGT,eAAsB,iBAAiB,SAQd;CACvB,MAAM,EACJ,aAAa,sBACb,mBAAmB,EAAE,EACrB,QACA,WACA,cAAc,GACd,YACA,UAAU,QACR;CAEJ,MAAMC,cAAmE,EAAE;AAC3E,MAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,WAAW,CACrD,aAAY,OAAO;EAAE;EAAS,QAAQ;EAAO;AAE/C,MAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,iBAAiB,CAC3D,KAAI,EAAE,OAAO,aACX,aAAY,OAAO;EAAE;EAAS,QAAQ;EAAY;CAItD,IAAI,WAAW,OAAO,KAAK,YAAY;AAGvC,KAAI,UAAU,OAAO,SAAS,EAC5B,YAAW,SAAS,QAAQ,MAAM,OAAO,SAAS,EAAE,CAAC;AAIvD,KAAI,WAAW;EACb,MAAM,oBAAoB,iBAAiB;AAC3C,MAAI,kBACF,YAAW,SAAS,QAAQ,MAAM;AAChC,OAAI,kBAAkB,SAAS,EAAE,CAAE,QAAO;AAE1C,QAAK,MAAM,WAAW,kBACpB,KAAI,QAAQ,SAAS,KAAK,EAAE;IAC1B,MAAM,SAAS,QAAQ,MAAM,GAAG,GAAG;AACnC,QAAI,EAAE,WAAW,SAAS,IAAI,CAAE,QAAO;;AAG3C,UAAO;IACP;;CAIN,MAAMC,SAAsB;EAC1B,UAAU,EAAE;EACZ,UAAU,EAAE;EACZ,QAAQ,EAAE;EACX;CAED,MAAM,QAAQ,SAAS;CACvB,IAAI,UAAU;AAGd,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,aAAa;EACrD,MAAM,QAAQ,SAAS,MAAM,GAAG,IAAI,YAAY;EAEhD,MAAM,eAAe,MAAM,QAAQ,WACjC,MAAM,IAAI,OAAO,QAAQ;GACvB,MAAM,QAAQ,YAAY;AAC1B,OAAI;IACF,MAAMC,cAAY,aAAa,IAAI;IACnC,MAAM,SAAS,MAAM,qBAAqB,KAAKA,YAAU;IACzD,MAAM,aAAa,cAAc,MAAM,SAAS,OAAO;AAEvD,WAAO;KACL,MAAM;KACN,SAAS,MAAM;KACf,QAAQ,IAAI;KACZ;KACA;KACA,QAAQ,MAAM;KACf;YACM,OAAO;AACd,UAAM;KAAE,MAAM;KAAK,OAAO,OAAO,MAAM;KAAE;;IAE3C,CACH;AAED,OAAK,MAAM,WAAW,cAAc;AAClC,OAAI,QAAQ,WAAW,aAAa;IAClC,MAAM,OAAO,QAAQ;AACrB,QAAI,KAAK,eAAe,OACtB,QAAO,SAAS,KAAK,KAAK;QAE1B,QAAO,SAAS,KAAK,KAAK;UAEvB;IACL,MAAM,MAAM,QAAQ;AACpB,WAAO,OAAO,KAAK,IAAI;;AAEzB;AACA,gBAAa,SAAS,OAAO,MAAM,MAAM,GAAG;;AAI9C,MAAI,IAAI,cAAc,SAAS,UAAU,UAAU,EACjD,OAAM,IAAI,SAAS,YAAY,WAAW,SAAS,QAAQ,CAAC;;CAKhE,MAAMC,YAAwC;EAC5C,WAAW;EACX,OAAO;EACP,OAAO;EACP,OAAO;EACP,MAAM;EACP;AACD,QAAO,SAAS,MAAM,GAAG,MAAM,UAAU,EAAE,cAAc,UAAU,EAAE,YAAY;AAEjF,QAAO;;;;;AAMT,SAAgB,uBAAuB,QAA6B;CAClE,MAAMC,QAAkB,EAAE;AAE1B,OAAM,KAAK,sCAAsC;AACjD,OAAM,KAAK,+BAAc,IAAI,MAAM,EAAC,aAAa,CAAC,IAAI;AAGtD,OAAM,KAAK,eAAe;CAC1B,MAAM,iBAAiB,OAAO,SAAS,QAAQ,SAAS,KAAK,eAAe,YAAY,CAAC;CACzF,MAAM,oBAAoB,OAAO,SAAS,QAAQ,SAAS,KAAK,WAAW,WAAW,CAAC;AACvF,OAAM,KAAK,mBAAmB,OAAO,SAAS,SAAS;AACvD,KAAI,oBAAoB,EACtB,OAAM,KAAK,6CAA6C,oBAAoB;AAE9E,OAAM,KAAK,8BAA8B,iBAAiB;AAC1D,OAAM,KAAK,qBAAqB,OAAO,SAAS,SAAS;AACzD,OAAM,KAAK,iBAAiB,OAAO,OAAO,OAAO,IAAI;AAGrD,KAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,QAAM,KAAK,yBAAyB;EAGpC,MAAMC,SAA4C;GAChD,WAAW,EAAE;GACb,OAAO,EAAE;GACT,OAAO,EAAE;GACT,OAAO,EAAE;GACT,MAAM,EAAE;GACT;AACD,OAAK,MAAM,QAAQ,OAAO,SACxB,QAAO,KAAK,YAAY,KAAK,KAAK;AAGpC,MAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,SAAM,KAAK,qDAAqD;AAChE,SAAM,KAAK,sDAAsD;AACjE,SAAM,KAAK,sDAAsD;AACjE,QAAK,MAAM,QAAQ,OAAO,UACxB,OAAM,KACJ,KAAK,KAAK,KAAK,KAAK,KAAK,QAAQ,KAAK,KAAK,OAAO,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,WAAW,aAAa,aAAa,MAAM,IACnI;AAEH,SAAM,KAAK,GAAG;;AAGhB,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,SAAM,KAAK,kDAAkD;AAC7D,SAAM,KAAK,sDAAsD;AACjE,SAAM,KAAK,sDAAsD;AACjE,QAAK,MAAM,QAAQ,OAAO,MACxB,OAAM,KACJ,KAAK,KAAK,KAAK,KAAK,KAAK,QAAQ,KAAK,KAAK,OAAO,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,WAAW,aAAa,aAAa,MAAM,IACnI;AAEH,SAAM,KAAK,GAAG;;AAGhB,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,SAAM,KAAK,sBAAsB;AACjC,SAAM,KAAK,sDAAsD;AACjE,SAAM,KAAK,sDAAsD;AACjE,QAAK,MAAM,QAAQ,OAAO,MACxB,OAAM,KACJ,KAAK,KAAK,KAAK,KAAK,KAAK,QAAQ,KAAK,KAAK,OAAO,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,WAAW,aAAa,aAAa,MAAM,IACnI;AAEH,SAAM,KAAK,GAAG;;AAGhB,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,SAAM,KAAK,sBAAsB;AACjC,SAAM,KAAK,sDAAsD;AACjE,SAAM,KAAK,sDAAsD;AACjE,QAAK,MAAM,QAAQ,OAAO,MACxB,OAAM,KACJ,KAAK,KAAK,KAAK,KAAK,KAAK,QAAQ,KAAK,KAAK,OAAO,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,WAAW,aAAa,aAAa,MAAM,IACnI;AAEH,SAAM,KAAK,GAAG;;;AAIlB,KAAI,OAAO,qBAAqB,OAAO,kBAAkB,SAAS,GAAG;AACnE,QAAM,KAAK,4CAA4C;AACvD,QAAM,KAAK,+DAA+D;AAC1E,QAAM,KAAK,+DAA+D;AAC1E,OAAK,MAAM,KAAK,OAAO,kBACrB,OAAM,KAAK,KAAK,EAAE,KAAK,KAAK,EAAE,WAAW,KAAK,EAAE,gBAAgB,KAAK,EAAE,KAAK,IAAI;AAElF,QAAM,KAAK,GAAG;;AAIhB,KAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,QAAM,KAAK,cAAc;AACzB,QAAM,KAAK,sBAAsB;AACjC,QAAM,KAAK,sBAAsB;AACjC,OAAK,MAAM,OAAO,OAAO,OACvB,OAAM,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,IAAI;AAE9C,QAAM,KAAK,GAAG;;AAGhB,QAAO,MAAM,KAAK,KAAK;;;;;AAMzB,SAAgB,kBAAkB,QAA6B;CAC7D,MAAMD,QAAkB,EAAE;AAE1B,KAAI,OAAO,SAAS,WAAW,KAAK,OAAO,OAAO,WAAW,GAAG;AAC9D,QAAM,KAAK,mCAAmC;AAC9C,SAAO,MAAM,KAAK,KAAK;;AAGzB,KAAI,OAAO,SAAS,SAAS,GAAG;EAE9B,MAAMC,SAA4C;GAChD,WAAW,EAAE;GACb,OAAO,EAAE;GACT,OAAO,EAAE;GACT,OAAO,EAAE;GACT,MAAM,EAAE;GACT;AACD,OAAK,MAAM,QAAQ,OAAO,SACxB,QAAO,KAAK,YAAY,KAAK,KAAK;EAGpC,MAAM,aAAa,SAAsB;AASvC,UAAO,MAPL,KAAK,eAAe,cAChB,gBACA,KAAK,eAAe,UAClB,YACA,KAAK,eAAe,UAClB,YACA,WACQ,OAAO,EAAE,CAAC,GAAG,KAAK,KAAK,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,OAAO,GAAG,CAAC,MAAM,KAAK;;AAG5F,MAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,SAAM,KAAK,kDAAkD;AAC7D,QAAK,MAAM,QAAQ,OAAO,UACxB,OAAM,KAAK,UAAU,KAAK,CAAC;;AAI/B,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,SAAM,KAAK,+CAA+C;AAC1D,QAAK,MAAM,QAAQ,OAAO,MACxB,OAAM,KAAK,UAAU,KAAK,CAAC;;AAI/B,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,SAAM,KAAK,mBAAmB;AAC9B,QAAK,MAAM,QAAQ,OAAO,MACxB,OAAM,KAAK,UAAU,KAAK,CAAC;;AAI/B,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,SAAM,KAAK,mBAAmB;AAC9B,QAAK,MAAM,QAAQ,OAAO,MACxB,OAAM,KAAK,UAAU,KAAK,CAAC;;;AAKjC,KAAI,OAAO,qBAAqB,OAAO,kBAAkB,SAAS,GAAG;AACnE,QAAM,KAAK,0CAA0C;AACrD,OAAK,MAAM,KAAK,OAAO,kBACrB,OAAM,KAAK,KAAK,EAAE,KAAK,OAAO,GAAG,CAAC,QAAQ,EAAE,WAAW,OAAO,GAAG,CAAC,aAAa,EAAE,gBAAgB,OAAO,GAAG,CAAC,GAAG,EAAE,OAAO;;AAI5H,KAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,QAAM,KAAK,YAAY;AACvB,OAAK,MAAM,OAAO,OAAO,OACvB,OAAM,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,QAAQ;;CAI7C,MAAM,gBAAgB,OAAO,mBAAmB,UAAU;AAC1D,OAAM,KACJ,cAAc,OAAO,SAAS,OAAO,aAAa,OAAO,SAAS,OAAO,eAAe,cAAc,eAAe,OAAO,OAAO,OAAO,SAC3I;AAED,QAAO,MAAM,KAAK,KAAK;;;;;AAMzB,SAAgB,0BACd,SACA,YACwB;CACxB,MAAM,SAAS,EAAE,GAAG,YAAY;AAChC,MAAK,MAAM,UAAU,QACnB,KAAI,OAAO,eAAe,OACxB,QAAO,OAAO,QAAQ,OAAO;AAGjC,QAAO;;;;;AAMT,SAAgB,0BAAkD;AAChE,QAAO,EAAE,GAAG,sBAAsB;;;;;AAMpC,SAAgB,iBAA2B;AACzC,QAAO,OAAO,KAAK,iBAAiB"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { n as GeneratorResult, r as VirtualDirectory, t as GeneratorOptions } from "./types-Jq14WnvH.mjs";
|
|
2
2
|
import { ProjectConfig } from "@better-fullstack/types";
|
|
3
|
-
import { Data } from "effect";
|
|
4
3
|
|
|
5
4
|
//#region src/core/virtual-fs.d.ts
|
|
6
5
|
|
|
@@ -48,23 +47,33 @@ declare function generateVirtualProject(options: GeneratorOptions): Promise<Gene
|
|
|
48
47
|
//#endregion
|
|
49
48
|
//#region src/templates.generated.d.ts
|
|
50
49
|
declare const EMBEDDED_TEMPLATES: Map<string, string>;
|
|
51
|
-
declare const TEMPLATE_COUNT =
|
|
50
|
+
declare const TEMPLATE_COUNT = 1313;
|
|
52
51
|
//#endregion
|
|
53
52
|
//#region src/preflight-validation.d.ts
|
|
54
|
-
declare class PreflightWarning
|
|
53
|
+
declare class PreflightWarning {
|
|
55
54
|
readonly ruleId: string;
|
|
56
55
|
readonly featureDisplayName: string;
|
|
57
56
|
readonly featureKey: keyof ProjectConfig;
|
|
58
57
|
readonly selectedValue: string | string[];
|
|
59
58
|
readonly reason: string;
|
|
60
59
|
readonly suggestions: readonly string[];
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
constructor(props: {
|
|
61
|
+
readonly ruleId: string;
|
|
62
|
+
readonly featureDisplayName: string;
|
|
63
|
+
readonly featureKey: keyof ProjectConfig;
|
|
64
|
+
readonly selectedValue: string | string[];
|
|
65
|
+
readonly reason: string;
|
|
66
|
+
readonly suggestions: readonly string[];
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
declare class PreflightResult {
|
|
63
70
|
readonly warnings: readonly PreflightWarning[];
|
|
64
|
-
|
|
71
|
+
constructor(props: {
|
|
72
|
+
readonly warnings: readonly PreflightWarning[];
|
|
73
|
+
});
|
|
65
74
|
get hasWarnings(): boolean;
|
|
66
75
|
}
|
|
67
76
|
declare const validatePreflightConfig: (config: ProjectConfig) => PreflightResult;
|
|
68
77
|
//#endregion
|
|
69
78
|
export { TEMPLATE_COUNT as a, TemplateData as c, EMBEDDED_TEMPLATES as i, VirtualFileSystem as l, PreflightWarning as n, generateVirtualProject as o, validatePreflightConfig as r, processAddonTemplates as s, PreflightResult as t };
|
|
70
|
-
//# sourceMappingURL=preflight-validation-
|
|
79
|
+
//# sourceMappingURL=preflight-validation-BAJGifyk.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight-validation-BAJGifyk.d.mts","names":[],"sources":["../src/core/virtual-fs.ts","../src/template-handlers/utils.ts","../src/template-handlers/addons.ts","../src/generator.ts","../src/templates.generated.ts","../src/preflight-validation.ts"],"sourcesContent":[],"mappings":";;;;;;;;AASA;;cAAa,iBAAA;;ECHD,QAAA,KAAA;;;;ECAU,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EAAA,OAAqB;EACpC,UAAA,CAAA,QAAA,EAAA,MAAA,CAAA,EAAA,OAAA;EACM,eAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,OAAA;EACH,KAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EACP,UAAA,CAAA,QAAA,EAAA,MAAA,CAAA,EAAA,OAAA;EAAO,OAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,MAAA,EAAA;2CFkEiC;;;EG6GrB,iBAAA,CAAA,CAAA,EAAA,MAAsB,EAAA;EAAU,YAAA,CAAA,CAAA,EAAA,MAAA;EAA2B,iBAAA,CAAA,CAAA,EAAA,MAAA;EAAR,MAAA,CAAA,QAAA,CAAA,EAAA,MAAA,CAAA,EH3EzC,gBG2EyC;EAAO,KAAA,CAAA,CAAA,EAAA,IAAA;;;;ECtLnE,QAAA,aAqr/EX;EAEW,QAAA,iBAAc;;;;;KHpr/Ef,YAAA,GAAe;;;iBCAL,qBAAA,MACf,8BACM,sBACH,gBACP;;;iBC+KmB,sBAAA,UAAgC,mBAAmB,QAAQ;;;cCtLpE,oBAAoB;cAur/EpB,cAAA;;;cCxr/EA,gBAAA;;;ELOA,SAAA,UAAA,EAAiB,MKJD,aLyGG;;;;ECxGpB,WAAA,CAAA,KAAY,EAAA;;;+BIOO;IHPT,SAAA,aAAqB,EAAA,MAAA,GAAA,MAAA,EAAA;IACpC,SAAA,MAAA,EAAA,MAAA;IACM,SAAA,WAAA,EAAA,SAAA,MAAA,EAAA;EACH,CAAA;;AACA,cGiBG,eAAA,CHjBH;8BGkBoB;;gCAEqB;EF2J7B,CAAA;EAAgC,IAAA,WAAA,CAAA,CAAA,EAAA,OAAA;;AAAmB,cEwC5D,uBFxC4D,EAAA,CAAA,MAAA,EEwCzB,aFxCyB,EAAA,GEwCT,eFxCS"}
|