@mnaoumov/typescript-dev-toolkit 1.3.1 → 2.1.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.
- package/README.md +4 -0
- package/assets/docs-site/components/ConstructorBlock.astro +16 -0
- package/assets/docs-site/components/ImportStatement.astro +12 -0
- package/assets/docs-site/components/MemberDetail.astro +101 -0
- package/assets/docs-site/components/MethodTable.astro +45 -0
- package/assets/docs-site/components/PropertyTable.astro +45 -0
- package/assets/docs-site/components/SiteTitle.astro +43 -0
- package/assets/docs-site/components/TypeSignature.astro +20 -0
- package/assets/docs-site/fonts/inter-latin-400-normal.ttf +0 -0
- package/assets/docs-site/fonts/inter-latin-700-normal.ttf +0 -0
- package/assets/docs-site/styles/global.css +221 -0
- package/dist/lib/cjs/build.cjs +1 -1
- package/dist/lib/cjs/build.d.cts +1 -1
- package/dist/lib/cjs/commitlint-config.cjs +18 -3
- package/dist/lib/cjs/commitlint-config.d.cts +6 -0
- package/dist/lib/cjs/commitlint-forbidden-patterns.cjs +2 -2
- package/dist/lib/cjs/commitlint-forbidden-patterns.d.cts +1 -1
- package/dist/lib/cjs/commitlint-spellcheck-header.cjs +2 -2
- package/dist/lib/cjs/commitlint-spellcheck-header.d.cts +1 -1
- package/dist/lib/cjs/docs-site/api-doc-constants.cjs +171 -0
- package/dist/lib/cjs/docs-site/api-doc-constants.d.cts +18 -0
- package/dist/lib/cjs/docs-site/api-doc-jsdoc.cjs +414 -0
- package/dist/lib/cjs/docs-site/api-doc-jsdoc.d.cts +149 -0
- package/dist/lib/cjs/docs-site/api-doc-link-rendering.cjs +377 -0
- package/dist/lib/cjs/docs-site/api-doc-link-rendering.d.cts +185 -0
- package/dist/lib/cjs/docs-site/api-doc-package-sites.cjs +118 -0
- package/dist/lib/cjs/docs-site/api-doc-package-sites.d.cts +36 -0
- package/dist/lib/cjs/docs-site/api-doc-page-generation.cjs +561 -0
- package/dist/lib/cjs/docs-site/api-doc-page-generation.d.cts +159 -0
- package/dist/lib/cjs/docs-site/api-doc-route-segments.cjs +42 -0
- package/dist/lib/cjs/docs-site/api-doc-route-segments.d.cts +25 -0
- package/dist/lib/cjs/docs-site/api-doc-settings.cjs +47 -0
- package/dist/lib/cjs/docs-site/api-doc-settings.d.cts +53 -0
- package/dist/lib/cjs/docs-site/api-doc-source-processing.cjs +288 -0
- package/dist/lib/cjs/docs-site/api-doc-source-processing.d.cts +75 -0
- package/dist/lib/cjs/docs-site/api-doc-text-utils.cjs +281 -0
- package/dist/lib/cjs/docs-site/api-doc-text-utils.d.cts +178 -0
- package/dist/lib/cjs/docs-site/api-doc-type-merging.cjs +157 -0
- package/dist/lib/cjs/docs-site/api-doc-type-merging.d.cts +51 -0
- package/dist/lib/cjs/docs-site/api-doc-types.cjs +22 -0
- package/dist/lib/cjs/docs-site/api-doc-types.d.cts +157 -0
- package/dist/lib/cjs/docs-site/api-docs.cjs +143 -0
- package/dist/lib/cjs/docs-site/api-docs.d.cts +34 -0
- package/dist/lib/cjs/docs-site/astro-config.cjs +169 -0
- package/dist/lib/cjs/docs-site/astro-config.d.cts +23 -0
- package/dist/lib/cjs/docs-site/docs-links.cjs +123 -0
- package/dist/lib/cjs/docs-site/docs-links.d.cts +32 -0
- package/dist/lib/cjs/docs-site/docs-site-assets.cjs +64 -0
- package/dist/lib/cjs/docs-site/docs-site-assets.d.cts +23 -0
- package/dist/lib/cjs/docs-site/docs-site-commands.cjs +72 -0
- package/dist/lib/cjs/docs-site/docs-site-commands.d.cts +29 -0
- package/dist/lib/cjs/docs-site/docs-site-config.cjs +122 -0
- package/dist/lib/cjs/docs-site/docs-site-config.d.cts +162 -0
- package/dist/lib/cjs/docs-site/index.cjs +116 -0
- package/dist/lib/cjs/docs-site/index.d.cts +26 -0
- package/dist/lib/cjs/docs-site/link-check.cjs +197 -0
- package/dist/lib/cjs/docs-site/link-check.d.cts +163 -0
- package/dist/lib/cjs/docs-site/og-image-page.cjs +45 -0
- package/dist/lib/cjs/docs-site/og-image-page.d.cts +15 -0
- package/dist/lib/cjs/docs-site/og-image.cjs +326 -0
- package/dist/lib/cjs/docs-site/og-image.d.cts +70 -0
- package/dist/lib/cjs/docs-site/og-images.cjs +170 -0
- package/dist/lib/cjs/docs-site/og-images.d.cts +41 -0
- package/dist/lib/cjs/docs-site/route-data.cjs +47 -0
- package/dist/lib/cjs/docs-site/route-data.d.cts +14 -0
- package/dist/lib/cjs/docs-site/satteri-github-alerts.cjs +97 -0
- package/dist/lib/cjs/docs-site/satteri-github-alerts.d.cts +31 -0
- package/dist/lib/cjs/docs-site/satteri-relative-links.cjs +87 -0
- package/dist/lib/cjs/docs-site/satteri-relative-links.d.cts +29 -0
- package/dist/lib/cjs/docs-site/unrendered-alerts.cjs +51 -0
- package/dist/lib/cjs/docs-site/unrendered-alerts.d.cts +38 -0
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/library-build.cjs +1 -1
- package/dist/lib/cjs/library-build.d.cts +2 -2
- package/dist/lib/cjs/linters/eslint-config.cjs +17 -17
- package/dist/lib/cjs/linters/eslint-config.d.cts +1 -7
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +2 -2
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.d.cts +5 -8
- package/dist/lib/cjs/package-manager.cjs +2 -2
- package/dist/lib/esm/build.d.mts +1 -1
- package/dist/lib/esm/build.mjs +1 -1
- package/dist/lib/esm/commitlint-config.d.mts +6 -0
- package/dist/lib/esm/commitlint-config.mjs +7 -3
- package/dist/lib/esm/commitlint-forbidden-patterns.d.mts +1 -1
- package/dist/lib/esm/commitlint-forbidden-patterns.mjs +2 -2
- package/dist/lib/esm/commitlint-spellcheck-header.d.mts +1 -1
- package/dist/lib/esm/commitlint-spellcheck-header.mjs +2 -2
- package/dist/lib/esm/docs-site/api-doc-constants.d.mts +18 -0
- package/dist/lib/esm/docs-site/api-doc-constants.mjs +143 -0
- package/dist/lib/esm/docs-site/api-doc-jsdoc.d.mts +149 -0
- package/dist/lib/esm/docs-site/api-doc-jsdoc.mjs +377 -0
- package/dist/lib/esm/docs-site/api-doc-link-rendering.d.mts +185 -0
- package/dist/lib/esm/docs-site/api-doc-link-rendering.mjs +356 -0
- package/dist/lib/esm/docs-site/api-doc-package-sites.d.mts +36 -0
- package/dist/lib/esm/docs-site/api-doc-package-sites.mjs +91 -0
- package/dist/lib/esm/docs-site/api-doc-page-generation.d.mts +159 -0
- package/dist/lib/esm/docs-site/api-doc-page-generation.mjs +548 -0
- package/dist/lib/esm/docs-site/api-doc-route-segments.d.mts +25 -0
- package/dist/lib/esm/docs-site/api-doc-route-segments.mjs +17 -0
- package/dist/lib/esm/docs-site/api-doc-settings.d.mts +53 -0
- package/dist/lib/esm/docs-site/api-doc-settings.mjs +22 -0
- package/dist/lib/esm/docs-site/api-doc-source-processing.d.mts +75 -0
- package/dist/lib/esm/docs-site/api-doc-source-processing.mjs +274 -0
- package/dist/lib/esm/docs-site/api-doc-text-utils.d.mts +178 -0
- package/dist/lib/esm/docs-site/api-doc-text-utils.mjs +239 -0
- package/dist/lib/esm/docs-site/api-doc-type-merging.d.mts +51 -0
- package/dist/lib/esm/docs-site/api-doc-type-merging.mjs +129 -0
- package/dist/lib/esm/docs-site/api-doc-types.d.mts +157 -0
- package/dist/lib/esm/docs-site/api-doc-types.mjs +6 -0
- package/dist/lib/esm/docs-site/api-docs.d.mts +34 -0
- package/dist/lib/esm/docs-site/api-docs.mjs +139 -0
- package/dist/lib/esm/docs-site/astro-config.d.mts +23 -0
- package/dist/lib/esm/docs-site/astro-config.mjs +135 -0
- package/dist/lib/esm/docs-site/docs-links.d.mts +32 -0
- package/dist/lib/esm/docs-site/docs-links.mjs +113 -0
- package/dist/lib/esm/docs-site/docs-site-assets.d.mts +23 -0
- package/dist/lib/esm/docs-site/docs-site-assets.mjs +32 -0
- package/dist/lib/esm/docs-site/docs-site-commands.d.mts +29 -0
- package/dist/lib/esm/docs-site/docs-site-commands.mjs +46 -0
- package/dist/lib/esm/docs-site/docs-site-config.d.mts +162 -0
- package/dist/lib/esm/docs-site/docs-site-config.mjs +98 -0
- package/dist/lib/esm/docs-site/index.d.mts +26 -0
- package/dist/lib/esm/docs-site/index.mjs +58 -0
- package/dist/lib/esm/docs-site/link-check.d.mts +163 -0
- package/dist/lib/esm/docs-site/link-check.mjs +166 -0
- package/dist/lib/esm/docs-site/og-image-page.d.mts +15 -0
- package/dist/lib/esm/docs-site/og-image-page.mjs +21 -0
- package/dist/lib/esm/docs-site/og-image.d.mts +70 -0
- package/dist/lib/esm/docs-site/og-image.mjs +292 -0
- package/dist/lib/esm/docs-site/og-images.d.mts +41 -0
- package/dist/lib/esm/docs-site/og-images.mjs +156 -0
- package/dist/lib/esm/docs-site/route-data.d.mts +14 -0
- package/dist/lib/esm/docs-site/route-data.mjs +23 -0
- package/dist/lib/esm/docs-site/satteri-github-alerts.d.mts +31 -0
- package/dist/lib/esm/docs-site/satteri-github-alerts.mjs +72 -0
- package/dist/lib/esm/docs-site/satteri-relative-links.d.mts +29 -0
- package/dist/lib/esm/docs-site/satteri-relative-links.mjs +63 -0
- package/dist/lib/esm/docs-site/unrendered-alerts.d.mts +38 -0
- package/dist/lib/esm/docs-site/unrendered-alerts.mjs +26 -0
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/library-build.d.mts +2 -2
- package/dist/lib/esm/library-build.mjs +1 -1
- package/dist/lib/esm/linters/eslint-config.d.mts +1 -7
- package/dist/lib/esm/linters/eslint-config.mjs +17 -17
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.d.mts +5 -8
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +2 -2
- package/dist/lib/esm/package-manager.mjs +2 -2
- package/docs-site/api-doc-constants/package.json +6 -0
- package/docs-site/api-doc-jsdoc/package.json +6 -0
- package/docs-site/api-doc-link-rendering/package.json +6 -0
- package/docs-site/api-doc-package-sites/package.json +6 -0
- package/docs-site/api-doc-page-generation/package.json +6 -0
- package/docs-site/api-doc-route-segments/package.json +6 -0
- package/docs-site/api-doc-settings/package.json +6 -0
- package/docs-site/api-doc-source-processing/package.json +6 -0
- package/docs-site/api-doc-text-utils/package.json +6 -0
- package/docs-site/api-doc-type-merging/package.json +6 -0
- package/docs-site/api-doc-types/package.json +6 -0
- package/docs-site/api-docs/package.json +6 -0
- package/docs-site/astro-config/package.json +6 -0
- package/docs-site/docs-links/package.json +6 -0
- package/docs-site/docs-site-assets/package.json +6 -0
- package/docs-site/docs-site-commands/package.json +6 -0
- package/docs-site/docs-site-config/package.json +6 -0
- package/docs-site/index/package.json +6 -0
- package/docs-site/link-check/package.json +6 -0
- package/docs-site/og-image/package.json +6 -0
- package/docs-site/og-image-page/package.json +6 -0
- package/docs-site/og-images/package.json +6 -0
- package/docs-site/package.json +6 -0
- package/docs-site/route-data/package.json +6 -0
- package/docs-site/satteri-github-alerts/package.json +6 -0
- package/docs-site/satteri-relative-links/package.json +6 -0
- package/docs-site/unrendered-alerts/package.json +6 -0
- package/package.json +75 -5
|
@@ -0,0 +1,292 @@
|
|
|
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
|
+
import { Resvg } from "@resvg/resvg-js";
|
|
40
|
+
import { createHash } from "node:crypto";
|
|
41
|
+
import { existsSync } from "node:fs";
|
|
42
|
+
import {
|
|
43
|
+
readdir,
|
|
44
|
+
readFile
|
|
45
|
+
} from "node:fs/promises";
|
|
46
|
+
import satori from "satori";
|
|
47
|
+
const OG_WIDTH = 1200;
|
|
48
|
+
const OG_HEIGHT = 630;
|
|
49
|
+
const BACKGROUND_COLOR = "#111213";
|
|
50
|
+
const ACCENT_COLOR = "#8b6ff5";
|
|
51
|
+
const ACCENT_BG = "rgba(103, 172, 172, 0.18)";
|
|
52
|
+
const TITLE_COLOR = "#ffffff";
|
|
53
|
+
const DESCRIPTION_COLOR = "#9CA3AF";
|
|
54
|
+
const BRAND_COLOR = "#8b6ff5";
|
|
55
|
+
const BORDER_WIDTH = 8;
|
|
56
|
+
const PADDING_X = 80;
|
|
57
|
+
const PADDING_TOP = 70;
|
|
58
|
+
const PADDING_BOTTOM = 60;
|
|
59
|
+
const TITLE_FONT_SIZE = 56;
|
|
60
|
+
const DESCRIPTION_FONT_SIZE = 26;
|
|
61
|
+
const BADGE_FONT_SIZE = 18;
|
|
62
|
+
const BADGE_FONT_WEIGHT = 600;
|
|
63
|
+
const BRAND_FONT_SIZE = 28;
|
|
64
|
+
const FONT_WEIGHT_REGULAR = 400;
|
|
65
|
+
const FONT_WEIGHT_BOLD = 700;
|
|
66
|
+
const TITLE_LINE_HEIGHT = 1.2;
|
|
67
|
+
const DESCRIPTION_LINE_HEIGHT = 1.5;
|
|
68
|
+
const SIGNATURE_FONT_SIZE = 24;
|
|
69
|
+
const SIGNATURE_LINE_HEIGHT = 1.4;
|
|
70
|
+
const SIGNATURE_BG = "rgba(0, 0, 0, 0.35)";
|
|
71
|
+
const SIGNATURE_MAX_LINES = 2;
|
|
72
|
+
const LOGO_DISPLAY_SIZE = 76;
|
|
73
|
+
const LOGO_RASTER_SIZE = 152;
|
|
74
|
+
function computeOgHash(params) {
|
|
75
|
+
const input = JSON.stringify({
|
|
76
|
+
badge: params.badge ?? "",
|
|
77
|
+
description: params.description ?? "",
|
|
78
|
+
signature: params.signature ?? "",
|
|
79
|
+
title: params.title
|
|
80
|
+
});
|
|
81
|
+
const HASH_LENGTH = 16;
|
|
82
|
+
return createHash("sha256").update(input).digest("hex").slice(0, HASH_LENGTH);
|
|
83
|
+
}
|
|
84
|
+
async function loadFonts(fontsDirectory) {
|
|
85
|
+
const regularPath = `${fontsDirectory}/inter-latin-400-normal.ttf`;
|
|
86
|
+
const boldPath = `${fontsDirectory}/inter-latin-700-normal.ttf`;
|
|
87
|
+
if (existsSync(regularPath) && existsSync(boldPath)) {
|
|
88
|
+
const [regularData, boldData] = await Promise.all([
|
|
89
|
+
readFile(regularPath),
|
|
90
|
+
readFile(boldPath)
|
|
91
|
+
]);
|
|
92
|
+
return [
|
|
93
|
+
{ data: regularData, name: "Inter", style: "normal", weight: FONT_WEIGHT_REGULAR },
|
|
94
|
+
{ data: boldData, name: "Inter", style: "normal", weight: FONT_WEIGHT_BOLD }
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
if (existsSync(fontsDirectory)) {
|
|
98
|
+
const entries = await readdir(fontsDirectory);
|
|
99
|
+
const fontFile = entries.find((name) => name.endsWith(".ttf") || name.endsWith(".otf"));
|
|
100
|
+
if (fontFile) {
|
|
101
|
+
const data = await readFile(`${fontsDirectory}/${fontFile}`);
|
|
102
|
+
return [
|
|
103
|
+
{ data, name: "Inter", style: "normal", weight: FONT_WEIGHT_REGULAR },
|
|
104
|
+
{ data, name: "Inter", style: "normal", weight: FONT_WEIGHT_BOLD }
|
|
105
|
+
];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
async function loadLogoDataUri(faviconPath) {
|
|
111
|
+
if (!existsSync(faviconPath)) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
const svg = await readFile(faviconPath, "utf-8");
|
|
115
|
+
const resvg = new Resvg(svg, { fitTo: { mode: "width", value: LOGO_RASTER_SIZE } });
|
|
116
|
+
const png = resvg.render().asPng();
|
|
117
|
+
return `data:image/png;base64,${png.toString("base64")}`;
|
|
118
|
+
}
|
|
119
|
+
async function renderOgImage(params, options) {
|
|
120
|
+
const markup = buildOgImageMarkup(params, options);
|
|
121
|
+
const svg = await satori(markup, {
|
|
122
|
+
fonts: options.fonts,
|
|
123
|
+
height: OG_HEIGHT,
|
|
124
|
+
width: OG_WIDTH
|
|
125
|
+
});
|
|
126
|
+
const resvg = new Resvg(svg, {
|
|
127
|
+
fitTo: { mode: "width", value: OG_WIDTH }
|
|
128
|
+
});
|
|
129
|
+
return resvg.render().asPng();
|
|
130
|
+
}
|
|
131
|
+
function buildBadgeMarkup(badge) {
|
|
132
|
+
return {
|
|
133
|
+
props: {
|
|
134
|
+
children: badge,
|
|
135
|
+
style: {
|
|
136
|
+
alignItems: "center",
|
|
137
|
+
background: ACCENT_BG,
|
|
138
|
+
borderRadius: "20px",
|
|
139
|
+
color: ACCENT_COLOR,
|
|
140
|
+
display: "flex",
|
|
141
|
+
fontSize: `${String(BADGE_FONT_SIZE)}px`,
|
|
142
|
+
fontWeight: BADGE_FONT_WEIGHT,
|
|
143
|
+
padding: "6px 14px"
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
type: "div"
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function buildLogoMarkup(logoDataUri) {
|
|
150
|
+
return {
|
|
151
|
+
props: {
|
|
152
|
+
height: LOGO_DISPLAY_SIZE,
|
|
153
|
+
src: logoDataUri,
|
|
154
|
+
style: {
|
|
155
|
+
height: `${String(LOGO_DISPLAY_SIZE)}px`,
|
|
156
|
+
width: `${String(LOGO_DISPLAY_SIZE)}px`
|
|
157
|
+
},
|
|
158
|
+
width: LOGO_DISPLAY_SIZE
|
|
159
|
+
},
|
|
160
|
+
type: "img"
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
function buildOgImageMarkup(params, options) {
|
|
164
|
+
const badgeNode = params.badge ? buildBadgeMarkup(params.badge) : null;
|
|
165
|
+
const logoNode = options.logoDataUri ? buildLogoMarkup(options.logoDataUri) : null;
|
|
166
|
+
const topRowChildren = [
|
|
167
|
+
...logoNode ? [logoNode] : [],
|
|
168
|
+
{ props: { style: { flex: 1 } }, type: "div" },
|
|
169
|
+
...badgeNode ? [badgeNode] : []
|
|
170
|
+
];
|
|
171
|
+
const topRow = {
|
|
172
|
+
props: {
|
|
173
|
+
children: topRowChildren,
|
|
174
|
+
style: {
|
|
175
|
+
alignItems: "center",
|
|
176
|
+
display: "flex",
|
|
177
|
+
marginBottom: "24px"
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
type: "div"
|
|
181
|
+
};
|
|
182
|
+
const title = {
|
|
183
|
+
props: {
|
|
184
|
+
children: params.title,
|
|
185
|
+
style: {
|
|
186
|
+
color: TITLE_COLOR,
|
|
187
|
+
fontSize: `${String(TITLE_FONT_SIZE)}px`,
|
|
188
|
+
fontWeight: FONT_WEIGHT_BOLD,
|
|
189
|
+
lineHeight: TITLE_LINE_HEIGHT,
|
|
190
|
+
marginBottom: "20px",
|
|
191
|
+
overflow: "hidden",
|
|
192
|
+
textOverflow: "ellipsis"
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
type: "div"
|
|
196
|
+
};
|
|
197
|
+
const signatureNode = params.signature ? buildSignatureMarkup(params.signature) : null;
|
|
198
|
+
const description = {
|
|
199
|
+
props: {
|
|
200
|
+
children: params.description ?? "",
|
|
201
|
+
style: {
|
|
202
|
+
color: DESCRIPTION_COLOR,
|
|
203
|
+
flex: 1,
|
|
204
|
+
fontSize: `${String(DESCRIPTION_FONT_SIZE)}px`,
|
|
205
|
+
lineHeight: DESCRIPTION_LINE_HEIGHT,
|
|
206
|
+
overflow: "hidden",
|
|
207
|
+
textOverflow: "ellipsis"
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
type: "div"
|
|
211
|
+
};
|
|
212
|
+
const footer = {
|
|
213
|
+
props: {
|
|
214
|
+
children: [
|
|
215
|
+
{ props: { style: { flex: 1 } }, type: "div" },
|
|
216
|
+
{
|
|
217
|
+
props: {
|
|
218
|
+
children: options.brandText,
|
|
219
|
+
style: {
|
|
220
|
+
color: BRAND_COLOR,
|
|
221
|
+
fontSize: `${String(BRAND_FONT_SIZE)}px`,
|
|
222
|
+
fontWeight: FONT_WEIGHT_BOLD
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
type: "div"
|
|
226
|
+
}
|
|
227
|
+
],
|
|
228
|
+
style: {
|
|
229
|
+
alignItems: "flex-end",
|
|
230
|
+
display: "flex"
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
type: "div"
|
|
234
|
+
};
|
|
235
|
+
return {
|
|
236
|
+
props: {
|
|
237
|
+
children: [
|
|
238
|
+
{
|
|
239
|
+
props: {
|
|
240
|
+
children: signatureNode ? [topRow, title, signatureNode, description] : [topRow, title, description],
|
|
241
|
+
style: {
|
|
242
|
+
display: "flex",
|
|
243
|
+
flex: 1,
|
|
244
|
+
flexDirection: "column"
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
type: "div"
|
|
248
|
+
},
|
|
249
|
+
footer
|
|
250
|
+
],
|
|
251
|
+
style: {
|
|
252
|
+
background: BACKGROUND_COLOR,
|
|
253
|
+
borderLeft: `${String(BORDER_WIDTH)}px solid ${ACCENT_COLOR}`,
|
|
254
|
+
display: "flex",
|
|
255
|
+
flexDirection: "column",
|
|
256
|
+
height: "100%",
|
|
257
|
+
justifyContent: "space-between",
|
|
258
|
+
padding: `${String(PADDING_TOP)}px ${String(PADDING_X)}px ${String(PADDING_BOTTOM)}px ${String(PADDING_X)}px`,
|
|
259
|
+
width: "100%"
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
type: "div"
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
function buildSignatureMarkup(signature) {
|
|
266
|
+
return {
|
|
267
|
+
props: {
|
|
268
|
+
children: signature,
|
|
269
|
+
style: {
|
|
270
|
+
background: SIGNATURE_BG,
|
|
271
|
+
borderRadius: "12px",
|
|
272
|
+
color: ACCENT_COLOR,
|
|
273
|
+
display: "-webkit-box",
|
|
274
|
+
fontFamily: "monospace",
|
|
275
|
+
fontSize: `${String(SIGNATURE_FONT_SIZE)}px`,
|
|
276
|
+
lineClamp: SIGNATURE_MAX_LINES,
|
|
277
|
+
lineHeight: SIGNATURE_LINE_HEIGHT,
|
|
278
|
+
marginBottom: "28px",
|
|
279
|
+
overflow: "hidden",
|
|
280
|
+
padding: "16px 24px"
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
type: "div"
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
export {
|
|
287
|
+
computeOgHash,
|
|
288
|
+
loadFonts,
|
|
289
|
+
loadLogoDataUri,
|
|
290
|
+
renderOgImage
|
|
291
|
+
};
|
|
292
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvb2ctaW1hZ2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlbmRlcnMgYSBwYWdlJ3MgT3BlbiBHcmFwaCBjYXJkOiBzYXRvcmkgbGF5cyBpdCBvdXQgYXMgU1ZHLCByZXN2ZyByYXN0ZXJpemVzIGl0IHRvIFBORy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZvbnQgfSBmcm9tICdzYXRvcmknO1xuXG5pbXBvcnQgeyBSZXN2ZyB9IGZyb20gJ0ByZXN2Zy9yZXN2Zy1qcyc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgc2F0b3JpIGZyb20gJ3NhdG9yaSc7XG5cbmNvbnN0IE9HX1dJRFRIID0gMTIwMDtcbmNvbnN0IE9HX0hFSUdIVCA9IDYzMDtcbmNvbnN0IEJBQ0tHUk9VTkRfQ09MT1IgPSAnIzExMTIxMyc7XG4vLyBUaGUgdmlvbGV0IGFjY2VudCwgbWF0Y2hpbmcgdGhlIGRvY3MgdGhlbWUgKGAtLXNsLWNvbG9yLWFjY2VudGApLlxuY29uc3QgQUNDRU5UX0NPTE9SID0gJyM4YjZmZjUnO1xuY29uc3QgQUNDRU5UX0JHID0gJ3JnYmEoMTAzLCAxNzIsIDE3MiwgMC4xOCknO1xuY29uc3QgVElUTEVfQ09MT1IgPSAnI2ZmZmZmZic7XG5jb25zdCBERVNDUklQVElPTl9DT0xPUiA9ICcjOUNBM0FGJztcbmNvbnN0IEJSQU5EX0NPTE9SID0gJyM4YjZmZjUnO1xuY29uc3QgQk9SREVSX1dJRFRIID0gODtcbmNvbnN0IFBBRERJTkdfWCA9IDgwO1xuY29uc3QgUEFERElOR19UT1AgPSA3MDtcbmNvbnN0IFBBRERJTkdfQk9UVE9NID0gNjA7XG5jb25zdCBUSVRMRV9GT05UX1NJWkUgPSA1NjtcbmNvbnN0IERFU0NSSVBUSU9OX0ZPTlRfU0laRSA9IDI2O1xuY29uc3QgQkFER0VfRk9OVF9TSVpFID0gMTg7XG5jb25zdCBCQURHRV9GT05UX1dFSUdIVCA9IDYwMDtcbmNvbnN0IEJSQU5EX0ZPTlRfU0laRSA9IDI4O1xuY29uc3QgRk9OVF9XRUlHSFRfUkVHVUxBUiA9IDQwMDtcbmNvbnN0IEZPTlRfV0VJR0hUX0JPTEQgPSA3MDA7XG5jb25zdCBUSVRMRV9MSU5FX0hFSUdIVCA9IDEuMjtcbmNvbnN0IERFU0NSSVBUSU9OX0xJTkVfSEVJR0hUID0gMS41O1xuLy8gU2lnbmF0dXJlIGNvZGUgYmxvY2sgKHZpb2xldCBhY2NlbnQgb24gYSBzdWJ0bGUgZGFya2VyIHJvdW5kZWQgcGFuZWwpLlxuY29uc3QgU0lHTkFUVVJFX0ZPTlRfU0laRSA9IDI0O1xuY29uc3QgU0lHTkFUVVJFX0xJTkVfSEVJR0hUID0gMS40O1xuY29uc3QgU0lHTkFUVVJFX0JHID0gJ3JnYmEoMCwgMCwgMCwgMC4zNSknO1xuY29uc3QgU0lHTkFUVVJFX01BWF9MSU5FUyA9IDI7XG4vLyBTaXRlIGxvZ28gKGZhdmljb24pLCByYXN0ZXJpemVkIG9uY2UgYW5kIGVtYmVkZGVkIGFzIGEgZGF0YSBVUkkuXG5jb25zdCBMT0dPX0RJU1BMQVlfU0laRSA9IDc2O1xuY29uc3QgTE9HT19SQVNURVJfU0laRSA9IDE1MjtcblxuLyoqXG4gKiBXaGF0IG9uZSBPcGVuIEdyYXBoIGNhcmQgc2hvd3M6IGEgdGl0bGUsIGFuZCBvcHRpb25hbGx5IGEgZGVzY3JpcHRpb24sIGEgY29kZSBzaWduYXR1cmUgYW5kIGEgYmFkZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2dDYXJkQ29udGVudCB7XG4gIHJlYWRvbmx5IGJhZGdlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc2lnbmF0dXJlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwZXItc2l0ZSBwYXJ0IG9mIGV2ZXJ5IGNhcmQ6IHRoZSBmb250cywgdGhlIGxvZ28gYW5kIHRoZSBicmFuZCB0ZXh0IGluIHRoZSBmb290ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyT2dJbWFnZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHRleHQgdGhlIGZvb3RlciBjYXJyaWVzLCBub3JtYWxseSB0aGUgcGFja2FnZSdzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBicmFuZFRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvbnRzIHNhdG9yaSByZW5kZXJzIHRoZSB0ZXh0IHdpdGguXG4gICAqL1xuICByZWFkb25seSBmb250czogRm9udFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l0ZSBsb2dvIGFzIGEgUE5HIGRhdGEgVVJJLCBvciBgbnVsbGAgdG8gcmVuZGVyIHRoZSBjYXJkIHdpdGhvdXQgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nb0RhdGFVcmk6IG51bGwgfCBzdHJpbmc7XG59XG5cbi8qKlxuICogSGFzaGVzIGEgY2FyZCdzIGNvbnRlbnQsIHNvIGFuIHVuY2hhbmdlZCBjYXJkIGlzIG5vdCByZW5kZXJlZCBhZ2Fpbi5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNhcmQncyBjb250ZW50LlxuICogQHJldHVybnMgQSAxNi1jaGFyYWN0ZXIgaGV4IGRpZ2VzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPZ0hhc2gocGFyYW1zOiBPZ0NhcmRDb250ZW50KTogc3RyaW5nIHtcbiAgY29uc3QgaW5wdXQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgYmFkZ2U6IHBhcmFtcy5iYWRnZSA/PyAnJyxcbiAgICBkZXNjcmlwdGlvbjogcGFyYW1zLmRlc2NyaXB0aW9uID8/ICcnLFxuICAgIHNpZ25hdHVyZTogcGFyYW1zLnNpZ25hdHVyZSA/PyAnJyxcbiAgICB0aXRsZTogcGFyYW1zLnRpdGxlXG4gIH0pO1xuICBjb25zdCBIQVNIX0xFTkdUSCA9IDE2O1xuICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGlucHV0KS5kaWdlc3QoJ2hleCcpLnNsaWNlKDAsIEhBU0hfTEVOR1RIKTtcbn1cblxuLyoqXG4gKiBMb2FkcyB0aGUgZm9udHMgc2F0b3JpIG5lZWRzIHRvIHJlbmRlciB0ZXh0LlxuICpcbiAqIFRoaXMgcGFja2FnZSBzaGlwcyBgaW50ZXItbGF0aW4tNDAwLW5vcm1hbC50dGZgIC8gYGludGVyLWxhdGluLTcwMC1ub3JtYWwudHRmYCB1bmRlclxuICogYGFzc2V0cy9kb2NzLXNpdGUvZm9udHNgOyB0aGlzIGZhbGxzIGJhY2sgdG8gYW55IG90aGVyIGAudHRmYC9gLm90ZmAgaW4gYGZvbnRzRGlyZWN0b3J5YCBhbmRcbiAqIHJldHVybnMgYG51bGxgIHdoZW4gdGhlIGRpcmVjdG9yeSBob2xkcyBub25lLCBzbyB0aGUgY2FsbGVyIGNhbiBza2lwIE9HIGdlbmVyYXRpb24gaW5zdGVhZCBvZlxuICogY3Jhc2hpbmcgdGhlIGJ1aWxkLlxuICpcbiAqIEBwYXJhbSBmb250c0RpcmVjdG9yeSAtIFRoZSBmb2xkZXIgaG9sZGluZyB0aGUgZm9udHMuXG4gKiBAcmV0dXJucyBUaGUgZm9udHMsIG9yIGBudWxsYCB3aGVuIHRoZSBmb2xkZXIgaG9sZHMgbm9uZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRGb250cyhmb250c0RpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxGb250W10gfCBudWxsPiB7XG4gIGNvbnN0IHJlZ3VsYXJQYXRoID0gYCR7Zm9udHNEaXJlY3Rvcnl9L2ludGVyLWxhdGluLTQwMC1ub3JtYWwudHRmYDtcbiAgY29uc3QgYm9sZFBhdGggPSBgJHtmb250c0RpcmVjdG9yeX0vaW50ZXItbGF0aW4tNzAwLW5vcm1hbC50dGZgO1xuXG4gIGlmIChleGlzdHNTeW5jKHJlZ3VsYXJQYXRoKSAmJiBleGlzdHNTeW5jKGJvbGRQYXRoKSkge1xuICAgIGNvbnN0IFtyZWd1bGFyRGF0YSwgYm9sZERhdGFdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcmVhZEZpbGUocmVndWxhclBhdGgpLFxuICAgICAgcmVhZEZpbGUoYm9sZFBhdGgpXG4gICAgXSk7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgZGF0YTogcmVndWxhckRhdGEsIG5hbWU6ICdJbnRlcicsIHN0eWxlOiAnbm9ybWFsJyBhcyBjb25zdCwgd2VpZ2h0OiBGT05UX1dFSUdIVF9SRUdVTEFSIH0sXG4gICAgICB7IGRhdGE6IGJvbGREYXRhLCBuYW1lOiAnSW50ZXInLCBzdHlsZTogJ25vcm1hbCcgYXMgY29uc3QsIHdlaWdodDogRk9OVF9XRUlHSFRfQk9MRCB9XG4gICAgXTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiByZXVzZSBhbnkgc2luZ2xlIGZvbnQgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IGZvciBib3RoIHdlaWdodHMuXG4gIGlmIChleGlzdHNTeW5jKGZvbnRzRGlyZWN0b3J5KSkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkZGlyKGZvbnRzRGlyZWN0b3J5KTtcbiAgICBjb25zdCBmb250RmlsZSA9IGVudHJpZXMuZmluZCgobmFtZSkgPT4gbmFtZS5lbmRzV2l0aCgnLnR0ZicpIHx8IG5hbWUuZW5kc1dpdGgoJy5vdGYnKSk7XG4gICAgaWYgKGZvbnRGaWxlKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEZpbGUoYCR7Zm9udHNEaXJlY3Rvcnl9LyR7Zm9udEZpbGV9YCk7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7IGRhdGEsIG5hbWU6ICdJbnRlcicsIHN0eWxlOiAnbm9ybWFsJyBhcyBjb25zdCwgd2VpZ2h0OiBGT05UX1dFSUdIVF9SRUdVTEFSIH0sXG4gICAgICAgIHsgZGF0YSwgbmFtZTogJ0ludGVyJywgc3R5bGU6ICdub3JtYWwnIGFzIGNvbnN0LCB3ZWlnaHQ6IEZPTlRfV0VJR0hUX0JPTEQgfVxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSYXN0ZXJpemUgYW4gU1ZHIGZhdmljb24gdG8gYSBQTkcgZGF0YSBVUkkgdmlhIHJlc3ZnIGZvciBlbWJlZGRpbmcgaW4gdGhlIHNhdG9yaSBsYXlvdXQgKHNhdG9yaSdzXG4gKiBgPGltZz5gIG5lZWRzIGEgcmFzdGVyL2RhdGEtVVJJIHNvdXJjZSkuIFJldHVybnMgYG51bGxgIHdoZW4gdGhlIGZpbGUgaXMgbWlzc2luZyBzbyB0aGUgY2FsbGVyIGNhblxuICogcmVuZGVyIHRoZSBjYXJkIHdpdGhvdXQgYSBsb2dvLiBDYWxsIHRoaXMgT05DRSBhbmQgcmV1c2UgdGhlIHJlc3VsdCBhY3Jvc3MgYWxsIGNhcmRzLlxuICpcbiAqIEBwYXJhbSBmYXZpY29uUGF0aCAtIFRoZSBTVkcgZmF2aWNvbidzIHBhdGguXG4gKiBAcmV0dXJucyBUaGUgUE5HIGRhdGEgVVJJLCBvciBgbnVsbGAgd2hlbiB0aGUgZmF2aWNvbiBpcyBtaXNzaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZExvZ29EYXRhVXJpKGZhdmljb25QYXRoOiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgaWYgKCFleGlzdHNTeW5jKGZhdmljb25QYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHN2ZyA9IGF3YWl0IHJlYWRGaWxlKGZhdmljb25QYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgcmVzdmcgPSBuZXcgUmVzdmcoc3ZnLCB7IGZpdFRvOiB7IG1vZGU6ICd3aWR0aCcsIHZhbHVlOiBMT0dPX1JBU1RFUl9TSVpFIH0gfSk7XG4gIGNvbnN0IHBuZyA9IHJlc3ZnLnJlbmRlcigpLmFzUG5nKCk7XG4gIHJldHVybiBgZGF0YTppbWFnZS9wbmc7YmFzZTY0LCR7cG5nLnRvU3RyaW5nKCdiYXNlNjQnKX1gO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBwYWdlJ3MgY2FyZCB0byBhIFBORy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNhcmQncyBjb250ZW50LlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgZm9udHMsIGxvZ28gYW5kIGJyYW5kIHRleHQgZXZlcnkgY2FyZCBzaGFyZXMuXG4gKiBAcmV0dXJucyBUaGUgUE5HLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyT2dJbWFnZShwYXJhbXM6IE9nQ2FyZENvbnRlbnQsIG9wdGlvbnM6IFJlbmRlck9nSW1hZ2VPcHRpb25zKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgY29uc3QgbWFya3VwID0gYnVpbGRPZ0ltYWdlTWFya3VwKHBhcmFtcywgb3B0aW9ucyk7XG4gIGNvbnN0IHN2ZyA9IGF3YWl0IHNhdG9yaShtYXJrdXAsIHtcbiAgICBmb250czogb3B0aW9ucy5mb250cyxcbiAgICBoZWlnaHQ6IE9HX0hFSUdIVCxcbiAgICB3aWR0aDogT0dfV0lEVEhcbiAgfSk7XG5cbiAgY29uc3QgcmVzdmcgPSBuZXcgUmVzdmcoc3ZnLCB7XG4gICAgZml0VG86IHsgbW9kZTogJ3dpZHRoJywgdmFsdWU6IE9HX1dJRFRIIH1cbiAgfSk7XG4gIHJldHVybiByZXN2Zy5yZW5kZXIoKS5hc1BuZygpO1xufVxuXG5mdW5jdGlvbiBidWlsZEJhZGdlTWFya3VwKGJhZGdlOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB7XG4gICAgcHJvcHM6IHtcbiAgICAgIGNoaWxkcmVuOiBiYWRnZSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICBiYWNrZ3JvdW5kOiBBQ0NFTlRfQkcsXG4gICAgICAgIGJvcmRlclJhZGl1czogJzIwcHgnLFxuICAgICAgICBjb2xvcjogQUNDRU5UX0NPTE9SLFxuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGZvbnRTaXplOiBgJHtTdHJpbmcoQkFER0VfRk9OVF9TSVpFKX1weGAsXG4gICAgICAgIGZvbnRXZWlnaHQ6IEJBREdFX0ZPTlRfV0VJR0hULFxuICAgICAgICBwYWRkaW5nOiAnNnB4IDE0cHgnXG4gICAgICB9XG4gICAgfSxcbiAgICB0eXBlOiAnZGl2J1xuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZExvZ29NYXJrdXAobG9nb0RhdGFVcmk6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBwcm9wczoge1xuICAgICAgaGVpZ2h0OiBMT0dPX0RJU1BMQVlfU0laRSxcbiAgICAgIHNyYzogbG9nb0RhdGFVcmksXG4gICAgICBzdHlsZToge1xuICAgICAgICBoZWlnaHQ6IGAke1N0cmluZyhMT0dPX0RJU1BMQVlfU0laRSl9cHhgLFxuICAgICAgICB3aWR0aDogYCR7U3RyaW5nKExPR09fRElTUExBWV9TSVpFKX1weGBcbiAgICAgIH0sXG4gICAgICB3aWR0aDogTE9HT19ESVNQTEFZX1NJWkVcbiAgICB9LFxuICAgIHR5cGU6ICdpbWcnXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkT2dJbWFnZU1hcmt1cChwYXJhbXM6IE9nQ2FyZENvbnRlbnQsIG9wdGlvbnM6IFJlbmRlck9nSW1hZ2VPcHRpb25zKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBiYWRnZU5vZGUgPSBwYXJhbXMuYmFkZ2UgPyBidWlsZEJhZGdlTWFya3VwKHBhcmFtcy5iYWRnZSkgOiBudWxsO1xuICBjb25zdCBsb2dvTm9kZSA9IG9wdGlvbnMubG9nb0RhdGFVcmkgPyBidWlsZExvZ29NYXJrdXAob3B0aW9ucy5sb2dvRGF0YVVyaSkgOiBudWxsO1xuXG4gIC8vIFRvcCByb3c6IGxvZ28gb24gdGhlIGxlZnQsIGJhZGdlIG9uIHRoZSByaWdodC5cbiAgY29uc3QgdG9wUm93Q2hpbGRyZW46IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXG4gICAgLi4uKGxvZ29Ob2RlID8gW2xvZ29Ob2RlXSA6IFtdKSxcbiAgICB7IHByb3BzOiB7IHN0eWxlOiB7IGZsZXg6IDEgfSB9LCB0eXBlOiAnZGl2JyB9LFxuICAgIC4uLihiYWRnZU5vZGUgPyBbYmFkZ2VOb2RlXSA6IFtdKVxuICBdO1xuICBjb25zdCB0b3BSb3cgPSB7XG4gICAgcHJvcHM6IHtcbiAgICAgIGNoaWxkcmVuOiB0b3BSb3dDaGlsZHJlbixcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIG1hcmdpbkJvdHRvbTogJzI0cHgnXG4gICAgICB9XG4gICAgfSxcbiAgICB0eXBlOiAnZGl2J1xuICB9O1xuXG4gIC8vIFRpdGxlXG4gIGNvbnN0IHRpdGxlID0ge1xuICAgIHByb3BzOiB7XG4gICAgICBjaGlsZHJlbjogcGFyYW1zLnRpdGxlLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY29sb3I6IFRJVExFX0NPTE9SLFxuICAgICAgICBmb250U2l6ZTogYCR7U3RyaW5nKFRJVExFX0ZPTlRfU0laRSl9cHhgLFxuICAgICAgICBmb250V2VpZ2h0OiBGT05UX1dFSUdIVF9CT0xELFxuICAgICAgICBsaW5lSGVpZ2h0OiBUSVRMRV9MSU5FX0hFSUdIVCxcbiAgICAgICAgbWFyZ2luQm90dG9tOiAnMjBweCcsXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgdGV4dE92ZXJmbG93OiAnZWxsaXBzaXMnXG4gICAgICB9XG4gICAgfSxcbiAgICB0eXBlOiAnZGl2J1xuICB9O1xuXG4gIC8vIFNpZ25hdHVyZSBjb2RlIGJsb2NrIChiZXR3ZWVuIHRpdGxlIGFuZCBkZXNjcmlwdGlvbikg4oCUIG9taXR0ZWQgZm9yIHBhZ2VzIHdpdGggbm8gc2lnbmF0dXJlLlxuICBjb25zdCBzaWduYXR1cmVOb2RlID0gcGFyYW1zLnNpZ25hdHVyZSA/IGJ1aWxkU2lnbmF0dXJlTWFya3VwKHBhcmFtcy5zaWduYXR1cmUpIDogbnVsbDtcblxuICAvLyBEZXNjcmlwdGlvblxuICBjb25zdCBkZXNjcmlwdGlvbiA9IHtcbiAgICBwcm9wczoge1xuICAgICAgY2hpbGRyZW46IHBhcmFtcy5kZXNjcmlwdGlvbiA/PyAnJyxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGNvbG9yOiBERVNDUklQVElPTl9DT0xPUixcbiAgICAgICAgZmxleDogMSxcbiAgICAgICAgZm9udFNpemU6IGAke1N0cmluZyhERVNDUklQVElPTl9GT05UX1NJWkUpfXB4YCxcbiAgICAgICAgbGluZUhlaWdodDogREVTQ1JJUFRJT05fTElORV9IRUlHSFQsXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgdGV4dE92ZXJmbG93OiAnZWxsaXBzaXMnXG4gICAgICB9XG4gICAgfSxcbiAgICB0eXBlOiAnZGl2J1xuICB9O1xuXG4gIC8vIEZvb3RlciB3aXRoIHRoZSBwYWNrYWdlIG5hbWUgYXMgdGV4dCBicmFuZGluZyAodGhlIGZhdmljb24gaXMgcmVuZGVyZWQgc2VwYXJhdGVseSwgaW4gdGhlIGhlYWRlcilcbiAgY29uc3QgZm9vdGVyID0ge1xuICAgIHByb3BzOiB7XG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7IHByb3BzOiB7IHN0eWxlOiB7IGZsZXg6IDEgfSB9LCB0eXBlOiAnZGl2JyB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBvcHRpb25zLmJyYW5kVGV4dCxcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgIGNvbG9yOiBCUkFORF9DT0xPUixcbiAgICAgICAgICAgICAgZm9udFNpemU6IGAke1N0cmluZyhCUkFORF9GT05UX1NJWkUpfXB4YCxcbiAgICAgICAgICAgICAgZm9udFdlaWdodDogRk9OVF9XRUlHSFRfQk9MRFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZTogJ2RpdidcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGFsaWduSXRlbXM6ICdmbGV4LWVuZCcsXG4gICAgICAgIGRpc3BsYXk6ICdmbGV4J1xuICAgICAgfVxuICAgIH0sXG4gICAgdHlwZTogJ2RpdidcbiAgfTtcblxuICAvLyBSb290IGNvbnRhaW5lclxuICByZXR1cm4ge1xuICAgIHByb3BzOiB7XG4gICAgICBjaGlsZHJlbjogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBzaWduYXR1cmVOb2RlID8gW3RvcFJvdywgdGl0bGUsIHNpZ25hdHVyZU5vZGUsIGRlc2NyaXB0aW9uXSA6IFt0b3BSb3csIHRpdGxlLCBkZXNjcmlwdGlvbl0sXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgIGZsZXg6IDEsXG4gICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlOiAnZGl2J1xuICAgICAgICB9LFxuICAgICAgICBmb290ZXJcbiAgICAgIF0sXG4gICAgICBzdHlsZToge1xuICAgICAgICBiYWNrZ3JvdW5kOiBCQUNLR1JPVU5EX0NPTE9SLFxuICAgICAgICBib3JkZXJMZWZ0OiBgJHtTdHJpbmcoQk9SREVSX1dJRFRIKX1weCBzb2xpZCAke0FDQ0VOVF9DT0xPUn1gLFxuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJyxcbiAgICAgICAgcGFkZGluZzogYCR7U3RyaW5nKFBBRERJTkdfVE9QKX1weCAke1N0cmluZyhQQURESU5HX1gpfXB4ICR7U3RyaW5nKFBBRERJTkdfQk9UVE9NKX1weCAke1N0cmluZyhQQURESU5HX1gpfXB4YCxcbiAgICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgICAgfVxuICAgIH0sXG4gICAgdHlwZTogJ2RpdidcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTaWduYXR1cmVNYXJrdXAoc2lnbmF0dXJlOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB7XG4gICAgcHJvcHM6IHtcbiAgICAgIGNoaWxkcmVuOiBzaWduYXR1cmUsXG4gICAgICBzdHlsZToge1xuICAgICAgICBiYWNrZ3JvdW5kOiBTSUdOQVRVUkVfQkcsXG4gICAgICAgIGJvcmRlclJhZGl1czogJzEycHgnLFxuICAgICAgICBjb2xvcjogQUNDRU5UX0NPTE9SLFxuICAgICAgICBkaXNwbGF5OiAnLXdlYmtpdC1ib3gnLFxuICAgICAgICBmb250RmFtaWx5OiAnbW9ub3NwYWNlJyxcbiAgICAgICAgZm9udFNpemU6IGAke1N0cmluZyhTSUdOQVRVUkVfRk9OVF9TSVpFKX1weGAsXG4gICAgICAgIGxpbmVDbGFtcDogU0lHTkFUVVJFX01BWF9MSU5FUyxcbiAgICAgICAgbGluZUhlaWdodDogU0lHTkFUVVJFX0xJTkVfSEVJR0hULFxuICAgICAgICBtYXJnaW5Cb3R0b206ICcyOHB4JyxcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICBwYWRkaW5nOiAnMTZweCAyNHB4J1xuICAgICAgfVxuICAgIH0sXG4gICAgdHlwZTogJ2RpdidcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSxTQUFTLGFBQWE7QUFDdEIsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxPQUFPLFlBQVk7QUFFbkIsTUFBTSxXQUFXO0FBQ2pCLE1BQU0sWUFBWTtBQUNsQixNQUFNLG1CQUFtQjtBQUV6QixNQUFNLGVBQWU7QUFDckIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sY0FB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Q0FBQztBQUFBLGNBQ3BDLFlBQVk7QUFBQSxZQUNkO0FBQUEsVUFDRjtBQUFBLFVBQ0EsTUFBTTtBQUFBLFFBQ1I7QUFBQSxNQUNGO0FBQUEsTUFDQSxPQUFPO0FBQUEsUUFDTCxZQUFZO0FBQUEsUUFDWixTQUFTO0FBQUEsTUFDWDtBQUFBLElBQ0Y7QUFBQSxJQUNBLE1BQU07QUFBQSxFQUNSO0FBR0EsU0FBTztBQUFBLElBQ0wsT0FBTztBQUFBLE1BQ0wsVUFBVTtBQUFBLFFBQ1I7QUFBQSxVQUNFLE9BQU87QUFBQSxZQUNMLFVBQVUsZ0JBQWdCLENBQUMsUUFBUSxPQUFPLGVBQWUsV0FBVyxJQUFJLENBQUMsUUFBUSxPQUFPLFdBQVc7QUFBQSxZQUNuRyxPQUFPO0FBQUEsY0FDTCxTQUFTO0FBQUEsY0FDVCxNQUFNO0FBQUEsY0FDTixlQUFlO0FBQUEsWUFDakI7QUFBQSxVQUNGO0FBQUEsVUFDQSxNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsTUFDQSxPQUFPO0FBQUEsUUFDTCxZQUFZO0FBQUEsUUFDWixZQUFZLEdBQUcsT0FBTyxZQUFZLENBQUMsWUFBWSxZQUFZO0FBQUEsUUFDM0QsU0FBUztBQUFBLFFBQ1QsZUFBZTtBQUFBLFFBQ2YsUUFBUTtBQUFBLFFBQ1IsZ0JBQWdCO0FBQUEsUUFDaEIsU0FBUyxHQUFHLE9BQU8sV0FBVyxDQUFDLE1BQU0sT0FBTyxTQUFTLENBQUMsTUFBTSxPQUFPLGNBQWMsQ0FBQyxNQUFNLE9BQU8sU0FBUyxDQUFDO0FBQUEsUUFDekcsT0FBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBQUEsSUFDQSxNQUFNO0FBQUEsRUFDUjtBQUNGO0FBRUEsU0FBUyxxQkFBcUIsV0FBNEM7QUFDeEUsU0FBTztBQUFBLElBQ0wsT0FBTztBQUFBLE1BQ0wsVUFBVTtBQUFBLE1BQ1YsT0FBTztBQUFBLFFBQ0wsWUFBWTtBQUFBLFFBQ1osY0FBYztBQUFBLFFBQ2QsT0FBTztBQUFBLFFBQ1AsU0FBUztBQUFBLFFBQ1QsWUFBWTtBQUFBLFFBQ1osVUFBVSxHQUFHLE9BQU8sbUJBQW1CLENBQUM7QUFBQSxRQUN4QyxXQUFXO0FBQUEsUUFDWCxZQUFZO0FBQUEsUUFDWixjQUFjO0FBQUEsUUFDZCxVQUFVO0FBQUEsUUFDVixTQUFTO0FBQUEsTUFDWDtBQUFBLElBQ0Y7QUFBQSxJQUNBLE1BQU07QUFBQSxFQUNSO0FBQ0Y7IiwibmFtZXMiOltdfQ==
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
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>;
|
|
@@ -0,0 +1,156 @@
|
|
|
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
|
+
import { existsSync } from "node:fs";
|
|
40
|
+
import {
|
|
41
|
+
mkdir,
|
|
42
|
+
readdir,
|
|
43
|
+
readFile,
|
|
44
|
+
writeFile
|
|
45
|
+
} from "node:fs/promises";
|
|
46
|
+
import { dirname } from "node:path/posix";
|
|
47
|
+
import { parse as parseYaml } from "yaml";
|
|
48
|
+
import { getOgImagePageSlug } from "./og-image-page.mjs";
|
|
49
|
+
import {
|
|
50
|
+
computeOgHash,
|
|
51
|
+
loadFonts,
|
|
52
|
+
loadLogoDataUri,
|
|
53
|
+
renderOgImage
|
|
54
|
+
} from "./og-image.mjs";
|
|
55
|
+
const CONCURRENCY = 10;
|
|
56
|
+
const PROGRESS_LOG_INTERVAL = 100;
|
|
57
|
+
const MANIFEST_INDENT = 2;
|
|
58
|
+
const FRONT_MATTER_REG_EXP = /^---\r?\n(?<FrontMatter>[\s\S]*?)\r?\n---(?:\r?\n|$)/;
|
|
59
|
+
async function generateOgImages(options) {
|
|
60
|
+
const { brandText, contentDocsDirectory, faviconPath, fontsDirectory, outputDirectory } = options;
|
|
61
|
+
const manifestPath = `${outputDirectory}/.cache-manifest.json`;
|
|
62
|
+
if (!existsSync(contentDocsDirectory)) {
|
|
63
|
+
console.warn(`OG images: content dir not found (${contentDocsDirectory}); skipping.`);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const fonts = await loadFonts(fontsDirectory);
|
|
67
|
+
if (!fonts) {
|
|
68
|
+
console.warn(`OG images: no fonts available in ${fontsDirectory}; skipping OG image generation.`);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const pages = [];
|
|
72
|
+
await walkDirectory(contentDocsDirectory, contentDocsDirectory, pages);
|
|
73
|
+
console.warn(`OG images: found ${String(pages.length)} pages`);
|
|
74
|
+
const manifest = await loadCacheManifest(manifestPath);
|
|
75
|
+
const changedPages = pages.filter((page) => manifest[page.slug] !== page.hash);
|
|
76
|
+
console.warn(`OG images: ${String(changedPages.length)} changed / ${String(pages.length)} total`);
|
|
77
|
+
if (changedPages.length === 0) {
|
|
78
|
+
console.warn("All OG images up to date.");
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const logoDataUri = await loadLogoDataUri(faviconPath);
|
|
82
|
+
if (!logoDataUri) {
|
|
83
|
+
console.warn(`OG images: favicon not found (${faviconPath}); rendering cards without a logo.`);
|
|
84
|
+
}
|
|
85
|
+
await generateImagesWithPool({ brandText, changedPages, fonts, logoDataUri, manifest, outputDirectory });
|
|
86
|
+
await mkdir(dirname(manifestPath), { recursive: true });
|
|
87
|
+
await writeFile(manifestPath, JSON.stringify(manifest, null, MANIFEST_INDENT));
|
|
88
|
+
console.warn(`OG images: done. Generated ${String(changedPages.length)} images.`);
|
|
89
|
+
}
|
|
90
|
+
async function generateImagesWithPool(options) {
|
|
91
|
+
const { brandText, changedPages, fonts, logoDataUri, manifest, outputDirectory } = options;
|
|
92
|
+
let completed = 0;
|
|
93
|
+
let index = 0;
|
|
94
|
+
async function processNext() {
|
|
95
|
+
for (let page = changedPages[index++]; page !== void 0; page = changedPages[index++]) {
|
|
96
|
+
const outputPath = `${outputDirectory}/${page.slug}.png`;
|
|
97
|
+
await mkdir(dirname(outputPath), { recursive: true });
|
|
98
|
+
await writeFile(outputPath, await renderOgImage(page.params, { brandText, fonts, logoDataUri }));
|
|
99
|
+
manifest[page.slug] = page.hash;
|
|
100
|
+
completed++;
|
|
101
|
+
if (completed % PROGRESS_LOG_INTERVAL === 0) {
|
|
102
|
+
console.warn(` ${String(completed)}/${String(changedPages.length)} images generated...`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
await Promise.all(Array.from({ length: CONCURRENCY }, async () => {
|
|
107
|
+
await processNext();
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
async function loadCacheManifest(manifestPath) {
|
|
111
|
+
return existsSync(manifestPath) ? JSON.parse(await readFile(manifestPath, "utf-8")) : {};
|
|
112
|
+
}
|
|
113
|
+
function parseFrontMatter(content) {
|
|
114
|
+
const frontMatter = FRONT_MATTER_REG_EXP.exec(content)?.groups?.["FrontMatter"];
|
|
115
|
+
return frontMatter === void 0 ? {} : parseYaml(frontMatter) ?? {};
|
|
116
|
+
}
|
|
117
|
+
async function parsePage(filePath, contentDocsDirectory) {
|
|
118
|
+
const data = parseFrontMatter(await readFile(filePath, "utf-8"));
|
|
119
|
+
const title = toOptionalString(data["title"]);
|
|
120
|
+
if (!title) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const badge = data["sidebar"];
|
|
124
|
+
const params = {
|
|
125
|
+
badge: toOptionalString(badge?.["badge"]?.["text"]),
|
|
126
|
+
description: toOptionalString(data["description"]) ?? "",
|
|
127
|
+
signature: toOptionalString(data["signature"]) ?? "",
|
|
128
|
+
title
|
|
129
|
+
};
|
|
130
|
+
return {
|
|
131
|
+
hash: computeOgHash(params),
|
|
132
|
+
params,
|
|
133
|
+
slug: getOgImagePageSlug(data, filePath, contentDocsDirectory)
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function toOptionalString(value) {
|
|
137
|
+
return typeof value === "string" ? value : void 0;
|
|
138
|
+
}
|
|
139
|
+
async function walkDirectory(directory, contentDocsDirectory, pages) {
|
|
140
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
141
|
+
for (const entry of entries) {
|
|
142
|
+
const fullPath = `${directory}/${entry.name}`;
|
|
143
|
+
if (entry.isDirectory()) {
|
|
144
|
+
await walkDirectory(fullPath, contentDocsDirectory, pages);
|
|
145
|
+
} else if (entry.name.endsWith(".md") || entry.name.endsWith(".mdx")) {
|
|
146
|
+
const page = await parsePage(fullPath, contentDocsDirectory);
|
|
147
|
+
if (page) {
|
|
148
|
+
pages.push(page);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
export {
|
|
154
|
+
generateOgImages
|
|
155
|
+
};
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvb2ctaW1hZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBHZW5lcmF0ZXMgYW4gT3BlbiBHcmFwaCBjYXJkIGZvciBldmVyeSBkb2N1bWVudGF0aW9uIHBhZ2UsIHJldXNpbmcgdGhlIGNhcmRzIHdob3NlIGlucHV0cyBkaWQgbm90IGNoYW5nZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZvbnQgfSBmcm9tICdzYXRvcmknO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBta2RpcixcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGUsXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgvcG9zaXgnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VZYW1sIH0gZnJvbSAneWFtbCc7XG5cbmltcG9ydCB0eXBlIHsgT2dDYXJkQ29udGVudCB9IGZyb20gJy4vb2ctaW1hZ2UudHMnO1xuXG5pbXBvcnQgeyBnZXRPZ0ltYWdlUGFnZVNsdWcgfSBmcm9tICcuL29nLWltYWdlLXBhZ2UudHMnO1xuaW1wb3J0IHtcbiAgY29tcHV0ZU9nSGFzaCxcbiAgbG9hZEZvbnRzLFxuICBsb2FkTG9nb0RhdGFVcmksXG4gIHJlbmRlck9nSW1hZ2Vcbn0gZnJvbSAnLi9vZy1pbWFnZS50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlT2dJbWFnZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlT2dJbWFnZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHRleHQgZXZlcnkgY2FyZCdzIGZvb3RlciBjYXJyaWVzLCBub3JtYWxseSB0aGUgcGFja2FnZSdzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBicmFuZFRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvY3VtZW50YXRpb24gY29udGVudCByb290LCBub3JtYWxseSBgPGRvY3M+L3NyYy9jb250ZW50L2RvY3NgLiBFdmVyeSBgLm1kYCAvIGAubWR4YCBwYWdlIHVuZGVyIGl0IHdpdGggYVxuICAgKiBgdGl0bGVgIGdldHMgYSBjYXJkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudERvY3NEaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFNWRyBsb2dvIGRyYXduIG9uIGV2ZXJ5IGNhcmQuIEEgbWlzc2luZyBmaWxlIHJlbmRlcnMgdGhlIGNhcmRzIHdpdGhvdXQgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZmF2aWNvblBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvbGRlciBob2xkaW5nIHRoZSBmb250cyB0aGUgY2FyZHMgYXJlIHJlbmRlcmVkIHdpdGguXG4gICAqL1xuICByZWFkb25seSBmb250c0RpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9sZGVyIHRoZSBjYXJkcyBhcmUgd3JpdHRlbiB0bywgbm9ybWFsbHkgYDxkb2NzPi9wdWJsaWMvb2dgLCBzZXJ2ZWQgYXQgYDxiYXNlPi9vZy88c2x1Zz4ucG5nYC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dERpcmVjdG9yeTogc3RyaW5nO1xufVxuXG50eXBlIENhY2hlTWFuaWZlc3QgPSBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG5pbnRlcmZhY2UgR2VuZXJhdGVJbWFnZXNXaXRoUG9vbE9wdGlvbnMge1xuICByZWFkb25seSBicmFuZFRleHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY2hhbmdlZFBhZ2VzOiBQYWdlRW50cnlbXTtcbiAgcmVhZG9ubHkgZm9udHM6IEZvbnRbXTtcbiAgcmVhZG9ubHkgbG9nb0RhdGFVcmk6IG51bGwgfCBzdHJpbmc7XG4gIHJlYWRvbmx5IG1hbmlmZXN0OiBDYWNoZU1hbmlmZXN0O1xuICByZWFkb25seSBvdXRwdXREaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBhZ2VFbnRyeSB7XG4gIGhhc2g6IHN0cmluZztcbiAgcGFyYW1zOiBPZ0NhcmRDb250ZW50O1xuICBzbHVnOiBzdHJpbmc7XG59XG5cbmNvbnN0IENPTkNVUlJFTkNZID0gMTA7XG5jb25zdCBQUk9HUkVTU19MT0dfSU5URVJWQUwgPSAxMDA7XG5jb25zdCBNQU5JRkVTVF9JTkRFTlQgPSAyO1xuXG4vLyBGcm9udG1hdHRlciBpcyBwYXJzZWQgaGVyZSByYXRoZXIgdGhhbiB3aXRoIGBncmF5LW1hdHRlcmAuIEl0cyBgbGliL2VuZ2luZXMuanNgIGJpbmRzIGpzLXlhbWwnc1xuLy8gYHNhZmVMb2FkYC9gc2FmZUR1bXBgIGF0IE1PRFVMRS1MT0FEIHRpbWUsIGFuZCBib3RoIHdlcmUgcmVtb3ZlZCBpbiBqcy15YW1sIHY0IOKAlCBzbyBtZXJlbHlcbi8vIElNUE9SVElORyBgZ3JheS1tYXR0ZXJgIHRocm93cyBgQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiB1bmRlZmluZWQgKHJlYWRpbmcgJ2JpbmQnKWAsIGJlZm9yZSBhblxuLy8gYGVuZ2luZXNgIG9wdGlvbiBjb3VsZCBvdmVycmlkZSB0aGUgZGVmYXVsdC4gT25seSB0aGUgZnJvbnRtYXR0ZXIgb2JqZWN0IGlzIG5lZWRlZCBoZXJlLlxuY29uc3QgRlJPTlRfTUFUVEVSX1JFR19FWFAgPSAvXi0tLVxccj9cXG4oPzxGcm9udE1hdHRlcj5bXFxzXFxTXSo/KVxccj9cXG4tLS0oPzpcXHI/XFxufCQpLztcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIE9wZW4gR3JhcGggY2FyZHMuXG4gKlxuICogQSBjYXJkIGlzIHJlLXJlbmRlcmVkIG9ubHkgd2hlbiBpdHMgdGl0bGUsIGRlc2NyaXB0aW9uLCBzaWduYXR1cmUgb3IgYmFkZ2UgY2hhbmdlZCwgdHJhY2tlZCBieSBhIGhhc2ggbWFuaWZlc3RcbiAqIGJlc2lkZSB0aGUgY2FyZHMuIE1pc3NpbmcgY29udGVudCBvciBmb250cyBza2lwIHRoZSBzdGVwIHdpdGggYSB3YXJuaW5nIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIGJ1aWxkLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU9nSW1hZ2VzKG9wdGlvbnM6IEdlbmVyYXRlT2dJbWFnZXNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBicmFuZFRleHQsIGNvbnRlbnREb2NzRGlyZWN0b3J5LCBmYXZpY29uUGF0aCwgZm9udHNEaXJlY3RvcnksIG91dHB1dERpcmVjdG9yeSB9ID0gb3B0aW9ucztcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gYCR7b3V0cHV0RGlyZWN0b3J5fS8uY2FjaGUtbWFuaWZlc3QuanNvbmA7XG5cbiAgaWYgKCFleGlzdHNTeW5jKGNvbnRlbnREb2NzRGlyZWN0b3J5KSkge1xuICAgIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBjb250ZW50IGRpciBub3QgZm91bmQgKCR7Y29udGVudERvY3NEaXJlY3Rvcnl9KTsgc2tpcHBpbmcuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gTG9hZCBmb250cyBmaXJzdCDigJQgc2F0b3JpIGNhbm5vdCByZW5kZXIgd2l0aG91dCB0aGVtLlxuICBjb25zdCBmb250cyA9IGF3YWl0IGxvYWRGb250cyhmb250c0RpcmVjdG9yeSk7XG4gIGlmICghZm9udHMpIHtcbiAgICBjb25zb2xlLndhcm4oYE9HIGltYWdlczogbm8gZm9udHMgYXZhaWxhYmxlIGluICR7Zm9udHNEaXJlY3Rvcnl9OyBza2lwcGluZyBPRyBpbWFnZSBnZW5lcmF0aW9uLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhZ2VzOiBQYWdlRW50cnlbXSA9IFtdO1xuICBhd2FpdCB3YWxrRGlyZWN0b3J5KGNvbnRlbnREb2NzRGlyZWN0b3J5LCBjb250ZW50RG9jc0RpcmVjdG9yeSwgcGFnZXMpO1xuICBjb25zb2xlLndhcm4oYE9HIGltYWdlczogZm91bmQgJHtTdHJpbmcocGFnZXMubGVuZ3RoKX0gcGFnZXNgKTtcblxuICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IGxvYWRDYWNoZU1hbmlmZXN0KG1hbmlmZXN0UGF0aCk7XG4gIGNvbnN0IGNoYW5nZWRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gbWFuaWZlc3RbcGFnZS5zbHVnXSAhPT0gcGFnZS5oYXNoKTtcbiAgY29uc29sZS53YXJuKGBPRyBpbWFnZXM6ICR7U3RyaW5nKGNoYW5nZWRQYWdlcy5sZW5ndGgpfSBjaGFuZ2VkIC8gJHtTdHJpbmcocGFnZXMubGVuZ3RoKX0gdG90YWxgKTtcblxuICBpZiAoY2hhbmdlZFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUud2FybignQWxsIE9HIGltYWdlcyB1cCB0byBkYXRlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJhc3Rlcml6ZSB0aGUgc2l0ZSBsb2dvIG9uY2UgKHNoYXJlZCBhY3Jvc3MgZXZlcnkgY2FyZCk7IGRlZ3JhZGUgZ3JhY2VmdWxseSBpZiBhYnNlbnQuXG4gIGNvbnN0IGxvZ29EYXRhVXJpID0gYXdhaXQgbG9hZExvZ29EYXRhVXJpKGZhdmljb25QYXRoKTtcbiAgaWYgKCFsb2dvRGF0YVVyaSkge1xuICAgIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBmYXZpY29uIG5vdCBmb3VuZCAoJHtmYXZpY29uUGF0aH0pOyByZW5kZXJpbmcgY2FyZHMgd2l0aG91dCBhIGxvZ28uYCk7XG4gIH1cblxuICBhd2FpdCBnZW5lcmF0ZUltYWdlc1dpdGhQb29sKHsgYnJhbmRUZXh0LCBjaGFuZ2VkUGFnZXMsIGZvbnRzLCBsb2dvRGF0YVVyaSwgbWFuaWZlc3QsIG91dHB1dERpcmVjdG9yeSB9KTtcblxuICBhd2FpdCBta2RpcihkaXJuYW1lKG1hbmlmZXN0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUobWFuaWZlc3RQYXRoLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgTUFOSUZFU1RfSU5ERU5UKSk7XG4gIGNvbnNvbGUud2FybihgT0cgaW1hZ2VzOiBkb25lLiBHZW5lcmF0ZWQgJHtTdHJpbmcoY2hhbmdlZFBhZ2VzLmxlbmd0aCl9IGltYWdlcy5gKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbWFnZXNXaXRoUG9vbChvcHRpb25zOiBHZW5lcmF0ZUltYWdlc1dpdGhQb29sT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGJyYW5kVGV4dCwgY2hhbmdlZFBhZ2VzLCBmb250cywgbG9nb0RhdGFVcmksIG1hbmlmZXN0LCBvdXRwdXREaXJlY3RvcnkgfSA9IG9wdGlvbnM7XG4gIGxldCBjb21wbGV0ZWQgPSAwO1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NOZXh0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAobGV0IHBhZ2UgPSBjaGFuZ2VkUGFnZXNbaW5kZXgrK107IHBhZ2UgIT09IHVuZGVmaW5lZDsgcGFnZSA9IGNoYW5nZWRQYWdlc1tpbmRleCsrXSkge1xuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IGAke291dHB1dERpcmVjdG9yeX0vJHtwYWdlLnNsdWd9LnBuZ2A7XG4gICAgICBhd2FpdCBta2RpcihkaXJuYW1lKG91dHB1dFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShvdXRwdXRQYXRoLCBhd2FpdCByZW5kZXJPZ0ltYWdlKHBhZ2UucGFyYW1zLCB7IGJyYW5kVGV4dCwgZm9udHMsIGxvZ29EYXRhVXJpIH0pKTtcbiAgICAgIG1hbmlmZXN0W3BhZ2Uuc2x1Z10gPSBwYWdlLmhhc2g7XG4gICAgICBjb21wbGV0ZWQrKztcbiAgICAgIGlmIChjb21wbGV0ZWQgJSBQUk9HUkVTU19MT0dfSU5URVJWQUwgPT09IDApIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgICR7U3RyaW5nKGNvbXBsZXRlZCl9LyR7U3RyaW5nKGNoYW5nZWRQYWdlcy5sZW5ndGgpfSBpbWFnZXMgZ2VuZXJhdGVkLi4uYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh7IGxlbmd0aDogQ09OQ1VSUkVOQ1kgfSwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHByb2Nlc3NOZXh0KCk7XG4gIH0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZENhY2hlTWFuaWZlc3QobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENhY2hlTWFuaWZlc3Q+IHtcbiAgcmV0dXJuIGV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSA/IChKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgJ3V0Zi04JykpIGFzIENhY2hlTWFuaWZlc3QpIDoge307XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnJvbnRNYXR0ZXIoY29udGVudDogc3RyaW5nKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCBmcm9udE1hdHRlciA9IEZST05UX01BVFRFUl9SRUdfRVhQLmV4ZWMoY29udGVudCk/Lmdyb3Vwcz8uWydGcm9udE1hdHRlciddO1xuICByZXR1cm4gZnJvbnRNYXR0ZXIgPT09IHVuZGVmaW5lZCA/IHt9IDogKHBhcnNlWWFtbChmcm9udE1hdHRlcikgYXMgbnVsbCB8IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KSA/PyB7fTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGFyc2VQYWdlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnREb2NzRGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBQYWdlRW50cnk+IHtcbiAgY29uc3QgZGF0YSA9IHBhcnNlRnJvbnRNYXR0ZXIoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpKTtcblxuICBjb25zdCB0aXRsZSA9IHRvT3B0aW9uYWxTdHJpbmcoZGF0YVsndGl0bGUnXSk7XG4gIGlmICghdGl0bGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGJhZGdlID0gZGF0YVsnc2lkZWJhciddIGFzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+PiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyYW1zOiBPZ0NhcmRDb250ZW50ID0ge1xuICAgIGJhZGdlOiB0b09wdGlvbmFsU3RyaW5nKGJhZGdlPy5bJ2JhZGdlJ10/LlsndGV4dCddKSxcbiAgICBkZXNjcmlwdGlvbjogdG9PcHRpb25hbFN0cmluZyhkYXRhWydkZXNjcmlwdGlvbiddKSA/PyAnJyxcbiAgICBzaWduYXR1cmU6IHRvT3B0aW9uYWxTdHJpbmcoZGF0YVsnc2lnbmF0dXJlJ10pID8/ICcnLFxuICAgIHRpdGxlXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBoYXNoOiBjb21wdXRlT2dIYXNoKHBhcmFtcyksXG4gICAgcGFyYW1zLFxuICAgIHNsdWc6IGdldE9nSW1hZ2VQYWdlU2x1ZyhkYXRhLCBmaWxlUGF0aCwgY29udGVudERvY3NEaXJlY3RvcnkpXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRvT3B0aW9uYWxTdHJpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWxrRGlyZWN0b3J5KGRpcmVjdG9yeTogc3RyaW5nLCBjb250ZW50RG9jc0RpcmVjdG9yeTogc3RyaW5nLCBwYWdlczogUGFnZUVudHJ5W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gYCR7ZGlyZWN0b3J5fS8ke2VudHJ5Lm5hbWV9YDtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgYXdhaXQgd2Fsa0RpcmVjdG9yeShmdWxsUGF0aCwgY29udGVudERvY3NEaXJlY3RvcnksIHBhZ2VzKTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpIHx8IGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZHgnKSkge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHBhcnNlUGFnZShmdWxsUGF0aCwgY29udGVudERvY3NEaXJlY3RvcnkpO1xuICAgICAgaWYgKHBhZ2UpIHtcbiAgICAgICAgcGFnZXMucHVzaChwYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxlQUFlO0FBQ3hCLFNBQVMsU0FBUyxpQkFBaUI7QUFJbkMsU0FBUywwQkFBMEI7QUFDbkM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWtEUCxNQUFNLGNBQWM7QUFDcEIsTUFBTSx3QkFBd0I7QUFDOUIsTUFBTSxrQkFBa0I7QUFNeEIsTUFBTSx1QkFBdUI7QUFVN0IsZUFBc0IsaUJBQWlCLFNBQWdEO0FBQ3JGLFFBQU0sRUFBRSxXQUFXLHNCQUFzQixhQUFhLGdCQUFnQixnQkFBZ0IsSUFBSTtBQUMxRixRQUFNLGVBQWUsR0FBRyxlQUFlO0FBRXZDLE1BQUksQ0FBQyxXQUFXLG9CQUFvQixHQUFHO0FBQ3JDLFlBQVEsS0FBSyxxQ0FBcUMsb0JBQW9CLGNBQWM7QUFDcEY7QUFBQSxFQUNGO0FBR0EsUUFBTSxRQUFRLE1BQU0sVUFBVSxjQUFjO0FBQzVDLE1BQUksQ0FBQyxPQUFPO0FBQ1YsWUFBUSxL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
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Adds per-page Open Graph and Twitter image metadata. `defineDocsSiteConfig` registers it as Starlight route
|
|
6
|
+
* middleware; the cards it points at are the ones `generateOgImages` writes.
|
|
7
|
+
*/
|
|
8
|
+
import type { APIContext } from 'astro';
|
|
9
|
+
/**
|
|
10
|
+
* Adds Open Graph and Twitter image metadata to a Starlight documentation response.
|
|
11
|
+
*
|
|
12
|
+
* @param context - Astro's request context.
|
|
13
|
+
*/
|
|
14
|
+
export declare function onRequest(context: APIContext): void;
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
|
|
6
|
+
function onRequest(context) {
|
|
7
|
+
const { starlightRoute } = context.locals;
|
|
8
|
+
const { id } = starlightRoute;
|
|
9
|
+
const slug = id.replace(/\/index$/, "").replace(/\.\w+$/, "");
|
|
10
|
+
const base = starlightRoute.siteTitleHref.replace(/\/$/, "");
|
|
11
|
+
const origin = context.url.origin;
|
|
12
|
+
const ogImageUrl = `${origin}${base}/og/${slug || "index"}.png`;
|
|
13
|
+
starlightRoute.head.push(
|
|
14
|
+
{ attrs: { content: ogImageUrl, property: "og:image" }, tag: "meta" },
|
|
15
|
+
{ attrs: { content: "1200", property: "og:image:width" }, tag: "meta" },
|
|
16
|
+
{ attrs: { content: "630", property: "og:image:height" }, tag: "meta" },
|
|
17
|
+
{ attrs: { content: ogImageUrl, name: "twitter:image" }, tag: "meta" }
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
onRequest
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9yb3V0ZS1kYXRhLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQWRkcyBwZXItcGFnZSBPcGVuIEdyYXBoIGFuZCBUd2l0dGVyIGltYWdlIG1ldGFkYXRhLiBgZGVmaW5lRG9jc1NpdGVDb25maWdgIHJlZ2lzdGVycyBpdCBhcyBTdGFybGlnaHQgcm91dGVcbiAqIG1pZGRsZXdhcmU7IHRoZSBjYXJkcyBpdCBwb2ludHMgYXQgYXJlIHRoZSBvbmVzIGBnZW5lcmF0ZU9nSW1hZ2VzYCB3cml0ZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBUElDb250ZXh0IH0gZnJvbSAnYXN0cm8nO1xuXG4vKipcbiAqIEFkZHMgT3BlbiBHcmFwaCBhbmQgVHdpdHRlciBpbWFnZSBtZXRhZGF0YSB0byBhIFN0YXJsaWdodCBkb2N1bWVudGF0aW9uIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gQXN0cm8ncyByZXF1ZXN0IGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvblJlcXVlc3QoY29udGV4dDogQVBJQ29udGV4dCk6IHZvaWQge1xuICAvLyBTdGFybGlnaHQgc2V0cyB0aGlzIGRvY3VtZW50ZWQgcm91dGUtZGF0YSB2YWx1ZSBiZWZvcmUgaW52b2tpbmcgdXNlciBtaWRkbGV3YXJlLlxuICBjb25zdCB7IHN0YXJsaWdodFJvdXRlIH0gPSBjb250ZXh0LmxvY2FscztcbiAgY29uc3QgeyBpZCB9ID0gc3RhcmxpZ2h0Um91dGU7XG4gIGNvbnN0IHNsdWcgPSBpZFxuICAgIC5yZXBsYWNlKC9cXC9pbmRleCQvLCAnJylcbiAgICAucmVwbGFjZSgvXFwuXFx3KyQvLCAnJyk7XG4gIC8vIFRoZSBzaXRlIHRpdGxlIGxpbmtzIHRvIHRoZSBob21lIHBhZ2UsIHdoaWNoIGlzIHRoZSBiYXNlIHBhdGggb24gYSBzaXRlIHdpdGhvdXQgbG9jYWxlcy5cbiAgY29uc3QgYmFzZSA9IHN0YXJsaWdodFJvdXRlLnNpdGVUaXRsZUhyZWYucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgY29uc3Qgb3JpZ2luID0gY29udGV4dC51cmwub3JpZ2luO1xuICBjb25zdCBvZ0ltYWdlVXJsID0gYCR7b3JpZ2lufSR7YmFzZX0vb2cvJHtzbHVnIHx8ICdpbmRleCd9LnBuZ2A7XG5cbiAgc3RhcmxpZ2h0Um91dGUuaGVhZC5wdXNoKFxuICAgIHsgYXR0cnM6IHsgY29udGVudDogb2dJbWFnZVVybCwgcHJvcGVydHk6ICdvZzppbWFnZScgfSwgdGFnOiAnbWV0YScgfSxcbiAgICB7IGF0dHJzOiB7IGNvbnRlbnQ6ICcxMjAwJywgcHJvcGVydHk6ICdvZzppbWFnZTp3aWR0aCcgfSwgdGFnOiAnbWV0YScgfSxcbiAgICB7IGF0dHJzOiB7IGNvbnRlbnQ6ICc2MzAnLCBwcm9wZXJ0eTogJ29nOmltYWdlOmhlaWdodCcgfSwgdGFnOiAnbWV0YScgfSxcbiAgICB7IGF0dHJzOiB7IGNvbnRlbnQ6IG9nSW1hZ2VVcmwsIG5hbWU6ICd0d2l0dGVyOmltYWdlJyB9LCB0YWc6ICdtZXRhJyB9XG4gICk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQWNPLFNBQVMsVUFBVSxTQUEyQjtBQUVuRCxRQUFNLEVBQUUsZUFBZSxJQUFJLFFBQVE7QUFDbkMsUUFBTSxFQUFFLEdBQUcsSUFBSTtBQUNmLFFBQU0sT0FBTyxHQUNWLFFBQVEsWUFBWSxFQUFFLEVBQ3RCLFFBQVEsVUFBVSxFQUFFO0FBRXZCLFFBQU0sT0FBTyxlQUFlLGNBQWMsUUFBUSxPQUFPLEVBQUU7QUFDM0QsUUFBTSxTQUFTLFFBQVEsSUFBSTtBQUMzQixRQUFNLGFBQWEsR0FBRyxNQUFNLEdBQUcsSUFBSSxPQUFPLFFBQVEsT0FBTztBQUV6RCxpQkFBZSxLQUFLO0FBQUEsSUFDbEIsRUFBRSxPQUFPLEVBQUUsU0FBUyxZQUFZLFVBQVUsV0FBVyxHQUFHLEtBQUssT0FBTztBQUFBLElBQ3BFLEVBQUUsT0FBTyxFQUFFLFNBQVMsUUFBUSxVQUFVLGlCQUFpQixHQUFHLEtBQUssT0FBTztBQUFBLElBQ3RFLEVBQUUsT0FBTyxFQUFFLFNBQVMsT0FBTyxVQUFVLGtCQUFrQixHQUFHLEtBQUssT0FBTztBQUFBLElBQ3RFLEVBQUUsT0FBTyxFQUFFLFNBQVMsWUFBWSxNQUFNLGdCQUFnQixHQUFHLEtBQUssT0FBTztBQUFBLEVBQ3ZFO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Sätteri mdast plugin that turns GitHub alerts (`> [!NOTE]` ...) into Starlight asides.
|
|
6
|
+
*/
|
|
7
|
+
import type { MdastPluginDefinition } from 'satteri';
|
|
8
|
+
/**
|
|
9
|
+
* The Starlight aside variant each GitHub alert type renders as.
|
|
10
|
+
*
|
|
11
|
+
* Starlight has four variants for GitHub's five types, so `IMPORTANT` and `WARNING` share `caution`, and
|
|
12
|
+
* `CAUTION` - GitHub's most severe - takes `danger`. This is the mapping `starlight-github-alerts` uses.
|
|
13
|
+
*/
|
|
14
|
+
export declare const GITHUB_ALERT_ASIDE_VARIANTS: ReadonlyMap<string, string>;
|
|
15
|
+
/**
|
|
16
|
+
* Sätteri mdast plugin that turns GitHub alerts into Starlight asides.
|
|
17
|
+
*
|
|
18
|
+
* The guides keep GitHub's `> [!TYPE]` syntax because it also renders on GitHub, where most people read
|
|
19
|
+
* the repository. The site used to rely on `starlight-github-alerts` for the conversion, and on
|
|
20
|
+
* Starlight `0.42` that plugin silently does nothing: it registers itself in front of an mdast plugin
|
|
21
|
+
* NAMED `starlight-asides`, while Starlight now registers its asides as an unnamed factory, so the lookup
|
|
22
|
+
* misses and the plugin returns without a word. Every alert then rendered as a plain blockquote opening
|
|
23
|
+
* with the literal `[!WARNING]`.
|
|
24
|
+
*
|
|
25
|
+
* This plugin does the same conversion from the site's own `mdastPlugins`, which run before every plugin
|
|
26
|
+
* Starlight appends: it replaces the blockquote with a `containerDirective` named after the aside variant,
|
|
27
|
+
* exactly what `:::caution` parses to, and Starlight's own asides plugin then renders it.
|
|
28
|
+
*
|
|
29
|
+
* @returns The plugin definition.
|
|
30
|
+
*/
|
|
31
|
+
export declare function satteriGitHubAlerts(): MdastPluginDefinition;
|