@shadow-shard-tools/docs-core 1.0.17 → 1.0.19

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 (254) hide show
  1. package/README.md +85 -5
  2. package/dist/cjs/configs/clientConfig.js +78 -0
  3. package/dist/cjs/configs/codeLanguagesConfig.js +36 -0
  4. package/dist/cjs/configs/index.browser.js +16 -0
  5. package/dist/cjs/configs/index.js +20 -0
  6. package/dist/cjs/configs/sstDocsConfig.browser.js +27 -0
  7. package/dist/cjs/configs/sstDocsConfig.js +88 -0
  8. package/dist/cjs/configs/sstDocsConfigShared.js +232 -0
  9. package/dist/cjs/constants/alignmentClasses.js +17 -0
  10. package/dist/cjs/constants/index.js +7 -0
  11. package/dist/cjs/constants/spacingClasses.js +9 -0
  12. package/dist/cjs/data/buildTree.js +131 -0
  13. package/dist/cjs/data/fsDataProvider.browser.js +10 -0
  14. package/dist/cjs/data/fsDataProvider.js +23 -0
  15. package/dist/cjs/data/httpDataProvider.js +25 -0
  16. package/dist/cjs/data/index.browser.js +17 -0
  17. package/dist/cjs/data/index.js +22 -0
  18. package/dist/cjs/data/loadAllCategories.js +30 -0
  19. package/dist/cjs/data/loadAllItems.js +26 -0
  20. package/dist/cjs/data/loadVersionData.fs.js +29 -0
  21. package/dist/cjs/data/loadVersionData.js +78 -0
  22. package/dist/cjs/data/loadVersions.js +6 -0
  23. package/dist/cjs/index.browser.js +22 -0
  24. package/dist/cjs/index.js +22 -0
  25. package/dist/cjs/themes/index.js +15 -0
  26. package/dist/cjs/themes/presets/default.js +121 -0
  27. package/dist/cjs/themes/styleThemeSchema.js +36 -0
  28. package/dist/cjs/themes/themeRegistry.js +22 -0
  29. package/dist/cjs/types/AudioData.js +2 -0
  30. package/dist/cjs/types/BaseImage.js +2 -0
  31. package/dist/cjs/types/Category.js +2 -0
  32. package/dist/cjs/types/CategoryTitleData.js +2 -0
  33. package/dist/cjs/types/ChartData.js +2 -0
  34. package/dist/cjs/types/ClientVisibleSstDocsConfig.js +2 -0
  35. package/dist/cjs/types/CodeData.js +2 -0
  36. package/dist/cjs/types/Content.js +2 -0
  37. package/dist/cjs/types/DataDiagnostic.js +2 -0
  38. package/dist/cjs/types/DataProvider.js +2 -0
  39. package/dist/cjs/types/DividerData.js +2 -0
  40. package/dist/cjs/types/DocItem.js +2 -0
  41. package/dist/cjs/types/HeaderBranding.js +2 -0
  42. package/dist/cjs/types/HtmlGeneratorSettings.js +2 -0
  43. package/dist/cjs/types/ImageCarouselData.js +2 -0
  44. package/dist/cjs/types/ImageCompareData.js +2 -0
  45. package/dist/cjs/types/ImageData.js +2 -0
  46. package/dist/cjs/types/ImageGridData.js +2 -0
  47. package/dist/cjs/types/IndexJson.js +2 -0
  48. package/dist/cjs/types/ListData.js +2 -0
  49. package/dist/cjs/types/Logger.js +2 -0
  50. package/dist/cjs/types/MathData.js +2 -0
  51. package/dist/cjs/types/MessageBoxData.js +2 -0
  52. package/dist/cjs/types/RawCategory.js +2 -0
  53. package/dist/cjs/types/SstDocsConfig.js +2 -0
  54. package/dist/cjs/types/StyleTheme.js +2 -0
  55. package/dist/cjs/types/TableData.js +2 -0
  56. package/dist/cjs/types/TextData.js +2 -0
  57. package/dist/cjs/types/TitleData.js +2 -0
  58. package/dist/cjs/types/Version.js +2 -0
  59. package/dist/cjs/types/YoutubeData.js +2 -0
  60. package/dist/cjs/types/index.js +2 -0
  61. package/dist/cjs/utilities/dom/copyToClipboard.js +40 -0
  62. package/dist/cjs/utilities/dom/downloadTextFile.js +23 -0
  63. package/dist/cjs/utilities/dom/getResponsiveWidth.js +11 -0
  64. package/dist/cjs/utilities/file/getFileExtension.js +9 -0
  65. package/dist/cjs/utilities/index.browser.js +53 -0
  66. package/dist/cjs/utilities/index.js +53 -0
  67. package/dist/cjs/utilities/path/pathExists.browser.js +6 -0
  68. package/dist/cjs/utilities/path/pathExists.js +16 -0
  69. package/dist/cjs/utilities/path/resolveAgainstProjectRoot.browser.js +6 -0
  70. package/dist/cjs/utilities/path/resolveAgainstProjectRoot.js +13 -0
  71. package/dist/cjs/utilities/path/resolveDataPath.browser.js +6 -0
  72. package/dist/cjs/utilities/path/resolveDataPath.js +18 -0
  73. package/dist/cjs/utilities/string/extractYouTubeId.js +18 -0
  74. package/dist/cjs/utilities/string/normalizeBaseUrlPath.js +11 -0
  75. package/dist/cjs/utilities/string/normalizeSystemPath.js +14 -0
  76. package/dist/cjs/utilities/string/processListItems.js +10 -0
  77. package/dist/cjs/utilities/string/sanitizeFilename.js +13 -0
  78. package/dist/cjs/utilities/string/slugify.js +12 -0
  79. package/dist/cjs/utilities/string/withBasePath.js +73 -0
  80. package/dist/cjs/utilities/system/createTimeout.js +11 -0
  81. package/dist/cjs/utilities/system/formatTime.js +12 -0
  82. package/dist/cjs/utilities/system/logger.browser.js +39 -0
  83. package/dist/cjs/utilities/system/logger.js +60 -0
  84. package/dist/cjs/utilities/validation/isMobileDevice.js +8 -0
  85. package/dist/cjs/utilities/validation/isValidColor.js +182 -0
  86. package/dist/cjs/utilities/validation/isValidImageUrl.js +42 -0
  87. package/dist/cjs/utilities/validation/isValidYouTubeId.js +9 -0
  88. package/dist/cjs/utilities/validation/validateScale.js +8 -0
  89. package/dist/configs/clientConfig.d.ts.map +1 -1
  90. package/dist/configs/clientConfig.js +38 -24
  91. package/dist/configs/clientConfig.js.map +1 -1
  92. package/dist/configs/index.browser.d.ts +4 -0
  93. package/dist/configs/index.browser.d.ts.map +1 -0
  94. package/dist/configs/index.browser.js +4 -0
  95. package/dist/configs/index.browser.js.map +1 -0
  96. package/dist/configs/index.d.ts +1 -3
  97. package/dist/configs/index.d.ts.map +1 -1
  98. package/dist/configs/index.js +1 -3
  99. package/dist/configs/index.js.map +1 -1
  100. package/dist/configs/sstDocsConfig.browser.d.ts +8 -0
  101. package/dist/configs/sstDocsConfig.browser.d.ts.map +1 -0
  102. package/dist/configs/sstDocsConfig.browser.js +18 -0
  103. package/dist/configs/sstDocsConfig.browser.js.map +1 -0
  104. package/dist/configs/sstDocsConfig.d.ts +2 -2
  105. package/dist/configs/sstDocsConfig.d.ts.map +1 -1
  106. package/dist/configs/sstDocsConfig.js +18 -183
  107. package/dist/configs/sstDocsConfig.js.map +1 -1
  108. package/dist/configs/sstDocsConfigShared.d.ts +17 -0
  109. package/dist/configs/sstDocsConfigShared.d.ts.map +1 -0
  110. package/dist/configs/sstDocsConfigShared.js +226 -0
  111. package/dist/configs/sstDocsConfigShared.js.map +1 -0
  112. package/dist/data/buildTree.d.ts +6 -10
  113. package/dist/data/buildTree.d.ts.map +1 -1
  114. package/dist/data/buildTree.js +117 -162
  115. package/dist/data/buildTree.js.map +1 -1
  116. package/dist/data/fsDataProvider.browser.d.ts +6 -0
  117. package/dist/data/fsDataProvider.browser.d.ts.map +1 -0
  118. package/dist/data/fsDataProvider.browser.js +7 -0
  119. package/dist/data/fsDataProvider.browser.js.map +1 -0
  120. package/dist/data/fsDataProvider.d.ts +2 -1
  121. package/dist/data/fsDataProvider.d.ts.map +1 -1
  122. package/dist/data/fsDataProvider.js +15 -3
  123. package/dist/data/fsDataProvider.js.map +1 -1
  124. package/dist/data/httpDataProvider.d.ts +2 -1
  125. package/dist/data/httpDataProvider.d.ts.map +1 -1
  126. package/dist/data/httpDataProvider.js +17 -4
  127. package/dist/data/httpDataProvider.js.map +1 -1
  128. package/dist/data/index.browser.d.ts +7 -0
  129. package/dist/data/index.browser.d.ts.map +1 -0
  130. package/dist/data/index.browser.js +7 -0
  131. package/dist/data/index.browser.js.map +1 -0
  132. package/dist/data/index.d.ts +4 -3
  133. package/dist/data/index.d.ts.map +1 -1
  134. package/dist/data/index.js +4 -3
  135. package/dist/data/index.js.map +1 -1
  136. package/dist/data/loadAllCategories.d.ts +10 -1
  137. package/dist/data/loadAllCategories.d.ts.map +1 -1
  138. package/dist/data/loadAllCategories.js +15 -5
  139. package/dist/data/loadAllCategories.js.map +1 -1
  140. package/dist/data/loadAllItems.d.ts +10 -1
  141. package/dist/data/loadAllItems.d.ts.map +1 -1
  142. package/dist/data/loadAllItems.js +19 -7
  143. package/dist/data/loadAllItems.js.map +1 -1
  144. package/dist/data/loadVersionData.d.ts +22 -1
  145. package/dist/data/loadVersionData.d.ts.map +1 -1
  146. package/dist/data/loadVersionData.fs.d.ts +3 -0
  147. package/dist/data/loadVersionData.fs.d.ts.map +1 -0
  148. package/dist/data/loadVersionData.fs.js +24 -0
  149. package/dist/data/loadVersionData.fs.js.map +1 -0
  150. package/dist/data/loadVersionData.js +67 -7
  151. package/dist/data/loadVersionData.js.map +1 -1
  152. package/dist/index.browser.d.ts +7 -0
  153. package/dist/index.browser.d.ts.map +1 -0
  154. package/dist/index.browser.js +7 -0
  155. package/dist/index.browser.js.map +1 -0
  156. package/dist/themes/index.d.ts +2 -2
  157. package/dist/themes/index.d.ts.map +1 -1
  158. package/dist/themes/index.js +2 -2
  159. package/dist/themes/index.js.map +1 -1
  160. package/dist/themes/presets/default.d.ts +3 -0
  161. package/dist/themes/presets/default.d.ts.map +1 -0
  162. package/dist/themes/presets/default.js +119 -0
  163. package/dist/themes/presets/default.js.map +1 -0
  164. package/dist/themes/styleThemeSchema.d.ts +6 -0
  165. package/dist/themes/styleThemeSchema.d.ts.map +1 -0
  166. package/dist/themes/styleThemeSchema.js +32 -0
  167. package/dist/themes/styleThemeSchema.js.map +1 -0
  168. package/dist/themes/themeRegistry.d.ts +3 -4
  169. package/dist/themes/themeRegistry.d.ts.map +1 -1
  170. package/dist/themes/themeRegistry.js +11 -11
  171. package/dist/themes/themeRegistry.js.map +1 -1
  172. package/dist/types/Content.d.ts +35 -18
  173. package/dist/types/Content.d.ts.map +1 -1
  174. package/dist/types/DataDiagnostic.d.ts +8 -0
  175. package/dist/types/DataDiagnostic.d.ts.map +1 -0
  176. package/dist/types/DataDiagnostic.js +2 -0
  177. package/dist/types/DataDiagnostic.js.map +1 -0
  178. package/dist/types/HtmlGeneratorSettings.d.ts +3 -11
  179. package/dist/types/HtmlGeneratorSettings.d.ts.map +1 -1
  180. package/dist/types/StyleTheme.d.ts +115 -131
  181. package/dist/types/StyleTheme.d.ts.map +1 -1
  182. package/dist/types/index.d.ts +2 -2
  183. package/dist/types/index.d.ts.map +1 -1
  184. package/dist/utilities/index.browser.d.ts +23 -0
  185. package/dist/utilities/index.browser.d.ts.map +1 -0
  186. package/dist/utilities/index.browser.js +29 -0
  187. package/dist/utilities/index.browser.js.map +1 -0
  188. package/dist/utilities/path/pathExists.browser.d.ts +2 -0
  189. package/dist/utilities/path/pathExists.browser.d.ts.map +1 -0
  190. package/dist/utilities/path/pathExists.browser.js +4 -0
  191. package/dist/utilities/path/pathExists.browser.js.map +1 -0
  192. package/dist/utilities/path/pathExists.js +1 -1
  193. package/dist/utilities/path/pathExists.js.map +1 -1
  194. package/dist/utilities/path/resolveAgainstProjectRoot.browser.d.ts +2 -0
  195. package/dist/utilities/path/resolveAgainstProjectRoot.browser.d.ts.map +1 -0
  196. package/dist/utilities/path/resolveAgainstProjectRoot.browser.js +4 -0
  197. package/dist/utilities/path/resolveAgainstProjectRoot.browser.js.map +1 -0
  198. package/dist/utilities/path/resolveAgainstProjectRoot.d.ts.map +1 -1
  199. package/dist/utilities/path/resolveAgainstProjectRoot.js.map +1 -1
  200. package/dist/utilities/path/resolveDataPath.browser.d.ts +2 -0
  201. package/dist/utilities/path/resolveDataPath.browser.d.ts.map +1 -0
  202. package/dist/utilities/path/resolveDataPath.browser.js +4 -0
  203. package/dist/utilities/path/resolveDataPath.browser.js.map +1 -0
  204. package/dist/utilities/path/resolveDataPath.d.ts.map +1 -1
  205. package/dist/utilities/path/resolveDataPath.js +1 -1
  206. package/dist/utilities/path/resolveDataPath.js.map +1 -1
  207. package/dist/utilities/string/normalizeSystemPath.d.ts.map +1 -1
  208. package/dist/utilities/string/normalizeSystemPath.js +9 -1
  209. package/dist/utilities/string/normalizeSystemPath.js.map +1 -1
  210. package/dist/utilities/string/withBasePath.d.ts.map +1 -1
  211. package/dist/utilities/string/withBasePath.js +66 -6
  212. package/dist/utilities/string/withBasePath.js.map +1 -1
  213. package/dist/utilities/system/logger.browser.d.ts +3 -0
  214. package/dist/utilities/system/logger.browser.d.ts.map +1 -0
  215. package/dist/utilities/system/logger.browser.js +36 -0
  216. package/dist/utilities/system/logger.browser.js.map +1 -0
  217. package/dist/utilities/system/logger.d.ts.map +1 -1
  218. package/dist/utilities/system/logger.js +26 -6
  219. package/dist/utilities/system/logger.js.map +1 -1
  220. package/package.json +313 -160
  221. package/dist/browser/serverOnly.d.ts +0 -15
  222. package/dist/browser/serverOnly.d.ts.map +0 -1
  223. package/dist/browser/serverOnly.js +0 -33
  224. package/dist/browser/serverOnly.js.map +0 -1
  225. package/dist/browser.d.ts +0 -38
  226. package/dist/browser.d.ts.map +0 -1
  227. package/dist/browser.js +0 -45
  228. package/dist/browser.js.map +0 -1
  229. package/dist/configs/sstDocsConfig.shared.d.ts +0 -8
  230. package/dist/configs/sstDocsConfig.shared.d.ts.map +0 -1
  231. package/dist/configs/sstDocsConfig.shared.js +0 -86
  232. package/dist/configs/sstDocsConfig.shared.js.map +0 -1
  233. package/dist/configs/stylesConfig.d.ts +0 -3
  234. package/dist/configs/stylesConfig.d.ts.map +0 -1
  235. package/dist/configs/stylesConfig.js +0 -8
  236. package/dist/configs/stylesConfig.js.map +0 -1
  237. package/dist/styles/themes.css +0 -1
  238. package/dist/styles/themes.css.map +0 -1
  239. package/dist/themes/baseThemeClasses.d.ts +0 -106
  240. package/dist/themes/baseThemeClasses.d.ts.map +0 -1
  241. package/dist/themes/baseThemeClasses.js +0 -106
  242. package/dist/themes/baseThemeClasses.js.map +0 -1
  243. package/dist/themes/darkTheme.d.ts +0 -3
  244. package/dist/themes/darkTheme.d.ts.map +0 -1
  245. package/dist/themes/darkTheme.js +0 -42
  246. package/dist/themes/darkTheme.js.map +0 -1
  247. package/dist/themes/lightTheme.d.ts +0 -3
  248. package/dist/themes/lightTheme.d.ts.map +0 -1
  249. package/dist/themes/lightTheme.js +0 -42
  250. package/dist/themes/lightTheme.js.map +0 -1
  251. package/dist/types/StylesConfig.d.ts +0 -8
  252. package/dist/types/StylesConfig.d.ts.map +0 -1
  253. package/dist/types/StylesConfig.js +0 -2
  254. package/dist/types/StylesConfig.js.map +0 -1
package/README.md CHANGED
@@ -2,18 +2,16 @@
2
2
  Core runtime for the Shadow Shard Tools documentation stack. It gathers the shared themes, configuration objects, navigation helpers, typed content models, and browser-friendly utilities relied on by the site and generator projects.
3
3
 
4
4
  ## Contents
5
- - `configs`: Tailwind-friendly theme wiring plus code-language metadata (`CODE_LANGUAGE_CONFIG`, `stylesConfig`).
5
+ - `configs`: Tailwind-friendly theme wiring plus code-language metadata (`CODE_LANGUAGE_CONFIG`).
6
6
  - `data`: File-system drivers for loading doc versions, category trees, and item payloads (`loadVersions`, `loadVersionData`, `buildTree`, etc.).
7
- - `themes`: Prebuilt light/dark `StyleTheme` definitions used by the Tailwind bridge.
7
+ - `themes`: Prebuilt `StyleTheme` presets (currently `default`) used by the Tailwind bridge.
8
8
  - `types`: Source-of-truth TypeScript contracts for doc content, theme structures, and provider interfaces.
9
9
  - `utilities`: DOM, validation, string, and file helpers that the site and exporters share (e.g. `slugify`, `withBasePath`, `isValidImageUrl`).
10
10
 
11
11
  ## Usage
12
12
  ```ts
13
13
  import {
14
- darkTheme,
15
- lightTheme,
16
- stylesConfig,
14
+ defaultTheme,
17
15
  loadVersions,
18
16
  loadVersionData,
19
17
  slugify,
@@ -25,6 +23,88 @@ import {
25
23
  import { CODE_LANGUAGE_CONFIG } from "@shadow-shard-tools/docs-core/configs/index.js";
26
24
  ```
27
25
  Everything ships as native ESM with TypeScript declarations in `dist/`. Install with `npm install @shadow-shard-tools/docs-core` (or link locally) and cherry-pick the helpers and contracts you need.
26
+ CommonJS consumers can `require` the same subpaths via the conditional exports (built into `dist/cjs`).
27
+
28
+ ## API map (common imports)
29
+ | Domain | Import from | Common exports |
30
+ | --- | --- | --- |
31
+ | Configs | `@shadow-shard-tools/docs-core/configs` | `loadSstDocsConfig`, `buildClientVisibleConfig`, `serializeClientConfigForBrowser`, `exposeClientConfig`, `readClientConfig`, `CODE_LANGUAGE_CONFIG` |
32
+ | Data | `@shadow-shard-tools/docs-core/data` | `loadVersions`, `loadVersionData`, `buildTree`, `FsDataProvider`, `HttpDataProvider` |
33
+ | Themes | `@shadow-shard-tools/docs-core/themes` | `defaultTheme`, `getThemePreset`, `AVAILABLE_THEME_PRESET_NAMES`, `StyleTheme` |
34
+ | Utilities | `@shadow-shard-tools/docs-core/utilities` | `slugify`, `withBasePath`, `normalizeSystemPath`, `isValidImageUrl`, `createLogger` |
35
+ | Types | `@shadow-shard-tools/docs-core/types` | `Content`, `Version`, `StyleTheme`, `SstDocsConfigFile`, `ResolvedSstDocsConfig`, `ClientVisibleSstDocsConfig` |
36
+
37
+ ## Quickstart recipes
38
+ ### Load config and expose client config
39
+ ```ts
40
+ import {
41
+ buildClientVisibleConfig,
42
+ exposeClientConfig,
43
+ loadSstDocsConfig,
44
+ readClientConfig,
45
+ serializeClientConfigForBrowser,
46
+ } from "@shadow-shard-tools/docs-core/configs";
47
+
48
+ const config = await loadSstDocsConfig();
49
+ const clientConfig = buildClientVisibleConfig(config);
50
+
51
+ // Server-side: embed into HTML (pretty for readability while debugging)
52
+ const clientScript = serializeClientConfigForBrowser(clientConfig, { pretty: true });
53
+ // -> <script>{clientScript}</script>
54
+
55
+ // Browser-side: attach and read from the global name (__SST_DOCS_CONFIG__ by default)
56
+ exposeClientConfig(clientConfig);
57
+ const cfg = readClientConfig();
58
+ ```
59
+
60
+ ### Load docs from FS/HTTP and build a tree
61
+ ```ts
62
+ import path from "node:path";
63
+ import {
64
+ FsDataProvider,
65
+ HttpDataProvider,
66
+ loadVersionData,
67
+ loadVersions,
68
+ } from "@shadow-shard-tools/docs-core/data";
69
+
70
+ // Local filesystem
71
+ const fsProvider = new FsDataProvider();
72
+ const dataRoot = path.resolve("./public/SST-Docs/data");
73
+ const versions = await loadVersions(fsProvider, dataRoot);
74
+ const versionRoot = `${dataRoot}/${versions[0]?.version ?? "current"}`;
75
+ const { tree, items, standaloneDocs } = await loadVersionData(fsProvider, versionRoot);
76
+
77
+ // Remote HTTP (e.g., CDN-hosted data)
78
+ const httpProvider = new HttpDataProvider();
79
+ const remoteRoot = "https://cdn.example.com/SST-Docs/data";
80
+ const remoteVersions = await loadVersions(httpProvider, remoteRoot);
81
+ const remoteVersionRoot = `${remoteRoot}/${remoteVersions[0]?.version ?? "current"}`;
82
+ const { tree: remoteTree } = await loadVersionData(httpProvider, remoteVersionRoot);
83
+ ```
84
+
85
+ ### Config example
86
+ Create `sst-docs.config.json` in your project root:
87
+ ```json
88
+ {
89
+ "FS_DATA_PATH": "./public/SST-Docs/data",
90
+ "HEADER_BRANDING": {
91
+ "logoText": "SST Docs"
92
+ },
93
+ "HTML_GENERATOR_SETTINGS": {
94
+ "OUTPUT_DIRECTORY": "./dist/html",
95
+ "THEME": "default",
96
+ "SEPARATE_BUILD_FOR_HTML_GENERATOR": false
97
+ }
98
+ }
99
+ ```
100
+ Load and expose a browser-friendly subset:
101
+ ```ts
102
+ import { loadSstDocsConfig, buildClientVisibleConfig, serializeClientConfigForBrowser } from "@shadow-shard-tools/docs-core/configs";
103
+
104
+ const config = await loadSstDocsConfig();
105
+ const clientConfig = buildClientVisibleConfig(config);
106
+ const script = serializeClientConfigForBrowser(clientConfig); // inject into HTML to populate window.__SST_DOCS_CONFIG__
107
+ ```
28
108
 
29
109
  ## Development
30
110
  ```bash
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_CLIENT_CONFIG_GLOBAL = void 0;
4
+ exports.buildClientVisibleConfig = buildClientVisibleConfig;
5
+ exports.serializeClientConfigForBrowser = serializeClientConfigForBrowser;
6
+ exports.exposeClientConfig = exposeClientConfig;
7
+ exports.readClientConfig = readClientConfig;
8
+ const zod_1 = require("zod");
9
+ const styleThemeSchema_js_1 = require("../themes/styleThemeSchema.js");
10
+ exports.DEFAULT_CLIENT_CONFIG_GLOBAL = "__SST_DOCS_CONFIG__";
11
+ const headerBrandingSchema = zod_1.z
12
+ .object({
13
+ logoSrc: zod_1.z.string().optional(),
14
+ logoAlt: zod_1.z.string().optional(),
15
+ logoText: zod_1.z.string().optional(),
16
+ })
17
+ .strict()
18
+ .optional()
19
+ .default({});
20
+ const clientConfigSchema = zod_1.z
21
+ .object({
22
+ PUBLIC_DATA_PATH: zod_1.z.string(),
23
+ HEADER_BRANDING: headerBrandingSchema,
24
+ HTML_GENERATOR_THEME: styleThemeSchema_js_1.styleThemeSchema.optional(),
25
+ })
26
+ .strict();
27
+ function buildClientVisibleConfig(config) {
28
+ return {
29
+ PUBLIC_DATA_PATH: config.PUBLIC_DATA_PATH,
30
+ HEADER_BRANDING: config.HEADER_BRANDING,
31
+ HTML_GENERATOR_THEME: config.HTML_GENERATOR_SETTINGS?.THEME,
32
+ };
33
+ }
34
+ function serializeClientConfigForBrowser(source, options) {
35
+ const payload = normalizeAndValidateClientConfigSource(source);
36
+ const globalName = options?.globalName ?? exports.DEFAULT_CLIENT_CONFIG_GLOBAL;
37
+ const spacing = options?.pretty ? 2 : undefined;
38
+ return `window.${globalName} = ${JSON.stringify(payload, null, spacing)};`;
39
+ }
40
+ function exposeClientConfig(source, options) {
41
+ const payload = normalizeAndValidateClientConfigSource(source);
42
+ const target = options?.target ??
43
+ globalThis;
44
+ if (!target) {
45
+ throw new Error("Unable to expose client config: no target global object was provided.");
46
+ }
47
+ const globalName = options?.globalName ?? exports.DEFAULT_CLIENT_CONFIG_GLOBAL;
48
+ target[globalName] = payload;
49
+ return payload;
50
+ }
51
+ function readClientConfig(globalName = exports.DEFAULT_CLIENT_CONFIG_GLOBAL) {
52
+ const globalObject = globalThis;
53
+ if (!globalObject) {
54
+ throw new Error("globalThis is not available in the current environment.");
55
+ }
56
+ const value = globalObject[globalName];
57
+ return assertClientConfig(value, globalName);
58
+ }
59
+ function normalizeAndValidateClientConfigSource(source) {
60
+ const normalized = isClientConfigShape(source)
61
+ ? source
62
+ : buildClientVisibleConfig(source);
63
+ return assertClientConfig(normalized);
64
+ }
65
+ function assertClientConfig(value, globalName = exports.DEFAULT_CLIENT_CONFIG_GLOBAL) {
66
+ const parsed = clientConfigSchema.safeParse(value);
67
+ if (parsed.success)
68
+ return parsed.data;
69
+ const message = parsed.error.issues
70
+ .map((issue) => `${issue.path.join(".") || "config"}: ${issue.message}`)
71
+ .join("; ");
72
+ throw new Error(`Client config "${globalName}" is missing or malformed on globalThis. ${message}`);
73
+ }
74
+ function isClientConfigShape(value) {
75
+ if (!value || typeof value !== "object")
76
+ return false;
77
+ return clientConfigSchema.safeParse(value).success;
78
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CODE_LANGUAGE_CONFIG = void 0;
4
+ exports.CODE_LANGUAGE_CONFIG = {
5
+ javascript: { name: "JavaScript", ext: "js" },
6
+ typescript: { name: "TypeScript", ext: "ts" },
7
+ python: { name: "Python", ext: "py" },
8
+ java: { name: "Java", ext: "java" },
9
+ csharp: { name: "C#", ext: "cs" },
10
+ cpp: { name: "C++", ext: "cpp" },
11
+ c: { name: "C", ext: "c" },
12
+ php: { name: "PHP", ext: "php" },
13
+ ruby: { name: "Ruby", ext: "rb" },
14
+ go: { name: "Go", ext: "go" },
15
+ rust: { name: "Rust", ext: "rs" },
16
+ swift: { name: "Swift", ext: "swift" },
17
+ kotlin: { name: "Kotlin", ext: "kt" },
18
+ scala: { name: "Scala", ext: "scala" },
19
+ html: { name: "HTML", ext: "html" },
20
+ css: { name: "CSS", ext: "css" },
21
+ scss: { name: "SCSS", ext: "scss" },
22
+ sass: { name: "Sass", ext: "sass" },
23
+ less: { name: "Less", ext: "less" },
24
+ json: { name: "JSON", ext: "json" },
25
+ xml: { name: "XML", ext: "xml" },
26
+ yaml: { name: "YAML", ext: "yml" },
27
+ toml: { name: "TOML", ext: "toml" },
28
+ sql: { name: "SQL", ext: "sql" },
29
+ bash: { name: "Bash", ext: "sh" },
30
+ powershell: { name: "PowerShell", ext: "ps1" },
31
+ dockerfile: { name: "Dockerfile", ext: "dockerfile" },
32
+ markdown: { name: "Markdown", ext: "md" },
33
+ latex: { name: "LaTeX", ext: "tex" },
34
+ plaintext: { name: "Plain Text", ext: "txt" },
35
+ text: { name: "Text", ext: "txt" },
36
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeClientConfigForBrowser = exports.readClientConfig = exports.exposeClientConfig = exports.DEFAULT_CLIENT_CONFIG_GLOBAL = exports.buildClientVisibleConfig = exports.SST_DOCS_CONFIG_FILENAME = exports.SstDocsConfigError = exports.resolvePublicDataPath = exports.derivePublicDataPath = exports.CODE_LANGUAGE_CONFIG = void 0;
4
+ var codeLanguagesConfig_js_1 = require("./codeLanguagesConfig.js");
5
+ Object.defineProperty(exports, "CODE_LANGUAGE_CONFIG", { enumerable: true, get: function () { return codeLanguagesConfig_js_1.CODE_LANGUAGE_CONFIG; } });
6
+ var sstDocsConfigShared_js_1 = require("./sstDocsConfigShared.js");
7
+ Object.defineProperty(exports, "derivePublicDataPath", { enumerable: true, get: function () { return sstDocsConfigShared_js_1.derivePublicDataPath; } });
8
+ Object.defineProperty(exports, "resolvePublicDataPath", { enumerable: true, get: function () { return sstDocsConfigShared_js_1.resolvePublicDataPath; } });
9
+ Object.defineProperty(exports, "SstDocsConfigError", { enumerable: true, get: function () { return sstDocsConfigShared_js_1.SstDocsConfigError; } });
10
+ Object.defineProperty(exports, "SST_DOCS_CONFIG_FILENAME", { enumerable: true, get: function () { return sstDocsConfigShared_js_1.SST_DOCS_CONFIG_FILENAME; } });
11
+ var clientConfig_js_1 = require("./clientConfig.js");
12
+ Object.defineProperty(exports, "buildClientVisibleConfig", { enumerable: true, get: function () { return clientConfig_js_1.buildClientVisibleConfig; } });
13
+ Object.defineProperty(exports, "DEFAULT_CLIENT_CONFIG_GLOBAL", { enumerable: true, get: function () { return clientConfig_js_1.DEFAULT_CLIENT_CONFIG_GLOBAL; } });
14
+ Object.defineProperty(exports, "exposeClientConfig", { enumerable: true, get: function () { return clientConfig_js_1.exposeClientConfig; } });
15
+ Object.defineProperty(exports, "readClientConfig", { enumerable: true, get: function () { return clientConfig_js_1.readClientConfig; } });
16
+ Object.defineProperty(exports, "serializeClientConfigForBrowser", { enumerable: true, get: function () { return clientConfig_js_1.serializeClientConfigForBrowser; } });
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeClientConfigForBrowser = exports.readClientConfig = exports.exposeClientConfig = exports.DEFAULT_CLIENT_CONFIG_GLOBAL = exports.buildClientVisibleConfig = exports.SST_DOCS_CONFIG_FILENAME = exports.SstDocsConfigError = exports.resolvePublicDataPath = exports.derivePublicDataPath = exports.loadSstDocsConfigFromSync = exports.loadSstDocsConfigSync = exports.loadSstDocsConfigFrom = exports.loadSstDocsConfig = exports.CODE_LANGUAGE_CONFIG = void 0;
4
+ var codeLanguagesConfig_js_1 = require("./codeLanguagesConfig.js");
5
+ Object.defineProperty(exports, "CODE_LANGUAGE_CONFIG", { enumerable: true, get: function () { return codeLanguagesConfig_js_1.CODE_LANGUAGE_CONFIG; } });
6
+ var sstDocsConfig_js_1 = require("./sstDocsConfig.js");
7
+ Object.defineProperty(exports, "loadSstDocsConfig", { enumerable: true, get: function () { return sstDocsConfig_js_1.loadSstDocsConfig; } });
8
+ Object.defineProperty(exports, "loadSstDocsConfigFrom", { enumerable: true, get: function () { return sstDocsConfig_js_1.loadSstDocsConfigFrom; } });
9
+ Object.defineProperty(exports, "loadSstDocsConfigSync", { enumerable: true, get: function () { return sstDocsConfig_js_1.loadSstDocsConfigSync; } });
10
+ Object.defineProperty(exports, "loadSstDocsConfigFromSync", { enumerable: true, get: function () { return sstDocsConfig_js_1.loadSstDocsConfigFromSync; } });
11
+ Object.defineProperty(exports, "derivePublicDataPath", { enumerable: true, get: function () { return sstDocsConfig_js_1.derivePublicDataPath; } });
12
+ Object.defineProperty(exports, "resolvePublicDataPath", { enumerable: true, get: function () { return sstDocsConfig_js_1.resolvePublicDataPath; } });
13
+ Object.defineProperty(exports, "SstDocsConfigError", { enumerable: true, get: function () { return sstDocsConfig_js_1.SstDocsConfigError; } });
14
+ Object.defineProperty(exports, "SST_DOCS_CONFIG_FILENAME", { enumerable: true, get: function () { return sstDocsConfig_js_1.SST_DOCS_CONFIG_FILENAME; } });
15
+ var clientConfig_js_1 = require("./clientConfig.js");
16
+ Object.defineProperty(exports, "buildClientVisibleConfig", { enumerable: true, get: function () { return clientConfig_js_1.buildClientVisibleConfig; } });
17
+ Object.defineProperty(exports, "DEFAULT_CLIENT_CONFIG_GLOBAL", { enumerable: true, get: function () { return clientConfig_js_1.DEFAULT_CLIENT_CONFIG_GLOBAL; } });
18
+ Object.defineProperty(exports, "exposeClientConfig", { enumerable: true, get: function () { return clientConfig_js_1.exposeClientConfig; } });
19
+ Object.defineProperty(exports, "readClientConfig", { enumerable: true, get: function () { return clientConfig_js_1.readClientConfig; } });
20
+ Object.defineProperty(exports, "serializeClientConfigForBrowser", { enumerable: true, get: function () { return clientConfig_js_1.serializeClientConfigForBrowser; } });
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SstDocsConfigError = exports.SST_DOCS_CONFIG_FILENAME = exports.resolvePublicDataPath = exports.derivePublicDataPath = void 0;
4
+ exports.loadSstDocsConfig = loadSstDocsConfig;
5
+ exports.loadSstDocsConfigSync = loadSstDocsConfigSync;
6
+ exports.loadSstDocsConfigFrom = loadSstDocsConfigFrom;
7
+ exports.loadSstDocsConfigFromSync = loadSstDocsConfigFromSync;
8
+ const sstDocsConfigShared_js_1 = require("./sstDocsConfigShared.js");
9
+ Object.defineProperty(exports, "derivePublicDataPath", { enumerable: true, get: function () { return sstDocsConfigShared_js_1.derivePublicDataPath; } });
10
+ Object.defineProperty(exports, "resolvePublicDataPath", { enumerable: true, get: function () { return sstDocsConfigShared_js_1.resolvePublicDataPath; } });
11
+ Object.defineProperty(exports, "SST_DOCS_CONFIG_FILENAME", { enumerable: true, get: function () { return sstDocsConfigShared_js_1.SST_DOCS_CONFIG_FILENAME; } });
12
+ Object.defineProperty(exports, "SstDocsConfigError", { enumerable: true, get: function () { return sstDocsConfigShared_js_1.SstDocsConfigError; } });
13
+ function unsupported(method) {
14
+ throw new sstDocsConfigShared_js_1.SstDocsConfigError(`${method} is only available in a Node.js environment where the file system can be read.`);
15
+ }
16
+ async function loadSstDocsConfig(_configPath) {
17
+ return unsupported("loadSstDocsConfig");
18
+ }
19
+ function loadSstDocsConfigSync(_configPath) {
20
+ return unsupported("loadSstDocsConfigSync");
21
+ }
22
+ async function loadSstDocsConfigFrom(_configDir) {
23
+ return unsupported("loadSstDocsConfigFrom");
24
+ }
25
+ function loadSstDocsConfigFromSync(_configDir) {
26
+ return unsupported("loadSstDocsConfigFromSync");
27
+ }
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SstDocsConfigError = exports.SST_DOCS_CONFIG_FILENAME = exports.resolvePublicDataPath = exports.derivePublicDataPath = void 0;
7
+ exports.loadSstDocsConfig = loadSstDocsConfig;
8
+ exports.loadSstDocsConfigSync = loadSstDocsConfigSync;
9
+ exports.loadSstDocsConfigFrom = loadSstDocsConfigFrom;
10
+ exports.loadSstDocsConfigFromSync = loadSstDocsConfigFromSync;
11
+ const node_fs_1 = require("node:fs");
12
+ const promises_1 = require("node:fs/promises");
13
+ const node_path_1 = require("node:path");
14
+ const app_root_path_1 = __importDefault(require("app-root-path"));
15
+ const sstDocsConfigShared_js_1 = require("./sstDocsConfigShared.js");
16
+ Object.defineProperty(exports, "derivePublicDataPath", { enumerable: true, get: function () { return sstDocsConfigShared_js_1.derivePublicDataPath; } });
17
+ Object.defineProperty(exports, "resolvePublicDataPath", { enumerable: true, get: function () { return sstDocsConfigShared_js_1.resolvePublicDataPath; } });
18
+ Object.defineProperty(exports, "SST_DOCS_CONFIG_FILENAME", { enumerable: true, get: function () { return sstDocsConfigShared_js_1.SST_DOCS_CONFIG_FILENAME; } });
19
+ Object.defineProperty(exports, "SstDocsConfigError", { enumerable: true, get: function () { return sstDocsConfigShared_js_1.SstDocsConfigError; } });
20
+ const APP_ROOT = app_root_path_1.default.path;
21
+ async function loadSstDocsConfig(configPath) {
22
+ const { path: finalPath, contents } = await readConfigFile(configPath);
23
+ return (0, sstDocsConfigShared_js_1.parseConfigContents)(contents, finalPath);
24
+ }
25
+ function loadSstDocsConfigSync(configPath) {
26
+ const { path: finalPath, contents } = readConfigFileSync(configPath);
27
+ return (0, sstDocsConfigShared_js_1.parseConfigContents)(contents, finalPath);
28
+ }
29
+ async function loadSstDocsConfigFrom(configDir) {
30
+ const fullPath = (0, node_path_1.resolve)(configDir, sstDocsConfigShared_js_1.SST_DOCS_CONFIG_FILENAME);
31
+ return loadSstDocsConfig(fullPath);
32
+ }
33
+ function loadSstDocsConfigFromSync(configDir) {
34
+ const fullPath = (0, node_path_1.resolve)(configDir, sstDocsConfigShared_js_1.SST_DOCS_CONFIG_FILENAME);
35
+ return loadSstDocsConfigSync(fullPath);
36
+ }
37
+ async function readConfigFile(configPath) {
38
+ const searchPaths = getConfigSearchPaths(configPath);
39
+ const attempted = [];
40
+ for (const candidate of searchPaths) {
41
+ attempted.push(candidate);
42
+ try {
43
+ const contents = await (0, promises_1.readFile)(candidate, "utf-8");
44
+ return { path: candidate, contents };
45
+ }
46
+ catch (error) {
47
+ const err = error;
48
+ if (err.code === "ENOENT" || err.code === "EISDIR") {
49
+ continue;
50
+ }
51
+ throw new sstDocsConfigShared_js_1.SstDocsConfigError(`Failed to read ${sstDocsConfigShared_js_1.SST_DOCS_CONFIG_FILENAME} at ${candidate}: ${err.message}`);
52
+ }
53
+ }
54
+ throw new sstDocsConfigShared_js_1.SstDocsConfigError(`Unable to locate ${sstDocsConfigShared_js_1.SST_DOCS_CONFIG_FILENAME}. Tried: ${attempted.join(", ")}`);
55
+ }
56
+ function readConfigFileSync(configPath) {
57
+ const searchPaths = getConfigSearchPaths(configPath);
58
+ const attempted = [];
59
+ for (const candidate of searchPaths) {
60
+ attempted.push(candidate);
61
+ try {
62
+ const contents = (0, node_fs_1.readFileSync)(candidate, "utf-8");
63
+ return { path: candidate, contents };
64
+ }
65
+ catch (error) {
66
+ const err = error;
67
+ if (err.code === "ENOENT" || err.code === "EISDIR") {
68
+ continue;
69
+ }
70
+ throw new sstDocsConfigShared_js_1.SstDocsConfigError(`Failed to read ${sstDocsConfigShared_js_1.SST_DOCS_CONFIG_FILENAME} at ${candidate}: ${err.message}`);
71
+ }
72
+ }
73
+ throw new sstDocsConfigShared_js_1.SstDocsConfigError(`Unable to locate ${sstDocsConfigShared_js_1.SST_DOCS_CONFIG_FILENAME}. Tried: ${attempted.join(", ")}`);
74
+ }
75
+ function getConfigSearchPaths(configPath) {
76
+ const searchPaths = [];
77
+ if (configPath) {
78
+ const explicit = (0, node_path_1.resolve)(APP_ROOT, configPath);
79
+ searchPaths.push(explicit);
80
+ if (!explicit.endsWith(".json")) {
81
+ searchPaths.push((0, node_path_1.resolve)(explicit, sstDocsConfigShared_js_1.SST_DOCS_CONFIG_FILENAME));
82
+ }
83
+ }
84
+ else {
85
+ searchPaths.push((0, node_path_1.resolve)(APP_ROOT, sstDocsConfigShared_js_1.SST_DOCS_CONFIG_FILENAME));
86
+ }
87
+ return searchPaths;
88
+ }
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SST_DOCS_CONFIG_REFERENCE = exports.SstDocsConfigError = exports.SST_DOCS_CONFIG_FILENAME = void 0;
4
+ exports.parseConfigContents = parseConfigContents;
5
+ exports.derivePublicDataPath = derivePublicDataPath;
6
+ exports.resolvePublicDataPath = resolvePublicDataPath;
7
+ const themeRegistry_js_1 = require("../themes/themeRegistry.js");
8
+ const normalizeSystemPath_js_1 = require("../utilities/string/normalizeSystemPath.js");
9
+ const zod_1 = require("zod");
10
+ exports.SST_DOCS_CONFIG_FILENAME = "sst-docs.config.json";
11
+ const DEFAULT_FS_DATA_PATH = "./public/SST-Docs/data";
12
+ const DEFAULT_OUTPUT_DIRECTORY = "./dist/html";
13
+ class SstDocsConfigError extends Error {
14
+ constructor(message) {
15
+ super(message);
16
+ this.name = "SstDocsConfigError";
17
+ }
18
+ }
19
+ exports.SstDocsConfigError = SstDocsConfigError;
20
+ exports.SST_DOCS_CONFIG_REFERENCE = [
21
+ {
22
+ key: "FS_DATA_PATH",
23
+ type: "string",
24
+ required: true,
25
+ default: DEFAULT_FS_DATA_PATH,
26
+ description: "Absolute or project-relative path to the docs data root (contains versions.json).",
27
+ },
28
+ {
29
+ key: "HEADER_BRANDING.logoSrc",
30
+ type: "string",
31
+ required: false,
32
+ description: "Optional logo image path/URL shown in the header.",
33
+ },
34
+ {
35
+ key: "HEADER_BRANDING.logoAlt",
36
+ type: "string",
37
+ required: false,
38
+ description: "Optional alt text for the logo image.",
39
+ },
40
+ {
41
+ key: "HEADER_BRANDING.logoText",
42
+ type: "string",
43
+ required: false,
44
+ description: "Optional text fallback when no logo image is provided.",
45
+ },
46
+ {
47
+ key: "HTML_GENERATOR_SETTINGS.OUTPUT_DIRECTORY",
48
+ type: "string",
49
+ required: true,
50
+ default: DEFAULT_OUTPUT_DIRECTORY,
51
+ description: "Where the HTML generator writes the output bundle.",
52
+ },
53
+ {
54
+ key: "HTML_GENERATOR_SETTINGS.THEME",
55
+ type: "string",
56
+ required: true,
57
+ default: themeRegistry_js_1.DEFAULT_THEME_PRESET,
58
+ description: `Theme preset name. Options: ${themeRegistry_js_1.AVAILABLE_THEME_PRESET_NAMES.join(", ")}.`,
59
+ },
60
+ {
61
+ key: "HTML_GENERATOR_SETTINGS.SEPARATE_BUILD_FOR_HTML_GENERATOR",
62
+ type: "boolean",
63
+ required: false,
64
+ default: "false",
65
+ description: "Whether to run a separate build for the HTML generator.",
66
+ },
67
+ ];
68
+ const optionalTrimmedString = zod_1.z
69
+ .string()
70
+ .trim()
71
+ .transform((value) => (value.length > 0 ? value : undefined))
72
+ .optional();
73
+ const HeaderBrandingSchema = zod_1.z
74
+ .object({
75
+ logoSrc: optionalTrimmedString,
76
+ logoAlt: optionalTrimmedString,
77
+ logoText: optionalTrimmedString,
78
+ })
79
+ .strict()
80
+ .transform((value) => value);
81
+ const HtmlGeneratorSettingsSchema = zod_1.z
82
+ .object({
83
+ OUTPUT_DIRECTORY: zod_1.z
84
+ .string()
85
+ .trim()
86
+ .min(1, {
87
+ message: `Set HTML_GENERATOR_SETTINGS.OUTPUT_DIRECTORY (default: "${DEFAULT_OUTPUT_DIRECTORY}")`,
88
+ })
89
+ .transform((val) => (0, normalizeSystemPath_js_1.normalizeSystemPath)(val)),
90
+ THEME: zod_1.z
91
+ .string()
92
+ .trim()
93
+ .min(1, {
94
+ message: `Set HTML_GENERATOR_SETTINGS.THEME (default: "${themeRegistry_js_1.DEFAULT_THEME_PRESET}")`,
95
+ })
96
+ .transform((value, ctx) => {
97
+ const normalized = value.toLowerCase();
98
+ if (!(0, themeRegistry_js_1.isThemePresetName)(normalized)) {
99
+ const options = themeRegistry_js_1.AVAILABLE_THEME_PRESET_NAMES.join(", ");
100
+ ctx.addIssue({
101
+ code: zod_1.z.ZodIssueCode.custom,
102
+ message: `HTML_GENERATOR_SETTINGS.THEME must be one of: ${options} (default: "${themeRegistry_js_1.DEFAULT_THEME_PRESET}")`,
103
+ });
104
+ return zod_1.z.NEVER;
105
+ }
106
+ return cloneTheme((0, themeRegistry_js_1.getThemePreset)(normalized));
107
+ }),
108
+ SEPARATE_BUILD_FOR_HTML_GENERATOR: zod_1.z.boolean().default(false),
109
+ })
110
+ .strict()
111
+ .transform((value) => value);
112
+ const ConfigSchema = zod_1.z
113
+ .object({
114
+ FS_DATA_PATH: zod_1.z
115
+ .string()
116
+ .trim()
117
+ .min(1, {
118
+ message: `Provide FS_DATA_PATH (default: "${DEFAULT_FS_DATA_PATH}")`,
119
+ })
120
+ .transform((val) => (0, normalizeSystemPath_js_1.normalizeSystemPath)(val)),
121
+ HEADER_BRANDING: HeaderBrandingSchema.optional().transform((value) => value ?? {}),
122
+ HTML_GENERATOR_SETTINGS: HtmlGeneratorSettingsSchema.optional(),
123
+ })
124
+ .strict();
125
+ function parseConfigContents(contents, sourcePath) {
126
+ let parsed;
127
+ try {
128
+ parsed = JSON.parse(contents);
129
+ }
130
+ catch (error) {
131
+ throw new SstDocsConfigError(`Failed to parse ${exports.SST_DOCS_CONFIG_FILENAME}: ${error.message}`);
132
+ }
133
+ const result = ConfigSchema.safeParse(parsed);
134
+ if (!result.success) {
135
+ throw new SstDocsConfigError(formatConfigValidationError(sourcePath, result.error));
136
+ }
137
+ const resolved = result.data;
138
+ return {
139
+ FS_DATA_PATH: resolved.FS_DATA_PATH,
140
+ PUBLIC_DATA_PATH: derivePublicDataPath(resolved.FS_DATA_PATH),
141
+ HEADER_BRANDING: resolved.HEADER_BRANDING,
142
+ HTML_GENERATOR_SETTINGS: resolved.HTML_GENERATOR_SETTINGS,
143
+ };
144
+ }
145
+ function derivePublicDataPath(fsDataPath) {
146
+ const normalizedFsPath = (0, normalizeSystemPath_js_1.normalizeSystemPath)(fsDataPath.trim());
147
+ const posixPath = normalizePosixPath(normalizedFsPath || "/");
148
+ const segments = posixPath.split("/").filter(Boolean);
149
+ const publicIndex = segments.indexOf("public");
150
+ const publicSegments = publicIndex >= 0 ? segments.slice(publicIndex + 1) : segments;
151
+ if (publicSegments.length === 0) {
152
+ return "/";
153
+ }
154
+ const joined = `/${publicSegments.join("/")}`;
155
+ return joined.endsWith("/") ? joined : `${joined}/`;
156
+ }
157
+ function resolvePublicDataPath(baseUrl, config) {
158
+ const publicPath = typeof config === "string" ? config : config.PUBLIC_DATA_PATH;
159
+ const normalizedPublicPath = normalizePublicPath(publicPath);
160
+ if (!baseUrl || baseUrl.trim().length === 0) {
161
+ return normalizedPublicPath;
162
+ }
163
+ if (isAbsoluteUrl(baseUrl)) {
164
+ const url = new URL(baseUrl);
165
+ url.pathname = joinUrlPaths(url.pathname || "/", normalizedPublicPath);
166
+ return url.toString();
167
+ }
168
+ const parsedBase = new URL(baseUrl, "http://local.placeholder");
169
+ const joinedPath = joinUrlPaths(parsedBase.pathname || "/", normalizedPublicPath);
170
+ return `${joinedPath}${parsedBase.search}${parsedBase.hash}`;
171
+ }
172
+ function normalizePublicPath(value) {
173
+ const normalized = (0, normalizeSystemPath_js_1.normalizeSystemPath)(value.trim());
174
+ const posixPath = normalizePosixPath(normalized || "/");
175
+ const withLeading = posixPath.startsWith("/") ? posixPath : `/${posixPath}`;
176
+ return withLeading.endsWith("/") ? withLeading : `${withLeading}/`;
177
+ }
178
+ function joinUrlPaths(base, child) {
179
+ const normalizedBase = normalizePublicPath(base);
180
+ const normalizedChild = normalizePublicPath(child).replace(/^\/+/, "");
181
+ const joined = normalizePosixPath(`${normalizedBase}${normalizedChild ? `/${normalizedChild}` : ""}`);
182
+ return joined.endsWith("/") ? joined : `${joined}/`;
183
+ }
184
+ function isAbsoluteUrl(value) {
185
+ try {
186
+ new URL(value);
187
+ return true;
188
+ }
189
+ catch {
190
+ return false;
191
+ }
192
+ }
193
+ function cloneTheme(theme) {
194
+ return JSON.parse(JSON.stringify(theme));
195
+ }
196
+ function formatConfigValidationError(sourcePath, error) {
197
+ const lines = error.issues.map((issue) => {
198
+ const path = issue.path.join(".") || "config";
199
+ const defaultValue = defaultValueFor(path);
200
+ const hint = defaultValue ? ` (default: ${defaultValue})` : "";
201
+ return `${path}: ${issue.message}${hint}`;
202
+ });
203
+ return `Invalid configuration in ${sourcePath}:\n- ${lines.join("\n- ")}`;
204
+ }
205
+ function defaultValueFor(path) {
206
+ return exports.SST_DOCS_CONFIG_REFERENCE.find((entry) => entry.key === path)?.default;
207
+ }
208
+ function normalizePosixPath(value) {
209
+ const sanitized = value.replace(/\\/g, "/");
210
+ const hasLeadingSlash = sanitized.startsWith("/");
211
+ const parts = sanitized.split("/");
212
+ const stack = [];
213
+ for (const part of parts) {
214
+ if (!part || part === ".")
215
+ continue;
216
+ if (part === "..") {
217
+ if (stack.length > 0 && stack[stack.length - 1] !== "..") {
218
+ stack.pop();
219
+ }
220
+ else if (!hasLeadingSlash) {
221
+ stack.push("..");
222
+ }
223
+ continue;
224
+ }
225
+ stack.push(part);
226
+ }
227
+ const normalized = stack.join("/");
228
+ if (hasLeadingSlash) {
229
+ return `/${normalized}`;
230
+ }
231
+ return normalized || ".";
232
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ALIGNMENT_CLASSES = void 0;
4
+ exports.ALIGNMENT_CLASSES = {
5
+ left: {
6
+ text: "text-left",
7
+ container: "mr-auto",
8
+ },
9
+ center: {
10
+ text: "text-center",
11
+ container: "mx-auto",
12
+ },
13
+ right: {
14
+ text: "text-right",
15
+ container: "ml-auto",
16
+ },
17
+ };
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SPACING_CLASSES = exports.ALIGNMENT_CLASSES = void 0;
4
+ var alignmentClasses_js_1 = require("./alignmentClasses.js");
5
+ Object.defineProperty(exports, "ALIGNMENT_CLASSES", { enumerable: true, get: function () { return alignmentClasses_js_1.ALIGNMENT_CLASSES; } });
6
+ var spacingClasses_js_1 = require("./spacingClasses.js");
7
+ Object.defineProperty(exports, "SPACING_CLASSES", { enumerable: true, get: function () { return spacingClasses_js_1.SPACING_CLASSES; } });
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SPACING_CLASSES = void 0;
4
+ exports.SPACING_CLASSES = {
5
+ none: "",
6
+ small: "mb-4",
7
+ medium: "mb-6",
8
+ large: "mb-8",
9
+ };