@unterberg/nivel 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -65
- package/bin/nivel.mjs +3 -0
- package/dist/{chunk-G7X2IWYG.js → chunk-2EDJWL3U.js} +6 -64
- package/dist/chunk-2EDJWL3U.js.map +1 -0
- package/dist/chunk-67GE3PJ6.js +473 -0
- package/dist/chunk-67GE3PJ6.js.map +1 -0
- package/dist/chunk-AURANIZE.js +198 -0
- package/dist/chunk-AURANIZE.js.map +1 -0
- package/dist/{chunk-G37565OX.js → chunk-GHQDRDZL.js} +103 -58
- package/dist/chunk-GHQDRDZL.js.map +1 -0
- package/dist/chunk-JSZZPQEP.js +9 -0
- package/dist/chunk-JSZZPQEP.js.map +1 -0
- package/dist/{chunk-UWP3C7JT.js → chunk-Q7JU4J6A.js} +59 -23
- package/dist/chunk-Q7JU4J6A.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +117 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.js +2 -2
- package/dist/config.d.ts +6 -0
- package/dist/config.js +9 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +7 -1
- package/dist/mdx/code-blocks.d.ts +3 -1
- package/dist/mdx/code-blocks.js +5 -3
- package/dist/mdx.js +2 -1
- package/dist/mdx.js.map +1 -1
- package/dist/runtime/client.js +2 -2
- package/dist/runtime/node.d.ts +21 -1
- package/dist/runtime/node.js +10 -2
- package/dist/vike.d.ts +5 -1
- package/dist/vike.js +26 -4
- package/dist/vike.js.map +1 -1
- package/package.json +16 -4
- package/tailwind-sources.css +1 -0
- package/dist/chunk-G37565OX.js.map +0 -1
- package/dist/chunk-G7X2IWYG.js.map +0 -1
- package/dist/chunk-HXZEI3YF.js +0 -359
- package/dist/chunk-HXZEI3YF.js.map +0 -1
- package/dist/chunk-UWP3C7JT.js.map +0 -1
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
import {
|
|
2
|
+
extractDocHeadings,
|
|
3
|
+
getResolvedPageById,
|
|
4
|
+
resolveDocsConfig
|
|
5
|
+
} from "./chunk-D7IAGT53.js";
|
|
6
|
+
|
|
7
|
+
// src/runtime/node/codegen.ts
|
|
8
|
+
import fs from "fs";
|
|
9
|
+
import path from "path";
|
|
10
|
+
var GENERATED_DIRNAME = "(nivel-generated)";
|
|
11
|
+
var writeFileIfChanged = (filePath, source) => {
|
|
12
|
+
const current = fs.existsSync(filePath) ? fs.readFileSync(filePath, "utf8") : null;
|
|
13
|
+
if (current === source) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
17
|
+
fs.writeFileSync(filePath, source);
|
|
18
|
+
};
|
|
19
|
+
var toPosix = (value) => value.split(path.sep).join(path.posix.sep);
|
|
20
|
+
var getRelativeImportPath = (fromDirectory, toFile) => {
|
|
21
|
+
const relativePath = toPosix(path.relative(fromDirectory, toFile));
|
|
22
|
+
if (relativePath.startsWith(".")) {
|
|
23
|
+
return relativePath;
|
|
24
|
+
}
|
|
25
|
+
return `./${relativePath}`;
|
|
26
|
+
};
|
|
27
|
+
var serializeData = (data) => JSON.stringify(data, null, 2);
|
|
28
|
+
var collectFiles = (directoryPath) => {
|
|
29
|
+
if (!fs.existsSync(directoryPath)) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
const entries = fs.readdirSync(directoryPath, { withFileTypes: true });
|
|
33
|
+
return entries.flatMap((entry) => {
|
|
34
|
+
const entryPath = path.join(directoryPath, entry.name);
|
|
35
|
+
return entry.isDirectory() ? collectFiles(entryPath) : [entryPath];
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
var removeEmptyDirectories = (directoryPath, rootPath) => {
|
|
39
|
+
if (!fs.existsSync(directoryPath)) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
for (const entry of fs.readdirSync(directoryPath, { withFileTypes: true })) {
|
|
43
|
+
if (!entry.isDirectory()) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
removeEmptyDirectories(path.join(directoryPath, entry.name), rootPath);
|
|
47
|
+
}
|
|
48
|
+
if (directoryPath === rootPath) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (fs.readdirSync(directoryPath).length === 0) {
|
|
52
|
+
fs.rmdirSync(directoryPath);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
var getGeneratedPageSource = (contentImportPath) => {
|
|
56
|
+
return [
|
|
57
|
+
"import { DocsPage } from '@unterberg/nivel/client'",
|
|
58
|
+
`import Content from ${JSON.stringify(contentImportPath)}`,
|
|
59
|
+
"",
|
|
60
|
+
"const Page = () => {",
|
|
61
|
+
" return <DocsPage Content={Content} />",
|
|
62
|
+
"}",
|
|
63
|
+
"",
|
|
64
|
+
"export default Page",
|
|
65
|
+
""
|
|
66
|
+
].join("\n");
|
|
67
|
+
};
|
|
68
|
+
var getGeneratedDataSource = (data) => {
|
|
69
|
+
return [
|
|
70
|
+
"import type { DocPageData } from '@unterberg/nivel'",
|
|
71
|
+
"",
|
|
72
|
+
`const data: DocPageData = ${serializeData(data)}`,
|
|
73
|
+
"",
|
|
74
|
+
"const pageData = () => {",
|
|
75
|
+
" return data",
|
|
76
|
+
"}",
|
|
77
|
+
"",
|
|
78
|
+
"export default pageData",
|
|
79
|
+
""
|
|
80
|
+
].join("\n");
|
|
81
|
+
};
|
|
82
|
+
var getGeneratedGlobalContextSource = (data) => {
|
|
83
|
+
return [
|
|
84
|
+
"import type { DocsGlobalContextData } from '@unterberg/nivel'",
|
|
85
|
+
"",
|
|
86
|
+
`const docsGlobalContextData: DocsGlobalContextData = ${serializeData(data)}`,
|
|
87
|
+
"",
|
|
88
|
+
"export { docsGlobalContextData }",
|
|
89
|
+
""
|
|
90
|
+
].join("\n");
|
|
91
|
+
};
|
|
92
|
+
var getRouteString = (href) => {
|
|
93
|
+
if (href === "/") {
|
|
94
|
+
return href;
|
|
95
|
+
}
|
|
96
|
+
return href.replace(/\/+$/g, "");
|
|
97
|
+
};
|
|
98
|
+
var getGeneratedRouteSource = (href) => {
|
|
99
|
+
return [`export default ${JSON.stringify(getRouteString(href))}`, ""].join("\n");
|
|
100
|
+
};
|
|
101
|
+
var getGeneratedTextExport = (value) => {
|
|
102
|
+
return [`export default ${JSON.stringify(value)}`, ""].join("\n");
|
|
103
|
+
};
|
|
104
|
+
var toDocPageLinkData = (page) => {
|
|
105
|
+
if (!page) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
id: page.id,
|
|
110
|
+
title: page.title,
|
|
111
|
+
href: page.href,
|
|
112
|
+
documentTitle: page.documentTitle
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
var getGeneratedPagesRoot = (rootDir) => path.join(rootDir, "pages", GENERATED_DIRNAME);
|
|
116
|
+
var syncGeneratedDocsPages = (options) => {
|
|
117
|
+
const { rootDir, docsConfig } = options;
|
|
118
|
+
const resolved = resolveDocsConfig(docsConfig);
|
|
119
|
+
const generatedPagesRoot = getGeneratedPagesRoot(rootDir);
|
|
120
|
+
const docsRoot = path.join(rootDir, "docs");
|
|
121
|
+
const expectedFiles = /* @__PURE__ */ new Set();
|
|
122
|
+
const globalContextFilePath = path.join(generatedPagesRoot, "_docsGlobalContext.ts");
|
|
123
|
+
fs.mkdirSync(generatedPagesRoot, { recursive: true });
|
|
124
|
+
const globalContextData = {
|
|
125
|
+
siteTitle: resolved.siteTitle,
|
|
126
|
+
basePath: resolved.basePath,
|
|
127
|
+
theme: resolved.theme,
|
|
128
|
+
footer: resolved.footer,
|
|
129
|
+
brand: resolved.brand,
|
|
130
|
+
head: resolved.head,
|
|
131
|
+
partners: resolved.partners,
|
|
132
|
+
algolia: resolved.algolia,
|
|
133
|
+
pages: resolved.pages,
|
|
134
|
+
navbarItems: resolved.navbarItems,
|
|
135
|
+
sidebarSections: resolved.sections
|
|
136
|
+
};
|
|
137
|
+
writeFileIfChanged(globalContextFilePath, getGeneratedGlobalContextSource(globalContextData));
|
|
138
|
+
expectedFiles.add(globalContextFilePath);
|
|
139
|
+
for (const [pageIndex, page] of resolved.pages.entries()) {
|
|
140
|
+
const contentFilePath = path.join(docsRoot, page.source);
|
|
141
|
+
if (!fs.existsSync(contentFilePath)) {
|
|
142
|
+
throw new Error(`Docs page "${page.id}" points to missing source file: ${contentFilePath}`);
|
|
143
|
+
}
|
|
144
|
+
const pageSource = fs.readFileSync(contentFilePath, "utf8");
|
|
145
|
+
const data = {
|
|
146
|
+
page: getResolvedPageById(resolved, page.id),
|
|
147
|
+
headings: extractDocHeadings(pageSource),
|
|
148
|
+
previousPage: toDocPageLinkData(resolved.pages[pageIndex - 1]),
|
|
149
|
+
nextPage: toDocPageLinkData(resolved.pages[pageIndex + 1])
|
|
150
|
+
};
|
|
151
|
+
for (const routeHref of [page.href, ...page.aliasHrefs]) {
|
|
152
|
+
const routeSlug = routeHref.replace(/^\/docs\//, "").replace(/\/+$/g, "");
|
|
153
|
+
const pageDir = path.join(generatedPagesRoot, ...routeSlug.split("/"));
|
|
154
|
+
const contentImportPath = getRelativeImportPath(pageDir, contentFilePath);
|
|
155
|
+
const pageFilePath = path.join(pageDir, "+Page.tsx");
|
|
156
|
+
const dataFilePath = path.join(pageDir, "+data.ts");
|
|
157
|
+
const routeFilePath = path.join(pageDir, "+route.ts");
|
|
158
|
+
const titleFilePath = path.join(pageDir, "+title.ts");
|
|
159
|
+
writeFileIfChanged(pageFilePath, getGeneratedPageSource(contentImportPath));
|
|
160
|
+
writeFileIfChanged(dataFilePath, getGeneratedDataSource(data));
|
|
161
|
+
writeFileIfChanged(routeFilePath, getGeneratedRouteSource(routeHref));
|
|
162
|
+
writeFileIfChanged(titleFilePath, getGeneratedTextExport(page.documentTitle));
|
|
163
|
+
expectedFiles.add(pageFilePath);
|
|
164
|
+
expectedFiles.add(dataFilePath);
|
|
165
|
+
expectedFiles.add(routeFilePath);
|
|
166
|
+
expectedFiles.add(titleFilePath);
|
|
167
|
+
if (page.description) {
|
|
168
|
+
const descriptionFilePath = path.join(pageDir, "+description.ts");
|
|
169
|
+
writeFileIfChanged(descriptionFilePath, getGeneratedTextExport(page.description));
|
|
170
|
+
expectedFiles.add(descriptionFilePath);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
for (const filePath of collectFiles(generatedPagesRoot)) {
|
|
175
|
+
if (expectedFiles.has(filePath)) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
fs.rmSync(filePath, { force: true });
|
|
179
|
+
}
|
|
180
|
+
removeEmptyDirectories(generatedPagesRoot, generatedPagesRoot);
|
|
181
|
+
};
|
|
182
|
+
var isDocsSourcePath = (filePath, rootDir) => {
|
|
183
|
+
const normalized = toPosix(filePath);
|
|
184
|
+
const docsRoot = toPosix(path.join(rootDir, "docs"));
|
|
185
|
+
const docsConfigPath = toPosix(path.join(rootDir, "pages", "+docs.ts"));
|
|
186
|
+
const generatedRoot = toPosix(getGeneratedPagesRoot(rootDir));
|
|
187
|
+
if (normalized.startsWith(generatedRoot)) {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
return normalized === docsConfigPath || normalized.startsWith(`${docsRoot}/`);
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
// src/runtime/node/loadDocsConfig.ts
|
|
194
|
+
import path2 from "path";
|
|
195
|
+
var getDocsConfigModulePath = (rootDir) => {
|
|
196
|
+
return path2.join(rootDir, "pages", "+docs.ts");
|
|
197
|
+
};
|
|
198
|
+
var getDocsConfigFromLoadedModule = (loaded, modulePath) => {
|
|
199
|
+
const docsConfig = loaded.default;
|
|
200
|
+
if (!docsConfig) {
|
|
201
|
+
throw new Error(`Expected default export from ${modulePath}`);
|
|
202
|
+
}
|
|
203
|
+
return docsConfig;
|
|
204
|
+
};
|
|
205
|
+
var loadDocsConfig = async (options) => {
|
|
206
|
+
const modulePath = getDocsConfigModulePath(options.rootDir);
|
|
207
|
+
const loaded = await options.loadModule(modulePath);
|
|
208
|
+
return getDocsConfigFromLoadedModule(loaded, modulePath);
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
// src/runtime/node/scaffold.ts
|
|
212
|
+
import fs2 from "fs";
|
|
213
|
+
import path3 from "path";
|
|
214
|
+
var MANAGED_SCRIPT_NAMES = ["generate:docs", "predev", "prebuild", "pretypecheck"];
|
|
215
|
+
var REQUIRED_DEPENDENCIES = ["@unterberg/nivel", "react", "react-dom", "vike", "vike-react"];
|
|
216
|
+
var REQUIRED_DEV_DEPENDENCIES = ["vite", "typescript", "@types/react", "@types/react-dom"];
|
|
217
|
+
var getDocsConfigTemplate = () => {
|
|
218
|
+
return [
|
|
219
|
+
"import { defineDocsConfig } from '@unterberg/nivel/config'",
|
|
220
|
+
"import { docsGraph } from '../docs/docs.graph'",
|
|
221
|
+
"",
|
|
222
|
+
"const docsConfig = defineDocsConfig({",
|
|
223
|
+
" graph: docsGraph,",
|
|
224
|
+
" siteTitle: 'My Docs',",
|
|
225
|
+
" siteDescription: 'Documentation site powered by @unterberg/nivel.',",
|
|
226
|
+
" basePath: '/docs',",
|
|
227
|
+
"})",
|
|
228
|
+
"",
|
|
229
|
+
"export default docsConfig",
|
|
230
|
+
""
|
|
231
|
+
].join("\n");
|
|
232
|
+
};
|
|
233
|
+
var getDocsGraphTemplate = () => {
|
|
234
|
+
return [
|
|
235
|
+
"import { defineDocsGraph } from '@unterberg/nivel/config'",
|
|
236
|
+
"",
|
|
237
|
+
"export const docsGraph = defineDocsGraph({",
|
|
238
|
+
" items: [",
|
|
239
|
+
" {",
|
|
240
|
+
" kind: 'section',",
|
|
241
|
+
" id: 'docs',",
|
|
242
|
+
" title: 'Docs',",
|
|
243
|
+
" items: [",
|
|
244
|
+
" {",
|
|
245
|
+
" kind: 'page',",
|
|
246
|
+
" id: 'gettingStarted',",
|
|
247
|
+
" title: 'Getting Started',",
|
|
248
|
+
" slug: 'getting-started',",
|
|
249
|
+
" source: 'content/getting-started/content.mdx',",
|
|
250
|
+
" description: 'Getting started with @unterberg/nivel.',",
|
|
251
|
+
" },",
|
|
252
|
+
" ],",
|
|
253
|
+
" },",
|
|
254
|
+
" ],",
|
|
255
|
+
"})",
|
|
256
|
+
""
|
|
257
|
+
].join("\n");
|
|
258
|
+
};
|
|
259
|
+
var getConfigTemplate = () => {
|
|
260
|
+
return [
|
|
261
|
+
"import { createNivelVikeConfig } from '@unterberg/nivel/vike'",
|
|
262
|
+
"import docsConfig from './+docs'",
|
|
263
|
+
"",
|
|
264
|
+
"export { config }",
|
|
265
|
+
"",
|
|
266
|
+
"const config = createNivelVikeConfig(docsConfig)",
|
|
267
|
+
""
|
|
268
|
+
].join("\n");
|
|
269
|
+
};
|
|
270
|
+
var getHeadTemplate = () => {
|
|
271
|
+
return [
|
|
272
|
+
"import { MetaHead } from '@unterberg/nivel/client'",
|
|
273
|
+
"",
|
|
274
|
+
"export const Head = () => {",
|
|
275
|
+
" return <MetaHead />",
|
|
276
|
+
"}",
|
|
277
|
+
""
|
|
278
|
+
].join("\n");
|
|
279
|
+
};
|
|
280
|
+
var getLayoutTemplate = () => {
|
|
281
|
+
return [
|
|
282
|
+
"import { AppLayout } from '@unterberg/nivel/client'",
|
|
283
|
+
"import type { ReactNode } from 'react'",
|
|
284
|
+
"",
|
|
285
|
+
"const Layout = ({ children }: { children: ReactNode }) => {",
|
|
286
|
+
" return <AppLayout>{children}</AppLayout>",
|
|
287
|
+
"}",
|
|
288
|
+
"",
|
|
289
|
+
"export default Layout",
|
|
290
|
+
""
|
|
291
|
+
].join("\n");
|
|
292
|
+
};
|
|
293
|
+
var getGlobalContextTemplate = () => {
|
|
294
|
+
return [
|
|
295
|
+
"import { docsGlobalContextData } from './(nivel-generated)/_docsGlobalContext'",
|
|
296
|
+
"",
|
|
297
|
+
"export const onCreateGlobalContext = (globalContext: { docs?: typeof docsGlobalContextData }) => {",
|
|
298
|
+
" globalContext.docs = docsGlobalContextData",
|
|
299
|
+
"}",
|
|
300
|
+
""
|
|
301
|
+
].join("\n");
|
|
302
|
+
};
|
|
303
|
+
var getWrapperTemplate = () => {
|
|
304
|
+
return [
|
|
305
|
+
"import type { ReactNode } from 'react'",
|
|
306
|
+
"",
|
|
307
|
+
"const Wrapper = ({ children }: { children: ReactNode }) => {",
|
|
308
|
+
" return <>{children}</>",
|
|
309
|
+
"}",
|
|
310
|
+
"",
|
|
311
|
+
"export default Wrapper",
|
|
312
|
+
""
|
|
313
|
+
].join("\n");
|
|
314
|
+
};
|
|
315
|
+
var getGlobalTypesTemplate = () => {
|
|
316
|
+
return [
|
|
317
|
+
"declare module '*.mdx' {",
|
|
318
|
+
" import type { ComponentType } from 'react'",
|
|
319
|
+
"",
|
|
320
|
+
" const MdxComponent: ComponentType",
|
|
321
|
+
" export default MdxComponent",
|
|
322
|
+
"}",
|
|
323
|
+
"",
|
|
324
|
+
"declare module '*.css'",
|
|
325
|
+
"",
|
|
326
|
+
"declare global {",
|
|
327
|
+
" namespace Vike {",
|
|
328
|
+
" interface GlobalContext {",
|
|
329
|
+
" docs: import('@unterberg/nivel').DocsGlobalContextData",
|
|
330
|
+
" }",
|
|
331
|
+
" }",
|
|
332
|
+
"}",
|
|
333
|
+
""
|
|
334
|
+
].join("\n");
|
|
335
|
+
};
|
|
336
|
+
var getManagedFileEntries = () => {
|
|
337
|
+
return [
|
|
338
|
+
["pages/+docs.ts", getDocsConfigTemplate()],
|
|
339
|
+
["docs/docs.graph.ts", getDocsGraphTemplate()],
|
|
340
|
+
["pages/+config.ts", getConfigTemplate()],
|
|
341
|
+
["pages/+Head.tsx", getHeadTemplate()],
|
|
342
|
+
["pages/+Layout.tsx", getLayoutTemplate()],
|
|
343
|
+
["pages/+onCreateGlobalContext.ts", getGlobalContextTemplate()],
|
|
344
|
+
["pages/+Wrapper.tsx", getWrapperTemplate()],
|
|
345
|
+
["global.d.ts", getGlobalTypesTemplate()]
|
|
346
|
+
];
|
|
347
|
+
};
|
|
348
|
+
var getGenerateDocsRunner = (packageJson) => {
|
|
349
|
+
const packageManager = packageJson.packageManager?.trim() ?? "";
|
|
350
|
+
if (packageManager.startsWith("pnpm@")) {
|
|
351
|
+
return "pnpm generate:docs";
|
|
352
|
+
}
|
|
353
|
+
if (packageManager.startsWith("npm@")) {
|
|
354
|
+
return "npm run generate:docs";
|
|
355
|
+
}
|
|
356
|
+
return "npm run generate:docs";
|
|
357
|
+
};
|
|
358
|
+
var getManagedScripts = (packageJson) => {
|
|
359
|
+
const generateDocsRunner = getGenerateDocsRunner(packageJson);
|
|
360
|
+
return {
|
|
361
|
+
"generate:docs": "nivel prepare",
|
|
362
|
+
predev: generateDocsRunner,
|
|
363
|
+
prebuild: generateDocsRunner,
|
|
364
|
+
pretypecheck: generateDocsRunner
|
|
365
|
+
};
|
|
366
|
+
};
|
|
367
|
+
var writeFile = (filePath, source) => {
|
|
368
|
+
fs2.mkdirSync(path3.dirname(filePath), { recursive: true });
|
|
369
|
+
fs2.writeFileSync(filePath, source);
|
|
370
|
+
};
|
|
371
|
+
var writeManagedFile = (rootDir, relativeFilePath, source, force, result) => {
|
|
372
|
+
const filePath = path3.join(rootDir, relativeFilePath);
|
|
373
|
+
const exists = fs2.existsSync(filePath);
|
|
374
|
+
if (exists && !force) {
|
|
375
|
+
result.skippedFiles.push(relativeFilePath);
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
writeFile(filePath, source);
|
|
379
|
+
if (exists) {
|
|
380
|
+
result.overwrittenFiles.push(relativeFilePath);
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
result.createdFiles.push(relativeFilePath);
|
|
384
|
+
};
|
|
385
|
+
var readPackageJson = (rootDir) => {
|
|
386
|
+
const packageJsonPath = path3.join(rootDir, "package.json");
|
|
387
|
+
if (!fs2.existsSync(packageJsonPath)) {
|
|
388
|
+
throw new Error(`Expected package.json in ${rootDir}`);
|
|
389
|
+
}
|
|
390
|
+
return {
|
|
391
|
+
packageJson: JSON.parse(fs2.readFileSync(packageJsonPath, "utf8")),
|
|
392
|
+
packageJsonPath
|
|
393
|
+
};
|
|
394
|
+
};
|
|
395
|
+
var patchPackageScripts = (packageJson, packageJsonPath, result) => {
|
|
396
|
+
const scripts = { ...packageJson.scripts ?? {} };
|
|
397
|
+
const managedScripts = getManagedScripts(packageJson);
|
|
398
|
+
for (const scriptName of MANAGED_SCRIPT_NAMES) {
|
|
399
|
+
if (scripts[scriptName] === managedScripts[scriptName]) {
|
|
400
|
+
continue;
|
|
401
|
+
}
|
|
402
|
+
scripts[scriptName] = managedScripts[scriptName];
|
|
403
|
+
result.updatedScripts.push(scriptName);
|
|
404
|
+
}
|
|
405
|
+
const nextPackageJson = {
|
|
406
|
+
...packageJson,
|
|
407
|
+
scripts
|
|
408
|
+
};
|
|
409
|
+
fs2.writeFileSync(packageJsonPath, `${JSON.stringify(nextPackageJson, null, 2)}
|
|
410
|
+
`);
|
|
411
|
+
};
|
|
412
|
+
var getMissingDependencies = (packageJson) => {
|
|
413
|
+
const installed = /* @__PURE__ */ new Set([
|
|
414
|
+
...Object.keys(packageJson.dependencies ?? {}),
|
|
415
|
+
...Object.keys(packageJson.devDependencies ?? {})
|
|
416
|
+
]);
|
|
417
|
+
return [...REQUIRED_DEPENDENCIES, ...REQUIRED_DEV_DEPENDENCIES].filter((packageName) => !installed.has(packageName));
|
|
418
|
+
};
|
|
419
|
+
var getInitSummary = (result) => {
|
|
420
|
+
const lines = ["Initialized nivel consumer scaffolding."];
|
|
421
|
+
if (result.createdFiles.length > 0) {
|
|
422
|
+
lines.push(`Created files: ${result.createdFiles.join(", ")}`);
|
|
423
|
+
}
|
|
424
|
+
if (result.overwrittenFiles.length > 0) {
|
|
425
|
+
lines.push(`Overwritten files: ${result.overwrittenFiles.join(", ")}`);
|
|
426
|
+
}
|
|
427
|
+
if (result.skippedFiles.length > 0) {
|
|
428
|
+
lines.push(`Skipped existing files: ${result.skippedFiles.join(", ")}`);
|
|
429
|
+
}
|
|
430
|
+
if (result.updatedScripts.length > 0) {
|
|
431
|
+
lines.push(`Updated package.json scripts: ${result.updatedScripts.join(", ")}`);
|
|
432
|
+
}
|
|
433
|
+
if (result.missingDependencies.length > 0) {
|
|
434
|
+
lines.push(`Missing dependencies: ${result.missingDependencies.join(", ")}`);
|
|
435
|
+
lines.push(
|
|
436
|
+
"Consumer CSS stays hand-authored. Add your stylesheet import manually, for example in pages/+Wrapper.tsx."
|
|
437
|
+
);
|
|
438
|
+
} else if (!result.allDependenciesPresent) {
|
|
439
|
+
lines.push("Dependency validation completed with warnings.");
|
|
440
|
+
} else {
|
|
441
|
+
lines.push("All required dependencies are already present.");
|
|
442
|
+
}
|
|
443
|
+
return `${lines.join("\n")}
|
|
444
|
+
`;
|
|
445
|
+
};
|
|
446
|
+
var initConsumer = (options) => {
|
|
447
|
+
const result = {
|
|
448
|
+
allDependenciesPresent: true,
|
|
449
|
+
createdFiles: [],
|
|
450
|
+
missingDependencies: [],
|
|
451
|
+
overwrittenFiles: [],
|
|
452
|
+
skippedFiles: [],
|
|
453
|
+
updatedScripts: []
|
|
454
|
+
};
|
|
455
|
+
const { packageJson, packageJsonPath } = readPackageJson(options.rootDir);
|
|
456
|
+
for (const [relativeFilePath, source] of getManagedFileEntries()) {
|
|
457
|
+
writeManagedFile(options.rootDir, relativeFilePath, source, options.force, result);
|
|
458
|
+
}
|
|
459
|
+
patchPackageScripts(packageJson, packageJsonPath, result);
|
|
460
|
+
result.missingDependencies = getMissingDependencies(packageJson);
|
|
461
|
+
result.allDependenciesPresent = result.missingDependencies.length === 0;
|
|
462
|
+
return result;
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
export {
|
|
466
|
+
getGeneratedPagesRoot,
|
|
467
|
+
syncGeneratedDocsPages,
|
|
468
|
+
isDocsSourcePath,
|
|
469
|
+
loadDocsConfig,
|
|
470
|
+
getInitSummary,
|
|
471
|
+
initConsumer
|
|
472
|
+
};
|
|
473
|
+
//# sourceMappingURL=chunk-67GE3PJ6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime/node/codegen.ts","../src/runtime/node/loadDocsConfig.ts","../src/runtime/node/scaffold.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { DocPageData, DocPageLinkData, DocsConfig, DocsGlobalContextData } from '../../docs/types.js'\nimport { extractDocHeadings } from '../../docs/docHeadings.js'\nimport { getResolvedPageById, resolveDocsConfig } from '../../docs/resolveDocsConfig.js'\n\nconst GENERATED_DIRNAME = '(nivel-generated)'\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 | DocsGlobalContextData) => 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 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\nconst getGeneratedGlobalContextSource = (data: DocsGlobalContextData) => {\n return [\n \"import type { DocsGlobalContextData } from '@unterberg/nivel'\",\n '',\n `const docsGlobalContextData: DocsGlobalContextData = ${serializeData(data)}`,\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 const syncGeneratedDocsPages = (options: { rootDir: string; docsConfig: DocsConfig }) => {\n const { rootDir, docsConfig } = options\n const resolved = resolveDocsConfig(docsConfig)\n const generatedPagesRoot = getGeneratedPagesRoot(rootDir)\n const docsRoot = path.join(rootDir, 'docs')\n const expectedFiles = new Set<string>()\n const globalContextFilePath = path.join(generatedPagesRoot, '_docsGlobalContext.ts')\n\n fs.mkdirSync(generatedPagesRoot, { recursive: true })\n\n const globalContextData: DocsGlobalContextData = {\n siteTitle: resolved.siteTitle,\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 algolia: resolved.algolia,\n pages: resolved.pages,\n navbarItems: resolved.navbarItems,\n sidebarSections: resolved.sections,\n }\n\n writeFileIfChanged(globalContextFilePath, getGeneratedGlobalContextSource(globalContextData))\n expectedFiles.add(globalContextFilePath)\n\n for (const [pageIndex, page] of resolved.pages.entries()) {\n const contentFilePath = path.join(docsRoot, 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 for (const routeHref of [page.href, ...page.aliasHrefs]) {\n const routeSlug = routeHref.replace(/^\\/docs\\//, '').replace(/\\/+$/g, '')\n const pageDir = path.join(generatedPagesRoot, ...routeSlug.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\nexport const isDocsSourcePath = (filePath: string, rootDir: string) => {\n const normalized = toPosix(filePath)\n const docsRoot = toPosix(path.join(rootDir, 'docs'))\n const docsConfigPath = toPosix(path.join(rootDir, 'pages', '+docs.ts'))\n const generatedRoot = toPosix(getGeneratedPagesRoot(rootDir))\n\n if (normalized.startsWith(generatedRoot)) {\n return false\n }\n\n return normalized === docsConfigPath || normalized.startsWith(`${docsRoot}/`)\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'\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}\n\nconst getDocsConfigTemplate = () => {\n return [\n \"import { defineDocsConfig } from '@unterberg/nivel/config'\",\n \"import { docsGraph } from '../docs/docs.graph'\",\n '',\n 'const docsConfig = defineDocsConfig({',\n ' graph: docsGraph,',\n \" siteTitle: 'My Docs',\",\n \" siteDescription: 'Documentation site powered by @unterberg/nivel.',\",\n \" basePath: '/docs',\",\n '})',\n '',\n 'export default docsConfig',\n '',\n ].join('\\n')\n}\n\nconst getDocsGraphTemplate = () => {\n return [\n \"import { defineDocsGraph } from '@unterberg/nivel/config'\",\n '',\n 'export const docsGraph = defineDocsGraph({',\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 '})',\n '',\n ].join('\\n')\n}\n\nconst getConfigTemplate = () => {\n return [\n \"import { createNivelVikeConfig } from '@unterberg/nivel/vike'\",\n \"import docsConfig from './+docs'\",\n '',\n 'export { config }',\n '',\n 'const config = createNivelVikeConfig(docsConfig)',\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 '',\n 'const Wrapper = ({ children }: { children: ReactNode }) => {',\n ' return <>{children}</>',\n '}',\n '',\n 'export default Wrapper',\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 ['pages/+docs.ts', getDocsConfigTemplate()],\n ['docs/docs.graph.ts', getDocsGraphTemplate()],\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 ['global.d.ts', getGlobalTypesTemplate()],\n ] as const\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 if (result.missingDependencies.length > 0) {\n lines.push(`Missing dependencies: ${result.missingDependencies.join(', ')}`)\n lines.push(\n 'Consumer CSS stays hand-authored. Add your stylesheet import manually, for example in pages/+Wrapper.tsx.',\n )\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":";;;;;;;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAKjB,IAAM,oBAAoB;AAE1B,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,SAA8C,KAAK,UAAU,MAAM,MAAM,CAAC;AAEjG,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,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;AAEA,IAAM,kCAAkC,CAAC,SAAgC;AACvE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,wDAAwD,cAAc,IAAI,CAAC;AAAA,IAC3E;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;AAEhG,IAAM,yBAAyB,CAAC,YAAyD;AAC9F,QAAM,EAAE,SAAS,WAAW,IAAI;AAChC,QAAM,WAAW,kBAAkB,UAAU;AAC7C,QAAM,qBAAqB,sBAAsB,OAAO;AACxD,QAAM,WAAW,KAAK,KAAK,SAAS,MAAM;AAC1C,QAAM,gBAAgB,oBAAI,IAAY;AACtC,QAAM,wBAAwB,KAAK,KAAK,oBAAoB,uBAAuB;AAEnF,KAAG,UAAU,oBAAoB,EAAE,WAAW,KAAK,CAAC;AAEpD,QAAM,oBAA2C;AAAA,IAC/C,WAAW,SAAS;AAAA,IACpB,UAAU,SAAS;AAAA,IACnB,OAAO,SAAS;AAAA,IAChB,QAAQ,SAAS;AAAA,IACjB,OAAO,SAAS;AAAA,IAChB,MAAM,SAAS;AAAA,IACf,UAAU,SAAS;AAAA,IACnB,SAAS,SAAS;AAAA,IAClB,OAAO,SAAS;AAAA,IAChB,aAAa,SAAS;AAAA,IACtB,iBAAiB,SAAS;AAAA,EAC5B;AAEA,qBAAmB,uBAAuB,gCAAgC,iBAAiB,CAAC;AAC5F,gBAAc,IAAI,qBAAqB;AAEvC,aAAW,CAAC,WAAW,IAAI,KAAK,SAAS,MAAM,QAAQ,GAAG;AACxD,UAAM,kBAAkB,KAAK,KAAK,UAAU,KAAK,MAAM;AAEvD,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,eAAW,aAAa,CAAC,KAAK,MAAM,GAAG,KAAK,UAAU,GAAG;AACvD,YAAM,YAAY,UAAU,QAAQ,aAAa,EAAE,EAAE,QAAQ,SAAS,EAAE;AACxE,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;AAEO,IAAM,mBAAmB,CAAC,UAAkB,YAAoB;AACrE,QAAM,aAAa,QAAQ,QAAQ;AACnC,QAAM,WAAW,QAAQ,KAAK,KAAK,SAAS,MAAM,CAAC;AACnD,QAAM,iBAAiB,QAAQ,KAAK,KAAK,SAAS,SAAS,UAAU,CAAC;AACtE,QAAM,gBAAgB,QAAQ,sBAAsB,OAAO,CAAC;AAE5D,MAAI,WAAW,WAAW,aAAa,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,kBAAkB,WAAW,WAAW,GAAG,QAAQ,GAAG;AAC9E;;;AC7OA,OAAOA,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;AACjB,IAAM,uBAAuB,CAAC,iBAAiB,UAAU,YAAY,cAAc;AAEnF,IAAM,wBAAwB,CAAC,oBAAoB,SAAS,aAAa,QAAQ,YAAY;AAC7F,IAAM,4BAA4B,CAAC,QAAQ,cAAc,gBAAgB,kBAAkB;AAoB3F,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,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,oBAAoB,MAAM;AAC9B,SAAO;AAAA,IACL;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,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,EACF,EAAE,KAAK,IAAI;AACb;AAEA,IAAM,wBAAwB,MAAM;AAClC,SAAO;AAAA,IACL,CAAC,kBAAkB,sBAAsB,CAAC;AAAA,IAC1C,CAAC,sBAAsB,qBAAqB,CAAC;AAAA,IAC7C,CAAC,oBAAoB,kBAAkB,CAAC;AAAA,IACxC,CAAC,mBAAmB,gBAAgB,CAAC;AAAA,IACrC,CAAC,qBAAqB,kBAAkB,CAAC;AAAA,IACzC,CAAC,mCAAmC,yBAAyB,CAAC;AAAA,IAC9D,CAAC,sBAAsB,mBAAmB,CAAC;AAAA,IAC3C,CAAC,eAAe,uBAAuB,CAAC;AAAA,EAC1C;AACF;AAEA,IAAM,wBAAwB,CAAC,gBAAkC;AAC/D,QAAM,iBAAiB,YAAY,gBAAgB,KAAK,KAAK;AAE7D,MAAI,eAAe,WAAW,OAAO,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,WAAW,MAAM,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,IAAM,oBAAoB,CAAC,gBAAkC;AAC3D,QAAM,qBAAqB,sBAAsB,WAAW;AAE5D,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,cAAc;AAAA,EAChB;AACF;AAEA,IAAM,YAAY,CAAC,UAAkB,WAAmB;AACtD,EAAAD,IAAG,UAAUC,MAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,EAAAD,IAAG,cAAc,UAAU,MAAM;AACnC;AAEA,IAAM,mBAAmB,CACvB,SACA,kBACA,QACA,OACA,WACG;AACH,QAAM,WAAWC,MAAK,KAAK,SAAS,gBAAgB;AACpD,QAAM,SAASD,IAAG,WAAW,QAAQ;AAErC,MAAI,UAAU,CAAC,OAAO;AACpB,WAAO,aAAa,KAAK,gBAAgB;AACzC;AAAA,EACF;AAEA,YAAU,UAAU,MAAM;AAE1B,MAAI,QAAQ;AACV,WAAO,iBAAiB,KAAK,gBAAgB;AAC7C;AAAA,EACF;AAEA,SAAO,aAAa,KAAK,gBAAgB;AAC3C;AAEA,IAAM,kBAAkB,CAAC,YAAoB;AAC3C,QAAM,kBAAkBC,MAAK,KAAK,SAAS,cAAc;AAEzD,MAAI,CAACD,IAAG,WAAW,eAAe,GAAG;AACnC,UAAM,IAAI,MAAM,4BAA4B,OAAO,EAAE;AAAA,EACvD;AAEA,SAAO;AAAA,IACL,aAAa,KAAK,MAAMA,IAAG,aAAa,iBAAiB,MAAM,CAAC;AAAA,IAChE;AAAA,EACF;AACF;AAEA,IAAM,sBAAsB,CAAC,aAA+B,iBAAyB,WAA+B;AAClH,QAAM,UAAU,EAAE,GAAI,YAAY,WAAW,CAAC,EAAG;AACjD,QAAM,iBAAiB,kBAAkB,WAAW;AAEpD,aAAW,cAAc,sBAAsB;AAC7C,QAAI,QAAQ,UAAU,MAAM,eAAe,UAAU,GAAG;AACtD;AAAA,IACF;AAEA,YAAQ,UAAU,IAAI,eAAe,UAAU;AAC/C,WAAO,eAAe,KAAK,UAAU;AAAA,EACvC;AAEA,QAAM,kBAAkB;AAAA,IACtB,GAAG;AAAA,IACH;AAAA,EACF;AAEA,EAAAA,IAAG,cAAc,iBAAiB,GAAG,KAAK,UAAU,iBAAiB,MAAM,CAAC,CAAC;AAAA,CAAI;AACnF;AAEA,IAAM,yBAAyB,CAAC,gBAAkC;AAChE,QAAM,YAAY,oBAAI,IAAY;AAAA,IAChC,GAAG,OAAO,KAAK,YAAY,gBAAgB,CAAC,CAAC;AAAA,IAC7C,GAAG,OAAO,KAAK,YAAY,mBAAmB,CAAC,CAAC;AAAA,EAClD,CAAC;AAED,SAAO,CAAC,GAAG,uBAAuB,GAAG,yBAAyB,EAAE,OAAO,CAAC,gBAAgB,CAAC,UAAU,IAAI,WAAW,CAAC;AACrH;AAEO,IAAM,iBAAiB,CAAC,WAA+B;AAC5D,QAAM,QAAQ,CAAC,yCAAyC;AAExD,MAAI,OAAO,aAAa,SAAS,GAAG;AAClC,UAAM,KAAK,kBAAkB,OAAO,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,EAC/D;AAEA,MAAI,OAAO,iBAAiB,SAAS,GAAG;AACtC,UAAM,KAAK,sBAAsB,OAAO,iBAAiB,KAAK,IAAI,CAAC,EAAE;AAAA,EACvE;AAEA,MAAI,OAAO,aAAa,SAAS,GAAG;AAClC,UAAM,KAAK,2BAA2B,OAAO,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,EACxE;AAEA,MAAI,OAAO,eAAe,SAAS,GAAG;AACpC,UAAM,KAAK,iCAAiC,OAAO,eAAe,KAAK,IAAI,CAAC,EAAE;AAAA,EAChF;AAEA,MAAI,OAAO,oBAAoB,SAAS,GAAG;AACzC,UAAM,KAAK,yBAAyB,OAAO,oBAAoB,KAAK,IAAI,CAAC,EAAE;AAC3E,UAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,WAAW,CAAC,OAAO,wBAAwB;AACzC,UAAM,KAAK,gDAAgD;AAAA,EAC7D,OAAO;AACL,UAAM,KAAK,gDAAgD;AAAA,EAC7D;AAEA,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAC5B;AAEO,IAAM,eAAe,CAAC,YAAqD;AAChF,QAAM,SAA6B;AAAA,IACjC,wBAAwB;AAAA,IACxB,cAAc,CAAC;AAAA,IACf,qBAAqB,CAAC;AAAA,IACtB,kBAAkB,CAAC;AAAA,IACnB,cAAc,CAAC;AAAA,IACf,gBAAgB,CAAC;AAAA,EACnB;AAEA,QAAM,EAAE,aAAa,gBAAgB,IAAI,gBAAgB,QAAQ,OAAO;AAExE,aAAW,CAAC,kBAAkB,MAAM,KAAK,sBAAsB,GAAG;AAChE,qBAAiB,QAAQ,SAAS,kBAAkB,QAAQ,QAAQ,OAAO,MAAM;AAAA,EACnF;AAEA,sBAAoB,aAAa,iBAAiB,MAAM;AAExD,SAAO,sBAAsB,uBAAuB,WAAW;AAC/D,SAAO,yBAAyB,OAAO,oBAAoB,WAAW;AAEtE,SAAO;AACT;","names":["path","fs","path"]}
|