@eqtylab/docs 0.3.0

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 (94) hide show
  1. package/README.md +201 -0
  2. package/dist/chunk-55J6XMHW.js +3 -0
  3. package/dist/chunk-55J6XMHW.js.map +1 -0
  4. package/dist/chunk-ATIOPYKE.js +102 -0
  5. package/dist/chunk-ATIOPYKE.js.map +1 -0
  6. package/dist/chunk-GSSSQTEV.js +51 -0
  7. package/dist/chunk-GSSSQTEV.js.map +1 -0
  8. package/dist/chunk-IWKZQ4CW.js +68 -0
  9. package/dist/chunk-IWKZQ4CW.js.map +1 -0
  10. package/dist/chunk-K7PJRTK3.js +113 -0
  11. package/dist/chunk-K7PJRTK3.js.map +1 -0
  12. package/dist/chunk-VJN3HXKM.js +59 -0
  13. package/dist/chunk-VJN3HXKM.js.map +1 -0
  14. package/dist/chunk-ZZ45WAVR.js +20 -0
  15. package/dist/chunk-ZZ45WAVR.js.map +1 -0
  16. package/dist/config.d.ts +78 -0
  17. package/dist/config.js +3 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/dev.d.ts +6 -0
  20. package/dist/dev.js +84 -0
  21. package/dist/dev.js.map +1 -0
  22. package/dist/env.d.ts +17 -0
  23. package/dist/env.js +3 -0
  24. package/dist/env.js.map +1 -0
  25. package/dist/index.d.ts +12 -0
  26. package/dist/index.js +421 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/internal/assert-mdx-only.d.ts +1 -0
  29. package/dist/internal/microlighter-grammars.d.ts +3 -0
  30. package/dist/internal/pagefind.d.ts +2 -0
  31. package/dist/internal/rehype-base-url.d.ts +5 -0
  32. package/dist/internal/rehype-base-url.js +3 -0
  33. package/dist/internal/rehype-base-url.js.map +1 -0
  34. package/dist/internal/rehype-code-fence.d.ts +1 -0
  35. package/dist/internal/rehype-prose-scope.d.ts +1 -0
  36. package/dist/internal/rehype-table-columns.d.ts +1 -0
  37. package/dist/internal/scan-consumer-pages.d.ts +7 -0
  38. package/dist/internal/virtual-config.d.ts +3 -0
  39. package/dist/loaders.d.ts +20 -0
  40. package/dist/loaders.js +85 -0
  41. package/dist/loaders.js.map +1 -0
  42. package/dist/nav.d.ts +57 -0
  43. package/dist/nav.js +222 -0
  44. package/dist/nav.js.map +1 -0
  45. package/dist/paths.d.ts +28 -0
  46. package/dist/paths.js +3 -0
  47. package/dist/paths.js.map +1 -0
  48. package/dist/runtime/chrome/GlobalSearch.module.css +26 -0
  49. package/dist/runtime/chrome/GlobalSearch.tsx +422 -0
  50. package/dist/runtime/chrome/Header.astro +105 -0
  51. package/dist/runtime/chrome/LinkIcon.astro +35 -0
  52. package/dist/runtime/chrome/NavDrawer.astro +60 -0
  53. package/dist/runtime/chrome/NavTree.astro +112 -0
  54. package/dist/runtime/chrome/NotFoundBody.tsx +12 -0
  55. package/dist/runtime/chrome/PageFooter.astro +80 -0
  56. package/dist/runtime/chrome/Prose.astro +169 -0
  57. package/dist/runtime/chrome/Sidebar.astro +21 -0
  58. package/dist/runtime/chrome/TableOfContents.astro +86 -0
  59. package/dist/runtime/chrome/ThemeToggle.tsx +85 -0
  60. package/dist/runtime/chrome/TocElbow.astro +30 -0
  61. package/dist/runtime/chrome/TocList.astro +43 -0
  62. package/dist/runtime/components/AlertBridge.astro +16 -0
  63. package/dist/runtime/components/CodeFence.astro +38 -0
  64. package/dist/runtime/components/CodeFenceBridge.astro +20 -0
  65. package/dist/runtime/components/Link.astro +21 -0
  66. package/dist/runtime/components/TableBridge.astro +18 -0
  67. package/dist/runtime/components/index.ts +2 -0
  68. package/dist/runtime/layouts/DocsPage.astro +50 -0
  69. package/dist/runtime/layouts/DocsShell.astro +92 -0
  70. package/dist/runtime/lib/mdx-components.ts +43 -0
  71. package/dist/runtime/lib/nav-data.ts +74 -0
  72. package/dist/runtime/lib/summary.ts +57 -0
  73. package/dist/runtime/lib/theme.ts +84 -0
  74. package/dist/runtime/routes/docs-md.ts +33 -0
  75. package/dist/runtime/routes/docs.astro +92 -0
  76. package/dist/runtime/routes/llms-txt.ts +38 -0
  77. package/dist/runtime/routes/not-found.astro +16 -0
  78. package/dist/runtime/scripts/eq-copy.ts +27 -0
  79. package/dist/runtime/scripts/eq-highlight.ts +24 -0
  80. package/dist/runtime/scripts/eq-nav-drawer.ts +31 -0
  81. package/dist/runtime/scripts/eq-nav-group.ts +52 -0
  82. package/dist/runtime/scripts/eq-toc.ts +166 -0
  83. package/dist/runtime/styles/chrome.css +30 -0
  84. package/dist/runtime/styles/docs.css +21 -0
  85. package/dist/runtime/styles/prose.css +102 -0
  86. package/dist/runtime/styles/theme.css +2 -0
  87. package/dist/runtime/styles/utilities.css +38 -0
  88. package/dist/schema.d.ts +110 -0
  89. package/dist/schema.js +3 -0
  90. package/dist/schema.js.map +1 -0
  91. package/dist/types.d.ts +60 -0
  92. package/dist/types.js +3 -0
  93. package/dist/types.js.map +1 -0
  94. package/package.json +127 -0
@@ -0,0 +1,59 @@
1
+ // src/paths.ts
2
+ function joinPath(...parts) {
3
+ const joined = parts.filter((p) => typeof p === "string" && p.length > 0).join("/");
4
+ return "/" + joined.replace(/^\/+/, "").replace(/\/{2,}/g, "/");
5
+ }
6
+ function isExternalHref(href) {
7
+ return /^[a-z][a-z0-9+.-]*:/i.test(href) || href.startsWith("//");
8
+ }
9
+ function isUnrewritable(href) {
10
+ return isExternalHref(href) || href.startsWith("#") || href.startsWith("?");
11
+ }
12
+ function ensureTrailingSlash(href) {
13
+ if (isUnrewritable(href)) return href;
14
+ const [path, rest = ""] = href.split(/(?=[?#])/, 2);
15
+ if (path.endsWith("/")) return href;
16
+ if (/\.[a-z0-9]+$/i.test(path)) return href;
17
+ return path + "/" + rest;
18
+ }
19
+ function idToPath(id) {
20
+ return id === "index" ? "" : id;
21
+ }
22
+ function normalizePath(path) {
23
+ let decoded = path;
24
+ try {
25
+ decoded = decodeURI(path);
26
+ } catch {
27
+ }
28
+ return decoded.replace(/\/+$/, "") || "/";
29
+ }
30
+ function withBase(path, ctx) {
31
+ if (isUnrewritable(path)) return path;
32
+ return joinPath(ctx.base, path);
33
+ }
34
+ function docsHref(id, ctx) {
35
+ return ensureTrailingSlash(joinPath(ctx.base, ctx.versionPrefix, ctx.pathPrefix, idToPath(id)));
36
+ }
37
+ function stripBase(pathname, ctx) {
38
+ let rest = normalizePath(pathname);
39
+ for (const prefix of [ctx.base, ctx.versionPrefix, ctx.pathPrefix]) {
40
+ if (!prefix) continue;
41
+ const norm = normalizePath(joinPath(prefix));
42
+ if (norm === "/") continue;
43
+ if (rest === norm) return "/";
44
+ if (rest.startsWith(norm + "/")) rest = rest.slice(norm.length);
45
+ }
46
+ return rest || "/";
47
+ }
48
+ function isActive(currentPathname, target) {
49
+ return normalizePath(currentPathname) === normalizePath(target);
50
+ }
51
+ function isAncestor(currentPathname, target) {
52
+ const current = normalizePath(currentPathname);
53
+ const t = normalizePath(target);
54
+ return t === "/" ? current === "/" : current === t || current.startsWith(t + "/");
55
+ }
56
+
57
+ export { docsHref, ensureTrailingSlash, idToPath, isActive, isAncestor, isExternalHref, joinPath, normalizePath, stripBase, withBase };
58
+ //# sourceMappingURL=chunk-VJN3HXKM.js.map
59
+ //# sourceMappingURL=chunk-VJN3HXKM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/paths.ts"],"names":[],"mappings":"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","file":"chunk-VJN3HXKM.js","sourcesContent":["/** Every URL the framework emits goes through here; nothing else may concatenate a path. */\n\n/** Join path segments, collapsing duplicate slashes, always leading with one. */\nexport function joinPath(...parts: Array<string | undefined | null>): string {\n const joined = parts.filter((p): p is string => typeof p === 'string' && p.length > 0).join('/');\n return '/' + joined.replace(/^\\/+/, '').replace(/\\/{2,}/g, '/');\n}\n\n/** True for anything we must not rewrite: protocol, protocol-relative, fragment, or query. */\nexport function isExternalHref(href: string): boolean {\n return /^[a-z][a-z0-9+.-]*:/i.test(href) || href.startsWith('//');\n}\n\nfunction isUnrewritable(href: string): boolean {\n return isExternalHref(href) || href.startsWith('#') || href.startsWith('?');\n}\n\nexport function ensureTrailingSlash(href: string): string {\n if (isUnrewritable(href)) return href;\n const [path, rest = ''] = href.split(/(?=[?#])/, 2);\n if (path.endsWith('/')) return href;\n // Never slash something that looks like a file (/llms.txt, /a.md).\n if (/\\.[a-z0-9]+$/i.test(path)) return href;\n return path + '/' + rest;\n}\n\n/** Astro gives the root `index.mdx` the id \"index\", not \"\". */\nexport function idToPath(id: string): string {\n return id === 'index' ? '' : id;\n}\n\n/** Trim trailing slashes for comparison. Keeps a bare \"/\" intact. */\nexport function normalizePath(path: string): string {\n let decoded = path;\n try {\n decoded = decodeURI(path);\n } catch {\n // Malformed percent-encoding: compare the raw value.\n }\n return decoded.replace(/\\/+$/, '') || '/';\n}\n\nexport interface PathContext {\n /** Astro's `import.meta.env.BASE_URL`. Always has a leading slash. */\n base: string;\n /** Mounted-at prefix for docs pages, e.g. \"docs\". Usually empty. */\n pathPrefix?: string;\n /** Version segment for a pinned build, e.g. \"v3.1\". Empty for latest-at-root. */\n versionPrefix?: string;\n}\n\n/** Prefix a site-absolute path with `base`. For assets: favicons, logos, og images. */\nexport function withBase(path: string, ctx: PathContext): string {\n if (isUnrewritable(path)) return path;\n return joinPath(ctx.base, path);\n}\n\n/** The public URL for a docs collection entry id. */\nexport function docsHref(id: string, ctx: PathContext): string {\n return ensureTrailingSlash(joinPath(ctx.base, ctx.versionPrefix, ctx.pathPrefix, idToPath(id)));\n}\n\n/** Remove `base` (and version/path prefixes) from a pathname, yielding a docs-relative path. */\nexport function stripBase(pathname: string, ctx: PathContext): string {\n let rest = normalizePath(pathname);\n for (const prefix of [ctx.base, ctx.versionPrefix, ctx.pathPrefix]) {\n if (!prefix) continue;\n const norm = normalizePath(joinPath(prefix));\n if (norm === '/') continue;\n if (rest === norm) return '/';\n if (rest.startsWith(norm + '/')) rest = rest.slice(norm.length);\n }\n return rest || '/';\n}\n\n/** Whether `target` is the page currently being viewed. Base-aware, slash-insensitive. */\nexport function isActive(currentPathname: string, target: string): boolean {\n return normalizePath(currentPathname) === normalizePath(target);\n}\n\n/** Whether `target` is the current page or an ancestor of it. Drives group expansion. */\nexport function isAncestor(currentPathname: string, target: string): boolean {\n const current = normalizePath(currentPathname);\n const t = normalizePath(target);\n return t === '/' ? current === '/' : current === t || current.startsWith(t + '/');\n}\n"]}
@@ -0,0 +1,20 @@
1
+ // src/env.ts
2
+ function slashed(value) {
3
+ const trimmed = value.trim();
4
+ if (!trimmed || trimmed === "/") return "/";
5
+ return ("/" + trimmed.replace(/^\/+/, "").replace(/\/+$/, "") + "/").replace(/\/{2,}/g, "/");
6
+ }
7
+ function resolveDocsEnv(defaults = {}) {
8
+ const env = process.env;
9
+ return {
10
+ site: env.DOCS_SITE ?? defaults.site,
11
+ base: slashed(env.DOCS_BASE ?? defaults.base ?? "/"),
12
+ versionRoot: slashed(env.DOCS_VERSION_ROOT ?? defaults.versionRoot ?? "/"),
13
+ version: env.DOCS_VERSION ?? defaults.version ?? null,
14
+ isLatest: env.DOCS_IS_LATEST ? env.DOCS_IS_LATEST === "true" : defaults.isLatest ?? true
15
+ };
16
+ }
17
+
18
+ export { resolveDocsEnv };
19
+ //# sourceMappingURL=chunk-ZZ45WAVR.js.map
20
+ //# sourceMappingURL=chunk-ZZ45WAVR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/env.ts"],"names":[],"mappings":";AAiBA,SAAS,QAAQ,KAAA,EAAuB;AACtC,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,GAAA,EAAK,OAAO,GAAA;AACxC,EAAA,OAAA,CAAQ,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,GAAI,GAAA,EAAK,OAAA,CAAQ,WAAW,GAAG,CAAA;AAC7F;AAEO,SAAS,cAAA,CAAe,QAAA,GAA6B,EAAC,EAAY;AACvE,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AACpB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,GAAA,CAAI,SAAA,IAAa,QAAA,CAAS,IAAA;AAAA,IAChC,MAAM,OAAA,CAAQ,GAAA,CAAI,SAAA,IAAa,QAAA,CAAS,QAAQ,GAAG,CAAA;AAAA,IACnD,aAAa,OAAA,CAAQ,GAAA,CAAI,iBAAA,IAAqB,QAAA,CAAS,eAAe,GAAG,CAAA;AAAA,IACzE,OAAA,EAAS,GAAA,CAAI,YAAA,IAAgB,QAAA,CAAS,OAAA,IAAW,IAAA;AAAA,IACjD,UAAU,GAAA,CAAI,cAAA,GAAiB,IAAI,cAAA,KAAmB,MAAA,GAAU,SAAS,QAAA,IAAY;AAAA,GACvF;AACF","file":"chunk-ZZ45WAVR.js","sourcesContent":["/**\n * Build environment for a versioned deploy. `base` must be literal in the\n * consumer's Astro config, so it is threaded by env var. `versionRoot` is\n * separate because a /v3.1/ build still needs the manifest at /docs-versions.json.\n */\nexport interface DocsEnv {\n site?: string;\n /** Astro's `base`. e.g. '/', '/v3.1/', '/equality/v3.1/' */\n base: string;\n /** Deploy-root-relative directory holding all version directories. */\n versionRoot: string;\n /** This build's version id, e.g. '3.1'. Null for an unversioned build. */\n version: string | null;\n /** Whether this build is the canonical latest (indexable, served at root). */\n isLatest: boolean;\n}\n\nfunction slashed(value: string): string {\n const trimmed = value.trim();\n if (!trimmed || trimmed === '/') return '/';\n return ('/' + trimmed.replace(/^\\/+/, '').replace(/\\/+$/, '') + '/').replace(/\\/{2,}/g, '/');\n}\n\nexport function resolveDocsEnv(defaults: Partial<DocsEnv> = {}): DocsEnv {\n const env = process.env;\n return {\n site: env.DOCS_SITE ?? defaults.site,\n base: slashed(env.DOCS_BASE ?? defaults.base ?? '/'),\n versionRoot: slashed(env.DOCS_VERSION_ROOT ?? defaults.versionRoot ?? '/'),\n version: env.DOCS_VERSION ?? defaults.version ?? null,\n isLatest: env.DOCS_IS_LATEST ? env.DOCS_IS_LATEST === 'true' : (defaults.isLatest ?? true),\n };\n}\n"]}
@@ -0,0 +1,78 @@
1
+ /** Integration options: the whole consumer-facing configuration surface. */
2
+ import { z } from 'astro/zod';
3
+ export declare const docsConfigSchema: z.ZodObject<{
4
+ title: z.ZodString;
5
+ description: z.ZodOptional<z.ZodString>;
6
+ favicon: z.ZodDefault<z.ZodString>;
7
+ logo: z.ZodOptional<z.ZodObject<{
8
+ src: z.ZodString;
9
+ alt: z.ZodDefault<z.ZodString>;
10
+ }, z.core.$strip>>;
11
+ contentDir: z.ZodDefault<z.ZodString>;
12
+ pathPrefix: z.ZodDefault<z.ZodString>;
13
+ sidebar: z.ZodPrefault<z.ZodObject<{
14
+ collapsed: z.ZodDefault<z.ZodBoolean>;
15
+ sort: z.ZodDefault<z.ZodEnum<{
16
+ alpha: "alpha";
17
+ filename: "filename";
18
+ manual: "manual";
19
+ }>>;
20
+ extra: z.ZodDefault<z.ZodArray<z.ZodAny>>;
21
+ }, z.core.$strip>>;
22
+ header: z.ZodPrefault<z.ZodObject<{
23
+ links: z.ZodDefault<z.ZodArray<z.ZodObject<{
24
+ label: z.ZodString;
25
+ href: z.ZodString;
26
+ icon: z.ZodOptional<z.ZodString>;
27
+ external: z.ZodOptional<z.ZodBoolean>;
28
+ }, z.core.$strip>>>;
29
+ showThemeToggle: z.ZodDefault<z.ZodBoolean>;
30
+ }, z.core.$strip>>;
31
+ footer: z.ZodPrefault<z.ZodObject<{
32
+ editUrl: z.ZodOptional<z.ZodString>;
33
+ showPrevNext: z.ZodDefault<z.ZodBoolean>;
34
+ text: z.ZodOptional<z.ZodString>;
35
+ }, z.core.$strip>>;
36
+ tableOfContents: z.ZodPrefault<z.ZodUnion<readonly [z.ZodObject<{
37
+ minLevel: z.ZodDefault<z.ZodNumber>;
38
+ maxLevel: z.ZodDefault<z.ZodNumber>;
39
+ }, z.core.$strip>, z.ZodLiteral<false>]>>;
40
+ code: z.ZodPrefault<z.ZodObject<{
41
+ highlighter: z.ZodDefault<z.ZodEnum<{
42
+ codeblock: "codeblock";
43
+ shiki: "shiki";
44
+ }>>;
45
+ themes: z.ZodDefault<z.ZodObject<{
46
+ light: z.ZodString;
47
+ dark: z.ZodString;
48
+ }, z.core.$strip>>;
49
+ wrap: z.ZodDefault<z.ZodBoolean>;
50
+ langs: z.ZodDefault<z.ZodArray<z.ZodString>>;
51
+ }, z.core.$strip>>;
52
+ search: z.ZodPrefault<z.ZodObject<{
53
+ provider: z.ZodDefault<z.ZodEnum<{
54
+ pagefind: "pagefind";
55
+ none: "none";
56
+ }>>;
57
+ }, z.core.$strip>>;
58
+ routing: z.ZodPrefault<z.ZodObject<{
59
+ injectPages: z.ZodDefault<z.ZodBoolean>;
60
+ markdownTwins: z.ZodDefault<z.ZodBoolean>;
61
+ notFound: z.ZodDefault<z.ZodBoolean>;
62
+ }, z.core.$strip>>;
63
+ theme: z.ZodPrefault<z.ZodObject<{
64
+ mode: z.ZodDefault<z.ZodEnum<{
65
+ global: "global";
66
+ scoped: "scoped";
67
+ }>>;
68
+ persist: z.ZodDefault<z.ZodBoolean>;
69
+ }, z.core.$strip>>;
70
+ customCss: z.ZodDefault<z.ZodArray<z.ZodString>>;
71
+ clientScripts: z.ZodDefault<z.ZodArray<z.ZodString>>;
72
+ autoIntegrations: z.ZodDefault<z.ZodBoolean>;
73
+ versions: z.ZodOptional<z.ZodAny>;
74
+ plugins: z.ZodDefault<z.ZodArray<z.ZodAny>>;
75
+ }, z.core.$strip>;
76
+ export type DocsUserConfig = z.input<typeof docsConfigSchema>;
77
+ export type DocsConfig = z.output<typeof docsConfigSchema>;
78
+ export declare function resolveConfig(user: DocsUserConfig): DocsConfig;
package/dist/config.js ADDED
@@ -0,0 +1,3 @@
1
+ export { docsConfigSchema, resolveConfig } from './chunk-ATIOPYKE.js';
2
+ //# sourceMappingURL=config.js.map
3
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"config.js"}
package/dist/dev.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import type { Plugin } from 'vite';
2
+ export interface LinkOptions {
3
+ /** Package name -> path to its package root, relative to the consumer project. */
4
+ [packageName: string]: string;
5
+ }
6
+ export declare function linkWorkspacePackages(options: LinkOptions): Plugin[];
package/dist/dev.js ADDED
@@ -0,0 +1,84 @@
1
+ import { existsSync, readFileSync } from 'fs';
2
+ import path from 'path';
3
+ import { globSync } from 'tinyglobby';
4
+
5
+ // src/dev.ts
6
+ function invertExports(pkgRoot, pkgName) {
7
+ const manifestPath = path.join(pkgRoot, "package.json");
8
+ if (!existsSync(manifestPath)) return null;
9
+ const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
10
+ const srcDir = path.join(pkgRoot, "src");
11
+ if (!existsSync(srcDir)) return null;
12
+ const subpaths = /* @__PURE__ */ new Map();
13
+ const candidates = globSync(["**/*.{css,ts,tsx}"], { cwd: srcDir, absolute: false });
14
+ const byBasename = /* @__PURE__ */ new Map();
15
+ for (const rel of candidates) {
16
+ const key = path.basename(rel);
17
+ const list = byBasename.get(key);
18
+ if (list) list.push(rel);
19
+ else byBasename.set(key, [rel]);
20
+ }
21
+ const targetOf = (value) => {
22
+ if (typeof value === "string") return value;
23
+ if (value && typeof value === "object") {
24
+ const conditions = value;
25
+ for (const key of ["import", "default", "require"]) {
26
+ const nested = targetOf(conditions[key]);
27
+ if (nested) return nested;
28
+ }
29
+ }
30
+ return void 0;
31
+ };
32
+ for (const [subpath, value] of Object.entries(manifest.exports ?? {})) {
33
+ if (subpath === "." || subpath === "./package.json" || subpath.includes("*")) continue;
34
+ const target = targetOf(value);
35
+ if (!target) continue;
36
+ const basename = path.basename(target);
37
+ const matches = byBasename.get(basename);
38
+ if (!matches || matches.length === 0) continue;
39
+ if (matches.length > 1) {
40
+ matches.sort((a, b) => a.split("/").length - b.split("/").length);
41
+ }
42
+ subpaths.set(subpath.replace(/^\.\//, ""), path.join(srcDir, matches[0]));
43
+ }
44
+ return { name: pkgName, srcDir, subpaths };
45
+ }
46
+ function linkWorkspacePackages(options) {
47
+ const linked = [];
48
+ for (const [name, relativeRoot] of Object.entries(options)) {
49
+ const pkgRoot = path.resolve(process.cwd(), relativeRoot);
50
+ const entry = invertExports(pkgRoot, name);
51
+ if (entry) linked.push(entry);
52
+ }
53
+ if (linked.length === 0) return [];
54
+ const resolver = {
55
+ name: "eqty-docs:link-workspace-source",
56
+ enforce: "pre",
57
+ async resolveId(id, importer, opts) {
58
+ for (const pkg of linked) {
59
+ let target;
60
+ if (id === pkg.name) {
61
+ target = pkg.srcDir;
62
+ } else if (id.startsWith(`${pkg.name}/`)) {
63
+ const subpath = id.slice(pkg.name.length + 1);
64
+ target = pkg.subpaths.get(subpath) ?? path.join(pkg.srcDir, subpath);
65
+ }
66
+ if (!target) continue;
67
+ const resolved = await this.resolve(target, importer, { ...opts, skipSelf: true });
68
+ return resolved ?? target;
69
+ }
70
+ return null;
71
+ }
72
+ };
73
+ const watcher = {
74
+ name: "eqty-docs:watch-workspace-source",
75
+ configureServer(server) {
76
+ for (const pkg of linked) server.watcher.add(pkg.srcDir);
77
+ }
78
+ };
79
+ return [resolver, watcher];
80
+ }
81
+
82
+ export { linkWorkspacePackages };
83
+ //# sourceMappingURL=dev.js.map
84
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dev.ts"],"names":[],"mappings":"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","file":"dev.js","sourcesContent":["/**\n * Dev-only source linking: redirects a workspace package's specifiers to its\n * source tree so edits hot-reload. Subpaths derive from the package's `exports`.\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { globSync } from 'tinyglobby';\nimport type { Plugin } from 'vite';\n\nexport interface LinkOptions {\n /** Package name -> path to its package root, relative to the consumer project. */\n [packageName: string]: string;\n}\n\ninterface LinkedPackage {\n name: string;\n srcDir: string;\n /** Subpath (e.g. 'theme-config.css') -> absolute file under src/. */\n subpaths: Map<string, string>;\n}\n\n/** For each `exports` subpath targeting dist/, find the same basename under src/. */\nfunction invertExports(pkgRoot: string, pkgName: string): LinkedPackage | null {\n const manifestPath = path.join(pkgRoot, 'package.json');\n if (!existsSync(manifestPath)) return null;\n\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as {\n exports?: Record<string, unknown>;\n };\n const srcDir = path.join(pkgRoot, 'src');\n if (!existsSync(srcDir)) return null;\n\n const subpaths = new Map<string, string>();\n const candidates = globSync(['**/*.{css,ts,tsx}'], { cwd: srcDir, absolute: false });\n const byBasename = new Map<string, string[]>();\n for (const rel of candidates) {\n const key = path.basename(rel);\n const list = byBasename.get(key);\n if (list) list.push(rel);\n else byBasename.set(key, [rel]);\n }\n\n const targetOf = (value: unknown): string | undefined => {\n if (typeof value === 'string') return value;\n if (value && typeof value === 'object') {\n const conditions = value as Record<string, unknown>;\n for (const key of ['import', 'default', 'require']) {\n const nested = targetOf(conditions[key]);\n if (nested) return nested;\n }\n }\n return undefined;\n };\n\n for (const [subpath, value] of Object.entries(manifest.exports ?? {})) {\n if (subpath === '.' || subpath === './package.json' || subpath.includes('*')) continue;\n const target = targetOf(value);\n if (!target) continue;\n\n const basename = path.basename(target);\n const matches = byBasename.get(basename);\n if (!matches || matches.length === 0) continue;\n if (matches.length > 1) {\n matches.sort((a, b) => a.split('/').length - b.split('/').length);\n }\n subpaths.set(subpath.replace(/^\\.\\//, ''), path.join(srcDir, matches[0] as string));\n }\n\n return { name: pkgName, srcDir, subpaths };\n}\n\nexport function linkWorkspacePackages(options: LinkOptions): Plugin[] {\n const linked: LinkedPackage[] = [];\n\n for (const [name, relativeRoot] of Object.entries(options)) {\n const pkgRoot = path.resolve(process.cwd(), relativeRoot);\n const entry = invertExports(pkgRoot, name);\n if (entry) linked.push(entry);\n }\n\n if (linked.length === 0) return [];\n\n const resolver: Plugin = {\n name: 'eqty-docs:link-workspace-source',\n enforce: 'pre',\n async resolveId(id, importer, opts) {\n for (const pkg of linked) {\n let target: string | undefined;\n\n if (id === pkg.name) {\n target = pkg.srcDir; // directory -> index.ts\n } else if (id.startsWith(`${pkg.name}/`)) {\n const subpath = id.slice(pkg.name.length + 1);\n target = pkg.subpaths.get(subpath) ?? path.join(pkg.srcDir, subpath);\n }\n\n if (!target) continue;\n // Vite still handles directory and extension resolution.\n const resolved = await this.resolve(target, importer, { ...opts, skipSelf: true });\n return resolved ?? target;\n }\n return null;\n },\n };\n\n const watcher: Plugin = {\n name: 'eqty-docs:watch-workspace-source',\n configureServer(server) {\n for (const pkg of linked) server.watcher.add(pkg.srcDir);\n },\n };\n\n return [resolver, watcher];\n}\n"]}
package/dist/env.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Build environment for a versioned deploy. `base` must be literal in the
3
+ * consumer's Astro config, so it is threaded by env var. `versionRoot` is
4
+ * separate because a /v3.1/ build still needs the manifest at /docs-versions.json.
5
+ */
6
+ export interface DocsEnv {
7
+ site?: string;
8
+ /** Astro's `base`. e.g. '/', '/v3.1/', '/equality/v3.1/' */
9
+ base: string;
10
+ /** Deploy-root-relative directory holding all version directories. */
11
+ versionRoot: string;
12
+ /** This build's version id, e.g. '3.1'. Null for an unversioned build. */
13
+ version: string | null;
14
+ /** Whether this build is the canonical latest (indexable, served at root). */
15
+ isLatest: boolean;
16
+ }
17
+ export declare function resolveDocsEnv(defaults?: Partial<DocsEnv>): DocsEnv;
package/dist/env.js ADDED
@@ -0,0 +1,3 @@
1
+ export { resolveDocsEnv } from './chunk-ZZ45WAVR.js';
2
+ //# sourceMappingURL=env.js.map
3
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"env.js"}
@@ -0,0 +1,12 @@
1
+ import type { AstroIntegration } from 'astro';
2
+ import { type DocsUserConfig } from './config.ts';
3
+ import { type DocsEnv } from './env.ts';
4
+ export { resolveConfig, type DocsConfig, type DocsUserConfig } from './config.ts';
5
+ export { resolveDocsEnv, type DocsEnv } from './env.ts';
6
+ export { docsSchema, groupSchema, badgeSchema } from './schema.ts';
7
+ export * from './types.ts';
8
+ export interface DocsIntegrationOptions extends DocsUserConfig {
9
+ /** Build environment for versioned deploys. Defaults to `resolveDocsEnv()`. */
10
+ env?: Partial<DocsEnv>;
11
+ }
12
+ export default function docs(options?: DocsIntegrationOptions): AstroIntegration;