@unterberg/nivel 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +115 -0
  2. package/bin/nivel.mjs +3 -0
  3. package/dist/{chunk-73NPVCDQ.js → chunk-D7IAGT53.js} +56 -26
  4. package/dist/chunk-D7IAGT53.js.map +1 -0
  5. package/dist/chunk-DNCQR5NH.js +231 -0
  6. package/dist/chunk-DNCQR5NH.js.map +1 -0
  7. package/dist/{chunk-3JJ6TYWL.js → chunk-FARXFRHG.js} +120 -83
  8. package/dist/chunk-FARXFRHG.js.map +1 -0
  9. package/dist/chunk-K5ZYRA3G.js +198 -0
  10. package/dist/chunk-K5ZYRA3G.js.map +1 -0
  11. package/dist/{chunk-4WTEOEV2.js → chunk-L6ZVB6XH.js} +3 -3
  12. package/dist/chunk-L6ZVB6XH.js.map +1 -0
  13. package/dist/{chunk-FLO5CJZH.js → chunk-PYYPYIBD.js} +10 -3
  14. package/dist/chunk-PYYPYIBD.js.map +1 -0
  15. package/dist/{chunk-45CLUNJW.js → chunk-Q7JU4J6A.js} +69 -33
  16. package/dist/chunk-Q7JU4J6A.js.map +1 -0
  17. package/dist/chunk-UDOIFPCZ.js +1538 -0
  18. package/dist/chunk-UDOIFPCZ.js.map +1 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.js +78 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/client.d.ts +4 -8
  23. package/dist/client.js +4 -4
  24. package/dist/index.d.ts +8 -12
  25. package/dist/index.js +4 -8
  26. package/dist/{code-blocks.d.ts → mdx/code-blocks.d.ts} +3 -1
  27. package/dist/{code-blocks.js → mdx/code-blocks.js} +5 -3
  28. package/dist/mdx.js +4 -4
  29. package/dist/mdx.js.map +1 -1
  30. package/dist/runtime/client.d.ts +1 -1
  31. package/dist/runtime/client.js +4 -4
  32. package/dist/runtime/node.d.ts +23 -0
  33. package/dist/runtime/node.js +24 -0
  34. package/dist/{types-mvLNHHrf.d.ts → types-j0kEkMA4.d.ts} +47 -24
  35. package/dist/{config.js → vike.js} +9 -8
  36. package/dist/vike.js.map +1 -0
  37. package/package.json +25 -16
  38. package/tailwind-sources.css +1 -0
  39. package/assets/nivel/decorators/pattern-light.png +0 -0
  40. package/assets/nivel/decorators/pattern.png +0 -0
  41. package/dist/chunk-3JJ6TYWL.js.map +0 -1
  42. package/dist/chunk-45CLUNJW.js.map +0 -1
  43. package/dist/chunk-4WTEOEV2.js.map +0 -1
  44. package/dist/chunk-62MBEYU7.js +0 -1091
  45. package/dist/chunk-62MBEYU7.js.map +0 -1
  46. package/dist/chunk-73NPVCDQ.js.map +0 -1
  47. package/dist/chunk-FLO5CJZH.js.map +0 -1
  48. package/dist/chunk-PHHK2BAF.js +0 -350
  49. package/dist/chunk-PHHK2BAF.js.map +0 -1
  50. package/dist/config.js.map +0 -1
  51. package/dist/runtime/index.d.ts +0 -15
  52. package/dist/runtime/index.js +0 -18
  53. /package/dist/{code-blocks.js.map → mdx/code-blocks.js.map} +0 -0
  54. /package/dist/runtime/{index.js.map → node.js.map} +0 -0
  55. /package/dist/{config.d.ts → vike.d.ts} +0 -0
@@ -0,0 +1,198 @@
1
+ import {
2
+ isDocsSourcePath,
3
+ loadDocsConfig,
4
+ syncGeneratedDocsPages
5
+ } from "./chunk-DNCQR5NH.js";
6
+ import {
7
+ nivelPublicRoute
8
+ } from "./chunk-PYYPYIBD.js";
9
+
10
+ // src/runtime/node/plugin.ts
11
+ import fs2 from "fs";
12
+
13
+ // src/runtime/node/publicAssets.ts
14
+ import fs from "fs";
15
+ import path from "path";
16
+ import { fileURLToPath, pathToFileURL } from "url";
17
+ var toPosix = (value) => value.split(path.sep).join(path.posix.sep);
18
+ var collectPublicAssetFilePaths = (directoryPath) => {
19
+ return fs.readdirSync(directoryPath, { withFileTypes: true }).flatMap((entry) => {
20
+ const entryPath = path.join(directoryPath, entry.name);
21
+ return entry.isDirectory() ? collectPublicAssetFilePaths(entryPath) : [entryPath];
22
+ });
23
+ };
24
+ var getRequestPathname = (requestUrl) => {
25
+ return requestUrl?.split("?")[0]?.split("#")[0] ?? "";
26
+ };
27
+ var normalizeNivelAssetPathname = (pathname) => {
28
+ if (pathname === nivelPublicRoute) {
29
+ return pathname;
30
+ }
31
+ if (!pathname.startsWith(`${nivelPublicRoute}/`)) {
32
+ return null;
33
+ }
34
+ const trimmedPathname = pathname.replace(/\/+$/g, "");
35
+ if (trimmedPathname !== pathname && path.extname(trimmedPathname)) {
36
+ return trimmedPathname;
37
+ }
38
+ return pathname;
39
+ };
40
+ var getPublicAssetsRootCandidates = (runtimeDir) => {
41
+ let packageRoot = null;
42
+ try {
43
+ const nivelConfigUrl = import.meta.resolve("@unterberg/nivel/vike");
44
+ const nivelConfigPath = fileURLToPath(nivelConfigUrl);
45
+ packageRoot = path.resolve(path.dirname(nivelConfigPath), "..");
46
+ } catch {
47
+ packageRoot = null;
48
+ }
49
+ return [
50
+ ...packageRoot ? [path.join(packageRoot, "assets")] : [],
51
+ path.resolve(runtimeDir, "../assets"),
52
+ path.resolve(runtimeDir, "../../assets")
53
+ ];
54
+ };
55
+ var getNivelPublicAssetsRoot = () => {
56
+ const runtimeUrl = import.meta.url.startsWith("/") ? pathToFileURL(import.meta.url).href : import.meta.url;
57
+ const runtimeDir = path.dirname(fileURLToPath(runtimeUrl));
58
+ for (const candidate of getPublicAssetsRootCandidates(runtimeDir)) {
59
+ if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {
60
+ return candidate;
61
+ }
62
+ }
63
+ throw new Error(`Unable to locate nivel public assets from ${runtimeDir}.`);
64
+ };
65
+ var getNivelPublicAssets = () => {
66
+ const assetsRoot = getNivelPublicAssetsRoot();
67
+ return collectPublicAssetFilePaths(assetsRoot).map((filePath) => ({
68
+ fileName: toPosix(path.relative(assetsRoot, filePath)),
69
+ filePath
70
+ }));
71
+ };
72
+ var getNivelPublicAssetFilePath = (requestUrl) => {
73
+ const pathname = normalizeNivelAssetPathname(getRequestPathname(requestUrl));
74
+ if (!pathname) {
75
+ return null;
76
+ }
77
+ const assetsRoot = getNivelPublicAssetsRoot();
78
+ const relativePath = pathname.replace(/^\/+/, "");
79
+ const filePath = path.resolve(assetsRoot, relativePath);
80
+ const relativeToRoot = path.relative(assetsRoot, filePath);
81
+ if (relativeToRoot.startsWith("..") || path.isAbsolute(relativeToRoot) || !fs.existsSync(filePath) || !fs.statSync(filePath).isFile()) {
82
+ return null;
83
+ }
84
+ return filePath;
85
+ };
86
+ var getNivelPublicAssetContentType = (filePath) => {
87
+ switch (path.extname(filePath)) {
88
+ case ".css":
89
+ return "text/css; charset=utf-8";
90
+ case ".svg":
91
+ return "image/svg+xml";
92
+ case ".png":
93
+ return "image/png";
94
+ case ".ico":
95
+ return "image/x-icon";
96
+ case ".woff2":
97
+ return "font/woff2";
98
+ default:
99
+ return "application/octet-stream";
100
+ }
101
+ };
102
+ var isNivelAssetRequestUrl = (requestUrl) => {
103
+ return normalizeNivelAssetPathname(getRequestPathname(requestUrl)) !== null;
104
+ };
105
+ var isNivelAssetPath = (filePath) => {
106
+ const normalizedFilePath = toPosix(path.resolve(filePath));
107
+ const assetsRoot = toPosix(getNivelPublicAssetsRoot());
108
+ return normalizedFilePath.startsWith(`${assetsRoot}/`);
109
+ };
110
+
111
+ // src/runtime/node/plugin.ts
112
+ var syncGeneratedPages = async (server, rootDir) => {
113
+ const docsConfig = await loadDocsConfig({
114
+ rootDir,
115
+ loadModule: (modulePath) => server.ssrLoadModule(modulePath)
116
+ });
117
+ syncGeneratedDocsPages({ rootDir, docsConfig });
118
+ };
119
+ var nivelPagesPlugin = () => {
120
+ let shouldEmitBuildAssets = false;
121
+ return {
122
+ name: "nivel-pages-plugin",
123
+ enforce: "pre",
124
+ configResolved(config) {
125
+ shouldEmitBuildAssets = config.command === "build" && !config.build.ssr;
126
+ },
127
+ buildStart() {
128
+ if (!shouldEmitBuildAssets) {
129
+ return;
130
+ }
131
+ for (const asset of getNivelPublicAssets()) {
132
+ this.emitFile({
133
+ fileName: asset.fileName,
134
+ source: fs2.readFileSync(asset.filePath),
135
+ type: "asset"
136
+ });
137
+ }
138
+ },
139
+ configureServer(server) {
140
+ const rootDir = server.config.root;
141
+ const assetsRoot = getNivelPublicAssetsRoot();
142
+ let pendingSync = Promise.resolve();
143
+ server.watcher.add(assetsRoot);
144
+ const queueSync = (filePath) => {
145
+ if (!isDocsSourcePath(filePath, rootDir)) {
146
+ return;
147
+ }
148
+ pendingSync = pendingSync.then(async () => {
149
+ await syncGeneratedPages(server, rootDir);
150
+ server.ws.send({ type: "full-reload" });
151
+ }).catch((error) => {
152
+ console.error(error);
153
+ });
154
+ };
155
+ server.watcher.on("add", queueSync);
156
+ server.watcher.on("unlink", queueSync);
157
+ server.watcher.on("change", (filePath) => {
158
+ if (!isNivelAssetPath(filePath)) {
159
+ return;
160
+ }
161
+ server.ws.send({ type: "full-reload" });
162
+ });
163
+ server.middlewares.use((req, res, next) => {
164
+ const filePath = getNivelPublicAssetFilePath(req.url);
165
+ if (filePath) {
166
+ res.setHeader("Content-Type", getNivelPublicAssetContentType(filePath));
167
+ res.setHeader("Cache-Control", "no-store");
168
+ res.end(fs2.readFileSync(filePath));
169
+ return;
170
+ }
171
+ if (isNivelAssetRequestUrl(req.url)) {
172
+ res.statusCode = 404;
173
+ res.setHeader("Cache-Control", "no-store");
174
+ res.end();
175
+ return;
176
+ }
177
+ next();
178
+ });
179
+ },
180
+ async handleHotUpdate(ctx) {
181
+ if (isNivelAssetPath(ctx.file)) {
182
+ ctx.server.ws.send({ type: "full-reload" });
183
+ return [];
184
+ }
185
+ if (!isDocsSourcePath(ctx.file, ctx.server.config.root)) {
186
+ return;
187
+ }
188
+ await syncGeneratedPages(ctx.server, ctx.server.config.root);
189
+ ctx.server.ws.send({ type: "full-reload" });
190
+ return [];
191
+ }
192
+ };
193
+ };
194
+
195
+ export {
196
+ nivelPagesPlugin
197
+ };
198
+ //# sourceMappingURL=chunk-K5ZYRA3G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/node/plugin.ts","../src/runtime/node/publicAssets.ts"],"sourcesContent":["import fs from 'node:fs'\nimport type { Plugin, ViteDevServer } from 'vite'\nimport { isDocsSourcePath, syncGeneratedDocsPages } from './codegen.js'\nimport {\n getNivelPublicAssetContentType,\n getNivelPublicAssetFilePath,\n getNivelPublicAssets,\n getNivelPublicAssetsRoot,\n isNivelAssetPath,\n isNivelAssetRequestUrl,\n} from './publicAssets.js'\nimport { loadDocsConfig } from './loadDocsConfig.js'\n\nconst syncGeneratedPages = async (server: ViteDevServer, rootDir: string) => {\n const docsConfig = await loadDocsConfig({\n rootDir,\n loadModule: (modulePath) => server.ssrLoadModule(modulePath),\n })\n syncGeneratedDocsPages({ rootDir, docsConfig })\n}\n\nexport const nivelPagesPlugin = (): Plugin => {\n let shouldEmitBuildAssets = false\n\n return {\n name: 'nivel-pages-plugin',\n enforce: 'pre',\n configResolved(config) {\n shouldEmitBuildAssets = config.command === 'build' && !config.build.ssr\n },\n buildStart() {\n if (!shouldEmitBuildAssets) {\n return\n }\n\n for (const asset of getNivelPublicAssets()) {\n this.emitFile({\n fileName: asset.fileName,\n source: fs.readFileSync(asset.filePath),\n type: 'asset',\n })\n }\n },\n configureServer(server) {\n const rootDir = server.config.root\n const assetsRoot = getNivelPublicAssetsRoot()\n let pendingSync = Promise.resolve()\n\n server.watcher.add(assetsRoot)\n\n const queueSync = (filePath: string) => {\n if (!isDocsSourcePath(filePath, rootDir)) {\n return\n }\n\n pendingSync = pendingSync\n .then(async () => {\n await syncGeneratedPages(server, rootDir)\n server.ws.send({ type: 'full-reload' })\n })\n .catch((error: unknown) => {\n console.error(error)\n })\n }\n\n server.watcher.on('add', queueSync)\n server.watcher.on('unlink', queueSync)\n\n server.watcher.on('change', (filePath) => {\n if (!isNivelAssetPath(filePath)) {\n return\n }\n\n server.ws.send({ type: 'full-reload' })\n })\n\n server.middlewares.use((req, res, next) => {\n const filePath = getNivelPublicAssetFilePath(req.url)\n\n if (filePath) {\n res.setHeader('Content-Type', getNivelPublicAssetContentType(filePath))\n res.setHeader('Cache-Control', 'no-store')\n res.end(fs.readFileSync(filePath))\n return\n }\n\n if (isNivelAssetRequestUrl(req.url)) {\n res.statusCode = 404\n res.setHeader('Cache-Control', 'no-store')\n res.end()\n return\n }\n\n next()\n })\n },\n async handleHotUpdate(ctx) {\n if (isNivelAssetPath(ctx.file)) {\n ctx.server.ws.send({ type: 'full-reload' })\n return []\n }\n\n if (!isDocsSourcePath(ctx.file, ctx.server.config.root)) {\n return\n }\n\n await syncGeneratedPages(ctx.server, ctx.server.config.root)\n ctx.server.ws.send({ type: 'full-reload' })\n return []\n },\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { nivelPublicRoute } from '../../shared/assets.js'\n\nconst toPosix = (value: string) => value.split(path.sep).join(path.posix.sep)\n\nconst collectPublicAssetFilePaths = (directoryPath: string): string[] => {\n return fs.readdirSync(directoryPath, { withFileTypes: true }).flatMap((entry) => {\n const entryPath = path.join(directoryPath, entry.name)\n return entry.isDirectory() ? collectPublicAssetFilePaths(entryPath) : [entryPath]\n })\n}\n\nconst getRequestPathname = (requestUrl: string | undefined) => {\n return requestUrl?.split('?')[0]?.split('#')[0] ?? ''\n}\n\nconst normalizeNivelAssetPathname = (pathname: string) => {\n if (pathname === nivelPublicRoute) {\n return pathname\n }\n\n if (!pathname.startsWith(`${nivelPublicRoute}/`)) {\n return null\n }\n\n const trimmedPathname = pathname.replace(/\\/+$/g, '')\n if (trimmedPathname !== pathname && path.extname(trimmedPathname)) {\n return trimmedPathname\n }\n\n return pathname\n}\n\nconst getPublicAssetsRootCandidates = (runtimeDir: string) => {\n let packageRoot: string | null = null\n\n try {\n const nivelConfigUrl = import.meta.resolve('@unterberg/nivel/vike')\n const nivelConfigPath = fileURLToPath(nivelConfigUrl)\n packageRoot = path.resolve(path.dirname(nivelConfigPath), '..')\n } catch {\n packageRoot = null\n }\n\n return [\n ...(packageRoot ? [path.join(packageRoot, 'assets')] : []),\n path.resolve(runtimeDir, '../assets'),\n path.resolve(runtimeDir, '../../assets'),\n ]\n}\n\nexport const getNivelPublicAssetsRoot = () => {\n const runtimeUrl = import.meta.url.startsWith('/') ? pathToFileURL(import.meta.url).href : import.meta.url\n const runtimeDir = path.dirname(fileURLToPath(runtimeUrl))\n\n for (const candidate of getPublicAssetsRootCandidates(runtimeDir)) {\n if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {\n return candidate\n }\n }\n\n throw new Error(`Unable to locate nivel public assets from ${runtimeDir}.`)\n}\n\nexport const getNivelPublicAssets = () => {\n const assetsRoot = getNivelPublicAssetsRoot()\n\n return collectPublicAssetFilePaths(assetsRoot).map((filePath) => ({\n fileName: toPosix(path.relative(assetsRoot, filePath)),\n filePath,\n }))\n}\n\nexport const getNivelPublicAssetFilePath = (requestUrl: string | undefined) => {\n const pathname = normalizeNivelAssetPathname(getRequestPathname(requestUrl))\n\n if (!pathname) {\n return null\n }\n\n const assetsRoot = getNivelPublicAssetsRoot()\n const relativePath = pathname.replace(/^\\/+/, '')\n const filePath = path.resolve(assetsRoot, relativePath)\n const relativeToRoot = path.relative(assetsRoot, filePath)\n\n if (\n relativeToRoot.startsWith('..') ||\n path.isAbsolute(relativeToRoot) ||\n !fs.existsSync(filePath) ||\n !fs.statSync(filePath).isFile()\n ) {\n return null\n }\n\n return filePath\n}\n\nexport const getNivelPublicAssetContentType = (filePath: string) => {\n switch (path.extname(filePath)) {\n case '.css':\n return 'text/css; charset=utf-8'\n case '.svg':\n return 'image/svg+xml'\n case '.png':\n return 'image/png'\n case '.ico':\n return 'image/x-icon'\n case '.woff2':\n return 'font/woff2'\n default:\n return 'application/octet-stream'\n }\n}\n\nexport const isNivelAssetRequestUrl = (requestUrl: string | undefined) => {\n return normalizeNivelAssetPathname(getRequestPathname(requestUrl)) !== null\n}\n\nexport const isNivelAssetPath = (filePath: string) => {\n const normalizedFilePath = toPosix(path.resolve(filePath))\n const assetsRoot = toPosix(getNivelPublicAssetsRoot())\n return normalizedFilePath.startsWith(`${assetsRoot}/`)\n}\n"],"mappings":"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","names":["fs","fs"]}
@@ -1,4 +1,4 @@
1
- // src/components/UniversalMdxProvider.tsx
1
+ // src/mdx/components/UniversalMdxProvider.tsx
2
2
  import { createContext, useContext } from "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  var UniversalMdxContext = createContext(null);
@@ -9,7 +9,7 @@ var useUniversalMdxRuntime = () => {
9
9
  return useContext(UniversalMdxContext);
10
10
  };
11
11
 
12
- // src/components/renderInlineMarkdown.tsx
12
+ // src/shared/renderInlineMarkdown.tsx
13
13
  import { cmMerge } from "@classmatejs/react";
14
14
  import { Fragment } from "react";
15
15
  import { jsx as jsx2 } from "react/jsx-runtime";
@@ -33,4 +33,4 @@ export {
33
33
  useUniversalMdxRuntime,
34
34
  renderInlineMarkdown
35
35
  };
36
- //# sourceMappingURL=chunk-4WTEOEV2.js.map
36
+ //# sourceMappingURL=chunk-L6ZVB6XH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mdx/components/UniversalMdxProvider.tsx","../src/shared/renderInlineMarkdown.tsx"],"sourcesContent":["import { createContext, useContext, type PropsWithChildren } from 'react'\nimport type { UniversalMdxRuntimeValue } from './types.js'\n\nconst UniversalMdxContext = createContext<UniversalMdxRuntimeValue | null>(null)\n\nexport const UniversalMdxProvider = ({ children, value }: PropsWithChildren<{ value: UniversalMdxRuntimeValue }>) => {\n return <UniversalMdxContext.Provider value={value}>{children}</UniversalMdxContext.Provider>\n}\n\nexport const useUniversalMdxRuntime = () => {\n return useContext(UniversalMdxContext)\n}\n","import { cmMerge } from '@classmatejs/react'\nimport { Fragment, type ReactNode } from 'react'\n\ntype RenderInlineMarkdownOptions = {\n codeClassName?: string\n}\n\nexport const renderInlineMarkdown = (\n value: ReactNode,\n { codeClassName = 'font-medium' }: RenderInlineMarkdownOptions = {},\n): ReactNode => {\n if (typeof value !== 'string') {\n return value\n }\n\n return value.split(/(`[^`]+`)/g).map((part, index) => {\n if (part.startsWith('`') && part.endsWith('`')) {\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey: local presentational split\n <code className={cmMerge(codeClassName)} key={index}>\n {part.slice(1, -1)}\n </code>\n )\n }\n\n // biome-ignore lint/suspicious/noArrayIndexKey: local presentational split\n return <Fragment key={index}>{part}</Fragment>\n })\n}\n"],"mappings":";AAAA,SAAS,eAAe,kBAA0C;AAMzD;AAHT,IAAM,sBAAsB,cAA+C,IAAI;AAExE,IAAM,uBAAuB,CAAC,EAAE,UAAU,MAAM,MAA8D;AACnH,SAAO,oBAAC,oBAAoB,UAApB,EAA6B,OAAe,UAAS;AAC/D;AAEO,IAAM,yBAAyB,MAAM;AAC1C,SAAO,WAAW,mBAAmB;AACvC;;;ACXA,SAAS,eAAe;AACxB,SAAS,gBAAgC;AAkBjC,gBAAAA,YAAA;AAZD,IAAM,uBAAuB,CAClC,OACA,EAAE,gBAAgB,cAAc,IAAiC,CAAC,MACpD;AACd,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,MAAM,YAAY,EAAE,IAAI,CAAC,MAAM,UAAU;AACpD,QAAI,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAAG;AAC9C;AAAA;AAAA,QAEE,gBAAAA,KAAC,UAAK,WAAW,QAAQ,aAAa,GACnC,eAAK,MAAM,GAAG,EAAE,KAD2B,KAE9C;AAAA;AAAA,IAEJ;AAGA,WAAO,gBAAAA,KAAC,YAAsB,kBAAR,KAAa;AAAA,EACrC,CAAC;AACH;","names":["jsx"]}
@@ -1,4 +1,4 @@
1
- // src/nivelAssets.ts
1
+ // src/shared/assets.ts
2
2
  var normalizeSiteBasePath = (value) => {
3
3
  const normalized = value?.trim().replace(/^\/+|\/+$/g, "") ?? "";
4
4
  return normalized ? `/${normalized}/` : "/";
@@ -6,6 +6,13 @@ var normalizeSiteBasePath = (value) => {
6
6
  var importMetaEnv = import.meta.env;
7
7
  var siteBasePath = normalizeSiteBasePath(importMetaEnv?.BASE_URL ?? process.env.PAGES_BASE_PATH);
8
8
  var isExternalUrl = (value) => value.startsWith("//") || /^[a-z][a-z\d+.-]*:/i.test(value);
9
+ var prependSiteBaseUrl = (value) => {
10
+ if (value === "" || value.startsWith("#") || isExternalUrl(value)) {
11
+ return value;
12
+ }
13
+ const pathname = value.startsWith("/") ? value : `/${value.replace(/^\/+/, "")}`;
14
+ return siteBasePath === "/" ? pathname : `${siteBasePath.slice(0, -1)}${pathname}`;
15
+ };
9
16
  var withSiteBaseUrl = (value) => {
10
17
  if (value === "" || value.startsWith("#") || isExternalUrl(value)) {
11
18
  return value;
@@ -29,7 +36,7 @@ var resolvePublicAssetUrl = (value) => {
29
36
  return withSiteBaseUrl(pathname);
30
37
  };
31
38
  var nivelPublicRoute = "/nivel";
32
- var baseAssets = `${withSiteBaseUrl(nivelPublicRoute).replace(/\/?$/, "/")}`;
39
+ var baseAssets = `${prependSiteBaseUrl(nivelPublicRoute).replace(/\/?$/, "/")}`;
33
40
  var nivelAssetUrl = (assetPath) => `${baseAssets}${assetPath.replace(/^\/+/, "")}`;
34
41
 
35
42
  export {
@@ -39,4 +46,4 @@ export {
39
46
  baseAssets,
40
47
  nivelAssetUrl
41
48
  };
42
- //# sourceMappingURL=chunk-FLO5CJZH.js.map
49
+ //# sourceMappingURL=chunk-PYYPYIBD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/assets.ts"],"sourcesContent":["const normalizeSiteBasePath = (value: string | undefined) => {\n const normalized = value?.trim().replace(/^\\/+|\\/+$/g, '') ?? ''\n return normalized ? `/${normalized}/` : '/'\n}\n\nconst importMetaEnv = (import.meta as ImportMeta & { env?: { BASE_URL?: string } }).env\n\nconst siteBasePath = normalizeSiteBasePath(importMetaEnv?.BASE_URL ?? process.env.PAGES_BASE_PATH)\n\nconst isExternalUrl = (value: string) => value.startsWith('//') || /^[a-z][a-z\\d+.-]*:/i.test(value)\n\nconst prependSiteBaseUrl = (value: string) => {\n if (value === '' || value.startsWith('#') || isExternalUrl(value)) {\n return value\n }\n\n const pathname = value.startsWith('/') ? value : `/${value.replace(/^\\/+/, '')}`\n return siteBasePath === '/' ? pathname : `${siteBasePath.slice(0, -1)}${pathname}`\n}\n\nexport const withSiteBaseUrl = (value: string) => {\n if (value === '' || value.startsWith('#') || isExternalUrl(value)) {\n return value\n }\n\n if (!value.startsWith('/')) {\n return value\n }\n\n if (siteBasePath !== '/' && (value === siteBasePath.slice(0, -1) || value.startsWith(siteBasePath))) {\n return value\n }\n\n return siteBasePath === '/' ? value : `${siteBasePath.slice(0, -1)}${value}`\n}\n\nexport const resolvePublicAssetUrl = (value: string | undefined) => {\n if (!value) {\n return undefined\n }\n\n if (value.startsWith('#') || isExternalUrl(value)) {\n return value\n }\n\n const pathname = value.startsWith('/') ? value : `/${value.replace(/^\\/+/, '')}`\n return withSiteBaseUrl(pathname)\n}\n\nexport const nivelPublicRoute = '/nivel'\n\n// Engine-owned assets always live under the site base, even if the public route\n// happens to match the repository base path on GitHub Pages.\nexport const baseAssets = `${prependSiteBaseUrl(nivelPublicRoute).replace(/\\/?$/, '/')}`\n\nexport const nivelAssetUrl = (assetPath: string) => `${baseAssets}${assetPath.replace(/^\\/+/, '')}`\n"],"mappings":";AAAA,IAAM,wBAAwB,CAAC,UAA8B;AAC3D,QAAM,aAAa,OAAO,KAAK,EAAE,QAAQ,cAAc,EAAE,KAAK;AAC9D,SAAO,aAAa,IAAI,UAAU,MAAM;AAC1C;AAEA,IAAM,gBAAiB,YAA6D;AAEpF,IAAM,eAAe,sBAAsB,eAAe,YAAY,QAAQ,IAAI,eAAe;AAEjG,IAAM,gBAAgB,CAAC,UAAkB,MAAM,WAAW,IAAI,KAAK,sBAAsB,KAAK,KAAK;AAEnG,IAAM,qBAAqB,CAAC,UAAkB;AAC5C,MAAI,UAAU,MAAM,MAAM,WAAW,GAAG,KAAK,cAAc,KAAK,GAAG;AACjE,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,MAAM,WAAW,GAAG,IAAI,QAAQ,IAAI,MAAM,QAAQ,QAAQ,EAAE,CAAC;AAC9E,SAAO,iBAAiB,MAAM,WAAW,GAAG,aAAa,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ;AAClF;AAEO,IAAM,kBAAkB,CAAC,UAAkB;AAChD,MAAI,UAAU,MAAM,MAAM,WAAW,GAAG,KAAK,cAAc,KAAK,GAAG;AACjE,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,WAAW,GAAG,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,QAAQ,UAAU,aAAa,MAAM,GAAG,EAAE,KAAK,MAAM,WAAW,YAAY,IAAI;AACnG,WAAO;AAAA,EACT;AAEA,SAAO,iBAAiB,MAAM,QAAQ,GAAG,aAAa,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK;AAC5E;AAEO,IAAM,wBAAwB,CAAC,UAA8B;AAClE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,WAAW,GAAG,KAAK,cAAc,KAAK,GAAG;AACjD,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,MAAM,WAAW,GAAG,IAAI,QAAQ,IAAI,MAAM,QAAQ,QAAQ,EAAE,CAAC;AAC9E,SAAO,gBAAgB,QAAQ;AACjC;AAEO,IAAM,mBAAmB;AAIzB,IAAM,aAAa,GAAG,mBAAmB,gBAAgB,EAAE,QAAQ,QAAQ,GAAG,CAAC;AAE/E,IAAM,gBAAgB,CAAC,cAAsB,GAAG,UAAU,GAAG,UAAU,QAAQ,QAAQ,EAAE,CAAC;","names":[]}
@@ -1,32 +1,37 @@
1
- // src/components/code-blocks/index.ts
1
+ // src/mdx/code-blocks/index.ts
2
2
  import { transformerNotationHighlight } from "@brillout/shiki-transformers";
3
3
  import { transformerNotationDiff, transformerNotationWordHighlight } from "@shikijs/transformers";
4
4
  import rehypePrettyCode from "rehype-pretty-code";
5
5
  import remarkDirective from "remark-directive";
6
6
 
7
- // src/components/code-blocks/rehypeMetaToProps.ts
8
- import { visit } from "unist-util-visit";
9
-
10
- // src/components/code-blocks/meta.ts
7
+ // src/mdx/code-blocks/meta.ts
11
8
  var kebabCase = (value) => {
12
9
  return value.replace(/([a-z])([A-Z])/g, "$1-$2").replaceAll("_", "-").toLowerCase();
13
10
  };
14
- var KEY_VALUE_PAIR_RE = /(?<name>[a-zA-Z_-]+)(?:=([^"'\s]+))?/g;
15
- var RESERVED_CODE_BLOCK_META_NAMES = /* @__PURE__ */ new Set([
16
- "choice",
17
- "file-added",
18
- "file-removed",
19
- "hide-menu",
20
- "max-width",
21
- "ts-only"
22
- ]);
11
+ var CODE_BLOCK_HEADER_ENVIRONMENTS = ["client", "server"];
12
+ var CODE_BLOCK_PRE_PROP_NAMES = ["data-language-label", "file-added", "file-removed", "hide-menu"];
13
+ var KEY_VALUE_PAIR_RE = /(?<name>[a-zA-Z_-]+)(?:=(?:"(?<doubleQuotedValue>[^"]*)"|'(?<singleQuotedValue>[^']*)'|(?<bareValue>[^\s"'=]+)))?/g;
14
+ var CODE_BLOCK_PRE_PROP_NAME_SET = new Set(CODE_BLOCK_PRE_PROP_NAMES);
15
+ var normalizeCodeBlockEnv = (value) => {
16
+ if (typeof value !== "string") {
17
+ return null;
18
+ }
19
+ const normalizedValue = value.trim().toLowerCase();
20
+ return CODE_BLOCK_HEADER_ENVIRONMENTS.includes(normalizedValue) ? normalizedValue : null;
21
+ };
23
22
  var parseMetaString = (meta, propNames) => {
24
23
  if (typeof meta !== "string" || meta.trim() === "") {
25
24
  return { props: {}, rest: "", tokens: [] };
26
25
  }
27
26
  const props = {};
28
27
  const tokens = [];
29
- const rest = meta.replaceAll(KEY_VALUE_PAIR_RE, (match, name, value) => {
28
+ const rest = meta.replaceAll(KEY_VALUE_PAIR_RE, (match, ...args) => {
29
+ const groups = args.at(-1);
30
+ const name = groups?.name;
31
+ if (!name) {
32
+ return match;
33
+ }
34
+ const value = groups?.doubleQuotedValue ?? groups?.singleQuotedValue ?? groups?.bareValue;
30
35
  const normalizedName = kebabCase(name);
31
36
  tokens.push({
32
37
  hasExplicitValue: value !== void 0,
@@ -46,24 +51,25 @@ var parseMetaString = (meta, propNames) => {
46
51
  tokens
47
52
  };
48
53
  };
54
+ var stripMetaProps = (meta, propNames) => {
55
+ return parseMetaString(meta, propNames).rest;
56
+ };
49
57
  var getCodeBlockPropsFromMeta = (meta) => {
50
58
  const parsed = parseMetaString(meta);
51
- const props = { ...parsed.props };
52
- const implicitTitleToken = parsed.tokens.find(
53
- (token) => !token.hasExplicitValue && !RESERVED_CODE_BLOCK_META_NAMES.has(token.name)
59
+ const props = Object.fromEntries(
60
+ Object.entries(parsed.props).filter(([name]) => CODE_BLOCK_PRE_PROP_NAME_SET.has(name))
54
61
  );
55
- const explicitTitle = typeof props.title === "string" && props.title.trim() ? props.title.trim() : null;
56
- delete props.title;
57
- if (implicitTitleToken) {
58
- delete props[implicitTitleToken.name];
59
- }
62
+ const explicitTitle = typeof parsed.props.title === "string" && parsed.props.title.trim() ? parsed.props.title.trim() : null;
63
+ const env = normalizeCodeBlockEnv(parsed.props.env);
60
64
  return {
61
65
  props,
62
- title: explicitTitle ?? implicitTitleToken?.raw.trim() ?? null
66
+ env,
67
+ title: explicitTitle
63
68
  };
64
69
  };
65
70
 
66
- // src/components/code-blocks/rehypeMetaToProps.ts
71
+ // src/mdx/code-blocks/rehypeMetaToProps.ts
72
+ import { visit } from "unist-util-visit";
67
73
  var rehypeMetaToProps = () => {
68
74
  return (tree) => {
69
75
  visit(tree, "element", (node, _index, parent) => {
@@ -75,16 +81,17 @@ var rehypeMetaToProps = () => {
75
81
  parent.properties = {
76
82
  ...parent.properties,
77
83
  ...meta.props,
84
+ ...meta.env ? { "data-code-env": meta.env } : {},
78
85
  ...meta.title ? { "data-code-title": meta.title } : {}
79
86
  };
80
87
  });
81
88
  };
82
89
  };
83
90
 
84
- // src/components/code-blocks/remarkChoiceGroup.ts
91
+ // src/mdx/code-blocks/remarkChoiceGroup.ts
85
92
  import { visit as visit2 } from "unist-util-visit";
86
93
 
87
- // src/components/code-blocks/generateChoiceGroupCode.ts
94
+ // src/mdx/code-blocks/generateChoiceGroupCode.ts
88
95
  import { valueToEstree } from "estree-util-value-to-estree";
89
96
  var BUILT_IN_CHOICE_GROUPS = {
90
97
  codeLang: {
@@ -194,7 +201,7 @@ var increaseLvl = (node) => {
194
201
  }
195
202
  };
196
203
 
197
- // src/components/code-blocks/remarkChoiceGroup.ts
204
+ // src/mdx/code-blocks/remarkChoiceGroup.ts
198
205
  var remarkChoiceGroup = () => {
199
206
  return (tree) => {
200
207
  visit2(tree, (node) => {
@@ -278,7 +285,7 @@ var filterChoices = (nodes) => {
278
285
  return filteredChoices;
279
286
  };
280
287
 
281
- // src/components/code-blocks/remarkDetype.ts
288
+ // src/mdx/code-blocks/remarkDetype.ts
282
289
  import { transform as detype } from "detype";
283
290
  import { visit as visit3 } from "unist-util-visit";
284
291
  var prettierOptions = {
@@ -381,6 +388,7 @@ var transformTsToJs = async (node, file) => {
381
388
  const jsCode = {
382
389
  ...codeBlock,
383
390
  lang: String(codeBlock.lang).replace("t", "j"),
391
+ meta: replaceCodeBlockTitleFileExtension(codeBlock.meta, String(codeBlock.lang).replace("t", "j")),
384
392
  value: codeBlockContentJs
385
393
  };
386
394
  const replacement = generateChoiceGroupCode([
@@ -396,6 +404,32 @@ var transformTsToJs = async (node, file) => {
396
404
  parent.children.splice(index, 1, replacement);
397
405
  };
398
406
  var replaceFileNameSuffixes = (value) => value.replaceAll(".ts", ".js");
407
+ var replaceCodeBlockTitleFileExtension = (meta, outputLang) => {
408
+ if (typeof meta !== "string" || meta.trim() === "") {
409
+ return meta;
410
+ }
411
+ const parsedMeta = parseMetaString(meta);
412
+ const titleToken = parsedMeta.tokens.find((token) => token.name === "title" && token.hasExplicitValue);
413
+ const titleValue = typeof parsedMeta.props.title === "string" ? parsedMeta.props.title : null;
414
+ if (!titleToken || !titleValue) {
415
+ return meta;
416
+ }
417
+ const nextTitleValue = replaceTitleFileExtension(titleValue, outputLang);
418
+ if (nextTitleValue === titleValue) {
419
+ return meta;
420
+ }
421
+ const quote = titleToken.raw.includes("title='") ? "'" : '"';
422
+ return meta.replace(titleToken.raw, `title=${quote}${nextTitleValue}${quote}`);
423
+ };
424
+ var replaceTitleFileExtension = (title, outputLang) => {
425
+ if (outputLang === "jsx") {
426
+ return title.replace(/\.tsx$/i, ".jsx").replace(/\.ts$/i, ".js");
427
+ }
428
+ if (outputLang === "js") {
429
+ return title.replace(/\.tsx$/i, ".jsx").replace(/\.ts$/i, ".js");
430
+ }
431
+ return title;
432
+ };
399
433
  var cleanUpCode = (code, isJsCode = false) => {
400
434
  if (isJsCode) {
401
435
  code = correctCodeDiffComments(code);
@@ -525,7 +559,7 @@ var stripTypeSyntax = (line) => {
525
559
  return line.replace(/\??:\s*[A-Za-z_$][\w$.<>, |&[\]]*/g, "").replace(/\s+as\s+const\b/g, "").replace(/\s+as\s+[A-Za-z_$][\w$.<>, |&[\]]*/g, "");
526
560
  };
527
561
 
528
- // src/components/code-blocks/remarkPkgManager.ts
562
+ // src/mdx/code-blocks/remarkPkgManager.ts
529
563
  import convert_ from "npm-to-yarn";
530
564
  import { visit as visit4 } from "unist-util-visit";
531
565
  var convert = convert_;
@@ -574,7 +608,7 @@ var remarkPkgManager = () => {
574
608
  };
575
609
  };
576
610
 
577
- // src/components/code-blocks/shikiTransformerAutoLinks.ts
611
+ // src/mdx/code-blocks/shikiTransformerAutoLinks.ts
578
612
  var LINK_RE = /https:\/\/[^\s]*[^.,\s"'`]/g;
579
613
  var shikiTransformerAutoLinks = () => {
580
614
  return {
@@ -618,7 +652,7 @@ var shikiTransformerAutoLinks = () => {
618
652
  };
619
653
  };
620
654
 
621
- // src/components/code-blocks/index.ts
655
+ // src/mdx/code-blocks/index.ts
622
656
  var getCodeBlockMdxPlugins = () => {
623
657
  return {
624
658
  remarkPlugins: [remarkDirective, remarkDetype, remarkPkgManager, remarkChoiceGroup],
@@ -627,6 +661,7 @@ var getCodeBlockMdxPlugins = () => {
627
661
  rehypePrettyCode,
628
662
  {
629
663
  keepBackground: false,
664
+ filterMetaString: (meta) => stripMetaProps(meta, ["title"]),
630
665
  theme: {
631
666
  light: "github-light",
632
667
  dark: "one-dark-pro"
@@ -646,6 +681,7 @@ var getCodeBlockMdxPlugins = () => {
646
681
 
647
682
  export {
648
683
  parseMetaString,
684
+ stripMetaProps,
649
685
  getCodeBlockPropsFromMeta,
650
686
  rehypeMetaToProps,
651
687
  remarkChoiceGroup,
@@ -654,4 +690,4 @@ export {
654
690
  shikiTransformerAutoLinks,
655
691
  getCodeBlockMdxPlugins
656
692
  };
657
- //# sourceMappingURL=chunk-45CLUNJW.js.map
693
+ //# sourceMappingURL=chunk-Q7JU4J6A.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mdx/code-blocks/index.ts","../src/mdx/code-blocks/meta.ts","../src/mdx/code-blocks/rehypeMetaToProps.ts","../src/mdx/code-blocks/remarkChoiceGroup.ts","../src/mdx/code-blocks/generateChoiceGroupCode.ts","../src/mdx/code-blocks/remarkDetype.ts","../src/mdx/code-blocks/remarkPkgManager.ts","../src/mdx/code-blocks/shikiTransformerAutoLinks.ts"],"sourcesContent":["import { transformerNotationHighlight } from '@brillout/shiki-transformers'\nimport { transformerNotationDiff, transformerNotationWordHighlight } from '@shikijs/transformers'\nimport rehypePrettyCode from 'rehype-pretty-code'\nimport remarkDirective from 'remark-directive'\nimport { stripMetaProps } from './meta.js'\nimport { rehypeMetaToProps } from './rehypeMetaToProps.js'\nimport { remarkChoiceGroup } from './remarkChoiceGroup.js'\nimport { remarkDetype } from './remarkDetype.js'\nimport { remarkPkgManager } from './remarkPkgManager.js'\nimport { shikiTransformerAutoLinks } from './shikiTransformerAutoLinks.js'\n\nexport { getCodeBlockPropsFromMeta, parseMetaString, stripMetaProps } from './meta.js'\nexport { rehypeMetaToProps } from './rehypeMetaToProps.js'\nexport { remarkChoiceGroup } from './remarkChoiceGroup.js'\nexport { remarkDetype } from './remarkDetype.js'\nexport { remarkPkgManager } from './remarkPkgManager.js'\nexport { shikiTransformerAutoLinks } from './shikiTransformerAutoLinks.js'\n\nexport const getCodeBlockMdxPlugins = (): {\n remarkPlugins: any[]\n rehypePlugins: any[]\n} => {\n return {\n remarkPlugins: [remarkDirective, remarkDetype, remarkPkgManager, remarkChoiceGroup],\n rehypePlugins: [\n [\n rehypePrettyCode,\n {\n keepBackground: false,\n filterMetaString: (meta: string) => stripMetaProps(meta, ['title']),\n theme: {\n light: 'github-light',\n dark: 'one-dark-pro',\n },\n transformers: [\n transformerNotationDiff(),\n transformerNotationHighlight(),\n transformerNotationWordHighlight(),\n shikiTransformerAutoLinks(),\n ],\n },\n ],\n rehypeMetaToProps,\n ],\n }\n}\n","const kebabCase = (value: string) => {\n return value\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replaceAll('_', '-')\n .toLowerCase()\n}\n\nconst CODE_BLOCK_HEADER_ENVIRONMENTS = ['client', 'server'] as const\nconst CODE_BLOCK_PRE_PROP_NAMES = ['data-language-label', 'file-added', 'file-removed', 'hide-menu'] as const\n\ntype ParsedMeta<Name extends string = string> = {\n props: Partial<Record<Name, string>>\n rest: string\n tokens: ParsedMetaToken[]\n}\n\ntype ParsedMetaToken = {\n hasExplicitValue: boolean\n name: string\n raw: string\n value?: string\n}\n\ntype CodeBlockHeaderEnvironment = (typeof CODE_BLOCK_HEADER_ENVIRONMENTS)[number]\n\nconst KEY_VALUE_PAIR_RE =\n /(?<name>[a-zA-Z_-]+)(?:=(?:\"(?<doubleQuotedValue>[^\"]*)\"|'(?<singleQuotedValue>[^']*)'|(?<bareValue>[^\\s\"'=]+)))?/g\nconst CODE_BLOCK_PRE_PROP_NAME_SET = new Set<string>(CODE_BLOCK_PRE_PROP_NAMES)\n\nconst normalizeCodeBlockEnv = (value: unknown): CodeBlockHeaderEnvironment | null => {\n if (typeof value !== 'string') {\n return null\n }\n\n const normalizedValue = value.trim().toLowerCase()\n return CODE_BLOCK_HEADER_ENVIRONMENTS.includes(normalizedValue as CodeBlockHeaderEnvironment)\n ? (normalizedValue as CodeBlockHeaderEnvironment)\n : null\n}\n\nexport const parseMetaString = <Name extends string = string>(meta: unknown, propNames?: Name[]): ParsedMeta<Name> => {\n if (typeof meta !== 'string' || meta.trim() === '') {\n return { props: {}, rest: '', tokens: [] }\n }\n\n const props: ParsedMeta['props'] = {}\n const tokens: ParsedMetaToken[] = []\n const rest = meta.replaceAll(KEY_VALUE_PAIR_RE, (match, ...args) => {\n const groups = args.at(-1) as\n | {\n bareValue?: string\n doubleQuotedValue?: string\n name?: string\n singleQuotedValue?: string\n }\n | undefined\n const name = groups?.name\n if (!name) {\n return match\n }\n\n const value = groups?.doubleQuotedValue ?? groups?.singleQuotedValue ?? groups?.bareValue\n const normalizedName = kebabCase(name)\n tokens.push({\n hasExplicitValue: value !== undefined,\n name: normalizedName,\n raw: match,\n value,\n })\n\n if (propNames && !propNames.includes(normalizedName as Name)) {\n return match\n }\n\n props[normalizedName] = value || 'true'\n return ''\n })\n\n return {\n props,\n rest: rest.trim(),\n tokens,\n }\n}\n\nexport const stripMetaProps = <Name extends string = string>(meta: unknown, propNames: Name[]) => {\n return parseMetaString(meta, propNames).rest\n}\n\nexport const getCodeBlockPropsFromMeta = (meta: unknown) => {\n const parsed = parseMetaString(meta)\n const props = Object.fromEntries(\n Object.entries(parsed.props).filter(([name]) => CODE_BLOCK_PRE_PROP_NAME_SET.has(name)),\n ) as Record<string, string>\n const explicitTitle =\n typeof parsed.props.title === 'string' && parsed.props.title.trim() ? parsed.props.title.trim() : null\n const env = normalizeCodeBlockEnv(parsed.props.env)\n\n return {\n props,\n env,\n title: explicitTitle,\n }\n}\n","import { visit } from 'unist-util-visit'\nimport { getCodeBlockPropsFromMeta } from './meta.js'\n\nexport const rehypeMetaToProps = () => {\n return (tree: unknown) => {\n visit(tree as any, 'element', (node: any, _index, parent: any) => {\n if (node.tagName !== 'code' || parent?.type !== 'element' || parent.tagName !== 'pre') {\n return\n }\n\n const meta = getCodeBlockPropsFromMeta(node.data?.meta)\n parent.properties ??= {}\n parent.properties = {\n ...parent.properties,\n ...meta.props,\n ...(meta.env ? { 'data-code-env': meta.env } : {}),\n ...(meta.title ? { 'data-code-title': meta.title } : {}),\n }\n })\n }\n}\n","import { visit } from 'unist-util-visit'\nimport { generateChoiceGroupCode } from './generateChoiceGroupCode.js'\nimport { parseMetaString } from './meta.js'\n\nexport const remarkChoiceGroup = () => {\n return (tree: unknown) => {\n visit(tree as any, (node: any) => {\n if (node.type === 'code' && node.meta) {\n const meta = parseMetaString(node.meta, ['choice'])\n const choice = meta.props.choice\n node.meta = meta.rest\n\n if (choice) {\n node.data ??= {}\n node.data.customDataChoice = choice\n node.data.customDataFilter = 'explicitChoice'\n }\n }\n\n if (node.type === 'containerDirective' && node.name === 'Choice') {\n const choice = typeof node.attributes?.id === 'string' ? node.attributes.id : null\n if (!choice) {\n return\n }\n\n node.data ??= {}\n node.data.customDataChoice = choice\n node.data.customDataFilter = node.type\n node.attributes = {}\n }\n })\n\n visit(tree as any, (node: any) => {\n if (!Array.isArray(node.children)) {\n return\n }\n\n let start = -1\n let end = 0\n\n const processRange = () => {\n if (start === -1 || start === end) {\n return\n }\n\n const nodes = node.children.slice(start, end)\n const replacements = filterChoices(nodes).map((choiceNodes) => generateChoiceGroupCode(choiceNodes, node))\n node.children.splice(start, end - start, ...replacements)\n end = start + replacements.length\n start = -1\n }\n\n for (; end < node.children.length; end += 1) {\n const child = node.children[end]\n\n if (!['code', 'mdxJsxFlowElement', 'containerDirective'].includes(child?.type)) {\n processRange()\n continue\n }\n\n if (!child.data?.customDataChoice) {\n processRange()\n continue\n }\n\n if (start === -1) {\n start = end\n }\n }\n\n processRange()\n })\n }\n}\n\nconst filterChoices = (nodes: any[]) => {\n const filteredChoices: Array<Array<{ choiceValue: string; children: any[] }>> = []\n const filters = [...new Set(nodes.map((node) => node.data?.customDataFilter).filter(Boolean))]\n\n for (const filter of filters) {\n const nodesByChoice = new Map<string, any[]>()\n\n for (const node of nodes.filter((candidate) => candidate.data?.customDataFilter === filter)) {\n const choice = node.data?.customDataChoice\n if (!choice) {\n continue\n }\n\n node.data.customDataChoice = undefined\n const choiceNodes = nodesByChoice.get(choice) ?? []\n choiceNodes.push(node)\n nodesByChoice.set(choice, choiceNodes)\n }\n\n filteredChoices.push(\n [...nodesByChoice].map(([choiceValue, children]) => ({\n choiceValue,\n children,\n })),\n )\n }\n\n return filteredChoices\n}\n","import { valueToEstree } from 'estree-util-value-to-estree'\nimport type { MdxJsxAttribute, MdxJsxFlowElement } from 'mdast-util-mdx-jsx'\n\ntype ChoiceNode = {\n choiceValue: string\n children: any[]\n}\n\nconst BUILT_IN_CHOICE_GROUPS = {\n codeLang: {\n choices: ['JavaScript', 'TypeScript'],\n default: 'JavaScript',\n },\n pkgManager: {\n choices: ['npm', 'pnpm', 'Bun', 'Yarn'],\n default: 'npm',\n },\n} as const\n\nconst getChoiceGroup = (choicesRaw: string[]) => {\n const choices = [...new Set(choicesRaw.filter(Boolean))]\n\n for (const [name, group] of Object.entries(BUILT_IN_CHOICE_GROUPS)) {\n if (!choices.every((choice) => group.choices.includes(choice as never))) {\n continue\n }\n\n return {\n name,\n choices: group.choices,\n default: group.default,\n disabled: group.choices.filter((choice) => !choices.includes(choice)),\n }\n }\n\n return {\n name: `custom:${choices.join('|')}`,\n choices,\n default: choices[0] ?? '',\n disabled: [] as string[],\n }\n}\n\nexport const generateChoiceGroupCode = (choiceNodes: ChoiceNode[], parent?: any): MdxJsxFlowElement => {\n const choiceGroup = getChoiceGroup(choiceNodes.map((choiceNode) => choiceNode.choiceValue))\n const mergedChoiceNodes = choiceGroup.choices.map((choice) => {\n const choiceNode = choiceNodes.find((node) => node.choiceValue === choice)\n\n return {\n choiceValue: choice,\n children: choiceNode?.children ?? [],\n }\n })\n\n const attributes: MdxJsxAttribute[] = [\n {\n type: 'mdxJsxAttribute',\n name: 'choiceGroup',\n value: {\n type: 'mdxJsxAttributeValueExpression',\n value: '',\n data: {\n estree: {\n type: 'Program',\n sourceType: 'module',\n comments: [],\n body: [\n {\n type: 'ExpressionStatement',\n expression: valueToEstree(choiceGroup) as any,\n } as any,\n ],\n } as any,\n },\n },\n },\n ]\n\n if (choiceNodes.length === 1) {\n attributes.push({ type: 'mdxJsxAttribute', name: 'hide' })\n }\n\n attributes.push({\n type: 'mdxJsxAttribute',\n name: 'lvl',\n value: `${parent?.type === 'mdxJsxFlowElement' ? 1 : 0}`,\n })\n\n const children: MdxJsxFlowElement[] = mergedChoiceNodes.map((choiceNode) => {\n const choiceChildren =\n choiceNode.children.length > 0 && choiceNode.children.every((node) => node.type === 'containerDirective')\n ? choiceNode.children.flatMap((node) => node.children ?? [])\n : choiceNode.children\n\n for (const child of choiceChildren) {\n increaseLvl(child)\n }\n\n return {\n type: 'mdxJsxFlowElement',\n name: 'div',\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'data-choice-value',\n value: choiceNode.choiceValue,\n },\n { type: 'mdxJsxAttribute', name: 'className', value: 'choice' },\n ],\n children: choiceChildren,\n }\n })\n\n return {\n type: 'mdxJsxFlowElement',\n name: 'ChoiceGroup',\n attributes,\n children,\n }\n}\n\nconst increaseLvl = (node: any) => {\n if (node?.type !== 'mdxJsxFlowElement' || node.name !== 'ChoiceGroup') {\n return\n }\n\n const attribute = node.attributes.find(\n (candidate: any) => candidate.type === 'mdxJsxAttribute' && candidate.name === 'lvl',\n )\n\n if (typeof attribute?.value === 'string') {\n attribute.value = `${Number(attribute.value) + 1}`\n }\n}\n","import { transform as detype } from 'detype'\nimport { visit } from 'unist-util-visit'\nimport { generateChoiceGroupCode } from './generateChoiceGroupCode.js'\nimport { parseMetaString } from './meta.js'\n\nconst prettierOptions = {\n semi: false,\n singleQuote: true,\n trailingComma: 'none',\n} as const\n\nexport const remarkDetype = () => {\n return async (tree: unknown, file: any) => {\n const codeNodes: Array<{ codeBlock: any; index: number; parent: any }> = []\n\n visit(tree as any, 'code', (node: any, index: number | undefined, parent: any) => {\n if (!parent || typeof index !== 'number') {\n return\n }\n\n if (!['ts', 'tsx', 'vue', 'yaml'].includes(node.lang ?? '')) {\n return\n }\n\n if (typeof node.meta === 'string' && node.meta.includes('ts-only')) {\n return\n }\n\n codeNodes.push({ codeBlock: node, index, parent })\n })\n\n for (const node of [...codeNodes].reverse()) {\n if (node.codeBlock.lang === 'yaml') {\n transformYaml(node)\n } else {\n await transformTsToJs(node, file)\n }\n }\n }\n}\n\nconst transformYaml = (node: { codeBlock: any; index: number; parent: any }) => {\n const { codeBlock, index, parent } = node\n const codeBlockContentJs = replaceFileNameSuffixes(codeBlock.value)\n\n if (codeBlockContentJs === codeBlock.value) {\n return\n }\n\n const meta = parseMetaString(codeBlock.meta, ['choice'])\n const choice = meta.props.choice\n codeBlock.meta = meta.rest\n\n const yamlJsCode = {\n ...codeBlock,\n value: codeBlockContentJs,\n }\n\n const replacement = generateChoiceGroupCode([\n { choiceValue: 'JavaScript', children: [yamlJsCode] },\n { choiceValue: 'TypeScript', children: [codeBlock] },\n ])\n\n replacement.attributes.push({ type: 'mdxJsxAttribute', name: 'hide' })\n replacement.data ??= {} as any\n ;(replacement.data as any).customDataChoice = choice\n ;(replacement.data as any).customDataFilter = 'codeLang'\n parent.children.splice(index, 1, replacement)\n}\n\nconst transformTsToJs = async (node: { codeBlock: any; index: number; parent: any }, file: any) => {\n const { codeBlock, index, parent } = node\n const meta = parseMetaString(codeBlock.meta, ['max-width', 'choice'])\n const maxWidth = Number(meta.props['max-width'])\n const choice = meta.props.choice\n codeBlock.meta = meta.rest\n\n codeBlock.data ??= {}\n codeBlock.data.customDataChoice = choice\n codeBlock.data.customDataFilter = 'codeLang'\n\n if (choice === 'TypeScript') {\n return\n }\n\n const codeBlockReplacedJs = replaceFileNameSuffixes(codeBlock.value)\n let codeBlockContentJs = ''\n\n try {\n codeBlockContentJs = await detype(codeBlockReplacedJs, `snippet.${codeBlock.lang}`, {\n customizeBabelConfig(config) {\n if (!config.presets || config.presets.length !== 1) {\n return\n }\n\n config.presets = [[config.presets[0], { onlyRemoveTypeImports: true }]]\n },\n removeTsComments: true,\n prettierOptions: {\n ...prettierOptions,\n printWidth: Number.isFinite(maxWidth) && maxWidth > 0 ? maxWidth : 99,\n },\n })\n } catch (error) {\n console.error(\n [\n `Failed to detype code block in ${file?.path ?? 'an MDX file'}.`,\n error instanceof Error ? error.message : String(error),\n ].join('\\n'),\n )\n return\n }\n\n codeBlockContentJs = cleanUpCode(codeBlockContentJs.trimEnd(), true)\n codeBlock.value = cleanUpCode(codeBlock.value)\n codeBlockContentJs = preserveSourceLineBreaks(codeBlock.value, codeBlockContentJs)\n codeBlockContentJs = preserveSourceBlankLines(codeBlock.value, codeBlockContentJs)\n\n if (codeBlockContentJs === codeBlock.value) {\n return\n }\n\n const tsCode = { ...codeBlock, lang: codeBlock.lang }\n const jsCode = {\n ...codeBlock,\n lang: String(codeBlock.lang).replace('t', 'j'),\n meta: replaceCodeBlockTitleFileExtension(codeBlock.meta, String(codeBlock.lang).replace('t', 'j')),\n value: codeBlockContentJs,\n }\n\n const replacement = generateChoiceGroupCode([\n { choiceValue: 'JavaScript', children: [jsCode] },\n { choiceValue: 'TypeScript', children: [tsCode] },\n ])\n\n if (codeBlockReplacedJs === codeBlockContentJs) {\n replacement.attributes.push({ type: 'mdxJsxAttribute', name: 'hide' })\n }\n\n replacement.data ??= {} as any\n ;(replacement.data as any).customDataChoice = codeBlock.data.customDataChoice\n ;(replacement.data as any).customDataFilter = codeBlock.data.customDataFilter\n parent.children.splice(index, 1, replacement)\n}\n\nconst replaceFileNameSuffixes = (value: string) => value.replaceAll('.ts', '.js')\n\nconst replaceCodeBlockTitleFileExtension = (meta: unknown, outputLang: string) => {\n if (typeof meta !== 'string' || meta.trim() === '') {\n return meta\n }\n\n const parsedMeta = parseMetaString(meta)\n const titleToken = parsedMeta.tokens.find((token) => token.name === 'title' && token.hasExplicitValue)\n const titleValue = typeof parsedMeta.props.title === 'string' ? parsedMeta.props.title : null\n\n if (!titleToken || !titleValue) {\n return meta\n }\n\n const nextTitleValue = replaceTitleFileExtension(titleValue, outputLang)\n if (nextTitleValue === titleValue) {\n return meta\n }\n\n const quote = titleToken.raw.includes(\"title='\") ? \"'\" : '\"'\n return meta.replace(titleToken.raw, `title=${quote}${nextTitleValue}${quote}`)\n}\n\nconst replaceTitleFileExtension = (title: string, outputLang: string) => {\n if (outputLang === 'jsx') {\n return title.replace(/\\.tsx$/i, '.jsx').replace(/\\.ts$/i, '.js')\n }\n\n if (outputLang === 'js') {\n return title.replace(/\\.tsx$/i, '.jsx').replace(/\\.ts$/i, '.js')\n }\n\n return title\n}\n\nconst cleanUpCode = (code: string, isJsCode = false) => {\n if (isJsCode) {\n code = correctCodeDiffComments(code)\n }\n\n return processMagicComments(code)\n}\n\nconst processMagicComments = (code: string) => {\n const renameCommentRe = /^\\s*\\/\\/\\s@docpress-replace\\s([^ ]+) ([^ ]+)\\n/gm\n const matches = Array.from(code.matchAll(renameCommentRe))\n\n for (let index = matches.length - 1; index >= 0; index -= 1) {\n const match = matches[index]\n if (!match) {\n continue\n }\n\n const [fullMatch, renameFrom, renameTo] = match\n code = code.split(fullMatch).join('').replaceAll(renameFrom, renameTo)\n }\n\n return code.replaceAll('// @docpress-uncomment ', '')\n}\n\nconst correctCodeDiffComments = (code: string) => {\n return code.replaceAll(/\\n\\s*\\/\\/\\s\\[!code.+\\]/g, (codeDiff) => codeDiff.trimStart())\n}\n\nconst preserveSourceLineBreaks = (sourceCode: string, outputCode: string) => {\n const multilineSegments = collectMultilineSourceSegments(sourceCode)\n\n if (multilineSegments.length === 0) {\n return outputCode\n }\n\n const outputLines = outputCode.split('\\n')\n\n for (const segmentLines of multilineSegments) {\n const segmentNormalized = normalizeCodeSegment(segmentLines.join('\\n'))\n\n if (!segmentNormalized) {\n continue\n }\n\n for (let start = 0; start < outputLines.length; start += 1) {\n let replaced = false\n\n for (let size = 1; size <= segmentLines.length; size += 1) {\n if (start + size > outputLines.length) {\n break\n }\n\n const outputSegment = outputLines.slice(start, start + size)\n\n if (normalizeCodeSegment(outputSegment.join('\\n')) !== segmentNormalized) {\n continue\n }\n\n if (outputSegment.join('\\n') !== segmentLines.join('\\n')) {\n outputLines.splice(start, size, ...segmentLines)\n }\n\n start += segmentLines.length - 1\n replaced = true\n break\n }\n\n if (replaced) {\n break\n }\n }\n }\n\n return outputLines.join('\\n')\n}\n\nconst collectMultilineSourceSegments = (code: string) => {\n const lines = code.split('\\n')\n const segments: string[][] = []\n let paragraphStart = -1\n\n for (let index = 0; index <= lines.length; index += 1) {\n if (index < lines.length && lines[index]?.trim() !== '') {\n if (paragraphStart === -1) {\n paragraphStart = index\n }\n continue\n }\n\n if (paragraphStart !== -1) {\n const paragraphEnd = index - 1\n\n for (let size = paragraphEnd - paragraphStart + 1; size >= 2; size -= 1) {\n for (let start = paragraphStart; start + size - 1 <= paragraphEnd; start += 1) {\n segments.push(lines.slice(start, start + size).map(replaceFileNameSuffixes))\n }\n }\n }\n\n paragraphStart = -1\n }\n\n return segments\n}\n\nconst preserveSourceBlankLines = (sourceCode: string, outputCode: string) => {\n const blankLineAnchors = collectBlankLineAnchors(sourceCode)\n\n if (blankLineAnchors.length === 0) {\n return outputCode\n }\n\n const outputLines = outputCode.split('\\n')\n let searchFrom = 0\n\n for (const anchor of blankLineAnchors) {\n const lineIndex = outputLines.findIndex((line, index) => index >= searchFrom && normalizeCodeLine(line) === anchor)\n\n if (lineIndex <= 0) {\n continue\n }\n\n if (outputLines[lineIndex - 1]?.trim() !== '') {\n outputLines.splice(lineIndex, 0, '')\n searchFrom = lineIndex + 2\n } else {\n searchFrom = lineIndex + 1\n }\n }\n\n return outputLines.join('\\n')\n}\n\nconst collectBlankLineAnchors = (code: string) => {\n const lines = code.split('\\n')\n const anchors: string[] = []\n\n for (let index = 1; index < lines.length; index += 1) {\n if (lines[index]?.trim() !== '' || lines[index - 1]?.trim() === '') {\n continue\n }\n\n let nextLineIndex = index + 1\n\n while (nextLineIndex < lines.length && lines[nextLineIndex]?.trim() === '') {\n nextLineIndex += 1\n }\n\n const anchor = lines[nextLineIndex]\n\n if (anchor) {\n anchors.push(normalizeCodeLine(anchor))\n }\n }\n\n return anchors\n}\n\nconst normalizeCodeLine = (line: string) => {\n return stripTypeSyntax(replaceFileNameSuffixes(line)).trim().replace(/\\s+/g, ' ')\n}\n\nconst normalizeCodeSegment = (code: string) => {\n return replaceFileNameSuffixes(code).replace(/\\s+/g, '')\n}\n\nconst stripTypeSyntax = (line: string) => {\n return line\n .replace(/\\??:\\s*[A-Za-z_$][\\w$.<>, |&[\\]]*/g, '')\n .replace(/\\s+as\\s+const\\b/g, '')\n .replace(/\\s+as\\s+[A-Za-z_$][\\w$.<>, |&[\\]]*/g, '')\n}\n","import convert_ from 'npm-to-yarn'\nimport { visit } from 'unist-util-visit'\nimport { generateChoiceGroupCode } from './generateChoiceGroupCode.js'\nimport { parseMetaString } from './meta.js'\n\nconst convert: (input: string, target: 'npm' | 'pnpm' | 'bun' | 'yarn') => string = convert_\n\nconst PACKAGE_MANAGERS = ['pnpm', 'Bun', 'Yarn'] as const\n\nexport const remarkPkgManager = () => {\n return (tree: unknown) => {\n visit(tree as any, 'code', (node: any, index: number | undefined, parent: any) => {\n if (!parent || typeof index !== 'number') {\n return\n }\n\n if (!['bash', 'sh', 'shell'].includes(node.lang ?? '')) {\n return\n }\n\n if (node.value.includes('pnpm')) {\n return\n }\n\n if (!node.value.includes('npm ') && !node.value.includes('npx ')) {\n return\n }\n\n let choice: string | undefined\n if (node.meta) {\n const meta = parseMetaString(node.meta, ['choice'])\n choice = meta.props.choice\n node.meta = meta.rest\n }\n\n node.value = node.value.replaceAll('npm i ', 'npm install ')\n\n const nodes = new Map<string, any>()\n nodes.set('npm', node)\n\n for (const packageManager of PACKAGE_MANAGERS) {\n nodes.set(packageManager, {\n ...node,\n value: convert(node.value, packageManager.toLowerCase() as 'pnpm' | 'bun' | 'yarn'),\n })\n }\n\n const replacement = generateChoiceGroupCode(\n [...nodes].map(([choiceValue, childNode]) => ({\n choiceValue,\n children: [childNode],\n })),\n )\n\n replacement.data ??= {} as any\n ;(replacement.data as any).customDataChoice = choice\n ;(replacement.data as any).customDataFilter = replacement.type\n parent.children.splice(index, 1, replacement)\n })\n }\n}\n","import type { ShikiTransformer } from 'shiki'\n\nconst LINK_RE = /https:\\/\\/[^\\s]*[^.,\\s\"'`]/g\n\nexport const shikiTransformerAutoLinks = (): ShikiTransformer => {\n return {\n name: 'solid-docpress-shiki-autolinks',\n span(span) {\n if (span.children.length !== 1) {\n return\n }\n\n let child = span.children[0]\n if (child.type !== 'text') {\n return\n }\n\n const matches = Array.from(child.value.matchAll(LINK_RE)).filter(([href]) => !href.includes('${'))\n if (matches.length === 0) {\n return\n }\n\n const links = matches\n .map((match) => ({ href: match[0], index: match.index ?? 0 }))\n .sort((left, right) => right.index - left.index)\n\n const nextChildren: typeof span.children = []\n\n for (const { href, index } of links) {\n const endIndex = index + href.length\n const trailingText = child.value.slice(endIndex)\n\n if (trailingText) {\n nextChildren.unshift({ type: 'text', value: trailingText })\n }\n\n nextChildren.unshift({\n type: 'element',\n tagName: 'a',\n properties: { href },\n children: [{ type: 'text', value: href }],\n })\n\n child = {\n type: 'text',\n value: child.value.slice(0, index),\n }\n }\n\n if (child.value) {\n nextChildren.unshift(child)\n }\n\n span.children = nextChildren\n },\n }\n}\n"],"mappings":"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","names":["visit","visit","visit","visit","visit","visit"]}