@unterberg/nivel 0.2.10 → 0.2.12

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.
@@ -422,9 +422,11 @@ import path from "path";
422
422
  var GENERATED_DIRNAME = "(nivel-generated)";
423
423
  var require2 = createRequire(import.meta.url);
424
424
  var lucidePackageRoot = path.dirname(require2.resolve("lucide-react/package.json"));
425
- var lucideEsmEntryPath = path.join(lucidePackageRoot, "dist", "esm", "lucide-react.js");
426
- var lucideEsmIconsDirectoryPath = path.join(lucidePackageRoot, "dist", "esm", "icons");
427
- var lucideIconModuleNameByExportName = null;
425
+ var lucideIconsDirectoryCandidates = [
426
+ path.join(lucidePackageRoot, "dist", "esm", "icons"),
427
+ path.join(lucidePackageRoot, "dist", "icons")
428
+ ];
429
+ var lucideIconsDirectoryPath = null;
428
430
  var lucideIconNodeByName = /* @__PURE__ */ new Map();
429
431
  var writeFileIfChanged = (filePath, source) => {
430
432
  const current = fs.existsSync(filePath) ? fs.readFileSync(filePath, "utf8") : null;
@@ -525,40 +527,40 @@ var getGeneratedIconMapSource = (entries) => {
525
527
  }
526
528
  return ["{", ...entries.map(({ iconKey, iconName }) => ` ${JSON.stringify(iconKey)}: ${iconName},`), "}"].join("\n");
527
529
  };
528
- var getLucideIconModuleNameByExportName = () => {
529
- if (lucideIconModuleNameByExportName) {
530
- return lucideIconModuleNameByExportName;
531
- }
532
- const lucideEntrySource = fs.readFileSync(lucideEsmEntryPath, "utf8");
533
- const exportMap = /* @__PURE__ */ new Map();
534
- const exportPattern = /export\s+\{\s*([\s\S]*?)\s*\}\s+from\s+'\.\/icons\/([^']+)\.js';/g;
535
- for (const match of lucideEntrySource.matchAll(exportPattern)) {
536
- const exportsSource = match[1];
537
- const moduleName = match[2];
538
- if (!exportsSource || !moduleName) {
539
- continue;
540
- }
541
- for (const exportPart of exportsSource.split(",").map((value) => value.trim())) {
542
- const exportMatch = /^default as (\w+)$/.exec(exportPart);
543
- if (!exportMatch?.[1]) {
544
- continue;
545
- }
546
- exportMap.set(exportMatch[1], moduleName);
530
+ var getLucideIconsDirectoryPath = () => {
531
+ if (lucideIconsDirectoryPath) {
532
+ return lucideIconsDirectoryPath;
533
+ }
534
+ for (const candidatePath of lucideIconsDirectoryCandidates) {
535
+ if (fs.existsSync(candidatePath)) {
536
+ lucideIconsDirectoryPath = candidatePath;
537
+ return candidatePath;
547
538
  }
548
539
  }
549
- lucideIconModuleNameByExportName = exportMap;
550
- return exportMap;
540
+ throw new Error("Unable to locate lucide-react icons directory.");
541
+ };
542
+ var toLucideIconKey = (value) => {
543
+ return value.replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2").replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/([A-Za-z])([0-9])/g, "$1-$2").toLowerCase();
544
+ };
545
+ var getLucideIconKeyCandidates = (iconName) => {
546
+ const rawCandidates = [
547
+ iconName,
548
+ iconName.replace(/^Lucide/, ""),
549
+ iconName.replace(/Icon$/, ""),
550
+ iconName.replace(/^Lucide/, "").replace(/Icon$/, "")
551
+ ];
552
+ return [...new Set(rawCandidates.filter(Boolean).map(toLucideIconKey))];
551
553
  };
552
554
  var getDocsIconNode = (iconName) => {
553
555
  const cachedIconNode = lucideIconNodeByName.get(iconName);
554
556
  if (cachedIconNode) {
555
557
  return cachedIconNode;
556
558
  }
557
- const moduleName = getLucideIconModuleNameByExportName().get(iconName);
558
- if (!moduleName) {
559
+ const modulePath = getLucideIconKeyCandidates(iconName).map((iconKey) => path.join(getLucideIconsDirectoryPath(), `${iconKey}.js`)).find((candidatePath) => fs.existsSync(candidatePath));
560
+ if (!modulePath) {
559
561
  throw new Error(`Unable to resolve lucide-react module for docs icon "${iconName}".`);
560
562
  }
561
- const iconModuleSource = fs.readFileSync(path.join(lucideEsmIconsDirectoryPath, `${moduleName}.js`), "utf8");
563
+ const iconModuleSource = fs.readFileSync(modulePath, "utf8");
562
564
  const iconNodeMatch = /const __iconNode = (\[[\s\S]*?\]);\s*const /.exec(iconModuleSource);
563
565
  if (!iconNodeMatch?.[1]) {
564
566
  throw new Error(`Unable to read lucide-react icon node for docs icon "${iconName}".`);
@@ -799,6 +801,9 @@ import path3 from "path";
799
801
  var MANAGED_SCRIPT_NAMES = ["generate:docs", "predev", "prebuild", "pretypecheck"];
800
802
  var REQUIRED_DEPENDENCIES = ["@unterberg/nivel", "react", "react-dom", "vike", "vike-react"];
801
803
  var REQUIRED_DEV_DEPENDENCIES = ["vite", "typescript", "@types/react", "@types/react-dom"];
804
+ var getConsumerViteConfigFilename = (packageJson) => {
805
+ return packageJson.type === "module" ? "vite.config.ts" : "vite.config.mts";
806
+ };
802
807
  var getViteConfigTemplate = () => {
803
808
  return [
804
809
  "import { nivelTailwindVite } from '@unterberg/nivel/tailwind'",
@@ -1142,9 +1147,9 @@ var getGlobalTypesTemplate = () => {
1142
1147
  ""
1143
1148
  ].join("\n");
1144
1149
  };
1145
- var getManagedFileEntries = () => {
1150
+ var getManagedFileEntries = (packageJson) => {
1146
1151
  return [
1147
- ["vite.config.mts", getViteConfigTemplate()],
1152
+ [getConsumerViteConfigFilename(packageJson), getViteConfigTemplate()],
1148
1153
  ["pages/+docs.ts", getDocsConfigTemplate()],
1149
1154
  ["docs/docs.graph.ts", getDocsGraphTemplate()],
1150
1155
  ["docs/content/getting-started/content.mdx", getGettingStartedTemplate()],
@@ -1165,6 +1170,30 @@ var readFileIfExists = (filePath) => {
1165
1170
  }
1166
1171
  return fs2.readFileSync(filePath, "utf8");
1167
1172
  };
1173
+ var getConfigPathToWrite = (rootDir, packageJson) => {
1174
+ const expectedFilename = getConsumerViteConfigFilename(packageJson);
1175
+ const expectedPath = path3.join(rootDir, expectedFilename);
1176
+ const alternateFilename = expectedFilename === "vite.config.ts" ? "vite.config.mts" : "vite.config.ts";
1177
+ const alternatePath = path3.join(rootDir, alternateFilename);
1178
+ if (fs2.existsSync(expectedPath)) {
1179
+ return expectedFilename;
1180
+ }
1181
+ if (fs2.existsSync(alternatePath)) {
1182
+ return alternateFilename;
1183
+ }
1184
+ return expectedFilename;
1185
+ };
1186
+ var getScaffoldVisibilitySummary = (packageJson) => {
1187
+ return `Scaffolded ${getConsumerViteConfigFilename(packageJson)} and local Tailwind starter files remain visible and editable in the consumer.`;
1188
+ };
1189
+ var getManagedFileEntriesForConsumer = (rootDir, packageJson) => {
1190
+ return getManagedFileEntries(packageJson).map(([relativeFilePath, source]) => {
1191
+ if (relativeFilePath !== getConsumerViteConfigFilename(packageJson)) {
1192
+ return [relativeFilePath, source];
1193
+ }
1194
+ return [getConfigPathToWrite(rootDir, packageJson), source];
1195
+ });
1196
+ };
1168
1197
  var getTailwindBootstrapWarnings = (rootDir) => {
1169
1198
  const warnings = [];
1170
1199
  const wrapperPath = path3.join(rootDir, "pages", "+Wrapper.tsx");
@@ -1173,23 +1202,28 @@ var getTailwindBootstrapWarnings = (rootDir) => {
1173
1202
  const packageJsonPath = path3.join(rootDir, "package.json");
1174
1203
  const viteConfigMtsPath = path3.join(rootDir, "vite.config.mts");
1175
1204
  const viteConfigTsPath = path3.join(rootDir, "vite.config.ts");
1205
+ const packageJsonSource = readFileIfExists(packageJsonPath);
1206
+ const packageJson = packageJsonSource ? JSON.parse(packageJsonSource) : null;
1207
+ const expectedViteConfigFilename = getConsumerViteConfigFilename(packageJson ?? {});
1176
1208
  const viteConfigPath = fs2.existsSync(viteConfigMtsPath) ? viteConfigMtsPath : viteConfigTsPath;
1177
1209
  const viteConfigSource = readFileIfExists(viteConfigPath);
1178
1210
  if (!viteConfigSource?.includes("@unterberg/nivel/tailwind") || !viteConfigSource.includes("nivelTailwindVite()")) {
1179
1211
  warnings.push(
1180
- "vite.config.mts should use @unterberg/nivel/tailwind and call nivelTailwindVite() for the engine-owned Tailwind integration."
1212
+ `${expectedViteConfigFilename} should use @unterberg/nivel/tailwind and call nivelTailwindVite() for the engine-owned Tailwind integration.`
1181
1213
  );
1182
1214
  }
1183
- if (viteConfigPath === viteConfigTsPath) {
1184
- const packageJson = readFileIfExists(packageJsonPath);
1185
- if (packageJson) {
1186
- const parsedPackageJson = JSON.parse(packageJson);
1187
- if (parsedPackageJson.type !== "module") {
1188
- warnings.push(
1189
- 'vite.config.ts is loaded through CommonJS in packages without "type": "module". Rename it to vite.config.mts to avoid ESM-only dependency errors.'
1190
- );
1191
- }
1192
- }
1215
+ if (viteConfigPath === viteConfigTsPath && packageJson?.type !== "module") {
1216
+ warnings.push(
1217
+ 'vite.config.ts is loaded through CommonJS in packages without "type": "module". Rename it to vite.config.mts to avoid ESM-only dependency errors.'
1218
+ );
1219
+ }
1220
+ if (packageJson?.type === "module" && fs2.existsSync(viteConfigMtsPath) && !fs2.existsSync(viteConfigTsPath)) {
1221
+ warnings.push('vite.config.mts is unnecessary in packages with "type": "module". Rename it to vite.config.ts.');
1222
+ }
1223
+ if (fs2.existsSync(viteConfigMtsPath) && fs2.existsSync(viteConfigTsPath)) {
1224
+ warnings.push(
1225
+ "Both vite.config.mts and vite.config.ts exist. Keep only the expected config file for the package module type."
1226
+ );
1193
1227
  }
1194
1228
  const wrapperSource = readFileIfExists(wrapperPath);
1195
1229
  if (!wrapperSource?.includes("../styles/global.css")) {
@@ -1291,7 +1325,7 @@ var getInitSummary = (result) => {
1291
1325
  if (result.updatedScripts.length > 0) {
1292
1326
  lines.push(`Updated package.json scripts: ${result.updatedScripts.join(", ")}`);
1293
1327
  }
1294
- lines.push("Scaffolded vite.config.mts and local Tailwind starter files remain visible and editable in the consumer.");
1328
+ lines.push(getScaffoldVisibilitySummary(result.packageJson));
1295
1329
  if (result.missingDependencies.length > 0) {
1296
1330
  lines.push(`Missing dependencies: ${result.missingDependencies.join(", ")}`);
1297
1331
  } else if (!result.allDependenciesPresent) {
@@ -1309,10 +1343,12 @@ var initConsumer = (options) => {
1309
1343
  missingDependencies: [],
1310
1344
  overwrittenFiles: [],
1311
1345
  skippedFiles: [],
1312
- updatedScripts: []
1346
+ updatedScripts: [],
1347
+ packageJson: {}
1313
1348
  };
1314
1349
  const { packageJson, packageJsonPath } = readPackageJson(options.rootDir);
1315
- for (const [relativeFilePath, source] of getManagedFileEntries()) {
1350
+ result.packageJson = packageJson;
1351
+ for (const [relativeFilePath, source] of getManagedFileEntriesForConsumer(options.rootDir, packageJson)) {
1316
1352
  writeManagedFile(options.rootDir, relativeFilePath, source, options.force, result);
1317
1353
  }
1318
1354
  patchPackageScripts(packageJson, packageJsonPath, result);
@@ -1335,4 +1371,4 @@ export {
1335
1371
  getInitSummary,
1336
1372
  initConsumer
1337
1373
  };
1338
- //# sourceMappingURL=chunk-P3B7BX5L.js.map
1374
+ //# sourceMappingURL=chunk-J3PGG76S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/docs/icons.ts","../src/docs/resolveDocsConfig.ts","../src/runtime/node/codegen.ts","../src/runtime/node/loadDocsConfig.ts","../src/runtime/node/scaffold.ts"],"sourcesContent":["import type { LucideIcon } from 'lucide-react'\nimport * as lucideIcons from 'lucide-react'\n\ntype LucideModule = typeof import('lucide-react')\n\nexport type DocsIconName = {\n [Key in keyof LucideModule]: LucideModule[Key] extends LucideIcon ? Key : never\n}[keyof LucideModule]\n\nconst excludedLucideExports = new Set(['createLucideIcon', 'Icon', 'icons', 'LucideProvider', 'useLucideContext'])\n\nconst isLucideIconExport = (value: unknown) => {\n if (typeof value !== 'object' || value === null) {\n return false\n }\n\n return '$$typeof' in value && 'render' in value\n}\n\nconst docsIconNames = Object.freeze(\n Object.entries(lucideIcons)\n .filter(([name, value]) => !excludedLucideExports.has(name) && isLucideIconExport(value))\n .map(([name]) => name)\n .sort(),\n) as readonly DocsIconName[]\n\nconst docsIconNameSet = new Set<string>(docsIconNames)\n\nconst isDocsIconName = (value: string): value is DocsIconName => {\n return docsIconNameSet.has(value)\n}\n\nexport const assertDocsIconName = (value: string, context: string) => {\n if (isDocsIconName(value)) {\n return\n }\n\n throw new Error(\n `${context} must be a valid lucide-react icon export. Received \"${value}\". See https://lucide.dev/icons/`,\n )\n}\n","import { nivelAssetUrl, resolvePublicAssetUrl, withSiteBaseUrl } from '../shared/assets.js'\nimport type {\n DocsAlgoliaConfig,\n DocsBrandConfig,\n DocsConfig,\n DocsFooterConfig,\n DocsHeadConfig,\n DocsPageNode,\n DocsPartnerConfig,\n DocsSectionNode,\n DocsSidebarNode,\n ResolvedDocsAlgoliaConfig,\n ResolvedDocsBrandConfig,\n ResolvedDocsConfig,\n ResolvedDocsPage,\n ResolvedDocsPartnerConfig,\n ResolvedDocsPartnersConfig,\n ResolvedDocsSection,\n ResolvedDocsSocialConfig,\n ResolvedNavbarItem,\n ResolvedSidebarNode,\n ThemePreference,\n} from './types.js'\nimport { assertDocsIconName } from './icons.js'\n\nconst isExternalHref = (value: string) => {\n return /^(?:[a-z]+:)?\\/\\//i.test(value) || value.startsWith('mailto:') || value.startsWith('tel:')\n}\n\nconst normalizeBasePath = (value: string) => {\n const normalized = value.trim()\n\n if (!normalized) {\n throw new Error('Docs basePath must be a non-empty absolute path.')\n }\n\n if (!normalized.startsWith('/') || normalized.startsWith('//')) {\n throw new Error(`Docs basePath must start with \"/\". Received ${JSON.stringify(value)}.`)\n }\n\n if (normalized.includes('?') || normalized.includes('#')) {\n throw new Error(`Docs basePath cannot include query strings or hashes. Received ${JSON.stringify(value)}.`)\n }\n\n const collapsed = normalized.replace(/\\/+/g, '/').replace(/\\/+$/g, '')\n return collapsed === '' ? '/' : collapsed\n}\n\nconst normalizeContentDir = (value: string | undefined) => {\n const normalized = (value ?? 'docs').trim()\n\n if (!normalized) {\n throw new Error('Docs contentDir must be a non-empty project-relative path.')\n }\n\n if (normalized.startsWith('/') || normalized.startsWith('\\\\')) {\n throw new Error(`Docs contentDir must be project-relative. Received ${JSON.stringify(value)}.`)\n }\n\n if (/^[a-zA-Z]:[\\\\/]/.test(normalized)) {\n throw new Error(`Docs contentDir must be project-relative. Received ${JSON.stringify(value)}.`)\n }\n\n const segments = normalized.replaceAll('\\\\', '/').split('/')\n const resolvedSegments: string[] = []\n\n for (const segment of segments) {\n if (segment === '' || segment === '.') {\n continue\n }\n\n if (segment === '..') {\n throw new Error(`Docs contentDir cannot escape the project root. Received ${JSON.stringify(value)}.`)\n }\n\n resolvedSegments.push(segment)\n }\n\n if (resolvedSegments.length === 0) {\n throw new Error(`Docs contentDir must contain at least one path segment. Received ${JSON.stringify(value)}.`)\n }\n\n return resolvedSegments.join('/')\n}\n\nconst normalizeSlug = (value: string) => value.replace(/^\\/+|\\/+$/g, '')\n\nconst joinDocsHref = (basePath: string, slug: string) => {\n const normalizedBasePath = normalizeBasePath(basePath)\n const normalizedSlug = normalizeSlug(slug)\n\n if (!normalizedSlug) {\n return normalizedBasePath === '/' ? '/' : `${normalizedBasePath}/`\n }\n\n return normalizedBasePath === '/' ? `/${normalizedSlug}/` : `${normalizedBasePath}/${normalizedSlug}/`\n}\n\nconst normalizePathname = (value: string) => {\n const pathname = value.split('?')[0]?.split('#')[0] ?? value\n const normalized = pathname.trim().replace(/\\/+$/g, '')\n return normalized === '' ? '/' : `${normalized}/`.replace(/\\/+/g, '/')\n}\n\nexport const resolveDocsHref = (basePath: string, href: string) => {\n const normalized = href.trim()\n\n if (!normalized || normalized.startsWith('#') || isExternalHref(normalized)) {\n return null\n }\n\n const pathname = normalized.split('?')[0]?.split('#')[0] ?? normalized\n\n if (!pathname) {\n return null\n }\n\n if (pathname.startsWith('/')) {\n const normalizedPathname = normalizePathname(pathname)\n const normalizedBasePath = normalizeBasePath(basePath)\n\n if (normalizedBasePath === '/') {\n return normalizedPathname\n }\n\n return normalizedPathname === `${normalizedBasePath}/` || normalizedPathname.startsWith(`${normalizedBasePath}/`)\n ? normalizedPathname\n : null\n }\n\n if (pathname.startsWith('./') || pathname.startsWith('../')) {\n return null\n }\n\n return joinDocsHref(basePath, pathname)\n}\n\nconst normalizeSourcePath = (value: string) => {\n const segments = value.replaceAll('\\\\', '/').split('/')\n const normalizedSegments: string[] = []\n\n for (const segment of segments) {\n if (segment === '' || segment === '.') {\n continue\n }\n\n if (segment === '..') {\n normalizedSegments.pop()\n continue\n }\n\n normalizedSegments.push(segment)\n }\n\n return normalizedSegments.join('/')\n}\n\nconst getSectionHref = (items: ResolvedSidebarNode[], visibleOnly = false): string | null => {\n for (const item of items) {\n if (item.kind === 'page') {\n if (visibleOnly && !item.showInNav) {\n continue\n }\n\n return item.href\n }\n\n if (item.kind === 'group') {\n if (visibleOnly && !item.showInNav) {\n continue\n }\n\n const href = getSectionHref(item.items, visibleOnly)\n if (href) {\n return href\n }\n }\n }\n\n return null\n}\n\nconst resolveNavigationHref = (value: string, fieldName: string, basePath: string) => {\n const normalized = value.trim()\n\n if (!normalized) {\n throw new Error(`Docs ${fieldName} must be a non-empty string.`)\n }\n\n if (normalized.startsWith('#') || isExternalHref(normalized)) {\n return normalized\n }\n\n if (!normalized.startsWith('/')) {\n return joinDocsHref(basePath, normalized)\n }\n\n return normalizePathname(normalized)\n}\n\nconst resolveThemeConfig = (theme: DocsConfig['theme']) => {\n return {\n light: theme?.light ?? 'consumer-light',\n dark: theme?.dark ?? 'consumer-dark',\n defaultPreference: (theme?.defaultPreference ?? 'light') as ThemePreference,\n }\n}\n\nconst resolveFooterConfig = (footer: DocsFooterConfig | undefined) => {\n return {\n pagination: footer?.pagination ?? false,\n }\n}\n\nconst resolveRobotsConfig = (robots: DocsConfig['robots']) => {\n return robots ?? true\n}\n\nconst resolveCustomFontsConfig = (customFonts: DocsConfig['customFonts']) => {\n return customFonts ?? true\n}\n\nconst resolveBrandConfig = (brand: DocsBrandConfig | undefined, siteTitle: string): ResolvedDocsBrandConfig => {\n const text = brand?.text ?? siteTitle\n\n return {\n text,\n href: withSiteBaseUrl(brand?.href ?? '/'),\n logoLight: resolvePublicAssetUrl(brand?.logoLight),\n logoDark: resolvePublicAssetUrl(brand?.logoDark),\n logoAlt: brand?.logoAlt ?? `${text} logo`,\n }\n}\n\nconst resolveHeadConfig = (head: DocsHeadConfig | undefined, customFonts: boolean) => {\n const fontPreset = customFonts ? (head?.fontPreset ?? 'inter') : 'none'\n const defaultFontStylesheetHref = fontPreset === 'inter' ? nivelAssetUrl('fonts/fonts-inter.css') : undefined\n const defaultFontPreloadHrefs =\n fontPreset === 'inter'\n ? [\n nivelAssetUrl('fonts/inter-v20-latin-regular.woff2'),\n nivelAssetUrl('fonts/inter-v20-latin-600.woff2'),\n nivelAssetUrl('fonts/inter-v20-latin-800.woff2'),\n ]\n : []\n\n return {\n customFonts,\n faviconSvg: resolvePublicAssetUrl(head?.faviconSvg),\n faviconIco: resolvePublicAssetUrl(head?.faviconIco),\n appleTouchIcon: resolvePublicAssetUrl(head?.appleTouchIcon),\n fontPreset,\n fontStylesheetHref: head?.fontStylesheetHref ?? defaultFontStylesheetHref,\n fontPreloadHrefs: head?.fontPreloadHrefs ?? defaultFontPreloadHrefs,\n }\n}\n\nconst resolvePartnerAssetUrl = (value: string | undefined) => {\n if (!value) {\n return undefined\n }\n\n return resolvePublicAssetUrl(value)\n}\n\nconst resolvePartner = (partner: DocsPartnerConfig): ResolvedDocsPartnerConfig => {\n return {\n name: partner.name,\n href: withSiteBaseUrl(partner.href),\n logoLight: resolvePartnerAssetUrl(partner.logoLight) ?? partner.logoLight,\n logoDark: resolvePartnerAssetUrl(partner.logoDark),\n logoAlt: partner.logoAlt ?? `${partner.name} logo`,\n }\n}\n\nconst resolveSocialConfig = (social: DocsConfig['social']): ResolvedDocsSocialConfig => {\n // keep the order from the config\n return {\n ...social,\n }\n}\n\nconst resolvePartnersConfig = (partners: DocsConfig['partners']): ResolvedDocsPartnersConfig => {\n return {\n primary: (partners?.primary ?? []).map(resolvePartner),\n gold: (partners?.gold ?? []).map(resolvePartner),\n }\n}\n\nconst requireTrimmedString = (value: string, fieldName: string) => {\n const normalized = value.trim()\n\n if (!normalized) {\n throw new Error(`Docs algolia config \"${fieldName}\" must be a non-empty string.`)\n }\n\n return normalized\n}\n\nconst resolveAlgoliaConfig = (algolia: DocsAlgoliaConfig | undefined): ResolvedDocsAlgoliaConfig | null => {\n if (!algolia) {\n return null\n }\n\n return {\n appId: requireTrimmedString(algolia.appId, 'appId'),\n apiKey: requireTrimmedString(algolia.apiKey, 'apiKey'),\n indexName: requireTrimmedString(algolia.indexName, 'indexName'),\n fields: {\n href: algolia.fields?.href?.trim() || 'href',\n title: algolia.fields?.title?.trim() || 'title',\n excerpt: algolia.fields?.excerpt?.trim() || 'excerpt',\n sectionTitle: algolia.fields?.sectionTitle?.trim() || 'sectionTitle',\n },\n searchParams: algolia.searchParams ?? {},\n }\n}\n\nconst normalizeAliases = (aliases: string[] | undefined, slug: string) => {\n const normalizedAliases = new Set<string>()\n\n for (const alias of aliases ?? []) {\n const normalizedAlias = normalizeSlug(alias)\n if (!normalizedAlias || normalizedAlias === slug) {\n continue\n }\n\n normalizedAliases.add(normalizedAlias)\n }\n\n return [...normalizedAliases]\n}\n\nexport const resolveDocsConfig = (config: DocsConfig): ResolvedDocsConfig => {\n const normalizedBasePath = normalizeBasePath(config.basePath)\n const normalizedContentDir = normalizeContentDir(config.contentDir)\n const customFonts = resolveCustomFontsConfig(config.customFonts)\n\n const pageIds = new Set<string>()\n const pageSlugs = new Set<string>()\n const pageAliases = new Set<string>()\n const groupIds = new Set<string>()\n const sectionIds = new Set<string>()\n const pages: ResolvedDocsPage[] = []\n const navbarItems: ResolvedNavbarItem[] = []\n\n const resolveSidebarNodes = (nodes: DocsSidebarNode[], sectionId: string): ResolvedSidebarNode[] => {\n return nodes.map((node) => {\n if (node.kind === 'group') {\n if (groupIds.has(node.id)) {\n throw new Error(`Duplicate docs group id \"${node.id}\".`)\n }\n\n if (node.icon) {\n assertDocsIconName(node.icon, `Docs group \"${node.id}\" icon`)\n }\n\n groupIds.add(node.id)\n\n return {\n kind: 'group',\n id: node.id,\n title: node.title,\n href: node.href ? resolveNavigationHref(node.href, `group \"${node.id}\" href`, normalizedBasePath) : undefined,\n showInNav: node.showInNav ?? true,\n collapsible: node.collapsible,\n items: resolveSidebarNodes(node.items, sectionId),\n icon: node.icon,\n }\n }\n\n if (node.kind !== 'page') {\n throw new Error(`Invalid docs sidebar node: ${JSON.stringify(node)}`)\n }\n\n const pageNode = node as DocsPageNode\n const slug = normalizeSlug(pageNode.slug)\n const aliases = normalizeAliases(pageNode.aliases, slug)\n\n if (pageNode.icon) {\n assertDocsIconName(pageNode.icon, `Docs page \"${pageNode.id}\" icon`)\n }\n\n if (!slug) {\n throw new Error(`Docs page \"${pageNode.id}\" must define a non-empty slug.`)\n }\n\n if (pageIds.has(pageNode.id)) {\n throw new Error(`Duplicate docs page id \"${pageNode.id}\".`)\n }\n\n if (pageSlugs.has(slug)) {\n throw new Error(`Duplicate docs page slug \"${slug}\".`)\n }\n\n for (const alias of aliases) {\n if (pageSlugs.has(alias) || pageAliases.has(alias)) {\n throw new Error(`Duplicate docs page alias \"${alias}\".`)\n }\n }\n\n pageIds.add(pageNode.id)\n pageSlugs.add(slug)\n for (const alias of aliases) {\n pageAliases.add(alias)\n }\n\n const href = joinDocsHref(normalizedBasePath, slug)\n const page: ResolvedDocsPage = {\n ...pageNode,\n slug,\n aliases,\n href,\n aliasHrefs: aliases.map((alias) => joinDocsHref(normalizedBasePath, alias)),\n tableOfContents: pageNode.tableOfContents ?? true,\n sectionId,\n documentTitle: `${pageNode.title} | ${config.siteTitle}`,\n source: normalizeSourcePath(pageNode.source),\n }\n pages.push(page)\n\n return {\n kind: 'page',\n id: pageNode.id,\n title: pageNode.title,\n navTitle: pageNode.navTitle ?? pageNode.title,\n href,\n showInNav: pageNode.showInNav ?? true,\n icon: pageNode.icon,\n }\n })\n }\n\n const sections: ResolvedDocsSection[] = config.graph.items.map((section: DocsSectionNode) => {\n if (section.kind !== 'section') {\n throw new Error(`Top-level docs graph items must be sections. Received ${JSON.stringify(section)}`)\n }\n\n if (sectionIds.has(section.id)) {\n throw new Error(`Duplicate docs section id \"${section.id}\".`)\n }\n\n if (section.icon) {\n assertDocsIconName(section.icon, `Docs section \"${section.id}\" icon`)\n }\n\n sectionIds.add(section.id)\n\n const items = resolveSidebarNodes(section.items, section.id)\n const firstVisibleHref = getSectionHref(items, true)\n const href = section.href\n ? resolveNavigationHref(section.href, `section \"${section.id}\" href`, normalizedBasePath)\n : (firstVisibleHref ?? getSectionHref(items))\n\n if (!href) {\n throw new Error(`Docs section \"${section.id}\" must contain at least one page.`)\n }\n\n const resolvedSection: ResolvedDocsSection = {\n id: section.id,\n title: section.title,\n navTitle: section.navTitle ?? section.title,\n href,\n items,\n icon: section.icon,\n }\n\n navbarItems.push({\n id: section.id,\n title: resolvedSection.navTitle,\n href: resolvedSection.href,\n })\n\n return resolvedSection\n })\n\n if (pages.length === 0) {\n throw new Error('Docs graph must contain at least one page.')\n }\n\n return {\n siteTitle: config.siteTitle,\n siteDescription: config.siteDescription ?? null,\n robots: resolveRobotsConfig(config.robots),\n customFonts,\n basePath: normalizedBasePath,\n contentDir: normalizedContentDir,\n theme: resolveThemeConfig(config.theme),\n footer: resolveFooterConfig(config.footer),\n brand: resolveBrandConfig(config.brand, config.siteTitle),\n head: resolveHeadConfig(config.head, customFonts),\n partners: resolvePartnersConfig(config.partners),\n social: resolveSocialConfig(config.social),\n algolia: resolveAlgoliaConfig(config.algolia),\n pages,\n sections,\n navbarItems,\n }\n}\n\nexport const getResolvedPageById = (config: { pages: ResolvedDocsPage[] }, pageId: string) => {\n const page = config.pages.find((candidate) => candidate.id === pageId)\n if (!page) {\n throw new Error(`Unknown docs page id \"${pageId}\".`)\n }\n return page\n}\n","import fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport path from 'node:path'\nimport { extractDocHeadings } from '../../docs/docHeadings.js'\nimport { getDocsIconMapKey } from '../../docs/iconKeys.js'\nimport { getResolvedPageById, resolveDocsConfig } from '../../docs/resolveDocsConfig.js'\nimport type {\n DocPageData,\n DocPageLinkData,\n DocsConfig,\n DocsGlobalContextSerializableData,\n DocsIconName,\n ResolvedSidebarNode,\n} from '../../docs/types.js'\n\nconst GENERATED_DIRNAME = '(nivel-generated)'\nconst require = createRequire(import.meta.url)\nconst lucidePackageRoot = path.dirname(require.resolve('lucide-react/package.json'))\nconst lucideIconsDirectoryCandidates = [\n path.join(lucidePackageRoot, 'dist', 'esm', 'icons'),\n path.join(lucidePackageRoot, 'dist', 'icons'),\n]\n\ntype GeneratedDocsIconNode = [tagName: string, attrs: Record<string, string>][]\n\nlet lucideIconsDirectoryPath: string | null = null\nconst lucideIconNodeByName = new Map<DocsIconName, GeneratedDocsIconNode>()\n\nconst writeFileIfChanged = (filePath: string, source: string) => {\n const current = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : null\n if (current === source) {\n return\n }\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n fs.writeFileSync(filePath, source)\n}\n\nconst toPosix = (value: string) => value.split(path.sep).join(path.posix.sep)\n\nconst getRelativeImportPath = (fromDirectory: string, toFile: string) => {\n const relativePath = toPosix(path.relative(fromDirectory, toFile))\n if (relativePath.startsWith('.')) {\n return relativePath\n }\n return `./${relativePath}`\n}\n\nconst serializeData = (data: DocPageData | DocsGlobalContextSerializableData) => JSON.stringify(data, null, 2)\n\nconst collectFiles = (directoryPath: string): string[] => {\n if (!fs.existsSync(directoryPath)) {\n return []\n }\n\n const entries = fs.readdirSync(directoryPath, { withFileTypes: true })\n\n return entries.flatMap((entry) => {\n const entryPath = path.join(directoryPath, entry.name)\n return entry.isDirectory() ? collectFiles(entryPath) : [entryPath]\n })\n}\n\nconst removeEmptyDirectories = (directoryPath: string, rootPath: string) => {\n if (!fs.existsSync(directoryPath)) {\n return\n }\n\n for (const entry of fs.readdirSync(directoryPath, { withFileTypes: true })) {\n if (!entry.isDirectory()) {\n continue\n }\n\n removeEmptyDirectories(path.join(directoryPath, entry.name), rootPath)\n }\n\n if (directoryPath === rootPath) {\n return\n }\n\n if (fs.readdirSync(directoryPath).length === 0) {\n fs.rmdirSync(directoryPath)\n }\n}\n\nconst getGeneratedPageSource = (contentImportPath: string) => {\n return [\n \"import { DocsPage } from '@unterberg/nivel/client'\",\n `import Content from ${JSON.stringify(contentImportPath)}`,\n '',\n 'const Page = () => {',\n ' return <DocsPage Content={Content} />',\n '}',\n '',\n 'export default Page',\n '',\n ].join('\\n')\n}\n\nconst getGeneratedLayoutSource = () => {\n return [\n \"import { DocsRouteLayout } from '@unterberg/nivel/client'\",\n \"import type { ReactNode } from 'react'\",\n '',\n 'const Layout = ({ children }: { children: ReactNode }) => {',\n ' return <DocsRouteLayout>{children}</DocsRouteLayout>',\n '}',\n '',\n 'export default Layout',\n '',\n ].join('\\n')\n}\n\nconst getGeneratedDataSource = (data: DocPageData) => {\n return [\n \"import type { DocPageData } from '@unterberg/nivel'\",\n '',\n `const data: DocPageData = ${serializeData(data)}`,\n '',\n 'const pageData = () => {',\n ' return data',\n '}',\n '',\n 'export default pageData',\n '',\n ].join('\\n')\n}\n\ntype IconEntry = {\n iconKey: string\n iconName: DocsIconName\n}\n\nconst getSidebarIconEntries = (nodes: ResolvedSidebarNode[]): IconEntry[] => {\n return nodes.flatMap((node) => {\n const iconEntries = node.icon ? [{ iconKey: getDocsIconMapKey(node.kind, node.id), iconName: node.icon }] : []\n\n if (node.kind === 'group') {\n return [...iconEntries, ...getSidebarIconEntries(node.items)]\n }\n\n return iconEntries\n })\n}\n\nconst getGeneratedIconMapSource = (entries: IconEntry[]) => {\n if (entries.length === 0) {\n return '{}'\n }\n\n return ['{', ...entries.map(({ iconKey, iconName }) => ` ${JSON.stringify(iconKey)}: ${iconName},`), '}'].join('\\n')\n}\n\nconst getLucideIconsDirectoryPath = () => {\n if (lucideIconsDirectoryPath) {\n return lucideIconsDirectoryPath\n }\n\n for (const candidatePath of lucideIconsDirectoryCandidates) {\n if (fs.existsSync(candidatePath)) {\n lucideIconsDirectoryPath = candidatePath\n return candidatePath\n }\n }\n\n throw new Error('Unable to locate lucide-react icons directory.')\n}\n\nconst toLucideIconKey = (value: string) => {\n return value\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Za-z])([0-9])/g, '$1-$2')\n .toLowerCase()\n}\n\nconst getLucideIconKeyCandidates = (iconName: DocsIconName) => {\n const rawCandidates = [\n iconName,\n iconName.replace(/^Lucide/, ''),\n iconName.replace(/Icon$/, ''),\n iconName.replace(/^Lucide/, '').replace(/Icon$/, ''),\n ]\n\n return [...new Set(rawCandidates.filter(Boolean).map(toLucideIconKey))]\n}\n\nconst getDocsIconNode = (iconName: DocsIconName) => {\n const cachedIconNode = lucideIconNodeByName.get(iconName)\n\n if (cachedIconNode) {\n return cachedIconNode\n }\n\n const modulePath = getLucideIconKeyCandidates(iconName)\n .map((iconKey) => path.join(getLucideIconsDirectoryPath(), `${iconKey}.js`))\n .find((candidatePath) => fs.existsSync(candidatePath))\n\n if (!modulePath) {\n throw new Error(`Unable to resolve lucide-react module for docs icon \"${iconName}\".`)\n }\n\n const iconModuleSource = fs.readFileSync(modulePath, 'utf8')\n const iconNodeMatch = /const __iconNode = (\\[[\\s\\S]*?\\]);\\s*const /.exec(iconModuleSource)\n\n if (!iconNodeMatch?.[1]) {\n throw new Error(`Unable to read lucide-react icon node for docs icon \"${iconName}\".`)\n }\n\n const iconNode = Function(`\"use strict\"; return (${iconNodeMatch[1]})`)() as GeneratedDocsIconNode\n lucideIconNodeByName.set(iconName, iconNode)\n return iconNode\n}\n\nconst getGeneratedIconDefinitionsSource = (iconNames: DocsIconName[]) => {\n if (iconNames.length === 0) {\n return []\n }\n\n const definitions = iconNames.flatMap((iconName) => {\n return [`const ${iconName} = createDocsIcon(${JSON.stringify(getDocsIconNode(iconName))})`, '']\n })\n\n return [\n \"import { createElement, forwardRef, type SVGProps } from 'react'\",\n '',\n 'type DocsGeneratedIconProps = SVGProps<SVGSVGElement> & {',\n ' size?: string | number',\n ' absoluteStrokeWidth?: boolean',\n '}',\n '',\n 'type DocsGeneratedIconNode = [tagName: string, attrs: Record<string, string>][]',\n '',\n 'const docsGeneratedIconSvgAttrs = {',\n \" xmlns: 'http://www.w3.org/2000/svg',\",\n \" fill: 'none',\",\n \" viewBox: '0 0 24 24',\",\n \" stroke: 'currentColor',\",\n ' strokeWidth: 2,',\n \" strokeLinecap: 'round',\",\n \" strokeLinejoin: 'round',\",\n '} as const',\n '',\n 'const createDocsIcon = (iconNode: DocsGeneratedIconNode) => {',\n ' return forwardRef<SVGSVGElement, DocsGeneratedIconProps>(',\n ' ({ color = \"currentColor\", size = 24, strokeWidth = 2, absoluteStrokeWidth, children, ...props }, ref) => {',\n \" const resolvedSize = typeof size === 'number' ? size : Number(size)\",\n ' const resolvedStrokeWidth =',\n ' absoluteStrokeWidth && Number.isFinite(resolvedSize) && resolvedSize > 0',\n ' ? (Number(strokeWidth) * 24) / resolvedSize',\n ' : strokeWidth',\n '',\n ' return createElement(',\n \" 'svg',\",\n ' {',\n ' ...docsGeneratedIconSvgAttrs,',\n ' ...props,',\n ' ref,',\n ' width: size,',\n ' height: size,',\n ' stroke: color,',\n ' strokeWidth: resolvedStrokeWidth,',\n ' },',\n ' ...iconNode.map(([tagName, attrs]) => createElement(tagName, attrs)),',\n ' children,',\n ' )',\n ' },',\n ' )',\n '}',\n '',\n ...definitions,\n ]\n}\n\nconst getGeneratedGlobalContextSource = (data: DocsGlobalContextSerializableData) => {\n const iconEntries = data.sidebarSections.flatMap((section) => {\n const sectionIconEntries = section.icon\n ? [{ iconKey: getDocsIconMapKey('section', section.id), iconName: section.icon }]\n : []\n\n return [...sectionIconEntries, ...getSidebarIconEntries(section.items)]\n })\n const iconImports = [...new Set(iconEntries.map(({ iconName }) => iconName))].sort()\n\n return [\n \"import type { DocsGlobalContextData, DocsGlobalContextSerializableData, DocsIconMap } from '@unterberg/nivel'\",\n ...getGeneratedIconDefinitionsSource(iconImports),\n '',\n `const docsGlobalContextSerializableData: DocsGlobalContextSerializableData = ${serializeData(data)}`,\n '',\n `const docsIconMap: DocsIconMap = ${getGeneratedIconMapSource(iconEntries)}`,\n '',\n 'const docsGlobalContextData: DocsGlobalContextData = {',\n ' ...docsGlobalContextSerializableData,',\n ' docsIconMap,',\n '}',\n '',\n 'export { docsGlobalContextData }',\n '',\n ].join('\\n')\n}\n\nconst getRouteString = (href: string) => {\n if (href === '/') {\n return href\n }\n\n return href.replace(/\\/+$/g, '')\n}\n\nconst getGeneratedRouteSource = (href: string) => {\n return [`export default ${JSON.stringify(getRouteString(href))}`, ''].join('\\n')\n}\n\nconst getGeneratedTextExport = (value: string) => {\n return [`export default ${JSON.stringify(value)}`, ''].join('\\n')\n}\n\nconst toDocPageLinkData = (\n page:\n | {\n id: string\n title: string\n href: string\n documentTitle: string\n }\n | undefined,\n): DocPageLinkData | null => {\n if (!page) {\n return null\n }\n\n return {\n id: page.id,\n title: page.title,\n href: page.href,\n documentTitle: page.documentTitle,\n }\n}\n\nexport const getGeneratedPagesRoot = (rootDir: string) => path.join(rootDir, 'pages', GENERATED_DIRNAME)\n\nexport type DocsSourcePaths = {\n contentRootPath: string\n docsConfigPath: string\n docsGraphPath: string\n generatedRootPath: string\n}\n\nconst getDocsConfigPath = (rootDir: string) => path.join(rootDir, 'pages', '+docs.ts')\n\nconst getDocsGraphPath = (rootDir: string) => path.join(rootDir, 'docs', 'docs.graph.ts')\n\nexport const getDocsSourcePaths = (options: { rootDir: string; docsConfig: DocsConfig }): DocsSourcePaths => {\n const resolved = resolveDocsConfig(options.docsConfig)\n\n return {\n contentRootPath: path.join(options.rootDir, resolved.contentDir),\n docsConfigPath: getDocsConfigPath(options.rootDir),\n docsGraphPath: getDocsGraphPath(options.rootDir),\n generatedRootPath: getGeneratedPagesRoot(options.rootDir),\n }\n}\n\nexport const isDocsSourcePath = (filePath: string, docsSourcePaths: DocsSourcePaths) => {\n const normalized = toPosix(filePath)\n if (isGeneratedDocsPath(filePath, docsSourcePaths)) {\n return false\n }\n\n const docsConfigPath = toPosix(docsSourcePaths.docsConfigPath)\n const docsGraphPath = toPosix(docsSourcePaths.docsGraphPath)\n const contentRootPath = toPosix(docsSourcePaths.contentRootPath)\n\n return (\n normalized === docsConfigPath ||\n normalized === docsGraphPath ||\n normalized === contentRootPath ||\n normalized.startsWith(`${contentRootPath}/`)\n )\n}\n\nexport const isGeneratedDocsPath = (filePath: string, docsSourcePaths: DocsSourcePaths) => {\n const normalized = toPosix(filePath)\n const generatedRootPath = toPosix(docsSourcePaths.generatedRootPath)\n\n return normalized.startsWith(generatedRootPath)\n}\n\nexport const syncGeneratedDocsPages = (options: { rootDir: string; docsConfig: DocsConfig }) => {\n const { rootDir, docsConfig } = options\n const resolved = resolveDocsConfig(docsConfig)\n const generatedPagesRoot = getGeneratedPagesRoot(rootDir)\n const docsContentRoot = path.join(rootDir, resolved.contentDir)\n const expectedFiles = new Set<string>()\n const globalContextFilePath = path.join(generatedPagesRoot, '_docsGlobalContext.ts')\n const layoutFilePath = path.join(generatedPagesRoot, '+Layout.tsx')\n\n fs.mkdirSync(generatedPagesRoot, { recursive: true })\n\n const globalContextData: DocsGlobalContextSerializableData = {\n siteTitle: resolved.siteTitle,\n robots: resolved.robots,\n basePath: resolved.basePath,\n theme: resolved.theme,\n footer: resolved.footer,\n brand: resolved.brand,\n head: resolved.head,\n partners: resolved.partners,\n social: resolved.social,\n algolia: resolved.algolia,\n pages: resolved.pages,\n navbarItems: resolved.navbarItems,\n sidebarSections: resolved.sections,\n }\n\n writeFileIfChanged(globalContextFilePath, getGeneratedGlobalContextSource(globalContextData))\n writeFileIfChanged(layoutFilePath, getGeneratedLayoutSource())\n expectedFiles.add(globalContextFilePath)\n expectedFiles.add(layoutFilePath)\n\n for (const [pageIndex, page] of resolved.pages.entries()) {\n const contentFilePath = path.join(docsContentRoot, page.source)\n\n if (!fs.existsSync(contentFilePath)) {\n throw new Error(`Docs page \"${page.id}\" points to missing source file: ${contentFilePath}`)\n }\n\n const pageSource = fs.readFileSync(contentFilePath, 'utf8')\n const data: DocPageData = {\n page: getResolvedPageById(resolved, page.id),\n headings: extractDocHeadings(pageSource),\n previousPage: toDocPageLinkData(resolved.pages[pageIndex - 1]),\n nextPage: toDocPageLinkData(resolved.pages[pageIndex + 1]),\n }\n\n const routeTargets = [\n { routeHref: page.href, routePath: page.slug },\n ...page.aliases.map((routePath, index) => ({\n routeHref: page.aliasHrefs[index] as string,\n routePath,\n })),\n ]\n\n for (const { routeHref, routePath } of routeTargets) {\n const pageDir = path.join(generatedPagesRoot, ...routePath.split('/'))\n const contentImportPath = getRelativeImportPath(pageDir, contentFilePath)\n\n const pageFilePath = path.join(pageDir, '+Page.tsx')\n const dataFilePath = path.join(pageDir, '+data.ts')\n const routeFilePath = path.join(pageDir, '+route.ts')\n const titleFilePath = path.join(pageDir, '+title.ts')\n\n writeFileIfChanged(pageFilePath, getGeneratedPageSource(contentImportPath))\n writeFileIfChanged(dataFilePath, getGeneratedDataSource(data))\n writeFileIfChanged(routeFilePath, getGeneratedRouteSource(routeHref))\n writeFileIfChanged(titleFilePath, getGeneratedTextExport(page.documentTitle))\n\n expectedFiles.add(pageFilePath)\n expectedFiles.add(dataFilePath)\n expectedFiles.add(routeFilePath)\n expectedFiles.add(titleFilePath)\n\n if (page.description) {\n const descriptionFilePath = path.join(pageDir, '+description.ts')\n writeFileIfChanged(descriptionFilePath, getGeneratedTextExport(page.description))\n expectedFiles.add(descriptionFilePath)\n }\n }\n }\n\n for (const filePath of collectFiles(generatedPagesRoot)) {\n if (expectedFiles.has(filePath)) {\n continue\n }\n\n fs.rmSync(filePath, { force: true })\n }\n\n removeEmptyDirectories(generatedPagesRoot, generatedPagesRoot)\n}\n","import path from 'node:path'\nimport type { DocsConfig } from '../../docs/types.js'\n\nconst getDocsConfigModulePath = (rootDir: string) => {\n return path.join(rootDir, 'pages', '+docs.ts')\n}\n\nconst getDocsConfigFromLoadedModule = (loaded: unknown, modulePath: string) => {\n const docsConfig = (loaded as { default?: DocsConfig }).default\n\n if (!docsConfig) {\n throw new Error(`Expected default export from ${modulePath}`)\n }\n\n return docsConfig\n}\n\nexport const loadDocsConfig = async (options: {\n rootDir: string\n loadModule: (modulePath: string) => Promise<unknown>\n}) => {\n const modulePath = getDocsConfigModulePath(options.rootDir)\n const loaded = await options.loadModule(modulePath)\n return getDocsConfigFromLoadedModule(loaded, modulePath)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nconst MANAGED_SCRIPT_NAMES = ['generate:docs', 'predev', 'prebuild', 'pretypecheck'] as const\n\nconst REQUIRED_DEPENDENCIES = ['@unterberg/nivel', 'react', 'react-dom', 'vike', 'vike-react'] as const\nconst REQUIRED_DEV_DEPENDENCIES = ['vite', 'typescript', '@types/react', '@types/react-dom'] as const\n\ntype InitConsumerOptions = { force: boolean; rootDir: string }\n\ntype InitConsumerResult = {\n allDependenciesPresent: boolean\n createdFiles: string[]\n missingDependencies: string[]\n overwrittenFiles: string[]\n packageJson: PackageJsonShape\n skippedFiles: string[]\n updatedScripts: string[]\n}\n\ntype PackageJsonShape = {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n packageManager?: string\n scripts?: Record<string, string>\n type?: string\n}\n\nconst getConsumerViteConfigFilename = (packageJson: PackageJsonShape) => {\n return packageJson.type === 'module' ? 'vite.config.ts' : 'vite.config.mts'\n}\n\nconst getViteConfigTemplate = () => {\n return [\n \"import { nivelTailwindVite } from '@unterberg/nivel/tailwind'\",\n \"import vike from 'vike/plugin'\",\n '',\n 'process.env.VIKE_CRAWL ??= JSON.stringify({ git: false })',\n '',\n 'const base = (() => {',\n \" const normalized = process.env.PAGES_BASE_PATH?.trim().replace(/^\\\\/+|\\\\/+$/g, '') ?? ''\",\n \" return normalized ? `/${normalized}/` : '/'\",\n '})()',\n '',\n 'export default {',\n ' base,',\n ' plugins: [nivelTailwindVite(), vike()],',\n '}',\n '',\n ].join('\\n')\n}\n\nconst getDocsConfigTemplate = () => {\n return [\n \"import type { DocsConfig } from '@unterberg/nivel'\",\n \"import { docsGraph } from '../docs/docs.graph'\",\n '',\n 'const docsConfig = {',\n ' graph: docsGraph,',\n \" siteTitle: 'My Docs',\",\n \" siteDescription: 'Documentation site powered by @unterberg/nivel.',\",\n ' // Add siteUrl to enable automatic sitemap.xml and robots.txt generation.',\n \" // siteUrl: 'https://docs.example.com',\",\n ' // Set robots to false to emit noindex/nofollow and a disallow-all robots.txt.',\n ' // robots: false,',\n ' // Set customFonts to false if you want to fully own font loading in consumer CSS.',\n ' // customFonts: false,',\n \" basePath: '/docs',\",\n '} satisfies DocsConfig',\n '',\n 'export default docsConfig',\n '',\n ].join('\\n')\n}\n\nconst getDocsGraphTemplate = () => {\n return [\n \"import type { DocsGraph } from '@unterberg/nivel'\",\n '',\n 'export const docsGraph = {',\n ' items: [',\n ' {',\n \" kind: 'section',\",\n \" id: 'docs',\",\n \" title: 'Docs',\",\n ' items: [',\n ' {',\n \" kind: 'page',\",\n \" id: 'gettingStarted',\",\n \" title: 'Getting Started',\",\n \" slug: 'getting-started',\",\n \" source: 'content/getting-started/content.mdx',\",\n \" description: 'Getting started with @unterberg/nivel.',\",\n ' },',\n ' ],',\n ' },',\n ' ],',\n '} satisfies DocsGraph',\n '',\n ].join('\\n')\n}\n\nconst getGettingStartedTemplate = () => {\n return [\n 'This page is scaffolded by `nivel init` and wired through `docs/docs.graph.ts`.',\n '',\n '## Next steps',\n '',\n '- Update `pages/+docs.ts` with your site metadata.',\n '- Expand `docs/docs.graph.ts` with your docs structure.',\n '- Replace this page with your real getting-started guide.',\n '',\n ].join('\\n')\n}\n\nconst getLandingPageTemplate = () => {\n return [\n \"import { Link, LayoutComponent } from '@unterberg/nivel'\",\n '',\n '<LayoutComponent>',\n '# Welcome',\n '',\n 'This starter page is scaffolded by `nivel init` so the app can boot before you build a custom landing page.',\n '',\n '<Link href=\"/docs/getting-started/\">Read the getting started guide</Link>',\n '</LayoutComponent>',\n ].join('\\n')\n}\n\nconst getConfigTemplate = () => {\n return [\n \"import { createNivelVikeConfig } from '@unterberg/nivel/vike'\",\n \"import docsConfig from './+docs'\",\n '',\n 'const config = {',\n ' ...createNivelVikeConfig(docsConfig),',\n '',\n ' // User-facing Vike levers stay visible in +config.ts.',\n ' prerender: true,',\n ' // ssr: true,',\n \" // prefetchStaticAssets: 'viewport',\",\n '}',\n '',\n 'export default config',\n '',\n ].join('\\n')\n}\n\nconst getHeadTemplate = () => {\n return [\n \"import { MetaHead } from '@unterberg/nivel/client'\",\n '',\n 'export const Head = () => {',\n ' return <MetaHead />',\n '}',\n '',\n ].join('\\n')\n}\n\nconst getLayoutTemplate = () => {\n return [\n \"import { AppLayout } from '@unterberg/nivel/client'\",\n \"import type { ReactNode } from 'react'\",\n '',\n 'const Layout = ({ children }: { children: ReactNode }) => {',\n ' return <AppLayout>{children}</AppLayout>',\n '}',\n '',\n 'export default Layout',\n '',\n ].join('\\n')\n}\n\nconst getGlobalContextTemplate = () => {\n return [\n \"import { docsGlobalContextData } from './(nivel-generated)/_docsGlobalContext'\",\n '',\n 'export const onCreateGlobalContext = (globalContext: { docs?: typeof docsGlobalContextData }) => {',\n ' globalContext.docs = docsGlobalContextData',\n '}',\n '',\n ].join('\\n')\n}\n\nconst getWrapperTemplate = () => {\n return [\n \"import type { ReactNode } from 'react'\",\n \"import '../styles/global.css'\",\n '',\n 'const Wrapper = ({ children }: { children: ReactNode }) => {',\n ' return <>{children}</>',\n '}',\n '',\n 'export default Wrapper',\n '',\n ].join('\\n')\n}\n\nconst getGlobalStyleTemplate = () => {\n return [\n \"@import '@unterberg/nivel/tailwind.css';\",\n \"@import './theme.css';\",\n '',\n \"@source '../pages';\",\n \"@source '../docs';\",\n '',\n '@layer base {',\n ' html,',\n ' body {',\n ' @apply bg-base-100 text-base-content font-sans antialiased md:subpixel-antialiased;',\n ' }',\n '',\n ' .prose-container {',\n ' @apply prose prose-neutral max-w-none dark:prose-invert;',\n ' @apply prose-a:text-primary;',\n ' @apply prose-pre:bg-base-200!;',\n ' @apply prose-code:rounded!;',\n ' @apply prose-code:bg-primary/5!;',\n ' @apply prose-code:border-primary/15!;',\n ' @apply prose-code:dark:bg-primary/10!;',\n ' @apply prose-code:dark:border-primary/20!;',\n ' @apply prose-p:leading-[180%];',\n ' @apply prose-li:leading-[180%];',\n ' @apply prose-p:after:content-none;',\n ' @apply prose-p:before:content-none;',\n ' @apply prose-blockquote:not-italic;',\n ' @apply prose-blockquote:bg-base-200;',\n ' @apply prose-blockquote:py-2;',\n ' }',\n '',\n ' .prose-container :where(p, li, blockquote, td, th, a) {',\n ' overflow-wrap: anywhere;',\n ' word-break: break-word;',\n ' }',\n '}',\n '',\n ].join('\\n')\n}\n\nconst getThemeTemplate = () => {\n return [\n '@custom-variant dark (&:where(',\n \" [data-theme='consumer-dark'],\",\n \" [data-theme='consumer-dark'] *\",\n ' ));',\n '',\n \"@plugin '@unterberg/nivel/daisyui-theme' {\",\n \" name: 'consumer-light';\",\n ' default: true;',\n ' prefersdark: false;',\n \" color-scheme: 'light';\",\n ' --color-base-100: #f6f6f4;',\n ' --color-base-200: #ffffff;',\n ' --color-base-300: #ecebe7;',\n ' --color-base-content: #171717;',\n ' --color-primary: #0f766e;',\n ' --color-primary-content: #f8fafc;',\n ' --color-secondary: #d97706;',\n ' --color-secondary-content: #111827;',\n ' --color-accent: #1d4ed8;',\n ' --color-accent-content: #f8fafc;',\n ' --color-neutral: #171717;',\n ' --color-neutral-content: #f8fafc;',\n ' --color-info: #2563eb;',\n ' --color-info-content: #eff6ff;',\n ' --color-success: #15803d;',\n ' --color-success-content: #f0fdf4;',\n ' --color-warning: #d97706;',\n ' --color-warning-content: #fff7ed;',\n ' --color-error: #dc2626;',\n ' --color-error-content: #fef2f2;',\n ' --radius-selector: 0.25rem;',\n ' --radius-field: 0.5rem;',\n ' --radius-box: 1rem;',\n ' --size-selector: 0.25rem;',\n ' --size-field: 0.25rem;',\n ' --border: 1px;',\n ' --depth: 0;',\n ' --noise: 0;',\n '}',\n '',\n \"@plugin '@unterberg/nivel/daisyui-theme' {\",\n \" name: 'consumer-dark';\",\n ' default: false;',\n ' prefersdark: false;',\n \" color-scheme: 'dark';\",\n ' --color-base-100: #151515;',\n ' --color-base-200: #1e1e1e;',\n ' --color-base-300: #2a2a2a;',\n ' --color-base-content: #ededed;',\n ' --color-primary: #2dd4bf;',\n ' --color-primary-content: #042f2e;',\n ' --color-secondary: #f59e0b;',\n ' --color-secondary-content: #1c1917;',\n ' --color-accent: #60a5fa;',\n ' --color-accent-content: #172554;',\n ' --color-neutral: #ededed;',\n ' --color-neutral-content: #171717;',\n ' --color-info: #60a5fa;',\n ' --color-info-content: #172554;',\n ' --color-success: #4ade80;',\n ' --color-success-content: #052e16;',\n ' --color-warning: #fbbf24;',\n ' --color-warning-content: #451a03;',\n ' --color-error: #f87171;',\n ' --color-error-content: #450a0a;',\n ' --radius-selector: 0.25rem;',\n ' --radius-field: 0.5rem;',\n ' --radius-box: 1rem;',\n ' --size-selector: 0.25rem;',\n ' --size-field: 0.25rem;',\n ' --border: 1px;',\n ' --depth: 0;',\n ' --noise: 0;',\n '}',\n '',\n '@theme inline {',\n ' --color-base-muted: color-mix(',\n ' in oklab,',\n ' var(--color-base-content) 65%,',\n ' transparent',\n ' );',\n ' --color-base-muted-medium: color-mix(',\n ' in oklab,',\n ' var(--color-base-content) 40%,',\n ' transparent',\n ' );',\n ' --color-base-muted-light: color-mix(',\n ' in oklab,',\n ' var(--color-base-content) 12%,',\n ' transparent',\n ' );',\n ' --color-base-muted-superlight: color-mix(',\n ' in oklab,',\n ' var(--color-base-content) 5%,',\n ' transparent',\n ' );',\n ' --color-primary-muted: color-mix(',\n ' in oklab,',\n ' var(--color-primary) 80%,',\n ' transparent',\n ' );',\n ' --color-primary-muted-medium: color-mix(',\n ' in oklab,',\n ' var(--color-primary) 50%,',\n ' transparent',\n ' );',\n ' --color-primary-muted-light: color-mix(',\n ' in oklab,',\n ' var(--color-primary) 20%,',\n ' transparent',\n ' );',\n ' --color-primary-muted-superlight: color-mix(',\n ' in oklab,',\n ' var(--color-primary) 5%,',\n ' transparent',\n ' );',\n \" --font-sans: 'Inter', 'Helvetica Neue', sans-serif;\",\n ' --font-mono:',\n \" 'Monaco', 'SF Mono', SF Mono, SF Mono Regular, Consolas, 'Liberation Mono',\",\n ' Menlo, Courier, monospace;',\n '}',\n '',\n ].join('\\n')\n}\n\nconst getGlobalTypesTemplate = () => {\n return [\n \"declare module '*.mdx' {\",\n \" import type { ComponentType } from 'react'\",\n '',\n ' const MdxComponent: ComponentType',\n ' export default MdxComponent',\n '}',\n '',\n \"declare module '*.css'\",\n '',\n 'declare global {',\n ' namespace Vike {',\n ' interface GlobalContext {',\n \" docs: import('@unterberg/nivel').DocsGlobalContextData\",\n ' }',\n ' }',\n '}',\n '',\n ].join('\\n')\n}\n\nconst getManagedFileEntries = (packageJson: PackageJsonShape) => {\n return [\n [getConsumerViteConfigFilename(packageJson), getViteConfigTemplate()],\n ['pages/+docs.ts', getDocsConfigTemplate()],\n ['docs/docs.graph.ts', getDocsGraphTemplate()],\n ['docs/content/getting-started/content.mdx', getGettingStartedTemplate()],\n ['pages/index/+Page.mdx', getLandingPageTemplate()],\n ['pages/+config.ts', getConfigTemplate()],\n ['pages/+Head.tsx', getHeadTemplate()],\n ['pages/+Layout.tsx', getLayoutTemplate()],\n ['pages/+onCreateGlobalContext.ts', getGlobalContextTemplate()],\n ['pages/+Wrapper.tsx', getWrapperTemplate()],\n ['styles/global.css', getGlobalStyleTemplate()],\n ['styles/theme.css', getThemeTemplate()],\n ['global.d.ts', getGlobalTypesTemplate()],\n ] as const\n}\n\nconst readFileIfExists = (filePath: string) => {\n if (!fs.existsSync(filePath)) {\n return null\n }\n\n return fs.readFileSync(filePath, 'utf8')\n}\n\nconst getConfigPathToWrite = (rootDir: string, packageJson: PackageJsonShape) => {\n const expectedFilename = getConsumerViteConfigFilename(packageJson)\n const expectedPath = path.join(rootDir, expectedFilename)\n const alternateFilename = expectedFilename === 'vite.config.ts' ? 'vite.config.mts' : 'vite.config.ts'\n const alternatePath = path.join(rootDir, alternateFilename)\n\n if (fs.existsSync(expectedPath)) {\n return expectedFilename\n }\n\n if (fs.existsSync(alternatePath)) {\n return alternateFilename\n }\n\n return expectedFilename\n}\n\nconst getScaffoldVisibilitySummary = (packageJson: PackageJsonShape) => {\n return `Scaffolded ${getConsumerViteConfigFilename(packageJson)} and local Tailwind starter files remain visible and editable in the consumer.`\n}\n\nconst getManagedFileEntriesForConsumer = (rootDir: string, packageJson: PackageJsonShape) => {\n return getManagedFileEntries(packageJson).map(([relativeFilePath, source]) => {\n if (relativeFilePath !== getConsumerViteConfigFilename(packageJson)) {\n return [relativeFilePath, source] as const\n }\n\n return [getConfigPathToWrite(rootDir, packageJson), source] as const\n })\n}\n\nexport const getTailwindBootstrapWarnings = (rootDir: string) => {\n const warnings: string[] = []\n const wrapperPath = path.join(rootDir, 'pages', '+Wrapper.tsx')\n const globalCssPath = path.join(rootDir, 'styles', 'global.css')\n const themeCssPath = path.join(rootDir, 'styles', 'theme.css')\n const packageJsonPath = path.join(rootDir, 'package.json')\n const viteConfigMtsPath = path.join(rootDir, 'vite.config.mts')\n const viteConfigTsPath = path.join(rootDir, 'vite.config.ts')\n const packageJsonSource = readFileIfExists(packageJsonPath)\n const packageJson = packageJsonSource ? (JSON.parse(packageJsonSource) as PackageJsonShape) : null\n const expectedViteConfigFilename = getConsumerViteConfigFilename(packageJson ?? {})\n const viteConfigPath = fs.existsSync(viteConfigMtsPath) ? viteConfigMtsPath : viteConfigTsPath\n const viteConfigSource = readFileIfExists(viteConfigPath)\n\n if (!viteConfigSource?.includes('@unterberg/nivel/tailwind') || !viteConfigSource.includes('nivelTailwindVite()')) {\n warnings.push(\n `${expectedViteConfigFilename} should use @unterberg/nivel/tailwind and call nivelTailwindVite() for the engine-owned Tailwind integration.`,\n )\n }\n\n if (viteConfigPath === viteConfigTsPath && packageJson?.type !== 'module') {\n warnings.push(\n 'vite.config.ts is loaded through CommonJS in packages without \"type\": \"module\". Rename it to vite.config.mts to avoid ESM-only dependency errors.',\n )\n }\n\n if (packageJson?.type === 'module' && fs.existsSync(viteConfigMtsPath) && !fs.existsSync(viteConfigTsPath)) {\n warnings.push('vite.config.mts is unnecessary in packages with \"type\": \"module\". Rename it to vite.config.ts.')\n }\n\n if (fs.existsSync(viteConfigMtsPath) && fs.existsSync(viteConfigTsPath)) {\n warnings.push(\n 'Both vite.config.mts and vite.config.ts exist. Keep only the expected config file for the package module type.',\n )\n }\n\n const wrapperSource = readFileIfExists(wrapperPath)\n if (!wrapperSource?.includes('../styles/global.css')) {\n warnings.push('pages/+Wrapper.tsx should import ../styles/global.css.')\n }\n\n const globalCssSource = readFileIfExists(globalCssPath)\n if (\n !globalCssSource?.includes('@unterberg/nivel/tailwind.css') ||\n !globalCssSource.includes(\"@import './theme.css';\") ||\n !globalCssSource.includes(\"@source '../pages';\") ||\n !globalCssSource.includes(\"@source '../docs';\")\n ) {\n warnings.push(\n \"styles/global.css should import @unterberg/nivel/tailwind.css, import ./theme.css, and declare @source '../pages' plus @source '../docs'.\",\n )\n }\n\n if (!fs.existsSync(themeCssPath)) {\n warnings.push('styles/theme.css is missing; define local daisyUI themes there.')\n }\n\n return warnings\n}\n\nconst getGenerateDocsRunner = (packageJson: PackageJsonShape) => {\n const packageManager = packageJson.packageManager?.trim() ?? ''\n\n if (packageManager.startsWith('pnpm@')) {\n return 'pnpm generate:docs'\n }\n\n if (packageManager.startsWith('npm@')) {\n return 'npm run generate:docs'\n }\n\n return 'npm run generate:docs'\n}\n\nconst getManagedScripts = (packageJson: PackageJsonShape) => {\n const generateDocsRunner = getGenerateDocsRunner(packageJson)\n\n return {\n 'generate:docs': 'nivel prepare',\n predev: generateDocsRunner,\n prebuild: generateDocsRunner,\n pretypecheck: generateDocsRunner,\n } satisfies Record<(typeof MANAGED_SCRIPT_NAMES)[number], string>\n}\n\nconst writeFile = (filePath: string, source: string) => {\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n fs.writeFileSync(filePath, source)\n}\n\nconst writeManagedFile = (\n rootDir: string,\n relativeFilePath: string,\n source: string,\n force: boolean,\n result: InitConsumerResult,\n) => {\n const filePath = path.join(rootDir, relativeFilePath)\n const exists = fs.existsSync(filePath)\n\n if (exists && !force) {\n result.skippedFiles.push(relativeFilePath)\n return\n }\n\n writeFile(filePath, source)\n\n if (exists) {\n result.overwrittenFiles.push(relativeFilePath)\n return\n }\n\n result.createdFiles.push(relativeFilePath)\n}\n\nconst readPackageJson = (rootDir: string) => {\n const packageJsonPath = path.join(rootDir, 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n throw new Error(`Expected package.json in ${rootDir}`)\n }\n\n return {\n packageJson: JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as PackageJsonShape,\n packageJsonPath,\n }\n}\n\nconst patchPackageScripts = (packageJson: PackageJsonShape, packageJsonPath: string, result: InitConsumerResult) => {\n const scripts = { ...(packageJson.scripts ?? {}) }\n const managedScripts = getManagedScripts(packageJson)\n\n for (const scriptName of MANAGED_SCRIPT_NAMES) {\n if (scripts[scriptName] === managedScripts[scriptName]) {\n continue\n }\n\n scripts[scriptName] = managedScripts[scriptName]\n result.updatedScripts.push(scriptName)\n }\n\n const nextPackageJson = {\n ...packageJson,\n scripts,\n }\n\n fs.writeFileSync(packageJsonPath, `${JSON.stringify(nextPackageJson, null, 2)}\\n`)\n}\n\nconst getMissingDependencies = (packageJson: PackageJsonShape) => {\n const installed = new Set<string>([\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.devDependencies ?? {}),\n ])\n\n return [...REQUIRED_DEPENDENCIES, ...REQUIRED_DEV_DEPENDENCIES].filter((packageName) => !installed.has(packageName))\n}\n\nexport const getInitSummary = (result: InitConsumerResult) => {\n const lines = ['Initialized nivel consumer scaffolding.']\n\n if (result.createdFiles.length > 0) {\n lines.push(`Created files: ${result.createdFiles.join(', ')}`)\n }\n\n if (result.overwrittenFiles.length > 0) {\n lines.push(`Overwritten files: ${result.overwrittenFiles.join(', ')}`)\n }\n\n if (result.skippedFiles.length > 0) {\n lines.push(`Skipped existing files: ${result.skippedFiles.join(', ')}`)\n }\n\n if (result.updatedScripts.length > 0) {\n lines.push(`Updated package.json scripts: ${result.updatedScripts.join(', ')}`)\n }\n\n lines.push(getScaffoldVisibilitySummary(result.packageJson))\n\n if (result.missingDependencies.length > 0) {\n lines.push(`Missing dependencies: ${result.missingDependencies.join(', ')}`)\n } else if (!result.allDependenciesPresent) {\n lines.push('Dependency validation completed with warnings.')\n } else {\n lines.push('All required dependencies are already present.')\n }\n\n return `${lines.join('\\n')}\\n`\n}\n\nexport const initConsumer = (options: InitConsumerOptions): InitConsumerResult => {\n const result: InitConsumerResult = {\n allDependenciesPresent: true,\n createdFiles: [],\n missingDependencies: [],\n overwrittenFiles: [],\n skippedFiles: [],\n updatedScripts: [],\n packageJson: {} as PackageJsonShape,\n }\n\n const { packageJson, packageJsonPath } = readPackageJson(options.rootDir)\n result.packageJson = packageJson\n\n for (const [relativeFilePath, source] of getManagedFileEntriesForConsumer(options.rootDir, packageJson)) {\n writeManagedFile(options.rootDir, relativeFilePath, source, options.force, result)\n }\n\n patchPackageScripts(packageJson, packageJsonPath, result)\n\n result.missingDependencies = getMissingDependencies(packageJson)\n result.allDependenciesPresent = result.missingDependencies.length === 0\n\n return result\n}\n"],"mappings":";;;;;;;;;;;AACA,YAAY,iBAAiB;AAQ7B,IAAM,wBAAwB,oBAAI,IAAI,CAAC,oBAAoB,QAAQ,SAAS,kBAAkB,kBAAkB,CAAC;AAEjH,IAAM,qBAAqB,CAAC,UAAmB;AAC7C,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AAEA,SAAO,cAAc,SAAS,YAAY;AAC5C;AAEA,IAAM,gBAAgB,OAAO;AAAA,EAC3B,OAAO,QAAQ,WAAW,EACvB,OAAO,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,sBAAsB,IAAI,IAAI,KAAK,mBAAmB,KAAK,CAAC,EACvF,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI,EACpB,KAAK;AACV;AAEA,IAAM,kBAAkB,IAAI,IAAY,aAAa;AAErD,IAAM,iBAAiB,CAAC,UAAyC;AAC/D,SAAO,gBAAgB,IAAI,KAAK;AAClC;AAEO,IAAM,qBAAqB,CAAC,OAAe,YAAoB;AACpE,MAAI,eAAe,KAAK,GAAG;AACzB;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,GAAG,OAAO,wDAAwD,KAAK;AAAA,EACzE;AACF;;;ACfA,IAAM,iBAAiB,CAAC,UAAkB;AACxC,SAAO,qBAAqB,KAAK,KAAK,KAAK,MAAM,WAAW,SAAS,KAAK,MAAM,WAAW,MAAM;AACnG;AAEA,IAAM,oBAAoB,CAAC,UAAkB;AAC3C,QAAM,aAAa,MAAM,KAAK;AAE9B,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAEA,MAAI,CAAC,WAAW,WAAW,GAAG,KAAK,WAAW,WAAW,IAAI,GAAG;AAC9D,UAAM,IAAI,MAAM,+CAA+C,KAAK,UAAU,KAAK,CAAC,GAAG;AAAA,EACzF;AAEA,MAAI,WAAW,SAAS,GAAG,KAAK,WAAW,SAAS,GAAG,GAAG;AACxD,UAAM,IAAI,MAAM,kEAAkE,KAAK,UAAU,KAAK,CAAC,GAAG;AAAA,EAC5G;AAEA,QAAM,YAAY,WAAW,QAAQ,QAAQ,GAAG,EAAE,QAAQ,SAAS,EAAE;AACrE,SAAO,cAAc,KAAK,MAAM;AAClC;AAEA,IAAM,sBAAsB,CAAC,UAA8B;AACzD,QAAM,cAAc,SAAS,QAAQ,KAAK;AAE1C,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AAEA,MAAI,WAAW,WAAW,GAAG,KAAK,WAAW,WAAW,IAAI,GAAG;AAC7D,UAAM,IAAI,MAAM,sDAAsD,KAAK,UAAU,KAAK,CAAC,GAAG;AAAA,EAChG;AAEA,MAAI,kBAAkB,KAAK,UAAU,GAAG;AACtC,UAAM,IAAI,MAAM,sDAAsD,KAAK,UAAU,KAAK,CAAC,GAAG;AAAA,EAChG;AAEA,QAAM,WAAW,WAAW,WAAW,MAAM,GAAG,EAAE,MAAM,GAAG;AAC3D,QAAM,mBAA6B,CAAC;AAEpC,aAAW,WAAW,UAAU;AAC9B,QAAI,YAAY,MAAM,YAAY,KAAK;AACrC;AAAA,IACF;AAEA,QAAI,YAAY,MAAM;AACpB,YAAM,IAAI,MAAM,4DAA4D,KAAK,UAAU,KAAK,CAAC,GAAG;AAAA,IACtG;AAEA,qBAAiB,KAAK,OAAO;AAAA,EAC/B;AAEA,MAAI,iBAAiB,WAAW,GAAG;AACjC,UAAM,IAAI,MAAM,oEAAoE,KAAK,UAAU,KAAK,CAAC,GAAG;AAAA,EAC9G;AAEA,SAAO,iBAAiB,KAAK,GAAG;AAClC;AAEA,IAAM,gBAAgB,CAAC,UAAkB,MAAM,QAAQ,cAAc,EAAE;AAEvE,IAAM,eAAe,CAAC,UAAkB,SAAiB;AACvD,QAAM,qBAAqB,kBAAkB,QAAQ;AACrD,QAAM,iBAAiB,cAAc,IAAI;AAEzC,MAAI,CAAC,gBAAgB;AACnB,WAAO,uBAAuB,MAAM,MAAM,GAAG,kBAAkB;AAAA,EACjE;AAEA,SAAO,uBAAuB,MAAM,IAAI,cAAc,MAAM,GAAG,kBAAkB,IAAI,cAAc;AACrG;AAEA,IAAM,oBAAoB,CAAC,UAAkB;AAC3C,QAAM,WAAW,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK;AACvD,QAAM,aAAa,SAAS,KAAK,EAAE,QAAQ,SAAS,EAAE;AACtD,SAAO,eAAe,KAAK,MAAM,GAAG,UAAU,IAAI,QAAQ,QAAQ,GAAG;AACvE;AAEO,IAAM,kBAAkB,CAAC,UAAkB,SAAiB;AACjE,QAAM,aAAa,KAAK,KAAK;AAE7B,MAAI,CAAC,cAAc,WAAW,WAAW,GAAG,KAAK,eAAe,UAAU,GAAG;AAC3E,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,WAAW,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK;AAE5D,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,WAAW,GAAG,GAAG;AAC5B,UAAM,qBAAqB,kBAAkB,QAAQ;AACrD,UAAM,qBAAqB,kBAAkB,QAAQ;AAErD,QAAI,uBAAuB,KAAK;AAC9B,aAAO;AAAA,IACT;AAEA,WAAO,uBAAuB,GAAG,kBAAkB,OAAO,mBAAmB,WAAW,GAAG,kBAAkB,GAAG,IAC5G,qBACA;AAAA,EACN;AAEA,MAAI,SAAS,WAAW,IAAI,KAAK,SAAS,WAAW,KAAK,GAAG;AAC3D,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,UAAU,QAAQ;AACxC;AAEA,IAAM,sBAAsB,CAAC,UAAkB;AAC7C,QAAM,WAAW,MAAM,WAAW,MAAM,GAAG,EAAE,MAAM,GAAG;AACtD,QAAM,qBAA+B,CAAC;AAEtC,aAAW,WAAW,UAAU;AAC9B,QAAI,YAAY,MAAM,YAAY,KAAK;AACrC;AAAA,IACF;AAEA,QAAI,YAAY,MAAM;AACpB,yBAAmB,IAAI;AACvB;AAAA,IACF;AAEA,uBAAmB,KAAK,OAAO;AAAA,EACjC;AAEA,SAAO,mBAAmB,KAAK,GAAG;AACpC;AAEA,IAAM,iBAAiB,CAAC,OAA8B,cAAc,UAAyB;AAC3F,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,QAAQ;AACxB,UAAI,eAAe,CAAC,KAAK,WAAW;AAClC;AAAA,MACF;AAEA,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,KAAK,SAAS,SAAS;AACzB,UAAI,eAAe,CAAC,KAAK,WAAW;AAClC;AAAA,MACF;AAEA,YAAM,OAAO,eAAe,KAAK,OAAO,WAAW;AACnD,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,wBAAwB,CAAC,OAAe,WAAmB,aAAqB;AACpF,QAAM,aAAa,MAAM,KAAK;AAE9B,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,QAAQ,SAAS,8BAA8B;AAAA,EACjE;AAEA,MAAI,WAAW,WAAW,GAAG,KAAK,eAAe,UAAU,GAAG;AAC5D,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,WAAW,WAAW,GAAG,GAAG;AAC/B,WAAO,aAAa,UAAU,UAAU;AAAA,EAC1C;AAEA,SAAO,kBAAkB,UAAU;AACrC;AAEA,IAAM,qBAAqB,CAAC,UAA+B;AACzD,SAAO;AAAA,IACL,OAAO,OAAO,SAAS;AAAA,IACvB,MAAM,OAAO,QAAQ;AAAA,IACrB,mBAAoB,OAAO,qBAAqB;AAAA,EAClD;AACF;AAEA,IAAM,sBAAsB,CAAC,WAAyC;AACpE,SAAO;AAAA,IACL,YAAY,QAAQ,cAAc;AAAA,EACpC;AACF;AAEA,IAAM,sBAAsB,CAAC,WAAiC;AAC5D,SAAO,UAAU;AACnB;AAEA,IAAM,2BAA2B,CAAC,gBAA2C;AAC3E,SAAO,eAAe;AACxB;AAEA,IAAM,qBAAqB,CAAC,OAAoC,cAA+C;AAC7G,QAAM,OAAO,OAAO,QAAQ;AAE5B,SAAO;AAAA,IACL;AAAA,IACA,MAAM,gBAAgB,OAAO,QAAQ,GAAG;AAAA,IACxC,WAAW,sBAAsB,OAAO,SAAS;AAAA,IACjD,UAAU,sBAAsB,OAAO,QAAQ;AAAA,IAC/C,SAAS,OAAO,WAAW,GAAG,IAAI;AAAA,EACpC;AACF;AAEA,IAAM,oBAAoB,CAAC,MAAkC,gBAAyB;AACpF,QAAM,aAAa,cAAe,MAAM,cAAc,UAAW;AACjE,QAAM,4BAA4B,eAAe,UAAU,cAAc,uBAAuB,IAAI;AACpG,QAAM,0BACJ,eAAe,UACX;AAAA,IACE,cAAc,qCAAqC;AAAA,IACnD,cAAc,iCAAiC;AAAA,IAC/C,cAAc,iCAAiC;AAAA,EACjD,IACA,CAAC;AAEP,SAAO;AAAA,IACL;AAAA,IACA,YAAY,sBAAsB,MAAM,UAAU;AAAA,IAClD,YAAY,sBAAsB,MAAM,UAAU;AAAA,IAClD,gBAAgB,sBAAsB,MAAM,cAAc;AAAA,IAC1D;AAAA,IACA,oBAAoB,MAAM,sBAAsB;AAAA,IAChD,kBAAkB,MAAM,oBAAoB;AAAA,EAC9C;AACF;AAEA,IAAM,yBAAyB,CAAC,UAA8B;AAC5D,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,sBAAsB,KAAK;AACpC;AAEA,IAAM,iBAAiB,CAAC,YAA0D;AAChF,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,MAAM,gBAAgB,QAAQ,IAAI;AAAA,IAClC,WAAW,uBAAuB,QAAQ,SAAS,KAAK,QAAQ;AAAA,IAChE,UAAU,uBAAuB,QAAQ,QAAQ;AAAA,IACjD,SAAS,QAAQ,WAAW,GAAG,QAAQ,IAAI;AAAA,EAC7C;AACF;AAEA,IAAM,sBAAsB,CAAC,WAA2D;AAEtF,SAAO;AAAA,IACL,GAAG;AAAA,EACL;AACF;AAEA,IAAM,wBAAwB,CAAC,aAAiE;AAC9F,SAAO;AAAA,IACL,UAAU,UAAU,WAAW,CAAC,GAAG,IAAI,cAAc;AAAA,IACrD,OAAO,UAAU,QAAQ,CAAC,GAAG,IAAI,cAAc;AAAA,EACjD;AACF;AAEA,IAAM,uBAAuB,CAAC,OAAe,cAAsB;AACjE,QAAM,aAAa,MAAM,KAAK;AAE9B,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,wBAAwB,SAAS,+BAA+B;AAAA,EAClF;AAEA,SAAO;AACT;AAEA,IAAM,uBAAuB,CAAC,YAA6E;AACzG,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO,qBAAqB,QAAQ,OAAO,OAAO;AAAA,IAClD,QAAQ,qBAAqB,QAAQ,QAAQ,QAAQ;AAAA,IACrD,WAAW,qBAAqB,QAAQ,WAAW,WAAW;AAAA,IAC9D,QAAQ;AAAA,MACN,MAAM,QAAQ,QAAQ,MAAM,KAAK,KAAK;AAAA,MACtC,OAAO,QAAQ,QAAQ,OAAO,KAAK,KAAK;AAAA,MACxC,SAAS,QAAQ,QAAQ,SAAS,KAAK,KAAK;AAAA,MAC5C,cAAc,QAAQ,QAAQ,cAAc,KAAK,KAAK;AAAA,IACxD;AAAA,IACA,cAAc,QAAQ,gBAAgB,CAAC;AAAA,EACzC;AACF;AAEA,IAAM,mBAAmB,CAAC,SAA+B,SAAiB;AACxE,QAAM,oBAAoB,oBAAI,IAAY;AAE1C,aAAW,SAAS,WAAW,CAAC,GAAG;AACjC,UAAM,kBAAkB,cAAc,KAAK;AAC3C,QAAI,CAAC,mBAAmB,oBAAoB,MAAM;AAChD;AAAA,IACF;AAEA,sBAAkB,IAAI,eAAe;AAAA,EACvC;AAEA,SAAO,CAAC,GAAG,iBAAiB;AAC9B;AAEO,IAAM,oBAAoB,CAAC,WAA2C;AAC3E,QAAM,qBAAqB,kBAAkB,OAAO,QAAQ;AAC5D,QAAM,uBAAuB,oBAAoB,OAAO,UAAU;AAClE,QAAM,cAAc,yBAAyB,OAAO,WAAW;AAE/D,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,aAAa,oBAAI,IAAY;AACnC,QAAM,QAA4B,CAAC;AACnC,QAAM,cAAoC,CAAC;AAE3C,QAAM,sBAAsB,CAAC,OAA0B,cAA6C;AAClG,WAAO,MAAM,IAAI,CAAC,SAAS;AACzB,UAAI,KAAK,SAAS,SAAS;AACzB,YAAI,SAAS,IAAI,KAAK,EAAE,GAAG;AACzB,gBAAM,IAAI,MAAM,4BAA4B,KAAK,EAAE,IAAI;AAAA,QACzD;AAEA,YAAI,KAAK,MAAM;AACb,6BAAmB,KAAK,MAAM,eAAe,KAAK,EAAE,QAAQ;AAAA,QAC9D;AAEA,iBAAS,IAAI,KAAK,EAAE;AAEpB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,KAAK;AAAA,UACT,OAAO,KAAK;AAAA,UACZ,MAAM,KAAK,OAAO,sBAAsB,KAAK,MAAM,UAAU,KAAK,EAAE,UAAU,kBAAkB,IAAI;AAAA,UACpG,WAAW,KAAK,aAAa;AAAA,UAC7B,aAAa,KAAK;AAAA,UAClB,OAAO,oBAAoB,KAAK,OAAO,SAAS;AAAA,UAChD,MAAM,KAAK;AAAA,QACb;AAAA,MACF;AAEA,UAAI,KAAK,SAAS,QAAQ;AACxB,cAAM,IAAI,MAAM,8BAA8B,KAAK,UAAU,IAAI,CAAC,EAAE;AAAA,MACtE;AAEA,YAAM,WAAW;AACjB,YAAM,OAAO,cAAc,SAAS,IAAI;AACxC,YAAM,UAAU,iBAAiB,SAAS,SAAS,IAAI;AAEvD,UAAI,SAAS,MAAM;AACjB,2BAAmB,SAAS,MAAM,cAAc,SAAS,EAAE,QAAQ;AAAA,MACrE;AAEA,UAAI,CAAC,MAAM;AACT,cAAM,IAAI,MAAM,cAAc,SAAS,EAAE,iCAAiC;AAAA,MAC5E;AAEA,UAAI,QAAQ,IAAI,SAAS,EAAE,GAAG;AAC5B,cAAM,IAAI,MAAM,2BAA2B,SAAS,EAAE,IAAI;AAAA,MAC5D;AAEA,UAAI,UAAU,IAAI,IAAI,GAAG;AACvB,cAAM,IAAI,MAAM,6BAA6B,IAAI,IAAI;AAAA,MACvD;AAEA,iBAAW,SAAS,SAAS;AAC3B,YAAI,UAAU,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,GAAG;AAClD,gBAAM,IAAI,MAAM,8BAA8B,KAAK,IAAI;AAAA,QACzD;AAAA,MACF;AAEA,cAAQ,IAAI,SAAS,EAAE;AACvB,gBAAU,IAAI,IAAI;AAClB,iBAAW,SAAS,SAAS;AAC3B,oBAAY,IAAI,KAAK;AAAA,MACvB;AAEA,YAAM,OAAO,aAAa,oBAAoB,IAAI;AAClD,YAAM,OAAyB;AAAA,QAC7B,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,QAAQ,IAAI,CAAC,UAAU,aAAa,oBAAoB,KAAK,CAAC;AAAA,QAC1E,iBAAiB,SAAS,mBAAmB;AAAA,QAC7C;AAAA,QACA,eAAe,GAAG,SAAS,KAAK,MAAM,OAAO,SAAS;AAAA,QACtD,QAAQ,oBAAoB,SAAS,MAAM;AAAA,MAC7C;AACA,YAAM,KAAK,IAAI;AAEf,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI,SAAS;AAAA,QACb,OAAO,SAAS;AAAA,QAChB,UAAU,SAAS,YAAY,SAAS;AAAA,QACxC;AAAA,QACA,WAAW,SAAS,aAAa;AAAA,QACjC,MAAM,SAAS;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,WAAkC,OAAO,MAAM,MAAM,IAAI,CAAC,YAA6B;AAC3F,QAAI,QAAQ,SAAS,WAAW;AAC9B,YAAM,IAAI,MAAM,yDAAyD,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,IACpG;AAEA,QAAI,WAAW,IAAI,QAAQ,EAAE,GAAG;AAC9B,YAAM,IAAI,MAAM,8BAA8B,QAAQ,EAAE,IAAI;AAAA,IAC9D;AAEA,QAAI,QAAQ,MAAM;AAChB,yBAAmB,QAAQ,MAAM,iBAAiB,QAAQ,EAAE,QAAQ;AAAA,IACtE;AAEA,eAAW,IAAI,QAAQ,EAAE;AAEzB,UAAM,QAAQ,oBAAoB,QAAQ,OAAO,QAAQ,EAAE;AAC3D,UAAM,mBAAmB,eAAe,OAAO,IAAI;AACnD,UAAM,OAAO,QAAQ,OACjB,sBAAsB,QAAQ,MAAM,YAAY,QAAQ,EAAE,UAAU,kBAAkB,IACrF,oBAAoB,eAAe,KAAK;AAE7C,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,iBAAiB,QAAQ,EAAE,mCAAmC;AAAA,IAChF;AAEA,UAAM,kBAAuC;AAAA,MAC3C,IAAI,QAAQ;AAAA,MACZ,OAAO,QAAQ;AAAA,MACf,UAAU,QAAQ,YAAY,QAAQ;AAAA,MACtC;AAAA,MACA;AAAA,MACA,MAAM,QAAQ;AAAA,IAChB;AAEA,gBAAY,KAAK;AAAA,MACf,IAAI,QAAQ;AAAA,MACZ,OAAO,gBAAgB;AAAA,MACvB,MAAM,gBAAgB;AAAA,IACxB,CAAC;AAED,WAAO;AAAA,EACT,CAAC;AAED,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,iBAAiB,OAAO,mBAAmB;AAAA,IAC3C,QAAQ,oBAAoB,OAAO,MAAM;AAAA,IACzC;AAAA,IACA,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO,mBAAmB,OAAO,KAAK;AAAA,IACtC,QAAQ,oBAAoB,OAAO,MAAM;AAAA,IACzC,OAAO,mBAAmB,OAAO,OAAO,OAAO,SAAS;AAAA,IACxD,MAAM,kBAAkB,OAAO,MAAM,WAAW;AAAA,IAChD,UAAU,sBAAsB,OAAO,QAAQ;AAAA,IAC/C,QAAQ,oBAAoB,OAAO,MAAM;AAAA,IACzC,SAAS,qBAAqB,OAAO,OAAO;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,sBAAsB,CAAC,QAAuC,WAAmB;AAC5F,QAAM,OAAO,OAAO,MAAM,KAAK,CAAC,cAAc,UAAU,OAAO,MAAM;AACrE,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,yBAAyB,MAAM,IAAI;AAAA,EACrD;AACA,SAAO;AACT;;;AC1fA,OAAO,QAAQ;AACf,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AAajB,IAAM,oBAAoB;AAC1B,IAAMA,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,oBAAoB,KAAK,QAAQA,SAAQ,QAAQ,2BAA2B,CAAC;AACnF,IAAM,iCAAiC;AAAA,EACrC,KAAK,KAAK,mBAAmB,QAAQ,OAAO,OAAO;AAAA,EACnD,KAAK,KAAK,mBAAmB,QAAQ,OAAO;AAC9C;AAIA,IAAI,2BAA0C;AAC9C,IAAM,uBAAuB,oBAAI,IAAyC;AAE1E,IAAM,qBAAqB,CAAC,UAAkB,WAAmB;AAC/D,QAAM,UAAU,GAAG,WAAW,QAAQ,IAAI,GAAG,aAAa,UAAU,MAAM,IAAI;AAC9E,MAAI,YAAY,QAAQ;AACtB;AAAA,EACF;AAEA,KAAG,UAAU,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,KAAG,cAAc,UAAU,MAAM;AACnC;AAEA,IAAM,UAAU,CAAC,UAAkB,MAAM,MAAM,KAAK,GAAG,EAAE,KAAK,KAAK,MAAM,GAAG;AAE5E,IAAM,wBAAwB,CAAC,eAAuB,WAAmB;AACvE,QAAM,eAAe,QAAQ,KAAK,SAAS,eAAe,MAAM,CAAC;AACjE,MAAI,aAAa,WAAW,GAAG,GAAG;AAChC,WAAO;AAAA,EACT;AACA,SAAO,KAAK,YAAY;AAC1B;AAEA,IAAM,gBAAgB,CAAC,SAA0D,KAAK,UAAU,MAAM,MAAM,CAAC;AAE7G,IAAM,eAAe,CAAC,kBAAoC;AACxD,MAAI,CAAC,GAAG,WAAW,aAAa,GAAG;AACjC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,GAAG,YAAY,eAAe,EAAE,eAAe,KAAK,CAAC;AAErE,SAAO,QAAQ,QAAQ,CAAC,UAAU;AAChC,UAAM,YAAY,KAAK,KAAK,eAAe,MAAM,IAAI;AACrD,WAAO,MAAM,YAAY,IAAI,aAAa,SAAS,IAAI,CAAC,SAAS;AAAA,EACnE,CAAC;AACH;AAEA,IAAM,yBAAyB,CAAC,eAAuB,aAAqB;AAC1E,MAAI,CAAC,GAAG,WAAW,aAAa,GAAG;AACjC;AAAA,EACF;AAEA,aAAW,SAAS,GAAG,YAAY,eAAe,EAAE,eAAe,KAAK,CAAC,GAAG;AAC1E,QAAI,CAAC,MAAM,YAAY,GAAG;AACxB;AAAA,IACF;AAEA,2BAAuB,KAAK,KAAK,eAAe,MAAM,IAAI,GAAG,QAAQ;AAAA,EACvE;AAEA,MAAI,kBAAkB,UAAU;AAC9B;AAAA,EACF;AAEA,MAAI,GAAG,YAAY,aAAa,EAAE,WAAW,GAAG;AAC9C,OAAG,UAAU,aAAa;AAAA,EAC5B;AACF;AAEA,IAAM,yBAAyB,CAAC,sBAA8B;AAC5D,SAAO;AAAA,IACL;AAAA,IACA,uBAAuB,KAAK,UAAU,iBAAiB,CAAC;AAAA,IACxD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,2BAA2B,MAAM;AACrC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,yBAAyB,CAAC,SAAsB;AACpD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,6BAA6B,cAAc,IAAI,CAAC;AAAA,IAChD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAOA,IAAM,wBAAwB,CAAC,UAA8C;AAC3E,SAAO,MAAM,QAAQ,CAAC,SAAS;AAC7B,UAAM,cAAc,KAAK,OAAO,CAAC,EAAE,SAAS,kBAAkB,KAAK,MAAM,KAAK,EAAE,GAAG,UAAU,KAAK,KAAK,CAAC,IAAI,CAAC;AAE7G,QAAI,KAAK,SAAS,SAAS;AACzB,aAAO,CAAC,GAAG,aAAa,GAAG,sBAAsB,KAAK,KAAK,CAAC;AAAA,IAC9D;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,IAAM,4BAA4B,CAAC,YAAyB;AAC1D,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,KAAK,GAAG,QAAQ,IAAI,CAAC,EAAE,SAAS,SAAS,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,KAAK,QAAQ,GAAG,GAAG,GAAG,EAAE,KAAK,IAAI;AACtH;AAEA,IAAM,8BAA8B,MAAM;AACxC,MAAI,0BAA0B;AAC5B,WAAO;AAAA,EACT;AAEA,aAAW,iBAAiB,gCAAgC;AAC1D,QAAI,GAAG,WAAW,aAAa,GAAG;AAChC,iCAA2B;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,gDAAgD;AAClE;AAEA,IAAM,kBAAkB,CAAC,UAAkB;AACzC,SAAO,MACJ,QAAQ,yBAAyB,OAAO,EACxC,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,sBAAsB,OAAO,EACrC,YAAY;AACjB;AAEA,IAAM,6BAA6B,CAAC,aAA2B;AAC7D,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA,SAAS,QAAQ,WAAW,EAAE;AAAA,IAC9B,SAAS,QAAQ,SAAS,EAAE;AAAA,IAC5B,SAAS,QAAQ,WAAW,EAAE,EAAE,QAAQ,SAAS,EAAE;AAAA,EACrD;AAEA,SAAO,CAAC,GAAG,IAAI,IAAI,cAAc,OAAO,OAAO,EAAE,IAAI,eAAe,CAAC,CAAC;AACxE;AAEA,IAAM,kBAAkB,CAAC,aAA2B;AAClD,QAAM,iBAAiB,qBAAqB,IAAI,QAAQ;AAExD,MAAI,gBAAgB;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,2BAA2B,QAAQ,EACnD,IAAI,CAAC,YAAY,KAAK,KAAK,4BAA4B,GAAG,GAAG,OAAO,KAAK,CAAC,EAC1E,KAAK,CAAC,kBAAkB,GAAG,WAAW,aAAa,CAAC;AAEvD,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,wDAAwD,QAAQ,IAAI;AAAA,EACtF;AAEA,QAAM,mBAAmB,GAAG,aAAa,YAAY,MAAM;AAC3D,QAAM,gBAAgB,8CAA8C,KAAK,gBAAgB;AAEzF,MAAI,CAAC,gBAAgB,CAAC,GAAG;AACvB,UAAM,IAAI,MAAM,wDAAwD,QAAQ,IAAI;AAAA,EACtF;AAEA,QAAM,WAAW,SAAS,yBAAyB,cAAc,CAAC,CAAC,GAAG,EAAE;AACxE,uBAAqB,IAAI,UAAU,QAAQ;AAC3C,SAAO;AACT;AAEA,IAAM,oCAAoC,CAAC,cAA8B;AACvE,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,cAAc,UAAU,QAAQ,CAAC,aAAa;AAClD,WAAO,CAAC,SAAS,QAAQ,qBAAqB,KAAK,UAAU,gBAAgB,QAAQ,CAAC,CAAC,KAAK,EAAE;AAAA,EAChG,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL;AACF;AAEA,IAAM,kCAAkC,CAAC,SAA4C;AACnF,QAAM,cAAc,KAAK,gBAAgB,QAAQ,CAAC,YAAY;AAC5D,UAAM,qBAAqB,QAAQ,OAC/B,CAAC,EAAE,SAAS,kBAAkB,WAAW,QAAQ,EAAE,GAAG,UAAU,QAAQ,KAAK,CAAC,IAC9E,CAAC;AAEL,WAAO,CAAC,GAAG,oBAAoB,GAAG,sBAAsB,QAAQ,KAAK,CAAC;AAAA,EACxE,CAAC;AACD,QAAM,cAAc,CAAC,GAAG,IAAI,IAAI,YAAY,IAAI,CAAC,EAAE,SAAS,MAAM,QAAQ,CAAC,CAAC,EAAE,KAAK;AAEnF,SAAO;AAAA,IACL;AAAA,IACA,GAAG,kCAAkC,WAAW;AAAA,IAChD;AAAA,IACA,gFAAgF,cAAc,IAAI,CAAC;AAAA,IACnG;AAAA,IACA,oCAAoC,0BAA0B,WAAW,CAAC;AAAA,IAC1E;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,iBAAiB,CAAC,SAAiB;AACvC,MAAI,SAAS,KAAK;AAChB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,QAAQ,SAAS,EAAE;AACjC;AAEA,IAAM,0BAA0B,CAAC,SAAiB;AAChD,SAAO,CAAC,kBAAkB,KAAK,UAAU,eAAe,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,IAAI;AACjF;AAEA,IAAM,yBAAyB,CAAC,UAAkB;AAChD,SAAO,CAAC,kBAAkB,KAAK,UAAU,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,IAAI;AAClE;AAEA,IAAM,oBAAoB,CACxB,SAQ2B;AAC3B,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,OAAO,KAAK;AAAA,IACZ,MAAM,KAAK;AAAA,IACX,eAAe,KAAK;AAAA,EACtB;AACF;AAEO,IAAM,wBAAwB,CAAC,YAAoB,KAAK,KAAK,SAAS,SAAS,iBAAiB;AASvG,IAAM,oBAAoB,CAAC,YAAoB,KAAK,KAAK,SAAS,SAAS,UAAU;AAErF,IAAM,mBAAmB,CAAC,YAAoB,KAAK,KAAK,SAAS,QAAQ,eAAe;AAEjF,IAAM,qBAAqB,CAAC,YAA0E;AAC3G,QAAM,WAAW,kBAAkB,QAAQ,UAAU;AAErD,SAAO;AAAA,IACL,iBAAiB,KAAK,KAAK,QAAQ,SAAS,SAAS,UAAU;AAAA,IAC/D,gBAAgB,kBAAkB,QAAQ,OAAO;AAAA,IACjD,eAAe,iBAAiB,QAAQ,OAAO;AAAA,IAC/C,mBAAmB,sBAAsB,QAAQ,OAAO;AAAA,EAC1D;AACF;AAEO,IAAM,mBAAmB,CAAC,UAAkB,oBAAqC;AACtF,QAAM,aAAa,QAAQ,QAAQ;AACnC,MAAI,oBAAoB,UAAU,eAAe,GAAG;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,QAAQ,gBAAgB,cAAc;AAC7D,QAAM,gBAAgB,QAAQ,gBAAgB,aAAa;AAC3D,QAAM,kBAAkB,QAAQ,gBAAgB,eAAe;AAE/D,SACE,eAAe,kBACf,eAAe,iBACf,eAAe,mBACf,WAAW,WAAW,GAAG,eAAe,GAAG;AAE/C;AAEO,IAAM,sBAAsB,CAAC,UAAkB,oBAAqC;AACzF,QAAM,aAAa,QAAQ,QAAQ;AACnC,QAAM,oBAAoB,QAAQ,gBAAgB,iBAAiB;AAEnE,SAAO,WAAW,WAAW,iBAAiB;AAChD;AAEO,IAAM,yBAAyB,CAAC,YAAyD;AAC9F,QAAM,EAAE,SAAS,WAAW,IAAI;AAChC,QAAM,WAAW,kBAAkB,UAAU;AAC7C,QAAM,qBAAqB,sBAAsB,OAAO;AACxD,QAAM,kBAAkB,KAAK,KAAK,SAAS,SAAS,UAAU;AAC9D,QAAM,gBAAgB,oBAAI,IAAY;AACtC,QAAM,wBAAwB,KAAK,KAAK,oBAAoB,uBAAuB;AACnF,QAAM,iBAAiB,KAAK,KAAK,oBAAoB,aAAa;AAElE,KAAG,UAAU,oBAAoB,EAAE,WAAW,KAAK,CAAC;AAEpD,QAAM,oBAAuD;AAAA,IAC3D,WAAW,SAAS;AAAA,IACpB,QAAQ,SAAS;AAAA,IACjB,UAAU,SAAS;AAAA,IACnB,OAAO,SAAS;AAAA,IAChB,QAAQ,SAAS;AAAA,IACjB,OAAO,SAAS;AAAA,IAChB,MAAM,SAAS;AAAA,IACf,UAAU,SAAS;AAAA,IACnB,QAAQ,SAAS;AAAA,IACjB,SAAS,SAAS;AAAA,IAClB,OAAO,SAAS;AAAA,IAChB,aAAa,SAAS;AAAA,IACtB,iBAAiB,SAAS;AAAA,EAC5B;AAEA,qBAAmB,uBAAuB,gCAAgC,iBAAiB,CAAC;AAC5F,qBAAmB,gBAAgB,yBAAyB,CAAC;AAC7D,gBAAc,IAAI,qBAAqB;AACvC,gBAAc,IAAI,cAAc;AAEhC,aAAW,CAAC,WAAW,IAAI,KAAK,SAAS,MAAM,QAAQ,GAAG;AACxD,UAAM,kBAAkB,KAAK,KAAK,iBAAiB,KAAK,MAAM;AAE9D,QAAI,CAAC,GAAG,WAAW,eAAe,GAAG;AACnC,YAAM,IAAI,MAAM,cAAc,KAAK,EAAE,oCAAoC,eAAe,EAAE;AAAA,IAC5F;AAEA,UAAM,aAAa,GAAG,aAAa,iBAAiB,MAAM;AAC1D,UAAM,OAAoB;AAAA,MACxB,MAAM,oBAAoB,UAAU,KAAK,EAAE;AAAA,MAC3C,UAAU,mBAAmB,UAAU;AAAA,MACvC,cAAc,kBAAkB,SAAS,MAAM,YAAY,CAAC,CAAC;AAAA,MAC7D,UAAU,kBAAkB,SAAS,MAAM,YAAY,CAAC,CAAC;AAAA,IAC3D;AAEA,UAAM,eAAe;AAAA,MACnB,EAAE,WAAW,KAAK,MAAM,WAAW,KAAK,KAAK;AAAA,MAC7C,GAAG,KAAK,QAAQ,IAAI,CAAC,WAAW,WAAW;AAAA,QACzC,WAAW,KAAK,WAAW,KAAK;AAAA,QAChC;AAAA,MACF,EAAE;AAAA,IACJ;AAEA,eAAW,EAAE,WAAW,UAAU,KAAK,cAAc;AACnD,YAAM,UAAU,KAAK,KAAK,oBAAoB,GAAG,UAAU,MAAM,GAAG,CAAC;AACrE,YAAM,oBAAoB,sBAAsB,SAAS,eAAe;AAExE,YAAM,eAAe,KAAK,KAAK,SAAS,WAAW;AACnD,YAAM,eAAe,KAAK,KAAK,SAAS,UAAU;AAClD,YAAM,gBAAgB,KAAK,KAAK,SAAS,WAAW;AACpD,YAAM,gBAAgB,KAAK,KAAK,SAAS,WAAW;AAEpD,yBAAmB,cAAc,uBAAuB,iBAAiB,CAAC;AAC1E,yBAAmB,cAAc,uBAAuB,IAAI,CAAC;AAC7D,yBAAmB,eAAe,wBAAwB,SAAS,CAAC;AACpE,yBAAmB,eAAe,uBAAuB,KAAK,aAAa,CAAC;AAE5E,oBAAc,IAAI,YAAY;AAC9B,oBAAc,IAAI,YAAY;AAC9B,oBAAc,IAAI,aAAa;AAC/B,oBAAc,IAAI,aAAa;AAE/B,UAAI,KAAK,aAAa;AACpB,cAAM,sBAAsB,KAAK,KAAK,SAAS,iBAAiB;AAChE,2BAAmB,qBAAqB,uBAAuB,KAAK,WAAW,CAAC;AAChF,sBAAc,IAAI,mBAAmB;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,aAAW,YAAY,aAAa,kBAAkB,GAAG;AACvD,QAAI,cAAc,IAAI,QAAQ,GAAG;AAC/B;AAAA,IACF;AAEA,OAAG,OAAO,UAAU,EAAE,OAAO,KAAK,CAAC;AAAA,EACrC;AAEA,yBAAuB,oBAAoB,kBAAkB;AAC/D;;;ACheA,OAAOC,WAAU;AAGjB,IAAM,0BAA0B,CAAC,YAAoB;AACnD,SAAOA,MAAK,KAAK,SAAS,SAAS,UAAU;AAC/C;AAEA,IAAM,gCAAgC,CAAC,QAAiB,eAAuB;AAC7E,QAAM,aAAc,OAAoC;AAExD,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,gCAAgC,UAAU,EAAE;AAAA,EAC9D;AAEA,SAAO;AACT;AAEO,IAAM,iBAAiB,OAAO,YAG/B;AACJ,QAAM,aAAa,wBAAwB,QAAQ,OAAO;AAC1D,QAAM,SAAS,MAAM,QAAQ,WAAW,UAAU;AAClD,SAAO,8BAA8B,QAAQ,UAAU;AACzD;;;ACxBA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAEjB,IAAM,uBAAuB,CAAC,iBAAiB,UAAU,YAAY,cAAc;AAEnF,IAAM,wBAAwB,CAAC,oBAAoB,SAAS,aAAa,QAAQ,YAAY;AAC7F,IAAM,4BAA4B,CAAC,QAAQ,cAAc,gBAAgB,kBAAkB;AAsB3F,IAAM,gCAAgC,CAAC,gBAAkC;AACvE,SAAO,YAAY,SAAS,WAAW,mBAAmB;AAC5D;AAEA,IAAM,wBAAwB,MAAM;AAClC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,wBAAwB,MAAM;AAClC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,uBAAuB,MAAM;AACjC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,4BAA4B,MAAM;AACtC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,yBAAyB,MAAM;AACnC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,oBAAoB,MAAM;AAC9B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,kBAAkB,MAAM;AAC5B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,oBAAoB,MAAM;AAC9B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,2BAA2B,MAAM;AACrC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,qBAAqB,MAAM;AAC/B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,yBAAyB,MAAM;AACnC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,mBAAmB,MAAM;AAC7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,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","names":["require","path","fs","path"]}
@@ -4,7 +4,7 @@ import {
4
4
  isGeneratedDocsPath,
5
5
  loadDocsConfig,
6
6
  syncGeneratedDocsPages
7
- } from "./chunk-P3B7BX5L.js";
7
+ } from "./chunk-J3PGG76S.js";
8
8
  import {
9
9
  nivelPublicRoute
10
10
  } from "./chunk-PYYPYIBD.js";
@@ -241,4 +241,4 @@ var nivelPagesPlugin = () => {
241
241
  export {
242
242
  nivelPagesPlugin
243
243
  };
244
- //# sourceMappingURL=chunk-CPY5V43F.js.map
244
+ //# sourceMappingURL=chunk-S4W3JZLE.js.map
package/dist/cli.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  initConsumer,
5
5
  loadDocsConfig,
6
6
  syncGeneratedDocsPages
7
- } from "./chunk-P3B7BX5L.js";
7
+ } from "./chunk-J3PGG76S.js";
8
8
  import "./chunk-AT4O3RRN.js";
9
9
  import "./chunk-PYYPYIBD.js";
10
10
 
@@ -30,9 +30,17 @@ type InitConsumerResult = {
30
30
  createdFiles: string[];
31
31
  missingDependencies: string[];
32
32
  overwrittenFiles: string[];
33
+ packageJson: PackageJsonShape;
33
34
  skippedFiles: string[];
34
35
  updatedScripts: string[];
35
36
  };
37
+ type PackageJsonShape = {
38
+ dependencies?: Record<string, string>;
39
+ devDependencies?: Record<string, string>;
40
+ packageManager?: string;
41
+ scripts?: Record<string, string>;
42
+ type?: string;
43
+ };
36
44
  declare const getTailwindBootstrapWarnings: (rootDir: string) => string[];
37
45
  declare const getInitSummary: (result: InitConsumerResult) => string;
38
46
  declare const initConsumer: (options: InitConsumerOptions) => InitConsumerResult;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  nivelPagesPlugin
3
- } from "../chunk-CPY5V43F.js";
3
+ } from "../chunk-S4W3JZLE.js";
4
4
  import {
5
5
  getGeneratedPagesRoot,
6
6
  getInitSummary,
@@ -11,7 +11,7 @@ import {
11
11
  resolveDocsConfig,
12
12
  resolveDocsHref,
13
13
  syncGeneratedDocsPages
14
- } from "../chunk-P3B7BX5L.js";
14
+ } from "../chunk-J3PGG76S.js";
15
15
  import "../chunk-AT4O3RRN.js";
16
16
  import "../chunk-PYYPYIBD.js";
17
17
  export {
package/dist/vike.js CHANGED
@@ -3,11 +3,11 @@ import {
3
3
  } from "./chunk-U332EPCL.js";
4
4
  import {
5
5
  nivelPagesPlugin
6
- } from "./chunk-CPY5V43F.js";
6
+ } from "./chunk-S4W3JZLE.js";
7
7
  import {
8
8
  loadDocsConfig,
9
9
  resolveDocsConfig
10
- } from "./chunk-P3B7BX5L.js";
10
+ } from "./chunk-J3PGG76S.js";
11
11
  import {
12
12
  createHeadingSlugger,
13
13
  normalizeHeadingTitle
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unterberg/nivel",
3
- "version": "0.2.10",
3
+ "version": "0.2.12",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "repository": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/docs/icons.ts","../src/docs/resolveDocsConfig.ts","../src/runtime/node/codegen.ts","../src/runtime/node/loadDocsConfig.ts","../src/runtime/node/scaffold.ts"],"sourcesContent":["import type { LucideIcon } from 'lucide-react'\nimport * as lucideIcons from 'lucide-react'\n\ntype LucideModule = typeof import('lucide-react')\n\nexport type DocsIconName = {\n [Key in keyof LucideModule]: LucideModule[Key] extends LucideIcon ? Key : never\n}[keyof LucideModule]\n\nconst excludedLucideExports = new Set(['createLucideIcon', 'Icon', 'icons', 'LucideProvider', 'useLucideContext'])\n\nconst isLucideIconExport = (value: unknown) => {\n if (typeof value !== 'object' || value === null) {\n return false\n }\n\n return '$$typeof' in value && 'render' in value\n}\n\nconst docsIconNames = Object.freeze(\n Object.entries(lucideIcons)\n .filter(([name, value]) => !excludedLucideExports.has(name) && isLucideIconExport(value))\n .map(([name]) => name)\n .sort(),\n) as readonly DocsIconName[]\n\nconst docsIconNameSet = new Set<string>(docsIconNames)\n\nconst isDocsIconName = (value: string): value is DocsIconName => {\n return docsIconNameSet.has(value)\n}\n\nexport const assertDocsIconName = (value: string, context: string) => {\n if (isDocsIconName(value)) {\n return\n }\n\n throw new Error(\n `${context} must be a valid lucide-react icon export. Received \"${value}\". See https://lucide.dev/icons/`,\n )\n}\n","import { nivelAssetUrl, resolvePublicAssetUrl, withSiteBaseUrl } from '../shared/assets.js'\nimport type {\n DocsAlgoliaConfig,\n DocsBrandConfig,\n DocsConfig,\n DocsFooterConfig,\n DocsHeadConfig,\n DocsPageNode,\n DocsPartnerConfig,\n DocsSectionNode,\n DocsSidebarNode,\n ResolvedDocsAlgoliaConfig,\n ResolvedDocsBrandConfig,\n ResolvedDocsConfig,\n ResolvedDocsPage,\n ResolvedDocsPartnerConfig,\n ResolvedDocsPartnersConfig,\n ResolvedDocsSection,\n ResolvedDocsSocialConfig,\n ResolvedNavbarItem,\n ResolvedSidebarNode,\n ThemePreference,\n} from './types.js'\nimport { assertDocsIconName } from './icons.js'\n\nconst isExternalHref = (value: string) => {\n return /^(?:[a-z]+:)?\\/\\//i.test(value) || value.startsWith('mailto:') || value.startsWith('tel:')\n}\n\nconst normalizeBasePath = (value: string) => {\n const normalized = value.trim()\n\n if (!normalized) {\n throw new Error('Docs basePath must be a non-empty absolute path.')\n }\n\n if (!normalized.startsWith('/') || normalized.startsWith('//')) {\n throw new Error(`Docs basePath must start with \"/\". Received ${JSON.stringify(value)}.`)\n }\n\n if (normalized.includes('?') || normalized.includes('#')) {\n throw new Error(`Docs basePath cannot include query strings or hashes. Received ${JSON.stringify(value)}.`)\n }\n\n const collapsed = normalized.replace(/\\/+/g, '/').replace(/\\/+$/g, '')\n return collapsed === '' ? '/' : collapsed\n}\n\nconst normalizeContentDir = (value: string | undefined) => {\n const normalized = (value ?? 'docs').trim()\n\n if (!normalized) {\n throw new Error('Docs contentDir must be a non-empty project-relative path.')\n }\n\n if (normalized.startsWith('/') || normalized.startsWith('\\\\')) {\n throw new Error(`Docs contentDir must be project-relative. Received ${JSON.stringify(value)}.`)\n }\n\n if (/^[a-zA-Z]:[\\\\/]/.test(normalized)) {\n throw new Error(`Docs contentDir must be project-relative. Received ${JSON.stringify(value)}.`)\n }\n\n const segments = normalized.replaceAll('\\\\', '/').split('/')\n const resolvedSegments: string[] = []\n\n for (const segment of segments) {\n if (segment === '' || segment === '.') {\n continue\n }\n\n if (segment === '..') {\n throw new Error(`Docs contentDir cannot escape the project root. Received ${JSON.stringify(value)}.`)\n }\n\n resolvedSegments.push(segment)\n }\n\n if (resolvedSegments.length === 0) {\n throw new Error(`Docs contentDir must contain at least one path segment. Received ${JSON.stringify(value)}.`)\n }\n\n return resolvedSegments.join('/')\n}\n\nconst normalizeSlug = (value: string) => value.replace(/^\\/+|\\/+$/g, '')\n\nconst joinDocsHref = (basePath: string, slug: string) => {\n const normalizedBasePath = normalizeBasePath(basePath)\n const normalizedSlug = normalizeSlug(slug)\n\n if (!normalizedSlug) {\n return normalizedBasePath === '/' ? '/' : `${normalizedBasePath}/`\n }\n\n return normalizedBasePath === '/' ? `/${normalizedSlug}/` : `${normalizedBasePath}/${normalizedSlug}/`\n}\n\nconst normalizePathname = (value: string) => {\n const pathname = value.split('?')[0]?.split('#')[0] ?? value\n const normalized = pathname.trim().replace(/\\/+$/g, '')\n return normalized === '' ? '/' : `${normalized}/`.replace(/\\/+/g, '/')\n}\n\nexport const resolveDocsHref = (basePath: string, href: string) => {\n const normalized = href.trim()\n\n if (!normalized || normalized.startsWith('#') || isExternalHref(normalized)) {\n return null\n }\n\n const pathname = normalized.split('?')[0]?.split('#')[0] ?? normalized\n\n if (!pathname) {\n return null\n }\n\n if (pathname.startsWith('/')) {\n const normalizedPathname = normalizePathname(pathname)\n const normalizedBasePath = normalizeBasePath(basePath)\n\n if (normalizedBasePath === '/') {\n return normalizedPathname\n }\n\n return normalizedPathname === `${normalizedBasePath}/` || normalizedPathname.startsWith(`${normalizedBasePath}/`)\n ? normalizedPathname\n : null\n }\n\n if (pathname.startsWith('./') || pathname.startsWith('../')) {\n return null\n }\n\n return joinDocsHref(basePath, pathname)\n}\n\nconst normalizeSourcePath = (value: string) => {\n const segments = value.replaceAll('\\\\', '/').split('/')\n const normalizedSegments: string[] = []\n\n for (const segment of segments) {\n if (segment === '' || segment === '.') {\n continue\n }\n\n if (segment === '..') {\n normalizedSegments.pop()\n continue\n }\n\n normalizedSegments.push(segment)\n }\n\n return normalizedSegments.join('/')\n}\n\nconst getSectionHref = (items: ResolvedSidebarNode[], visibleOnly = false): string | null => {\n for (const item of items) {\n if (item.kind === 'page') {\n if (visibleOnly && !item.showInNav) {\n continue\n }\n\n return item.href\n }\n\n if (item.kind === 'group') {\n if (visibleOnly && !item.showInNav) {\n continue\n }\n\n const href = getSectionHref(item.items, visibleOnly)\n if (href) {\n return href\n }\n }\n }\n\n return null\n}\n\nconst resolveNavigationHref = (value: string, fieldName: string, basePath: string) => {\n const normalized = value.trim()\n\n if (!normalized) {\n throw new Error(`Docs ${fieldName} must be a non-empty string.`)\n }\n\n if (normalized.startsWith('#') || isExternalHref(normalized)) {\n return normalized\n }\n\n if (!normalized.startsWith('/')) {\n return joinDocsHref(basePath, normalized)\n }\n\n return normalizePathname(normalized)\n}\n\nconst resolveThemeConfig = (theme: DocsConfig['theme']) => {\n return {\n light: theme?.light ?? 'consumer-light',\n dark: theme?.dark ?? 'consumer-dark',\n defaultPreference: (theme?.defaultPreference ?? 'light') as ThemePreference,\n }\n}\n\nconst resolveFooterConfig = (footer: DocsFooterConfig | undefined) => {\n return {\n pagination: footer?.pagination ?? false,\n }\n}\n\nconst resolveRobotsConfig = (robots: DocsConfig['robots']) => {\n return robots ?? true\n}\n\nconst resolveCustomFontsConfig = (customFonts: DocsConfig['customFonts']) => {\n return customFonts ?? true\n}\n\nconst resolveBrandConfig = (brand: DocsBrandConfig | undefined, siteTitle: string): ResolvedDocsBrandConfig => {\n const text = brand?.text ?? siteTitle\n\n return {\n text,\n href: withSiteBaseUrl(brand?.href ?? '/'),\n logoLight: resolvePublicAssetUrl(brand?.logoLight),\n logoDark: resolvePublicAssetUrl(brand?.logoDark),\n logoAlt: brand?.logoAlt ?? `${text} logo`,\n }\n}\n\nconst resolveHeadConfig = (head: DocsHeadConfig | undefined, customFonts: boolean) => {\n const fontPreset = customFonts ? (head?.fontPreset ?? 'inter') : 'none'\n const defaultFontStylesheetHref = fontPreset === 'inter' ? nivelAssetUrl('fonts/fonts-inter.css') : undefined\n const defaultFontPreloadHrefs =\n fontPreset === 'inter'\n ? [\n nivelAssetUrl('fonts/inter-v20-latin-regular.woff2'),\n nivelAssetUrl('fonts/inter-v20-latin-600.woff2'),\n nivelAssetUrl('fonts/inter-v20-latin-800.woff2'),\n ]\n : []\n\n return {\n customFonts,\n faviconSvg: resolvePublicAssetUrl(head?.faviconSvg),\n faviconIco: resolvePublicAssetUrl(head?.faviconIco),\n appleTouchIcon: resolvePublicAssetUrl(head?.appleTouchIcon),\n fontPreset,\n fontStylesheetHref: head?.fontStylesheetHref ?? defaultFontStylesheetHref,\n fontPreloadHrefs: head?.fontPreloadHrefs ?? defaultFontPreloadHrefs,\n }\n}\n\nconst resolvePartnerAssetUrl = (value: string | undefined) => {\n if (!value) {\n return undefined\n }\n\n return resolvePublicAssetUrl(value)\n}\n\nconst resolvePartner = (partner: DocsPartnerConfig): ResolvedDocsPartnerConfig => {\n return {\n name: partner.name,\n href: withSiteBaseUrl(partner.href),\n logoLight: resolvePartnerAssetUrl(partner.logoLight) ?? partner.logoLight,\n logoDark: resolvePartnerAssetUrl(partner.logoDark),\n logoAlt: partner.logoAlt ?? `${partner.name} logo`,\n }\n}\n\nconst resolveSocialConfig = (social: DocsConfig['social']): ResolvedDocsSocialConfig => {\n // keep the order from the config\n return {\n ...social,\n }\n}\n\nconst resolvePartnersConfig = (partners: DocsConfig['partners']): ResolvedDocsPartnersConfig => {\n return {\n primary: (partners?.primary ?? []).map(resolvePartner),\n gold: (partners?.gold ?? []).map(resolvePartner),\n }\n}\n\nconst requireTrimmedString = (value: string, fieldName: string) => {\n const normalized = value.trim()\n\n if (!normalized) {\n throw new Error(`Docs algolia config \"${fieldName}\" must be a non-empty string.`)\n }\n\n return normalized\n}\n\nconst resolveAlgoliaConfig = (algolia: DocsAlgoliaConfig | undefined): ResolvedDocsAlgoliaConfig | null => {\n if (!algolia) {\n return null\n }\n\n return {\n appId: requireTrimmedString(algolia.appId, 'appId'),\n apiKey: requireTrimmedString(algolia.apiKey, 'apiKey'),\n indexName: requireTrimmedString(algolia.indexName, 'indexName'),\n fields: {\n href: algolia.fields?.href?.trim() || 'href',\n title: algolia.fields?.title?.trim() || 'title',\n excerpt: algolia.fields?.excerpt?.trim() || 'excerpt',\n sectionTitle: algolia.fields?.sectionTitle?.trim() || 'sectionTitle',\n },\n searchParams: algolia.searchParams ?? {},\n }\n}\n\nconst normalizeAliases = (aliases: string[] | undefined, slug: string) => {\n const normalizedAliases = new Set<string>()\n\n for (const alias of aliases ?? []) {\n const normalizedAlias = normalizeSlug(alias)\n if (!normalizedAlias || normalizedAlias === slug) {\n continue\n }\n\n normalizedAliases.add(normalizedAlias)\n }\n\n return [...normalizedAliases]\n}\n\nexport const resolveDocsConfig = (config: DocsConfig): ResolvedDocsConfig => {\n const normalizedBasePath = normalizeBasePath(config.basePath)\n const normalizedContentDir = normalizeContentDir(config.contentDir)\n const customFonts = resolveCustomFontsConfig(config.customFonts)\n\n const pageIds = new Set<string>()\n const pageSlugs = new Set<string>()\n const pageAliases = new Set<string>()\n const groupIds = new Set<string>()\n const sectionIds = new Set<string>()\n const pages: ResolvedDocsPage[] = []\n const navbarItems: ResolvedNavbarItem[] = []\n\n const resolveSidebarNodes = (nodes: DocsSidebarNode[], sectionId: string): ResolvedSidebarNode[] => {\n return nodes.map((node) => {\n if (node.kind === 'group') {\n if (groupIds.has(node.id)) {\n throw new Error(`Duplicate docs group id \"${node.id}\".`)\n }\n\n if (node.icon) {\n assertDocsIconName(node.icon, `Docs group \"${node.id}\" icon`)\n }\n\n groupIds.add(node.id)\n\n return {\n kind: 'group',\n id: node.id,\n title: node.title,\n href: node.href ? resolveNavigationHref(node.href, `group \"${node.id}\" href`, normalizedBasePath) : undefined,\n showInNav: node.showInNav ?? true,\n collapsible: node.collapsible,\n items: resolveSidebarNodes(node.items, sectionId),\n icon: node.icon,\n }\n }\n\n if (node.kind !== 'page') {\n throw new Error(`Invalid docs sidebar node: ${JSON.stringify(node)}`)\n }\n\n const pageNode = node as DocsPageNode\n const slug = normalizeSlug(pageNode.slug)\n const aliases = normalizeAliases(pageNode.aliases, slug)\n\n if (pageNode.icon) {\n assertDocsIconName(pageNode.icon, `Docs page \"${pageNode.id}\" icon`)\n }\n\n if (!slug) {\n throw new Error(`Docs page \"${pageNode.id}\" must define a non-empty slug.`)\n }\n\n if (pageIds.has(pageNode.id)) {\n throw new Error(`Duplicate docs page id \"${pageNode.id}\".`)\n }\n\n if (pageSlugs.has(slug)) {\n throw new Error(`Duplicate docs page slug \"${slug}\".`)\n }\n\n for (const alias of aliases) {\n if (pageSlugs.has(alias) || pageAliases.has(alias)) {\n throw new Error(`Duplicate docs page alias \"${alias}\".`)\n }\n }\n\n pageIds.add(pageNode.id)\n pageSlugs.add(slug)\n for (const alias of aliases) {\n pageAliases.add(alias)\n }\n\n const href = joinDocsHref(normalizedBasePath, slug)\n const page: ResolvedDocsPage = {\n ...pageNode,\n slug,\n aliases,\n href,\n aliasHrefs: aliases.map((alias) => joinDocsHref(normalizedBasePath, alias)),\n tableOfContents: pageNode.tableOfContents ?? true,\n sectionId,\n documentTitle: `${pageNode.title} | ${config.siteTitle}`,\n source: normalizeSourcePath(pageNode.source),\n }\n pages.push(page)\n\n return {\n kind: 'page',\n id: pageNode.id,\n title: pageNode.title,\n navTitle: pageNode.navTitle ?? pageNode.title,\n href,\n showInNav: pageNode.showInNav ?? true,\n icon: pageNode.icon,\n }\n })\n }\n\n const sections: ResolvedDocsSection[] = config.graph.items.map((section: DocsSectionNode) => {\n if (section.kind !== 'section') {\n throw new Error(`Top-level docs graph items must be sections. Received ${JSON.stringify(section)}`)\n }\n\n if (sectionIds.has(section.id)) {\n throw new Error(`Duplicate docs section id \"${section.id}\".`)\n }\n\n if (section.icon) {\n assertDocsIconName(section.icon, `Docs section \"${section.id}\" icon`)\n }\n\n sectionIds.add(section.id)\n\n const items = resolveSidebarNodes(section.items, section.id)\n const firstVisibleHref = getSectionHref(items, true)\n const href = section.href\n ? resolveNavigationHref(section.href, `section \"${section.id}\" href`, normalizedBasePath)\n : (firstVisibleHref ?? getSectionHref(items))\n\n if (!href) {\n throw new Error(`Docs section \"${section.id}\" must contain at least one page.`)\n }\n\n const resolvedSection: ResolvedDocsSection = {\n id: section.id,\n title: section.title,\n navTitle: section.navTitle ?? section.title,\n href,\n items,\n icon: section.icon,\n }\n\n navbarItems.push({\n id: section.id,\n title: resolvedSection.navTitle,\n href: resolvedSection.href,\n })\n\n return resolvedSection\n })\n\n if (pages.length === 0) {\n throw new Error('Docs graph must contain at least one page.')\n }\n\n return {\n siteTitle: config.siteTitle,\n siteDescription: config.siteDescription ?? null,\n robots: resolveRobotsConfig(config.robots),\n customFonts,\n basePath: normalizedBasePath,\n contentDir: normalizedContentDir,\n theme: resolveThemeConfig(config.theme),\n footer: resolveFooterConfig(config.footer),\n brand: resolveBrandConfig(config.brand, config.siteTitle),\n head: resolveHeadConfig(config.head, customFonts),\n partners: resolvePartnersConfig(config.partners),\n social: resolveSocialConfig(config.social),\n algolia: resolveAlgoliaConfig(config.algolia),\n pages,\n sections,\n navbarItems,\n }\n}\n\nexport const getResolvedPageById = (config: { pages: ResolvedDocsPage[] }, pageId: string) => {\n const page = config.pages.find((candidate) => candidate.id === pageId)\n if (!page) {\n throw new Error(`Unknown docs page id \"${pageId}\".`)\n }\n return page\n}\n","import fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport path from 'node:path'\nimport { extractDocHeadings } from '../../docs/docHeadings.js'\nimport { getDocsIconMapKey } from '../../docs/iconKeys.js'\nimport { getResolvedPageById, resolveDocsConfig } from '../../docs/resolveDocsConfig.js'\nimport type {\n DocPageData,\n DocPageLinkData,\n DocsConfig,\n DocsGlobalContextSerializableData,\n DocsIconName,\n ResolvedSidebarNode,\n} from '../../docs/types.js'\n\nconst GENERATED_DIRNAME = '(nivel-generated)'\nconst require = createRequire(import.meta.url)\nconst lucidePackageRoot = path.dirname(require.resolve('lucide-react/package.json'))\nconst lucideEsmEntryPath = path.join(lucidePackageRoot, 'dist', 'esm', 'lucide-react.js')\nconst lucideEsmIconsDirectoryPath = path.join(lucidePackageRoot, 'dist', 'esm', 'icons')\n\ntype GeneratedDocsIconNode = [tagName: string, attrs: Record<string, string>][]\n\nlet lucideIconModuleNameByExportName: Map<string, string> | null = null\nconst lucideIconNodeByName = new Map<DocsIconName, GeneratedDocsIconNode>()\n\nconst writeFileIfChanged = (filePath: string, source: string) => {\n const current = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : null\n if (current === source) {\n return\n }\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n fs.writeFileSync(filePath, source)\n}\n\nconst toPosix = (value: string) => value.split(path.sep).join(path.posix.sep)\n\nconst getRelativeImportPath = (fromDirectory: string, toFile: string) => {\n const relativePath = toPosix(path.relative(fromDirectory, toFile))\n if (relativePath.startsWith('.')) {\n return relativePath\n }\n return `./${relativePath}`\n}\n\nconst serializeData = (data: DocPageData | DocsGlobalContextSerializableData) => JSON.stringify(data, null, 2)\n\nconst collectFiles = (directoryPath: string): string[] => {\n if (!fs.existsSync(directoryPath)) {\n return []\n }\n\n const entries = fs.readdirSync(directoryPath, { withFileTypes: true })\n\n return entries.flatMap((entry) => {\n const entryPath = path.join(directoryPath, entry.name)\n return entry.isDirectory() ? collectFiles(entryPath) : [entryPath]\n })\n}\n\nconst removeEmptyDirectories = (directoryPath: string, rootPath: string) => {\n if (!fs.existsSync(directoryPath)) {\n return\n }\n\n for (const entry of fs.readdirSync(directoryPath, { withFileTypes: true })) {\n if (!entry.isDirectory()) {\n continue\n }\n\n removeEmptyDirectories(path.join(directoryPath, entry.name), rootPath)\n }\n\n if (directoryPath === rootPath) {\n return\n }\n\n if (fs.readdirSync(directoryPath).length === 0) {\n fs.rmdirSync(directoryPath)\n }\n}\n\nconst getGeneratedPageSource = (contentImportPath: string) => {\n return [\n \"import { DocsPage } from '@unterberg/nivel/client'\",\n `import Content from ${JSON.stringify(contentImportPath)}`,\n '',\n 'const Page = () => {',\n ' return <DocsPage Content={Content} />',\n '}',\n '',\n 'export default Page',\n '',\n ].join('\\n')\n}\n\nconst getGeneratedLayoutSource = () => {\n return [\n \"import { DocsRouteLayout } from '@unterberg/nivel/client'\",\n \"import type { ReactNode } from 'react'\",\n '',\n 'const Layout = ({ children }: { children: ReactNode }) => {',\n ' return <DocsRouteLayout>{children}</DocsRouteLayout>',\n '}',\n '',\n 'export default Layout',\n '',\n ].join('\\n')\n}\n\nconst getGeneratedDataSource = (data: DocPageData) => {\n return [\n \"import type { DocPageData } from '@unterberg/nivel'\",\n '',\n `const data: DocPageData = ${serializeData(data)}`,\n '',\n 'const pageData = () => {',\n ' return data',\n '}',\n '',\n 'export default pageData',\n '',\n ].join('\\n')\n}\n\ntype IconEntry = {\n iconKey: string\n iconName: DocsIconName\n}\n\nconst getSidebarIconEntries = (nodes: ResolvedSidebarNode[]): IconEntry[] => {\n return nodes.flatMap((node) => {\n const iconEntries = node.icon ? [{ iconKey: getDocsIconMapKey(node.kind, node.id), iconName: node.icon }] : []\n\n if (node.kind === 'group') {\n return [...iconEntries, ...getSidebarIconEntries(node.items)]\n }\n\n return iconEntries\n })\n}\n\nconst getGeneratedIconMapSource = (entries: IconEntry[]) => {\n if (entries.length === 0) {\n return '{}'\n }\n\n return ['{', ...entries.map(({ iconKey, iconName }) => ` ${JSON.stringify(iconKey)}: ${iconName},`), '}'].join('\\n')\n}\n\nconst getLucideIconModuleNameByExportName = () => {\n if (lucideIconModuleNameByExportName) {\n return lucideIconModuleNameByExportName\n }\n\n const lucideEntrySource = fs.readFileSync(lucideEsmEntryPath, 'utf8')\n const exportMap = new Map<string, string>()\n const exportPattern = /export\\s+\\{\\s*([\\s\\S]*?)\\s*\\}\\s+from\\s+'\\.\\/icons\\/([^']+)\\.js';/g\n\n for (const match of lucideEntrySource.matchAll(exportPattern)) {\n const exportsSource = match[1]\n const moduleName = match[2]\n\n if (!exportsSource || !moduleName) {\n continue\n }\n\n for (const exportPart of exportsSource.split(',').map((value) => value.trim())) {\n const exportMatch = /^default as (\\w+)$/.exec(exportPart)\n\n if (!exportMatch?.[1]) {\n continue\n }\n\n exportMap.set(exportMatch[1], moduleName)\n }\n }\n\n lucideIconModuleNameByExportName = exportMap\n return exportMap\n}\n\nconst getDocsIconNode = (iconName: DocsIconName) => {\n const cachedIconNode = lucideIconNodeByName.get(iconName)\n\n if (cachedIconNode) {\n return cachedIconNode\n }\n\n const moduleName = getLucideIconModuleNameByExportName().get(iconName)\n\n if (!moduleName) {\n throw new Error(`Unable to resolve lucide-react module for docs icon \"${iconName}\".`)\n }\n\n const iconModuleSource = fs.readFileSync(path.join(lucideEsmIconsDirectoryPath, `${moduleName}.js`), 'utf8')\n const iconNodeMatch = /const __iconNode = (\\[[\\s\\S]*?\\]);\\s*const /.exec(iconModuleSource)\n\n if (!iconNodeMatch?.[1]) {\n throw new Error(`Unable to read lucide-react icon node for docs icon \"${iconName}\".`)\n }\n\n const iconNode = Function(`\"use strict\"; return (${iconNodeMatch[1]})`)() as GeneratedDocsIconNode\n lucideIconNodeByName.set(iconName, iconNode)\n return iconNode\n}\n\nconst getGeneratedIconDefinitionsSource = (iconNames: DocsIconName[]) => {\n if (iconNames.length === 0) {\n return []\n }\n\n const definitions = iconNames.flatMap((iconName) => {\n return [`const ${iconName} = createDocsIcon(${JSON.stringify(getDocsIconNode(iconName))})`, '']\n })\n\n return [\n \"import { createElement, forwardRef, type SVGProps } from 'react'\",\n '',\n 'type DocsGeneratedIconProps = SVGProps<SVGSVGElement> & {',\n ' size?: string | number',\n ' absoluteStrokeWidth?: boolean',\n '}',\n '',\n 'type DocsGeneratedIconNode = [tagName: string, attrs: Record<string, string>][]',\n '',\n 'const docsGeneratedIconSvgAttrs = {',\n \" xmlns: 'http://www.w3.org/2000/svg',\",\n \" fill: 'none',\",\n \" viewBox: '0 0 24 24',\",\n \" stroke: 'currentColor',\",\n ' strokeWidth: 2,',\n \" strokeLinecap: 'round',\",\n \" strokeLinejoin: 'round',\",\n '} as const',\n '',\n 'const createDocsIcon = (iconNode: DocsGeneratedIconNode) => {',\n ' return forwardRef<SVGSVGElement, DocsGeneratedIconProps>(',\n ' ({ color = \"currentColor\", size = 24, strokeWidth = 2, absoluteStrokeWidth, children, ...props }, ref) => {',\n \" const resolvedSize = typeof size === 'number' ? size : Number(size)\",\n ' const resolvedStrokeWidth =',\n ' absoluteStrokeWidth && Number.isFinite(resolvedSize) && resolvedSize > 0',\n ' ? (Number(strokeWidth) * 24) / resolvedSize',\n ' : strokeWidth',\n '',\n ' return createElement(',\n \" 'svg',\",\n ' {',\n ' ...docsGeneratedIconSvgAttrs,',\n ' ...props,',\n ' ref,',\n ' width: size,',\n ' height: size,',\n ' stroke: color,',\n ' strokeWidth: resolvedStrokeWidth,',\n ' },',\n ' ...iconNode.map(([tagName, attrs]) => createElement(tagName, attrs)),',\n ' children,',\n ' )',\n ' },',\n ' )',\n '}',\n '',\n ...definitions,\n ]\n}\n\nconst getGeneratedGlobalContextSource = (data: DocsGlobalContextSerializableData) => {\n const iconEntries = data.sidebarSections.flatMap((section) => {\n const sectionIconEntries = section.icon\n ? [{ iconKey: getDocsIconMapKey('section', section.id), iconName: section.icon }]\n : []\n\n return [...sectionIconEntries, ...getSidebarIconEntries(section.items)]\n })\n const iconImports = [...new Set(iconEntries.map(({ iconName }) => iconName))].sort()\n\n return [\n \"import type { DocsGlobalContextData, DocsGlobalContextSerializableData, DocsIconMap } from '@unterberg/nivel'\",\n ...getGeneratedIconDefinitionsSource(iconImports),\n '',\n `const docsGlobalContextSerializableData: DocsGlobalContextSerializableData = ${serializeData(data)}`,\n '',\n `const docsIconMap: DocsIconMap = ${getGeneratedIconMapSource(iconEntries)}`,\n '',\n 'const docsGlobalContextData: DocsGlobalContextData = {',\n ' ...docsGlobalContextSerializableData,',\n ' docsIconMap,',\n '}',\n '',\n 'export { docsGlobalContextData }',\n '',\n ].join('\\n')\n}\n\nconst getRouteString = (href: string) => {\n if (href === '/') {\n return href\n }\n\n return href.replace(/\\/+$/g, '')\n}\n\nconst getGeneratedRouteSource = (href: string) => {\n return [`export default ${JSON.stringify(getRouteString(href))}`, ''].join('\\n')\n}\n\nconst getGeneratedTextExport = (value: string) => {\n return [`export default ${JSON.stringify(value)}`, ''].join('\\n')\n}\n\nconst toDocPageLinkData = (\n page:\n | {\n id: string\n title: string\n href: string\n documentTitle: string\n }\n | undefined,\n): DocPageLinkData | null => {\n if (!page) {\n return null\n }\n\n return {\n id: page.id,\n title: page.title,\n href: page.href,\n documentTitle: page.documentTitle,\n }\n}\n\nexport const getGeneratedPagesRoot = (rootDir: string) => path.join(rootDir, 'pages', GENERATED_DIRNAME)\n\nexport type DocsSourcePaths = {\n contentRootPath: string\n docsConfigPath: string\n docsGraphPath: string\n generatedRootPath: string\n}\n\nconst getDocsConfigPath = (rootDir: string) => path.join(rootDir, 'pages', '+docs.ts')\n\nconst getDocsGraphPath = (rootDir: string) => path.join(rootDir, 'docs', 'docs.graph.ts')\n\nexport const getDocsSourcePaths = (options: { rootDir: string; docsConfig: DocsConfig }): DocsSourcePaths => {\n const resolved = resolveDocsConfig(options.docsConfig)\n\n return {\n contentRootPath: path.join(options.rootDir, resolved.contentDir),\n docsConfigPath: getDocsConfigPath(options.rootDir),\n docsGraphPath: getDocsGraphPath(options.rootDir),\n generatedRootPath: getGeneratedPagesRoot(options.rootDir),\n }\n}\n\nexport const isDocsSourcePath = (filePath: string, docsSourcePaths: DocsSourcePaths) => {\n const normalized = toPosix(filePath)\n if (isGeneratedDocsPath(filePath, docsSourcePaths)) {\n return false\n }\n\n const docsConfigPath = toPosix(docsSourcePaths.docsConfigPath)\n const docsGraphPath = toPosix(docsSourcePaths.docsGraphPath)\n const contentRootPath = toPosix(docsSourcePaths.contentRootPath)\n\n return (\n normalized === docsConfigPath ||\n normalized === docsGraphPath ||\n normalized === contentRootPath ||\n normalized.startsWith(`${contentRootPath}/`)\n )\n}\n\nexport const isGeneratedDocsPath = (filePath: string, docsSourcePaths: DocsSourcePaths) => {\n const normalized = toPosix(filePath)\n const generatedRootPath = toPosix(docsSourcePaths.generatedRootPath)\n\n return normalized.startsWith(generatedRootPath)\n}\n\nexport const syncGeneratedDocsPages = (options: { rootDir: string; docsConfig: DocsConfig }) => {\n const { rootDir, docsConfig } = options\n const resolved = resolveDocsConfig(docsConfig)\n const generatedPagesRoot = getGeneratedPagesRoot(rootDir)\n const docsContentRoot = path.join(rootDir, resolved.contentDir)\n const expectedFiles = new Set<string>()\n const globalContextFilePath = path.join(generatedPagesRoot, '_docsGlobalContext.ts')\n const layoutFilePath = path.join(generatedPagesRoot, '+Layout.tsx')\n\n fs.mkdirSync(generatedPagesRoot, { recursive: true })\n\n const globalContextData: DocsGlobalContextSerializableData = {\n siteTitle: resolved.siteTitle,\n robots: resolved.robots,\n basePath: resolved.basePath,\n theme: resolved.theme,\n footer: resolved.footer,\n brand: resolved.brand,\n head: resolved.head,\n partners: resolved.partners,\n social: resolved.social,\n algolia: resolved.algolia,\n pages: resolved.pages,\n navbarItems: resolved.navbarItems,\n sidebarSections: resolved.sections,\n }\n\n writeFileIfChanged(globalContextFilePath, getGeneratedGlobalContextSource(globalContextData))\n writeFileIfChanged(layoutFilePath, getGeneratedLayoutSource())\n expectedFiles.add(globalContextFilePath)\n expectedFiles.add(layoutFilePath)\n\n for (const [pageIndex, page] of resolved.pages.entries()) {\n const contentFilePath = path.join(docsContentRoot, page.source)\n\n if (!fs.existsSync(contentFilePath)) {\n throw new Error(`Docs page \"${page.id}\" points to missing source file: ${contentFilePath}`)\n }\n\n const pageSource = fs.readFileSync(contentFilePath, 'utf8')\n const data: DocPageData = {\n page: getResolvedPageById(resolved, page.id),\n headings: extractDocHeadings(pageSource),\n previousPage: toDocPageLinkData(resolved.pages[pageIndex - 1]),\n nextPage: toDocPageLinkData(resolved.pages[pageIndex + 1]),\n }\n\n const routeTargets = [\n { routeHref: page.href, routePath: page.slug },\n ...page.aliases.map((routePath, index) => ({\n routeHref: page.aliasHrefs[index] as string,\n routePath,\n })),\n ]\n\n for (const { routeHref, routePath } of routeTargets) {\n const pageDir = path.join(generatedPagesRoot, ...routePath.split('/'))\n const contentImportPath = getRelativeImportPath(pageDir, contentFilePath)\n\n const pageFilePath = path.join(pageDir, '+Page.tsx')\n const dataFilePath = path.join(pageDir, '+data.ts')\n const routeFilePath = path.join(pageDir, '+route.ts')\n const titleFilePath = path.join(pageDir, '+title.ts')\n\n writeFileIfChanged(pageFilePath, getGeneratedPageSource(contentImportPath))\n writeFileIfChanged(dataFilePath, getGeneratedDataSource(data))\n writeFileIfChanged(routeFilePath, getGeneratedRouteSource(routeHref))\n writeFileIfChanged(titleFilePath, getGeneratedTextExport(page.documentTitle))\n\n expectedFiles.add(pageFilePath)\n expectedFiles.add(dataFilePath)\n expectedFiles.add(routeFilePath)\n expectedFiles.add(titleFilePath)\n\n if (page.description) {\n const descriptionFilePath = path.join(pageDir, '+description.ts')\n writeFileIfChanged(descriptionFilePath, getGeneratedTextExport(page.description))\n expectedFiles.add(descriptionFilePath)\n }\n }\n }\n\n for (const filePath of collectFiles(generatedPagesRoot)) {\n if (expectedFiles.has(filePath)) {\n continue\n }\n\n fs.rmSync(filePath, { force: true })\n }\n\n removeEmptyDirectories(generatedPagesRoot, generatedPagesRoot)\n}\n","import path from 'node:path'\nimport type { DocsConfig } from '../../docs/types.js'\n\nconst getDocsConfigModulePath = (rootDir: string) => {\n return path.join(rootDir, 'pages', '+docs.ts')\n}\n\nconst getDocsConfigFromLoadedModule = (loaded: unknown, modulePath: string) => {\n const docsConfig = (loaded as { default?: DocsConfig }).default\n\n if (!docsConfig) {\n throw new Error(`Expected default export from ${modulePath}`)\n }\n\n return docsConfig\n}\n\nexport const loadDocsConfig = async (options: {\n rootDir: string\n loadModule: (modulePath: string) => Promise<unknown>\n}) => {\n const modulePath = getDocsConfigModulePath(options.rootDir)\n const loaded = await options.loadModule(modulePath)\n return getDocsConfigFromLoadedModule(loaded, modulePath)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nconst MANAGED_SCRIPT_NAMES = ['generate:docs', 'predev', 'prebuild', 'pretypecheck'] as const\n\nconst REQUIRED_DEPENDENCIES = ['@unterberg/nivel', 'react', 'react-dom', 'vike', 'vike-react'] as const\nconst REQUIRED_DEV_DEPENDENCIES = ['vite', 'typescript', '@types/react', '@types/react-dom'] as const\n\ntype InitConsumerOptions = { force: boolean; rootDir: string }\n\ntype InitConsumerResult = {\n allDependenciesPresent: boolean\n createdFiles: string[]\n missingDependencies: string[]\n overwrittenFiles: string[]\n skippedFiles: string[]\n updatedScripts: string[]\n}\n\ntype PackageJsonShape = {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n packageManager?: string\n scripts?: Record<string, string>\n type?: string\n}\n\nconst getViteConfigTemplate = () => {\n return [\n \"import { nivelTailwindVite } from '@unterberg/nivel/tailwind'\",\n \"import vike from 'vike/plugin'\",\n '',\n 'process.env.VIKE_CRAWL ??= JSON.stringify({ git: false })',\n '',\n 'const base = (() => {',\n \" const normalized = process.env.PAGES_BASE_PATH?.trim().replace(/^\\\\/+|\\\\/+$/g, '') ?? ''\",\n \" return normalized ? `/${normalized}/` : '/'\",\n '})()',\n '',\n 'export default {',\n ' base,',\n ' plugins: [nivelTailwindVite(), vike()],',\n '}',\n '',\n ].join('\\n')\n}\n\nconst getDocsConfigTemplate = () => {\n return [\n \"import type { DocsConfig } from '@unterberg/nivel'\",\n \"import { docsGraph } from '../docs/docs.graph'\",\n '',\n 'const docsConfig = {',\n ' graph: docsGraph,',\n \" siteTitle: 'My Docs',\",\n \" siteDescription: 'Documentation site powered by @unterberg/nivel.',\",\n ' // Add siteUrl to enable automatic sitemap.xml and robots.txt generation.',\n \" // siteUrl: 'https://docs.example.com',\",\n ' // Set robots to false to emit noindex/nofollow and a disallow-all robots.txt.',\n ' // robots: false,',\n ' // Set customFonts to false if you want to fully own font loading in consumer CSS.',\n ' // customFonts: false,',\n \" basePath: '/docs',\",\n '} satisfies DocsConfig',\n '',\n 'export default docsConfig',\n '',\n ].join('\\n')\n}\n\nconst getDocsGraphTemplate = () => {\n return [\n \"import type { DocsGraph } from '@unterberg/nivel'\",\n '',\n 'export const docsGraph = {',\n ' items: [',\n ' {',\n \" kind: 'section',\",\n \" id: 'docs',\",\n \" title: 'Docs',\",\n ' items: [',\n ' {',\n \" kind: 'page',\",\n \" id: 'gettingStarted',\",\n \" title: 'Getting Started',\",\n \" slug: 'getting-started',\",\n \" source: 'content/getting-started/content.mdx',\",\n \" description: 'Getting started with @unterberg/nivel.',\",\n ' },',\n ' ],',\n ' },',\n ' ],',\n '} satisfies DocsGraph',\n '',\n ].join('\\n')\n}\n\nconst getGettingStartedTemplate = () => {\n return [\n 'This page is scaffolded by `nivel init` and wired through `docs/docs.graph.ts`.',\n '',\n '## Next steps',\n '',\n '- Update `pages/+docs.ts` with your site metadata.',\n '- Expand `docs/docs.graph.ts` with your docs structure.',\n '- Replace this page with your real getting-started guide.',\n '',\n ].join('\\n')\n}\n\nconst getLandingPageTemplate = () => {\n return [\n \"import { Link, LayoutComponent } from '@unterberg/nivel'\",\n '',\n '<LayoutComponent>',\n '# Welcome',\n '',\n 'This starter page is scaffolded by `nivel init` so the app can boot before you build a custom landing page.',\n '',\n '<Link href=\"/docs/getting-started/\">Read the getting started guide</Link>',\n '</LayoutComponent>',\n ].join('\\n')\n}\n\nconst getConfigTemplate = () => {\n return [\n \"import { createNivelVikeConfig } from '@unterberg/nivel/vike'\",\n \"import docsConfig from './+docs'\",\n '',\n 'const config = {',\n ' ...createNivelVikeConfig(docsConfig),',\n '',\n ' // User-facing Vike levers stay visible in +config.ts.',\n ' prerender: true,',\n ' // ssr: true,',\n \" // prefetchStaticAssets: 'viewport',\",\n '}',\n '',\n 'export default config',\n '',\n ].join('\\n')\n}\n\nconst getHeadTemplate = () => {\n return [\n \"import { MetaHead } from '@unterberg/nivel/client'\",\n '',\n 'export const Head = () => {',\n ' return <MetaHead />',\n '}',\n '',\n ].join('\\n')\n}\n\nconst getLayoutTemplate = () => {\n return [\n \"import { AppLayout } from '@unterberg/nivel/client'\",\n \"import type { ReactNode } from 'react'\",\n '',\n 'const Layout = ({ children }: { children: ReactNode }) => {',\n ' return <AppLayout>{children}</AppLayout>',\n '}',\n '',\n 'export default Layout',\n '',\n ].join('\\n')\n}\n\nconst getGlobalContextTemplate = () => {\n return [\n \"import { docsGlobalContextData } from './(nivel-generated)/_docsGlobalContext'\",\n '',\n 'export const onCreateGlobalContext = (globalContext: { docs?: typeof docsGlobalContextData }) => {',\n ' globalContext.docs = docsGlobalContextData',\n '}',\n '',\n ].join('\\n')\n}\n\nconst getWrapperTemplate = () => {\n return [\n \"import type { ReactNode } from 'react'\",\n \"import '../styles/global.css'\",\n '',\n 'const Wrapper = ({ children }: { children: ReactNode }) => {',\n ' return <>{children}</>',\n '}',\n '',\n 'export default Wrapper',\n '',\n ].join('\\n')\n}\n\nconst getGlobalStyleTemplate = () => {\n return [\n \"@import '@unterberg/nivel/tailwind.css';\",\n \"@import './theme.css';\",\n '',\n \"@source '../pages';\",\n \"@source '../docs';\",\n '',\n '@layer base {',\n ' html,',\n ' body {',\n ' @apply bg-base-100 text-base-content font-sans antialiased md:subpixel-antialiased;',\n ' }',\n '',\n ' .prose-container {',\n ' @apply prose prose-neutral max-w-none dark:prose-invert;',\n ' @apply prose-a:text-primary;',\n ' @apply prose-pre:bg-base-200!;',\n ' @apply prose-code:rounded!;',\n ' @apply prose-code:bg-primary/5!;',\n ' @apply prose-code:border-primary/15!;',\n ' @apply prose-code:dark:bg-primary/10!;',\n ' @apply prose-code:dark:border-primary/20!;',\n ' @apply prose-p:leading-[180%];',\n ' @apply prose-li:leading-[180%];',\n ' @apply prose-p:after:content-none;',\n ' @apply prose-p:before:content-none;',\n ' @apply prose-blockquote:not-italic;',\n ' @apply prose-blockquote:bg-base-200;',\n ' @apply prose-blockquote:py-2;',\n ' }',\n '',\n ' .prose-container :where(p, li, blockquote, td, th, a) {',\n ' overflow-wrap: anywhere;',\n ' word-break: break-word;',\n ' }',\n '}',\n '',\n ].join('\\n')\n}\n\nconst getThemeTemplate = () => {\n return [\n '@custom-variant dark (&:where(',\n \" [data-theme='consumer-dark'],\",\n \" [data-theme='consumer-dark'] *\",\n ' ));',\n '',\n \"@plugin '@unterberg/nivel/daisyui-theme' {\",\n \" name: 'consumer-light';\",\n ' default: true;',\n ' prefersdark: false;',\n \" color-scheme: 'light';\",\n ' --color-base-100: #f6f6f4;',\n ' --color-base-200: #ffffff;',\n ' --color-base-300: #ecebe7;',\n ' --color-base-content: #171717;',\n ' --color-primary: #0f766e;',\n ' --color-primary-content: #f8fafc;',\n ' --color-secondary: #d97706;',\n ' --color-secondary-content: #111827;',\n ' --color-accent: #1d4ed8;',\n ' --color-accent-content: #f8fafc;',\n ' --color-neutral: #171717;',\n ' --color-neutral-content: #f8fafc;',\n ' --color-info: #2563eb;',\n ' --color-info-content: #eff6ff;',\n ' --color-success: #15803d;',\n ' --color-success-content: #f0fdf4;',\n ' --color-warning: #d97706;',\n ' --color-warning-content: #fff7ed;',\n ' --color-error: #dc2626;',\n ' --color-error-content: #fef2f2;',\n ' --radius-selector: 0.25rem;',\n ' --radius-field: 0.5rem;',\n ' --radius-box: 1rem;',\n ' --size-selector: 0.25rem;',\n ' --size-field: 0.25rem;',\n ' --border: 1px;',\n ' --depth: 0;',\n ' --noise: 0;',\n '}',\n '',\n \"@plugin '@unterberg/nivel/daisyui-theme' {\",\n \" name: 'consumer-dark';\",\n ' default: false;',\n ' prefersdark: false;',\n \" color-scheme: 'dark';\",\n ' --color-base-100: #151515;',\n ' --color-base-200: #1e1e1e;',\n ' --color-base-300: #2a2a2a;',\n ' --color-base-content: #ededed;',\n ' --color-primary: #2dd4bf;',\n ' --color-primary-content: #042f2e;',\n ' --color-secondary: #f59e0b;',\n ' --color-secondary-content: #1c1917;',\n ' --color-accent: #60a5fa;',\n ' --color-accent-content: #172554;',\n ' --color-neutral: #ededed;',\n ' --color-neutral-content: #171717;',\n ' --color-info: #60a5fa;',\n ' --color-info-content: #172554;',\n ' --color-success: #4ade80;',\n ' --color-success-content: #052e16;',\n ' --color-warning: #fbbf24;',\n ' --color-warning-content: #451a03;',\n ' --color-error: #f87171;',\n ' --color-error-content: #450a0a;',\n ' --radius-selector: 0.25rem;',\n ' --radius-field: 0.5rem;',\n ' --radius-box: 1rem;',\n ' --size-selector: 0.25rem;',\n ' --size-field: 0.25rem;',\n ' --border: 1px;',\n ' --depth: 0;',\n ' --noise: 0;',\n '}',\n '',\n '@theme inline {',\n ' --color-base-muted: color-mix(',\n ' in oklab,',\n ' var(--color-base-content) 65%,',\n ' transparent',\n ' );',\n ' --color-base-muted-medium: color-mix(',\n ' in oklab,',\n ' var(--color-base-content) 40%,',\n ' transparent',\n ' );',\n ' --color-base-muted-light: color-mix(',\n ' in oklab,',\n ' var(--color-base-content) 12%,',\n ' transparent',\n ' );',\n ' --color-base-muted-superlight: color-mix(',\n ' in oklab,',\n ' var(--color-base-content) 5%,',\n ' transparent',\n ' );',\n ' --color-primary-muted: color-mix(',\n ' in oklab,',\n ' var(--color-primary) 80%,',\n ' transparent',\n ' );',\n ' --color-primary-muted-medium: color-mix(',\n ' in oklab,',\n ' var(--color-primary) 50%,',\n ' transparent',\n ' );',\n ' --color-primary-muted-light: color-mix(',\n ' in oklab,',\n ' var(--color-primary) 20%,',\n ' transparent',\n ' );',\n ' --color-primary-muted-superlight: color-mix(',\n ' in oklab,',\n ' var(--color-primary) 5%,',\n ' transparent',\n ' );',\n \" --font-sans: 'Inter', 'Helvetica Neue', sans-serif;\",\n ' --font-mono:',\n \" 'Monaco', 'SF Mono', SF Mono, SF Mono Regular, Consolas, 'Liberation Mono',\",\n ' Menlo, Courier, monospace;',\n '}',\n '',\n ].join('\\n')\n}\n\nconst getGlobalTypesTemplate = () => {\n return [\n \"declare module '*.mdx' {\",\n \" import type { ComponentType } from 'react'\",\n '',\n ' const MdxComponent: ComponentType',\n ' export default MdxComponent',\n '}',\n '',\n \"declare module '*.css'\",\n '',\n 'declare global {',\n ' namespace Vike {',\n ' interface GlobalContext {',\n \" docs: import('@unterberg/nivel').DocsGlobalContextData\",\n ' }',\n ' }',\n '}',\n '',\n ].join('\\n')\n}\n\nconst getManagedFileEntries = () => {\n return [\n ['vite.config.mts', getViteConfigTemplate()],\n ['pages/+docs.ts', getDocsConfigTemplate()],\n ['docs/docs.graph.ts', getDocsGraphTemplate()],\n ['docs/content/getting-started/content.mdx', getGettingStartedTemplate()],\n ['pages/index/+Page.mdx', getLandingPageTemplate()],\n ['pages/+config.ts', getConfigTemplate()],\n ['pages/+Head.tsx', getHeadTemplate()],\n ['pages/+Layout.tsx', getLayoutTemplate()],\n ['pages/+onCreateGlobalContext.ts', getGlobalContextTemplate()],\n ['pages/+Wrapper.tsx', getWrapperTemplate()],\n ['styles/global.css', getGlobalStyleTemplate()],\n ['styles/theme.css', getThemeTemplate()],\n ['global.d.ts', getGlobalTypesTemplate()],\n ] as const\n}\n\nconst readFileIfExists = (filePath: string) => {\n if (!fs.existsSync(filePath)) {\n return null\n }\n\n return fs.readFileSync(filePath, 'utf8')\n}\n\nexport const getTailwindBootstrapWarnings = (rootDir: string) => {\n const warnings: string[] = []\n const wrapperPath = path.join(rootDir, 'pages', '+Wrapper.tsx')\n const globalCssPath = path.join(rootDir, 'styles', 'global.css')\n const themeCssPath = path.join(rootDir, 'styles', 'theme.css')\n const packageJsonPath = path.join(rootDir, 'package.json')\n const viteConfigMtsPath = path.join(rootDir, 'vite.config.mts')\n const viteConfigTsPath = path.join(rootDir, 'vite.config.ts')\n\n const viteConfigPath = fs.existsSync(viteConfigMtsPath) ? viteConfigMtsPath : viteConfigTsPath\n const viteConfigSource = readFileIfExists(viteConfigPath)\n if (!viteConfigSource?.includes('@unterberg/nivel/tailwind') || !viteConfigSource.includes('nivelTailwindVite()')) {\n warnings.push(\n 'vite.config.mts should use @unterberg/nivel/tailwind and call nivelTailwindVite() for the engine-owned Tailwind integration.',\n )\n }\n\n if (viteConfigPath === viteConfigTsPath) {\n const packageJson = readFileIfExists(packageJsonPath)\n\n if (packageJson) {\n const parsedPackageJson = JSON.parse(packageJson) as PackageJsonShape\n\n if (parsedPackageJson.type !== 'module') {\n warnings.push(\n 'vite.config.ts is loaded through CommonJS in packages without \"type\": \"module\". Rename it to vite.config.mts to avoid ESM-only dependency errors.',\n )\n }\n }\n }\n\n const wrapperSource = readFileIfExists(wrapperPath)\n if (!wrapperSource?.includes('../styles/global.css')) {\n warnings.push('pages/+Wrapper.tsx should import ../styles/global.css.')\n }\n\n const globalCssSource = readFileIfExists(globalCssPath)\n if (\n !globalCssSource?.includes('@unterberg/nivel/tailwind.css') ||\n !globalCssSource.includes(\"@import './theme.css';\") ||\n !globalCssSource.includes(\"@source '../pages';\") ||\n !globalCssSource.includes(\"@source '../docs';\")\n ) {\n warnings.push(\n \"styles/global.css should import @unterberg/nivel/tailwind.css, import ./theme.css, and declare @source '../pages' plus @source '../docs'.\",\n )\n }\n\n if (!fs.existsSync(themeCssPath)) {\n warnings.push('styles/theme.css is missing; define local daisyUI themes there.')\n }\n\n return warnings\n}\n\nconst getGenerateDocsRunner = (packageJson: PackageJsonShape) => {\n const packageManager = packageJson.packageManager?.trim() ?? ''\n\n if (packageManager.startsWith('pnpm@')) {\n return 'pnpm generate:docs'\n }\n\n if (packageManager.startsWith('npm@')) {\n return 'npm run generate:docs'\n }\n\n return 'npm run generate:docs'\n}\n\nconst getManagedScripts = (packageJson: PackageJsonShape) => {\n const generateDocsRunner = getGenerateDocsRunner(packageJson)\n\n return {\n 'generate:docs': 'nivel prepare',\n predev: generateDocsRunner,\n prebuild: generateDocsRunner,\n pretypecheck: generateDocsRunner,\n } satisfies Record<(typeof MANAGED_SCRIPT_NAMES)[number], string>\n}\n\nconst writeFile = (filePath: string, source: string) => {\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n fs.writeFileSync(filePath, source)\n}\n\nconst writeManagedFile = (\n rootDir: string,\n relativeFilePath: string,\n source: string,\n force: boolean,\n result: InitConsumerResult,\n) => {\n const filePath = path.join(rootDir, relativeFilePath)\n const exists = fs.existsSync(filePath)\n\n if (exists && !force) {\n result.skippedFiles.push(relativeFilePath)\n return\n }\n\n writeFile(filePath, source)\n\n if (exists) {\n result.overwrittenFiles.push(relativeFilePath)\n return\n }\n\n result.createdFiles.push(relativeFilePath)\n}\n\nconst readPackageJson = (rootDir: string) => {\n const packageJsonPath = path.join(rootDir, 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n throw new Error(`Expected package.json in ${rootDir}`)\n }\n\n return {\n packageJson: JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as PackageJsonShape,\n packageJsonPath,\n }\n}\n\nconst patchPackageScripts = (packageJson: PackageJsonShape, packageJsonPath: string, result: InitConsumerResult) => {\n const scripts = { ...(packageJson.scripts ?? {}) }\n const managedScripts = getManagedScripts(packageJson)\n\n for (const scriptName of MANAGED_SCRIPT_NAMES) {\n if (scripts[scriptName] === managedScripts[scriptName]) {\n continue\n }\n\n scripts[scriptName] = managedScripts[scriptName]\n result.updatedScripts.push(scriptName)\n }\n\n const nextPackageJson = {\n ...packageJson,\n scripts,\n }\n\n fs.writeFileSync(packageJsonPath, `${JSON.stringify(nextPackageJson, null, 2)}\\n`)\n}\n\nconst getMissingDependencies = (packageJson: PackageJsonShape) => {\n const installed = new Set<string>([\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.devDependencies ?? {}),\n ])\n\n return [...REQUIRED_DEPENDENCIES, ...REQUIRED_DEV_DEPENDENCIES].filter((packageName) => !installed.has(packageName))\n}\n\nexport const getInitSummary = (result: InitConsumerResult) => {\n const lines = ['Initialized nivel consumer scaffolding.']\n\n if (result.createdFiles.length > 0) {\n lines.push(`Created files: ${result.createdFiles.join(', ')}`)\n }\n\n if (result.overwrittenFiles.length > 0) {\n lines.push(`Overwritten files: ${result.overwrittenFiles.join(', ')}`)\n }\n\n if (result.skippedFiles.length > 0) {\n lines.push(`Skipped existing files: ${result.skippedFiles.join(', ')}`)\n }\n\n if (result.updatedScripts.length > 0) {\n lines.push(`Updated package.json scripts: ${result.updatedScripts.join(', ')}`)\n }\n\n lines.push('Scaffolded vite.config.mts and local Tailwind starter files remain visible and editable in the consumer.')\n\n if (result.missingDependencies.length > 0) {\n lines.push(`Missing dependencies: ${result.missingDependencies.join(', ')}`)\n } else if (!result.allDependenciesPresent) {\n lines.push('Dependency validation completed with warnings.')\n } else {\n lines.push('All required dependencies are already present.')\n }\n\n return `${lines.join('\\n')}\\n`\n}\n\nexport const initConsumer = (options: InitConsumerOptions): InitConsumerResult => {\n const result: InitConsumerResult = {\n allDependenciesPresent: true,\n createdFiles: [],\n missingDependencies: [],\n overwrittenFiles: [],\n skippedFiles: [],\n updatedScripts: [],\n }\n\n const { packageJson, packageJsonPath } = readPackageJson(options.rootDir)\n\n for (const [relativeFilePath, source] of getManagedFileEntries()) {\n writeManagedFile(options.rootDir, relativeFilePath, source, options.force, result)\n }\n\n patchPackageScripts(packageJson, packageJsonPath, result)\n\n result.missingDependencies = getMissingDependencies(packageJson)\n result.allDependenciesPresent = result.missingDependencies.length === 0\n\n return result\n}\n"],"mappings":"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A,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,mBAAmB,MAAM;AAC7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;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","names":["require","path","fs","path"]}