@rathnasgala2/schemas 3.15.0 → 3.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -10
- package/THIRD_PARTY_LICENSES.json +1 -1
- package/catalog-sources/internal-event-actions.json +1 -1
- package/diagnostics/diagnostic-map.json +456 -4
- package/docs/catalogs/app-routes.json +7 -2
- package/docs/catalogs/internal-event-actions.json +2 -2
- package/docs/catalogs/schema-inventory.json +20 -10
- package/examples/valid/adapter-capability/rules.json +12 -0
- package/examples/valid/analytics-config/canonical.json +6 -0
- package/examples/valid/analytics-config/rules.json +334 -0
- package/examples/valid/build-input/rules.json +202 -0
- package/examples/valid/deployment-intent/rules.json +12 -0
- package/examples/valid/deployment-observation/rules.json +12 -0
- package/examples/valid/deployment-receipt/rules.json +12 -0
- package/examples/valid/problem/rules.json +39 -0
- package/examples/valid/publication/rules.json +49 -0
- package/examples/valid/theme-contract/rules.json +64 -4
- package/fixtures/boundary/adapter-capability/rules.json +26 -0
- package/fixtures/boundary/analytics-config/root.json +6 -0
- package/fixtures/boundary/analytics-config/rules.json +470 -0
- package/fixtures/boundary/build-input/rules.json +207 -0
- package/fixtures/boundary/deployment-intent/rules.json +26 -0
- package/fixtures/boundary/deployment-observation/rules.json +26 -0
- package/fixtures/boundary/deployment-receipt/rules.json +26 -0
- package/fixtures/boundary/problem/rules.json +81 -0
- package/fixtures/boundary/publication/rules.json +54 -0
- package/fixtures/boundary/theme-contract/rules.json +64 -4
- package/fixtures/invalid/adapter-capability/SCHEMA_PATTERN_INVALID/cases.json +11 -0
- package/fixtures/invalid/adapter-capability/SCHEMA_STRING_TOO_LONG/cases.json +11 -0
- package/fixtures/invalid/adapter-capability/UTF8_BYTE_LENGTH_INVALID/cases.json +11 -0
- package/fixtures/invalid/analytics-config/BCP47_INVALID/cases.json +56 -0
- package/fixtures/invalid/analytics-config/CANONICAL_ROUTE_INVALID/cases.json +38 -0
- package/fixtures/invalid/analytics-config/DIGEST_INVALID/cases.json +20 -0
- package/fixtures/invalid/analytics-config/EXTENSION_KEY_INVALID/cases.json +20 -0
- package/fixtures/invalid/analytics-config/GIT_OBJECT_ID_INVALID/cases.json +20 -0
- package/fixtures/invalid/analytics-config/HTTPS_URL_INVALID/cases.json +29 -0
- package/fixtures/invalid/analytics-config/ISO_COUNTRY_INVALID/cases.json +20 -0
- package/fixtures/invalid/analytics-config/PACKAGE_EXACT_INVALID/cases.json +38 -0
- package/fixtures/invalid/analytics-config/PACKAGE_RANGE_INVALID/cases.json +38 -0
- package/fixtures/invalid/analytics-config/PASSIVE_VISUAL_TOKEN_INVALID/cases.json +11 -0
- package/fixtures/invalid/analytics-config/PLAIN_LABEL_INVALID/cases.json +31 -0
- package/fixtures/invalid/analytics-config/PLAIN_TEXT_INVALID/cases.json +20 -0
- package/fixtures/invalid/analytics-config/REPOSITORY_GLOB_INVALID/cases.json +47 -0
- package/fixtures/invalid/analytics-config/REPOSITORY_PATH_INVALID/cases.json +58 -0
- package/fixtures/invalid/analytics-config/REQUEST_FIELD_UNKNOWN/cases.json +46 -0
- package/fixtures/invalid/analytics-config/RFC3339_INVALID/cases.json +29 -0
- package/fixtures/invalid/analytics-config/SCHEMA_ENUM_INVALID/cases.json +24 -0
- package/fixtures/invalid/analytics-config/SCHEMA_PATTERN_INVALID/cases.json +13 -0
- package/fixtures/invalid/analytics-config/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +92 -0
- package/fixtures/invalid/analytics-config/SCHEMA_TYPE_INVALID/cases.json +40 -0
- package/fixtures/invalid/analytics-config/SCHEMA_VERSION_UNSUPPORTED/cases.json +20 -0
- package/fixtures/invalid/analytics-config/SEMVER_INVALID/cases.json +20 -0
- package/fixtures/invalid/analytics-config/SEMVER_RANGE_INVALID/cases.json +38 -0
- package/fixtures/invalid/analytics-config/SLUG_INVALID/cases.json +38 -0
- package/fixtures/invalid/analytics-config/STABLE_ID_INVALID/cases.json +20 -0
- package/fixtures/invalid/analytics-config/URN_INVALID/cases.json +38 -0
- package/fixtures/invalid/build-input/GRAPHEME_LENGTH_INVALID/cases.json +11 -0
- package/fixtures/invalid/build-input/REQUEST_FIELD_UNKNOWN/cases.json +137 -0
- package/fixtures/invalid/build-input/SCHEMA_ENUM_INVALID/cases.json +22 -0
- package/fixtures/invalid/build-input/SCHEMA_PATTERN_INVALID/cases.json +11 -0
- package/fixtures/invalid/build-input/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +194 -0
- package/fixtures/invalid/build-input/SCHEMA_TYPE_INVALID/cases.json +71 -0
- package/fixtures/invalid/build-input/SCHEMA_VERSION_UNSUPPORTED/cases.json +22 -0
- package/fixtures/invalid/deployment-intent/SCHEMA_PATTERN_INVALID/cases.json +11 -0
- package/fixtures/invalid/deployment-intent/SCHEMA_STRING_TOO_LONG/cases.json +11 -0
- package/fixtures/invalid/deployment-intent/UTF8_BYTE_LENGTH_INVALID/cases.json +11 -0
- package/fixtures/invalid/deployment-observation/SCHEMA_PATTERN_INVALID/cases.json +11 -0
- package/fixtures/invalid/deployment-observation/SCHEMA_STRING_TOO_LONG/cases.json +11 -0
- package/fixtures/invalid/deployment-observation/UTF8_BYTE_LENGTH_INVALID/cases.json +11 -0
- package/fixtures/invalid/deployment-receipt/SCHEMA_PATTERN_INVALID/cases.json +11 -0
- package/fixtures/invalid/deployment-receipt/SCHEMA_STRING_TOO_LONG/cases.json +11 -0
- package/fixtures/invalid/deployment-receipt/UTF8_BYTE_LENGTH_INVALID/cases.json +11 -0
- package/fixtures/invalid/problem/GRAPHEME_LENGTH_INVALID/cases.json +9 -0
- package/fixtures/invalid/problem/SCHEMA_STRING_TOO_LONG/cases.json +27 -0
- package/fixtures/invalid/problem/SCHEMA_STRING_TOO_SHORT/cases.json +9 -0
- package/fixtures/invalid/problem/SCHEMA_TYPE_INVALID/cases.json +18 -0
- package/fixtures/invalid/publication/GRAPHEME_LENGTH_INVALID/cases.json +11 -0
- package/fixtures/invalid/publication/REQUEST_FIELD_UNKNOWN/cases.json +28 -0
- package/fixtures/invalid/publication/SCHEMA_PATTERN_INVALID/cases.json +11 -0
- package/fixtures/invalid/publication/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +44 -0
- package/fixtures/invalid/publication/SCHEMA_TYPE_INVALID/cases.json +18 -0
- package/fixtures/invalid/theme-contract/SCHEMA_CONSTANT_INVALID/cases.json +33 -22
- package/fixtures/invalid/theme-contract/SCHEMA_ENUM_INVALID/cases.json +33 -0
- package/fixtures/invalid/theme-contract/SCHEMA_REQUIRED_FIELD_MISSING/cases.json +22 -0
- package/fixtures/manifest.json +3513 -26
- package/fixtures/s2/empty-modules-placements.json +452 -0
- package/fixtures/s2/manifest.json +2 -0
- package/fixtures/unknown-field/adapter-capability/rules.json +3 -0
- package/fixtures/unknown-field/analytics-config/root.json +7 -0
- package/fixtures/unknown-field/analytics-config/rules.json +131 -0
- package/fixtures/unknown-field/build-input/rules.json +162 -0
- package/fixtures/unknown-field/deployment-intent/rules.json +3 -0
- package/fixtures/unknown-field/deployment-observation/rules.json +3 -0
- package/fixtures/unknown-field/deployment-receipt/rules.json +3 -0
- package/fixtures/unknown-field/problem/rules.json +7 -0
- package/fixtures/unknown-field/publication/rules.json +38 -0
- package/fixtures/unknown-field/theme-contract/rules.json +8 -2
- package/generated/browser/validator-core.mjs +5 -4
- package/generated/typescript/contracts/adapter-capability.d.ts +1 -0
- package/generated/typescript/contracts/analytics-config.d.ts +54 -0
- package/generated/typescript/contracts/build-input.d.ts +26 -0
- package/generated/typescript/contracts/deployment-intent.d.ts +1 -0
- package/generated/typescript/contracts/deployment-observation.d.ts +1 -0
- package/generated/typescript/contracts/deployment-receipt.d.ts +1 -0
- package/generated/typescript/contracts/problem.d.ts +4 -0
- package/generated/typescript/contracts/publication.d.ts +11 -0
- package/generated/typescript/index.d.ts +4 -0
- package/generated/typescript/index.js +14 -0
- package/openapi/http-catalog.json +55 -3
- package/openapi/openapi.yaml +5128 -3499
- package/package.json +4 -1
- package/sbom.cdx.json +23 -23
- package/schemas/adapter-capability.schema.json +7 -0
- package/schemas/analytics-config.schema.json +161 -0
- package/schemas/build-input.schema.json +66 -0
- package/schemas/deployment-intent.schema.json +7 -0
- package/schemas/deployment-observation.schema.json +7 -0
- package/schemas/deployment-receipt.schema.json +7 -0
- package/schemas/problem.schema.json +21 -0
- package/schemas/publication.schema.json +22 -0
- package/schemas/theme-contract.schema.json +25 -3
- package/site-policy-defaults.json +10 -0
- package/src/internal/schema-validator.js +3 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rathnasgala2/schemas",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.17.0",
|
|
4
4
|
"description": "Executable JSON Schema and OpenAPI contracts for Galascribe",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"types": "./types/digest-profiles.d.ts",
|
|
26
26
|
"import": "./src/digest-profiles.js"
|
|
27
27
|
},
|
|
28
|
+
"./site-policy-defaults": "./site-policy-defaults.json",
|
|
28
29
|
"./frozen-envelope": {
|
|
29
30
|
"types": "./types/frozen-envelope.d.ts",
|
|
30
31
|
"import": "./src/frozen-envelope.js"
|
|
@@ -34,6 +35,7 @@
|
|
|
34
35
|
"import": "./src/palette.js"
|
|
35
36
|
},
|
|
36
37
|
"./schemas/adapter-capability.schema.json": "./schemas/adapter-capability.schema.json",
|
|
38
|
+
"./schemas/analytics-config.schema.json": "./schemas/analytics-config.schema.json",
|
|
37
39
|
"./schemas/appearance.schema.json": "./schemas/appearance.schema.json",
|
|
38
40
|
"./schemas/artifact-manifest.schema.json": "./schemas/artifact-manifest.schema.json",
|
|
39
41
|
"./schemas/author.schema.json": "./schemas/author.schema.json",
|
|
@@ -77,6 +79,7 @@
|
|
|
77
79
|
"files": [
|
|
78
80
|
"src/",
|
|
79
81
|
"schemas/",
|
|
82
|
+
"site-policy-defaults.json",
|
|
80
83
|
"diagnostics/diagnostic-map.json",
|
|
81
84
|
"diagnostics/diagnostic-map.public-runtime-origins.json",
|
|
82
85
|
"types/",
|
package/sbom.cdx.json
CHANGED
|
@@ -97,8 +97,8 @@
|
|
|
97
97
|
"type": "library",
|
|
98
98
|
"name": "schemas",
|
|
99
99
|
"group": "@rathnasgala2",
|
|
100
|
-
"version": "3.
|
|
101
|
-
"bom-ref": "@rathnasgala2/schemas@3.
|
|
100
|
+
"version": "3.17.0",
|
|
101
|
+
"bom-ref": "@rathnasgala2/schemas@3.17.0",
|
|
102
102
|
"description": "Executable JSON Schema and OpenAPI contracts for Galascribe",
|
|
103
103
|
"licenses": [
|
|
104
104
|
{
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
],
|
|
111
|
-
"purl": "pkg:npm/%40rathnasgala2/schemas@3.
|
|
111
|
+
"purl": "pkg:npm/%40rathnasgala2/schemas@3.17.0?vcs_url=git%2Bhttps%3A%2F%2Fgithub.com%2Frathnasgala2%2Fschema.git",
|
|
112
112
|
"externalReferences": [
|
|
113
113
|
{
|
|
114
114
|
"url": "https://github.com/rathnasgala2/schema/issues",
|
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
"type": "library",
|
|
154
154
|
"name": "ajv-formats",
|
|
155
155
|
"version": "3.0.1",
|
|
156
|
-
"bom-ref": "@rathnasgala2/schemas@3.
|
|
156
|
+
"bom-ref": "@rathnasgala2/schemas@3.17.0|ajv-formats@3.0.1",
|
|
157
157
|
"licenses": [
|
|
158
158
|
{
|
|
159
159
|
"license": {
|
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
"type": "library",
|
|
188
188
|
"name": "ajv",
|
|
189
189
|
"version": "8.20.0",
|
|
190
|
-
"bom-ref": "@rathnasgala2/schemas@3.
|
|
190
|
+
"bom-ref": "@rathnasgala2/schemas@3.17.0|ajv@8.20.0",
|
|
191
191
|
"licenses": [
|
|
192
192
|
{
|
|
193
193
|
"license": {
|
|
@@ -221,7 +221,7 @@
|
|
|
221
221
|
"type": "library",
|
|
222
222
|
"name": "fast-deep-equal",
|
|
223
223
|
"version": "3.1.3",
|
|
224
|
-
"bom-ref": "@rathnasgala2/schemas@3.
|
|
224
|
+
"bom-ref": "@rathnasgala2/schemas@3.17.0|fast-deep-equal@3.1.3",
|
|
225
225
|
"licenses": [
|
|
226
226
|
{
|
|
227
227
|
"license": {
|
|
@@ -255,7 +255,7 @@
|
|
|
255
255
|
"type": "library",
|
|
256
256
|
"name": "fast-uri",
|
|
257
257
|
"version": "3.1.8",
|
|
258
|
-
"bom-ref": "@rathnasgala2/schemas@3.
|
|
258
|
+
"bom-ref": "@rathnasgala2/schemas@3.17.0|fast-uri@3.1.8",
|
|
259
259
|
"licenses": [
|
|
260
260
|
{
|
|
261
261
|
"license": {
|
|
@@ -289,7 +289,7 @@
|
|
|
289
289
|
"type": "library",
|
|
290
290
|
"name": "json-schema-traverse",
|
|
291
291
|
"version": "1.0.0",
|
|
292
|
-
"bom-ref": "@rathnasgala2/schemas@3.
|
|
292
|
+
"bom-ref": "@rathnasgala2/schemas@3.17.0|json-schema-traverse@1.0.0",
|
|
293
293
|
"licenses": [
|
|
294
294
|
{
|
|
295
295
|
"license": {
|
|
@@ -323,7 +323,7 @@
|
|
|
323
323
|
"type": "library",
|
|
324
324
|
"name": "require-from-string",
|
|
325
325
|
"version": "2.0.2",
|
|
326
|
-
"bom-ref": "@rathnasgala2/schemas@3.
|
|
326
|
+
"bom-ref": "@rathnasgala2/schemas@3.17.0|require-from-string@2.0.2",
|
|
327
327
|
"licenses": [
|
|
328
328
|
{
|
|
329
329
|
"license": {
|
|
@@ -1064,10 +1064,10 @@
|
|
|
1064
1064
|
],
|
|
1065
1065
|
"dependencies": [
|
|
1066
1066
|
{
|
|
1067
|
-
"ref": "@rathnasgala2/schemas@3.
|
|
1067
|
+
"ref": "@rathnasgala2/schemas@3.17.0",
|
|
1068
1068
|
"dependsOn": [
|
|
1069
|
-
"@rathnasgala2/schemas@3.
|
|
1070
|
-
"@rathnasgala2/schemas@3.
|
|
1069
|
+
"@rathnasgala2/schemas@3.17.0|ajv-formats@3.0.1",
|
|
1070
|
+
"@rathnasgala2/schemas@3.17.0|ajv@8.20.0",
|
|
1071
1071
|
"pkg:npm/semver@7.8.5",
|
|
1072
1072
|
"urn:gala:source-data:iana-ipv4-special-registry",
|
|
1073
1073
|
"urn:gala:source-data:iana-ipv6-special-registry",
|
|
@@ -1089,31 +1089,31 @@
|
|
|
1089
1089
|
]
|
|
1090
1090
|
},
|
|
1091
1091
|
{
|
|
1092
|
-
"ref": "@rathnasgala2/schemas@3.
|
|
1092
|
+
"ref": "@rathnasgala2/schemas@3.17.0|ajv-formats@3.0.1",
|
|
1093
1093
|
"dependsOn": [
|
|
1094
|
-
"@rathnasgala2/schemas@3.
|
|
1094
|
+
"@rathnasgala2/schemas@3.17.0|ajv@8.20.0"
|
|
1095
1095
|
]
|
|
1096
1096
|
},
|
|
1097
1097
|
{
|
|
1098
|
-
"ref": "@rathnasgala2/schemas@3.
|
|
1098
|
+
"ref": "@rathnasgala2/schemas@3.17.0|ajv@8.20.0",
|
|
1099
1099
|
"dependsOn": [
|
|
1100
|
-
"@rathnasgala2/schemas@3.
|
|
1101
|
-
"@rathnasgala2/schemas@3.
|
|
1102
|
-
"@rathnasgala2/schemas@3.
|
|
1103
|
-
"@rathnasgala2/schemas@3.
|
|
1100
|
+
"@rathnasgala2/schemas@3.17.0|fast-deep-equal@3.1.3",
|
|
1101
|
+
"@rathnasgala2/schemas@3.17.0|fast-uri@3.1.8",
|
|
1102
|
+
"@rathnasgala2/schemas@3.17.0|json-schema-traverse@1.0.0",
|
|
1103
|
+
"@rathnasgala2/schemas@3.17.0|require-from-string@2.0.2"
|
|
1104
1104
|
]
|
|
1105
1105
|
},
|
|
1106
1106
|
{
|
|
1107
|
-
"ref": "@rathnasgala2/schemas@3.
|
|
1107
|
+
"ref": "@rathnasgala2/schemas@3.17.0|fast-deep-equal@3.1.3"
|
|
1108
1108
|
},
|
|
1109
1109
|
{
|
|
1110
|
-
"ref": "@rathnasgala2/schemas@3.
|
|
1110
|
+
"ref": "@rathnasgala2/schemas@3.17.0|fast-uri@3.1.8"
|
|
1111
1111
|
},
|
|
1112
1112
|
{
|
|
1113
|
-
"ref": "@rathnasgala2/schemas@3.
|
|
1113
|
+
"ref": "@rathnasgala2/schemas@3.17.0|json-schema-traverse@1.0.0"
|
|
1114
1114
|
},
|
|
1115
1115
|
{
|
|
1116
|
-
"ref": "@rathnasgala2/schemas@3.
|
|
1116
|
+
"ref": "@rathnasgala2/schemas@3.17.0|require-from-string@2.0.2"
|
|
1117
1117
|
},
|
|
1118
1118
|
{
|
|
1119
1119
|
"ref": "pkg:npm/semver@7.8.5"
|
|
@@ -276,6 +276,13 @@
|
|
|
276
276
|
"maxLength": 2048,
|
|
277
277
|
"x-gala-utf8ByteLength": { "maximum": 2048 }
|
|
278
278
|
},
|
|
279
|
+
"verificationBaseUrl": {
|
|
280
|
+
"allOf": [{ "$ref": "#/$defs/urlHttps" }],
|
|
281
|
+
"maxLength": 2048,
|
|
282
|
+
"pattern": "^https://[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?(?:/[^?#\\s]*)?$",
|
|
283
|
+
"x-gala-utf8ByteLength": { "maximum": 2048 },
|
|
284
|
+
"description": "SCHEMA-3.17.0, optional: the address the deploy is verified at when that differs from `baseUrl`, the build base. It is the origin and path that answer over HTTPS right now (the github.io project address before a custom domain is set, the custom base once it serves): a lowercase exact host with no userinfo, port, query or fragment; a path is allowed. Absent means `baseUrl` is both the build base and the verification address, exactly as before 3.17.0. When present it is a member of `destination` like `baseUrl`, so it is inside the capability decision record that `decisionDigest` covers (RFC 8785 canonical member order); a record without it digests exactly as it did before."
|
|
285
|
+
},
|
|
279
286
|
"providerBinding": { "$ref": "#/$defs/destinationProviderCoordinates" }
|
|
280
287
|
},
|
|
281
288
|
"additionalProperties": false,
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "urn:gala:schema:analytics-config:2.0.0",
|
|
4
|
+
"title": "Gala analytics-config contract",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schemaId", "schemaVersion", "provider", "consent"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schemaId": { "const": "urn:gala:schema:analytics-config:2.0.0" },
|
|
9
|
+
"schemaVersion": { "const": "2.0.0" },
|
|
10
|
+
"provider": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"required": ["kind", "measurementId"],
|
|
13
|
+
"properties": {
|
|
14
|
+
"kind": {
|
|
15
|
+
"enum": ["google-analytics-4"],
|
|
16
|
+
"description": "Which analytics provider the site uses. Closed list; a new provider is added as a new kind."
|
|
17
|
+
},
|
|
18
|
+
"measurementId": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"pattern": "^G-[A-Z0-9]{4,12}$",
|
|
21
|
+
"description": "The Google Analytics 4 measurement ID, for example G-ABC123XYZ."
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"additionalProperties": false,
|
|
25
|
+
"description": "The analytics provider. The site's template loads this provider's script only after the reader consents, and extends the page Content-Security-Policy for that provider's origins."
|
|
26
|
+
},
|
|
27
|
+
"consent": {
|
|
28
|
+
"type": "object",
|
|
29
|
+
"required": ["policy"],
|
|
30
|
+
"properties": {
|
|
31
|
+
"policy": {
|
|
32
|
+
"enum": ["opt-in"],
|
|
33
|
+
"description": "opt-in: readers are asked before any analytics loads, and nothing loads until they accept."
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"additionalProperties": false,
|
|
37
|
+
"description": "How readers are asked. The choice is stored in the reader’s browser and can be changed from the site footer."
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"additionalProperties": false,
|
|
41
|
+
"$defs": {
|
|
42
|
+
"stableId": {
|
|
43
|
+
"type": "string",
|
|
44
|
+
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$",
|
|
45
|
+
"description": "Lowercase canonical UUIDv7. Once published, it is immutable; its time ordering conveys neither chronology nor authority."
|
|
46
|
+
},
|
|
47
|
+
"slug": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"minLength": 1,
|
|
50
|
+
"maxLength": 80,
|
|
51
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
52
|
+
},
|
|
53
|
+
"repoRelativePath": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"minLength": 1,
|
|
56
|
+
"maxLength": 512,
|
|
57
|
+
"pattern": "^(?!/)(?!.*\\\\)(?!.*\\u0000).+$",
|
|
58
|
+
"format": "gala-repository-relative-path",
|
|
59
|
+
"x-gala-utf8ByteLength": { "maximum": 512 },
|
|
60
|
+
"description": "NFC UTF-8 repository-relative path using slash separators, with no leading slash, dot segment, NUL, backslash, or percent-decoded traversal."
|
|
61
|
+
},
|
|
62
|
+
"canonicalRoute": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"minLength": 1,
|
|
65
|
+
"pattern": "^/(?!/)(?!.*//)(?!.*[?#]).*$",
|
|
66
|
+
"format": "gala-canonical-route",
|
|
67
|
+
"description": "Absolute normalized route with no query, fragment, dot segment, double slash, or non-normalized percent encoding."
|
|
68
|
+
},
|
|
69
|
+
"gitObjectId": {
|
|
70
|
+
"type": "string",
|
|
71
|
+
"pattern": "^(?:sha1:[0-9a-f]{40}|sha256:[0-9a-f]{64})$"
|
|
72
|
+
},
|
|
73
|
+
"digest": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
|
|
74
|
+
"urlHttps": {
|
|
75
|
+
"type": "string",
|
|
76
|
+
"format": "uri",
|
|
77
|
+
"pattern": "^https://(?![^/?#]*@)",
|
|
78
|
+
"description": "Absolute HTTPS URL without embedded credentials."
|
|
79
|
+
},
|
|
80
|
+
"bcp47": {
|
|
81
|
+
"type": "string",
|
|
82
|
+
"minLength": 1,
|
|
83
|
+
"maxLength": 255,
|
|
84
|
+
"pattern": "^[A-Za-z0-9-]+$",
|
|
85
|
+
"format": "gala-bcp47",
|
|
86
|
+
"x-gala-utf8ByteLength": { "minimum": 1, "maximum": 255 },
|
|
87
|
+
"description": "Structurally valid canonical BCP-47 language tag."
|
|
88
|
+
},
|
|
89
|
+
"isoCountry": {
|
|
90
|
+
"type": "string",
|
|
91
|
+
"pattern": "^[A-Z]{2}$",
|
|
92
|
+
"format": "gala-iso-country",
|
|
93
|
+
"description": "ISO 3166-1 alpha-2 country code; admission remains subject to the active policy profile."
|
|
94
|
+
},
|
|
95
|
+
"plainLabel": {
|
|
96
|
+
"type": "string",
|
|
97
|
+
"format": "gala-plain-label",
|
|
98
|
+
"x-gala-graphemeLength": { "minimum": 1, "maximum": 80 },
|
|
99
|
+
"description": "Normalized Unicode plain text without markup, controls, or bidi overrides."
|
|
100
|
+
},
|
|
101
|
+
"plainText": {
|
|
102
|
+
"type": "string",
|
|
103
|
+
"format": "gala-plain-text",
|
|
104
|
+
"description": "NFC Unicode text without disallowed C0/C1 controls or bidi override/isolate controls."
|
|
105
|
+
},
|
|
106
|
+
"rfc3339": {
|
|
107
|
+
"type": "string",
|
|
108
|
+
"format": "date-time",
|
|
109
|
+
"pattern": "^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])T(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\\.[0-9]{3}Z$",
|
|
110
|
+
"description": "Canonical Gala UTC millisecond subset of RFC 3339."
|
|
111
|
+
},
|
|
112
|
+
"semver": {
|
|
113
|
+
"type": "string",
|
|
114
|
+
"pattern": "^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*))*)?$",
|
|
115
|
+
"description": "Canonical SemVer 2.0.0 without build metadata."
|
|
116
|
+
},
|
|
117
|
+
"semverRange": {
|
|
118
|
+
"type": "string",
|
|
119
|
+
"minLength": 1,
|
|
120
|
+
"pattern": "^(?:\\S+|\\S+ \\S+)$",
|
|
121
|
+
"format": "gala-semver-range",
|
|
122
|
+
"description": "Whitespace-free npm-compatible exact, caret, or bounded comparator-set range; tags and URLs are invalid."
|
|
123
|
+
},
|
|
124
|
+
"packageRange": {
|
|
125
|
+
"type": "string",
|
|
126
|
+
"minLength": 3,
|
|
127
|
+
"pattern": "^(?:@[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?/[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?|[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?)@(?:\\S+|\\S+ \\S+)$",
|
|
128
|
+
"format": "gala-package-range",
|
|
129
|
+
"description": "Lowercase npm package identity and admitted semver range; Git, file, URL, and alias sources are invalid."
|
|
130
|
+
},
|
|
131
|
+
"packageExact": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"minLength": 3,
|
|
134
|
+
"pattern": "^(?:@[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?/[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?|[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?)@\\S+$",
|
|
135
|
+
"format": "gala-package-exact",
|
|
136
|
+
"description": "Lowercase npm package identity and exact canonical semantic version; aliases are invalid."
|
|
137
|
+
},
|
|
138
|
+
"urn": {
|
|
139
|
+
"type": "string",
|
|
140
|
+
"minLength": 10,
|
|
141
|
+
"maxLength": 255,
|
|
142
|
+
"format": "uri",
|
|
143
|
+
"pattern": "^urn:gala:[\\x21-\\x7E]+$",
|
|
144
|
+
"description": "Absolute ASCII URN in the schema-declared Gala namespace."
|
|
145
|
+
},
|
|
146
|
+
"glob": {
|
|
147
|
+
"type": "string",
|
|
148
|
+
"minLength": 1,
|
|
149
|
+
"maxLength": 256,
|
|
150
|
+
"format": "gala-repository-glob",
|
|
151
|
+
"x-gala-utf8ByteLength": { "maximum": 256 },
|
|
152
|
+
"description": "Repository-relative POSIX glob using only star, globstar, and question-mark operators; braces, extglobs, negation, absolute paths, and parent traversal are invalid."
|
|
153
|
+
},
|
|
154
|
+
"passiveVisualToken": false,
|
|
155
|
+
"extensionKey": {
|
|
156
|
+
"type": "string",
|
|
157
|
+
"format": "gala-extension-key",
|
|
158
|
+
"description": "Reverse-DNS extension namespace that cannot shadow a core key."
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"navigation": { "$ref": "#/$defs/navigationNormalized" },
|
|
47
47
|
"appearance": { "$ref": "#/$defs/appearanceNormalized" },
|
|
48
48
|
"modules": { "$ref": "#/$defs/moduleBuildSelection" },
|
|
49
|
+
"policies": { "$ref": "#/$defs/policiesNormalized" },
|
|
49
50
|
"buildEpoch": { "$ref": "#/$defs/rfc3339" },
|
|
50
51
|
"baseUrl": { "$ref": "#/$defs/urlHttps" },
|
|
51
52
|
"basePath": { "$ref": "#/$defs/canonicalRoute" },
|
|
@@ -531,6 +532,27 @@
|
|
|
531
532
|
},
|
|
532
533
|
"additionalProperties": false
|
|
533
534
|
},
|
|
535
|
+
"policyPageNormalized": {
|
|
536
|
+
"type": "object",
|
|
537
|
+
"required": ["title", "body"],
|
|
538
|
+
"properties": {
|
|
539
|
+
"title": {
|
|
540
|
+
"$ref": "#/$defs/plainText",
|
|
541
|
+
"x-gala-graphemeLength": { "minimum": 1, "maximum": 80 }
|
|
542
|
+
},
|
|
543
|
+
"body": { "$ref": "#/$defs/renderableBody" }
|
|
544
|
+
},
|
|
545
|
+
"additionalProperties": false
|
|
546
|
+
},
|
|
547
|
+
"policiesNormalized": {
|
|
548
|
+
"type": "object",
|
|
549
|
+
"required": ["terms", "privacy"],
|
|
550
|
+
"properties": {
|
|
551
|
+
"terms": { "$ref": "#/$defs/policyPageNormalized" },
|
|
552
|
+
"privacy": { "$ref": "#/$defs/policyPageNormalized" }
|
|
553
|
+
},
|
|
554
|
+
"additionalProperties": false
|
|
555
|
+
},
|
|
534
556
|
"authorNormalized": {
|
|
535
557
|
"type": "object",
|
|
536
558
|
"required": [
|
|
@@ -1030,6 +1052,12 @@
|
|
|
1030
1052
|
"type": "object",
|
|
1031
1053
|
"required": [],
|
|
1032
1054
|
"properties": {
|
|
1055
|
+
"analytics": {
|
|
1056
|
+
"type": "object",
|
|
1057
|
+
"required": ["config"],
|
|
1058
|
+
"properties": { "config": { "$ref": "#/$defs/analyticsConfig" } },
|
|
1059
|
+
"additionalProperties": false
|
|
1060
|
+
},
|
|
1033
1061
|
"interactions": {
|
|
1034
1062
|
"type": "object",
|
|
1035
1063
|
"required": ["config", "apiOrigin", "appOrigin"],
|
|
@@ -1142,6 +1170,44 @@
|
|
|
1142
1170
|
},
|
|
1143
1171
|
"additionalProperties": false
|
|
1144
1172
|
},
|
|
1173
|
+
"analyticsConfig": {
|
|
1174
|
+
"type": "object",
|
|
1175
|
+
"required": ["schemaId", "schemaVersion", "provider", "consent"],
|
|
1176
|
+
"properties": {
|
|
1177
|
+
"schemaId": { "const": "urn:gala:schema:analytics-config:2.0.0" },
|
|
1178
|
+
"schemaVersion": { "const": "2.0.0" },
|
|
1179
|
+
"provider": {
|
|
1180
|
+
"type": "object",
|
|
1181
|
+
"required": ["kind", "measurementId"],
|
|
1182
|
+
"properties": {
|
|
1183
|
+
"kind": {
|
|
1184
|
+
"enum": ["google-analytics-4"],
|
|
1185
|
+
"description": "Which analytics provider the site uses. Closed list; a new provider is added as a new kind."
|
|
1186
|
+
},
|
|
1187
|
+
"measurementId": {
|
|
1188
|
+
"type": "string",
|
|
1189
|
+
"pattern": "^G-[A-Z0-9]{4,12}$",
|
|
1190
|
+
"description": "The Google Analytics 4 measurement ID, for example G-ABC123XYZ."
|
|
1191
|
+
}
|
|
1192
|
+
},
|
|
1193
|
+
"additionalProperties": false,
|
|
1194
|
+
"description": "The analytics provider. The site's template loads this provider's script only after the reader consents, and extends the page Content-Security-Policy for that provider's origins."
|
|
1195
|
+
},
|
|
1196
|
+
"consent": {
|
|
1197
|
+
"type": "object",
|
|
1198
|
+
"required": ["policy"],
|
|
1199
|
+
"properties": {
|
|
1200
|
+
"policy": {
|
|
1201
|
+
"enum": ["opt-in"],
|
|
1202
|
+
"description": "opt-in: readers are asked before any analytics loads, and nothing loads until they accept."
|
|
1203
|
+
}
|
|
1204
|
+
},
|
|
1205
|
+
"additionalProperties": false,
|
|
1206
|
+
"description": "How readers are asked. The choice is stored in the reader’s browser and can be changed from the site footer."
|
|
1207
|
+
}
|
|
1208
|
+
},
|
|
1209
|
+
"additionalProperties": false
|
|
1210
|
+
},
|
|
1145
1211
|
"interactionsServiceOrigin": {
|
|
1146
1212
|
"type": "string",
|
|
1147
1213
|
"maxLength": 255,
|
|
@@ -370,6 +370,13 @@
|
|
|
370
370
|
"maxLength": 2048,
|
|
371
371
|
"x-gala-utf8ByteLength": { "maximum": 2048 }
|
|
372
372
|
},
|
|
373
|
+
"verificationBaseUrl": {
|
|
374
|
+
"allOf": [{ "$ref": "#/$defs/urlHttps" }],
|
|
375
|
+
"maxLength": 2048,
|
|
376
|
+
"pattern": "^https://[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?(?:/[^?#\\s]*)?$",
|
|
377
|
+
"x-gala-utf8ByteLength": { "maximum": 2048 },
|
|
378
|
+
"description": "SCHEMA-3.17.0, optional: the address the deploy is verified at when that differs from `baseUrl`, the build base. It is the origin and path that answer over HTTPS right now (the github.io project address before a custom domain is set, the custom base once it serves): a lowercase exact host with no userinfo, port, query or fragment; a path is allowed. Absent means `baseUrl` is both the build base and the verification address, exactly as before 3.17.0. When present it is a member of `destination` like `baseUrl`, so it is inside the capability decision record that `decisionDigest` covers (RFC 8785 canonical member order); a record without it digests exactly as it did before."
|
|
379
|
+
},
|
|
373
380
|
"providerBinding": { "$ref": "#/$defs/destinationProviderCoordinates" }
|
|
374
381
|
},
|
|
375
382
|
"additionalProperties": false,
|
|
@@ -276,6 +276,13 @@
|
|
|
276
276
|
"maxLength": 2048,
|
|
277
277
|
"x-gala-utf8ByteLength": { "maximum": 2048 }
|
|
278
278
|
},
|
|
279
|
+
"verificationBaseUrl": {
|
|
280
|
+
"allOf": [{ "$ref": "#/$defs/urlHttps" }],
|
|
281
|
+
"maxLength": 2048,
|
|
282
|
+
"pattern": "^https://[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?(?:/[^?#\\s]*)?$",
|
|
283
|
+
"x-gala-utf8ByteLength": { "maximum": 2048 },
|
|
284
|
+
"description": "SCHEMA-3.17.0, optional: the address the deploy is verified at when that differs from `baseUrl`, the build base. It is the origin and path that answer over HTTPS right now (the github.io project address before a custom domain is set, the custom base once it serves): a lowercase exact host with no userinfo, port, query or fragment; a path is allowed. Absent means `baseUrl` is both the build base and the verification address, exactly as before 3.17.0. When present it is a member of `destination` like `baseUrl`, so it is inside the capability decision record that `decisionDigest` covers (RFC 8785 canonical member order); a record without it digests exactly as it did before."
|
|
285
|
+
},
|
|
279
286
|
"providerBinding": { "$ref": "#/$defs/destinationProviderCoordinates" }
|
|
280
287
|
},
|
|
281
288
|
"additionalProperties": false,
|
|
@@ -358,6 +358,13 @@
|
|
|
358
358
|
"maxLength": 2048,
|
|
359
359
|
"x-gala-utf8ByteLength": { "maximum": 2048 }
|
|
360
360
|
},
|
|
361
|
+
"verificationBaseUrl": {
|
|
362
|
+
"allOf": [{ "$ref": "#/$defs/urlHttps" }],
|
|
363
|
+
"maxLength": 2048,
|
|
364
|
+
"pattern": "^https://[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?(?:/[^?#\\s]*)?$",
|
|
365
|
+
"x-gala-utf8ByteLength": { "maximum": 2048 },
|
|
366
|
+
"description": "SCHEMA-3.17.0, optional: the address the deploy is verified at when that differs from `baseUrl`, the build base. It is the origin and path that answer over HTTPS right now (the github.io project address before a custom domain is set, the custom base once it serves): a lowercase exact host with no userinfo, port, query or fragment; a path is allowed. Absent means `baseUrl` is both the build base and the verification address, exactly as before 3.17.0. When present it is a member of `destination` like `baseUrl`, so it is inside the capability decision record that `decisionDigest` covers (RFC 8785 canonical member order); a record without it digests exactly as it did before."
|
|
367
|
+
},
|
|
361
368
|
"providerBinding": { "$ref": "#/$defs/destinationProviderCoordinates" }
|
|
362
369
|
},
|
|
363
370
|
"additionalProperties": false,
|
|
@@ -38,6 +38,27 @@
|
|
|
38
38
|
"items": { "$ref": "#/$defs/fieldError" },
|
|
39
39
|
"minItems": 0,
|
|
40
40
|
"maxItems": 100
|
|
41
|
+
},
|
|
42
|
+
"expectedBase": {
|
|
43
|
+
"allOf": [{ "$ref": "#/$defs/urlHttps" }],
|
|
44
|
+
"maxLength": 2048,
|
|
45
|
+
"description": "SCHEMA-3.17.0, optional, carried by a CANONICAL_BASE_MISMATCH problem and absent from every other: the address the site is served from right now and so the canonical base its publication profile must carry (the active custom domain once the domain redirects the project path, otherwise the github.io address)."
|
|
46
|
+
},
|
|
47
|
+
"profileBase": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"maxLength": 2048,
|
|
50
|
+
"description": "SCHEMA-3.17.0, optional, carried by a CANONICAL_BASE_MISMATCH problem and absent from every other: the canonical base the publication profile (`gala/publication.json`) carries now, as written. A string rather than an https URL because the mismatch can be a value that is not one (for example an http address)."
|
|
51
|
+
},
|
|
52
|
+
"domainState": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"minLength": 1,
|
|
55
|
+
"maxLength": 80,
|
|
56
|
+
"description": "SCHEMA-3.17.0, optional, carried by a CANONICAL_BASE_MISMATCH problem and absent from every other: the state of the site's custom-domain binding that decided `expectedBase` (a `DomainBindingState` value such as `CERTIFICATE_PENDING` or `ACTIVE`), absent when the site has no custom domain. A client shows a value it does not know as is."
|
|
57
|
+
},
|
|
58
|
+
"remedy": {
|
|
59
|
+
"$ref": "#/$defs/plainText",
|
|
60
|
+
"description": "SCHEMA-3.17.0, optional, carried by a CANONICAL_BASE_MISMATCH problem and absent from every other: one sentence, written for the author, saying what resolves the mismatch. A client may render it verbatim.",
|
|
61
|
+
"x-gala-graphemeLength": { "minimum": 1, "maximum": 500 }
|
|
41
62
|
}
|
|
42
63
|
},
|
|
43
64
|
"additionalProperties": false,
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
},
|
|
47
47
|
"defaultImageRef": { "$ref": "#/$defs/repoRelativePath" },
|
|
48
48
|
"profile": { "$ref": "#/$defs/publicationProfile" },
|
|
49
|
+
"policies": { "$ref": "#/$defs/publicationPolicies" },
|
|
49
50
|
"footerCard": { "$ref": "#/$defs/footerCard" },
|
|
50
51
|
"newsletter": { "$ref": "#/$defs/newsletter" },
|
|
51
52
|
"crawlers": { "$ref": "#/$defs/crawlers" },
|
|
@@ -220,6 +221,27 @@
|
|
|
220
221
|
},
|
|
221
222
|
"additionalProperties": false
|
|
222
223
|
},
|
|
224
|
+
"policyPage": {
|
|
225
|
+
"type": "object",
|
|
226
|
+
"required": ["title", "body"],
|
|
227
|
+
"properties": {
|
|
228
|
+
"title": {
|
|
229
|
+
"$ref": "#/$defs/plainText",
|
|
230
|
+
"x-gala-graphemeLength": { "minimum": 1, "maximum": 80 }
|
|
231
|
+
},
|
|
232
|
+
"body": { "$ref": "#/$defs/repoRelativePath", "pattern": "^.+\\.md$" }
|
|
233
|
+
},
|
|
234
|
+
"additionalProperties": false
|
|
235
|
+
},
|
|
236
|
+
"publicationPolicies": {
|
|
237
|
+
"type": "object",
|
|
238
|
+
"required": ["terms", "privacy"],
|
|
239
|
+
"properties": {
|
|
240
|
+
"terms": { "$ref": "#/$defs/policyPage" },
|
|
241
|
+
"privacy": { "$ref": "#/$defs/policyPage" }
|
|
242
|
+
},
|
|
243
|
+
"additionalProperties": false
|
|
244
|
+
},
|
|
223
245
|
"footerCard": {
|
|
224
246
|
"type": "object",
|
|
225
247
|
"required": ["enabled", "heading", "body", "authorIds"],
|
|
@@ -2305,11 +2305,13 @@
|
|
|
2305
2305
|
},
|
|
2306
2306
|
{
|
|
2307
2307
|
"if": {
|
|
2308
|
-
"properties": { "contractVersion": { "
|
|
2308
|
+
"properties": { "contractVersion": { "enum": ["4.0.0", "4.1.0"] } },
|
|
2309
2309
|
"required": ["contractVersion"]
|
|
2310
2310
|
},
|
|
2311
2311
|
"then": {
|
|
2312
|
-
"properties": {
|
|
2312
|
+
"properties": {
|
|
2313
|
+
"templateRange": { "enum": ["^4.0.0", "^4.1.0", "^4.4.0"] }
|
|
2314
|
+
},
|
|
2313
2315
|
"required": ["composition"],
|
|
2314
2316
|
"allOf": [
|
|
2315
2317
|
{
|
|
@@ -2395,6 +2397,24 @@
|
|
|
2395
2397
|
}
|
|
2396
2398
|
}
|
|
2397
2399
|
}
|
|
2400
|
+
},
|
|
2401
|
+
{
|
|
2402
|
+
"if": {
|
|
2403
|
+
"properties": { "contractVersion": { "const": "4.0.0" } },
|
|
2404
|
+
"required": ["contractVersion"]
|
|
2405
|
+
},
|
|
2406
|
+
"then": {
|
|
2407
|
+
"properties": {
|
|
2408
|
+
"templateRange": { "enum": ["^4.0.0", "^4.1.0"] }
|
|
2409
|
+
}
|
|
2410
|
+
}
|
|
2411
|
+
},
|
|
2412
|
+
{
|
|
2413
|
+
"if": {
|
|
2414
|
+
"properties": { "contractVersion": { "const": "4.1.0" } },
|
|
2415
|
+
"required": ["contractVersion"]
|
|
2416
|
+
},
|
|
2417
|
+
"then": { "properties": { "templateRange": { "const": "^4.4.0" } } }
|
|
2398
2418
|
}
|
|
2399
2419
|
]
|
|
2400
2420
|
},
|
|
@@ -2405,7 +2425,9 @@
|
|
|
2405
2425
|
"properties": { "themeId": { "const": "editorial" } },
|
|
2406
2426
|
"required": ["themeId"]
|
|
2407
2427
|
},
|
|
2408
|
-
"then": {
|
|
2428
|
+
"then": {
|
|
2429
|
+
"properties": { "contractVersion": { "enum": ["4.0.0", "4.1.0"] } }
|
|
2430
|
+
}
|
|
2409
2431
|
}
|
|
2410
2432
|
],
|
|
2411
2433
|
"$comment": "The semantic validator enforces package/theme identity, slot/fixture catalogs, non-color palette equality, CSS/package admission, evidence, budgets, and every self-excluding digest."
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"terms": {
|
|
3
|
+
"title": "Terms",
|
|
4
|
+
"markdown": "## About this site\n\nThis site is a publication run by its author. These terms explain how you may use it. By using the site you agree to them.\n\n## Who owns the content\n\nThe articles, images and other material on this site belong to its author or to the people the author credits. You may read the site and quote short passages with a link back to the original. You may not copy, republish or sell the content without the author's written permission, unless a licence stated on the site says you can.\n\n## Using the site as it is\n\nThe site is provided as it is. The author works to keep it accurate and available, but does not promise that it is free of errors, always online, or right for any particular purpose. Nothing on the site is professional, legal, medical or financial advice. To the extent the law allows, the author is not liable for any loss that results from using the site or relying on its content. Nothing in these terms limits a liability that the law does not allow to be limited.\n\n## Comments and other contributions\n\nIf the site lets you react or comment, please be civil. Do not post anything unlawful, abusive, harassing, misleading or spam, or anything that infringes someone else's rights. You are responsible for what you post. The author may remove any contribution, or stop accepting them, at any time and without notice.\n\n## Links to other sites\n\nThe site may link to other websites. The author does not control them and is not responsible for their content or practices.\n\n## Changes to these terms\n\nThe author may update these terms from time to time. The version on this page is the one that applies when you use the site, so please check back now and then.\n\n## Contact\n\nQuestions about the site or these terms go to the author. Use the contact details on the site, such as the About page or the author's profile.\n"
|
|
5
|
+
},
|
|
6
|
+
"privacy": {
|
|
7
|
+
"title": "Privacy",
|
|
8
|
+
"markdown": "## What this page covers\n\nThis page explains what the site itself collects when you read it. What is collected by reactions, comments or analytics, who handles it, and what choices you have are described in the section at the end of this page, for the features the site has switched on.\n\n## Server logs\n\nThe site is delivered by a hosting provider. Like almost every web host, it keeps ordinary request logs: your IP address, the time of the request, the page you asked for and basic details about your browser. These logs are used to run and protect the service and are kept for the provider's own retention period. The author does not use them to identify individual readers.\n\n## Browser storage\n\nThe site stores a few small settings in your browser: your colour mode (light, dark or system) and any posts you have saved to read later. This information stays on your device. The site itself keeps no reader accounts and does not track you across other websites.\n\n## Your rights\n\nDepending on where you live, you may have the right to ask what personal information is held about you, to have it corrected or deleted, or to object to how it is used. To use these rights, or with any privacy question, contact the author using the contact details on the site.\n\n## Changes to this page\n\nThe author may update this page from time to time. The version shown here is the current one.\n"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import diagnosticMap from '../../diagnostics/diagnostic-map.json' with { type: 'json' };
|
|
2
2
|
import adapterCapabilitySchema from '../../schemas/adapter-capability.schema.json' with { type: 'json' };
|
|
3
|
+
import analyticsConfigSchema from '../../schemas/analytics-config.schema.json' with { type: 'json' };
|
|
3
4
|
import appearanceSchema from '../../schemas/appearance.schema.json' with { type: 'json' };
|
|
4
5
|
import artifactManifestSchema from '../../schemas/artifact-manifest.schema.json' with { type: 'json' };
|
|
5
6
|
import authorSchema from '../../schemas/author.schema.json' with { type: 'json' };
|
|
@@ -26,6 +27,7 @@ import { createValidatorSuite } from './validator-core.js';
|
|
|
26
27
|
/** Statically imported schema documents, in CONTRACTS order. */
|
|
27
28
|
const SCHEMAS_BY_CONTRACT = Object.freeze({
|
|
28
29
|
'adapter-capability': adapterCapabilitySchema,
|
|
30
|
+
'analytics-config': analyticsConfigSchema,
|
|
29
31
|
appearance: appearanceSchema,
|
|
30
32
|
'artifact-manifest': artifactManifestSchema,
|
|
31
33
|
author: authorSchema,
|
|
@@ -50,6 +52,7 @@ const SCHEMAS_BY_CONTRACT = Object.freeze({
|
|
|
50
52
|
|
|
51
53
|
const CONTRACTS = Object.freeze([
|
|
52
54
|
'adapter-capability',
|
|
55
|
+
'analytics-config',
|
|
53
56
|
'appearance',
|
|
54
57
|
'artifact-manifest',
|
|
55
58
|
'author',
|