@kensio/colophon 2.2.0 → 2.4.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 +62 -265
- package/dist/background.d.ts +7 -2
- package/dist/background.d.ts.map +1 -1
- package/dist/background.js +44 -1
- package/dist/background.js.map +1 -1
- package/dist/cli/args.d.ts +14 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +67 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config.d.ts +12 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +43 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +35 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli.js +34 -6
- package/dist/cli.js.map +1 -1
- package/dist/config/defaults.d.ts +65 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +64 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +22 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +54 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/resolve.d.ts +31 -0
- package/dist/config/resolve.d.ts.map +1 -0
- package/dist/config/resolve.js +82 -0
- package/dist/config/resolve.js.map +1 -0
- package/dist/config/size.d.ts +20 -0
- package/dist/config/size.d.ts.map +1 -0
- package/dist/config/size.js +47 -0
- package/dist/config/size.js.map +1 -0
- package/dist/config.d.ts +27 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +78 -2
- package/dist/config.js.map +1 -1
- package/dist/content/index.d.ts +5 -51
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +3 -115
- package/dist/content/index.js.map +1 -1
- package/dist/content/props.d.ts +15 -0
- package/dist/content/props.d.ts.map +1 -0
- package/dist/content/props.js +71 -0
- package/dist/content/props.js.map +1 -0
- package/dist/content/slug.d.ts +23 -0
- package/dist/content/slug.d.ts.map +1 -0
- package/dist/content/slug.js +52 -0
- package/dist/content/slug.js.map +1 -0
- package/dist/content/walk.d.ts +17 -0
- package/dist/content/walk.d.ts.map +1 -0
- package/dist/content/walk.js +57 -0
- package/dist/content/walk.js.map +1 -0
- package/dist/fonts/index.d.ts +11 -0
- package/dist/fonts/index.d.ts.map +1 -0
- package/dist/fonts/index.js +12 -0
- package/dist/fonts/index.js.map +1 -0
- package/dist/fonts/materialise.d.ts +7 -0
- package/dist/fonts/materialise.d.ts.map +1 -0
- package/dist/fonts/materialise.js +47 -0
- package/dist/fonts/materialise.js.map +1 -0
- package/dist/fonts/resolve.d.ts +7 -0
- package/dist/fonts/resolve.d.ts.map +1 -0
- package/dist/fonts/resolve.js +50 -0
- package/dist/fonts/resolve.js.map +1 -0
- package/dist/fonts.d.ts +18 -0
- package/dist/fonts.d.ts.map +1 -0
- package/dist/fonts.js +102 -0
- package/dist/fonts.js.map +1 -0
- package/dist/generate/extra.d.ts +16 -0
- package/dist/generate/extra.d.ts.map +1 -0
- package/dist/generate/extra.js +60 -0
- package/dist/generate/extra.js.map +1 -0
- package/dist/generate/index.d.ts +19 -0
- package/dist/generate/index.d.ts.map +1 -0
- package/dist/generate/index.js +46 -0
- package/dist/generate/index.js.map +1 -0
- package/dist/generate/job.d.ts +35 -0
- package/dist/generate/job.d.ts.map +1 -0
- package/dist/generate/job.js +2 -0
- package/dist/generate/job.js.map +1 -0
- package/dist/generate/options.d.ts +56 -0
- package/dist/generate/options.d.ts.map +1 -0
- package/dist/generate/options.js +17 -0
- package/dist/generate/options.js.map +1 -0
- package/dist/generate/output-path.d.ts +12 -0
- package/dist/generate/output-path.d.ts.map +1 -0
- package/dist/generate/output-path.js +18 -0
- package/dist/generate/output-path.js.map +1 -0
- package/dist/generate/outputs.d.ts +28 -0
- package/dist/generate/outputs.d.ts.map +1 -0
- package/dist/generate/outputs.js +71 -0
- package/dist/generate/outputs.js.map +1 -0
- package/dist/generate/plan.d.ts +21 -0
- package/dist/generate/plan.d.ts.map +1 -0
- package/dist/generate/plan.js +72 -0
- package/dist/generate/plan.js.map +1 -0
- package/dist/generate/render-image.d.ts +11 -0
- package/dist/generate/render-image.d.ts.map +1 -0
- package/dist/generate/render-image.js +27 -0
- package/dist/generate/render-image.js.map +1 -0
- package/dist/generate.d.ts +27 -6
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +69 -15
- package/dist/generate.js.map +1 -1
- package/dist/highlight/color.d.ts +9 -0
- package/dist/highlight/color.d.ts.map +1 -0
- package/dist/highlight/color.js +15 -0
- package/dist/highlight/color.js.map +1 -0
- package/dist/highlight/grid.d.ts +14 -0
- package/dist/highlight/grid.d.ts.map +1 -0
- package/dist/highlight/grid.js +36 -0
- package/dist/highlight/grid.js.map +1 -0
- package/dist/highlight/index.d.ts +12 -0
- package/dist/highlight/index.d.ts.map +1 -0
- package/dist/highlight/index.js +31 -0
- package/dist/highlight/index.js.map +1 -0
- package/dist/highlight/language.d.ts +13 -0
- package/dist/highlight/language.d.ts.map +1 -0
- package/dist/highlight/language.js +41 -0
- package/dist/highlight/language.js.map +1 -0
- package/dist/highlight/normalise.d.ts +17 -0
- package/dist/highlight/normalise.d.ts.map +1 -0
- package/dist/highlight/normalise.js +37 -0
- package/dist/highlight/normalise.js.map +1 -0
- package/dist/highlight/types.d.ts +40 -0
- package/dist/highlight/types.d.ts.map +1 -0
- package/dist/highlight/types.js +2 -0
- package/dist/highlight/types.js.map +1 -0
- package/dist/image/index.d.ts +18 -0
- package/dist/image/index.d.ts.map +1 -0
- package/dist/image/index.js +42 -0
- package/dist/image/index.js.map +1 -0
- package/dist/image/jpeg.d.ts +10 -0
- package/dist/image/jpeg.d.ts.map +1 -0
- package/dist/image/jpeg.js +57 -0
- package/dist/image/jpeg.js.map +1 -0
- package/dist/image/load.d.ts +4 -0
- package/dist/image/load.d.ts.map +1 -0
- package/dist/image/load.js +60 -0
- package/dist/image/load.js.map +1 -0
- package/dist/image/media.d.ts +10 -0
- package/dist/image/media.d.ts.map +1 -0
- package/dist/image/media.js +37 -0
- package/dist/image/media.js.map +1 -0
- package/dist/image/resolve.d.ts +13 -0
- package/dist/image/resolve.d.ts.map +1 -0
- package/dist/image/resolve.js +38 -0
- package/dist/image/resolve.js.map +1 -0
- package/dist/image/size.d.ts +22 -0
- package/dist/image/size.d.ts.map +1 -0
- package/dist/image/size.js +60 -0
- package/dist/image/size.js.map +1 -0
- package/dist/image/svg.d.ts +12 -0
- package/dist/image/svg.d.ts.map +1 -0
- package/dist/image/svg.js +61 -0
- package/dist/image/svg.js.map +1 -0
- package/dist/image/uri.d.ts +9 -0
- package/dist/image/uri.d.ts.map +1 -0
- package/dist/image/uri.js +22 -0
- package/dist/image/uri.js.map +1 -0
- package/dist/index.d.ts +19 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -5
- package/dist/index.js.map +1 -1
- package/dist/layout/block.d.ts +37 -0
- package/dist/layout/block.d.ts.map +1 -0
- package/dist/layout/block.js +26 -0
- package/dist/layout/block.js.map +1 -0
- package/dist/layout/box.d.ts +20 -0
- package/dist/layout/box.d.ts.map +1 -0
- package/dist/layout/box.js +61 -0
- package/dist/layout/box.js.map +1 -0
- package/dist/layout/distribute.d.ts +15 -0
- package/dist/layout/distribute.d.ts.map +1 -0
- package/dist/layout/distribute.js +30 -0
- package/dist/layout/distribute.js.map +1 -0
- package/dist/layout/image.d.ts +42 -0
- package/dist/layout/image.d.ts.map +1 -0
- package/dist/layout/image.js +34 -0
- package/dist/layout/image.js.map +1 -0
- package/dist/layout/index.d.ts +40 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +30 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/layout/lines.d.ts +45 -0
- package/dist/layout/lines.d.ts.map +1 -0
- package/dist/layout/lines.js +71 -0
- package/dist/layout/lines.js.map +1 -0
- package/dist/layout/measure.d.ts +11 -0
- package/dist/layout/measure.d.ts.map +1 -0
- package/dist/layout/measure.js +11 -0
- package/dist/layout/measure.js.map +1 -0
- package/dist/layout/panel.d.ts +20 -0
- package/dist/layout/panel.d.ts.map +1 -0
- package/dist/layout/panel.js +22 -0
- package/dist/layout/panel.js.map +1 -0
- package/dist/layout/row.d.ts +15 -0
- package/dist/layout/row.d.ts.map +1 -0
- package/dist/layout/row.js +20 -0
- package/dist/layout/row.js.map +1 -0
- package/dist/layout/scrim.d.ts +23 -0
- package/dist/layout/scrim.d.ts.map +1 -0
- package/dist/layout/scrim.js +38 -0
- package/dist/layout/scrim.js.map +1 -0
- package/dist/layout/stack.d.ts +14 -0
- package/dist/layout/stack.d.ts.map +1 -0
- package/dist/layout/stack.js +19 -0
- package/dist/layout/stack.js.map +1 -0
- package/dist/layout/types.d.ts +49 -0
- package/dist/layout/types.d.ts.map +1 -0
- package/dist/layout/types.js +2 -0
- package/dist/layout/types.js.map +1 -0
- package/dist/manifest/build.d.ts +14 -0
- package/dist/manifest/build.d.ts.map +1 -0
- package/dist/manifest/build.js +43 -0
- package/dist/manifest/build.js.map +1 -0
- package/dist/manifest/index.d.ts +27 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +31 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/order.d.ts +12 -0
- package/dist/manifest/order.d.ts.map +1 -0
- package/dist/manifest/order.js +17 -0
- package/dist/manifest/order.js.map +1 -0
- package/dist/manifest/page.d.ts +24 -0
- package/dist/manifest/page.d.ts.map +1 -0
- package/dist/manifest/page.js +55 -0
- package/dist/manifest/page.js.map +1 -0
- package/dist/measure/estimate.d.ts +10 -0
- package/dist/measure/estimate.d.ts.map +1 -0
- package/dist/measure/estimate.js +58 -0
- package/dist/measure/estimate.js.map +1 -0
- package/dist/measure/faces.d.ts +15 -0
- package/dist/measure/faces.d.ts.map +1 -0
- package/dist/measure/faces.js +70 -0
- package/dist/measure/faces.js.map +1 -0
- package/dist/measure/index.d.ts +16 -0
- package/dist/measure/index.d.ts.map +1 -0
- package/dist/measure/index.js +0 -0
- package/dist/measure/index.js.map +1 -0
- package/dist/measure/runs.d.ts +17 -0
- package/dist/measure/runs.d.ts.map +1 -0
- package/dist/measure/runs.js +39 -0
- package/dist/measure/runs.js.map +1 -0
- package/dist/measure/select.d.ts +13 -0
- package/dist/measure/select.d.ts.map +1 -0
- package/dist/measure/select.js +47 -0
- package/dist/measure/select.js.map +1 -0
- package/dist/meta/html.d.ts +14 -0
- package/dist/meta/html.d.ts.map +1 -0
- package/dist/meta/html.js +24 -0
- package/dist/meta/html.js.map +1 -0
- package/dist/meta/index.d.ts +11 -0
- package/dist/meta/index.d.ts.map +1 -0
- package/dist/meta/index.js +11 -0
- package/dist/meta/index.js.map +1 -0
- package/dist/meta/tags.d.ts +21 -0
- package/dist/meta/tags.d.ts.map +1 -0
- package/dist/meta/tags.js +72 -0
- package/dist/meta/tags.js.map +1 -0
- package/dist/meta/url.d.ts +15 -0
- package/dist/meta/url.d.ts.map +1 -0
- package/dist/meta/url.js +34 -0
- package/dist/meta/url.js.map +1 -0
- package/dist/placement/check.d.ts +16 -0
- package/dist/placement/check.d.ts.map +1 -0
- package/dist/placement/check.js +40 -0
- package/dist/placement/check.js.map +1 -0
- package/dist/placement/index.d.ts +29 -0
- package/dist/placement/index.d.ts.map +1 -0
- package/dist/placement/index.js +61 -0
- package/dist/placement/index.js.map +1 -0
- package/dist/placement/relative.d.ts +31 -0
- package/dist/placement/relative.d.ts.map +1 -0
- package/dist/placement/relative.js +53 -0
- package/dist/placement/relative.js.map +1 -0
- package/dist/pool.d.ts +18 -0
- package/dist/pool.d.ts.map +1 -0
- package/dist/pool.js +56 -0
- package/dist/pool.js.map +1 -0
- package/dist/props.d.ts +7 -0
- package/dist/props.d.ts.map +1 -0
- package/dist/props.js +17 -0
- package/dist/props.js.map +1 -0
- package/dist/render/index.d.ts +10 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +27 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/png.d.ts +10 -0
- package/dist/render/png.d.ts.map +1 -0
- package/dist/render/png.js +30 -0
- package/dist/render/png.js.map +1 -0
- package/dist/render/svg.d.ts +12 -0
- package/dist/render/svg.d.ts.map +1 -0
- package/dist/render/svg.js +35 -0
- package/dist/render/svg.js.map +1 -0
- package/dist/render/template.d.ts +9 -0
- package/dist/render/template.d.ts.map +1 -0
- package/dist/render/template.js +17 -0
- package/dist/render/template.js.map +1 -0
- package/dist/render.d.ts +6 -2
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +31 -10
- package/dist/render.js.map +1 -1
- package/dist/stamp/chunk.d.ts +16 -0
- package/dist/stamp/chunk.d.ts.map +1 -0
- package/dist/stamp/chunk.js +46 -0
- package/dist/stamp/chunk.js.map +1 -0
- package/dist/stamp/config-digest.d.ts +11 -0
- package/dist/stamp/config-digest.d.ts.map +1 -0
- package/dist/stamp/config-digest.js +62 -0
- package/dist/stamp/config-digest.js.map +1 -0
- package/dist/stamp/digest.d.ts +8 -0
- package/dist/stamp/digest.d.ts.map +1 -0
- package/dist/stamp/digest.js +20 -0
- package/dist/stamp/digest.js.map +1 -0
- package/dist/stamp/index.d.ts +20 -0
- package/dist/stamp/index.d.ts.map +1 -0
- package/dist/stamp/index.js +40 -0
- package/dist/stamp/index.js.map +1 -0
- package/dist/stamp/read.d.ts +7 -0
- package/dist/stamp/read.d.ts.map +1 -0
- package/dist/stamp/read.js +62 -0
- package/dist/stamp/read.js.map +1 -0
- package/dist/stamp.d.ts +29 -0
- package/dist/stamp.d.ts.map +1 -0
- package/dist/stamp.js +198 -0
- package/dist/stamp.js.map +1 -0
- package/dist/templates/attribution.d.ts +17 -0
- package/dist/templates/attribution.d.ts.map +1 -0
- package/dist/templates/attribution.js +39 -0
- package/dist/templates/attribution.js.map +1 -0
- package/dist/templates/banner/badge.d.ts +7 -0
- package/dist/templates/banner/badge.d.ts.map +1 -0
- package/dist/templates/banner/badge.js +21 -0
- package/dist/templates/banner/badge.js.map +1 -0
- package/dist/templates/banner/index.d.ts +12 -0
- package/dist/templates/banner/index.d.ts.map +1 -0
- package/dist/templates/banner/index.js +68 -0
- package/dist/templates/banner/index.js.map +1 -0
- package/dist/templates/banner/lines.d.ts +22 -0
- package/dist/templates/banner/lines.d.ts.map +1 -0
- package/dist/templates/banner/lines.js +35 -0
- package/dist/templates/banner/lines.js.map +1 -0
- package/dist/templates/banner/version.d.ts +9 -0
- package/dist/templates/banner/version.d.ts.map +1 -0
- package/dist/templates/banner/version.js +21 -0
- package/dist/templates/banner/version.js.map +1 -0
- package/dist/templates/card/index.d.ts +10 -0
- package/dist/templates/card/index.d.ts.map +1 -0
- package/dist/templates/card/index.js +55 -0
- package/dist/templates/card/index.js.map +1 -0
- package/dist/templates/card/lines.d.ts +21 -0
- package/dist/templates/card/lines.d.ts.map +1 -0
- package/dist/templates/card/lines.js +36 -0
- package/dist/templates/card/lines.js.map +1 -0
- package/dist/templates/code/chrome.d.ts +13 -0
- package/dist/templates/code/chrome.d.ts.map +1 -0
- package/dist/templates/code/chrome.js +33 -0
- package/dist/templates/code/chrome.js.map +1 -0
- package/dist/templates/code/clip.d.ts +18 -0
- package/dist/templates/code/clip.d.ts.map +1 -0
- package/dist/templates/code/clip.js +44 -0
- package/dist/templates/code/clip.js.map +1 -0
- package/dist/templates/code/ellipsis.d.ts +3 -0
- package/dist/templates/code/ellipsis.d.ts.map +1 -0
- package/dist/templates/code/ellipsis.js +3 -0
- package/dist/templates/code/ellipsis.js.map +1 -0
- package/dist/templates/code/fit.d.ts +27 -0
- package/dist/templates/code/fit.d.ts.map +1 -0
- package/dist/templates/code/fit.js +59 -0
- package/dist/templates/code/fit.js.map +1 -0
- package/dist/templates/code/index.d.ts +12 -0
- package/dist/templates/code/index.d.ts.map +1 -0
- package/dist/templates/code/index.js +65 -0
- package/dist/templates/code/index.js.map +1 -0
- package/dist/templates/code/layout.d.ts +21 -0
- package/dist/templates/code/layout.d.ts.map +1 -0
- package/dist/templates/code/layout.js +21 -0
- package/dist/templates/code/layout.js.map +1 -0
- package/dist/templates/code/panel.d.ts +30 -0
- package/dist/templates/code/panel.d.ts.map +1 -0
- package/dist/templates/code/panel.js +52 -0
- package/dist/templates/code/panel.js.map +1 -0
- package/dist/templates/code/plate.d.ts +17 -0
- package/dist/templates/code/plate.d.ts.map +1 -0
- package/dist/templates/code/plate.js +34 -0
- package/dist/templates/code/plate.js.map +1 -0
- package/dist/templates/code/spans.d.ts +19 -0
- package/dist/templates/code/spans.d.ts.map +1 -0
- package/dist/templates/code/spans.js +36 -0
- package/dist/templates/code/spans.js.map +1 -0
- package/dist/templates/code/warn.d.ts +11 -0
- package/dist/templates/code/warn.d.ts.map +1 -0
- package/dist/templates/code/warn.js +24 -0
- package/dist/templates/code/warn.js.map +1 -0
- package/dist/templates/code/width.d.ts +10 -0
- package/dist/templates/code/width.d.ts.map +1 -0
- package/dist/templates/code/width.js +26 -0
- package/dist/templates/code/width.js.map +1 -0
- package/dist/templates/footer.d.ts +29 -0
- package/dist/templates/footer.d.ts.map +1 -0
- package/dist/templates/footer.js +35 -0
- package/dist/templates/footer.js.map +1 -0
- package/dist/templates/index.d.ts +4 -4
- package/dist/templates/index.d.ts.map +1 -1
- package/dist/templates/index.js +7 -7
- package/dist/templates/index.js.map +1 -1
- package/dist/templates/logo.d.ts +15 -0
- package/dist/templates/logo.d.ts.map +1 -0
- package/dist/templates/logo.js +30 -0
- package/dist/templates/logo.js.map +1 -0
- package/dist/templates/measure.d.ts +11 -0
- package/dist/templates/measure.d.ts.map +1 -0
- package/dist/templates/measure.js +11 -0
- package/dist/templates/measure.js.map +1 -0
- package/dist/templates/props.d.ts +2 -2
- package/dist/templates/props.js +2 -2
- package/dist/templates/text.d.ts +37 -0
- package/dist/templates/text.d.ts.map +1 -0
- package/dist/templates/text.js +26 -0
- package/dist/templates/text.js.map +1 -0
- package/dist/text/break.d.ts +11 -0
- package/dist/text/break.d.ts.map +1 -0
- package/dist/text/break.js +30 -0
- package/dist/text/break.js.map +1 -0
- package/dist/text/element.d.ts +18 -0
- package/dist/text/element.d.ts.map +1 -0
- package/dist/text/element.js +19 -0
- package/dist/text/element.js.map +1 -0
- package/dist/text/escape.d.ts +5 -0
- package/dist/text/escape.d.ts.map +1 -0
- package/dist/text/escape.js +12 -0
- package/dist/text/escape.js.map +1 -0
- package/dist/text/fit.d.ts +30 -0
- package/dist/text/fit.d.ts.map +1 -0
- package/dist/text/fit.js +29 -0
- package/dist/text/fit.js.map +1 -0
- package/dist/text/index.d.ts +9 -0
- package/dist/text/index.d.ts.map +1 -0
- package/dist/text/index.js +6 -0
- package/dist/text/index.js.map +1 -0
- package/dist/text/stack.d.ts +24 -0
- package/dist/text/stack.d.ts.map +1 -0
- package/dist/text/stack.js +18 -0
- package/dist/text/stack.js.map +1 -0
- package/dist/text/wrap.d.ts +22 -0
- package/dist/text/wrap.d.ts.map +1 -0
- package/dist/text/wrap.js +41 -0
- package/dist/text/wrap.js.map +1 -0
- package/dist/types.d.ts +458 -18
- package/dist/types.d.ts.map +1 -1
- package/dist/validate/check.d.ts +13 -0
- package/dist/validate/check.d.ts.map +1 -0
- package/dist/validate/check.js +34 -0
- package/dist/validate/check.js.map +1 -0
- package/dist/validate/index.d.ts +15 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +42 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/validate/keys.d.ts +75 -0
- package/dist/validate/keys.d.ts.map +1 -0
- package/dist/validate/keys.js +203 -0
- package/dist/validate/keys.js.map +1 -0
- package/dist/validate/overrides.d.ts +5 -0
- package/dist/validate/overrides.d.ts.map +1 -0
- package/dist/validate/overrides.js +43 -0
- package/dist/validate/overrides.js.map +1 -0
- package/dist/validate/placement.d.ts +10 -0
- package/dist/validate/placement.d.ts.map +1 -0
- package/dist/validate/placement.js +38 -0
- package/dist/validate/placement.js.map +1 -0
- package/dist/validate/sizes.d.ts +9 -0
- package/dist/validate/sizes.d.ts.map +1 -0
- package/dist/validate/sizes.js +27 -0
- package/dist/validate/sizes.js.map +1 -0
- package/dist/validate/suggest.d.ts +10 -0
- package/dist/validate/suggest.d.ts.map +1 -0
- package/dist/validate/suggest.js +73 -0
- package/dist/validate/suggest.js.map +1 -0
- package/dist/validate/values.d.ts +21 -0
- package/dist/validate/values.d.ts.map +1 -0
- package/dist/validate/values.js +71 -0
- package/dist/validate/values.js.map +1 -0
- package/dist/validate.d.ts +15 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +300 -0
- package/dist/validate.js.map +1 -0
- package/package.json +19 -6
package/dist/config.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { resolveFonts } from "./fonts.js";
|
|
1
2
|
import { builtinTemplates } from "./templates/index.js";
|
|
3
|
+
import { validateConfig } from "./validate.js";
|
|
2
4
|
/**
|
|
3
5
|
* Named output-size presets covering the common social-image standards. Each
|
|
4
6
|
* `name` becomes the filename suffix (e.g. `my-post-og.png`).
|
|
@@ -23,7 +25,11 @@ export const DEFAULT_SIZES = [
|
|
|
23
25
|
SIZE_PRESETS.og,
|
|
24
26
|
SIZE_PRESETS.square,
|
|
25
27
|
];
|
|
26
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* Default font stack, used when no fonts are configured. It names families and
|
|
30
|
+
* hopes the machine has them, which is exactly what `config.fonts` exists to
|
|
31
|
+
* avoid: supply a font file and the output stops depending on the machine.
|
|
32
|
+
*/
|
|
27
33
|
export const DEFAULT_FONT_FAMILY = "Arial, Helvetica, sans-serif";
|
|
28
34
|
/** Neutral default palette, used when no `colors.brand` is supplied. */
|
|
29
35
|
export const DEFAULT_COLORS = {
|
|
@@ -64,6 +70,9 @@ export const DEFAULT_CODE_STYLE = {
|
|
|
64
70
|
* via `config.onWarning`.
|
|
65
71
|
*/
|
|
66
72
|
function warnToConsole(message) {
|
|
73
|
+
// The console is the point: this is the default sink, replaced wholesale by
|
|
74
|
+
// a caller-supplied `onWarning`.
|
|
75
|
+
// eslint-disable-next-line no-console
|
|
67
76
|
console.warn(`colophon: ${message}`);
|
|
68
77
|
}
|
|
69
78
|
/**
|
|
@@ -112,15 +121,39 @@ function resolveSizes(sizes) {
|
|
|
112
121
|
}
|
|
113
122
|
return sizes;
|
|
114
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Whether to load the machine's own fonts. Configured fonts are meant to make
|
|
126
|
+
* the output the same everywhere, so supplying any turns system fonts off
|
|
127
|
+
* unless the project asks for them back.
|
|
128
|
+
*/
|
|
129
|
+
function shouldLoadSystemFonts(systemFonts, fonts) {
|
|
130
|
+
if (systemFonts === undefined) {
|
|
131
|
+
return fonts.length === 0;
|
|
132
|
+
}
|
|
133
|
+
if (!systemFonts && fonts.length === 0) {
|
|
134
|
+
throw new Error("systemFonts is false and no fonts are configured, so no text could be" +
|
|
135
|
+
" rendered. Add fonts, or leave systemFonts unset.");
|
|
136
|
+
}
|
|
137
|
+
return systemFonts;
|
|
138
|
+
}
|
|
115
139
|
/**
|
|
116
140
|
* Apply defaults to a user config. Safe to call with no argument.
|
|
141
|
+
*
|
|
142
|
+
* Unknown options are rejected before anything is resolved, so a config
|
|
143
|
+
* written against a different version of the package is a build error rather
|
|
144
|
+
* than a set of images quietly rendered with the defaults.
|
|
117
145
|
*/
|
|
118
146
|
export function resolveConfig(config = {}) {
|
|
147
|
+
validateConfig(config);
|
|
119
148
|
const colors = resolveColors(config.colors);
|
|
149
|
+
const fonts = resolveFonts(config.fonts);
|
|
120
150
|
return {
|
|
121
151
|
colors,
|
|
122
152
|
background: config.background ?? defaultBackground(colors),
|
|
123
|
-
|
|
153
|
+
fonts,
|
|
154
|
+
systemFonts: shouldLoadSystemFonts(config.systemFonts, fonts),
|
|
155
|
+
// A project that supplies one font should not have to name it twice.
|
|
156
|
+
fontFamily: config.fontFamily ?? fonts[0]?.family ?? DEFAULT_FONT_FAMILY,
|
|
124
157
|
footer: config.footer,
|
|
125
158
|
badge: config.badge,
|
|
126
159
|
code: resolveCode(config.code),
|
|
@@ -129,4 +162,47 @@ export function resolveConfig(config = {}) {
|
|
|
129
162
|
templates: { ...builtinTemplates, ...config.templates },
|
|
130
163
|
};
|
|
131
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* Merge a size's colour overrides onto the config's.
|
|
167
|
+
*
|
|
168
|
+
* A size may name any single shade, so the merge starts from the full default
|
|
169
|
+
* palette when the config sets no colours of its own. Starting from nothing
|
|
170
|
+
* instead would hand `resolveColors` a lone `foreground`, and its rule that a
|
|
171
|
+
* bare `brand` colours the whole gradient would then flatten the default
|
|
172
|
+
* gradient — a size asking only for darker text would silently lose it.
|
|
173
|
+
*/
|
|
174
|
+
function mergeColors(base, overrides) {
|
|
175
|
+
return { ...(base ?? DEFAULT_COLORS), ...overrides };
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Apply a size's own overrides to a config and resolve the result: the config
|
|
179
|
+
* one image is actually rendered with.
|
|
180
|
+
*
|
|
181
|
+
* The overrides are folded into the user config and the whole thing resolved
|
|
182
|
+
* again, rather than patched onto an already-resolved config, so that anything
|
|
183
|
+
* derived stays consistent — a size that overrides `colors.brand` gets the
|
|
184
|
+
* default gradient rebuilt around its brand, exactly as a config setting the
|
|
185
|
+
* same colour at the top level would.
|
|
186
|
+
*
|
|
187
|
+
* `colors` and `code` merge over their config-level counterparts, because both
|
|
188
|
+
* are bags of independent settings and the point of the feature is to change
|
|
189
|
+
* one of them. The rest replace: a `background` is a union whose variants have
|
|
190
|
+
* different keys, so half of one over half of another is not a background at
|
|
191
|
+
* all, and `badge` carries a required `text` that a partial override could not
|
|
192
|
+
* supply.
|
|
193
|
+
*/
|
|
194
|
+
export function resolveConfigForSize(config, size) {
|
|
195
|
+
const base = config ?? {};
|
|
196
|
+
return resolveConfig({
|
|
197
|
+
...base,
|
|
198
|
+
...(size.colors !== undefined && {
|
|
199
|
+
colors: mergeColors(base.colors, size.colors),
|
|
200
|
+
}),
|
|
201
|
+
...(size.code !== undefined && { code: { ...base.code, ...size.code } }),
|
|
202
|
+
...(size.background !== undefined && { background: size.background }),
|
|
203
|
+
...(size.fontFamily !== undefined && { fontFamily: size.fontFamily }),
|
|
204
|
+
...(size.footer !== undefined && { footer: size.footer }),
|
|
205
|
+
...(size.badge !== undefined && { badge: size.badge }),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
132
208
|
//# sourceMappingURL=config.js.map
|
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;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/content/index.d.ts
CHANGED
|
@@ -1,52 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export
|
|
6
|
-
/** Root directory to search recursively for content files. */
|
|
7
|
-
readonly dir: string;
|
|
8
|
-
/** Frontmatter key holding the image props object. Default `meta_img_props`. */
|
|
9
|
-
readonly propsKey?: string;
|
|
10
|
-
/** Field within the props object naming the template. Default `template`. */
|
|
11
|
-
readonly templateField?: string;
|
|
12
|
-
/** Template to use when the template field is absent. */
|
|
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;
|
|
19
|
-
/** File extensions to include. Default `.md` and `.markdown`. */
|
|
20
|
-
readonly extensions?: readonly string[];
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* A discovered content file with the image props read from its frontmatter.
|
|
24
|
-
*/
|
|
25
|
-
export interface ContentFile {
|
|
26
|
-
/** Path relative to the walk `dir`. */
|
|
27
|
-
readonly contentPath: string;
|
|
28
|
-
/** Absolute path on disk. */
|
|
29
|
-
readonly absolutePath: string;
|
|
30
|
-
/** Base filename for this post's images (frontmatter slug, or path-derived). */
|
|
31
|
-
readonly slug: string;
|
|
32
|
-
readonly props: MetaImageProps;
|
|
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;
|
|
40
|
-
/**
|
|
41
|
-
* Extract {@link MetaImageProps} from a parsed frontmatter object, or return
|
|
42
|
-
* `undefined` if this file should be skipped (no props object, or no usable
|
|
43
|
-
* template/title). Pure — no filesystem access.
|
|
44
|
-
*/
|
|
45
|
-
export declare function extractProps(frontmatter: Record<string, unknown>, options?: Pick<WalkOptions, "propsKey" | "templateField" | "defaultTemplate">): MetaImageProps | undefined;
|
|
46
|
-
/**
|
|
47
|
-
* Walk a content tree, read each file's frontmatter with `gray-matter`, and
|
|
48
|
-
* return the files that declare image props. This is the host-project concern
|
|
49
|
-
* — finding content and reading frontmatter — kept separate from rendering.
|
|
50
|
-
*/
|
|
51
|
-
export declare function walkContent(options: WalkOptions): Promise<ContentFile[]>;
|
|
1
|
+
export { extractProps } from "./props.js";
|
|
2
|
+
export { slugFromPath } from "./slug.js";
|
|
3
|
+
export { walkContent } from "./walk.js";
|
|
4
|
+
export type { WalkOptions } from "./walk.js";
|
|
5
|
+
export type { ContentFile } from "../types.js";
|
|
52
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/content/index.js
CHANGED
|
@@ -1,116 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const defaultPropsKey = "meta_img_props";
|
|
5
|
-
const defaultTemplateField = "template";
|
|
6
|
-
const defaultSlugField = "slug";
|
|
7
|
-
const defaultExtensions = [".md", ".markdown"];
|
|
8
|
-
function coerceString(value) {
|
|
9
|
-
if (typeof value === "string") {
|
|
10
|
-
return value;
|
|
11
|
-
}
|
|
12
|
-
if (typeof value === "number" ||
|
|
13
|
-
typeof value === "boolean" ||
|
|
14
|
-
typeof value === "bigint") {
|
|
15
|
-
return String(value);
|
|
16
|
-
}
|
|
17
|
-
return undefined;
|
|
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
|
-
}
|
|
29
|
-
function isRecord(value) {
|
|
30
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Extract {@link MetaImageProps} from a parsed frontmatter object, or return
|
|
34
|
-
* `undefined` if this file should be skipped (no props object, or no usable
|
|
35
|
-
* template/title). Pure — no filesystem access.
|
|
36
|
-
*/
|
|
37
|
-
export function extractProps(frontmatter, options = {}) {
|
|
38
|
-
const propsKey = options.propsKey ?? defaultPropsKey;
|
|
39
|
-
const templateField = options.templateField ?? defaultTemplateField;
|
|
40
|
-
const record = frontmatter[propsKey];
|
|
41
|
-
if (!isRecord(record)) {
|
|
42
|
-
return undefined;
|
|
43
|
-
}
|
|
44
|
-
const templateRaw = record[templateField];
|
|
45
|
-
const template = typeof templateRaw === "string" ? templateRaw : options.defaultTemplate;
|
|
46
|
-
if (template === undefined) {
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
// Title is optional: templates such as `code` describe the image entirely
|
|
50
|
-
// from their own fields, and requiring a title would be pure boilerplate.
|
|
51
|
-
const title = coerceString(record["title"]);
|
|
52
|
-
const subtitle = coerceString(record["subtitle"]);
|
|
53
|
-
const version = coerceString(record["version"]);
|
|
54
|
-
const extras = {};
|
|
55
|
-
for (const [key, value] of Object.entries(record)) {
|
|
56
|
-
if (key !== templateField &&
|
|
57
|
-
key !== "template" &&
|
|
58
|
-
key !== "title" &&
|
|
59
|
-
key !== "subtitle" &&
|
|
60
|
-
key !== "version") {
|
|
61
|
-
extras[key] = value;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return {
|
|
65
|
-
...extras,
|
|
66
|
-
template,
|
|
67
|
-
...(title !== undefined && { title }),
|
|
68
|
-
...(subtitle !== undefined && { subtitle }),
|
|
69
|
-
...(version !== undefined && { version }),
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
async function collectContentFiles(dir, extensions) {
|
|
73
|
-
const entries = await readdir(dir, { withFileTypes: true });
|
|
74
|
-
const nested = await Promise.all(entries.map(async (entry) => {
|
|
75
|
-
const entryPath = path.join(dir, entry.name);
|
|
76
|
-
if (entry.isDirectory()) {
|
|
77
|
-
return collectContentFiles(entryPath, extensions);
|
|
78
|
-
}
|
|
79
|
-
if (entry.isFile() &&
|
|
80
|
-
extensions.some((extension) => entry.name.endsWith(extension))) {
|
|
81
|
-
return [entryPath];
|
|
82
|
-
}
|
|
83
|
-
return [];
|
|
84
|
-
}));
|
|
85
|
-
return nested.flat();
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Walk a content tree, read each file's frontmatter with `gray-matter`, and
|
|
89
|
-
* return the files that declare image props. This is the host-project concern
|
|
90
|
-
* — finding content and reading frontmatter — kept separate from rendering.
|
|
91
|
-
*/
|
|
92
|
-
export async function walkContent(options) {
|
|
93
|
-
const extensions = options.extensions ?? defaultExtensions;
|
|
94
|
-
const filePaths = await collectContentFiles(options.dir, extensions);
|
|
95
|
-
const slugField = options.slugField ?? defaultSlugField;
|
|
96
|
-
const files = await Promise.all(filePaths.map(async (filePath) => {
|
|
97
|
-
const raw = await readFile(filePath, "utf8");
|
|
98
|
-
const frontmatter = matter(raw).data;
|
|
99
|
-
const props = extractProps(frontmatter, options);
|
|
100
|
-
if (props === undefined) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
const declaredSlug = coerceString(frontmatter[slugField])?.trim();
|
|
104
|
-
const slug = declaredSlug !== undefined && declaredSlug !== ""
|
|
105
|
-
? declaredSlug
|
|
106
|
-
: slugFromPath(filePath);
|
|
107
|
-
return {
|
|
108
|
-
contentPath: path.relative(options.dir, filePath),
|
|
109
|
-
absolutePath: filePath,
|
|
110
|
-
slug,
|
|
111
|
-
props,
|
|
112
|
-
};
|
|
113
|
-
}));
|
|
114
|
-
return files.filter((file) => file !== undefined);
|
|
115
|
-
}
|
|
1
|
+
export { extractProps } from "./props.js";
|
|
2
|
+
export { slugFromPath } from "./slug.js";
|
|
3
|
+
export { walkContent } from "./walk.js";
|
|
116
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ContentOptions, MetaImageProps } from "../types.js";
|
|
2
|
+
/** Read a frontmatter scalar as a string, ignoring anything else. */
|
|
3
|
+
export declare function coerceString(value: unknown): string | undefined;
|
|
4
|
+
/**
|
|
5
|
+
* Extract {@link MetaImageProps} from a parsed frontmatter object, or return
|
|
6
|
+
* `undefined` if this file should be skipped (nothing to build props from, or
|
|
7
|
+
* no usable template). Pure, with no filesystem access.
|
|
8
|
+
*
|
|
9
|
+
* Props can come from two places: the post's own props object, and a project's
|
|
10
|
+
* `props` mapper reading the frontmatter it already has. Where both speak the
|
|
11
|
+
* post wins, field by field. The mapper describes the site's usual shape, and
|
|
12
|
+
* a post that says otherwise is saying so on purpose.
|
|
13
|
+
*/
|
|
14
|
+
export declare function extractProps(frontmatter: Record<string, unknown>, options?: Pick<ContentOptions, "propsKey" | "templateField" | "defaultTemplate" | "props">): MetaImageProps | undefined;
|
|
15
|
+
//# sourceMappingURL=props.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../../src/content/props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlE,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAc/D;AASD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,GAAE,IAAI,CACX,cAAc,EACd,UAAU,GAAG,eAAe,GAAG,iBAAiB,GAAG,OAAO,CACtD,GACL,cAAc,GAAG,SAAS,CAiD5B"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const defaultPropsKey = "meta_img_props";
|
|
2
|
+
const defaultTemplateField = "template";
|
|
3
|
+
/** Read a frontmatter scalar as a string, ignoring anything else. */
|
|
4
|
+
export function coerceString(value) {
|
|
5
|
+
if (typeof value === "string") {
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
if (typeof value === "number" ||
|
|
9
|
+
typeof value === "boolean" ||
|
|
10
|
+
typeof value === "bigint") {
|
|
11
|
+
return String(value);
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
function isRecord(value) {
|
|
16
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
17
|
+
}
|
|
18
|
+
/** The fields the props shape names itself, which never become extras. */
|
|
19
|
+
const namedFields = new Set(["template", "title", "subtitle", "version"]);
|
|
20
|
+
/**
|
|
21
|
+
* Extract {@link MetaImageProps} from a parsed frontmatter object, or return
|
|
22
|
+
* `undefined` if this file should be skipped (nothing to build props from, or
|
|
23
|
+
* no usable template). Pure, with no filesystem access.
|
|
24
|
+
*
|
|
25
|
+
* Props can come from two places: the post's own props object, and a project's
|
|
26
|
+
* `props` mapper reading the frontmatter it already has. Where both speak the
|
|
27
|
+
* post wins, field by field. The mapper describes the site's usual shape, and
|
|
28
|
+
* a post that says otherwise is saying so on purpose.
|
|
29
|
+
*/
|
|
30
|
+
export function extractProps(frontmatter, options = {}) {
|
|
31
|
+
const propsKey = options.propsKey ?? defaultPropsKey;
|
|
32
|
+
const templateField = options.templateField ?? defaultTemplateField;
|
|
33
|
+
const declared = frontmatter[propsKey];
|
|
34
|
+
const hasDeclared = isRecord(declared);
|
|
35
|
+
const mapped = options.props?.(frontmatter);
|
|
36
|
+
// A mapper opting a post out cannot overrule a post that asked for an image
|
|
37
|
+
// outright, so the skip only applies where the post says nothing itself.
|
|
38
|
+
if (!hasDeclared && mapped === undefined) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
// Merged rather than replaced, so a post correcting one field does not have
|
|
42
|
+
// to restate everything the mapper already got right.
|
|
43
|
+
const record = {
|
|
44
|
+
...mapped,
|
|
45
|
+
...(hasDeclared && declared),
|
|
46
|
+
};
|
|
47
|
+
const templateRaw = record[templateField];
|
|
48
|
+
const template = typeof templateRaw === "string" ? templateRaw : options.defaultTemplate;
|
|
49
|
+
if (template === undefined) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
// Title is optional: templates such as `code` describe the image entirely
|
|
53
|
+
// from their own fields, and requiring a title would be pure boilerplate.
|
|
54
|
+
const title = coerceString(record["title"]);
|
|
55
|
+
const subtitle = coerceString(record["subtitle"]);
|
|
56
|
+
const version = coerceString(record["version"]);
|
|
57
|
+
const extras = {};
|
|
58
|
+
for (const [key, value] of Object.entries(record)) {
|
|
59
|
+
if (key !== templateField && !namedFields.has(key)) {
|
|
60
|
+
extras[key] = value;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
...extras,
|
|
65
|
+
template,
|
|
66
|
+
...(title !== undefined && { title }),
|
|
67
|
+
...(subtitle !== undefined && { subtitle }),
|
|
68
|
+
...(version !== undefined && { version }),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=props.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"props.js","sourceRoot":"","sources":["../../src/content/props.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { SlugStrategy } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Derive a slug from a content file's path, relative to the root of the walk.
|
|
4
|
+
*
|
|
5
|
+
* `basename` gives the filename without extension, or the parent directory for
|
|
6
|
+
* `index.*`, which is the page-bundle convention where an image sits beside its
|
|
7
|
+
* post. `route` keeps the directories, so a site addressed by route gets a slug
|
|
8
|
+
* that matches the address rather than just its last segment.
|
|
9
|
+
*
|
|
10
|
+
* The path must be relative to the content root for `route` to mean anything;
|
|
11
|
+
* `basename` reads the same either way.
|
|
12
|
+
*/
|
|
13
|
+
export declare function slugFromPath(contentPath: string, strategy?: SlugStrategy): string;
|
|
14
|
+
/**
|
|
15
|
+
* Reject a slug that would name a file outside the tree it came from.
|
|
16
|
+
*
|
|
17
|
+
* A slug is a filename, and may carry directories under the `route` strategy.
|
|
18
|
+
* But a declared one is written by hand, and `slug: ../../../tmp/x` would have
|
|
19
|
+
* `generate` create directories and write an image there. Nothing derived from
|
|
20
|
+
* a path can look like this, so the check only ever fires on frontmatter.
|
|
21
|
+
*/
|
|
22
|
+
export declare function assertSlugStaysInside(slug: string, contentPath: string): void;
|
|
23
|
+
//# sourceMappingURL=slug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../src/content/slug.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,YAAyB,GAClC,MAAM,CAqBR;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAe7E"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
/**
|
|
3
|
+
* Derive a slug from a content file's path, relative to the root of the walk.
|
|
4
|
+
*
|
|
5
|
+
* `basename` gives the filename without extension, or the parent directory for
|
|
6
|
+
* `index.*`, which is the page-bundle convention where an image sits beside its
|
|
7
|
+
* post. `route` keeps the directories, so a site addressed by route gets a slug
|
|
8
|
+
* that matches the address rather than just its last segment.
|
|
9
|
+
*
|
|
10
|
+
* The path must be relative to the content root for `route` to mean anything;
|
|
11
|
+
* `basename` reads the same either way.
|
|
12
|
+
*/
|
|
13
|
+
export function slugFromPath(contentPath, strategy = "basename") {
|
|
14
|
+
const extension = path.extname(contentPath);
|
|
15
|
+
const base = path.basename(contentPath, extension);
|
|
16
|
+
const directory = path.dirname(contentPath);
|
|
17
|
+
if (strategy === "basename") {
|
|
18
|
+
if (base !== "index") {
|
|
19
|
+
return base;
|
|
20
|
+
}
|
|
21
|
+
// A root-level `index.*` has no parent inside the tree to be named after,
|
|
22
|
+
// so it keeps its own name rather than borrowing the content directory's.
|
|
23
|
+
const parent = path.basename(directory);
|
|
24
|
+
return parent === "" || parent === "." ? base : parent;
|
|
25
|
+
}
|
|
26
|
+
const route = base === "index" ? directory : path.join(directory, base);
|
|
27
|
+
// `path.dirname` of a root-level file is ".", which as a route is the site
|
|
28
|
+
// root, and the one place there is no directory name to fall back on.
|
|
29
|
+
const normalised = route === "." ? "index" : route.split(path.sep).join("/");
|
|
30
|
+
return normalised;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Reject a slug that would name a file outside the tree it came from.
|
|
34
|
+
*
|
|
35
|
+
* A slug is a filename, and may carry directories under the `route` strategy.
|
|
36
|
+
* But a declared one is written by hand, and `slug: ../../../tmp/x` would have
|
|
37
|
+
* `generate` create directories and write an image there. Nothing derived from
|
|
38
|
+
* a path can look like this, so the check only ever fires on frontmatter.
|
|
39
|
+
*/
|
|
40
|
+
export function assertSlugStaysInside(slug, contentPath) {
|
|
41
|
+
// An empty segment catches a leading or doubled separator, so an absolute
|
|
42
|
+
// slug is rejected by the same pass as a traversing one.
|
|
43
|
+
const outside = new Set(["", ".", ".."]);
|
|
44
|
+
const isEscaping = slug.split(/[/\\]/).some((segment) => outside.has(segment)) ||
|
|
45
|
+
/^[A-Za-z]:/.test(slug);
|
|
46
|
+
if (isEscaping) {
|
|
47
|
+
throw new Error(`Invalid slug "${slug}" in ${contentPath}: a slug names an image inside` +
|
|
48
|
+
` the output tree, so it cannot be absolute or contain "." or ".."` +
|
|
49
|
+
` segments.`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=slug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.js","sourceRoot":"","sources":["../../src/content/slug.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAC1B,WAAmB,EACnB,QAAQ,GAAiB,UAAU;IAEnC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0EAA0E;QAC1E,0EAA0E;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACzD,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACxE,2EAA2E;IAC3E,sEAAsE;IACtE,MAAM,UAAU,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7E,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,WAAmB;IACrE,0EAA0E;IAC1E,yDAAyD;IACzD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IACzC,MAAM,UAAU,GACd,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3D,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE1B,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,iBAAiB,IAAI,QAAQ,WAAW,gCAAgC;YACtE,mEAAmE;YACnE,YAAY,CACf,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ContentFile, ContentOptions } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Options for {@link walkContent}: everything a project can say about reading
|
|
4
|
+
* its own content, plus the directory to read it from. Only `dir` is required.
|
|
5
|
+
*/
|
|
6
|
+
export interface WalkOptions extends ContentOptions {
|
|
7
|
+
/** Root directory to search recursively for content files. */
|
|
8
|
+
readonly dir: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Walk a content tree, read each file's frontmatter with `gray-matter`, and
|
|
12
|
+
* return the files that image props can be built for. This is the host-project
|
|
13
|
+
* concern of finding content and reading frontmatter, kept separate from
|
|
14
|
+
* rendering.
|
|
15
|
+
*/
|
|
16
|
+
export declare function walkContent(options: WalkOptions): Promise<ContentFile[]>;
|
|
17
|
+
//# sourceMappingURL=walk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk.d.ts","sourceRoot":"","sources":["../../src/content/walk.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ/D;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,cAAc;IACjD,8DAA8D;IAC9D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AA8BD;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,EAAE,CAAC,CAoCxB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import matter from "gray-matter";
|
|
4
|
+
import { coerceString, extractProps } from "./props.js";
|
|
5
|
+
import { assertSlugStaysInside, slugFromPath } from "./slug.js";
|
|
6
|
+
const defaultSlugField = "slug";
|
|
7
|
+
const defaultSlugStrategy = "basename";
|
|
8
|
+
const defaultExtensions = [".md", ".markdown"];
|
|
9
|
+
async function collectContentFiles(dir, extensions) {
|
|
10
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
11
|
+
const nested = await Promise.all(entries.map(async (entry) => {
|
|
12
|
+
const entryPath = path.join(dir, entry.name);
|
|
13
|
+
if (entry.isDirectory()) {
|
|
14
|
+
return collectContentFiles(entryPath, extensions);
|
|
15
|
+
}
|
|
16
|
+
if (entry.isFile() &&
|
|
17
|
+
extensions.some((extension) => entry.name.endsWith(extension))) {
|
|
18
|
+
return [entryPath];
|
|
19
|
+
}
|
|
20
|
+
return [];
|
|
21
|
+
}));
|
|
22
|
+
return nested.flat();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Walk a content tree, read each file's frontmatter with `gray-matter`, and
|
|
26
|
+
* return the files that image props can be built for. This is the host-project
|
|
27
|
+
* concern of finding content and reading frontmatter, kept separate from
|
|
28
|
+
* rendering.
|
|
29
|
+
*/
|
|
30
|
+
export async function walkContent(options) {
|
|
31
|
+
const extensions = options.extensions ?? defaultExtensions;
|
|
32
|
+
const filePaths = await collectContentFiles(options.dir, extensions);
|
|
33
|
+
const slugField = options.slugField ?? defaultSlugField;
|
|
34
|
+
const slugStrategy = options.slugStrategy ?? defaultSlugStrategy;
|
|
35
|
+
const files = await Promise.all(filePaths.map(async (filePath) => {
|
|
36
|
+
const raw = await readFile(filePath, "utf8");
|
|
37
|
+
const frontmatter = matter(raw).data;
|
|
38
|
+
const props = extractProps(frontmatter, options);
|
|
39
|
+
if (props === undefined) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const contentPath = path.relative(options.dir, filePath);
|
|
43
|
+
const declaredSlug = coerceString(frontmatter[slugField])?.trim();
|
|
44
|
+
const slug = declaredSlug !== undefined && declaredSlug !== ""
|
|
45
|
+
? declaredSlug
|
|
46
|
+
: slugFromPath(contentPath, slugStrategy);
|
|
47
|
+
assertSlugStaysInside(slug, contentPath);
|
|
48
|
+
return {
|
|
49
|
+
contentPath,
|
|
50
|
+
absolutePath: filePath,
|
|
51
|
+
slug,
|
|
52
|
+
props,
|
|
53
|
+
};
|
|
54
|
+
}));
|
|
55
|
+
return files.filter((file) => file !== undefined);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=walk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/content/walk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FontSource } from "../types.js";
|
|
2
|
+
export { fontFilePaths } from "./materialise.js";
|
|
3
|
+
export { resolveFonts } from "./resolve.js";
|
|
4
|
+
/**
|
|
5
|
+
* The family the rasteriser should fall back to when a `font-family` names
|
|
6
|
+
* something it has not loaded. It is the first declared family, so the
|
|
7
|
+
* fallback is the same wherever the build runs rather than whichever font
|
|
8
|
+
* loaded first.
|
|
9
|
+
*/
|
|
10
|
+
export declare function fallbackFamily(fonts: readonly FontSource[]): string | undefined;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fonts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,UAAU,EAAE,GAC3B,MAAM,GAAG,SAAS,CAEpB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { fontFilePaths } from "./materialise.js";
|
|
2
|
+
export { resolveFonts } from "./resolve.js";
|
|
3
|
+
/**
|
|
4
|
+
* The family the rasteriser should fall back to when a `font-family` names
|
|
5
|
+
* something it has not loaded. It is the first declared family, so the
|
|
6
|
+
* fallback is the same wherever the build runs rather than whichever font
|
|
7
|
+
* loaded first.
|
|
8
|
+
*/
|
|
9
|
+
export function fallbackFamily(fonts) {
|
|
10
|
+
return fonts.find((font) => font.family !== undefined)?.family;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fonts/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,KAA4B;IAE5B,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,MAAM,CAAC;AACjE,CAAC"}
|