@mnaoumov/typescript-dev-toolkit 1.3.0 → 2.0.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 (174) hide show
  1. package/assets/docs-site/components/ConstructorBlock.astro +16 -0
  2. package/assets/docs-site/components/ImportStatement.astro +12 -0
  3. package/assets/docs-site/components/MemberDetail.astro +101 -0
  4. package/assets/docs-site/components/MethodTable.astro +45 -0
  5. package/assets/docs-site/components/PropertyTable.astro +45 -0
  6. package/assets/docs-site/components/SiteTitle.astro +43 -0
  7. package/assets/docs-site/components/TypeSignature.astro +20 -0
  8. package/assets/docs-site/fonts/inter-latin-400-normal.ttf +0 -0
  9. package/assets/docs-site/fonts/inter-latin-700-normal.ttf +0 -0
  10. package/assets/docs-site/styles/global.css +221 -0
  11. package/dist/lib/cjs/build.cjs +1 -1
  12. package/dist/lib/cjs/build.d.cts +1 -1
  13. package/dist/lib/cjs/commitlint-forbidden-patterns.cjs +2 -2
  14. package/dist/lib/cjs/commitlint-forbidden-patterns.d.cts +1 -1
  15. package/dist/lib/cjs/commitlint-spellcheck-header.cjs +2 -2
  16. package/dist/lib/cjs/commitlint-spellcheck-header.d.cts +1 -1
  17. package/dist/lib/cjs/docs-site/api-doc-constants.cjs +171 -0
  18. package/dist/lib/cjs/docs-site/api-doc-constants.d.cts +18 -0
  19. package/dist/lib/cjs/docs-site/api-doc-jsdoc.cjs +414 -0
  20. package/dist/lib/cjs/docs-site/api-doc-jsdoc.d.cts +149 -0
  21. package/dist/lib/cjs/docs-site/api-doc-link-rendering.cjs +377 -0
  22. package/dist/lib/cjs/docs-site/api-doc-link-rendering.d.cts +185 -0
  23. package/dist/lib/cjs/docs-site/api-doc-package-sites.cjs +118 -0
  24. package/dist/lib/cjs/docs-site/api-doc-package-sites.d.cts +36 -0
  25. package/dist/lib/cjs/docs-site/api-doc-page-generation.cjs +561 -0
  26. package/dist/lib/cjs/docs-site/api-doc-page-generation.d.cts +159 -0
  27. package/dist/lib/cjs/docs-site/api-doc-route-segments.cjs +42 -0
  28. package/dist/lib/cjs/docs-site/api-doc-route-segments.d.cts +25 -0
  29. package/dist/lib/cjs/docs-site/api-doc-settings.cjs +47 -0
  30. package/dist/lib/cjs/docs-site/api-doc-settings.d.cts +53 -0
  31. package/dist/lib/cjs/docs-site/api-doc-source-processing.cjs +288 -0
  32. package/dist/lib/cjs/docs-site/api-doc-source-processing.d.cts +75 -0
  33. package/dist/lib/cjs/docs-site/api-doc-text-utils.cjs +281 -0
  34. package/dist/lib/cjs/docs-site/api-doc-text-utils.d.cts +178 -0
  35. package/dist/lib/cjs/docs-site/api-doc-type-merging.cjs +157 -0
  36. package/dist/lib/cjs/docs-site/api-doc-type-merging.d.cts +51 -0
  37. package/dist/lib/cjs/docs-site/api-doc-types.cjs +22 -0
  38. package/dist/lib/cjs/docs-site/api-doc-types.d.cts +157 -0
  39. package/dist/lib/cjs/docs-site/api-docs.cjs +143 -0
  40. package/dist/lib/cjs/docs-site/api-docs.d.cts +34 -0
  41. package/dist/lib/cjs/docs-site/astro-config.cjs +169 -0
  42. package/dist/lib/cjs/docs-site/astro-config.d.cts +23 -0
  43. package/dist/lib/cjs/docs-site/docs-links.cjs +123 -0
  44. package/dist/lib/cjs/docs-site/docs-links.d.cts +32 -0
  45. package/dist/lib/cjs/docs-site/docs-site-assets.cjs +64 -0
  46. package/dist/lib/cjs/docs-site/docs-site-assets.d.cts +23 -0
  47. package/dist/lib/cjs/docs-site/docs-site-commands.cjs +72 -0
  48. package/dist/lib/cjs/docs-site/docs-site-commands.d.cts +29 -0
  49. package/dist/lib/cjs/docs-site/docs-site-config.cjs +122 -0
  50. package/dist/lib/cjs/docs-site/docs-site-config.d.cts +162 -0
  51. package/dist/lib/cjs/docs-site/index.cjs +116 -0
  52. package/dist/lib/cjs/docs-site/index.d.cts +26 -0
  53. package/dist/lib/cjs/docs-site/link-check.cjs +197 -0
  54. package/dist/lib/cjs/docs-site/link-check.d.cts +163 -0
  55. package/dist/lib/cjs/docs-site/og-image-page.cjs +45 -0
  56. package/dist/lib/cjs/docs-site/og-image-page.d.cts +15 -0
  57. package/dist/lib/cjs/docs-site/og-image.cjs +326 -0
  58. package/dist/lib/cjs/docs-site/og-image.d.cts +70 -0
  59. package/dist/lib/cjs/docs-site/og-images.cjs +170 -0
  60. package/dist/lib/cjs/docs-site/og-images.d.cts +41 -0
  61. package/dist/lib/cjs/docs-site/route-data.cjs +47 -0
  62. package/dist/lib/cjs/docs-site/route-data.d.cts +14 -0
  63. package/dist/lib/cjs/docs-site/satteri-github-alerts.cjs +97 -0
  64. package/dist/lib/cjs/docs-site/satteri-github-alerts.d.cts +31 -0
  65. package/dist/lib/cjs/docs-site/satteri-relative-links.cjs +87 -0
  66. package/dist/lib/cjs/docs-site/satteri-relative-links.d.cts +29 -0
  67. package/dist/lib/cjs/docs-site/unrendered-alerts.cjs +51 -0
  68. package/dist/lib/cjs/docs-site/unrendered-alerts.d.cts +38 -0
  69. package/dist/lib/cjs/index.cjs +4 -1
  70. package/dist/lib/cjs/index.d.cts +1 -0
  71. package/dist/lib/cjs/library-build.cjs +1 -1
  72. package/dist/lib/cjs/library-build.d.cts +2 -2
  73. package/dist/lib/cjs/linters/eslint-config.cjs +17 -17
  74. package/dist/lib/cjs/linters/eslint-config.d.cts +1 -7
  75. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +2 -2
  76. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.d.cts +5 -8
  77. package/dist/lib/cjs/linters/markdownlint.cjs +4 -1
  78. package/dist/lib/cjs/package-manager.cjs +2 -2
  79. package/dist/lib/esm/build.d.mts +1 -1
  80. package/dist/lib/esm/build.mjs +1 -1
  81. package/dist/lib/esm/commitlint-forbidden-patterns.d.mts +1 -1
  82. package/dist/lib/esm/commitlint-forbidden-patterns.mjs +2 -2
  83. package/dist/lib/esm/commitlint-spellcheck-header.d.mts +1 -1
  84. package/dist/lib/esm/commitlint-spellcheck-header.mjs +2 -2
  85. package/dist/lib/esm/docs-site/api-doc-constants.d.mts +18 -0
  86. package/dist/lib/esm/docs-site/api-doc-constants.mjs +143 -0
  87. package/dist/lib/esm/docs-site/api-doc-jsdoc.d.mts +149 -0
  88. package/dist/lib/esm/docs-site/api-doc-jsdoc.mjs +377 -0
  89. package/dist/lib/esm/docs-site/api-doc-link-rendering.d.mts +185 -0
  90. package/dist/lib/esm/docs-site/api-doc-link-rendering.mjs +356 -0
  91. package/dist/lib/esm/docs-site/api-doc-package-sites.d.mts +36 -0
  92. package/dist/lib/esm/docs-site/api-doc-package-sites.mjs +91 -0
  93. package/dist/lib/esm/docs-site/api-doc-page-generation.d.mts +159 -0
  94. package/dist/lib/esm/docs-site/api-doc-page-generation.mjs +548 -0
  95. package/dist/lib/esm/docs-site/api-doc-route-segments.d.mts +25 -0
  96. package/dist/lib/esm/docs-site/api-doc-route-segments.mjs +17 -0
  97. package/dist/lib/esm/docs-site/api-doc-settings.d.mts +53 -0
  98. package/dist/lib/esm/docs-site/api-doc-settings.mjs +22 -0
  99. package/dist/lib/esm/docs-site/api-doc-source-processing.d.mts +75 -0
  100. package/dist/lib/esm/docs-site/api-doc-source-processing.mjs +274 -0
  101. package/dist/lib/esm/docs-site/api-doc-text-utils.d.mts +178 -0
  102. package/dist/lib/esm/docs-site/api-doc-text-utils.mjs +239 -0
  103. package/dist/lib/esm/docs-site/api-doc-type-merging.d.mts +51 -0
  104. package/dist/lib/esm/docs-site/api-doc-type-merging.mjs +129 -0
  105. package/dist/lib/esm/docs-site/api-doc-types.d.mts +157 -0
  106. package/dist/lib/esm/docs-site/api-doc-types.mjs +6 -0
  107. package/dist/lib/esm/docs-site/api-docs.d.mts +34 -0
  108. package/dist/lib/esm/docs-site/api-docs.mjs +139 -0
  109. package/dist/lib/esm/docs-site/astro-config.d.mts +23 -0
  110. package/dist/lib/esm/docs-site/astro-config.mjs +135 -0
  111. package/dist/lib/esm/docs-site/docs-links.d.mts +32 -0
  112. package/dist/lib/esm/docs-site/docs-links.mjs +113 -0
  113. package/dist/lib/esm/docs-site/docs-site-assets.d.mts +23 -0
  114. package/dist/lib/esm/docs-site/docs-site-assets.mjs +32 -0
  115. package/dist/lib/esm/docs-site/docs-site-commands.d.mts +29 -0
  116. package/dist/lib/esm/docs-site/docs-site-commands.mjs +46 -0
  117. package/dist/lib/esm/docs-site/docs-site-config.d.mts +162 -0
  118. package/dist/lib/esm/docs-site/docs-site-config.mjs +98 -0
  119. package/dist/lib/esm/docs-site/index.d.mts +26 -0
  120. package/dist/lib/esm/docs-site/index.mjs +58 -0
  121. package/dist/lib/esm/docs-site/link-check.d.mts +163 -0
  122. package/dist/lib/esm/docs-site/link-check.mjs +166 -0
  123. package/dist/lib/esm/docs-site/og-image-page.d.mts +15 -0
  124. package/dist/lib/esm/docs-site/og-image-page.mjs +21 -0
  125. package/dist/lib/esm/docs-site/og-image.d.mts +70 -0
  126. package/dist/lib/esm/docs-site/og-image.mjs +292 -0
  127. package/dist/lib/esm/docs-site/og-images.d.mts +41 -0
  128. package/dist/lib/esm/docs-site/og-images.mjs +156 -0
  129. package/dist/lib/esm/docs-site/route-data.d.mts +14 -0
  130. package/dist/lib/esm/docs-site/route-data.mjs +23 -0
  131. package/dist/lib/esm/docs-site/satteri-github-alerts.d.mts +31 -0
  132. package/dist/lib/esm/docs-site/satteri-github-alerts.mjs +72 -0
  133. package/dist/lib/esm/docs-site/satteri-relative-links.d.mts +29 -0
  134. package/dist/lib/esm/docs-site/satteri-relative-links.mjs +63 -0
  135. package/dist/lib/esm/docs-site/unrendered-alerts.d.mts +38 -0
  136. package/dist/lib/esm/docs-site/unrendered-alerts.mjs +26 -0
  137. package/dist/lib/esm/index.d.mts +1 -0
  138. package/dist/lib/esm/index.mjs +3 -1
  139. package/dist/lib/esm/library-build.d.mts +2 -2
  140. package/dist/lib/esm/library-build.mjs +1 -1
  141. package/dist/lib/esm/linters/eslint-config.d.mts +1 -7
  142. package/dist/lib/esm/linters/eslint-config.mjs +17 -17
  143. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.d.mts +5 -8
  144. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +2 -2
  145. package/dist/lib/esm/linters/markdownlint.mjs +4 -1
  146. package/dist/lib/esm/package-manager.mjs +2 -2
  147. package/docs-site/api-doc-constants/package.json +6 -0
  148. package/docs-site/api-doc-jsdoc/package.json +6 -0
  149. package/docs-site/api-doc-link-rendering/package.json +6 -0
  150. package/docs-site/api-doc-package-sites/package.json +6 -0
  151. package/docs-site/api-doc-page-generation/package.json +6 -0
  152. package/docs-site/api-doc-route-segments/package.json +6 -0
  153. package/docs-site/api-doc-settings/package.json +6 -0
  154. package/docs-site/api-doc-source-processing/package.json +6 -0
  155. package/docs-site/api-doc-text-utils/package.json +6 -0
  156. package/docs-site/api-doc-type-merging/package.json +6 -0
  157. package/docs-site/api-doc-types/package.json +6 -0
  158. package/docs-site/api-docs/package.json +6 -0
  159. package/docs-site/astro-config/package.json +6 -0
  160. package/docs-site/docs-links/package.json +6 -0
  161. package/docs-site/docs-site-assets/package.json +6 -0
  162. package/docs-site/docs-site-commands/package.json +6 -0
  163. package/docs-site/docs-site-config/package.json +6 -0
  164. package/docs-site/index/package.json +6 -0
  165. package/docs-site/link-check/package.json +6 -0
  166. package/docs-site/og-image/package.json +6 -0
  167. package/docs-site/og-image-page/package.json +6 -0
  168. package/docs-site/og-images/package.json +6 -0
  169. package/docs-site/package.json +6 -0
  170. package/docs-site/route-data/package.json +6 -0
  171. package/docs-site/satteri-github-alerts/package.json +6 -0
  172. package/docs-site/satteri-relative-links/package.json +6 -0
  173. package/docs-site/unrendered-alerts/package.json +6 -0
  174. package/package.json +74 -4
@@ -0,0 +1,326 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return '/';
11
+ },
12
+ env: {},
13
+ platform: 'android'
14
+ };
15
+
16
+ const existingProcess = globalThis.process;
17
+
18
+ if (!existingProcess) {
19
+ globalThis.process = browserProcess;
20
+ return;
21
+ }
22
+
23
+ if (existingProcess.versions?.node) {
24
+ return;
25
+ }
26
+
27
+ const existingProcessRecord = existingProcess;
28
+
29
+ for (const [key, value] of Object.entries(browserProcess)) {
30
+ existingProcessRecord[key] ??= value;
31
+ }
32
+
33
+ existingProcessRecord['browser'] = true;
34
+ }
35
+
36
+ ensureBrowserProcess();
37
+ })();
38
+
39
+ "use strict";
40
+ var __create = Object.create;
41
+ var __defProp = Object.defineProperty;
42
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
43
+ var __getOwnPropNames = Object.getOwnPropertyNames;
44
+ var __getProtoOf = Object.getPrototypeOf;
45
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
46
+ var __export = (target, all) => {
47
+ for (var name in all)
48
+ __defProp(target, name, { get: all[name], enumerable: true });
49
+ };
50
+ var __copyProps = (to, from, except, desc) => {
51
+ if (from && typeof from === "object" || typeof from === "function") {
52
+ for (let key of __getOwnPropNames(from))
53
+ if (!__hasOwnProp.call(to, key) && key !== except)
54
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
55
+ }
56
+ return to;
57
+ };
58
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
59
+ // If the importer is in node compatibility mode or this is not an ESM
60
+ // file that has been converted to a CommonJS file using a Babel-
61
+ // compatible transform (i.e. "__esModule" has not been set), then set
62
+ // "default" to the CommonJS "module.exports" for node compatibility.
63
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
64
+ mod
65
+ ));
66
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
67
+ var og_image_exports = {};
68
+ __export(og_image_exports, {
69
+ computeOgHash: () => computeOgHash,
70
+ loadFonts: () => loadFonts,
71
+ loadLogoDataUri: () => loadLogoDataUri,
72
+ renderOgImage: () => renderOgImage
73
+ });
74
+ module.exports = __toCommonJS(og_image_exports);
75
+ var import_resvg_js = require('@resvg/resvg-js');
76
+ var import_node_crypto = require('node:crypto');
77
+ var import_node_fs = require('node:fs');
78
+ var import_promises = require('node:fs/promises');
79
+ var import_satori = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('satori')), 1);
80
+ const OG_WIDTH = 1200;
81
+ const OG_HEIGHT = 630;
82
+ const BACKGROUND_COLOR = "#111213";
83
+ const ACCENT_COLOR = "#8b6ff5";
84
+ const ACCENT_BG = "rgba(103, 172, 172, 0.18)";
85
+ const TITLE_COLOR = "#ffffff";
86
+ const DESCRIPTION_COLOR = "#9CA3AF";
87
+ const BRAND_COLOR = "#8b6ff5";
88
+ const BORDER_WIDTH = 8;
89
+ const PADDING_X = 80;
90
+ const PADDING_TOP = 70;
91
+ const PADDING_BOTTOM = 60;
92
+ const TITLE_FONT_SIZE = 56;
93
+ const DESCRIPTION_FONT_SIZE = 26;
94
+ const BADGE_FONT_SIZE = 18;
95
+ const BADGE_FONT_WEIGHT = 600;
96
+ const BRAND_FONT_SIZE = 28;
97
+ const FONT_WEIGHT_REGULAR = 400;
98
+ const FONT_WEIGHT_BOLD = 700;
99
+ const TITLE_LINE_HEIGHT = 1.2;
100
+ const DESCRIPTION_LINE_HEIGHT = 1.5;
101
+ const SIGNATURE_FONT_SIZE = 24;
102
+ const SIGNATURE_LINE_HEIGHT = 1.4;
103
+ const SIGNATURE_BG = "rgba(0, 0, 0, 0.35)";
104
+ const SIGNATURE_MAX_LINES = 2;
105
+ const LOGO_DISPLAY_SIZE = 76;
106
+ const LOGO_RASTER_SIZE = 152;
107
+ function computeOgHash(params) {
108
+ const input = JSON.stringify({
109
+ badge: params.badge ?? "",
110
+ description: params.description ?? "",
111
+ signature: params.signature ?? "",
112
+ title: params.title
113
+ });
114
+ const HASH_LENGTH = 16;
115
+ return (0, import_node_crypto.createHash)("sha256").update(input).digest("hex").slice(0, HASH_LENGTH);
116
+ }
117
+ async function loadFonts(fontsDirectory) {
118
+ const regularPath = `${fontsDirectory}/inter-latin-400-normal.ttf`;
119
+ const boldPath = `${fontsDirectory}/inter-latin-700-normal.ttf`;
120
+ if ((0, import_node_fs.existsSync)(regularPath) && (0, import_node_fs.existsSync)(boldPath)) {
121
+ const [regularData, boldData] = await Promise.all([
122
+ (0, import_promises.readFile)(regularPath),
123
+ (0, import_promises.readFile)(boldPath)
124
+ ]);
125
+ return [
126
+ { data: regularData, name: "Inter", style: "normal", weight: FONT_WEIGHT_REGULAR },
127
+ { data: boldData, name: "Inter", style: "normal", weight: FONT_WEIGHT_BOLD }
128
+ ];
129
+ }
130
+ if ((0, import_node_fs.existsSync)(fontsDirectory)) {
131
+ const entries = await (0, import_promises.readdir)(fontsDirectory);
132
+ const fontFile = entries.find((name) => name.endsWith(".ttf") || name.endsWith(".otf"));
133
+ if (fontFile) {
134
+ const data = await (0, import_promises.readFile)(`${fontsDirectory}/${fontFile}`);
135
+ return [
136
+ { data, name: "Inter", style: "normal", weight: FONT_WEIGHT_REGULAR },
137
+ { data, name: "Inter", style: "normal", weight: FONT_WEIGHT_BOLD }
138
+ ];
139
+ }
140
+ }
141
+ return null;
142
+ }
143
+ async function loadLogoDataUri(faviconPath) {
144
+ if (!(0, import_node_fs.existsSync)(faviconPath)) {
145
+ return null;
146
+ }
147
+ const svg = await (0, import_promises.readFile)(faviconPath, "utf-8");
148
+ const resvg = new import_resvg_js.Resvg(svg, { fitTo: { mode: "width", value: LOGO_RASTER_SIZE } });
149
+ const png = resvg.render().asPng();
150
+ return `data:image/png;base64,${png.toString("base64")}`;
151
+ }
152
+ async function renderOgImage(params, options) {
153
+ const markup = buildOgImageMarkup(params, options);
154
+ const svg = await (0, import_satori.default)(markup, {
155
+ fonts: options.fonts,
156
+ height: OG_HEIGHT,
157
+ width: OG_WIDTH
158
+ });
159
+ const resvg = new import_resvg_js.Resvg(svg, {
160
+ fitTo: { mode: "width", value: OG_WIDTH }
161
+ });
162
+ return resvg.render().asPng();
163
+ }
164
+ function buildBadgeMarkup(badge) {
165
+ return {
166
+ props: {
167
+ children: badge,
168
+ style: {
169
+ alignItems: "center",
170
+ background: ACCENT_BG,
171
+ borderRadius: "20px",
172
+ color: ACCENT_COLOR,
173
+ display: "flex",
174
+ fontSize: `${String(BADGE_FONT_SIZE)}px`,
175
+ fontWeight: BADGE_FONT_WEIGHT,
176
+ padding: "6px 14px"
177
+ }
178
+ },
179
+ type: "div"
180
+ };
181
+ }
182
+ function buildLogoMarkup(logoDataUri) {
183
+ return {
184
+ props: {
185
+ height: LOGO_DISPLAY_SIZE,
186
+ src: logoDataUri,
187
+ style: {
188
+ height: `${String(LOGO_DISPLAY_SIZE)}px`,
189
+ width: `${String(LOGO_DISPLAY_SIZE)}px`
190
+ },
191
+ width: LOGO_DISPLAY_SIZE
192
+ },
193
+ type: "img"
194
+ };
195
+ }
196
+ function buildOgImageMarkup(params, options) {
197
+ const badgeNode = params.badge ? buildBadgeMarkup(params.badge) : null;
198
+ const logoNode = options.logoDataUri ? buildLogoMarkup(options.logoDataUri) : null;
199
+ const topRowChildren = [
200
+ ...logoNode ? [logoNode] : [],
201
+ { props: { style: { flex: 1 } }, type: "div" },
202
+ ...badgeNode ? [badgeNode] : []
203
+ ];
204
+ const topRow = {
205
+ props: {
206
+ children: topRowChildren,
207
+ style: {
208
+ alignItems: "center",
209
+ display: "flex",
210
+ marginBottom: "24px"
211
+ }
212
+ },
213
+ type: "div"
214
+ };
215
+ const title = {
216
+ props: {
217
+ children: params.title,
218
+ style: {
219
+ color: TITLE_COLOR,
220
+ fontSize: `${String(TITLE_FONT_SIZE)}px`,
221
+ fontWeight: FONT_WEIGHT_BOLD,
222
+ lineHeight: TITLE_LINE_HEIGHT,
223
+ marginBottom: "20px",
224
+ overflow: "hidden",
225
+ textOverflow: "ellipsis"
226
+ }
227
+ },
228
+ type: "div"
229
+ };
230
+ const signatureNode = params.signature ? buildSignatureMarkup(params.signature) : null;
231
+ const description = {
232
+ props: {
233
+ children: params.description ?? "",
234
+ style: {
235
+ color: DESCRIPTION_COLOR,
236
+ flex: 1,
237
+ fontSize: `${String(DESCRIPTION_FONT_SIZE)}px`,
238
+ lineHeight: DESCRIPTION_LINE_HEIGHT,
239
+ overflow: "hidden",
240
+ textOverflow: "ellipsis"
241
+ }
242
+ },
243
+ type: "div"
244
+ };
245
+ const footer = {
246
+ props: {
247
+ children: [
248
+ { props: { style: { flex: 1 } }, type: "div" },
249
+ {
250
+ props: {
251
+ children: options.brandText,
252
+ style: {
253
+ color: BRAND_COLOR,
254
+ fontSize: `${String(BRAND_FONT_SIZE)}px`,
255
+ fontWeight: FONT_WEIGHT_BOLD
256
+ }
257
+ },
258
+ type: "div"
259
+ }
260
+ ],
261
+ style: {
262
+ alignItems: "flex-end",
263
+ display: "flex"
264
+ }
265
+ },
266
+ type: "div"
267
+ };
268
+ return {
269
+ props: {
270
+ children: [
271
+ {
272
+ props: {
273
+ children: signatureNode ? [topRow, title, signatureNode, description] : [topRow, title, description],
274
+ style: {
275
+ display: "flex",
276
+ flex: 1,
277
+ flexDirection: "column"
278
+ }
279
+ },
280
+ type: "div"
281
+ },
282
+ footer
283
+ ],
284
+ style: {
285
+ background: BACKGROUND_COLOR,
286
+ borderLeft: `${String(BORDER_WIDTH)}px solid ${ACCENT_COLOR}`,
287
+ display: "flex",
288
+ flexDirection: "column",
289
+ height: "100%",
290
+ justifyContent: "space-between",
291
+ padding: `${String(PADDING_TOP)}px ${String(PADDING_X)}px ${String(PADDING_BOTTOM)}px ${String(PADDING_X)}px`,
292
+ width: "100%"
293
+ }
294
+ },
295
+ type: "div"
296
+ };
297
+ }
298
+ function buildSignatureMarkup(signature) {
299
+ return {
300
+ props: {
301
+ children: signature,
302
+ style: {
303
+ background: SIGNATURE_BG,
304
+ borderRadius: "12px",
305
+ color: ACCENT_COLOR,
306
+ display: "-webkit-box",
307
+ fontFamily: "monospace",
308
+ fontSize: `${String(SIGNATURE_FONT_SIZE)}px`,
309
+ lineClamp: SIGNATURE_MAX_LINES,
310
+ lineHeight: SIGNATURE_LINE_HEIGHT,
311
+ marginBottom: "28px",
312
+ overflow: "hidden",
313
+ padding: "16px 24px"
314
+ }
315
+ },
316
+ type: "div"
317
+ };
318
+ }
319
+ // Annotate the CommonJS export names for ESM import in node:
320
+ 0 && (module.exports = {
321
+ computeOgHash,
322
+ loadFonts,
323
+ loadLogoDataUri,
324
+ renderOgImage
325
+ });
326
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvb2ctaW1hZ2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlbmRlcnMgYSBwYWdlJ3MgT3BlbiBHcmFwaCBjYXJkOiBzYXRvcmkgbGF5cyBpdCBvdXQgYXMgU1ZHLCByZXN2ZyByYXN0ZXJpemVzIGl0IHRvIFBORy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZvbnQgfSBmcm9tICdzYXRvcmknO1xuXG5pbXBvcnQgeyBSZXN2ZyB9IGZyb20gJ0ByZXN2Zy9yZXN2Zy1qcyc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgc2F0b3JpIGZyb20gJ3NhdG9yaSc7XG5cbmNvbnN0IE9HX1dJRFRIID0gMTIwMDtcbmNvbnN0IE9HX0hFSUdIVCA9IDYzMDtcbmNvbnN0IEJBQ0tHUk9VTkRfQ09MT1IgPSAnIzExMTIxMyc7XG4vLyBUaGUgdmlvbGV0IGFjY2VudCwgbWF0Y2hpbmcgdGhlIGRvY3MgdGhlbWUgKGAtLXNsLWNvbG9yLWFjY2VudGApLlxuY29uc3QgQUNDRU5UX0NPTE9SID0gJyM4YjZmZjUnO1xuY29uc3QgQUNDRU5UX0JHID0gJ3JnYmEoMTAzLCAxNzIsIDE3MiwgMC4xOCknO1xuY29uc3QgVElUTEVfQ09MT1IgPSAnI2ZmZmZmZic7XG5jb25zdCBERVNDUklQVElPTl9DT0xPUiA9ICcjOUNBM0FGJztcbmNvbnN0IEJSQU5EX0NPTE9SID0gJyM4YjZmZjUnO1xuY29uc3QgQk9SREVSX1dJRFRIID0gODtcbmNvbnN0IFBBRERJTkdfWCA9IDgwO1xuY29uc3QgUEFERElOR19UT1AgPSA3MDtcbmNvbnN0IFBBRERJTkdfQk9UVE9NID0gNjA7XG5jb25zdCBUSVRMRV9GT05UX1NJWkUgPSA1NjtcbmNvbnN0IERFU0NSSVBUSU9OX0ZPTlRfU0laRSA9IDI2O1xuY29uc3QgQkFER0VfRk9OVF9TSVpFID0gMTg7XG5jb25zdCBCQURHRV9GT05UX1dFSUdIVCA9IDYwMDtcbmNvbnN0IEJSQU5EX0ZPTlRfU0laRSA9IDI4O1xuY29uc3QgRk9OVF9XRUlHSFRfUkVHVUxBUiA9IDQwMDtcbmNvbnN0IEZPTlRfV0VJR0hUX0JPTEQgPSA3MDA7XG5jb25zdCBUSVRMRV9MSU5FX0hFSUdIVCA9IDEuMjtcbmNvbnN0IERFU0NSSVBUSU9OX0xJTkVfSEVJR0hUID0gMS41O1xuLy8gU2lnbmF0dXJlIGNvZGUgYmxvY2sgKHZpb2xldCBhY2NlbnQgb24gYSBzdWJ0bGUgZGFya2VyIHJvdW5kZWQgcGFuZWwpLlxuY29uc3QgU0lHTkFUVVJFX0ZPTlRfU0laRSA9IDI0O1xuY29uc3QgU0lHTkFUVVJFX0xJTkVfSEVJR0hUID0gMS40O1xuY29uc3QgU0lHTkFUVVJFX0JHID0gJ3JnYmEoMCwgMCwgMCwgMC4zNSknO1xuY29uc3QgU0lHTkFUVVJFX01BWF9MSU5FUyA9IDI7XG4vLyBTaXRlIGxvZ28gKGZhdmljb24pLCByYXN0ZXJpemVkIG9uY2UgYW5kIGVtYmVkZGVkIGFzIGEgZGF0YSBVUkkuXG5jb25zdCBMT0dPX0RJU1BMQVlfU0laRSA9IDc2O1xuY29uc3QgTE9HT19SQVNURVJfU0laRSA9IDE1MjtcblxuLyoqXG4gKiBXaGF0IG9uZSBPcGVuIEdyYXBoIGNhcmQgc2hvd3M6IGEgdGl0bGUsIGFuZCBvcHRpb25hbGx5IGEgZGVzY3JpcHRpb24sIGEgY29kZSBzaWduYXR1cmUgYW5kIGEgYmFkZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2dDYXJkQ29udGVudCB7XG4gIHJlYWRvbmx5IGJhZGdlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc2lnbmF0dXJlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwZXItc2l0ZSBwYXJ0IG9mIGV2ZXJ5IGNhcmQ6IHRoZSBmb250cywgdGhlIGxvZ28gYW5kIHRoZSBicmFuZCB0ZXh0IGluIHRoZSBmb290ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyT2dJbWFnZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHRleHQgdGhlIGZvb3RlciBjYXJyaWVzLCBub3JtYWxseSB0aGUgcGFja2FnZSdzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBicmFuZFRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvbnRzIHNhdG9yaSByZW5kZXJzIHRoZSB0ZXh0IHdpdGguXG4gICAqL1xuICByZWFkb25seSBmb250czogRm9udFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l0ZSBsb2dvIGFzIGEgUE5HIGRhdGEgVVJJLCBvciBgbnVsbGAgdG8gcmVuZGVyIHRoZSBjYXJkIHdpdGhvdXQgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nb0RhdGFVcmk6IG51bGwgfCBzdHJpbmc7XG59XG5cbi8qKlxuICogSGFzaGVzIGEgY2FyZCdzIGNvbnRlbnQsIHNvIGFuIHVuY2hhbmdlZCBjYXJkIGlzIG5vdCByZW5kZXJlZCBhZ2Fpbi5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNhcmQncyBjb250ZW50LlxuICogQHJldHVybnMgQSAxNi1jaGFyYWN0ZXIgaGV4IGRpZ2VzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPZ0hhc2gocGFyYW1zOiBPZ0NhcmRDb250ZW50KTogc3RyaW5nIHtcbiAgY29uc3QgaW5wdXQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgYmFkZ2U6IHBhcmFtcy5iYWRnZSA/PyAnJyxcbiAgICBkZXNjcmlwdGlvbjogcGFyYW1zLmRlc2NyaXB0aW9uID8/ICcnLFxuICAgIHNpZ25hdHVyZTogcGFyYW1zLnNpZ25hdHVyZSA/PyAnJyxcbiAgICB0aXRsZTogcGFyYW1zLnRpdGxlXG4gIH0pO1xuICBjb25zdCBIQVNIX0xFTkdUSCA9IDE2O1xuICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGlucHV0KS5kaWdlc3QoJ2hleCcpLnNsaWNlKDAsIEhBU0hfTEVOR1RIKTtcbn1cblxuLyoqXG4gKiBMb2FkcyB0aGUgZm9udHMgc2F0b3JpIG5lZWRzIHRvIHJlbmRlciB0ZXh0LlxuICpcbiAqIFRoaXMgcGFja2FnZSBzaGlwcyBgaW50ZXItbGF0aW4tNDAwLW5vcm1hbC50dGZgIC8gYGludGVyLWxhdGluLTcwMC1ub3JtYWwudHRmYCB1bmRlclxuICogYGFzc2V0cy9kb2NzLXNpdGUvZm9udHNgOyB0aGlzIGZhbGxzIGJhY2sgdG8gYW55IG90aGVyIGAudHRmYC9gLm90ZmAgaW4gYGZvbnRzRGlyZWN0b3J5YCBhbmRcbiAqIHJldHVybnMgYG51bGxgIHdoZW4gdGhlIGRpcmVjdG9yeSBob2xkcyBub25lLCBzbyB0aGUgY2FsbGVyIGNhbiBza2lwIE9HIGdlbmVyYXRpb24gaW5zdGVhZCBvZlxuICogY3Jhc2hpbmcgdGhlIGJ1aWxkLlxuICpcbiAqIEBwYXJhbSBmb250c0RpcmVjdG9yeSAtIFRoZSBmb2xkZXIgaG9sZGluZyB0aGUgZm9udHMuXG4gKiBAcmV0dXJucyBUaGUgZm9udHMsIG9yIGBudWxsYCB3aGVuIHRoZSBmb2xkZXIgaG9sZHMgbm9uZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRGb250cyhmb250c0RpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxGb250W10gfCBudWxsPiB7XG4gIGNvbnN0IHJlZ3VsYXJQYXRoID0gYCR7Zm9udHNEaXJlY3Rvcnl9L2ludGVyLWxhdGluLTQwMC1ub3JtYWwudHRmYDtcbiAgY29uc3QgYm9sZFBhdGggPSBgJHtmb250c0RpcmVjdG9yeX0vaW50ZXItbGF0aW4tNzAwLW5vcm1hbC50dGZgO1xuXG4gIGlmIChleGlzdHNTeW5jKHJlZ3VsYXJQYXRoKSAmJiBleGlzdHNTeW5jKGJvbGRQYXRoKSkge1xuICAgIGNvbnN0IFtyZWd1bGFyRGF0YSwgYm9sZERhdGFdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcmVhZEZpbGUocmVndWxhclBhdGgpLFxuICAgICAgcmVhZEZpbGUoYm9sZFBhdGgpXG4gICAgXSk7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgZGF0YTogcmVndWxhckRhdGEsIG5hbWU6ICdJbnRlcicsIHN0eWxlOiAnbm9ybWFsJyBhcyBjb25zdCwgd2VpZ2h0OiBGT05UX1dFSUdIVF9SRUdVTEFSIH0sXG4gICAgICB7IGRhdGE6IGJvbGREYXRhLCBuYW1lOiAnSW50ZXInLCBzdHlsZTogJ25vcm1hbCcgYXMgY29uc3QsIHdlaWdodDogRk9OVF9XRUlHSFRfQk9MRCB9XG4gICAgXTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiByZXVzZSBhbnkgc2luZ2xlIGZvbnQgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IGZvciBib3RoIHdlaWdodHMuXG4gIGlmIChleGlzdHNTeW5jKGZvbnRzRGlyZWN0b3J5KSkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkZGlyKGZvbnRzRGlyZWN0b3J5KTtcbiAgICBjb25zdCBmb250RmlsZSA9IGVudHJpZXMuZmluZCgobmFtZSkgPT4gbmFtZS5lbmRzV2l0aCgnLnR0ZicpIHx8IG5hbWUuZW5kc1dpdGgoJy5vdGYnKSk7XG4gICAgaWYgKGZvbnRGaWxlKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEZpbGUoYCR7Zm9udHNEaXJlY3Rvcnl9LyR7Zm9udEZpbGV9YCk7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7IGRhdGEsIG5hbWU6ICdJbnRlcicsIHN0eWxlOiAnbm9ybWFsJyBhcyBjb25zdCwgd2VpZ2h0OiBGT05UX1dFSUdIVF9SRUdVTEFSIH0sXG4gICAgICAgIHsgZGF0YSwgbmFtZTogJ0ludGVyJywgc3R5bGU6ICdub3JtYWwnIGFzIGNvbnN0LCB3ZWlnaHQ6IEZPTlRfV0VJR0hUX0JPTEQgfVxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSYXN0ZXJpemUgYW4gU1ZHIGZhdmljb24gdG8gYSBQTkcgZGF0YSBVUkkgdmlhIHJlc3ZnIGZvciBlbWJlZGRpbmcgaW4gdGhlIHNhdG9yaSBsYXlvdXQgKHNhdG9yaSdzXG4gKiBgPGltZz5gIG5lZWRzIGEgcmFzdGVyL2RhdGEtVVJJIHNvdXJjZSkuIFJldHVybnMgYG51bGxgIHdoZW4gdGhlIGZpbGUgaXMgbWlzc2luZyBzbyB0aGUgY2FsbGVyIGNhblxuICogcmVuZGVyIHRoZSBjYXJkIHdpdGhvdXQgYSBsb2dvLiBDYWxsIHRoaXMgT05DRSBhbmQgcmV1c2UgdGhlIHJlc3VsdCBhY3Jvc3MgYWxsIGNhcmRzLlxuICpcbiAqIEBwYXJhbSBmYXZpY29uUGF0aCAtIFRoZSBTVkcgZmF2aWNvbidzIHBhdGguXG4gKiBAcmV0dXJucyBUaGUgUE5HIGRhdGEgVVJJLCBvciBgbnVsbGAgd2hlbiB0aGUgZmF2aWNvbiBpcyBtaXNzaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZExvZ29EYXRhVXJpKGZhdmljb25QYXRoOiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgaWYgKCFleGlzdHNTeW5jKGZhdmljb25QYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHN2ZyA9IGF3YWl0IHJlYWRGaWxlKGZhdmljb25QYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgcmVzdmcgPSBuZXcgUmVzdmcoc3ZnLCB7IGZpdFRvOiB7IG1vZGU6ICd3aWR0aCcsIHZhbHVlOiBMT0dPX1JBU1RFUl9TSVpFIH0gfSk7XG4gIGNvbnN0IHBuZyA9IHJlc3ZnLnJlbmRlcigpLmFzUG5nKCk7XG4gIHJldHVybiBgZGF0YTppbWFnZS9wbmc7YmFzZTY0LCR7cG5nLnRvU3RyaW5nKCdiYXNlNjQnKX1gO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBwYWdlJ3MgY2FyZCB0byBhIFBORy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNhcmQncyBjb250ZW50LlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgZm9udHMsIGxvZ28gYW5kIGJyYW5kIHRleHQgZXZlcnkgY2FyZCBzaGFyZXMuXG4gKiBAcmV0dXJucyBUaGUgUE5HLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyT2dJbWFnZShwYXJhbXM6IE9nQ2FyZENvbnRlbnQsIG9wdGlvbnM6IFJlbmRlck9nSW1hZ2VPcHRpb25zKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgY29uc3QgbWFya3VwID0gYnVpbGRPZ0ltYWdlTWFya3VwKHBhcmFtcywgb3B0aW9ucyk7XG4gIGNvbnN0IHN2ZyA9IGF3YWl0IHNhdG9yaShtYXJrdXAsIHtcbiAgICBmb250czogb3B0aW9ucy5mb250cyxcbiAgICBoZWlnaHQ6IE9HX0hFSUdIVCxcbiAgICB3aWR0aDogT0dfV0lEVEhcbiAgfSk7XG5cbiAgY29uc3QgcmVzdmcgPSBuZXcgUmVzdmcoc3ZnLCB7XG4gICAgZml0VG86IHsgbW9kZTogJ3dpZHRoJywgdmFsdWU6IE9HX1dJRFRIIH1cbiAgfSk7XG4gIHJldHVybiByZXN2Zy5yZW5kZXIoKS5hc1BuZygpO1xufVxuXG5mdW5jdGlvbiBidWlsZEJhZGdlTWFya3VwKGJhZGdlOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB7XG4gICAgcHJvcHM6IHtcbiAgICAgIGNoaWxkcmVuOiBiYWRnZSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICBiYWNrZ3JvdW5kOiBBQ0NFTlRfQkcsXG4gICAgICAgIGJvcmRlclJhZGl1czogJzIwcHgnLFxuICAgICAgICBjb2xvcjogQUNDRU5UX0NPTE9SLFxuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGZvbnRTaXplOiBgJHtTdHJpbmcoQkFER0VfRk9OVF9TSVpFKX1weGAsXG4gICAgICAgIGZvbnRXZWlnaHQ6IEJBREdFX0ZPTlRfV0VJR0hULFxuICAgICAgICBwYWRkaW5nOiAnNnB4IDE0cHgnXG4gICAgICB9XG4gICAgfSxcbiAgICB0eXBlOiAnZGl2J1xuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZExvZ29NYXJrdXAobG9nb0RhdGFVcmk6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBwcm9wczoge1xuICAgICAgaGVpZ2h0OiBMT0dPX0RJU1BMQVlfU0laRSxcbiAgICAgIHNyYzogbG9nb0RhdGFVcmksXG4gICAgICBzdHlsZToge1xuICAgICAgICBoZWlnaHQ6IGAke1N0cmluZyhMT0dPX0RJU1BMQVlfU0laRSl9cHhgLFxuICAgICAgICB3aWR0aDogYCR7U3RyaW5nKExPR09fRElTUExBWV9TSVpFKX1weGBcbiAgICAgIH0sXG4gICAgICB3aWR0aDogTE9HT19ESVNQTEFZX1NJWkVcbiAgICB9LFxuICAgIHR5cGU6ICdpbWcnXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkT2dJbWFnZU1hcmt1cChwYXJhbXM6IE9nQ2FyZENvbnRlbnQsIG9wdGlvbnM6IFJlbmRlck9nSW1hZ2VPcHRpb25zKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBiYWRnZU5vZGUgPSBwYXJhbXMuYmFkZ2UgPyBidWlsZEJhZGdlTWFya3VwKHBhcmFtcy5iYWRnZSkgOiBudWxsO1xuICBjb25zdCBsb2dvTm9kZSA9IG9wdGlvbnMubG9nb0RhdGFVcmkgPyBidWlsZExvZ29NYXJrdXAob3B0aW9ucy5sb2dvRGF0YVVyaSkgOiBudWxsO1xuXG4gIC8vIFRvcCByb3c6IGxvZ28gb24gdGhlIGxlZnQsIGJhZGdlIG9uIHRoZSByaWdodC5cbiAgY29uc3QgdG9wUm93Q2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXG4gICAgLi4uKGxvZ29Ob2RlID8gW2xvZ29Ob2RlXSA6IFtdKSxcbiAgICB7IHByb3BzOiB7IHN0eWxlOiB7IGZsZXg6IDEgfSB9LCB0eXBlOiAnZGl2JyB9LFxuICAgIC4uLihiYWRnZU5vZGUgPyBbYmFkZ2VOb2RlXSA6IFtdKVxuICBdO1xuICBjb25zdCB0b3BSb3cgPSB7XG4gICAgcHJvcHM6IHtcbiAgICAgIGNoaWxkcmVuOiB0b3BSb3dDaGlsZHJlbixcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIG1hcmdpbkJvdHRvbTogJzI0cHgnXG4gICAgICB9XG4gICAgfSxcbiAgICB0eXBlOiAnZGl2J1xuICB9O1xuXG4gIC8vIFRpdGxlXG4gIGNvbnN0IHRpdGxlID0ge1xuICAgIHByb3BzOiB7XG4gICAgICBjaGlsZHJlbjogcGFyYW1zLnRpdGxlLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY29sb3I6IFRJVExFX0NPTE9SLFxuICAgICAgICBmb250U2l6ZTogYCR7U3RyaW5nKFRJVExFX0ZPTlRfU0laRSl9cHhgLFxuICAgICAgICBmb250V2VpZ2h0OiBGT05UX1dFSUdIVF9CT0xELFxuICAgICAgICBsaW5lSGVpZ2h0OiBUSVRMRV9MSU5FX0hFSUdIVCxcbiAgICAgICAgbWFyZ2luQm90dG9tOiAnMjBweCcsXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgdGV4dE92ZXJmbG93OiAnZWxsaXBzaXMnXG4gICAgICB9XG4gICAgfSxcbiAgICB0eXBlOiAnZGl2J1xuICB9O1xuXG4gIC8vIFNpZ25hdHVyZSBjb2RlIGJsb2NrIChiZXR3ZWVuIHRpdGxlIGFuZCBkZXNjcmlwdGlvbikg4oCUIG9taXR0ZWQgZm9yIHBhZ2VzIHdpdGggbm8gc2lnbmF0dXJlLlxuICBjb25zdCBzaWduYXR1cmVOb2RlID0gcGFyYW1zLnNpZ25hdHVyZSA/IGJ1aWxkU2lnbmF0dXJlTWFya3VwKHBhcmFtcy5zaWduYXR1cmUpIDogbnVsbDtcblxuICAvLyBEZXNjcmlwdGlvblxuICBjb25zdCBkZXNjcmlwdGlvbiA9IHtcbiAgICBwcm9wczoge1xuICAgICAgY2hpbGRyZW46IHBhcmFtcy5kZXNjcmlwdGlvbiA/PyAnJyxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGNvbG9yOiBERVNDUklQVElPTl9DT0xPUixcbiAgICAgICAgZmxleDogMSxcbiAgICAgICAgZm9udFNpemU6IGAke1N0cmluZyhERVNDUklQVElPTl9GT05UX1NJWkUpfXB4YCxcbiAgICAgICAgbGluZUhlaWdodDogREVTQ1JJUFRJT05fTElORV9IRUlHSFQsXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgdGV4dE92ZXJmbG93OiAnZWxsaXBzaXMnXG4gICAgICB9XG4gICAgfSxcbiAgICB0eXBlOiAnZGl2J1xuICB9O1xuXG4gIC8vIEZvb3RlciB3aXRoIHRoZSBwYWNrYWdlIG5hbWUgYXMgdGV4dCBicmFuZGluZyAodGhlIGZhdmljb24gaXMgcmVuZGVyZWQgc2VwYXJhdGVseSwgaW4gdGhlIGhlYWRlcilcbiAgY29uc3QgZm9vdGVyID0ge1xuICAgIHByb3BzOiB7XG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7IHByb3BzOiB7IHN0eWxlOiB7IGZsZXg6IDEgfSB9LCB0eXBlOiAnZGl2JyB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBvcHRpb25zLmJyYW5kVGV4dCxcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgIGNvbG9yOiBCUkFORF9DT0xPUixcbiAgICAgICAgICAgICAgZm9udFNpemU6IGAke1N0cmluZyhCUkFORF9GT05UX1NJWkUpfXB4YCxcbiAgICAgICAgICAgICAgZm9udFdlaWdodDogRk9OVF9XRUlHSFRfQk9MRFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZTogJ2RpdidcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGFsaWduSXRlbXM6ICdmbGV4LWVuZCcsXG4gICAgICAgIGRpc3BsYXk6ICdmbGV4J1xuICAgICAgfVxuICAgIH0sXG4gICAgdHlwZTogJ2RpdidcbiAgfTtcblxuICAvLyBSb290IGNvbnRhaW5lclxuICByZXR1cm4ge1xuICAgIHByb3BzOiB7XG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBzaWduYXR1cmVOb2RlID8gW3RvcFJvdywgdGl0bGUsIHNpZ25hdHVyZU5vZGUsIGRlc2NyaXB0aW9uXSA6IFt0b3BSb3csIHRpdGxlLCBkZXNjcmlwdGlvbl0sXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgIGZsZXg6IDEsXG4gICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlOiAnZGl2J1xuICAgICAgICB9LFxuICAgICAgICBmb290ZXJcbiAgICAgIF0sXG4gICAgICBzdHlsZToge1xuICAgICAgICBiYWNrZ3JvdW5kOiBCQUNLR1JPVU5EX0NPTE9SLFxuICAgICAgICBib3JkZXJMZWZ0OiBgJHtTdHJpbmcoQk9SREVSX1dJRFRIKX1weCBzb2xpZCAke0FDQ0VOVF9DT0xPUn1gLFxuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJyxcbiAgICAgICAgcGFkZGluZzogYCR7U3RyaW5nKFBBRERJTkdfVE9QKX1weCAke1N0cmluZyhQQURESU5HX1gpfXB4ICR7U3RyaW5nKFBBRERJTkdfQk9UVE9NKX1weCAke1N0cmluZyhQQURESU5HX1gpfXB4YCxcbiAgICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgICAgfVxuICAgIH0sXG4gICAgdHlwZTogJ2RpdidcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTaWduYXR1cmVNYXJrdXAoc2lnbmF0dXJlOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB7XG4gICAgcHJvcHM6IHtcbiAgICAgIGNoaWxkcmVuOiBzaWduYXR1cmUsXG4gICAgICBzdHlsZToge1xuICAgICAgICBiYWNrZ3JvdW5kOiBTSUdOQVRVUkVfQkcsXG4gICAgICAgIGJvcmRlclJhZGl1czogJzEycHgnLFxuICAgICAgICBjb2xvcjogQUNDRU5UX0NPTE9SLFxuICAgICAgICBkaXNwbGF5OiAnLXdlYmtpdC1ib3gnLFxuICAgICAgICBmb250RmFtaWx5OiAnbW9ub3NwYWNlJyxcbiAgICAgICAgZm9udFNpemU6IGAke1N0cmluZyhTSUdOQVRVUkVfRk9OVF9TSVpFKX1weGAsXG4gICAgICAgIGxpbmVDbGFtcDogU0lHTkFUVVJFX01BWF9MSU5FUyxcbiAgICAgICAgbGluZUhlaWdodDogU0lHTkFUVVJFX0xJTkVfSEVJR0hULFxuICAgICAgICBtYXJnaW5Cb3R0b206ICcyOHB4JyxcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICBwYWRkaW5nOiAnMTZweCAyNHB4J1xuICAgICAgfVxuICAgIH0sXG4gICAgdHlwZTogJ2RpdidcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBLHNCQUFzQjtBQUN0Qix5QkFBMkI7QUFDM0IscUJBQTJCO0FBQzNCLHNCQUdPO0FBQ1Asb0JBQW1CO0FBRW5CLE1BQU0sV0FBVztBQUNqQixNQUFNLFlBQVk7QUFDbEIsTUFBTSxtQkFBbUI7QUFFekIsTUFBTSxlQUFlO0FB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O0FBQUEsY0FDTCxPQUFPO0FBQUEsY0FDUCxVQUFVLEdBQUcsT0FBTyxlQUFlLENBQUM7QUFBQSxjQUNwQyxZQUFZO0FBQUEsWUFDZDtBQUFBLFVBQ0Y7QUFBQSxVQUNBLE1BQU07QUFBQSxRQUNSO0FBQUEsTUFDRjtBQUFBLE1BQ0EsT0FBTztBQUFBLFFBQ0wsWUFBWTtBQUFBLFFBQ1osU0FBUztBQUFBLE1BQ1g7QUFBQSxJQUNGO0FBQUEsSUFDQSxNQUFNO0FBQUEsRUFDUjtBQUdBLFNBQU87QUFBQSxJQUNMLE9BQU87QUFBQSxNQUNMLFVBQVU7QUFBQSxRQUNSO0FBQUEsVUFDRSxPQUFPO0FBQUEsWUFDTCxVQUFVLGdCQUFnQixDQUFDLFFBQVEsT0FBTyxlQUFlLFdBQVcsSUFBSSxDQUFDLFFBQVEsT0FBTyxXQUFXO0FBQUEsWUFDbkcsT0FBTztBQUFBLGNBQ0wsU0FBUztBQUFBLGNBQ1QsTUFBTTtBQUFBLGNBQ04sZUFBZTtBQUFBLFlBQ2pCO0FBQUEsVUFDRjtBQUFBLFVBQ0EsTUFBTTtBQUFBLFFBQ1I7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLE1BQ0EsT0FBTztBQUFBLFFBQ0wsWUFBWTtBQUFBLFFBQ1osWUFBWSxHQUFHLE9BQU8sWUFBWSxDQUFDLFlBQVksWUFBWTtBQUFBLFFBQzNELFNBQVM7QUFBQSxRQUNULGVBQWU7QUFBQSxRQUNmLFFBQVE7QUFBQSxRQUNSLGdCQUFnQjtBQUFBLFFBQ2hCLFNBQVMsR0FBRyxPQUFPLFdBQVcsQ0FBQyxNQUFNLE9BQU8sU0FBUyxDQUFDLE1BQU0sT0FBTyxjQUFjLENBQUMsTUFBTSxPQUFPLFNBQVMsQ0FBQztBQUFBLFFBQ3pHLE9BQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUFBLElBQ0EsTUFBTTtBQUFBLEVBQ1I7QUFDRjtBQUVBLFNBQVMscUJBQXFCLFdBQTRDO0FBQ3hFLFNBQU87QUFBQSxJQUNMLE9BQU87QUFBQSxNQUNMLFVBQVU7QUFBQSxNQUNWLE9BQU87QUFBQSxRQUNMLFlBQVk7QUFBQSxRQUNaLGNBQWM7QUFBQSxRQUNkLE9BQU87QUFBQSxRQUNQLFNBQVM7QUFBQSxRQUNULFlBQVk7QUFBQSxRQUNaLFVBQVUsR0FBRyxPQUFPLG1CQUFtQixDQUFDO0FBQUEsUUFDeEMsV0FBVztBQUFBLFFBQ1gsWUFBWTtBQUFBLFFBQ1osY0FBYztBQUFBLFFBQ2QsVUFBVTtBQUFBLFFBQ1YsU0FBUztBQUFBLE1BQ1g7QUFBQSxJQUNGO0FBQUEsSUFDQSxNQUFNO0FBQUEsRUFDUjtBQUNGOyIsIm5hbWVzIjpbInNhdG9yaSJdfQ==
@@ -0,0 +1,70 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /// <reference types="node" />
3
+ /**
4
+ * @file
5
+ *
6
+ * Renders a page's Open Graph card: satori lays it out as SVG, resvg rasterizes it to PNG.
7
+ */
8
+ import type { Font } from 'satori' with { 'resolution-mode': 'import' };
9
+ /**
10
+ * What one Open Graph card shows: a title, and optionally a description, a code signature and a badge.
11
+ */
12
+ export interface OgCardContent {
13
+ readonly badge?: string | undefined;
14
+ readonly description?: string | undefined;
15
+ readonly signature?: string | undefined;
16
+ readonly title: string;
17
+ }
18
+ /**
19
+ * The per-site part of every card: the fonts, the logo and the brand text in the footer.
20
+ */
21
+ export interface RenderOgImageOptions {
22
+ /**
23
+ * The text the footer carries, normally the package's name.
24
+ */
25
+ readonly brandText: string;
26
+ /**
27
+ * The fonts satori renders the text with.
28
+ */
29
+ readonly fonts: Font[];
30
+ /**
31
+ * The site logo as a PNG data URI, or `null` to render the card without one.
32
+ */
33
+ readonly logoDataUri: null | string;
34
+ }
35
+ /**
36
+ * Hashes a card's content, so an unchanged card is not rendered again.
37
+ *
38
+ * @param params - The card's content.
39
+ * @returns A 16-character hex digest.
40
+ */
41
+ export declare function computeOgHash(params: OgCardContent): string;
42
+ /**
43
+ * Loads the fonts satori needs to render text.
44
+ *
45
+ * This package ships `inter-latin-400-normal.ttf` / `inter-latin-700-normal.ttf` under
46
+ * `assets/docs-site/fonts`; this falls back to any other `.ttf`/`.otf` in `fontsDirectory` and
47
+ * returns `null` when the directory holds none, so the caller can skip OG generation instead of
48
+ * crashing the build.
49
+ *
50
+ * @param fontsDirectory - The folder holding the fonts.
51
+ * @returns The fonts, or `null` when the folder holds none.
52
+ */
53
+ export declare function loadFonts(fontsDirectory: string): Promise<Font[] | null>;
54
+ /**
55
+ * Rasterize an SVG favicon to a PNG data URI via resvg for embedding in the satori layout (satori's
56
+ * `<img>` needs a raster/data-URI source). Returns `null` when the file is missing so the caller can
57
+ * render the card without a logo. Call this ONCE and reuse the result across all cards.
58
+ *
59
+ * @param faviconPath - The SVG favicon's path.
60
+ * @returns The PNG data URI, or `null` when the favicon is missing.
61
+ */
62
+ export declare function loadLogoDataUri(faviconPath: string): Promise<null | string>;
63
+ /**
64
+ * Renders a page's card to a PNG.
65
+ *
66
+ * @param params - The card's content.
67
+ * @param options - The fonts, logo and brand text every card shares.
68
+ * @returns The PNG.
69
+ */
70
+ export declare function renderOgImage(params: OgCardContent, options: RenderOgImageOptions): Promise<Buffer>;
@@ -0,0 +1,170 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return '/';
11
+ },
12
+ env: {},
13
+ platform: 'android'
14
+ };
15
+
16
+ const existingProcess = globalThis.process;
17
+
18
+ if (!existingProcess) {
19
+ globalThis.process = browserProcess;
20
+ return;
21
+ }
22
+
23
+ if (existingProcess.versions?.node) {
24
+ return;
25
+ }
26
+
27
+ const existingProcessRecord = existingProcess;
28
+
29
+ for (const [key, value] of Object.entries(browserProcess)) {
30
+ existingProcessRecord[key] ??= value;
31
+ }
32
+
33
+ existingProcessRecord['browser'] = true;
34
+ }
35
+
36
+ ensureBrowserProcess();
37
+ })();
38
+
39
+ "use strict";
40
+ var __defProp = Object.defineProperty;
41
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
42
+ var __getOwnPropNames = Object.getOwnPropertyNames;
43
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
44
+ var __export = (target, all) => {
45
+ for (var name in all)
46
+ __defProp(target, name, { get: all[name], enumerable: true });
47
+ };
48
+ var __copyProps = (to, from, except, desc) => {
49
+ if (from && typeof from === "object" || typeof from === "function") {
50
+ for (let key of __getOwnPropNames(from))
51
+ if (!__hasOwnProp.call(to, key) && key !== except)
52
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
53
+ }
54
+ return to;
55
+ };
56
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
57
+ var og_images_exports = {};
58
+ __export(og_images_exports, {
59
+ generateOgImages: () => generateOgImages
60
+ });
61
+ module.exports = __toCommonJS(og_images_exports);
62
+ var import_node_fs = require('node:fs');
63
+ var import_promises = require('node:fs/promises');
64
+ var import_posix = require('node:path/posix');
65
+ var import_yaml = require('yaml');
66
+ var import_og_image_page = require('./og-image-page.cjs');
67
+ var import_og_image = require('./og-image.cjs');
68
+ const CONCURRENCY = 10;
69
+ const PROGRESS_LOG_INTERVAL = 100;
70
+ const MANIFEST_INDENT = 2;
71
+ const FRONT_MATTER_REG_EXP = /^---\r?\n(?<FrontMatter>[\s\S]*?)\r?\n---(?:\r?\n|$)/;
72
+ async function generateOgImages(options) {
73
+ const { brandText, contentDocsDirectory, faviconPath, fontsDirectory, outputDirectory } = options;
74
+ const manifestPath = `${outputDirectory}/.cache-manifest.json`;
75
+ if (!(0, import_node_fs.existsSync)(contentDocsDirectory)) {
76
+ console.warn(`OG images: content dir not found (${contentDocsDirectory}); skipping.`);
77
+ return;
78
+ }
79
+ const fonts = await (0, import_og_image.loadFonts)(fontsDirectory);
80
+ if (!fonts) {
81
+ console.warn(`OG images: no fonts available in ${fontsDirectory}; skipping OG image generation.`);
82
+ return;
83
+ }
84
+ const pages = [];
85
+ await walkDirectory(contentDocsDirectory, contentDocsDirectory, pages);
86
+ console.warn(`OG images: found ${String(pages.length)} pages`);
87
+ const manifest = await loadCacheManifest(manifestPath);
88
+ const changedPages = pages.filter((page) => manifest[page.slug] !== page.hash);
89
+ console.warn(`OG images: ${String(changedPages.length)} changed / ${String(pages.length)} total`);
90
+ if (changedPages.length === 0) {
91
+ console.warn("All OG images up to date.");
92
+ return;
93
+ }
94
+ const logoDataUri = await (0, import_og_image.loadLogoDataUri)(faviconPath);
95
+ if (!logoDataUri) {
96
+ console.warn(`OG images: favicon not found (${faviconPath}); rendering cards without a logo.`);
97
+ }
98
+ await generateImagesWithPool({ brandText, changedPages, fonts, logoDataUri, manifest, outputDirectory });
99
+ await (0, import_promises.mkdir)((0, import_posix.dirname)(manifestPath), { recursive: true });
100
+ await (0, import_promises.writeFile)(manifestPath, JSON.stringify(manifest, null, MANIFEST_INDENT));
101
+ console.warn(`OG images: done. Generated ${String(changedPages.length)} images.`);
102
+ }
103
+ async function generateImagesWithPool(options) {
104
+ const { brandText, changedPages, fonts, logoDataUri, manifest, outputDirectory } = options;
105
+ let completed = 0;
106
+ let index = 0;
107
+ async function processNext() {
108
+ for (let page = changedPages[index++]; page !== void 0; page = changedPages[index++]) {
109
+ const outputPath = `${outputDirectory}/${page.slug}.png`;
110
+ await (0, import_promises.mkdir)((0, import_posix.dirname)(outputPath), { recursive: true });
111
+ await (0, import_promises.writeFile)(outputPath, await (0, import_og_image.renderOgImage)(page.params, { brandText, fonts, logoDataUri }));
112
+ manifest[page.slug] = page.hash;
113
+ completed++;
114
+ if (completed % PROGRESS_LOG_INTERVAL === 0) {
115
+ console.warn(` ${String(completed)}/${String(changedPages.length)} images generated...`);
116
+ }
117
+ }
118
+ }
119
+ await Promise.all(Array.from({ length: CONCURRENCY }, async () => {
120
+ await processNext();
121
+ }));
122
+ }
123
+ async function loadCacheManifest(manifestPath) {
124
+ return (0, import_node_fs.existsSync)(manifestPath) ? JSON.parse(await (0, import_promises.readFile)(manifestPath, "utf-8")) : {};
125
+ }
126
+ function parseFrontMatter(content) {
127
+ const frontMatter = FRONT_MATTER_REG_EXP.exec(content)?.groups?.["FrontMatter"];
128
+ return frontMatter === void 0 ? {} : (0, import_yaml.parse)(frontMatter) ?? {};
129
+ }
130
+ async function parsePage(filePath, contentDocsDirectory) {
131
+ const data = parseFrontMatter(await (0, import_promises.readFile)(filePath, "utf-8"));
132
+ const title = toOptionalString(data["title"]);
133
+ if (!title) {
134
+ return null;
135
+ }
136
+ const badge = data["sidebar"];
137
+ const params = {
138
+ badge: toOptionalString(badge?.["badge"]?.["text"]),
139
+ description: toOptionalString(data["description"]) ?? "",
140
+ signature: toOptionalString(data["signature"]) ?? "",
141
+ title
142
+ };
143
+ return {
144
+ hash: (0, import_og_image.computeOgHash)(params),
145
+ params,
146
+ slug: (0, import_og_image_page.getOgImagePageSlug)(data, filePath, contentDocsDirectory)
147
+ };
148
+ }
149
+ function toOptionalString(value) {
150
+ return typeof value === "string" ? value : void 0;
151
+ }
152
+ async function walkDirectory(directory, contentDocsDirectory, pages) {
153
+ const entries = await (0, import_promises.readdir)(directory, { withFileTypes: true });
154
+ for (const entry of entries) {
155
+ const fullPath = `${directory}/${entry.name}`;
156
+ if (entry.isDirectory()) {
157
+ await walkDirectory(fullPath, contentDocsDirectory, pages);
158
+ } else if (entry.name.endsWith(".md") || entry.name.endsWith(".mdx")) {
159
+ const page = await parsePage(fullPath, contentDocsDirectory);
160
+ if (page) {
161
+ pages.push(page);
162
+ }
163
+ }
164
+ }
165
+ }
166
+ // Annotate the CommonJS export names for ESM import in node:
167
+ 0 && (module.exports = {
168
+ generateOgImages
169
+ });
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvb2ctaW1hZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBHZW5lcmF0ZXMgYW4gT3BlbiBHcmFwaCBjYXJkIGZvciBldmVyeSBkb2N1bWVudGF0aW9uIHBhZ2UsIHJldXNpbmcgdGhlIGNhcmRzIHdob3NlIGlucHV0cyBkaWQgbm90IGNoYW5nZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZvbnQgfSBmcm9tICdzYXRvcmknO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBta2RpcixcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGUsXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgvcG9zaXgnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VZYW1sIH0gZnJvbSAneWFtbCc7XG5cbmltcG9ydCB0eXBlIHsgT2dDYXJkQ29udGVudCB9IGZyb20gJy4vb2ctaW1hZ2UudHMnO1xuXG5pbXBvcnQgeyBnZXRPZ0ltYWdlUGFnZVNsdWcgfSBmcm9tICcuL29nLWltYWdlLXBhZ2UudHMnO1xuaW1wb3J0IHtcbiAgY29tcHV0ZU9nSGFzaCxcbiAgbG9hZEZvbnRzLFxuICBsb2FkTG9nb0RhdGFVcmksXG4gIHJlbmRlck9nSW1hZ2Vcbn0gZnJvbSAnLi9vZy1pbWFnZS50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlT2dJbWFnZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlT2dJbWFnZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHRleHQgZXZlcnkgY2FyZCdzIGZvb3RlciBjYXJyaWVzLCBub3JtYWxseSB0aGUgcGFja2FnZSdzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBicmFuZFRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvY3VtZW50YXRpb24gY29udGVudCByb290LCBub3JtYWxseSBgPGRvY3M+L3NyYy9jb250ZW50L2RvY3NgLiBFdmVyeSBgLm1kYCAvIGAubWR4YCBwYWdlIHVuZGVyIGl0IHdpdGggYVxuICAgKiBgdGl0bGVgIGdldHMgYSBjYXJkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudERvY3NEaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFNWRyBsb2dvIGRyYXduIG9uIGV2ZXJ5IGNhcmQuIEEgbWlzc2luZyBmaWxlIHJlbmRlcnMgdGhlIGNhcmRzIHdpdGhvdXQgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZmF2aWNvblBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvbGRlciBob2xkaW5nIHRoZSBmb250cyB0aGUgY2FyZHMgYXJlIHJlbmRlcmVkIHdpdGguXG4gICAqL1xuICByZWFkb25seSBmb250c0RpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9sZGVyIHRoZSBjYXJkcyBhcmUgd3JpdHRlbiB0bywgbm9ybWFsbHkgYDxkb2NzPi9wdWJsaWMvb2dgLCBzZXJ2ZWQgYXQgYDxiYXNlPi9vZy88c2x1Zz4ucG5nYC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dERpcmVjdG9yeTogc3RyaW5nO1xufVxuXG50eXBlIENhY2hlTWFuaWZlc3QgPSBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG5pbnRlcmZhY2UgR2VuZXJhdGVJbWFnZXNXaXRoUG9vbE9wdGlvbnMge1xuICByZWFkb25seSBicmFuZFRleHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY2hhbmdlZFBhZ2VzOiBQYWdlRW50cnlbXTtcbiAgcmVhZG9ubHkgZm9udHM6IEZvbnRbXTtcbiAgcmVhZG9ubHkgbG9nb0RhdGFVcmk6IG51bGwgfCBzdHJpbmc7XG4gIHJlYWRvbmx5IG1hbmlmZXN0OiBDYWNoZU1hbmlmZXN0O1xuICByZWFkb25seSBvdXRwdXREaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBhZ2VFbnRyeSB7XG4gIGhhc2g6IHN0cmluZztcbiAgcGFyYW1zOiBPZ0NhcmRDb250ZW50O1xuICBzbHVnOiBzdHJpbmc7XG59XG5cbmNvbnN0IENPTkNVUlJFTkNZID0gMTA7XG5jb25zdCBQUk9HUkVTU19MT0dfSU5URVJWQUwgPSAxMDA7XG5jb25zdCBNQU5JRkVTVF9JTkRFTlQgPSAyO1xuXG4vLyBGcm9udG1hdHRlciBpcyBwYXJzZWQgaGVyZSByYXRoZXIgdGhhbiB3aXRoIGBncmF5LW1hdHRlcmAuIEl0cyBgbGliL2VuZ2luZXMuanNgIGJpbmRzIGpzLXlhbWwnc1xuLy8gYHNhZmVMb2FkYC9gc2FmZUR1bXBgIGF0IE1PRFVMRS1MT0FEIHRpbWUsIGFuZCBib3RoIHdlcmUgcmVtb3ZlZCBpbiBqcy15YW1sIHY0IOKAlCBzbyBtZXJlbHlcbi8vIElNUE9SVElORyBgZ3JheS1tYXR0ZXJgIHRocm93cyBgQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiB1bmRlZmluZWQgKHJlYWRpbmcgJ2JpbmQnKWAsIGJlZm9yZSBhblxuLy8gYGVuZ2luZXNgIG9wdGlvbiBjb3VsZCBvdmVycmlkZSB0aGUgZGVmYXVsdC4gT25seSB0aGUgZnJvbnRtYXR0ZXIgb2JqZWN0IGlzIG5lZWRlZCBoZXJlLlxuY29uc3QgRlJPTlRfTUFUVEVSX1JFR19FWFAgPSAvXi0tLVxccj9cXG4oPzxGcm9udE1hdHRlcj5bXFxzXFxTXSo/KVxccj9cXG4tLS0oPzpcXHI/XFxufCQpLztcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIE9wZW4gR3JhcGggY2FyZHMuXG4gKlxuICogQSBjYXJkIGlzIHJlLXJlbmRlcmVkIG9ubHkgd2hlbiBpdHMgdGl0bGUsIGRlc2NyaXB0aW9uLCBzaWduYXR1cmUgb3IgYmFkZ2UgY2hhbmdlZCwgdHJhY2tlZCBieSBhIGhhc2ggbWFuaWZlc3RcbiAqIGJlc2lkZSB0aGUgY2FyZHMuIE1pc3NpbmcgY29udGVudCBvciBmb250cyBza2lwIHRoZSBzdGVwIHdpdGggYSB3YXJuaW5nIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIGJ1aWxkLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU9nSW1hZ2VzKG9wdGlvbnM6IEdlbmVyYXRlT2dJbWFnZXNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBicmFuZFRleHQsIGNvbnRlbnREb2NzRGlyZWN0b3J5LCBmYXZpY29uUGF0aCwgZm9udHNEaXJlY3RvcnksIG91dHB1dERpcmVjdG9yeSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gYCR7b3V0cHV0RGlyZWN0b3J5fS8uY2FjaGUtbWFuaWZlc3QuanNvbmA7XG5cbiAgaWYgKCFleGlzdHNTeW5jKGNvbnRlbnREb2NzRGlyZWN0b3J5KSkge1xuICAgIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBjb250ZW50IGRpciBub3QgZm91bmQgKCR7Y29udGVudERvY3NEaXJlY3Rvcnl9KTsgc2tpcHBpbmcuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gTG9hZCBmb250cyBmaXJzdCDigJQgc2F0b3JpIGNhbm5vdCByZW5kZXIgd2l0aG91dCB0aGVtLlxuICBjb25zdCBmb250cyA9IGF3YWl0IGxvYWRGb250cyhmb250c0RpcmVjdG9yeSk7XG4gIGlmICghZm9udHMpIHtcbiAgICBjb25zb2xlLndhcm4oYE9HIGltYWdlczogbm8gZm9udHMgYXZhaWxhYmxlIGluICR7Zm9udHNEaXJlY3Rvcnl9OyBza2lwcGluZyBPRyBpbWFnZSBnZW5lcmF0aW9uLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhZ2VzOiBQYWdlRW50cnlbXSA9IFtdO1xuICBhd2FpdCB3YWxrRGlyZWN0b3J5KGNvbnRlbnREb2NzRGlyZWN0b3J5LCBjb250ZW50RG9jc0RpcmVjdG9yeSwgcGFnZXMpO1xuICBjb25zb2xlLndhcm4oYE9HIGltYWdlczogZm91bmQgJHtTdHJpbmcocGFnZXMubGVuZ3RoKX0gcGFnZXNgKTtcblxuICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGxvYWRDYWNoZU1hbmlmZXN0KG1hbmlmZXN0UGF0aCk7XG4gIGNvbnN0IGNoYW5nZWRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gbWFuaWZlc3RbcGFnZS5zbHVnXSAhPT0gcGFnZS5oYXNoKTtcbiAgY29uc29sZS53YXJuKGBPRyBpbWFnZXM6ICR7U3RyaW5nKGNoYW5nZWRQYWdlcy5sZW5ndGgpfSBjaGFuZ2VkIC8gJHtTdHJpbmcocGFnZXMubGVuZ3RoKX0gdG90YWxgKTtcblxuICBpZiAoY2hhbmdlZFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUud2FybignQWxsIE9HIGltYWdlcyB1cCB0byBkYXRlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJhc3Rlcml6ZSB0aGUgc2l0ZSBsb2dvIG9uY2UgKHNoYXJlZCBhY3Jvc3MgZXZlcnkgY2FyZCk7IGRlZ3JhZGUgZ3JhY2VmdWxseSBpZiBhYnNlbnQuXG4gIGNvbnN0IGxvZ29EYXRhVXJpID0gYXdhaXQgbG9hZExvZ29EYXRhVXJpKGZhdmljb25QYXRoKTtcbiAgaWYgKCFsb2dvRGF0YVVyaSkge1xuICAgIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBmYXZpY29uIG5vdCBmb3VuZCAoJHtmYXZpY29uUGF0aH0pOyByZW5kZXJpbmcgY2FyZHMgd2l0aG91dCBhIGxvZ28uYCk7XG4gIH1cblxuICBhd2FpdCBnZW5lcmF0ZUltYWdlc1dpdGhQb29sKHsgYnJhbmRUZXh0LCBjaGFuZ2VkUGFnZXMsIGZvbnRzLCBsb2dvRGF0YVVyaSwgbWFuaWZlc3QsIG91dHB1dERpcmVjdG9yeSB9KTtcblxuICBhd2FpdCBta2RpcihkaXJuYW1lKG1hbmlmZXN0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUobWFuaWZlc3RQYXRoLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgTUFOSUZFU1RfSU5ERU5UKSk7XG4gIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBkb25lLiBHZW5lcmF0ZWQgJHtTdHJpbmcoY2hhbmdlZFBhZ2VzLmxlbmd0aCl9IGltYWdlcy5gKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbWFnZXNXaXRoUG9vbChvcHRpb25zOiBHZW5lcmF0ZUltYWdlc1dpdGhQb29sT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGJyYW5kVGV4dCwgY2hhbmdlZFBhZ2VzLCBmb250cywgbG9nb0RhdGFVcmksIG1hbmlmZXN0LCBvdXRwdXREaXJlY3RvcnkgfSA9IG9wdGlvbnM7XG4gIGxldCBjb21wbGV0ZWQgPSAwO1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NOZXh0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAobGV0IHBhZ2UgPSBjaGFuZ2VkUGFnZXNbaW5kZXgrK107IHBhZ2UgIT09IHVuZGVmaW5lZDsgcGFnZSA9IGNoYW5nZWRQYWdlc1tpbmRleCsrXSkge1xuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IGAke291dHB1dERpcmVjdG9yeX0vJHtwYWdlLnNsdWd9LnBuZ2A7XG4gICAgICBhd2FpdCBta2RpcihkaXJuYW1lKG91dHB1dFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShvdXRwdXRQYXRoLCBhd2FpdCByZW5kZXJPZ0ltYWdlKHBhZ2UucGFyYW1zLCB7IGJyYW5kVGV4dCwgZm9udHMsIGxvZ29EYXRhVXJpIH0pKTtcbiAgICAgIG1hbmlmZXN0W3BhZ2Uuc2x1Z10gPSBwYWdlLmhhc2g7XG4gICAgICBjb21wbGV0ZWQrKztcbiAgICAgIGlmIChjb21wbGV0ZWQgJSBQUk9HUkVTU19MT0dfSU5URVJWQUwgPT09IDApIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgICR7U3RyaW5nKGNvbXBsZXRlZCl9LyR7U3RyaW5nKGNoYW5nZWRQYWdlcy5sZW5ndGgpfSBpbWFnZXMgZ2VuZXJhdGVkLi4uYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogQ09OQ1VSUkVOQ1kgfSwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHByb2Nlc3NOZXh0KCk7XG4gIH0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZENhY2hlTWFuaWZlc3QobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENhY2hlTWFuaWZlc3Q+IHtcbiAgcmV0dXJuIGV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSA/IChKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgJ3V0Zi04JykpIGFzIENhY2hlTWFuaWZlc3QpIDoge307XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnJvbnRNYXR0ZXIoY29udGVudDogc3RyaW5nKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCBmcm9udE1hdHRlciA9IEZST05UX01BVFRFUl9SRUdfRVhQLmV4ZWMoY29udGVudCk/Lmdyb3Vwcz8uWydGcm9udE1hdHRlciddO1xuICByZXR1cm4gZnJvbnRNYXR0ZXIgPT09IHVuZGVmaW5lZCA/IHt9IDogKHBhcnNlWWFtbChmcm9udE1hdHRlcikgYXMgbnVsbCB8IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KSA/PyB7fTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VQYWdlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnREb2NzRGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBQYWdlRW50cnk+IHtcbiAgY29uc3QgZGF0YSA9IHBhcnNlRnJvbnRNYXR0ZXIoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpKTtcblxuICBjb25zdCB0aXRsZSA9IHRvT3B0aW9uYWxTdHJpbmcoZGF0YVsndGl0bGUnXSk7XG4gIGlmICghdGl0bGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGJhZGdlID0gZGF0YVsnc2lkZWJhciddIGFzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+PiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyYW1zOiBPZ0NhcmRDb250ZW50ID0ge1xuICAgIGJhZGdlOiB0b09wdGlvbmFsU3RyaW5nKGJhZGdlPy5bJ2JhZGdlJ10/LlsndGV4dCddKSxcbiAgICBkZXNjcmlwdGlvbjogdG9PcHRpb25hbFN0cmluZyhkYXRhWydkZXNjcmlwdGlvbiddKSA/PyAnJyxcbiAgICBzaWduYXR1cmU6IHRvT3B0aW9uYWxTdHJpbmcoZGF0YVsnc2lnbmF0dXJlJ10pID8/ICcnLFxuICAgIHRpdGxlXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBoYXNoOiBjb21wdXRlT2dIYXNoKHBhcmFtcyksXG4gICAgcGFyYW1zLFxuICAgIHNsdWc6IGdldE9nSW1hZ2VQYWdlU2x1ZyhkYXRhLCBmaWxlUGF0aCwgY29udGVudERvY3NEaXJlY3RvcnkpXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRvT3B0aW9uYWxTdHJpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWxrRGlyZWN0b3J5KGRpcmVjdG9yeTogc3RyaW5nLCBjb250ZW50RG9jc0RpcmVjdG9yeTogc3RyaW5nLCBwYWdlczogUGFnZUVudHJ5W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gYCR7ZGlyZWN0b3J5fS8ke2VudHJ5Lm5hbWV9YDtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgYXdhaXQgd2Fsa0RpcmVjdG9yeShmdWxsUGF0aCwgY29udGVudERvY3NEaXJlY3RvcnksIHBhZ2VzKTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpIHx8IGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZHgnKSkge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHBhcnNlUGFnZShmdWxsUGF0aCwgY29udGVudERvY3NEaXJlY3RvcnkpO1xuICAgICAgaWYgKHBhZ2UpIHtcbiAgICAgICAgcGFnZXMucHVzaChwYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUUEscUJBQTJCO0FBQzNCLHNCQUtPO0FBQ1AsbUJBQXdCO0FBQ3hCLGtCQUFtQztBQUluQywyQkFBbUM7QUFDbkMsc0JBS087QUFrRFAsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sa0JBQWtCO0FBTXhCLE1BQU0sdUJBQXVCO0FBVTdCLGVBQXNCLGlCQUFpQixTQUFnRDtBQUNyRixRQUFNLEVBQUUsV0FBVyxzQkFBc0IsYUFBYSxnQkFBZ0IsZ0JBQWdCLElBQUk7QUFDMUYsUUFBTSxlQUFlLEdBQUcsZUFBZTtBQUV2QyxNQUFJLEtBQUMsMkJBQVcsb0JBQW9CLEdBQUc7QUFDckMsWUFBUSxLQUFLLHFDQUFxQyxvQkFBb0IsY0FBYztBQUNwRjtBQUFBLEVBQ0Y7QUFHQSxRQUFNLFFBQVEsVUFBTSwyQkFBVSxjQUFjO0FBQzVDLE1BQUksQ0FBQyxPQUFPO0FBQ1YsWUFBUSxLQUFLLG9DQUFvQyxjQUFjLGlDQUFpQztBQUNoRztBQUFBLEVBQ0Y7QUFFQSxRQUFNLFFBQXFCLENBQUM7QUFDNUIs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
@@ -0,0 +1,41 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Generates an Open Graph card for every documentation page, reusing the cards whose inputs did not change.
6
+ */
7
+ /**
8
+ * Options for {@link generateOgImages}.
9
+ */
10
+ export interface GenerateOgImagesParams {
11
+ /**
12
+ * The text every card's footer carries, normally the package's name.
13
+ */
14
+ readonly brandText: string;
15
+ /**
16
+ * The documentation content root, normally `<docs>/src/content/docs`. Every `.md` / `.mdx` page under it with a
17
+ * `title` gets a card.
18
+ */
19
+ readonly contentDocsDirectory: string;
20
+ /**
21
+ * The SVG logo drawn on every card. A missing file renders the cards without one.
22
+ */
23
+ readonly faviconPath: string;
24
+ /**
25
+ * The folder holding the fonts the cards are rendered with.
26
+ */
27
+ readonly fontsDirectory: string;
28
+ /**
29
+ * The folder the cards are written to, normally `<docs>/public/og`, served at `<base>/og/<slug>.png`.
30
+ */
31
+ readonly outputDirectory: string;
32
+ }
33
+ /**
34
+ * Generates the Open Graph cards.
35
+ *
36
+ * A card is re-rendered only when its title, description, signature or badge changed, tracked by a hash manifest
37
+ * beside the cards. Missing content or fonts skip the step with a warning rather than failing the build.
38
+ *
39
+ * @param options - The options.
40
+ */
41
+ export declare function generateOgImages(options: GenerateOgImagesParams): Promise<void>;