@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.
- 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-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/linters/markdownlint.cjs +4 -1
- 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-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/linters/markdownlint.mjs +4 -1
- 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 +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>;
|