@contentrain/emitter-astro 0.16.1 → 0.18.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 -0
- package/dist/index.d.mts +117 -7
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +292 -38
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -185,6 +185,39 @@ The feed lists every post, as WordPress's does — a post the source kept out of
|
|
|
185
185
|
|
|
186
186
|
**Archive feeds.** WordPress serves a feed for every archive page — `/category/news/feed/`, `/tag/x/feed/`, `/author/ada/feed/`. Every dynamic archive route with a query in the site's default language (not its paginated continuation) gets one per page it builds, at `<archive>/feed.xml` (`src/pages/<archive>/feed.xml.ts`): the 10 newest posts that page lists, each at its own address, titled with the page's title. Each archive page links its feed in its head, and `<archive>/feed/` gets a 301 to it in `astro.config` and the host's redirect file, as the main feed does. The feed redirects pass the checks the site's own rules do — none over a page the site builds or a case twin of one, and a source rule for the same address wins — and in a host file with a rule limit they come after the site's own rules, `/feed/` first, so an overflow drops a feed redirect, which the warning counts. The template head's own archive feed link names one term's feed on every page, so it is removed with the other feed links the site does not build (comments, Atom). `options.feed: false` turns these off with the main feed.
|
|
187
187
|
|
|
188
|
+
## Unpublished entries
|
|
189
|
+
|
|
190
|
+
The content store keeps every entry the source had; only the published ones are
|
|
191
|
+
built. `EmitPost.status` is the entry's `EntryMeta.status` (unset reads as
|
|
192
|
+
`published`) and `publish_at` its `EntryMeta.publish_at` — a WordPress post
|
|
193
|
+
scheduled for later is imported as `published` with a `publish_at` ahead. An
|
|
194
|
+
entry is built when its status is `published` and its `publish_at`, if set, is
|
|
195
|
+
not after `options.now` (default: the time of the emit). `EmitPost.visibility`
|
|
196
|
+
(the store's `visibility` field) other than `public` — a password-protected or
|
|
197
|
+
private post — is never built, whatever its status. Every other entry — a
|
|
198
|
+
draft, one in review, rejected or archived, one scheduled for later, one whose
|
|
199
|
+
`publish_at` is not a date, one that is not public — is held back before anything reads the content: no
|
|
200
|
+
page, sitemap line, feed item, llms.txt link, list card or hreflang alternate.
|
|
201
|
+
`EmitResult.withheld.entries` names each with its reason, and a warning counts
|
|
202
|
+
them.
|
|
203
|
+
|
|
204
|
+
An entry with no `status` is published, as before statuses existed — which
|
|
205
|
+
fails open if a producer forgets to pass one. `options.requireStatus: true`
|
|
206
|
+
turns that around: every entry (in posts, collections and list items) must
|
|
207
|
+
carry a status, and one without it is held back (`status_missing`) and
|
|
208
|
+
reported. A producer that reads statuses from the content store sets it.
|
|
209
|
+
|
|
210
|
+
The data files hold only what is live at the emit, so a scheduled entry is
|
|
211
|
+
built by the first emit after its time; rebuilding the same files does not
|
|
212
|
+
publish it.
|
|
213
|
+
|
|
214
|
+
A link on a published page (its body or `excerpt_html`, on its own page or as a
|
|
215
|
+
list card) to a held-back entry would 404: the anchor is replaced by its text
|
|
216
|
+
and listed in `EmitResult.withheld.links`. A link to an address a published
|
|
217
|
+
entry still builds is left alone. A redirect (`redirects` or `hostRedirects`)
|
|
218
|
+
whose target is a held-back entry is not written; it is returned in
|
|
219
|
+
`EmitResult.redirects.manual` with the reason.
|
|
220
|
+
|
|
188
221
|
## Binding the runtime later
|
|
189
222
|
|
|
190
223
|
`src/data/runtime.json` is the only place the binding lives; the components
|
|
@@ -253,6 +286,8 @@ Each path is written percent-encoded, with and without its trailing slash.
|
|
|
253
286
|
`*` or a `:` segment is a pattern to a host file; it is left to the meta-refresh
|
|
254
287
|
fallback, with a warning. A rule that differs from a built page only in letter case is returned too: Netlify matches rules case-insensitively, and macOS and Windows file systems cannot hold `/About/` beside `/about/`, so it would be served over the page. Cloudflare Pages and Vercel files stop at 1,000 rules (2,000 entries with both slash forms, their static limit); the rest are named in `EmitResult.redirects.host_over_limit`, with a warning, and keep only the meta-refresh fallback there. Netlify's file has no limit.
|
|
255
288
|
|
|
289
|
+
**Host-only rules.** `input.hostRedirects` takes rules served only by the host's redirect file, never by `astro.config`, so the build writes no meta-refresh page for them. It is for bulk rules a site does not need as pages: one per WordPress attachment page runs to tens of thousands, and each would become an HTML file in `dist`. They pass the checks `redirects` do (a built page, a case twin, a query string, a pattern, a duplicate) — except the file-name one, since a host file matches `/old.php` itself; but never a file the build writes (robots, `llms.txt`, a feed, `sitemap-index.xml`/`sitemap-N.xml`, `404.html`, `/_astro/`, `/styles/`; in either slash form and any letter case), which a host file would shadow — and an address the site's own rules or the feed redirects already hold is theirs. In a Cloudflare or Vercel file they come after both, so at the rule limit they are the ones left out. With no fallback page behind them, a host-only rule the host file cannot hold is not served at all: a pattern, or one past a named host's limit (`options.redirectHost` `cloudflare` or `vercel`), comes back in `EmitResult.redirects.manual` with its reason, with one `hostRedirects:` warning. With no host named, the Netlify file holds every rule, so one past `vercel.json`'s limit stays written and is named in `host_over_limit` with its own warning — not served on Vercel; name the host to have it reported as manual. On a host with no redirect file (a plain static server) host-only rules are not served.
|
|
290
|
+
|
|
256
291
|
|
|
257
292
|
## Route collisions
|
|
258
293
|
|
|
@@ -280,3 +315,7 @@ collection: Astro serves one file per path, so one of the two routes does not
|
|
|
280
315
|
exist in the built site, and which one survived is an accident of ordering. Fix
|
|
281
316
|
it by giving one route a distinct pattern, or by expanding the narrower one into
|
|
282
317
|
literal routes.
|
|
318
|
+
|
|
319
|
+
## Checking the emitted types
|
|
320
|
+
|
|
321
|
+
The unit suite asserts what the emitter writes; `pnpm --filter @contentrain/emitter-astro test:astro` (after `pnpm build`) checks it the way a migrated site's build does. It emits a site with every kind of page and endpoint — posts, pages, nested category and tag archives with their feeds, an author profile, a list, a static page, the feed, llms.txt, redirects, and a draft, an entry in review, a post scheduled for later and password-protected and private posts beside published ones — once with trailing slashes and once without, installs it with npm from its own `package.json` the way a production host does (`NODE_ENV=production`, `CI` set, no terminal), and runs `astro check` and then the site's own `npm run build`. A pass is a result naming 0 errors and a completed build; Astro's "requires @astrojs/check" notice fails it even though Astro exits 0 there. The first site is then built with `astro build`, and the output is read: the published posts have pages, sitemap lines and feed items, the held-back ones have none (nor llms.txt links or list cards), no file holds the password-protected post's text, and the live page's links to held-back entries are text. CI and the release workflow run it on every change.
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ComponentDef, EntrySourceRef, ModelDefinition, ProjectIR, RawRedirect, RawRedirect as RawRedirect$1, RawSeoEntry, RouteModel, RuntimeBinding, RuntimeBinding as RuntimeBinding$1, SeoProvider } from "@contentrain/types";
|
|
1
|
+
import { ComponentDef, ContentStatus, EntrySourceRef, ModelDefinition, ProjectIR, RawRedirect, RawRedirect as RawRedirect$1, RawSeoEntry, RouteModel, RuntimeBinding, RuntimeBinding as RuntimeBinding$1, SeoProvider } from "@contentrain/types";
|
|
2
2
|
|
|
3
3
|
//#region src/types.d.ts
|
|
4
4
|
/**
|
|
@@ -120,6 +120,49 @@ interface EmitPost {
|
|
|
120
120
|
noindex?: boolean;
|
|
121
121
|
/** The source page was `nofollow`: `<meta name="robots" content="nofollow">`. */
|
|
122
122
|
nofollow?: boolean;
|
|
123
|
+
/**
|
|
124
|
+
* The entry's workflow status in the content store (`EntryMeta.status`).
|
|
125
|
+
* Only `published` is built; unset reads as published unless
|
|
126
|
+
* `EmitOptions.requireStatus` is set. Any other status
|
|
127
|
+
* keeps the entry out of the site — no page, sitemap line, feed item,
|
|
128
|
+
* llms.txt link or list card — and `EmitResult.withheld` names it.
|
|
129
|
+
*/
|
|
130
|
+
status?: ContentStatus;
|
|
131
|
+
/**
|
|
132
|
+
* When a published entry goes live (`EntryMeta.publish_at`, ISO 8601) — a
|
|
133
|
+
* WordPress post scheduled for later. Until then it is held back like a
|
|
134
|
+
* draft; compared with `EmitOptions.now`. A value that is not a date holds
|
|
135
|
+
* the entry back too.
|
|
136
|
+
*/
|
|
137
|
+
publish_at?: string;
|
|
138
|
+
/**
|
|
139
|
+
* Who may read the entry (the store's `visibility` field — WordPress
|
|
140
|
+
* `public`, `private`, or `password` for a password-protected post). Anything
|
|
141
|
+
* but `public` is never built, whatever `status` says: no page, sitemap
|
|
142
|
+
* line, feed item, list card, share card or link to it. Unset reads as public.
|
|
143
|
+
*/
|
|
144
|
+
visibility?: 'public' | 'private' | 'password' | (string & {});
|
|
145
|
+
}
|
|
146
|
+
/** An entry the build leaves out because it is not published yet. */
|
|
147
|
+
interface WithheldEntry {
|
|
148
|
+
collection: string;
|
|
149
|
+
slug: string;
|
|
150
|
+
status?: ContentStatus;
|
|
151
|
+
publish_at?: string;
|
|
152
|
+
visibility?: string;
|
|
153
|
+
/**
|
|
154
|
+
* `visibility`: password-protected or private · `status`: not published ·
|
|
155
|
+
* `status_missing`: no status, with `EmitOptions.requireStatus` ·
|
|
156
|
+
* `scheduled`: publish_at is ahead · `publish_at_invalid`: publish_at is not a date.
|
|
157
|
+
*/
|
|
158
|
+
reason: 'visibility' | 'status' | 'status_missing' | 'scheduled' | 'publish_at_invalid';
|
|
159
|
+
}
|
|
160
|
+
/** A link on a published page to a held-back entry, kept as its text. */
|
|
161
|
+
interface WithheldLink {
|
|
162
|
+
/** The page it was on (site-root path), or `<collection>/<slug>` when no route builds it. */
|
|
163
|
+
page: string;
|
|
164
|
+
/** The address it pointed at. */
|
|
165
|
+
href: string;
|
|
123
166
|
}
|
|
124
167
|
/**
|
|
125
168
|
* One block of a list: a template, optional wrapper, and how many items it takes.
|
|
@@ -345,6 +388,20 @@ interface EmitOptions {
|
|
|
345
388
|
* Cloudflare Pages site must name its host (no forced rules there).
|
|
346
389
|
*/
|
|
347
390
|
redirectHost?: 'netlify' | 'cloudflare' | 'vercel';
|
|
391
|
+
/**
|
|
392
|
+
* The moment `EmitPost.publish_at` is compared with, ISO 8601. Default: the
|
|
393
|
+
* time of the emit. The data files hold only what is live then, so a
|
|
394
|
+
* scheduled entry is built by the first emit after its time.
|
|
395
|
+
*/
|
|
396
|
+
now?: string;
|
|
397
|
+
/**
|
|
398
|
+
* Hold back every entry — in posts, collections and list items — that
|
|
399
|
+
* carries no `EmitPost.status`, and say so. Default false: an entry with
|
|
400
|
+
* no status is published, as before statuses existed. A producer that
|
|
401
|
+
* reads statuses from the content store sets it, so an entry it failed to
|
|
402
|
+
* give one fails closed instead of going out as published.
|
|
403
|
+
*/
|
|
404
|
+
requireStatus?: boolean;
|
|
348
405
|
}
|
|
349
406
|
interface EmitInput {
|
|
350
407
|
ir: ProjectIR;
|
|
@@ -364,6 +421,18 @@ interface EmitInput {
|
|
|
364
421
|
* back in `EmitResult.redirects.manual` with the reason, to set up at the host.
|
|
365
422
|
*/
|
|
366
423
|
redirects?: RawRedirect[];
|
|
424
|
+
/**
|
|
425
|
+
* Rules served only by the host's redirect file (`public/_redirects`,
|
|
426
|
+
* `vercel.json`), never by `astro.config` — so no meta-refresh page is built
|
|
427
|
+
* for them. For bulk rules the site does not need as pages: one per
|
|
428
|
+
* WordPress attachment page runs to tens of thousands, and a static build
|
|
429
|
+
* would write an HTML file for each. They pass the same checks as
|
|
430
|
+
* `redirects`, and the site's own rules and the feed redirects win an
|
|
431
|
+
* address they share. Without a fallback page, a rule the host file cannot
|
|
432
|
+
* hold — a pattern, or past Cloudflare's or Vercel's rule limit, where these
|
|
433
|
+
* go last — is returned in `EmitResult.redirects.manual`.
|
|
434
|
+
*/
|
|
435
|
+
hostRedirects?: RawRedirect[];
|
|
367
436
|
}
|
|
368
437
|
/**
|
|
369
438
|
* Pure result: every generated file as path → content. Writing to disk is a
|
|
@@ -373,16 +442,31 @@ interface EmitInput {
|
|
|
373
442
|
interface EmitResult {
|
|
374
443
|
files: Record<string, string>;
|
|
375
444
|
warnings: string[];
|
|
376
|
-
/** Present when `EmitInput.redirects`
|
|
445
|
+
/** Present when `EmitInput.redirects` or `hostRedirects` was given. */
|
|
377
446
|
redirects?: {
|
|
378
|
-
written: RawRedirect[];
|
|
447
|
+
/** Rules written: `redirects` to astro.config and the host files, `hostRedirects` to the host files. */written: RawRedirect[]; /** Rules not written, with why — to set up by hand at the host. */
|
|
379
448
|
manual: Array<{
|
|
380
449
|
redirect: RawRedirect;
|
|
381
450
|
reason: string;
|
|
382
451
|
}>; /** The host redirect files written, e.g. `public/_redirects (netlify)`. Empty: meta-refresh only. */
|
|
383
|
-
host_files: string[];
|
|
452
|
+
host_files: string[];
|
|
453
|
+
/**
|
|
454
|
+
* Rules (by `from`) left out of a Cloudflare / Vercel file at its rule
|
|
455
|
+
* limit. A `redirects` rule keeps its meta-refresh page there. A
|
|
456
|
+
* `hostRedirects` rule is here only with no host named (the Netlify file
|
|
457
|
+
* holds it, `vercel.json` does not); past a named host's limit it is in `manual`.
|
|
458
|
+
*/
|
|
384
459
|
host_over_limit: string[];
|
|
385
460
|
};
|
|
461
|
+
/**
|
|
462
|
+
* Present when entries were held back (`EmitPost.status`, `publish_at`):
|
|
463
|
+
* each one, and each link to one that a published page carried — kept as
|
|
464
|
+
* its text. Redirects to a held-back entry are in `redirects.manual`.
|
|
465
|
+
*/
|
|
466
|
+
withheld?: {
|
|
467
|
+
entries: WithheldEntry[];
|
|
468
|
+
links: WithheldLink[];
|
|
469
|
+
};
|
|
386
470
|
}
|
|
387
471
|
//#endregion
|
|
388
472
|
//#region src/css.d.ts
|
|
@@ -637,6 +721,28 @@ declare function balanceWarning(html: string): string | null;
|
|
|
637
721
|
/** Site-root paths (directory format, `/a/b/`) of every noindex page, sorted. */
|
|
638
722
|
declare function noindexPaths(routes: RouteModel[], content: EmitContent): string[];
|
|
639
723
|
//#endregion
|
|
724
|
+
//#region src/published.d.ts
|
|
725
|
+
/**
|
|
726
|
+
* Why an entry is not built, or null when it is. `now` is epoch ms. With
|
|
727
|
+
* `requireStatus` an entry that carries no status is held back: the producer
|
|
728
|
+
* said it passes every entry's status, so a missing one is a gap, not a
|
|
729
|
+
* published entry.
|
|
730
|
+
*/
|
|
731
|
+
declare function holdReason(post: Pick<EmitPost, 'status' | 'publish_at' | 'visibility'>, now: number, requireStatus?: boolean): WithheldEntry['reason'] | null;
|
|
732
|
+
interface PublishedContent {
|
|
733
|
+
content: EmitContent;
|
|
734
|
+
withheld: WithheldEntry[];
|
|
735
|
+
links: WithheldLink[];
|
|
736
|
+
/** The addresses held-back entries would have had and no published entry builds (`/a/b/`). */
|
|
737
|
+
gone: Set<string>;
|
|
738
|
+
}
|
|
739
|
+
/**
|
|
740
|
+
* The content with every unpublished entry removed — from its collection and
|
|
741
|
+
* from the list pages that carry it as an item — and links to them unwrapped.
|
|
742
|
+
* Content with nothing held back is returned as given.
|
|
743
|
+
*/
|
|
744
|
+
declare function publishedContent(routes: RouteModel[], content: EmitContent, now: number, siteUrl?: string, requireStatus?: boolean): PublishedContent;
|
|
745
|
+
//#endregion
|
|
640
746
|
//#region src/redirects.d.ts
|
|
641
747
|
/** The statuses written to `astro.config`; any other is a manual rule. */
|
|
642
748
|
declare const REDIRECT_STATUSES: readonly [301, 302, 307, 308];
|
|
@@ -665,9 +771,13 @@ interface RedirectPlan {
|
|
|
665
771
|
declare function builtAddresses(routes: RouteModel[], content: EmitContent): Map<string, string>;
|
|
666
772
|
/**
|
|
667
773
|
* Split the rules into what `astro.config` serves and what the host has to.
|
|
668
|
-
* `built` is `builtAddresses` of the emitted routes.
|
|
774
|
+
* `built` is `builtAddresses` of the emitted routes. `hostOnly`: the rules go
|
|
775
|
+
* to host files alone (`EmitInput.hostRedirects`), so the checks that hold
|
|
776
|
+
* only for a static redirect page (a `from` naming a file) are left out.
|
|
669
777
|
*/
|
|
670
|
-
declare function planRedirects(redirects: RawRedirect$1[], built: Map<string, string
|
|
778
|
+
declare function planRedirects(redirects: RawRedirect$1[], built: Map<string, string>, options?: {
|
|
779
|
+
hostOnly?: boolean;
|
|
780
|
+
}): RedirectPlan;
|
|
671
781
|
/** The `redirects` line for astro.config.mjs, or null when there is nothing to write. */
|
|
672
782
|
declare function astroRedirectsConfig(config: RedirectPlan['config']): string | null;
|
|
673
783
|
/** Hosts whose own redirect file the emitter can write. */
|
|
@@ -709,5 +819,5 @@ declare function emitAstroProject(input: EmitInput): EmitResult;
|
|
|
709
819
|
/** Write an EmitResult to disk. Separate from emit so the core stays pure. */
|
|
710
820
|
declare function writeEmit(result: EmitResult, dir: string): Promise<void>;
|
|
711
821
|
//#endregion
|
|
712
|
-
export { type Alternate, type AlternatesResult, type AuthorProfile, type BalanceReport, type Breadcrumb, EMBED_TS, type EmitContent, type EmitCssFile, type EmitInput, type EmitOptions, type EmitPost, type EmitResult, type EmitTermRef, type EntrySourceRef, FEED_ITEMS, FEED_PATH, type FeedLinkResult, type HostRedirectFiles, type ImageMeta, LLMS_LINKS, type LinkSource, type ManualRedirect, type MountRef, type QueryPage, REDIRECT_STATUSES, RUNTIME_IMPLEMENTED, type RawRedirect, type RedirectHost, type RedirectPlan, type RedirectStatus, type RuntimeBinding, SEO_COMPONENT, type SeoFields, type SeoFromRawOptions, type SocialOverride, type StripResult, type TwitterOverride, UI_STRINGS_DIR, UI_STRINGS_MODEL, UI_STRING_DEFAULTS, type UiStringKey, astroRedirectsConfig, balanceWarning, bodySeoLeaks, builtAddresses, checkBalance, componentMarkers, emitAstroProject, entryPath, hostRedirectFiles, isRuntimeImplemented, linkSources, noindexPaths, pascalCase, patternToPagePath, planRedirects, publisherIdOf, rewriteFeedLinks, seoFromRawEntry, stableJson, stripSeoTags, websiteIdOf, withAlternates, wrapLegacyCss, writeEmit };
|
|
822
|
+
export { type Alternate, type AlternatesResult, type AuthorProfile, type BalanceReport, type Breadcrumb, EMBED_TS, type EmitContent, type EmitCssFile, type EmitInput, type EmitOptions, type EmitPost, type EmitResult, type EmitTermRef, type EntrySourceRef, FEED_ITEMS, FEED_PATH, type FeedLinkResult, type HostRedirectFiles, type ImageMeta, LLMS_LINKS, type LinkSource, type ManualRedirect, type MountRef, type PublishedContent, type QueryPage, REDIRECT_STATUSES, RUNTIME_IMPLEMENTED, type RawRedirect, type RedirectHost, type RedirectPlan, type RedirectStatus, type RuntimeBinding, SEO_COMPONENT, type SeoFields, type SeoFromRawOptions, type SocialOverride, type StripResult, type TwitterOverride, UI_STRINGS_DIR, UI_STRINGS_MODEL, UI_STRING_DEFAULTS, type UiStringKey, type WithheldEntry, type WithheldLink, astroRedirectsConfig, balanceWarning, bodySeoLeaks, builtAddresses, checkBalance, componentMarkers, emitAstroProject, entryPath, holdReason, hostRedirectFiles, isRuntimeImplemented, linkSources, noindexPaths, pascalCase, patternToPagePath, planRedirects, publishedContent, publisherIdOf, rewriteFeedLinks, seoFromRawEntry, stableJson, stripSeoTags, websiteIdOf, withAlternates, wrapLegacyCss, writeEmit };
|
|
713
823
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/css.ts","../src/feed.ts","../src/util.ts","../src/layouts.ts","../src/components.ts","../src/seo.ts","../src/seo-entry.ts","../src/alternates.ts","../src/embed.ts","../src/ui-strings.ts","../src/balance.ts","../src/noindex.ts","../src/redirects.ts","../src/index.ts"],"mappings":";;;;;AAYA;;;;;AAKA;AAAA,UALiB,WAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,QAAA;EACf,IAAA;EACA,KAAA;EA8DU;EA5DV,IAAA;EAuFc;;;;;;EAhFd,MAAA,GAAS,MAAA;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/css.ts","../src/feed.ts","../src/util.ts","../src/layouts.ts","../src/components.ts","../src/seo.ts","../src/seo-entry.ts","../src/alternates.ts","../src/embed.ts","../src/ui-strings.ts","../src/balance.ts","../src/noindex.ts","../src/published.ts","../src/redirects.ts","../src/index.ts"],"mappings":"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"}
|