@kensio/colophon 0.2.0 → 1.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/README.md +39 -8
- package/dist/config.d.ts +38 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +37 -8
- package/dist/config.js.map +1 -1
- package/dist/content/index.d.ts +13 -0
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +19 -1
- package/dist/content/index.js.map +1 -1
- package/dist/generate.d.ts +8 -8
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +10 -19
- package/dist/generate.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/render.d.ts +1 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +4 -3
- package/dist/render.js.map +1 -1
- package/dist/types.d.ts +18 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -59,9 +59,10 @@ Run it over a content tree:
|
|
|
59
59
|
colophon content --config colophon.config.ts
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
For every file that declares `meta_img_props`, Colophon writes
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
For every file that declares `meta_img_props`, Colophon writes one PNG per
|
|
63
|
+
output size next to it, named `<slug>-<size>.png`
|
|
64
|
+
(`post/index.md` → `post/post-og.png` and `post/post-square.png`). Existing
|
|
65
|
+
files are skipped unless you pass `--overwrite`.
|
|
65
66
|
|
|
66
67
|
```
|
|
67
68
|
colophon [contentDir] [options]
|
|
@@ -99,8 +100,8 @@ const images = await renderMetaImages(
|
|
|
99
100
|
);
|
|
100
101
|
|
|
101
102
|
for (const image of images) {
|
|
102
|
-
|
|
103
|
-
await writeFile(`
|
|
103
|
+
// image.name is the output-size name ("og", "square", …).
|
|
104
|
+
await writeFile(`social-${image.name}.png`, image.png);
|
|
104
105
|
}
|
|
105
106
|
```
|
|
106
107
|
|
|
@@ -146,14 +147,44 @@ All fields are optional; sensible defaults apply.
|
|
|
146
147
|
| `fontFamily` | `Arial, Helvetica, sans-serif` | Uses fonts available to `sharp`/librsvg. |
|
|
147
148
|
| `footer` | none | Footer text; omit the field for none. |
|
|
148
149
|
| `badge` | none | Corner badge for `banner`; omit the field for none. |
|
|
149
|
-
| `
|
|
150
|
+
| `sizes` | `og` + `square` | Named output sizes (see below). |
|
|
150
151
|
| `templates` | `banner`, `card` | Merged over the built-ins. |
|
|
151
152
|
|
|
153
|
+
### Output sizes and filenames
|
|
154
|
+
|
|
155
|
+
Each output size is a named `{ name, width, height }`. The `name` becomes the
|
|
156
|
+
filename suffix, so every image is distinct: `my-post-og.png`,
|
|
157
|
+
`my-post-square.png`. The default set is one 1.91:1 Open Graph landscape and one
|
|
158
|
+
1:1 square, which between them satisfy `og:image` and both `twitter:image` card
|
|
159
|
+
types (`summary_large_image` reuses the landscape; `summary` uses the square).
|
|
160
|
+
|
|
161
|
+
`SIZE_PRESETS` ships the common standards — compose your own set:
|
|
162
|
+
|
|
163
|
+
```ts
|
|
164
|
+
import { defineConfig, SIZE_PRESETS } from "@kensio/colophon";
|
|
165
|
+
|
|
166
|
+
export default defineConfig({
|
|
167
|
+
sizes: [
|
|
168
|
+
SIZE_PRESETS.og, // 1200×630 — og:image (Facebook, LinkedIn, Slack, …)
|
|
169
|
+
SIZE_PRESETS.square, // 1200×1200 — Twitter summary card, universal
|
|
170
|
+
SIZE_PRESETS.twitter, // 1200×600 (2:1) — Twitter summary_large_image
|
|
171
|
+
SIZE_PRESETS.pinterest, // 1000×1500 (2:3) — Pinterest
|
|
172
|
+
{ name: "hero", width: 1600, height: 900 }, // or anything custom
|
|
173
|
+
],
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
The base filename is the **post slug**: Colophon reads a top-level `slug` from
|
|
178
|
+
frontmatter (SEO-friendly, keyword-rich), falling back to the file name — or the
|
|
179
|
+
parent directory for `index.*` files. Point `slugField` at a different key, or
|
|
180
|
+
override naming entirely with `generate`'s `outputPath` callback.
|
|
181
|
+
|
|
152
182
|
### Frontmatter shape
|
|
153
183
|
|
|
154
184
|
By default Colophon reads a `meta_img_props` object and a `template` field
|
|
155
|
-
within it
|
|
156
|
-
`defaultTemplate`, `extensions`) so
|
|
185
|
+
within it, plus a top-level `slug`. All are configurable via walk options
|
|
186
|
+
(`propsKey`, `templateField`, `defaultTemplate`, `slugField`, `extensions`) so
|
|
187
|
+
you can match an existing convention.
|
|
157
188
|
|
|
158
189
|
## Sample output
|
|
159
190
|
|
package/dist/config.d.ts
CHANGED
|
@@ -1,6 +1,41 @@
|
|
|
1
|
-
import type { BrandColors, ColophonConfig,
|
|
2
|
-
/**
|
|
3
|
-
|
|
1
|
+
import type { BrandColors, ColophonConfig, OutputSize, ResolvedConfig } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Named output-size presets covering the common social-image standards. Each
|
|
4
|
+
* `name` becomes the filename suffix (e.g. `my-post-og.png`).
|
|
5
|
+
*
|
|
6
|
+
* - `og` — 1.91:1, the Open Graph standard (`og:image`): Facebook, LinkedIn,
|
|
7
|
+
* Slack, Discord, WhatsApp, Mastodon, and the usual `twitter:image` reuse.
|
|
8
|
+
* - `square` — 1:1, X/Twitter `summary` card and a universal fallback.
|
|
9
|
+
* - `twitter` — 2:1, X/Twitter `summary_large_image` card.
|
|
10
|
+
* - `pinterest` — 2:3 tall pin.
|
|
11
|
+
*/
|
|
12
|
+
export declare const SIZE_PRESETS: {
|
|
13
|
+
readonly og: {
|
|
14
|
+
readonly name: "og";
|
|
15
|
+
readonly width: 1200;
|
|
16
|
+
readonly height: 630;
|
|
17
|
+
};
|
|
18
|
+
readonly square: {
|
|
19
|
+
readonly name: "square";
|
|
20
|
+
readonly width: 1200;
|
|
21
|
+
readonly height: 1200;
|
|
22
|
+
};
|
|
23
|
+
readonly twitter: {
|
|
24
|
+
readonly name: "twitter";
|
|
25
|
+
readonly width: 1200;
|
|
26
|
+
readonly height: 600;
|
|
27
|
+
};
|
|
28
|
+
readonly pinterest: {
|
|
29
|
+
readonly name: "pinterest";
|
|
30
|
+
readonly width: 1000;
|
|
31
|
+
readonly height: 1500;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Default output sizes: the Open Graph landscape plus a square. Between them
|
|
36
|
+
* they satisfy `og:image` and both `twitter:image` card types.
|
|
37
|
+
*/
|
|
38
|
+
export declare const DEFAULT_SIZES: readonly OutputSize[];
|
|
4
39
|
/** Default font stack. Override via `config.fontFamily` for branded fonts. */
|
|
5
40
|
export declare const DEFAULT_FONT_FAMILY = "Arial, Helvetica, sans-serif";
|
|
6
41
|
/** Neutral default palette, used when no `colors.brand` is supplied. */
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,WAAW,EACX,cAAc,EACd,UAAU,EACV,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,WAAW,EACX,cAAc,EACd,UAAU,EACV,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY;;iBACjB,IAAI,EAAE,IAAI;iBAAE,KAAK,EAAE,IAAI;iBAAE,MAAM,EAAE,GAAG;;;iBAChC,IAAI,EAAE,QAAQ;iBAAE,KAAK,EAAE,IAAI;iBAAE,MAAM,EAAE,IAAI;;;iBACxC,IAAI,EAAE,SAAS;iBAAE,KAAK,EAAE,IAAI;iBAAE,MAAM,EAAE,GAAG;;;iBACvC,IAAI,EAAE,WAAW;iBAAE,KAAK,EAAE,IAAI;iBAAE,MAAM,EAAE,IAAI;;CACZ,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,UAAU,EAG9C,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB,iCAAiC,CAAC;AAElE,wEAAwE;AACxE,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,WAAW,CAKhD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAEnE;AAgDD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,cAAmB,GAAG,cAAc,CAYzE"}
|
package/dist/config.js
CHANGED
|
@@ -1,8 +1,27 @@
|
|
|
1
1
|
import { builtinTemplates } from "./templates/index.js";
|
|
2
|
-
/**
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Named output-size presets covering the common social-image standards. Each
|
|
4
|
+
* `name` becomes the filename suffix (e.g. `my-post-og.png`).
|
|
5
|
+
*
|
|
6
|
+
* - `og` — 1.91:1, the Open Graph standard (`og:image`): Facebook, LinkedIn,
|
|
7
|
+
* Slack, Discord, WhatsApp, Mastodon, and the usual `twitter:image` reuse.
|
|
8
|
+
* - `square` — 1:1, X/Twitter `summary` card and a universal fallback.
|
|
9
|
+
* - `twitter` — 2:1, X/Twitter `summary_large_image` card.
|
|
10
|
+
* - `pinterest` — 2:3 tall pin.
|
|
11
|
+
*/
|
|
12
|
+
export const SIZE_PRESETS = {
|
|
13
|
+
og: { name: "og", width: 1200, height: 630 },
|
|
14
|
+
square: { name: "square", width: 1200, height: 1200 },
|
|
15
|
+
twitter: { name: "twitter", width: 1200, height: 600 },
|
|
16
|
+
pinterest: { name: "pinterest", width: 1000, height: 1500 },
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Default output sizes: the Open Graph landscape plus a square. Between them
|
|
20
|
+
* they satisfy `og:image` and both `twitter:image` card types.
|
|
21
|
+
*/
|
|
22
|
+
export const DEFAULT_SIZES = [
|
|
23
|
+
SIZE_PRESETS.og,
|
|
24
|
+
SIZE_PRESETS.square,
|
|
6
25
|
];
|
|
7
26
|
/** Default font stack. Override via `config.fontFamily` for branded fonts. */
|
|
8
27
|
export const DEFAULT_FONT_FAMILY = "Arial, Helvetica, sans-serif";
|
|
@@ -43,21 +62,31 @@ function defaultBackground(colors) {
|
|
|
43
62
|
],
|
|
44
63
|
};
|
|
45
64
|
}
|
|
65
|
+
function resolveSizes(sizes) {
|
|
66
|
+
if (sizes === undefined || sizes.length === 0) {
|
|
67
|
+
return DEFAULT_SIZES;
|
|
68
|
+
}
|
|
69
|
+
const seen = new Set();
|
|
70
|
+
for (const size of sizes) {
|
|
71
|
+
if (seen.has(size.name)) {
|
|
72
|
+
throw new Error(`Duplicate output size name "${size.name}"; names must be unique so each image gets a distinct filename.`);
|
|
73
|
+
}
|
|
74
|
+
seen.add(size.name);
|
|
75
|
+
}
|
|
76
|
+
return sizes;
|
|
77
|
+
}
|
|
46
78
|
/**
|
|
47
79
|
* Apply defaults to a user config. Safe to call with no argument.
|
|
48
80
|
*/
|
|
49
81
|
export function resolveConfig(config = {}) {
|
|
50
82
|
const colors = resolveColors(config.colors);
|
|
51
|
-
const dimensions = config.dimensions && config.dimensions.length > 0
|
|
52
|
-
? config.dimensions
|
|
53
|
-
: DEFAULT_DIMENSIONS;
|
|
54
83
|
return {
|
|
55
84
|
colors,
|
|
56
85
|
background: config.background ?? defaultBackground(colors),
|
|
57
86
|
fontFamily: config.fontFamily ?? DEFAULT_FONT_FAMILY,
|
|
58
87
|
footer: config.footer,
|
|
59
88
|
badge: config.badge,
|
|
60
|
-
|
|
89
|
+
sizes: resolveSizes(config.sizes),
|
|
61
90
|
templates: { ...builtinTemplates, ...config.templates },
|
|
62
91
|
};
|
|
63
92
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AASxD
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/content/index.d.ts
CHANGED
|
@@ -11,6 +11,11 @@ export interface WalkOptions {
|
|
|
11
11
|
readonly templateField?: string;
|
|
12
12
|
/** Template to use when the template field is absent. */
|
|
13
13
|
readonly defaultTemplate?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Top-level frontmatter field to read the post slug from (used as the base
|
|
16
|
+
* filename). Default `slug`; falls back to the file/directory name.
|
|
17
|
+
*/
|
|
18
|
+
readonly slugField?: string;
|
|
14
19
|
/** File extensions to include. Default `.md` and `.markdown`. */
|
|
15
20
|
readonly extensions?: readonly string[];
|
|
16
21
|
}
|
|
@@ -22,8 +27,16 @@ export interface ContentFile {
|
|
|
22
27
|
readonly contentPath: string;
|
|
23
28
|
/** Absolute path on disk. */
|
|
24
29
|
readonly absolutePath: string;
|
|
30
|
+
/** Base filename for this post's images (frontmatter slug, or path-derived). */
|
|
31
|
+
readonly slug: string;
|
|
25
32
|
readonly props: MetaImageProps;
|
|
26
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Derive a slug from a file path: the filename without extension, or the
|
|
36
|
+
* parent directory name when the file is `index.*` (the common page-bundle
|
|
37
|
+
* convention).
|
|
38
|
+
*/
|
|
39
|
+
export declare function slugFromPath(filePath: string): string;
|
|
27
40
|
/**
|
|
28
41
|
* Extract {@link MetaImageProps} from a parsed frontmatter object, or return
|
|
29
42
|
* `undefined` if this file should be skipped (no props object, or no usable
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAuBlD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,6EAA6E;IAC7E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,yDAAyD;IACzD,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,iEAAiE;IACjE,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,6BAA6B;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIrD;AAMD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,GAAE,IAAI,CACX,WAAW,EACX,UAAU,GAAG,eAAe,GAAG,iBAAiB,CAC5C,GACL,cAAc,GAAG,SAAS,CA+C5B;AA8BD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,EAAE,CAAC,CAgCxB"}
|
package/dist/content/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import path from "node:path";
|
|
|
3
3
|
import matter from "gray-matter";
|
|
4
4
|
const defaultPropsKey = "meta_img_props";
|
|
5
5
|
const defaultTemplateField = "template";
|
|
6
|
+
const defaultSlugField = "slug";
|
|
6
7
|
const defaultExtensions = [".md", ".markdown"];
|
|
7
8
|
function coerceString(value) {
|
|
8
9
|
if (typeof value === "string") {
|
|
@@ -15,6 +16,16 @@ function coerceString(value) {
|
|
|
15
16
|
}
|
|
16
17
|
return undefined;
|
|
17
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Derive a slug from a file path: the filename without extension, or the
|
|
21
|
+
* parent directory name when the file is `index.*` (the common page-bundle
|
|
22
|
+
* convention).
|
|
23
|
+
*/
|
|
24
|
+
export function slugFromPath(filePath) {
|
|
25
|
+
const extension = path.extname(filePath);
|
|
26
|
+
const base = path.basename(filePath, extension);
|
|
27
|
+
return base === "index" ? path.basename(path.dirname(filePath)) : base;
|
|
28
|
+
}
|
|
18
29
|
function isRecord(value) {
|
|
19
30
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
20
31
|
}
|
|
@@ -82,15 +93,22 @@ async function collectContentFiles(dir, extensions) {
|
|
|
82
93
|
export async function walkContent(options) {
|
|
83
94
|
const extensions = options.extensions ?? defaultExtensions;
|
|
84
95
|
const filePaths = await collectContentFiles(options.dir, extensions);
|
|
96
|
+
const slugField = options.slugField ?? defaultSlugField;
|
|
85
97
|
const files = await Promise.all(filePaths.map(async (filePath) => {
|
|
86
98
|
const raw = await readFile(filePath, "utf8");
|
|
87
|
-
const
|
|
99
|
+
const frontmatter = matter(raw).data;
|
|
100
|
+
const props = extractProps(frontmatter, options);
|
|
88
101
|
if (props === undefined) {
|
|
89
102
|
return;
|
|
90
103
|
}
|
|
104
|
+
const declaredSlug = coerceString(frontmatter[slugField])?.trim();
|
|
105
|
+
const slug = declaredSlug !== undefined && declaredSlug !== ""
|
|
106
|
+
? declaredSlug
|
|
107
|
+
: slugFromPath(filePath);
|
|
91
108
|
return {
|
|
92
109
|
contentPath: path.relative(options.dir, filePath),
|
|
93
110
|
absolutePath: filePath,
|
|
111
|
+
slug,
|
|
94
112
|
props,
|
|
95
113
|
};
|
|
96
114
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,MAAM,MAAM,aAAa,CAAC;AAIjC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AACzC,MAAM,oBAAoB,GAAG,UAAU,CAAC;AACxC,MAAM,iBAAiB,GAAsB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AAElE,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,SAAS;QAC1B,OAAO,KAAK,KAAK,QAAQ,EACzB,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"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"}
|
package/dist/generate.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { ContentFile, WalkOptions } from "./content/index.js";
|
|
2
|
-
import type { ColophonConfig,
|
|
2
|
+
import type { ColophonConfig, OutputSize } from "./types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Outcome for one generated (or skipped) image.
|
|
5
5
|
*/
|
|
6
6
|
export interface GeneratedImage {
|
|
7
7
|
readonly contentPath: string;
|
|
8
|
-
readonly
|
|
8
|
+
readonly size: OutputSize;
|
|
9
9
|
readonly outputPath: string;
|
|
10
10
|
/** True when an existing file was left in place (no `overwrite`). */
|
|
11
11
|
readonly skipped: boolean;
|
|
@@ -17,21 +17,21 @@ export interface GenerateOptions {
|
|
|
17
17
|
/** Root content directory to walk. */
|
|
18
18
|
readonly contentDir: string;
|
|
19
19
|
readonly config?: ColophonConfig;
|
|
20
|
-
/** Extra walk options (props key, template field,
|
|
20
|
+
/** Extra walk options (props key, template field, slug field, extensions). */
|
|
21
21
|
readonly walk?: Omit<WalkOptions, "dir">;
|
|
22
22
|
/** Override where each image is written. */
|
|
23
|
-
readonly outputPath?: (file: ContentFile,
|
|
23
|
+
readonly outputPath?: (file: ContentFile, size: OutputSize) => string;
|
|
24
24
|
/** Re-render even when the output file already exists. Default `false`. */
|
|
25
25
|
readonly overwrite?: boolean;
|
|
26
26
|
/** Called after each image is written or skipped. */
|
|
27
27
|
readonly onResult?: (result: GeneratedImage) => void;
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
* Default output path: alongside the content file, named
|
|
31
|
-
*
|
|
32
|
-
* keeps
|
|
30
|
+
* Default output path: alongside the content file, named `<slug>-<size>.png`.
|
|
31
|
+
* The slug carries the post's keywords into the filename and the size name
|
|
32
|
+
* keeps every image distinct (e.g. `my-post-og.png`, `my-post-square.png`).
|
|
33
33
|
*/
|
|
34
|
-
export declare function defaultOutputPath(file: ContentFile,
|
|
34
|
+
export declare function defaultOutputPath(file: ContentFile, size: OutputSize): string;
|
|
35
35
|
/**
|
|
36
36
|
* Walk a content tree and render meta images for every file that declares
|
|
37
37
|
* props, writing PNGs to disk. Existing files are skipped unless `overwrite`
|
package/dist/generate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGnE,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGnE,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;IACjC,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzC,4CAA4C;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,KAAK,MAAM,CAAC;IACtE,2EAA2E;IAC3E,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;CACtD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAG7E;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,EAAE,CAAC,CAgC3B"}
|
package/dist/generate.js
CHANGED
|
@@ -5,19 +5,13 @@ import { resolveConfig } from "./config.js";
|
|
|
5
5
|
import { walkContent } from "./content/index.js";
|
|
6
6
|
import { buildSvg, renderSvgToPng } from "./render.js";
|
|
7
7
|
/**
|
|
8
|
-
* Default output path: alongside the content file, named
|
|
9
|
-
*
|
|
10
|
-
* keeps
|
|
8
|
+
* Default output path: alongside the content file, named `<slug>-<size>.png`.
|
|
9
|
+
* The slug carries the post's keywords into the filename and the size name
|
|
10
|
+
* keeps every image distinct (e.g. `my-post-og.png`, `my-post-square.png`).
|
|
11
11
|
*/
|
|
12
|
-
export function defaultOutputPath(file,
|
|
12
|
+
export function defaultOutputPath(file, size) {
|
|
13
13
|
const directory = path.dirname(file.absolutePath);
|
|
14
|
-
|
|
15
|
-
const base = path.basename(file.contentPath, extension);
|
|
16
|
-
const stem = base === "index" ? path.basename(directory) : base;
|
|
17
|
-
const suffix = index === 0
|
|
18
|
-
? ""
|
|
19
|
-
: `-${String(dimensions.width)}x${String(dimensions.height)}`;
|
|
20
|
-
return path.join(directory, `${stem}${suffix}.png`);
|
|
14
|
+
return path.join(directory, `${file.slug}-${size.name}.png`);
|
|
21
15
|
}
|
|
22
16
|
/**
|
|
23
17
|
* Walk a content tree and render meta images for every file that declares
|
|
@@ -29,15 +23,12 @@ export async function generate(options) {
|
|
|
29
23
|
const resolved = resolveConfig(options.config);
|
|
30
24
|
const toOutputPath = options.outputPath ?? defaultOutputPath;
|
|
31
25
|
const files = await walkContent({ dir: options.contentDir, ...options.walk });
|
|
32
|
-
const jobs = files.flatMap((file) => resolved.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
index,
|
|
36
|
-
})));
|
|
37
|
-
return Promise.all(jobs.map(async ({ file, dimensions, index }) => {
|
|
38
|
-
const outputPath = toOutputPath(file, dimensions, index);
|
|
26
|
+
const jobs = files.flatMap((file) => resolved.sizes.map((size) => ({ file, size })));
|
|
27
|
+
return Promise.all(jobs.map(async ({ file, size }) => {
|
|
28
|
+
const outputPath = toOutputPath(file, size);
|
|
39
29
|
const isSkipped = existsSync(outputPath) && options.overwrite !== true;
|
|
40
30
|
if (!isSkipped) {
|
|
31
|
+
const dimensions = { width: size.width, height: size.height };
|
|
41
32
|
const svg = buildSvg(file.props, resolved, dimensions);
|
|
42
33
|
const png = await renderSvgToPng(svg, dimensions);
|
|
43
34
|
await mkdir(path.dirname(outputPath), { recursive: true });
|
|
@@ -45,7 +36,7 @@ export async function generate(options) {
|
|
|
45
36
|
}
|
|
46
37
|
const result = {
|
|
47
38
|
contentPath: file.contentPath,
|
|
48
|
-
|
|
39
|
+
size,
|
|
49
40
|
outputPath,
|
|
50
41
|
skipped: isSkipped,
|
|
51
42
|
};
|
package/dist/generate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA+BvD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAiB,EAAE,IAAgB;IACnE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAAwB;IAExB,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,IAAI,iBAAiB,CAAC;IAC7D,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE9E,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAClC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAC/C,CAAC;IAEF,OAAO,OAAO,CAAC,GAAG,CAChB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QAChC,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC;QAEvE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9D,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YACvD,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAClD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,MAAM,GAAmB;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,IAAI;YACJ,UAAU;YACV,OAAO,EAAE,SAAS;SACnB,CAAC;QACF,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export type { Background, Badge, BrandColors, ColophonConfig, Dimensions, GradientStop, MetaImageProps, RenderedMetaImage, ResolvedConfig, Template, TemplateContext, } from "./types.js";
|
|
2
|
-
export { DEFAULT_COLORS,
|
|
1
|
+
export type { Background, Badge, BrandColors, ColophonConfig, Dimensions, GradientStop, MetaImageProps, OutputSize, RenderedMetaImage, ResolvedConfig, Template, TemplateContext, } from "./types.js";
|
|
2
|
+
export { DEFAULT_COLORS, DEFAULT_FONT_FAMILY, DEFAULT_SIZES, defineConfig, resolveConfig, SIZE_PRESETS, } from "./config.js";
|
|
3
3
|
export { backgroundSvg } from "./background.js";
|
|
4
4
|
export { buildSvg, renderMetaImages, renderSvgToPng } from "./render.js";
|
|
5
5
|
export { bannerTemplate, builtinTemplates, cardTemplate, } from "./templates/index.js";
|
|
6
6
|
export { defaultOutputPath, generate } from "./generate.js";
|
|
7
7
|
export type { GeneratedImage, GenerateOptions } from "./generate.js";
|
|
8
8
|
export { escapeXml, wrapText } from "./text.js";
|
|
9
|
-
export { extractProps, walkContent } from "./content/index.js";
|
|
9
|
+
export { extractProps, slugFromPath, walkContent } from "./content/index.js";
|
|
10
10
|
export type { ContentFile, WalkOptions } from "./content/index.js";
|
|
11
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,KAAK,EACL,WAAW,EACX,cAAc,EACd,UAAU,EACV,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,cAAc,EACd,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,KAAK,EACL,WAAW,EACX,cAAc,EACd,UAAU,EACV,YAAY,EACZ,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7E,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { DEFAULT_COLORS,
|
|
1
|
+
export { DEFAULT_COLORS, DEFAULT_FONT_FAMILY, DEFAULT_SIZES, defineConfig, resolveConfig, SIZE_PRESETS, } from "./config.js";
|
|
2
2
|
export { backgroundSvg } from "./background.js";
|
|
3
3
|
export { buildSvg, renderMetaImages, renderSvgToPng } from "./render.js";
|
|
4
4
|
export { bannerTemplate, builtinTemplates, cardTemplate, } from "./templates/index.js";
|
|
5
5
|
export { defaultOutputPath, generate } from "./generate.js";
|
|
6
6
|
export { escapeXml, wrapText } from "./text.js";
|
|
7
|
-
export { extractProps, walkContent } from "./content/index.js";
|
|
7
|
+
export { extractProps, slugFromPath, walkContent } from "./content/index.js";
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG5D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/render.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export declare function buildSvg(props: MetaImageProps, config: ResolvedConfig,
|
|
|
9
9
|
*/
|
|
10
10
|
export declare function renderSvgToPng(svg: string, dimensions: Dimensions): Promise<Buffer>;
|
|
11
11
|
/**
|
|
12
|
-
* Render an image for every configured
|
|
12
|
+
* Render an image for every configured output size from a single set of props.
|
|
13
13
|
* This is the reusable core: it takes props and config and returns rendered
|
|
14
14
|
* bytes, with no filesystem or content-discovery concerns.
|
|
15
15
|
*/
|
package/dist/render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EAEf,MAAM,YAAY,CAAC;AAmBpB;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,UAAU,GACrB,MAAM,CAWR;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,cAAc,EACrB,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EAEf,MAAM,YAAY,CAAC;AAmBpB;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,UAAU,GACrB,MAAM,CAWR;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,cAAc,EACrB,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAc9B"}
|
package/dist/render.js
CHANGED
|
@@ -35,7 +35,7 @@ export async function renderSvgToPng(svg, dimensions) {
|
|
|
35
35
|
.toBuffer();
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
* Render an image for every configured
|
|
38
|
+
* Render an image for every configured output size from a single set of props.
|
|
39
39
|
* This is the reusable core: it takes props and config and returns rendered
|
|
40
40
|
* bytes, with no filesystem or content-discovery concerns.
|
|
41
41
|
*/
|
|
@@ -43,10 +43,11 @@ export async function renderMetaImages(props, config) {
|
|
|
43
43
|
const resolved = resolveConfig(config);
|
|
44
44
|
// Validate the template once up front so a bad name fails fast.
|
|
45
45
|
selectTemplate(resolved, props.template);
|
|
46
|
-
return Promise.all(resolved.
|
|
46
|
+
return Promise.all(resolved.sizes.map(async (size) => {
|
|
47
|
+
const dimensions = { width: size.width, height: size.height };
|
|
47
48
|
const svg = buildSvg(props, resolved, dimensions);
|
|
48
49
|
const png = await renderSvgToPng(svg, dimensions);
|
|
49
|
-
return { dimensions, svg, png };
|
|
50
|
+
return { name: size.name, dimensions, svg, png };
|
|
50
51
|
}));
|
|
51
52
|
}
|
|
52
53
|
//# sourceMappingURL=render.js.map
|
package/dist/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAU5C,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC,SAAS,cAAc,CAAC,MAAsB,EAAE,IAAY;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;aAC5C,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aACtC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,2BAA2B,SAAS,GAAG,CACjE,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAqB,EACrB,MAAsB,EACtB,UAAsB;IAEtB,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC;IAErC,OAAO,CACL,eAAe,MAAM,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,GAAG;QAC1D,iBAAiB,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG;QACnD,uCAAuC,UAAU,GAAG,IAAI,QAAQ,CACjE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,UAAsB;IAEtB,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC3B,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;SAC5D,GAAG,EAAE;SACL,QAAQ,EAAE,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAqB,EACrB,MAAuB;IAEvB,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAEvC,gEAAgE;IAChE,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEzC,OAAO,OAAO,CAAC,GAAG,CAChB,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAU5C,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC,SAAS,cAAc,CAAC,MAAsB,EAAE,IAAY;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;aAC5C,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aACtC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,2BAA2B,SAAS,GAAG,CACjE,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAqB,EACrB,MAAsB,EACtB,UAAsB;IAEtB,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC;IAErC,OAAO,CACL,eAAe,MAAM,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,GAAG;QAC1D,iBAAiB,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG;QACnD,uCAAuC,UAAU,GAAG,IAAI,QAAQ,CACjE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAW,EACX,UAAsB;IAEtB,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC3B,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;SAC5D,GAAG,EAAE;SACL,QAAQ,EAAE,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAqB,EACrB,MAAuB;IAEvB,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAEvC,gEAAgE;IAChE,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEzC,OAAO,OAAO,CAAC,GAAG,CAChB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAChC,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAClD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnD,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -5,6 +5,16 @@ export interface Dimensions {
|
|
|
5
5
|
readonly width: number;
|
|
6
6
|
readonly height: number;
|
|
7
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* A named output size. The `name` identifies the size in output filenames
|
|
10
|
+
* (e.g. `og`, `square`) and must be unique within a config, so every
|
|
11
|
+
* generated image gets a distinct, descriptive filename.
|
|
12
|
+
*/
|
|
13
|
+
export interface OutputSize {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly width: number;
|
|
16
|
+
readonly height: number;
|
|
17
|
+
}
|
|
8
18
|
/**
|
|
9
19
|
* A single colour stop in a gradient background.
|
|
10
20
|
*/
|
|
@@ -101,8 +111,11 @@ export interface ColophonConfig {
|
|
|
101
111
|
readonly footer?: string;
|
|
102
112
|
/** Corner badge for the `banner` template. Omit (the default) for none. */
|
|
103
113
|
readonly badge?: Badge;
|
|
104
|
-
/**
|
|
105
|
-
|
|
114
|
+
/**
|
|
115
|
+
* Output sizes, each with a unique `name` used in the filename. Defaults to
|
|
116
|
+
* a 1.91:1 Open Graph landscape plus a 1:1 square (see `DEFAULT_SIZES`).
|
|
117
|
+
*/
|
|
118
|
+
readonly sizes?: readonly OutputSize[];
|
|
106
119
|
/** Extra templates, merged over (and able to override) the built-ins. */
|
|
107
120
|
readonly templates?: Readonly<Record<string, Template>>;
|
|
108
121
|
}
|
|
@@ -115,13 +128,15 @@ export interface ResolvedConfig {
|
|
|
115
128
|
readonly fontFamily: string;
|
|
116
129
|
readonly footer: string | undefined;
|
|
117
130
|
readonly badge: Badge | undefined;
|
|
118
|
-
readonly
|
|
131
|
+
readonly sizes: readonly OutputSize[];
|
|
119
132
|
readonly templates: Readonly<Record<string, Template>>;
|
|
120
133
|
}
|
|
121
134
|
/**
|
|
122
135
|
* One rendered image: the source SVG plus the encoded PNG bytes.
|
|
123
136
|
*/
|
|
124
137
|
export interface RenderedMetaImage {
|
|
138
|
+
/** The name of the output size this image was rendered for. */
|
|
139
|
+
readonly name: string;
|
|
125
140
|
readonly dimensions: Dimensions;
|
|
126
141
|
readonly svg: string;
|
|
127
142
|
readonly png: Buffer;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClD;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,QAAQ,CAAC,EAAE,CAAC,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D,CAAC;AAEN;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,iDAAiD;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACnC,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAED;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAAC;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
},
|
|
9
9
|
"homepage": "https://github.com/KensioSoftware/colophon#readme",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
|
-
"version": "0.
|
|
11
|
+
"version": "1.0.0",
|
|
12
12
|
"type": "module",
|
|
13
13
|
"main": "./dist/index.js",
|
|
14
14
|
"types": "./dist/index.d.ts",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"@eslint/js": "^10.0.1",
|
|
54
54
|
"@kensio/smartass": "^1.33.0",
|
|
55
55
|
"@types/eslint-plugin-security": "^3.0.1",
|
|
56
|
-
"@types/node": "^
|
|
56
|
+
"@types/node": "^26.0.0",
|
|
57
57
|
"@typescript/native": "npm:typescript@^7.0.2",
|
|
58
58
|
"@vitest/coverage-v8": "^4.1.10",
|
|
59
59
|
"@vitest/eslint-plugin": "^1.6.22",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"eslint-plugin-jsdoc": "^63.0.13",
|
|
63
63
|
"eslint-plugin-no-secrets": "^2.3.3",
|
|
64
64
|
"eslint-plugin-security": "^4.0.1",
|
|
65
|
-
"eslint-plugin-unicorn": "^
|
|
65
|
+
"eslint-plugin-unicorn": "^68.0.0",
|
|
66
66
|
"globals": "^17.7.0",
|
|
67
67
|
"jiti": "^2.7.0",
|
|
68
68
|
"prettier": "^3.9.5",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
},
|
|
73
73
|
"dependencies": {
|
|
74
74
|
"gray-matter": "^4.0.3",
|
|
75
|
-
"sharp": "^0.
|
|
75
|
+
"sharp": "^0.35.3"
|
|
76
76
|
},
|
|
77
77
|
"scripts": {
|
|
78
78
|
"build": "tsc -p tsconfig.build.json",
|