@heroiclands/package-build 22.0.3 → 22.1.1
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/CHANGELOG.md +66 -0
- package/CONTENT.md +56 -18
- package/README.md +1 -1
- package/bin/content-build.mjs +67 -23
- package/bin/package-build.mjs +3 -2
- package/config.mjs +52 -1
- package/content-config.mjs +264 -8
- package/docs/api.md +33 -30
- package/docs/commands.md +68 -32
- package/docs/configuration.md +276 -62
- package/docs/getting-started.md +15 -4
- package/docs/project-setup.md +45 -20
- package/engine/content-links.mjs +19 -9
- package/engine/helpers.mjs +2 -1
- package/engine/metadata-index.mjs +32 -0
- package/engine/note-vocabulary.mjs +20 -0
- package/engine/pack-config.mjs +21 -2
- package/engine/site-build.mjs +29 -55
- package/engine/site-config.mjs +503 -0
- package/engine/site-index.mjs +10 -1
- package/engine/web-wikilinks.mjs +16 -6
- package/engine/wikilink-syntax.mjs +10 -0
- package/engine/wikilinks.mjs +34 -7
- package/manifest.mjs +12 -7
- package/package.json +2 -1
- package/stage.mjs +4 -3
- package/types/config.d.mts +24 -0
- package/types/content-config.d.mts +64 -0
- package/types/engine/content-links.d.mts +3 -2
- package/types/engine/metadata-index.d.mts +22 -0
- package/types/engine/note-vocabulary.d.mts +12 -0
- package/types/engine/site-build.d.mts +8 -26
- package/types/engine/site-config.d.mts +236 -0
- package/types/engine/site-index.d.mts +6 -1
- package/types/engine/web-wikilinks.d.mts +9 -5
- package/types/engine/wikilink-syntax.d.mts +3 -0
- package/types/engine/wikilinks.d.mts +16 -5
- package/types/manifest.d.mts +4 -4
- package/types/stage.d.mts +4 -3
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check a navigation's shape, and return it.
|
|
3
|
+
*
|
|
4
|
+
* `[{name, url, children?: [{name, url}]}]`, every `url` absolute. Checked
|
|
5
|
+
* on fetch and again on read: a file that is not a navigation would otherwise
|
|
6
|
+
* reach the generated menu as `undefined` labels and links.
|
|
7
|
+
*
|
|
8
|
+
* @param {unknown} value - The parsed document.
|
|
9
|
+
* @param {string} where - What is being checked, for the error.
|
|
10
|
+
* @returns {NavigationEntry[]} The navigation.
|
|
11
|
+
* @throws {TypeError} When the shape is not a navigation.
|
|
12
|
+
*/
|
|
13
|
+
export function checkNavigation(value: unknown, where?: string): NavigationEntry[];
|
|
14
|
+
/**
|
|
15
|
+
* The `[[menu.main]]` entries a navigation renders as.
|
|
16
|
+
*
|
|
17
|
+
* Entry for entry, in order; a dropdown is an entry with an `identifier` and
|
|
18
|
+
* its children are entries naming it as `parent`, which is how the theme's
|
|
19
|
+
* header partial draws one. Weights count from one within each level, so the
|
|
20
|
+
* order is the navigation's and not Hugo's alphabetical fallback.
|
|
21
|
+
*
|
|
22
|
+
* @param {readonly NavigationEntry[]} navigation - The navigation.
|
|
23
|
+
* @returns {MenuEntry[]} The menu entries.
|
|
24
|
+
*/
|
|
25
|
+
export function menuEntries(navigation: readonly NavigationEntry[]): MenuEntry[];
|
|
26
|
+
/**
|
|
27
|
+
* Where the fetched navigation sits.
|
|
28
|
+
*
|
|
29
|
+
* @param {object} config - The resolved build configuration.
|
|
30
|
+
* @returns {string} The cache directory.
|
|
31
|
+
*/
|
|
32
|
+
export function navigationCacheDir(config: object): string;
|
|
33
|
+
/**
|
|
34
|
+
* The cached navigation.
|
|
35
|
+
*
|
|
36
|
+
* **Reads the cache only.** A cold cache is an error naming the command that
|
|
37
|
+
* fills it, rather than a download nobody asked for: a site build that reaches
|
|
38
|
+
* the network is not reproducible and fails strangely offline. That is the
|
|
39
|
+
* content index's rule, and it holds here for the same reason. A half-finished
|
|
40
|
+
* fetch counts as cold.
|
|
41
|
+
*
|
|
42
|
+
* @param {object} config - The resolved build configuration.
|
|
43
|
+
* @returns {NavigationEntry[]} The navigation.
|
|
44
|
+
* @throws {Error} When it has not been fetched, or is not a navigation.
|
|
45
|
+
*/
|
|
46
|
+
export function readCachedNavigation(config: object): NavigationEntry[];
|
|
47
|
+
/**
|
|
48
|
+
* Fetch the navigation into the cache, and stamp it complete.
|
|
49
|
+
*
|
|
50
|
+
* Rebuilt from empty on every call rather than kept when present: the
|
|
51
|
+
* navigation carries no version to key a cache on, and a package added to the
|
|
52
|
+
* roster reaches a site on its next `deps fetch`.
|
|
53
|
+
*
|
|
54
|
+
* @param {object} config - The resolved build configuration.
|
|
55
|
+
* @param {object} [options] - Options.
|
|
56
|
+
* @param {string} [options.url] - Where to fetch from. Defaults to
|
|
57
|
+
* {@link NAVIGATION_URL}.
|
|
58
|
+
* @param {typeof globalThis.fetch} [options.fetch] - The fetch to use.
|
|
59
|
+
* @returns {Promise<string>} The cached file.
|
|
60
|
+
* @throws {Error} When the download fails, or the document is not a navigation.
|
|
61
|
+
*/
|
|
62
|
+
export function fetchNavigation(config: object, { url, fetch }?: {
|
|
63
|
+
url?: string | undefined;
|
|
64
|
+
fetch?: typeof globalThis.fetch | undefined;
|
|
65
|
+
}): Promise<string>;
|
|
66
|
+
/**
|
|
67
|
+
* The `themesDir` for a repository, as the path from `build/hugo/` to the
|
|
68
|
+
* directory holding the installed theme.
|
|
69
|
+
*
|
|
70
|
+
* Resolved the way Node resolves a package — `node_modules/` in the
|
|
71
|
+
* repository root, then in each parent — and written as a path rather than
|
|
72
|
+
* assumed, so a worktree that resolves its parent's install says so in the
|
|
73
|
+
* generated file.
|
|
74
|
+
*
|
|
75
|
+
* @param {string} rootDir - The repository root.
|
|
76
|
+
* @returns {string} The relative path, POSIX-separated.
|
|
77
|
+
* @throws {Error} When the theme is installed nowhere above the root.
|
|
78
|
+
*/
|
|
79
|
+
export function resolveThemesDir(rootDir: string): string;
|
|
80
|
+
/**
|
|
81
|
+
* The Hugo configuration, as an object.
|
|
82
|
+
*
|
|
83
|
+
* Pure: every input is handed in, so a test can describe the generated shape
|
|
84
|
+
* without a repository on disk. {@link generateHugoConfig} is the same function
|
|
85
|
+
* with the reading put back.
|
|
86
|
+
*
|
|
87
|
+
* `checkHomepage` runs first, before any value is composed — a missing or
|
|
88
|
+
* mismatched `package.json` `homepage` is a finding on every site build.
|
|
89
|
+
*
|
|
90
|
+
* @param {object} options - The sources.
|
|
91
|
+
* @param {object} options.config - The resolved build configuration.
|
|
92
|
+
* @param {string} [options.description] - `package.json`'s `description`.
|
|
93
|
+
* @param {readonly NavigationEntry[]} options.navigation - The navigation.
|
|
94
|
+
* @param {string} options.themesDir - From {@link resolveThemesDir}.
|
|
95
|
+
* @param {boolean} [options.hasTags] - Whether any note the site build walked
|
|
96
|
+
* carries `tags:`, from {@link module:engine/site-build.buildSite}'s
|
|
97
|
+
* `hasTags`. Defaults to `false` — no tagged note, no taxonomy pages.
|
|
98
|
+
* @returns {Record<string, any>} The configuration Hugo reads.
|
|
99
|
+
* @throws {TypeError} When `homepage` fails `checkHomepage`, or the
|
|
100
|
+
* configuration declares no `packageBuild.manifest.title`.
|
|
101
|
+
*/
|
|
102
|
+
export function hugoConfig({ config, description, navigation, themesDir, hasTags }: {
|
|
103
|
+
config: object;
|
|
104
|
+
description?: string | undefined;
|
|
105
|
+
navigation: readonly NavigationEntry[];
|
|
106
|
+
themesDir: string;
|
|
107
|
+
hasTags?: boolean | undefined;
|
|
108
|
+
}): Record<string, any>;
|
|
109
|
+
/**
|
|
110
|
+
* The configuration as the TOML Hugo reads.
|
|
111
|
+
*
|
|
112
|
+
* @param {Record<string, unknown>} generated - From {@link hugoConfig}.
|
|
113
|
+
* @returns {string} The file's contents.
|
|
114
|
+
*/
|
|
115
|
+
export function hugoToml(generated: Record<string, unknown>): string;
|
|
116
|
+
/**
|
|
117
|
+
* The Hugo configuration, every source read from the repository.
|
|
118
|
+
*
|
|
119
|
+
* Reads `package.json`, the cached navigation and the installed theme's
|
|
120
|
+
* location, and composes them with {@link hugoConfig}. Nothing is written, so
|
|
121
|
+
* a caller can run this before touching the output tree and fail with it
|
|
122
|
+
* intact.
|
|
123
|
+
*
|
|
124
|
+
* @param {object} config - The resolved build configuration.
|
|
125
|
+
* @param {object} [options] - Options.
|
|
126
|
+
* @param {boolean} [options.hasTags] - Whether any note the site build walked
|
|
127
|
+
* carries `tags:`. Defaults to `false`, so a caller generating the
|
|
128
|
+
* configuration before the walk (to fail fast on a missing source) gets the
|
|
129
|
+
* untagged shape; pass the site build's own `hasTags` once it is known.
|
|
130
|
+
* @returns {Record<string, any>} The configuration Hugo reads.
|
|
131
|
+
* @throws {Error} When any source is missing or wrong.
|
|
132
|
+
*/
|
|
133
|
+
export function generateHugoConfig(config: object, { hasTags }?: {
|
|
134
|
+
hasTags?: boolean | undefined;
|
|
135
|
+
}): Record<string, any>;
|
|
136
|
+
/**
|
|
137
|
+
* Write `build/hugo/hugo.toml`.
|
|
138
|
+
*
|
|
139
|
+
* @param {object} config - The resolved build configuration.
|
|
140
|
+
* @param {Record<string, unknown>} [generated] - The configuration to write,
|
|
141
|
+
* when the caller already generated it. Generated here otherwise.
|
|
142
|
+
* @returns {{file: string}} The file written.
|
|
143
|
+
*/
|
|
144
|
+
export function writeHugoConfig(config: object, generated?: Record<string, unknown>): {
|
|
145
|
+
file: string;
|
|
146
|
+
};
|
|
147
|
+
/** The Hugo source directory, relative to the repository root. */
|
|
148
|
+
export const HUGO_SOURCE: "build/hugo";
|
|
149
|
+
/** The content mount `content-build site` writes, relative to the repository root. */
|
|
150
|
+
export const HUGO_CONTENT: "build/hugo/content";
|
|
151
|
+
/**
|
|
152
|
+
* The directory that is deployed, relative to the repository root.
|
|
153
|
+
*
|
|
154
|
+
* Hugo renders into `<DEPLOY_ROOT>/<contentPackage>/`; `package-build
|
|
155
|
+
* site-root` writes `_headers` and `_redirects` beside it.
|
|
156
|
+
*/
|
|
157
|
+
export const DEPLOY_ROOT: "build/site";
|
|
158
|
+
/** The npm package the shared theme arrives as. */
|
|
159
|
+
export const THEME_PACKAGE: "@heroiclands/hugo-theme";
|
|
160
|
+
/** The theme's name under `themesDir`, which is the package's unscoped name. */
|
|
161
|
+
export const THEME: "hugo-theme";
|
|
162
|
+
/** The locale every site renders in. */
|
|
163
|
+
export const LOCALE: "en-us";
|
|
164
|
+
/**
|
|
165
|
+
* The brand chrome's own links, the same on every site.
|
|
166
|
+
*
|
|
167
|
+
* `logo` is resolved through the theme's `cdn-url.html`, so it is a path on
|
|
168
|
+
* the asset host rather than an address.
|
|
169
|
+
*/
|
|
170
|
+
export const BRAND: Readonly<{
|
|
171
|
+
logo: "images/brand/sohl-icon-white.webp";
|
|
172
|
+
licenseURL: "https://www.heroiclands.org/license/";
|
|
173
|
+
discordURL: "https://discord.gg/EwMfkNd3az";
|
|
174
|
+
}>;
|
|
175
|
+
/**
|
|
176
|
+
* The kinds a site with no tagged notes renders.
|
|
177
|
+
*
|
|
178
|
+
* A section exists only where `site.sections` declares one, so a tree holding
|
|
179
|
+
* only the homepage emits nothing beyond it; a taxonomy nobody's notes fill
|
|
180
|
+
* and a feed would be empty shells. A site whose notes carry `tags:` emits
|
|
181
|
+
* `taxonomy` and `term` after all — see {@link hugoConfig} — but `RSS` is
|
|
182
|
+
* disabled either way: nothing here publishes a feed.
|
|
183
|
+
*/
|
|
184
|
+
export const DISABLE_KINDS: readonly string[];
|
|
185
|
+
/**
|
|
186
|
+
* The markup settings the toolchain's own output requires.
|
|
187
|
+
*
|
|
188
|
+
* Pages are written with raw HTML in them — a `<figure>` for every image, a
|
|
189
|
+
* `<span>` marking an unresolved link — and Goldmark drops raw HTML unless
|
|
190
|
+
* told otherwise. A theme cannot supply this: Hugo does not merge a theme's
|
|
191
|
+
* `markup` block.
|
|
192
|
+
*/
|
|
193
|
+
export const MARKUP: Readonly<{
|
|
194
|
+
goldmark: Readonly<{
|
|
195
|
+
renderer: Readonly<{
|
|
196
|
+
unsafe: true;
|
|
197
|
+
}>;
|
|
198
|
+
}>;
|
|
199
|
+
}>;
|
|
200
|
+
/** Where the navigation is published. */
|
|
201
|
+
export const NAVIGATION_URL: "https://www.heroiclands.org/nav.json";
|
|
202
|
+
/** The cached navigation's file name. */
|
|
203
|
+
export const NAVIGATION_FILE: "nav.json";
|
|
204
|
+
/**
|
|
205
|
+
* A navigation entry, as `nav.json` states one.
|
|
206
|
+
*/
|
|
207
|
+
export type NavigationEntry = {
|
|
208
|
+
/**
|
|
209
|
+
* - The entry's label.
|
|
210
|
+
*/
|
|
211
|
+
name: string;
|
|
212
|
+
/**
|
|
213
|
+
* - Where it links, absolute.
|
|
214
|
+
*/
|
|
215
|
+
url: string;
|
|
216
|
+
/**
|
|
217
|
+
* - A dropdown's entries.
|
|
218
|
+
*/
|
|
219
|
+
children?: NavigationEntry[] | undefined;
|
|
220
|
+
};
|
|
221
|
+
/**
|
|
222
|
+
* A Hugo menu entry, as `[[menu.main]]` states one.
|
|
223
|
+
*/
|
|
224
|
+
export type MenuEntry = {
|
|
225
|
+
name: string;
|
|
226
|
+
url: string;
|
|
227
|
+
weight: number;
|
|
228
|
+
/**
|
|
229
|
+
* - Set on an entry that has children.
|
|
230
|
+
*/
|
|
231
|
+
identifier?: string | undefined;
|
|
232
|
+
/**
|
|
233
|
+
* - Set on a child, naming its parent's identifier.
|
|
234
|
+
*/
|
|
235
|
+
parent?: string | undefined;
|
|
236
|
+
};
|
|
@@ -7,13 +7,18 @@
|
|
|
7
7
|
* @param {Map<string, {package: string, type?: string}>} [options.foreignIndex]
|
|
8
8
|
* The merged index from `loadForeignIndexes`. Omit when the build publishes
|
|
9
9
|
* no cross-package links.
|
|
10
|
+
* @param {Set<string>} [options.noIndexPackages] - Packages declared
|
|
11
|
+
* `contentIndex: false` — a Foundry dependency only, with no fetched index.
|
|
12
|
+
* A link naming one fails naming the key, rather than reading as prose or an
|
|
13
|
+
* ordinary dead address.
|
|
10
14
|
* @returns {SiteIndex} The index, and what could not be addressed unambiguously.
|
|
11
15
|
*/
|
|
12
|
-
export function buildSiteIndex(entries: readonly SiteEntry[], { foreignIndex }?: {
|
|
16
|
+
export function buildSiteIndex(entries: readonly SiteEntry[], { foreignIndex, noIndexPackages }?: {
|
|
13
17
|
foreignIndex?: Map<string, {
|
|
14
18
|
package: string;
|
|
15
19
|
type?: string;
|
|
16
20
|
}> | undefined;
|
|
21
|
+
noIndexPackages?: Set<string> | undefined;
|
|
17
22
|
}): SiteIndex;
|
|
18
23
|
/**
|
|
19
24
|
* The per-page context a wikilink resolver takes.
|
|
@@ -44,9 +44,10 @@ export function frontmatterWikilinks(fm: unknown): Array<{
|
|
|
44
44
|
*
|
|
45
45
|
* **Every target that resolves nowhere fails the build**, and is
|
|
46
46
|
* classified into the vocabulary all three resolvers share — `unlabelled`,
|
|
47
|
-
* `not-an-address`, `unknown-type`, `ambiguous`, `unresolved
|
|
48
|
-
* collected in `ctx.errors`, each carrying
|
|
49
|
-
* `occurrence` so a caller can report the line and
|
|
47
|
+
* `not-an-address`, `unknown-type`, `ambiguous`, `unresolved`,
|
|
48
|
+
* `no-content-index`. Failures are collected in `ctx.errors`, each carrying
|
|
49
|
+
* the authored `link` and its `occurrence` so a caller can report the line and
|
|
50
|
+
* column it sits on.
|
|
50
51
|
*
|
|
51
52
|
* There is deliberately no exception letting a hyphen-form address through while
|
|
52
53
|
* any linkable package had no vendored manifest, since a real cross-package
|
|
@@ -77,9 +78,12 @@ export function frontmatterWikilinks(fm: unknown): Array<{
|
|
|
77
78
|
*
|
|
78
79
|
* @param {string} body - The markdown body.
|
|
79
80
|
* @param {object} ctx - `{ index, assets, collide, sections, contentTypes,
|
|
80
|
-
* packages, foreign, type, errors, src, file }`.
|
|
81
|
+
* packages, noIndexPackages, foreign, type, errors, src, file }`.
|
|
81
82
|
* `packages` is every package an address may name, without which the leading
|
|
82
|
-
* package segment of a canonical address reads as an unknown type;
|
|
83
|
+
* package segment of a canonical address reads as an unknown type;
|
|
84
|
+
* `noIndexPackages` is every package declared `contentIndex: false`, so a
|
|
85
|
+
* qualified address naming one fails with `no-content-index` rather than
|
|
86
|
+
* `not-an-address`; `foreign`
|
|
83
87
|
* is the cross-package manifest index; `assets` is the address space an embed
|
|
84
88
|
* resolves against. `src` is the page's display
|
|
85
89
|
* path and `file` the source file a diagnostic should name — absent, `src`
|
|
@@ -223,6 +223,9 @@ export const WIKILINK: RegExp;
|
|
|
223
223
|
* - `unresolved` — parses as an address, and nothing publishes it.
|
|
224
224
|
* - `ambiguous` — more than one package publishes the short address.
|
|
225
225
|
* - `unknown-anchor` — the address resolved, the `#section` it names did not.
|
|
226
|
+
* - `no-content-index` — the address names a package declared
|
|
227
|
+
* `contentIndex: false`, a Foundry dependency only, so no index was fetched
|
|
228
|
+
* for it to resolve against.
|
|
226
229
|
*
|
|
227
230
|
* @type {ReadonlySet<string>}
|
|
228
231
|
*/
|
|
@@ -81,13 +81,18 @@ export function resolveItemDocType(qualifier: string, types: Set<string>): strin
|
|
|
81
81
|
* @param {Set<string>} types - Every type the content tree contains.
|
|
82
82
|
* @param {Set<string>} [packages] - Every package an address may name. Omitted
|
|
83
83
|
* by callers that resolve within one package, where the form cannot occur.
|
|
84
|
+
* @param {Set<string>} [noIndexPackages] - Packages declared `contentIndex:
|
|
85
|
+
* false` — a Foundry dependency only, with no fetched index. A fully
|
|
86
|
+
* qualified target naming one is refused with `no-content-index` before its
|
|
87
|
+
* type is even considered, since there is no index to resolve it against.
|
|
84
88
|
* @returns {{type: string, shortcode: string, itemDoc: boolean,
|
|
85
89
|
* package?: string, system?: string, reason?: undefined}
|
|
86
|
-
* | {reason: "unknown-type"} | null}
|
|
90
|
+
* | {reason: "unknown-type"|"no-content-index", package?: string} | null}
|
|
87
91
|
* The resolved qualifier; a `reason` when the target is definitely qualified
|
|
88
|
-
* but names no known type; or `null` when it is not an
|
|
92
|
+
* but names no known type or no fetched index; or `null` when it is not an
|
|
93
|
+
* address at all.
|
|
89
94
|
*/
|
|
90
|
-
export function readQualifier(target: string, types: Set<string>, packages?: Set<string>): {
|
|
95
|
+
export function readQualifier(target: string, types: Set<string>, packages?: Set<string>, noIndexPackages?: Set<string>): {
|
|
91
96
|
type: string;
|
|
92
97
|
shortcode: string;
|
|
93
98
|
itemDoc: boolean;
|
|
@@ -95,7 +100,8 @@ export function readQualifier(target: string, types: Set<string>, packages?: Set
|
|
|
95
100
|
system?: string;
|
|
96
101
|
reason?: undefined;
|
|
97
102
|
} | {
|
|
98
|
-
reason: "unknown-type";
|
|
103
|
+
reason: "unknown-type" | "no-content-index";
|
|
104
|
+
package?: string;
|
|
99
105
|
} | null;
|
|
100
106
|
/**
|
|
101
107
|
* The deterministic JournalEntryPage id for one anchor: SHA-256 of
|
|
@@ -132,6 +138,10 @@ export function anchorPageId(noteId: string, anchorSlug: string): string;
|
|
|
132
138
|
* @param {Map<string, object>} [opts.assets] - The files this package ships, by
|
|
133
139
|
* canonical address. They resolve no link — an asset is not a document — and
|
|
134
140
|
* answer only the art fields, which name a file and never a document.
|
|
141
|
+
* @param {Set<string>} [opts.noIndexPackages] - Packages declared
|
|
142
|
+
* `contentIndex: false` — a Foundry dependency only. A link naming one fails
|
|
143
|
+
* with `no-content-index` rather than resolving, ambiguously, as either a
|
|
144
|
+
* typo or an undeclared package.
|
|
135
145
|
* @returns {{byShortcode: Map<string, object>, types: Set<string>}} `types` is
|
|
136
146
|
* every type the tree actually contains, so a qualifier naming no real type
|
|
137
147
|
* can be told apart from a missing target.
|
|
@@ -144,8 +154,9 @@ export function buildWikilinkIndex(docs: Array<{
|
|
|
144
154
|
pack?: string;
|
|
145
155
|
docPack?: string;
|
|
146
156
|
draft?: boolean;
|
|
147
|
-
}>, packageId: string, foreign?: Map<string, object>, contentPackage?: string, { assets }?: {
|
|
157
|
+
}>, packageId: string, foreign?: Map<string, object>, contentPackage?: string, { assets, noIndexPackages }?: {
|
|
148
158
|
assets?: Map<string, object> | undefined;
|
|
159
|
+
noIndexPackages?: Set<string> | undefined;
|
|
149
160
|
}): {
|
|
150
161
|
byShortcode: Map<string, object>;
|
|
151
162
|
types: Set<string>;
|
package/types/manifest.d.mts
CHANGED
|
@@ -188,10 +188,10 @@ export function publishedRelationships(relationships: Record<string, unknown>):
|
|
|
188
188
|
*
|
|
189
189
|
* - **Declared** — everything in `packageBuild.manifest`, emitted unchanged, so
|
|
190
190
|
* a key Foundry adds later needs no release of this package.
|
|
191
|
-
* - **Derived** — the identity, the
|
|
192
|
-
* and system compatibility ranges, and the pack list.
|
|
193
|
-
* also declared: an authored copy would be overwritten
|
|
194
|
-
* disagree with nothing to say so.
|
|
191
|
+
* - **Derived** — the identity, the description, the release addresses, the
|
|
192
|
+
* version, the Foundry and system compatibility ranges, and the pack list.
|
|
193
|
+
* These are refused if also declared: an authored copy would be overwritten
|
|
194
|
+
* and the two would disagree with nothing to say so.
|
|
195
195
|
* - **Computed** — namespaced `flags` a repository works out for itself, merged
|
|
196
196
|
* over any it declared.
|
|
197
197
|
*
|
package/types/stage.d.mts
CHANGED
|
@@ -77,8 +77,9 @@ export function cleanBuildArtifacts(root: string, { extra, includeNodeModules }?
|
|
|
77
77
|
/**
|
|
78
78
|
* Directories every HeroicLands repository regenerates and none commits.
|
|
79
79
|
*
|
|
80
|
-
* A repository adds its own
|
|
81
|
-
*
|
|
82
|
-
*
|
|
80
|
+
* A repository adds its own through `packageBuild.clean.extra`, but these four
|
|
81
|
+
* are common to all of them because they come from the shared toolchain rather
|
|
82
|
+
* than from any one package's layout. Everything the site build writes — the
|
|
83
|
+
* Hugo source tree, Hugo's cache and the rendered site — is under `build/`.
|
|
83
84
|
*/
|
|
84
85
|
export const BUILD_ARTIFACT_DIRS: readonly string[];
|