netjes 0.0.3 → 0.0.4

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 CHANGED
@@ -17,7 +17,7 @@ npm run dev # http://localhost:5080
17
17
  ## Add it to a project
18
18
 
19
19
  ```bash
20
- npm install netjes@0.0.3 react react-dom zod @tanstack/react-query
20
+ npm install netjes@0.0.4 react react-dom zod @tanstack/react-query
21
21
  npm install -D vite tailwindcss @tailwindcss/vite
22
22
  ```
23
23
 
@@ -31,25 +31,27 @@ export default defineConfig({ plugins: [netjes()] });
31
31
 
32
32
  Tailwind CSS and the TanStack Query client are on by default; `netjes({ tailwind: false, query: false })` turns them off, and then they need not be installed. `vitest`, `jsdom`, `@testing-library/react` and `web-vitals` are optional peers, used when installed. Use the version of `netjes` that matches the app's `Netjes` NuGet package; `npx netjes info` checks it.
33
33
 
34
+ A page package, an npm package that brings pages for the app to mount at a prefix, is listed in the plugin's options, `netjes({ packages: ['@acme/help-center'] })`, so the app's build compiles its pages and its Tailwind classes, with Tailwind on ([Page packages](https://github.com/DennisVerhoeven/netjes/blob/v0.0.4/docs/guides/page-packages.md)).
35
+
34
36
  ## Entry points
35
37
 
36
38
  | Import | What it holds |
37
39
  |---|---|
38
- | `netjes` | Components and hooks: `Link`, `Form`, `Image`, `Script`, `definePage`, `useAction`, `useRouter` and the rest, and `CSP_SCRIPT_HASHES`, the hashes of Netjes's inline scripts for a Content-Security-Policy without a nonce |
40
+ | `netjes` | Components and hooks: `Link`, `Form`, `Image`, `Script`, `definePage`, `useAction`, `useRouter` and the rest, `mounted`, which a page package's generated file calls for links below its mount, and `CSP_SCRIPT_HASHES`, the hashes of Netjes's inline scripts for a Content-Security-Policy without a nonce |
39
41
  | `netjes/vite` | The Vite plugin |
40
42
  | `netjes/testing` | `createTestApp()`, for rendering pages and components in Vitest, and `renderDocument()` and `inlineScriptHashes()`, for a page's whole document and the inline scripts in it |
41
43
  | `netjes/vitals` | `useReportWebVitals` and `<WebVitals />` |
42
44
  | `netjes/zod` | `deferred(schema)`, for values that loaders stream with `Page.Defer` |
43
45
  | `netjes` (bin) | The command: `new`, `dev`, `build`, `start`, `generate`, `routes`, `export`, `info`, `agents` |
44
46
 
45
- Each import is an ES module with its type declarations, so an app's `tsc` reads the declarations and checks only the app's own code, also under stricter compiler options such as `exactOptionalPropertyTypes` or `noPropertyAccessFromIndexSignature` (see [TypeScript setup](https://github.com/DennisVerhoeven/netjes/blob/v0.0.3/docs/reference/vite-plugin.md#typescript-setup)). The TypeScript sources are in the package too, for the source maps: an editor's go to definition and a stack trace lead to them.
47
+ Each import is an ES module with its type declarations, so an app's `tsc` reads the declarations and checks only the app's own code, also under stricter compiler options such as `exactOptionalPropertyTypes` or `noPropertyAccessFromIndexSignature` (see [TypeScript setup](https://github.com/DennisVerhoeven/netjes/blob/v0.0.4/docs/reference/vite-plugin.md#typescript-setup)). The TypeScript sources are in the package too, for the source maps: an editor's go to definition and a stack trace lead to them.
46
48
 
47
49
  ## Documentation
48
50
 
49
- - [Getting started](https://github.com/DennisVerhoeven/netjes/blob/v0.0.3/docs/getting-started.md)
50
- - [All guides](https://github.com/DennisVerhoeven/netjes/blob/v0.0.3/docs/README.md)
51
- - [React API](https://github.com/DennisVerhoeven/netjes/blob/v0.0.3/docs/reference/react-api.md)
52
- - [Vite plugin](https://github.com/DennisVerhoeven/netjes/blob/v0.0.3/docs/reference/vite-plugin.md)
53
- - [The netjes command](https://github.com/DennisVerhoeven/netjes/blob/v0.0.3/docs/reference/cli.md)
51
+ - [Getting started](https://github.com/DennisVerhoeven/netjes/blob/v0.0.4/docs/getting-started.md)
52
+ - [All guides](https://github.com/DennisVerhoeven/netjes/blob/v0.0.4/docs/README.md)
53
+ - [React API](https://github.com/DennisVerhoeven/netjes/blob/v0.0.4/docs/reference/react-api.md)
54
+ - [Vite plugin](https://github.com/DennisVerhoeven/netjes/blob/v0.0.4/docs/reference/vite-plugin.md)
55
+ - [The netjes command](https://github.com/DennisVerhoeven/netjes/blob/v0.0.4/docs/reference/cli.md)
54
56
 
55
57
  Report bugs in the [issue tracker](https://github.com/DennisVerhoeven/netjes/issues), and security problems privately, as the [security policy](https://github.com/DennisVerhoeven/netjes/security/policy) describes. MIT licensed.
package/cli/info.mjs CHANGED
@@ -58,31 +58,166 @@ function parseVersion(version) {
58
58
  const compare = (a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2];
59
59
 
60
60
  /**
61
- * Whether `version` is in `range`, for the forms package.json ranges usually take (^1.2.3, ~1.2.3, >=1, 1.2.3, *,
62
- * and || between them). A form it does not know passes: only a definite mismatch is reported.
61
+ * A version as npm reads one: major.minor.patch, a prerelease and build metadata, which no comparison looks at.
62
+ * @typedef {{ main: [number, number, number]; pre: (string | number)[] }} SemVer
63
+ * @typedef {{ op: '<' | '<=' | '>' | '>=' | '='; version: SemVer }} Comparator
64
+ */
65
+
66
+ /** A number in a version: no leading zeros. */
67
+ const NUMBER = '0|[1-9]\\d*';
68
+ const IDENTIFIER = `(?:${NUMBER}|\\d*[A-Za-z-][0-9A-Za-z-]*)`;
69
+ const PRERELEASE = `(?:-(${IDENTIFIER}(?:\\.${IDENTIFIER})*))?`;
70
+ const BUILD = '(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?';
71
+ const SEMVER = new RegExp(`^v?(${NUMBER})\\.(${NUMBER})\\.(${NUMBER})${PRERELEASE}${BUILD}$`);
72
+ /** A version in a range, which may leave out its minor and patch, or write them as x, X or *. */
73
+ const PARTIAL = new RegExp(`^v?(${NUMBER}|[xX*])(?:\\.(${NUMBER}|[xX*])(?:\\.(${NUMBER}|[xX*])${PRERELEASE}${BUILD})?)?$`);
74
+ const OPERATOR = /^(<=|>=|<|>|=|\^|~>|~)?/;
75
+
76
+ /** @param {string} pre @returns {(string | number)[]} */
77
+ const identifiers = (pre) => (pre ? pre.split('.').map((id) => (/^\d+$/.test(id) ? Number(id) : id)) : []);
78
+
79
+ /** @param {string} version @returns {SemVer | null} */
80
+ function parseSemver(version) {
81
+ const match = SEMVER.exec(version.trim());
82
+ return match ? { main: [Number(match[1]), Number(match[2]), Number(match[3])], pre: identifiers(match[4] ?? '') } : null;
83
+ }
84
+
85
+ /** @param {SemVer} a @param {SemVer} b */
86
+ function compareSemver(a, b) {
87
+ const main = compare(a.main, b.main);
88
+ if (main !== 0) return main;
89
+ // A version with a prerelease comes before the version itself, and identifiers compare one by one: numbers by value,
90
+ // and before words.
91
+ if (a.pre.length === 0 || b.pre.length === 0) return b.pre.length - a.pre.length;
92
+ for (let i = 0; i < Math.max(a.pre.length, b.pre.length); i++) {
93
+ const [x, y] = [a.pre[i], b.pre[i]];
94
+ if (x === undefined || y === undefined) return x === undefined ? -1 : 1;
95
+ if (x === y) continue;
96
+ if (typeof x !== typeof y) return typeof x === 'number' ? -1 : 1;
97
+ return x < y ? -1 : 1;
98
+ }
99
+ return 0;
100
+ }
101
+
102
+ /** @param {number} major @param {number} minor @param {number} patch @param {(string | number)[]} [pre] @returns {SemVer} */
103
+ const semver = (major, minor, patch, pre = []) => ({ main: [major, minor, patch], pre });
104
+ /** The lowest version above every prerelease of a release below this one: what npm's `<1.3.0-0` bounds are. */
105
+ const before = (/** @type {number} */ major, /** @type {number} */ minor, /** @type {number} */ patch) => semver(major, minor, patch, [0]);
106
+
107
+ /**
108
+ * The comparators one comparator of a range stands for, as npm reads it: `^1.2` is `>=1.2.0 <2.0.0-0`. Null for one
109
+ * that is none. With `includePrerelease`, a lower bound that the range leaves to npm (`1.2` in `^1.2`, `~1.2`, `>=1.2`)
110
+ * is the lowest prerelease, `>=1.2.0-0`, as npm makes it.
111
+ * @param {string} token
112
+ * @param {boolean} includePrerelease
113
+ * @returns {Comparator[] | null}
114
+ */
115
+ function comparators(token, includePrerelease) {
116
+ const op = OPERATOR.exec(token)?.[1] ?? '';
117
+ const match = PARTIAL.exec(token.slice(op.length));
118
+ if (!match) return null;
119
+ const [major, minor, patch] = [match[1], match[2], match[3]].map((part) => (part === undefined || /^[xX*]$/.test(part) ? null : Number(part)));
120
+ // A number after an x, as in `1.x.3`, makes it none.
121
+ if ((major === null && (minor ?? patch ?? null) !== null) || (minor === null && (patch ?? null) !== null)) return null;
122
+ const pre = identifiers(match[4] ?? '');
123
+ /** @param {number} major @param {number} minor @returns {SemVer} */
124
+ const lowest = (major, minor) => semver(major, minor, 0, includePrerelease ? [0] : []);
125
+ if (major === null || major === undefined) return op === '<' || op === '>' ? [{ op: '<', version: before(0, 0, 0) }] : [];
126
+ if (minor === null || minor === undefined) {
127
+ /** @type {Record<string, Comparator[]>} */
128
+ const byMajor = {
129
+ '>': [{ op: '>=', version: lowest(major + 1, 0) }],
130
+ '>=': [{ op: '>=', version: lowest(major, 0) }],
131
+ '<': [{ op: '<', version: before(major, 0, 0) }],
132
+ '<=': [{ op: '<', version: before(major + 1, 0, 0) }],
133
+ };
134
+ return byMajor[op] ?? [{ op: '>=', version: lowest(major, 0) }, { op: '<', version: before(major + 1, 0, 0) }];
135
+ }
136
+ if (patch === null || patch === undefined) {
137
+ /** @type {Record<string, Comparator[]>} */
138
+ const byMinor = {
139
+ '>': [{ op: '>=', version: lowest(major, minor + 1) }],
140
+ '>=': [{ op: '>=', version: lowest(major, minor) }],
141
+ '<': [{ op: '<', version: before(major, minor, 0) }],
142
+ '<=': [{ op: '<', version: before(major, minor + 1, 0) }],
143
+ '^': [{ op: '>=', version: lowest(major, minor) }, { op: '<', version: major > 0 ? before(major + 1, 0, 0) : before(0, minor + 1, 0) }],
144
+ };
145
+ return byMinor[op] ?? [{ op: '>=', version: lowest(major, minor) }, { op: '<', version: before(major, minor + 1, 0) }];
146
+ }
147
+ const version = semver(major, minor, patch, pre);
148
+ switch (op) {
149
+ case '^': {
150
+ // npm's caret allows the changes that keep the first non-zero part: ^0.0.4 is 0.0.4 alone, and its prereleases.
151
+ const upper = major > 0 ? before(major + 1, 0, 0) : minor > 0 ? before(0, minor + 1, 0) : before(0, 0, patch + 1);
152
+ return [{ op: '>=', version }, { op: '<', version: upper }];
153
+ }
154
+ case '~':
155
+ case '~>':
156
+ return [{ op: '>=', version }, { op: '<', version: before(major, minor + 1, 0) }];
157
+ case '':
158
+ return [{ op: '=', version }];
159
+ default:
160
+ return [{ op: /** @type {Comparator['op']} */ (op), version }];
161
+ }
162
+ }
163
+
164
+ /**
165
+ * The comparators of one part of a range, between `||`s: a hyphen range (`1.2 - 2.3.4`), or comparators that a version
166
+ * has to pass all of, separated by spaces. Null for a part that is none.
167
+ * @param {string} part
168
+ * @param {boolean} includePrerelease
169
+ * @returns {Comparator[] | null}
170
+ */
171
+ function comparatorSet(part, includePrerelease) {
172
+ const hyphen = /^(\S+)\s+-\s+(\S+)$/.exec(part);
173
+ if (hyphen) {
174
+ // From the first version, up to and with the second: `<=2.3` is below 2.4.0, as npm reads a partial version there.
175
+ // With prereleases included, npm starts a hyphen range at the first version's lowest prerelease, unless it names one.
176
+ const from = comparators(`>=${hyphen[1]}`, includePrerelease)?.map((c) =>
177
+ includePrerelease && c.version.pre.length === 0 ? { ...c, version: { ...c.version, pre: [0] } } : c,
178
+ );
179
+ const to = comparators(`<=${hyphen[2]}`, includePrerelease);
180
+ return from && to ? [...from, ...to] : null;
181
+ }
182
+ // `>= 1.2.3` is `>=1.2.3`.
183
+ const tokens = part.replace(/(<=|>=|<|>|=|\^|~>|~)\s+/g, '$1').split(/\s+/).filter(Boolean);
184
+ /** @type {Comparator[]} */
185
+ const set = [];
186
+ for (const token of tokens) {
187
+ const parsed = comparators(token, includePrerelease);
188
+ if (!parsed) return null;
189
+ set.push(...parsed);
190
+ }
191
+ return set;
192
+ }
193
+
194
+ /** @param {SemVer} version @param {Comparator} comparator */
195
+ function passes(version, { op, version: bound }) {
196
+ const order = compareSemver(version, bound);
197
+ return op === '<' ? order < 0 : op === '<=' ? order <= 0 : op === '>' ? order > 0 : op === '>=' ? order >= 0 : order === 0;
198
+ }
199
+
200
+ /**
201
+ * Whether `version` is in `range`, as npm reads ranges: `^`, `~`, `x` and partial versions, `<`, `<=`, `>`, `>=` and
202
+ * `=`, comparators separated by spaces, hyphen ranges and `||`. `^0.0.4` is `>=0.0.4 <0.0.5-0`, and a prerelease is in
203
+ * a range only when a comparator names a prerelease of the same major.minor.patch: `0.0.5-rc.1` is not in `^0.0.4`.
204
+ * Build metadata (`+sha`) is left out. In strict mode a range or a version that is none satisfies nothing; otherwise
205
+ * it passes, so that only a definite mismatch is reported. With `includePrerelease`, as npm checks `engines`, a
206
+ * prerelease is in a range by its place in the order alone: `24.16.0-rc.1` is in `^24.15.0`.
63
207
  * @param {string | undefined} version
64
208
  * @param {string} range
209
+ * @param {{ strict?: boolean; includePrerelease?: boolean }} [options]
65
210
  */
66
- export function satisfies(version, range) {
67
- const have = parseVersion(version);
68
- if (!have) return true;
69
- return range.split('||').some((part) => {
70
- const match = /^\s*(\^|~|>=|=)?\s*v?(\d+)(?:\.(\d+))?(?:\.(\d+))?\s*$/.exec(part);
71
- if (!match) return true;
72
- /** @type {[number, number, number]} */
73
- const want = [Number(match[2]), Number(match[3] ?? 0), Number(match[4] ?? 0)];
74
- const atLeast = compare(have, want) >= 0;
75
- switch (match[1]) {
76
- case '>=':
77
- return atLeast;
78
- case '^':
79
- return atLeast && (want[0] > 0 ? have[0] === want[0] : have[1] === want[1]);
80
- case '~':
81
- return atLeast && have[0] === want[0] && have[1] === want[1];
82
- default:
83
- return match[3] === undefined ? have[0] === want[0] : compare(have, want) === 0;
84
- }
85
- });
211
+ export function satisfies(version, range, { strict = false, includePrerelease = false } = {}) {
212
+ const have = parseSemver(version ?? '');
213
+ const sets = range.split('||').map((part) => comparatorSet(part.trim(), includePrerelease));
214
+ if (!have || sets.some((set) => set === null)) return !strict;
215
+ return sets.some(
216
+ (set) =>
217
+ set !== null &&
218
+ set.every((comparator) => passes(have, comparator)) &&
219
+ (includePrerelease || have.pre.length === 0 || set.some(({ version: bound }) => bound.pre.length > 0 && compare(bound.main, have.main) === 0)),
220
+ );
86
221
  }
87
222
 
88
223
  /** @param {string} file @returns {Promise<any>} */
@@ -99,7 +234,8 @@ async function readJson(file) {
99
234
  * @returns {Check}
100
235
  */
101
236
  export function checkNode(version) {
102
- if (satisfies(version, NODE_RANGE)) return ok(`Node.js ${version}`);
237
+ // A prerelease of Node.js is checked by its place in the order, as npm checks a package's engines.
238
+ if (satisfies(version, NODE_RANGE, { includePrerelease: true })) return ok(`Node.js ${version}`);
103
239
  const major = parseVersion(version)?.[0] ?? 0;
104
240
  const fix = `Install a Node.js release that matches ${NODE_RANGE}: ${NODE_DOWNLOAD}`;
105
241
  // The odd release lines between the supported ones (23, 25) are short-lived; they may work, but are not supported.
@@ -236,6 +372,25 @@ async function checkPackages(cwd, cliVersion) {
236
372
  return { checks, netjes: netjes?.version };
237
373
  }
238
374
 
375
+ /** @param {string} text */
376
+ const escapeRegExp = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
377
+
378
+ /**
379
+ * The project file's PackageReference of the NuGet package `name`, in any case as NuGet compares ids: the Version it
380
+ * gives, and that version when it is an exact one, 1.2.3 or [1.2.3]. A range, a floating version or an MSBuild property
381
+ * such as $(NetjesVersion) is resolved by NuGet and MSBuild, which this does not repeat, so it has no exact version.
382
+ * Null when the project does not reference the package.
383
+ * @param {string} text
384
+ * @param {string} name
385
+ * @returns {{ reference: string | undefined; version: string | undefined } | null}
386
+ */
387
+ function packageReference(text, name) {
388
+ const element = new RegExp(`<PackageReference\\s+[^>]*Include="${escapeRegExp(name)}"[^>]*>`, 'i').exec(text)?.[0];
389
+ if (!element) return null;
390
+ const reference = /\sVersion="([^"]*)"/i.exec(element)?.[1];
391
+ return { reference, version: /^\[?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)\]?$/.exec(reference?.trim() ?? '')?.[1] };
392
+ }
393
+
239
394
  /**
240
395
  * How the project file references Netjes, and whether that is the version of the npm package.
241
396
  * @param {string} cwd
@@ -253,17 +408,14 @@ function checkReference(cwd, csproj, text, npmVersion, cliVersion) {
253
408
  ? ok(`${csproj} references the Netjes checkout at ${file}`)
254
409
  : fail(`${csproj} references Netjes at ${file}, which does not exist`, 'Point its ProjectReference (and the Netjes.targets import) at src/Netjes in a Netjes checkout');
255
410
  }
256
- const element = /<PackageReference\s+[^>]*Include="Netjes"[^>]*>/i.exec(text)?.[0];
257
- if (!element) {
411
+ const found = packageReference(text, 'Netjes');
412
+ if (!found) {
258
413
  return warn(
259
414
  `${csproj} does not reference the Netjes package`,
260
415
  `Add <PackageReference Include="Netjes" Version="[${npmVersion ?? cliVersion}]" />, unless a Directory.Packages.props does`,
261
416
  );
262
417
  }
263
- const reference = /\sVersion="([^"]*)"/i.exec(element)?.[1];
264
- // Only an exact version, 1.2.3 or [1.2.3], is compared: a range, a floating version or an MSBuild property such as
265
- // $(NetjesVersion) is resolved by NuGet and MSBuild, which this does not repeat.
266
- const version = /^\[?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)\]?$/.exec(reference?.trim() ?? '')?.[1];
418
+ const { reference, version } = found;
267
419
  const shown = version ?? reference;
268
420
  if (!version || !npmVersion) return ok(`${csproj} references Netjes${shown ? ` ${shown}` : ''}`);
269
421
  return version === npmVersion
@@ -274,6 +426,80 @@ function checkReference(cwd, csproj, text, npmVersion, cliVersion) {
274
426
  );
275
427
  }
276
428
 
429
+ /**
430
+ * The page packages the app depends on: each dependency whose package.json has a `netjes` field, as the Vite plugin
431
+ * reads them. One line names them with their versions, and a line follows for each one that the app would refuse to
432
+ * mount (no peer range, or one that leaves out the installed netjes), whose NuGet half the project references at another
433
+ * exact version, or that `netjes({ packages })` does not list, so that no build holds its pages. Nothing when the app
434
+ * depends on none.
435
+ * @param {string} cwd
436
+ * @param {{
437
+ * manifest: Record<string, any> | null;
438
+ * netjes: string | undefined;
439
+ * csproj: { file: string; text: string } | null;
440
+ * viteConfig: { file: string; text: string } | null;
441
+ * }} project the app's package.json, the installed netjes's version, the project file, and the Vite config that uses netjes()
442
+ * @returns {Promise<Check[]>}
443
+ */
444
+ async function checkPagePackages(cwd, { manifest, netjes, csproj, viteConfig }) {
445
+ /** @param {unknown} deps */
446
+ const namesIn = (deps) => (typeof deps === 'object' && deps !== null ? Object.keys(deps) : []);
447
+ const names = [...new Set([...namesIn(manifest?.dependencies), ...namesIn(manifest?.devDependencies)])]
448
+ .filter((name) => name !== 'netjes')
449
+ .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
450
+ /** @type {{ name: string; version: string; range: unknown; nuget: unknown }[]} */
451
+ const found = [];
452
+ for (const name of names) {
453
+ const file = findPackage(cwd, name);
454
+ const json = file ? await readJson(file) : null;
455
+ const field = json?.netjes;
456
+ if (typeof field !== 'object' || field === null || Array.isArray(field)) continue;
457
+ found.push({ name, version: typeof json.version === 'string' ? json.version : '?', range: json.peerDependencies?.netjes, nuget: field.nuget });
458
+ }
459
+ if (!found.length) return [];
460
+
461
+ /** @type {Check[]} */
462
+ const checks = [ok(`page packages: ${found.map((p) => `${p.name} ${p.version}`).join(', ')}`)];
463
+ for (const p of found) {
464
+ const named = `${p.name} ${p.version}`;
465
+ if (typeof p.range !== 'string' || p.range.trim() === '') {
466
+ checks.push(
467
+ fail(
468
+ `${named} has no peerDependencies.netjes, so the app refuses to mount it`,
469
+ `A page package names the Netjes versions it supports there: install a version of ${p.name} that does`,
470
+ ),
471
+ );
472
+ } else if (netjes && !satisfies(netjes, p.range, { strict: true })) {
473
+ // As the app and the Vite plugin say it; both stop on it.
474
+ checks.push(
475
+ fail(
476
+ `${named} supports Netjes ${p.range}; this app runs Netjes ${netjes}`,
477
+ `Install a version of ${p.name} that supports netjes ${netjes}, or a netjes in ${p.range}: the app stops at startup otherwise`,
478
+ ),
479
+ );
480
+ }
481
+ const reference = csproj && typeof p.nuget === 'string' ? packageReference(csproj.text, p.nuget) : null;
482
+ if (reference?.version && reference.version !== p.version) {
483
+ checks.push(
484
+ fail(
485
+ `${csproj?.file} references ${p.nuget} ${reference.version}, but node_modules has ${named}`,
486
+ 'Use one version of both halves of the page package: change the PackageReference or package.json; the app stops at startup otherwise',
487
+ ),
488
+ );
489
+ }
490
+ // The name in quotes, so that '@acme/help-center-extra' does not list '@acme/help-center'.
491
+ if (viteConfig && !new RegExp(`(['"\`])${escapeRegExp(p.name)}\\1`).test(viteConfig.text)) {
492
+ checks.push(
493
+ warn(
494
+ `${named} is not in netjes({ packages }) in ${viteConfig.file}`,
495
+ `List it there to build its pages, as in netjes({ packages: ['${p.name}'] }), and mount it with app.MapPagePackage; or uninstall it`,
496
+ ),
497
+ );
498
+ }
499
+ }
500
+ return checks;
501
+ }
502
+
277
503
  /**
278
504
  * The newest .cs file of the app's own, relative to `cwd` with / separators.
279
505
  * @param {string} cwd
@@ -330,14 +556,25 @@ export async function checkProject(cwd, cliVersion) {
330
556
  );
331
557
 
332
558
  const viteConfig = entries.find((e) => /^vite\.config\.(ts|mts|js|mjs)$/.test(e));
559
+ const viteText = viteConfig ? await readFile(path.join(cwd, viteConfig), 'utf8') : null;
333
560
  if (!viteConfig) {
334
561
  checks.push(fail('No vite.config.ts', "Add one: export default defineConfig({ plugins: [netjes()] }), with netjes from 'netjes/vite'"));
335
- } else if (!(await readFile(path.join(cwd, viteConfig), 'utf8')).includes('netjes(')) {
562
+ } else if (!viteText?.includes('netjes(')) {
336
563
  checks.push(fail(`${viteConfig} does not use netjes() from 'netjes/vite'`, 'Add netjes() to its plugins'));
337
564
  } else checks.push(ok(`${viteConfig} uses netjes()`));
338
565
 
566
+ const manifest = hasManifest ? await readJson(path.join(cwd, 'package.json')) : null;
567
+ checks.push(
568
+ ...(await checkPagePackages(cwd, {
569
+ manifest,
570
+ netjes: packages.netjes,
571
+ csproj: csproj ? { file: csproj, text: await readFile(path.join(cwd, csproj), 'utf8') } : null,
572
+ // A config without netjes() is flagged above already.
573
+ viteConfig: viteConfig && viteText?.includes('netjes(') ? { file: viteConfig, text: viteText } : null,
574
+ })),
575
+ );
576
+
339
577
  if (hasManifest) {
340
- const manifest = await readJson(path.join(cwd, 'package.json'));
341
578
  if (!manifest) checks.push(fail('package.json is not valid JSON', 'Fix its syntax; npm and Vite read it'));
342
579
  else if (manifest.scripts?.build) checks.push(ok('package.json has a build script (dotnet publish runs it)'));
343
580
  else {
package/cli/routes.mjs CHANGED
@@ -1,8 +1,11 @@
1
1
  // @ts-check
2
2
 
3
3
  /**
4
- * @typedef {{ pattern: string; file: string; loader: boolean; action: boolean; props: string | null; cached: boolean; authorized: boolean }} RouteRow
5
- * @typedef {{ method: string; route: string }} EndpointRow
4
+ * `package` names the page package a route or an endpoint is of, and `overrides` the package's page that the app's file
5
+ * replaces; both are null for the app's own, and absent in the report of a Netjes before page packages.
6
+ * @typedef {{ pattern: string; file: string; package?: string | null; overrides?: string | null; loader: boolean; action: boolean; props: string | null; cached: boolean; authorized: boolean }} RouteRow
7
+ * @typedef {{ method: string; route: string; package?: string | null }} EndpointRow
8
+ * @typedef {{ name: string; version: string; nuget: string; nugetVersion: string; prefix: string; pattern: string; overrides: string[] }} PackageRow
6
9
  * @typedef {{ kind: string; message: string; files: string[] }} RouteWarning
7
10
  */
8
11
 
@@ -14,18 +17,42 @@ function table(rows) {
14
17
 
15
18
  const yes = (/** @type {boolean} */ value) => (value ? 'yes' : '');
16
19
 
20
+ /** The Package column of a route: its package, marked when the app's file replaces the package's page. */
21
+ const packageOf = (/** @type {RouteRow} */ r) => (r.package ? `${r.package}${r.overrides ? ' (override)' : ''}` : '');
22
+
17
23
  /**
18
- * The route table the app reported (`NETJES_COMMAND=routes`), as text, with the app's route warnings after it.
19
- * @param {{ routes: RouteRow[]; endpoints: EndpointRow[]; warnings?: RouteWarning[] }} report
24
+ * The route table the app reported (`NETJES_COMMAND=routes`), as text, with the app's route warnings after it. The
25
+ * Package column, and the list of page packages, show only when the app mounts one.
26
+ * @param {{ routes: RouteRow[]; endpoints: EndpointRow[]; packages?: PackageRow[]; warnings?: RouteWarning[] }} report
20
27
  */
21
28
  export function formatRoutes(report) {
29
+ const packages = report.packages ?? [];
30
+ const mounted = packages.length > 0;
31
+ /** @param {string[]} cells @param {string} cell */
32
+ const withPackage = (cells, cell) => (mounted ? [...cells.slice(0, 2), cell, ...cells.slice(2)] : cells);
22
33
  const pages = table([
23
- ['Pattern', 'File', 'Loader', 'Action', 'Props', 'Cached', 'Auth'],
24
- ...report.routes.map((r) => [r.pattern, r.file, yes(r.loader), yes(r.action), r.props ?? '', yes(r.cached), yes(r.authorized)]),
34
+ withPackage(['Pattern', 'File', 'Loader', 'Action', 'Props', 'Cached', 'Auth'], 'Package'),
35
+ ...report.routes.map((r) =>
36
+ withPackage([r.pattern, r.file, yes(r.loader), yes(r.action), r.props ?? '', yes(r.cached), yes(r.authorized)], packageOf(r)),
37
+ ),
25
38
  ]);
26
39
  const endpoints = report.endpoints.length
27
- ? ['', 'Endpoints', ...table(report.endpoints.map((e) => [e.method, e.route]))]
40
+ ? ['', 'Endpoints', ...table(report.endpoints.map((e) => (mounted ? [e.method, e.route, e.package ?? ''] : [e.method, e.route])))]
41
+ : [];
42
+ const listed = mounted
43
+ ? [
44
+ '',
45
+ 'Packages',
46
+ ...table(
47
+ packages.map((p) => [
48
+ `${p.name} ${p.version}`,
49
+ `${p.nuget} ${p.nugetVersion}`,
50
+ p.prefix,
51
+ p.overrides.length ? `overrides ${p.overrides.join(', ')}` : '',
52
+ ]),
53
+ ),
54
+ ]
28
55
  : [];
29
56
  const warnings = report.warnings?.length ? ['', 'Warnings', ...report.warnings.map((w) => ` ${w.message}`)] : [];
30
- return [...pages, ...endpoints, ...warnings].join('\n') + '\n';
57
+ return [...pages, ...endpoints, ...listed, ...warnings].join('\n') + '\n';
31
58
  }
package/dist/href.d.ts CHANGED
@@ -12,6 +12,13 @@ export type Href = Register extends {
12
12
  export type SearchValue = string | number | boolean | null | undefined;
13
13
  /** A query string as an object: a value per key, or a list of values for a key that repeats. */
14
14
  export type SearchParamsInput = Record<string, SearchValue | readonly SearchValue[]>;
15
+ /**
16
+ * Whether a URL has the shape of a link, as a C# `Href` checks it: root-relative (`/…`, but not `//…` or `/\…`, which
17
+ * browsers read as another host), a link within the page (`?…`, `#…`), or an `http:`, `https:`, `mailto:` or `tel:`
18
+ * URL, with no ASCII control character and no space at either end. It does not ask which page a path names: a page
19
+ * package's generated file, which cannot know the app's pages, checks its `Href` with this.
20
+ */
21
+ export declare function isHrefShape(value: string): boolean;
15
22
  /**
16
23
  * Whether a URL is one of the app's pages (by route pattern), a link within the page (`?…`, `#…`), or another
17
24
  * site. The generated `isHref()` and `Href` schema call this to check URLs that come from data. A URL with an ASCII
@@ -1 +1 @@
1
- {"version":3,"file":"href.d.ts","sourceRoot":"","sources":["../src/href.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,QAAQ;CAAG;AAE5B,sGAAsG;AACtG,MAAM,MAAM,IAAI,GAAG,QAAQ,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC,SAAS,MAAM,CAAA;CAAE,GAAG,CAAC,GAAG,MAAM,CAAC;AAElF,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AACvE,gGAAgG;AAChG,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,WAAW,EAAE,CAAC,CAAC;AAarF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAS/E;AAYD;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,CAAC,EAAE,iBAAiB,EAC1B,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACtC,MAAM,CAwCR;AAgBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,MAAM,CAAC,EAAE,iBAAiB,EAC1B,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAsDR"}
1
+ {"version":3,"file":"href.d.ts","sourceRoot":"","sources":["../src/href.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,QAAQ;CAAG;AAE5B,sGAAsG;AACtG,MAAM,MAAM,IAAI,GAAG,QAAQ,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC,SAAS,MAAM,CAAA;CAAE,GAAG,CAAC,GAAG,MAAM,CAAC;AAElF,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AACvE,gGAAgG;AAChG,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,WAAW,EAAE,CAAC,CAAC;AAarF;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAOlD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAK/E;AAYD;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,CAAC,EAAE,iBAAiB,EAC1B,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACtC,MAAM,CAwCR;AAgBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,MAAM,CAAC,EAAE,iBAAiB,EAC1B,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAsDR"}
package/dist/href.js CHANGED
@@ -13,11 +13,12 @@ function matches(pattern, path) {
13
13
  return pattern.length === path.length;
14
14
  }
15
15
  /**
16
- * Whether a URL is one of the app's pages (by route pattern), a link within the page (`?…`, `#…`), or another
17
- * site. The generated `isHref()` and `Href` schema call this to check URLs that come from data. A URL with an ASCII
18
- * control character, or with a space at either end, is none of these.
16
+ * Whether a URL has the shape of a link, as a C# `Href` checks it: root-relative (`/…`, but not `//…` or `/\…`, which
17
+ * browsers read as another host), a link within the page (`?…`, `#…`), or an `http:`, `https:`, `mailto:` or `tel:`
18
+ * URL, with no ASCII control character and no space at either end. It does not ask which page a path names: a page
19
+ * package's generated file, which cannot know the app's pages, checks its `Href` with this.
19
20
  */
20
- export function isRouteHref(value, patterns) {
21
+ export function isHrefShape(value) {
21
22
  // Browsers drop tabs and newlines anywhere in a URL, and control characters and spaces at either end: `/\t/host`
22
23
  // would be `//host`. A C# Href refuses the same.
23
24
  if (/[\u0000-\u001F\u007F]/.test(value) || value.startsWith(' ') || value.endsWith(' '))
@@ -25,8 +26,18 @@ export function isRouteHref(value, patterns) {
25
26
  if (/^(https?:|mailto:|tel:)/i.test(value) || value.startsWith('?') || value.startsWith('#'))
26
27
  return true;
27
28
  // "//host" and "/\host" are other hosts as far as browsers are concerned.
28
- if (!value.startsWith('/') || value.startsWith('//') || value.startsWith('/\\'))
29
+ return value.startsWith('/') && !value.startsWith('//') && !value.startsWith('/\\');
30
+ }
31
+ /**
32
+ * Whether a URL is one of the app's pages (by route pattern), a link within the page (`?…`, `#…`), or another
33
+ * site. The generated `isHref()` and `Href` schema call this to check URLs that come from data. A URL with an ASCII
34
+ * control character, or with a space at either end, is none of these.
35
+ */
36
+ export function isRouteHref(value, patterns) {
37
+ if (!isHrefShape(value))
29
38
  return false;
39
+ if (!value.startsWith('/'))
40
+ return true;
30
41
  const path = (value.split(/[?#]/, 1)[0] ?? '').split('/').filter(Boolean);
31
42
  return patterns.some((pattern) => matches(pattern.split('/').filter(Boolean), path));
32
43
  }
package/dist/href.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"href.js","sourceRoot":"","sources":["../src/href.ts"],"names":[],"mappings":"AAeA,SAAS,OAAO,CAAC,OAA0B,EAAE,IAAuB;IAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACpE,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,QAA2B;IACpE,iHAAiH;IACjH,iDAAiD;IACjD,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACtG,IAAI,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1G,0EAA0E;IAC1E,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9F,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACvF,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC;AAC/D,CAAC;AAED,MAAM,qBAAqB,GAAG,0DAA0D,CAAC;AAEzF;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CACvB,OAAe,EACf,MAA+B,EAC/B,MAA0B,EAC1B,OAAuC;IAEvC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAS,EAAE;QACtC,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,0BAA0B,IAAI,GAAG,CAAC,CAAC;IAC9E,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,KAAc,EAAU,EAAE;QACtD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,kBAAkB,IAAI,wBAAwB,IAAI,MAAM,qBAAqB,EAAE,CAAC,CAAC;QAC5H,CAAC;QACD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO;SACrB,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC;SACf,OAAO,CAAC,CAAC,OAAO,EAAY,EAAE;QAC7B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,CAAC;QACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5E,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;gBAAE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;YAClF,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEL,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5B,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC9H,CAAC;AAED,0GAA0G;AAC1G,SAAS,YAAY,CAAC,KAAsB,EAAE,MAAqD;IACjG,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAA4B,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAClF,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;gBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;AACH,CAAC;AAED,0DAA0D;AAC1D,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;AAC/D,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,MAAyC,EACzC,MAA0B,EAC1B,QAAiB;IAEjB,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,qBAAqB,QAAQ,IAAI,QAAQ,4BAA4B,IAAI,GAAG,CAAC,CAAC;IACxH,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,KAAc,EAAE,EAAE,CAClD,IAAI,KAAK,CAAC,qBAAqB,QAAQ,IAAI,QAAQ,kBAAkB,MAAM,CAAC,KAAK,CAAC,0BAA0B,IAAI,MAAM,qBAAqB,EAAE,CAAC,CAAC;IACjJ,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,wGAAwG;IACxG,MAAM,QAAQ,GAAoD,EAAE,CAAC;IACrE,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,OAA2B,CAAC;QAChC,iFAAiF;QACjF,IAAI,MAA0B,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAChE,MAAM,SAAS,GAAG,sCAAsC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,IAAI,IAAI,CAAC;gBACb,SAAS;YACX,CAAC;YAED,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC;YACxD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACpC,6EAA6E;gBAC7E,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;oBAAE,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC7H,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrE,CAAC;iBAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,IAAI,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC1C,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;iBAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAClC,IAAI,IAAI,QAAQ,CAAC;gBACjB,IAAI,IAAI,KAAK,OAAO;oBAAE,OAAO,GAAG,IAAI,CAAC;YACvC,CAAC;iBAAM,IAAI,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;gBAClC,+DAA+D;gBAC/D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACjD,IAAI,CAAC,IAAI;oBAAE,OAAO,GAAG,IAAI,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,IAAI,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC;YAAE,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7E,IAAI,IAAI,IAAI,OAAO;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO;QAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;IAChD,+GAA+G;IAC/G,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACnE,IAAI,OAAO;QAAE,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5B,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IACrC,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC5F,CAAC"}
1
+ {"version":3,"file":"href.js","sourceRoot":"","sources":["../src/href.ts"],"names":[],"mappings":"AAeA,SAAS,OAAO,CAAC,OAA0B,EAAE,IAAuB;IAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACpE,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,iHAAiH;IACjH,iDAAiD;IACjD,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACtG,IAAI,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1G,0EAA0E;IAC1E,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACtF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,QAA2B;IACpE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACvF,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC;AAC/D,CAAC;AAED,MAAM,qBAAqB,GAAG,0DAA0D,CAAC;AAEzF;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CACvB,OAAe,EACf,MAA+B,EAC/B,MAA0B,EAC1B,OAAuC;IAEvC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAS,EAAE;QACtC,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,0BAA0B,IAAI,GAAG,CAAC,CAAC;IAC9E,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,KAAc,EAAU,EAAE;QACtD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,kBAAkB,IAAI,wBAAwB,IAAI,MAAM,qBAAqB,EAAE,CAAC,CAAC;QAC5H,CAAC;QACD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO;SACrB,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC;SACf,OAAO,CAAC,CAAC,OAAO,EAAY,EAAE;QAC7B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,CAAC;QACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5E,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;gBAAE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;YAClF,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEL,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5B,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC9H,CAAC;AAED,0GAA0G;AAC1G,SAAS,YAAY,CAAC,KAAsB,EAAE,MAAqD;IACjG,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAA4B,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAClF,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;gBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;AACH,CAAC;AAED,0DAA0D;AAC1D,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;AAC/D,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,MAAyC,EACzC,MAA0B,EAC1B,QAAiB;IAEjB,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,qBAAqB,QAAQ,IAAI,QAAQ,4BAA4B,IAAI,GAAG,CAAC,CAAC;IACxH,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,KAAc,EAAE,EAAE,CAClD,IAAI,KAAK,CAAC,qBAAqB,QAAQ,IAAI,QAAQ,kBAAkB,MAAM,CAAC,KAAK,CAAC,0BAA0B,IAAI,MAAM,qBAAqB,EAAE,CAAC,CAAC;IACjJ,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,wGAAwG;IACxG,MAAM,QAAQ,GAAoD,EAAE,CAAC;IACrE,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,OAA2B,CAAC;QAChC,iFAAiF;QACjF,IAAI,MAA0B,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAChE,MAAM,SAAS,GAAG,sCAAsC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,IAAI,IAAI,CAAC;gBACb,SAAS;YACX,CAAC;YAED,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC;YACxD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACpC,6EAA6E;gBAC7E,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;oBAAE,MAAM,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC7H,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrE,CAAC;iBAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,IAAI,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC1C,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;iBAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAClC,IAAI,IAAI,QAAQ,CAAC;gBACjB,IAAI,IAAI,KAAK,OAAO;oBAAE,OAAO,GAAG,IAAI,CAAC;YACvC,CAAC;iBAAM,IAAI,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;gBAClC,+DAA+D;gBAC/D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACjD,IAAI,CAAC,IAAI;oBAAE,OAAO,GAAG,IAAI,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,IAAI,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC;YAAE,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7E,IAAI,IAAI,IAAI,OAAO;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO;QAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;IAChD,+GAA+G;IAC/G,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACnE,IAAI,OAAO;QAAE,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IAElC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5B,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IACrC,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC5F,CAAC"}
package/dist/index.d.ts CHANGED
@@ -4,11 +4,12 @@ export { CSP_SCRIPT_HASHES } from './deferred.ts';
4
4
  export { useDraftMode } from './draft-mode.ts';
5
5
  export { type DynamicOptions, clientOnly, dynamic } from './dynamic.tsx';
6
6
  export { Form, type FormAction, type FormProps, SubmitButton, type SubmitButtonProps } from './form.tsx';
7
- export { type Href, type Register, type SearchParamsInput, type SearchValue, buildEndpointUrl, buildHref, isRouteHref } from './href.ts';
7
+ export { type Href, type Register, type SearchParamsInput, type SearchValue, buildEndpointUrl, buildHref, isHrefShape, isRouteHref, } from './href.ts';
8
8
  export { Image, type ImageProps } from './image.tsx';
9
9
  export { Link, type LinkProps } from './link.tsx';
10
10
  export { useLocale } from './locale.ts';
11
11
  export type { ErrorPageProps, LayoutProps } from './modules.ts';
12
+ export { type Mounted, type MountedFormProps, type MountedLinkProps, type MountedRouter, type MountedSubmitButtonProps, mounted, } from './mounted.tsx';
12
13
  export { useNonce } from './nonce.tsx';
13
14
  export type { PageKind, Params, SeededQuery, SegmentRef } from './payload.ts';
14
15
  export { usePublicConfig } from './public-config.tsx';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,YAAY,EACZ,SAAS,EACT,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,KAAK,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACzG,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,KAAK,iBAAiB,EAAE,KAAK,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACzI,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,WAAW,EACX,OAAO,EACP,aAAa,EACb,SAAS,EACT,WAAW,EACX,SAAS,EACT,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,YAAY,EACZ,SAAS,EACT,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,KAAK,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACzG,OAAO,EACL,KAAK,IAAI,EACT,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,WAAW,GACZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,OAAO,GACR,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,WAAW,EACX,OAAO,EACP,aAAa,EACb,SAAS,EACT,WAAW,EACX,SAAS,EACT,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -4,10 +4,11 @@ export { CSP_SCRIPT_HASHES } from './deferred.js';
4
4
  export { useDraftMode } from './draft-mode.js';
5
5
  export { clientOnly, dynamic } from './dynamic.js';
6
6
  export { Form, SubmitButton } from './form.js';
7
- export { buildEndpointUrl, buildHref, isRouteHref } from './href.js';
7
+ export { buildEndpointUrl, buildHref, isHrefShape, isRouteHref, } from './href.js';
8
8
  export { Image } from './image.js';
9
9
  export { Link } from './link.js';
10
10
  export { useLocale } from './locale.js';
11
+ export { mounted, } from './mounted.js';
11
12
  export { useNonce } from './nonce.js';
12
13
  export { usePublicConfig } from './public-config.js';
13
14
  export { Script } from './script.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,iBAAiB,EAEjB,YAAY,EACZ,SAAS,EACT,kBAAkB,GACnB,MAAM,cAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAmB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAuB,UAAU,EAAE,OAAO,EAAE,MAAM,cAAe,CAAC;AACzE,OAAO,EAAE,IAAI,EAAmC,YAAY,EAA0B,MAAM,WAAY,CAAC;AACzG,OAAO,EAAsE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACzI,OAAO,EAAE,KAAK,EAAmB,MAAM,YAAa,CAAC;AACrD,OAAO,EAAE,IAAI,EAAkB,MAAM,WAAY,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAa,CAAC;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAqB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAyC,MAAM,aAAc,CAAC;AAC7E,OAAO,EAIL,WAAW,EACX,OAAO,EACP,aAAa,EACb,SAAS,EACT,WAAW,EACX,SAAS,EACT,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,cAAc,GACf,MAAM,aAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,iBAAiB,EAEjB,YAAY,EACZ,SAAS,EACT,kBAAkB,GACnB,MAAM,cAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAmB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAuB,UAAU,EAAE,OAAO,EAAE,MAAM,cAAe,CAAC;AACzE,OAAO,EAAE,IAAI,EAAmC,YAAY,EAA0B,MAAM,WAAY,CAAC;AACzG,OAAO,EAKL,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,WAAW,GACZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,KAAK,EAAmB,MAAM,YAAa,CAAC;AACrD,OAAO,EAAE,IAAI,EAAkB,MAAM,WAAY,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAML,OAAO,GACR,MAAM,cAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAa,CAAC;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAqB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAyC,MAAM,aAAc,CAAC;AAC7E,OAAO,EAIL,WAAW,EACX,OAAO,EACP,aAAa,EACb,SAAS,EACT,WAAW,EACX,SAAS,EACT,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,cAAc,GACf,MAAM,aAAc,CAAC"}