@nextwebwg/html-next 1.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +26 -0
- package/dist/ast.d.ts +7 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +2 -0
- package/dist/ast.js.map +1 -0
- package/dist/browser-loader.bundle.js +9 -0
- package/dist/browser-loader.d.ts +35 -0
- package/dist/browser-loader.d.ts.map +1 -0
- package/dist/browser-loader.js +83 -0
- package/dist/browser-loader.js.map +1 -0
- package/dist/browser-source.d.ts +10 -0
- package/dist/browser-source.d.ts.map +1 -0
- package/dist/browser-source.js +97 -0
- package/dist/browser-source.js.map +1 -0
- package/dist/browser.d.ts +5 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +9 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +31 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +138 -0
- package/dist/cli.js.map +1 -0
- package/dist/component-styles-build.d.ts +11 -0
- package/dist/component-styles-build.d.ts.map +1 -0
- package/dist/component-styles-build.js +74 -0
- package/dist/component-styles-build.js.map +1 -0
- package/dist/component-styles.d.ts +37 -0
- package/dist/component-styles.d.ts.map +1 -0
- package/dist/component-styles.js +236 -0
- package/dist/component-styles.js.map +1 -0
- package/dist/contract-platform.d.ts +5 -0
- package/dist/contract-platform.d.ts.map +1 -0
- package/dist/contract-platform.js +8 -0
- package/dist/contract-platform.js.map +1 -0
- package/dist/contract.d.ts +14 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +234 -0
- package/dist/contract.js.map +1 -0
- package/dist/controller-files.d.ts +10 -0
- package/dist/controller-files.d.ts.map +1 -0
- package/dist/controller-files.js +54 -0
- package/dist/controller-files.js.map +1 -0
- package/dist/controller.d.ts +15 -0
- package/dist/controller.d.ts.map +1 -0
- package/dist/controller.js +33 -0
- package/dist/controller.js.map +1 -0
- package/dist/data.d.ts +28 -0
- package/dist/data.d.ts.map +1 -0
- package/dist/data.js +100 -0
- package/dist/data.js.map +1 -0
- package/dist/diagnostics.d.ts +11 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +13 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/expression.d.ts +80 -0
- package/dist/expression.d.ts.map +1 -0
- package/dist/expression.js +474 -0
- package/dist/expression.js.map +1 -0
- package/dist/freeze.d.ts +2 -0
- package/dist/freeze.d.ts.map +1 -0
- package/dist/freeze.js +8 -0
- package/dist/freeze.js.map +1 -0
- package/dist/generate.d.ts +11 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +41 -0
- package/dist/generate.js.map +1 -0
- package/dist/generated/dom-properties.d.ts +8 -0
- package/dist/generated/dom-properties.d.ts.map +1 -0
- package/dist/generated/dom-properties.js +1410 -0
- package/dist/generated/dom-properties.js.map +1 -0
- package/dist/generated-runtime.d.ts +42 -0
- package/dist/generated-runtime.d.ts.map +1 -0
- package/dist/generated-runtime.js +266 -0
- package/dist/generated-runtime.js.map +1 -0
- package/dist/graph.d.ts +37 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +81 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/language.d.ts +7 -0
- package/dist/language.d.ts.map +1 -0
- package/dist/language.js +43 -0
- package/dist/language.js.map +1 -0
- package/dist/names.d.ts +4 -0
- package/dist/names.d.ts.map +1 -0
- package/dist/names.js +19 -0
- package/dist/names.js.map +1 -0
- package/dist/node-loader.d.ts +22 -0
- package/dist/node-loader.d.ts.map +1 -0
- package/dist/node-loader.js +109 -0
- package/dist/node-loader.js.map +1 -0
- package/dist/package-config.d.ts +22 -0
- package/dist/package-config.d.ts.map +1 -0
- package/dist/package-config.js +2 -0
- package/dist/package-config.js.map +1 -0
- package/dist/package.d.ts +9 -0
- package/dist/package.d.ts.map +1 -0
- package/dist/package.js +208 -0
- package/dist/package.js.map +1 -0
- package/dist/parser.d.ts +11 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +938 -0
- package/dist/parser.js.map +1 -0
- package/dist/platform.d.ts +3 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +26 -0
- package/dist/platform.js.map +1 -0
- package/dist/reactivity.d.ts +88 -0
- package/dist/reactivity.d.ts.map +1 -0
- package/dist/reactivity.js +594 -0
- package/dist/reactivity.js.map +1 -0
- package/dist/registry.d.ts +14 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +39 -0
- package/dist/registry.js.map +1 -0
- package/dist/resolve.d.ts +24 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +65 -0
- package/dist/resolve.js.map +1 -0
- package/dist/runtime.d.ts +110 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1926 -0
- package/dist/runtime.js.map +1 -0
- package/dist/sanitize.d.ts +8 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +38 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/source-graph.d.ts +5 -0
- package/dist/source-graph.d.ts.map +1 -0
- package/dist/source-graph.js +60 -0
- package/dist/source-graph.js.map +1 -0
- package/dist/source-parser.d.ts +4 -0
- package/dist/source-parser.d.ts.map +1 -0
- package/dist/source-parser.js +38 -0
- package/dist/source-parser.js.map +1 -0
- package/dist/source.d.ts +4 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +6 -0
- package/dist/source.js.map +1 -0
- package/dist/targets/backend.d.ts +28 -0
- package/dist/targets/backend.d.ts.map +1 -0
- package/dist/targets/backend.js +42 -0
- package/dist/targets/backend.js.map +1 -0
- package/dist/targets/docs.d.ts +3 -0
- package/dist/targets/docs.d.ts.map +1 -0
- package/dist/targets/docs.js +85 -0
- package/dist/targets/docs.js.map +1 -0
- package/dist/targets/native-reactive.d.ts +41 -0
- package/dist/targets/native-reactive.d.ts.map +1 -0
- package/dist/targets/native-reactive.js +169 -0
- package/dist/targets/native-reactive.js.map +1 -0
- package/dist/targets/shared.d.ts +15 -0
- package/dist/targets/shared.d.ts.map +1 -0
- package/dist/targets/shared.js +122 -0
- package/dist/targets/shared.js.map +1 -0
- package/dist/targets/vanilla.d.ts +6 -0
- package/dist/targets/vanilla.d.ts.map +1 -0
- package/dist/targets/vanilla.js +442 -0
- package/dist/targets/vanilla.js.map +1 -0
- package/dist/targets/vue.d.ts +3 -0
- package/dist/targets/vue.d.ts.map +1 -0
- package/dist/targets/vue.js +577 -0
- package/dist/targets/vue.js.map +1 -0
- package/dist/template.d.ts +172 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +2 -0
- package/dist/template.js.map +1 -0
- package/dist/type-system.d.ts +80 -0
- package/dist/type-system.d.ts.map +1 -0
- package/dist/type-system.js +414 -0
- package/dist/type-system.js.map +1 -0
- package/dist/types.d.ts +51 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +38 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +297 -0
- package/dist/validate.js.map +1 -0
- package/dist/validation.d.ts +6 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +6 -0
- package/dist/validation.js.map +1 -0
- package/dist/validity-css.d.ts +6 -0
- package/dist/validity-css.d.ts.map +1 -0
- package/dist/validity-css.js +11 -0
- package/dist/validity-css.js.map +1 -0
- package/dist/validity.d.ts +45 -0
- package/dist/validity.d.ts.map +1 -0
- package/dist/validity.js +445 -0
- package/dist/validity.js.map +1 -0
- package/package.json +124 -0
package/dist/validate.js
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { normalizeType, parseTypedValue, parseTypeExpression, } from "./type-system.js";
|
|
2
|
+
/** Native ValidityState field for each normalized issue. */
|
|
3
|
+
export const NATIVE_FLAG = {
|
|
4
|
+
valueMissing: "valueMissing",
|
|
5
|
+
typeMismatch: "typeMismatch",
|
|
6
|
+
patternMismatch: "patternMismatch",
|
|
7
|
+
tooLong: "tooLong",
|
|
8
|
+
tooShort: "tooShort",
|
|
9
|
+
rangeUnderflow: "rangeUnderflow",
|
|
10
|
+
rangeOverflow: "rangeOverflow",
|
|
11
|
+
stepMismatch: "stepMismatch",
|
|
12
|
+
badInput: "badInput",
|
|
13
|
+
customError: "customError",
|
|
14
|
+
schemaMismatch: "schemaMismatch",
|
|
15
|
+
untrustedValue: "untrustedValue",
|
|
16
|
+
};
|
|
17
|
+
const VALID = { valid: true, errors: [] };
|
|
18
|
+
const EPSILON = 1e-9;
|
|
19
|
+
const FORMAT_TYPES = [
|
|
20
|
+
"email", "url", "date", "time", "datetime-local", "month", "week", "color",
|
|
21
|
+
"token", "ident", "url-value", "token-list",
|
|
22
|
+
];
|
|
23
|
+
function isEmpty(value, multiple = false) {
|
|
24
|
+
return value === undefined || value === null || value === "" ||
|
|
25
|
+
(multiple && Array.isArray(value) && value.length === 0);
|
|
26
|
+
}
|
|
27
|
+
function isFormatType(type) {
|
|
28
|
+
return FORMAT_TYPES.includes(type);
|
|
29
|
+
}
|
|
30
|
+
function resolveType(type) {
|
|
31
|
+
if (type === undefined)
|
|
32
|
+
return undefined;
|
|
33
|
+
if (isFormatType(type))
|
|
34
|
+
return type;
|
|
35
|
+
if (typeof type !== "string" || ["string", "boolean", "number"].includes(type)) {
|
|
36
|
+
return type;
|
|
37
|
+
}
|
|
38
|
+
return parseTypeExpression(type);
|
|
39
|
+
}
|
|
40
|
+
function terminalName(type) {
|
|
41
|
+
if (type === undefined)
|
|
42
|
+
return undefined;
|
|
43
|
+
if (isFormatType(type))
|
|
44
|
+
return type;
|
|
45
|
+
const normalized = normalizeType(type);
|
|
46
|
+
return normalized.kind === "terminal" ? normalized.name : undefined;
|
|
47
|
+
}
|
|
48
|
+
function typeErrors(issues, type) {
|
|
49
|
+
return issues.map((item) => ({
|
|
50
|
+
reason: item.reason === "untrustedValue"
|
|
51
|
+
? item.reason
|
|
52
|
+
: item.reason === "badInput" && !["email", "url"].includes(type ?? "")
|
|
53
|
+
? "badInput"
|
|
54
|
+
: "typeMismatch",
|
|
55
|
+
message: item.message,
|
|
56
|
+
path: item.path,
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
function comparable(value, type) {
|
|
60
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
61
|
+
return value;
|
|
62
|
+
if (typeof value !== "string")
|
|
63
|
+
return undefined;
|
|
64
|
+
switch (type) {
|
|
65
|
+
case "number":
|
|
66
|
+
case "integer": {
|
|
67
|
+
const number = Number(value);
|
|
68
|
+
return Number.isFinite(number) ? number : undefined;
|
|
69
|
+
}
|
|
70
|
+
case "date": {
|
|
71
|
+
const ms = Date.parse(`${value}T00:00:00Z`);
|
|
72
|
+
return Number.isFinite(ms) ? ms / 86_400_000 : undefined;
|
|
73
|
+
}
|
|
74
|
+
case "datetime-local": {
|
|
75
|
+
const ms = Date.parse(`${value}Z`);
|
|
76
|
+
return Number.isFinite(ms) ? ms / 1000 : undefined;
|
|
77
|
+
}
|
|
78
|
+
case "time": {
|
|
79
|
+
const match = /^(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d+))?)?$/.exec(value);
|
|
80
|
+
return match === null ? undefined :
|
|
81
|
+
Number(match[1]) * 3600 + Number(match[2]) * 60 + Number(match[3] ?? 0) + Number(`0.${match[4] ?? 0}`);
|
|
82
|
+
}
|
|
83
|
+
case "month": {
|
|
84
|
+
const match = /^(\d+)-(\d{2})$/.exec(value);
|
|
85
|
+
return match === null ? undefined : Number(match[1]) * 12 + Number(match[2]) - 1;
|
|
86
|
+
}
|
|
87
|
+
case "week": {
|
|
88
|
+
const match = /^(\d+)-W(\d{2})$/.exec(value);
|
|
89
|
+
return match === null ? undefined : Number(match[1]) * 53 + Number(match[2]) - 1;
|
|
90
|
+
}
|
|
91
|
+
default: return undefined;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function parsedComparable(bound, type) {
|
|
95
|
+
return bound === undefined ? undefined : comparable(bound, type);
|
|
96
|
+
}
|
|
97
|
+
function validDate(value) {
|
|
98
|
+
const match = /^(\d{4,})-(\d{2})-(\d{2})$/.exec(value);
|
|
99
|
+
if (match === null || match[1] === "0000")
|
|
100
|
+
return false;
|
|
101
|
+
const year = Number(match[1]);
|
|
102
|
+
const month = Number(match[2]);
|
|
103
|
+
const day = Number(match[3]);
|
|
104
|
+
const date = new Date(Date.UTC(year, month - 1, day));
|
|
105
|
+
return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day;
|
|
106
|
+
}
|
|
107
|
+
function validTime(value) {
|
|
108
|
+
const match = /^(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{1,3}))?)?$/.exec(value);
|
|
109
|
+
return match !== null && Number(match[1]) < 24 && Number(match[2]) < 60 && Number(match[3] ?? 0) < 60;
|
|
110
|
+
}
|
|
111
|
+
function formatValue(value, type, path = "$") {
|
|
112
|
+
const mismatch = (message) => ({
|
|
113
|
+
ok: false,
|
|
114
|
+
issues: [{ reason: "typeMismatch", message, path }],
|
|
115
|
+
});
|
|
116
|
+
if (type === "email") {
|
|
117
|
+
if (typeof value !== "string" || value.length > 254 || /\s/.test(value)) {
|
|
118
|
+
return mismatch("Must be a valid email address.");
|
|
119
|
+
}
|
|
120
|
+
const match = /^([A-Za-z0-9.!#$%&'*+/=?^_`{|}~-]+)@([A-Za-z0-9.-]+)$/.exec(value);
|
|
121
|
+
if (match === null || match[1].length > 64 || !match[2].split(".").every((label) => label !== "" && label.length <= 63 && !label.startsWith("-") && !label.endsWith("-"))) {
|
|
122
|
+
return mismatch("Must be a valid email address.");
|
|
123
|
+
}
|
|
124
|
+
return { ok: true, value };
|
|
125
|
+
}
|
|
126
|
+
if (type === "url") {
|
|
127
|
+
if (typeof value !== "string")
|
|
128
|
+
return mismatch("Must be a URL.");
|
|
129
|
+
try {
|
|
130
|
+
return { ok: true, value: new URL(value).href };
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return mismatch("Must be a valid absolute URL.");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (type === "date")
|
|
137
|
+
return typeof value === "string" && validDate(value)
|
|
138
|
+
? { ok: true, value } : mismatch("Must be a valid date (YYYY-MM-DD).");
|
|
139
|
+
if (type === "time")
|
|
140
|
+
return typeof value === "string" && validTime(value)
|
|
141
|
+
? { ok: true, value } : mismatch("Must be a valid time.");
|
|
142
|
+
if (type === "datetime-local") {
|
|
143
|
+
if (typeof value !== "string")
|
|
144
|
+
return mismatch("Must be a local date and time.");
|
|
145
|
+
const parts = value.split("T");
|
|
146
|
+
return parts.length === 2 && validDate(parts[0]) && validTime(parts[1])
|
|
147
|
+
? { ok: true, value }
|
|
148
|
+
: mismatch("Must be a valid local date and time.");
|
|
149
|
+
}
|
|
150
|
+
if (type === "month")
|
|
151
|
+
return typeof value === "string" && /^(?!0000)\d{4,}-(?:0[1-9]|1[0-2])$/.test(value)
|
|
152
|
+
? { ok: true, value } : mismatch("Must be a valid month.");
|
|
153
|
+
if (type === "week") {
|
|
154
|
+
const match = typeof value === "string" ? /^(\d{4,})-W(\d{2})$/.exec(value) : null;
|
|
155
|
+
const year = Number(match?.[1]);
|
|
156
|
+
const week = Number(match?.[2]);
|
|
157
|
+
const jan1 = new Date(Date.UTC(year, 0, 1)).getUTCDay();
|
|
158
|
+
return match !== null && match[1] !== "0000" && week >= 1 && week <= 53 &&
|
|
159
|
+
(week < 53 || jan1 === 4 || (jan1 === 3 && new Date(Date.UTC(year, 1, 29)).getUTCDate() === 29))
|
|
160
|
+
? { ok: true, value }
|
|
161
|
+
: mismatch("Must be a valid ISO week.");
|
|
162
|
+
}
|
|
163
|
+
if (type === "color")
|
|
164
|
+
return typeof value === "string" && /^#[0-9a-fA-F]{6}$/.test(value)
|
|
165
|
+
? { ok: true, value: value.toLowerCase() } : mismatch("Must be a six-digit sRGB color.");
|
|
166
|
+
if (type === "token")
|
|
167
|
+
return typeof value === "string" && value !== "" && !/[\t\n\f\r ]/.test(value)
|
|
168
|
+
? { ok: true, value } : mismatch("Must be one non-empty HTML token.");
|
|
169
|
+
if (type === "ident") {
|
|
170
|
+
// Non-ASCII code points are valid identifier characters in this conservative projection.
|
|
171
|
+
// oxlint-disable-next-line eslint/no-control-regex
|
|
172
|
+
return typeof value === "string" && /^-?(?:-?[A-Za-z_]|[^\0-\x7f])(?:[A-Za-z0-9_-]|[^\0-\x7f])*$/.test(value) && !/^--$/.test(value)
|
|
173
|
+
? { ok: true, value } : mismatch("Must be an identifier.");
|
|
174
|
+
}
|
|
175
|
+
if (type === "url-value") {
|
|
176
|
+
// URL values reject all ASCII control characters.
|
|
177
|
+
// oxlint-disable-next-line eslint/no-control-regex
|
|
178
|
+
return typeof value === "string" && value.trim() !== "" && !/[\u0000-\u001f\u007f]/.test(value)
|
|
179
|
+
? { ok: true, value } : mismatch("Must be a URL value.");
|
|
180
|
+
}
|
|
181
|
+
const tokens = Array.isArray(value) ? value : typeof value === "string"
|
|
182
|
+
? value.trim().split(/\s+/).filter(Boolean)
|
|
183
|
+
: undefined;
|
|
184
|
+
return tokens !== undefined && tokens.every((token) => typeof token === "string" && token !== "" && !/\s/.test(token))
|
|
185
|
+
? { ok: true, value: tokens }
|
|
186
|
+
: mismatch("Must be a space-separated token list.");
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Validate a value against HTML Next types and HTML constraints. Empty optional values stop
|
|
190
|
+
* after requiredness, matching the Constraint Validation API. All other applicable failures
|
|
191
|
+
* are returned rather than hiding later failures behind the first message.
|
|
192
|
+
*/
|
|
193
|
+
export function validate(value, constraint = {}) {
|
|
194
|
+
if (isEmpty(value, constraint.multiple)) {
|
|
195
|
+
return constraint.required
|
|
196
|
+
? { valid: false, errors: [{ reason: "valueMissing", message: "This field is required." }] }
|
|
197
|
+
: VALID;
|
|
198
|
+
}
|
|
199
|
+
const errors = [];
|
|
200
|
+
const type = resolveType(constraint.type);
|
|
201
|
+
const terminal = terminalName(type);
|
|
202
|
+
let parsedValue = value;
|
|
203
|
+
if (terminal === "email" && constraint.multiple && typeof value === "string") {
|
|
204
|
+
const addresses = value.split(",").map((address) => address.trim());
|
|
205
|
+
const failures = addresses.flatMap((address, index) => {
|
|
206
|
+
const result = formatValue(address, "email", `$[${index}]`);
|
|
207
|
+
return result.ok ? [] : typeErrors(result.issues, terminal);
|
|
208
|
+
});
|
|
209
|
+
errors.push(...failures);
|
|
210
|
+
if (failures.length === 0)
|
|
211
|
+
parsedValue = addresses;
|
|
212
|
+
}
|
|
213
|
+
else if (type !== undefined) {
|
|
214
|
+
const result = isFormatType(type) ? formatValue(value, type) : parseTypedValue(value, type);
|
|
215
|
+
if (result.ok)
|
|
216
|
+
parsedValue = result.value;
|
|
217
|
+
else
|
|
218
|
+
errors.push(...typeErrors(result.issues, terminal));
|
|
219
|
+
}
|
|
220
|
+
const numeric = comparable(parsedValue, terminal);
|
|
221
|
+
const minimum = parsedComparable(constraint.min, terminal);
|
|
222
|
+
const maximum = parsedComparable(constraint.max, terminal);
|
|
223
|
+
if (numeric !== undefined) {
|
|
224
|
+
if (minimum !== undefined && numeric < minimum) {
|
|
225
|
+
errors.push({ reason: "rangeUnderflow", message: `Value must be at least ${constraint.min}.` });
|
|
226
|
+
}
|
|
227
|
+
if (maximum !== undefined && numeric > maximum) {
|
|
228
|
+
errors.push({ reason: "rangeOverflow", message: `Value must be at most ${constraint.max}.` });
|
|
229
|
+
}
|
|
230
|
+
if (constraint.step !== undefined && constraint.step !== "any" && constraint.step > 0) {
|
|
231
|
+
const base = minimum ?? 0;
|
|
232
|
+
const offset = Math.abs(numeric - base) % constraint.step;
|
|
233
|
+
if (offset > EPSILON && Math.abs(offset - constraint.step) > EPSILON) {
|
|
234
|
+
errors.push({ reason: "stepMismatch", message: `Value must align to a step of ${constraint.step}.` });
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (typeof value === "string") {
|
|
239
|
+
if (constraint.minLength !== undefined && value.length < constraint.minLength) {
|
|
240
|
+
errors.push({ reason: "tooShort", message: `Use at least ${constraint.minLength} characters.` });
|
|
241
|
+
}
|
|
242
|
+
if (constraint.maxLength !== undefined && value.length > constraint.maxLength) {
|
|
243
|
+
errors.push({ reason: "tooLong", message: `Use no more than ${constraint.maxLength} characters.` });
|
|
244
|
+
}
|
|
245
|
+
if (constraint.pattern !== undefined) {
|
|
246
|
+
let expression;
|
|
247
|
+
try {
|
|
248
|
+
expression = new RegExp(`^(?:${constraint.pattern})$`, "v");
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
try {
|
|
252
|
+
expression = new RegExp(`^(?:${constraint.pattern})$`, "u");
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
expression = undefined;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (expression !== undefined && !expression.test(value)) {
|
|
259
|
+
errors.push({ reason: "patternMismatch", message: "Value does not match the required format." });
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return errors.length === 0 ? VALID : { valid: false, errors };
|
|
264
|
+
}
|
|
265
|
+
const NATIVE_REASONS = [
|
|
266
|
+
"valueMissing", "typeMismatch", "patternMismatch", "tooLong", "tooShort",
|
|
267
|
+
"rangeUnderflow", "rangeOverflow", "stepMismatch", "badInput", "customError",
|
|
268
|
+
];
|
|
269
|
+
/** Read the browser's authoritative constraint result without replacing native algorithms. */
|
|
270
|
+
export function validityFromNative(state, validationMessage) {
|
|
271
|
+
if (state.valid)
|
|
272
|
+
return VALID;
|
|
273
|
+
const errors = NATIVE_REASONS
|
|
274
|
+
.filter((reason) => state[reason])
|
|
275
|
+
.map((reason) => ({ reason, message: validationMessage || nativeMessage(reason) }));
|
|
276
|
+
return errors.length === 0
|
|
277
|
+
? { valid: false, errors: [{ reason: "badInput", message: validationMessage || "The value is invalid." }] }
|
|
278
|
+
: { valid: false, errors };
|
|
279
|
+
}
|
|
280
|
+
function nativeMessage(reason) {
|
|
281
|
+
const messages = {
|
|
282
|
+
valueMissing: "This field is required.",
|
|
283
|
+
typeMismatch: "Enter a value in the required format.",
|
|
284
|
+
patternMismatch: "Value does not match the required format.",
|
|
285
|
+
tooLong: "The value is too long.",
|
|
286
|
+
tooShort: "The value is too short.",
|
|
287
|
+
rangeUnderflow: "The value is below the allowed range.",
|
|
288
|
+
rangeOverflow: "The value is above the allowed range.",
|
|
289
|
+
stepMismatch: "The value does not align to the required step.",
|
|
290
|
+
badInput: "The browser could not parse this value.",
|
|
291
|
+
customError: "The application marked this value invalid.",
|
|
292
|
+
schemaMismatch: "The value does not match its schema.",
|
|
293
|
+
untrustedValue: "The value did not cross an approved trust boundary.",
|
|
294
|
+
};
|
|
295
|
+
return messages[reason];
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Stable validation subpath: pure types/validation plus the optional DOM compatibility layer. */
|
|
2
|
+
export * from "./type-system.js";
|
|
3
|
+
export * from "./validate.js";
|
|
4
|
+
export * from "./validity.js";
|
|
5
|
+
export * from "./validity-css.js";
|
|
6
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Stable validation subpath: pure types/validation plus the optional DOM compatibility layer. */
|
|
2
|
+
export * from "./type-system.js";
|
|
3
|
+
export * from "./validate.js";
|
|
4
|
+
export * from "./validity.js";
|
|
5
|
+
export * from "./validity-css.js";
|
|
6
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Add the internal state mirrors that let authors use the proposed `:valid` and `:invalid`
|
|
3
|
+
* surface before browsers expose those pseudo-classes on arbitrary elements. Only selectors change.
|
|
4
|
+
*/
|
|
5
|
+
export declare function rewriteValiditySelectors(css: string): string;
|
|
6
|
+
//# sourceMappingURL=validity-css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validity-css.d.ts","sourceRoot":"","sources":["../src/validity-css.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// ponytail: skips comments, strings, and custom property values, the places a pseudo-class name
|
|
2
|
+
// can appear outside a selector; an unquoted url() holding one would still be rewritten.
|
|
3
|
+
const VALIDITY = /\/\*[\s\S]*?\*\/|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|--[\w-]+\s*:[^;{}]*|:(user-invalid|invalid|valid)(?![\w-])/g;
|
|
4
|
+
/**
|
|
5
|
+
* Add the internal state mirrors that let authors use the proposed `:valid` and `:invalid`
|
|
6
|
+
* surface before browsers expose those pseudo-classes on arbitrary elements. Only selectors change.
|
|
7
|
+
*/
|
|
8
|
+
export function rewriteValiditySelectors(css) {
|
|
9
|
+
return css.replace(VALIDITY, (match, name) => name === undefined ? match : `:is(:${name}, [data-${name}])`);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=validity-css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validity-css.js","sourceRoot":"","sources":["../src/validity-css.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,yFAAyF;AACzF,MAAM,QAAQ,GAAG,kHAAkH,CAAC;AAEpI;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAW;IAClD,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,WAAW,IAAI,IAAI,CAAC,CAAC;AAClI,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type Constraint, type Validity, type ValidityError } from "./validate.js";
|
|
2
|
+
export interface GeneralizedValidityState {
|
|
3
|
+
readonly valid: boolean;
|
|
4
|
+
readonly valueMissing: boolean;
|
|
5
|
+
readonly typeMismatch: boolean;
|
|
6
|
+
readonly patternMismatch: boolean;
|
|
7
|
+
readonly tooLong: boolean;
|
|
8
|
+
readonly tooShort: boolean;
|
|
9
|
+
readonly rangeUnderflow: boolean;
|
|
10
|
+
readonly rangeOverflow: boolean;
|
|
11
|
+
readonly stepMismatch: boolean;
|
|
12
|
+
readonly badInput: boolean;
|
|
13
|
+
readonly customError: boolean;
|
|
14
|
+
readonly schemaMismatch: boolean;
|
|
15
|
+
readonly untrustedValue: boolean;
|
|
16
|
+
readonly errors: readonly ValidityError[];
|
|
17
|
+
}
|
|
18
|
+
export interface ElementInternalsValidity {
|
|
19
|
+
setValidity(flags?: ValidityStateFlags, message?: string, anchor?: HTMLElement): void;
|
|
20
|
+
}
|
|
21
|
+
export interface ManageValidityOptions {
|
|
22
|
+
readonly internals?: ElementInternalsValidity;
|
|
23
|
+
readonly value?: () => unknown;
|
|
24
|
+
}
|
|
25
|
+
/** Install automatic selector mirroring for inline, linked, and constructed author CSS. */
|
|
26
|
+
export declare function installValidityStyles(document: Document): void;
|
|
27
|
+
/** Read the current value of a native control or generalized managed element. */
|
|
28
|
+
export declare function readValue(el: Element): unknown;
|
|
29
|
+
/** The combined derived and externally supplied issue list. */
|
|
30
|
+
export declare function getElementValidity(el: Element): Validity;
|
|
31
|
+
/** Native-shaped flags plus HTML Next's detailed issue list. */
|
|
32
|
+
export declare function getElementValidityState(el: Element): GeneralizedValidityState;
|
|
33
|
+
export declare function validationMessage(el: Element): string;
|
|
34
|
+
/** Set derived validity. Explicit custom/application issues remain intact. */
|
|
35
|
+
export declare function setElementValidity(el: Element, validity: Validity): void;
|
|
36
|
+
/** Set or clear the independent application-authored issue channel. */
|
|
37
|
+
export declare function setExternalValidity(el: Element, errors: readonly ValidityError[] | string): void;
|
|
38
|
+
/** Opt an element into native-shaped generalized validity. */
|
|
39
|
+
export declare function manageElementValidity(el: Element, constraint?: Constraint, options?: ManageValidityOptions): () => void;
|
|
40
|
+
export declare function unmanageElementValidity(el: Element): void;
|
|
41
|
+
/** Recompute after a programmatic binding change without marking the element user-touched. */
|
|
42
|
+
export declare function refreshElementValidity(el: Element): Validity;
|
|
43
|
+
/** Explicit validation marks interaction state and dispatches `invalid` when needed. */
|
|
44
|
+
export declare function validateElement(el: Element, constraint?: Constraint): Validity;
|
|
45
|
+
//# sourceMappingURL=validity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validity.d.ts","sourceRoot":"","sources":["../src/validity.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAGvB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,CAAC,KAAK,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CACvF;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,wBAAwB,CAAC;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC;CAChC;AA+MD,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAkB9D;AAcD,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAE9C;AAED,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,OAAO,GAAG,QAAQ,CAExD;AAED,gEAAgE;AAChE,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,OAAO,GAAG,wBAAwB,CAE7E;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,CAErD;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAMxE;AAED,uEAAuE;AACvE,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,GAAG,IAAI,CAQhG;AA2GD,8DAA8D;AAC9D,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,OAAO,EACX,UAAU,GAAE,UAAe,EAC3B,OAAO,GAAE,qBAA0B,GAClC,MAAM,IAAI,CA0CZ;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAKzD;AAED,8FAA8F;AAC9F,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,OAAO,GAAG,QAAQ,CAO5D;AAED,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,QAAQ,CAU9E"}
|