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 +10 -8
- package/cli/info.mjs +268 -31
- package/cli/routes.mjs +35 -8
- package/dist/href.d.ts +7 -0
- package/dist/href.d.ts.map +1 -1
- package/dist/href.js +16 -5
- package/dist/href.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/mounted.d.ts +55 -0
- package/dist/mounted.d.ts.map +1 -0
- package/dist/mounted.js +110 -0
- package/dist/mounted.js.map +1 -0
- package/dist/payload.d.ts +8 -0
- package/dist/payload.d.ts.map +1 -1
- package/dist/payload.js +28 -0
- package/dist/payload.js.map +1 -1
- package/dist/render-document.d.ts +18 -4
- package/dist/render-document.d.ts.map +1 -1
- package/dist/render-document.js +79 -16
- package/dist/render-document.js.map +1 -1
- package/dist/testing.d.ts +6 -0
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +1 -0
- package/dist/testing.js.map +1 -1
- package/package.json +1 -1
- package/sidecar/server.mjs +37 -10
- package/skills/netjes/SKILL.md +4 -3
- package/skills/netjes/references/data-and-actions.md +6 -2
- package/skills/netjes/references/routing.md +14 -3
- package/src/href.ts +16 -5
- package/src/index.ts +18 -1
- package/src/mounted.tsx +160 -0
- package/src/payload.ts +32 -0
- package/src/render-document.tsx +117 -20
- package/src/testing.tsx +7 -0
- package/src/virtual.d.ts +6 -1
- package/template/_AGENTS.md +4 -3
- package/vite/packages.mjs +345 -0
- package/vite/plugin.d.ts +7 -0
- package/vite/plugin.mjs +208 -30
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.
|
|
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.
|
|
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.
|
|
50
|
-
- [All guides](https://github.com/DennisVerhoeven/netjes/blob/v0.0.
|
|
51
|
-
- [React API](https://github.com/DennisVerhoeven/netjes/blob/v0.0.
|
|
52
|
-
- [Vite plugin](https://github.com/DennisVerhoeven/netjes/blob/v0.0.
|
|
53
|
-
- [The netjes command](https://github.com/DennisVerhoeven/netjes/blob/v0.0.
|
|
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
|
-
*
|
|
62
|
-
*
|
|
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 =
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
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
|
|
257
|
-
if (!
|
|
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 =
|
|
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 (!
|
|
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
|
-
*
|
|
5
|
-
*
|
|
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
|
-
*
|
|
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) =>
|
|
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
|
package/dist/href.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
17
|
-
*
|
|
18
|
-
* control character
|
|
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
|
|
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
|
-
|
|
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
|
|
1
|
+
{"version":3,"file":"href.js","sourceRoot":"","sources":["../src/href.ts"],"names":[],"mappings":"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"}
|
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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,
|
|
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"}
|