@jxsuite/starters 1.2.1 → 1.6.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 +194 -0
- package/package.json +4 -2
- package/registry.json +16 -0
- package/sites/blog/document.schema.json +1802 -1153
- package/sites/blog/package.json +3 -3
- package/sites/blog/project.schema.json +535 -39
- package/sites/course/document.schema.json +1802 -1153
- package/sites/course/package.json +3 -3
- package/sites/course/project.schema.json +535 -39
- package/sites/event/document.schema.json +1802 -1153
- package/sites/event/package.json +3 -3
- package/sites/event/project.schema.json +535 -39
- package/sites/fitness-studio/document.schema.json +1802 -1153
- package/sites/fitness-studio/package.json +3 -3
- package/sites/fitness-studio/project.schema.json +535 -39
- package/sites/home-services/document.schema.json +1802 -1153
- package/sites/home-services/package.json +3 -3
- package/sites/home-services/project.schema.json +535 -39
- package/sites/museum/components/mu-band.json +92 -0
- package/sites/museum/components/mu-cta.json +101 -0
- package/sites/museum/components/mu-exhibition-card.json +191 -0
- package/sites/museum/components/mu-exhibition-row.json +237 -0
- package/sites/museum/components/mu-fact.json +64 -0
- package/sites/museum/components/mu-footer.json +256 -0
- package/sites/museum/components/mu-hero.json +236 -0
- package/sites/museum/components/mu-more.json +63 -0
- package/sites/museum/components/mu-oculus.json +44 -0
- package/sites/museum/components/mu-pagehead.json +105 -0
- package/sites/museum/components/mu-quote.json +49 -0
- package/sites/museum/content/exhibitions/ar/clay-salt-thread.md +18 -0
- package/sites/museum/content/exhibitions/ar/harbour-and-crane.md +18 -0
- package/sites/museum/content/exhibitions/ar/the-cartographers-room.md +18 -0
- package/sites/museum/content/exhibitions/en/clay-salt-thread.md +19 -0
- package/sites/museum/content/exhibitions/en/harbour-and-crane.md +19 -0
- package/sites/museum/content/exhibitions/en/the-cartographers-room.md +19 -0
- package/sites/museum/content/exhibitions/fr-CA/clay-salt-thread.md +18 -0
- package/sites/museum/content/exhibitions/fr-CA/harbour-and-crane.md +18 -0
- package/sites/museum/content/exhibitions/fr-CA/the-cartographers-room.md +18 -0
- package/sites/museum/document.schema.json +23513 -0
- package/sites/museum/layouts/ar.json +29 -0
- package/sites/museum/layouts/base.json +329 -0
- package/sites/museum/layouts/fr-ca.json +28 -0
- package/sites/museum/package.json +18 -0
- package/sites/museum/pages/about.json +378 -0
- package/sites/museum/pages/ar/about.json +314 -0
- package/sites/museum/pages/ar/exhibitions/[slug].json +211 -0
- package/sites/museum/pages/ar/exhibitions/index.json +103 -0
- package/sites/museum/pages/ar/index.json +246 -0
- package/sites/museum/pages/ar/visit.json +327 -0
- package/sites/museum/pages/exhibitions/[slug].json +200 -0
- package/sites/museum/pages/exhibitions/index.json +93 -0
- package/sites/museum/pages/fr-ca/a-propos.json +313 -0
- package/sites/museum/pages/fr-ca/expositions/[slug].json +215 -0
- package/sites/museum/pages/fr-ca/expositions/index.json +104 -0
- package/sites/museum/pages/fr-ca/index.json +246 -0
- package/sites/museum/pages/fr-ca/visite.json +328 -0
- package/sites/museum/pages/index.json +236 -0
- package/sites/museum/pages/visit.json +317 -0
- package/sites/museum/project.json +179 -0
- package/sites/museum/project.schema.json +996 -0
- package/sites/museum/public/favicon.svg +8 -0
- package/sites/nonprofit/document.schema.json +1802 -1153
- package/sites/nonprofit/package.json +3 -3
- package/sites/nonprofit/project.schema.json +535 -39
- package/sites/portfolio/document.schema.json +1802 -1153
- package/sites/portfolio/package.json +3 -3
- package/sites/portfolio/project.schema.json +535 -39
- package/sites/professional-firm/document.schema.json +1802 -1153
- package/sites/professional-firm/package.json +3 -3
- package/sites/professional-firm/project.schema.json +535 -39
- package/sites/real-estate/document.schema.json +1802 -1153
- package/sites/real-estate/package.json +3 -3
- package/sites/real-estate/project.schema.json +535 -39
- package/sites/restaurant/document.schema.json +1802 -1153
- package/sites/restaurant/package.json +3 -3
- package/sites/restaurant/project.schema.json +535 -39
- package/sites/saas/document.schema.json +1802 -1153
- package/sites/saas/package.json +3 -3
- package/sites/saas/project.schema.json +535 -39
- package/sites/shop/document.schema.json +1802 -1153
- package/sites/shop/package.json +3 -3
- package/sites/shop/project.schema.json +535 -39
|
@@ -2,17 +2,16 @@
|
|
|
2
2
|
"$comment": "Generated by `jx schema` from project.json#/extensions — do not edit.",
|
|
3
3
|
"$defs": {
|
|
4
4
|
"Fields": {
|
|
5
|
-
"$id": "https://jxsuite.com/schema/project/fields/v2",
|
|
6
5
|
"anyOf": [
|
|
7
6
|
{
|
|
8
|
-
"$ref": "
|
|
7
|
+
"$ref": "#/$defs/project-core-v2/$defs/JxFieldSchema"
|
|
9
8
|
},
|
|
10
9
|
{
|
|
11
|
-
"$ref": "
|
|
10
|
+
"$ref": "#/$defs/project-core-v2/$defs/RelationshipRef"
|
|
12
11
|
}
|
|
13
12
|
]
|
|
14
13
|
},
|
|
15
|
-
"
|
|
14
|
+
"project-core-v2": {
|
|
16
15
|
"$defs": {
|
|
17
16
|
"ImageConfig": {
|
|
18
17
|
"description": "Image optimization configuration for the project.",
|
|
@@ -29,6 +28,10 @@
|
|
|
29
28
|
"optimize": {
|
|
30
29
|
"type": "boolean"
|
|
31
30
|
},
|
|
31
|
+
"picture": {
|
|
32
|
+
"description": "Wrap a multi-format image in a <picture> with one <source> per format (default true). With it off the <img> carries a srcset in the preferred format alone, which browsers that cannot decode that format will still select from.",
|
|
33
|
+
"type": "boolean"
|
|
34
|
+
},
|
|
32
35
|
"quality": {
|
|
33
36
|
"properties": {
|
|
34
37
|
"avif": {
|
|
@@ -55,7 +58,10 @@
|
|
|
55
58
|
},
|
|
56
59
|
"service": {
|
|
57
60
|
"description": "How images are optimized: \"build\" runs Sharp at build time; \"cloudflare\" emits /cdn-cgi/image transform URLs served by Cloudflare Image Transformations (requires the feature to be enabled on the serving zone).",
|
|
58
|
-
"enum": [
|
|
61
|
+
"enum": [
|
|
62
|
+
"build",
|
|
63
|
+
"cloudflare"
|
|
64
|
+
],
|
|
59
65
|
"type": "string"
|
|
60
66
|
},
|
|
61
67
|
"sizes": {
|
|
@@ -84,11 +90,11 @@
|
|
|
84
90
|
"type": "string"
|
|
85
91
|
},
|
|
86
92
|
"items": {
|
|
87
|
-
"$ref": "
|
|
93
|
+
"$ref": "#/$defs/Fields"
|
|
88
94
|
},
|
|
89
95
|
"properties": {
|
|
90
96
|
"additionalProperties": {
|
|
91
|
-
"$ref": "
|
|
97
|
+
"$ref": "#/$defs/Fields"
|
|
92
98
|
},
|
|
93
99
|
"type": "object"
|
|
94
100
|
},
|
|
@@ -99,11 +105,20 @@
|
|
|
99
105
|
"type": "array"
|
|
100
106
|
},
|
|
101
107
|
"type": {
|
|
102
|
-
"enum": [
|
|
108
|
+
"enum": [
|
|
109
|
+
"string",
|
|
110
|
+
"number",
|
|
111
|
+
"integer",
|
|
112
|
+
"boolean",
|
|
113
|
+
"array",
|
|
114
|
+
"object"
|
|
115
|
+
],
|
|
103
116
|
"type": "string"
|
|
104
117
|
}
|
|
105
118
|
},
|
|
106
|
-
"required": [
|
|
119
|
+
"required": [
|
|
120
|
+
"type"
|
|
121
|
+
],
|
|
107
122
|
"type": "object"
|
|
108
123
|
},
|
|
109
124
|
"RelationshipRef": {
|
|
@@ -117,7 +132,9 @@
|
|
|
117
132
|
"type": "string"
|
|
118
133
|
}
|
|
119
134
|
},
|
|
120
|
-
"required": [
|
|
135
|
+
"required": [
|
|
136
|
+
"$ref"
|
|
137
|
+
],
|
|
121
138
|
"type": "object"
|
|
122
139
|
},
|
|
123
140
|
"StyleObject": {
|
|
@@ -130,7 +147,7 @@
|
|
|
130
147
|
"type": "number"
|
|
131
148
|
},
|
|
132
149
|
{
|
|
133
|
-
"$ref": "#/$defs/StyleObject"
|
|
150
|
+
"$ref": "#/$defs/project-core-v2/$defs/StyleObject"
|
|
134
151
|
}
|
|
135
152
|
]
|
|
136
153
|
},
|
|
@@ -139,7 +156,6 @@
|
|
|
139
156
|
"type": "object"
|
|
140
157
|
}
|
|
141
158
|
},
|
|
142
|
-
"$id": "https://jxsuite.com/schema/project/core/v2",
|
|
143
159
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
144
160
|
"description": "Core fragment of the Jx project.json schema. Open by design: extension fragments contribute their own top-level sections and the generated per-project entry document (project.schema.json) closes the composition. See specs/extensions.md §5.",
|
|
145
161
|
"properties": {
|
|
@@ -158,7 +174,9 @@
|
|
|
158
174
|
"type": "string"
|
|
159
175
|
}
|
|
160
176
|
},
|
|
161
|
-
"required": [
|
|
177
|
+
"required": [
|
|
178
|
+
"$ref"
|
|
179
|
+
],
|
|
162
180
|
"type": "object"
|
|
163
181
|
},
|
|
164
182
|
{
|
|
@@ -228,7 +246,13 @@
|
|
|
228
246
|
"properties": {
|
|
229
247
|
"adapter": {
|
|
230
248
|
"description": "Platform adapter for deployment-specific output.",
|
|
231
|
-
"enum": [
|
|
249
|
+
"enum": [
|
|
250
|
+
"static",
|
|
251
|
+
"cloudflare-pages",
|
|
252
|
+
"cloudflare-workers",
|
|
253
|
+
"node",
|
|
254
|
+
"bun"
|
|
255
|
+
],
|
|
232
256
|
"type": "string"
|
|
233
257
|
},
|
|
234
258
|
"deploy": {
|
|
@@ -250,17 +274,26 @@
|
|
|
250
274
|
},
|
|
251
275
|
"provider": {
|
|
252
276
|
"description": "Hosting provider the project is connected to.",
|
|
253
|
-
"enum": [
|
|
277
|
+
"enum": [
|
|
278
|
+
"cloudflare-pages"
|
|
279
|
+
],
|
|
254
280
|
"type": "string"
|
|
255
281
|
}
|
|
256
282
|
},
|
|
257
|
-
"required": [
|
|
283
|
+
"required": [
|
|
284
|
+
"provider",
|
|
285
|
+
"accountId",
|
|
286
|
+
"projectName"
|
|
287
|
+
],
|
|
258
288
|
"type": "object"
|
|
259
289
|
},
|
|
260
290
|
"format": {
|
|
261
291
|
"default": "directory",
|
|
262
292
|
"description": "Reserved; currently unused. Accepted for forward compatibility with single-file output (desktop single-file mode) — the build emits per-route directories regardless.",
|
|
263
|
-
"enum": [
|
|
293
|
+
"enum": [
|
|
294
|
+
"directory",
|
|
295
|
+
"single"
|
|
296
|
+
],
|
|
264
297
|
"type": "string"
|
|
265
298
|
},
|
|
266
299
|
"outDir": {
|
|
@@ -268,6 +301,167 @@
|
|
|
268
301
|
"description": "Output directory for compiled site.",
|
|
269
302
|
"type": "string"
|
|
270
303
|
},
|
|
304
|
+
"headers": {
|
|
305
|
+
"additionalProperties": false,
|
|
306
|
+
"description": "Emit dist/_headers — the response headers only the build can know. Honored by Cloudflare Pages/Workers assets and Netlify; on the node/bun adapters the file documents what a reverse proxy in front of them must send.",
|
|
307
|
+
"properties": {
|
|
308
|
+
"cache": {
|
|
309
|
+
"default": "auto",
|
|
310
|
+
"description": "\"auto\" marks the content-addressed image variants immutable (RFC 8246) and revalidates everything else (RFC 9111). \"off\" emits no Cache-Control at all.",
|
|
311
|
+
"enum": [
|
|
312
|
+
"auto",
|
|
313
|
+
"off"
|
|
314
|
+
],
|
|
315
|
+
"type": "string"
|
|
316
|
+
},
|
|
317
|
+
"enabled": {
|
|
318
|
+
"default": true,
|
|
319
|
+
"type": "boolean"
|
|
320
|
+
},
|
|
321
|
+
"rules": {
|
|
322
|
+
"additionalProperties": {
|
|
323
|
+
"additionalProperties": {
|
|
324
|
+
"type": "string"
|
|
325
|
+
},
|
|
326
|
+
"type": "object"
|
|
327
|
+
},
|
|
328
|
+
"description": "Verbatim rules, merged after the generated block.",
|
|
329
|
+
"propertyNames": {
|
|
330
|
+
"pattern": "^/"
|
|
331
|
+
},
|
|
332
|
+
"type": "object"
|
|
333
|
+
},
|
|
334
|
+
"security": {
|
|
335
|
+
"additionalProperties": false,
|
|
336
|
+
"properties": {
|
|
337
|
+
"contentTypeOptions": {
|
|
338
|
+
"default": true,
|
|
339
|
+
"type": "boolean"
|
|
340
|
+
},
|
|
341
|
+
"csp": {
|
|
342
|
+
"default": false,
|
|
343
|
+
"description": "CSP Level 3. Off by default: unlike the other security headers this one governs code the build cannot see — a third-party script that loads a second script, a widget that opens a frame — so turning it on is a change to verify in the browser console, not a safe default. `script-src` is derived from the inline scripts and external origins the build emitted; `style-src` keeps 'unsafe-inline', because per-page <style> blocks and per-element style attributes have no site-wide hash.",
|
|
344
|
+
"oneOf": [
|
|
345
|
+
{
|
|
346
|
+
"type": "boolean"
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
"const": "report-only"
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
"additionalProperties": false,
|
|
353
|
+
"properties": {
|
|
354
|
+
"directives": {
|
|
355
|
+
"additionalProperties": {
|
|
356
|
+
"oneOf": [
|
|
357
|
+
{
|
|
358
|
+
"type": "string"
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
"const": false
|
|
362
|
+
}
|
|
363
|
+
]
|
|
364
|
+
},
|
|
365
|
+
"description": "Replace (string) or remove (false) a computed directive. A replacement is wholesale, so an addition restates the defaults.",
|
|
366
|
+
"type": "object"
|
|
367
|
+
},
|
|
368
|
+
"mode": {
|
|
369
|
+
"default": "enforce",
|
|
370
|
+
"enum": [
|
|
371
|
+
"enforce",
|
|
372
|
+
"report-only"
|
|
373
|
+
]
|
|
374
|
+
},
|
|
375
|
+
"reportUri": {
|
|
376
|
+
"format": "uri-reference",
|
|
377
|
+
"type": "string"
|
|
378
|
+
}
|
|
379
|
+
},
|
|
380
|
+
"type": "object"
|
|
381
|
+
}
|
|
382
|
+
]
|
|
383
|
+
},
|
|
384
|
+
"frameOptions": {
|
|
385
|
+
"default": "SAMEORIGIN",
|
|
386
|
+
"oneOf": [
|
|
387
|
+
{
|
|
388
|
+
"enum": [
|
|
389
|
+
"DENY",
|
|
390
|
+
"SAMEORIGIN"
|
|
391
|
+
],
|
|
392
|
+
"type": "string"
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
"const": false
|
|
396
|
+
}
|
|
397
|
+
]
|
|
398
|
+
},
|
|
399
|
+
"hsts": {
|
|
400
|
+
"default": false,
|
|
401
|
+
"description": "RFC 6797. Off by default: a wrong max-age locks the apex domain to HTTPS for that long, and the mistake is invisible until a certificate lapses. `preload` requires `includeSubDomains` and is a build error without it.",
|
|
402
|
+
"oneOf": [
|
|
403
|
+
{
|
|
404
|
+
"type": "boolean"
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
"additionalProperties": false,
|
|
408
|
+
"properties": {
|
|
409
|
+
"includeSubDomains": {
|
|
410
|
+
"default": true,
|
|
411
|
+
"type": "boolean"
|
|
412
|
+
},
|
|
413
|
+
"maxAge": {
|
|
414
|
+
"default": 31536000,
|
|
415
|
+
"minimum": 0,
|
|
416
|
+
"type": "integer"
|
|
417
|
+
},
|
|
418
|
+
"preload": {
|
|
419
|
+
"default": false,
|
|
420
|
+
"type": "boolean"
|
|
421
|
+
}
|
|
422
|
+
},
|
|
423
|
+
"type": "object"
|
|
424
|
+
}
|
|
425
|
+
]
|
|
426
|
+
},
|
|
427
|
+
"permissionsPolicy": {
|
|
428
|
+
"default": "camera=(), microphone=(), geolocation=()",
|
|
429
|
+
"oneOf": [
|
|
430
|
+
{
|
|
431
|
+
"type": "string"
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
"const": false
|
|
435
|
+
}
|
|
436
|
+
]
|
|
437
|
+
},
|
|
438
|
+
"referrerPolicy": {
|
|
439
|
+
"default": "strict-origin-when-cross-origin",
|
|
440
|
+
"oneOf": [
|
|
441
|
+
{
|
|
442
|
+
"enum": [
|
|
443
|
+
"no-referrer",
|
|
444
|
+
"no-referrer-when-downgrade",
|
|
445
|
+
"origin",
|
|
446
|
+
"origin-when-cross-origin",
|
|
447
|
+
"same-origin",
|
|
448
|
+
"strict-origin",
|
|
449
|
+
"strict-origin-when-cross-origin",
|
|
450
|
+
"unsafe-url"
|
|
451
|
+
],
|
|
452
|
+
"type": "string"
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
"const": false
|
|
456
|
+
}
|
|
457
|
+
]
|
|
458
|
+
}
|
|
459
|
+
},
|
|
460
|
+
"type": "object"
|
|
461
|
+
}
|
|
462
|
+
},
|
|
463
|
+
"type": "object"
|
|
464
|
+
},
|
|
271
465
|
"sitemap": {
|
|
272
466
|
"default": true,
|
|
273
467
|
"description": "Generate sitemap.xml from the route table (requires `url`). Set false to disable.",
|
|
@@ -276,7 +470,11 @@
|
|
|
276
470
|
"trailingSlash": {
|
|
277
471
|
"default": "always",
|
|
278
472
|
"description": "Trailing slash behavior for generated URLs.",
|
|
279
|
-
"enum": [
|
|
473
|
+
"enum": [
|
|
474
|
+
"always",
|
|
475
|
+
"never",
|
|
476
|
+
"ignore"
|
|
477
|
+
],
|
|
280
478
|
"type": "string"
|
|
281
479
|
}
|
|
282
480
|
},
|
|
@@ -297,15 +495,26 @@
|
|
|
297
495
|
"description": "Default charset for the page.",
|
|
298
496
|
"type": "string"
|
|
299
497
|
},
|
|
498
|
+
"dir": {
|
|
499
|
+
"description": "Base direction for the <html> element. Omitted when unset — a page's `$dir` overrides it. Right-to-left content renders left-to-right without this.",
|
|
500
|
+
"enum": [
|
|
501
|
+
"ltr",
|
|
502
|
+
"rtl",
|
|
503
|
+
"auto"
|
|
504
|
+
],
|
|
505
|
+
"type": "string"
|
|
506
|
+
},
|
|
300
507
|
"lang": {
|
|
301
508
|
"default": "en",
|
|
302
|
-
"description": "Default lang attribute for the <html> element.",
|
|
509
|
+
"description": "Default lang attribute for the <html> element. A page's `$lang` overrides it.",
|
|
303
510
|
"type": "string"
|
|
304
511
|
},
|
|
305
512
|
"layout": {
|
|
306
513
|
"default": null,
|
|
307
514
|
"description": "Default layout file path applied to all pages. Set to null to render pages without a layout.",
|
|
308
|
-
"examples": [
|
|
515
|
+
"examples": [
|
|
516
|
+
"./layouts/base.json"
|
|
517
|
+
],
|
|
309
518
|
"oneOf": [
|
|
310
519
|
{
|
|
311
520
|
"type": "string"
|
|
@@ -314,44 +523,262 @@
|
|
|
314
523
|
"type": "null"
|
|
315
524
|
}
|
|
316
525
|
]
|
|
526
|
+
},
|
|
527
|
+
"shadow": {
|
|
528
|
+
"default": false,
|
|
529
|
+
"description": "Default shadow-DOM mode for every component (spec.md §16.6). Off unless set: a shadow root isolates component styles from the page and replaces the <slot> emulation with real slot distribution. A component's own `$shadow` overrides this in both directions.",
|
|
530
|
+
"oneOf": [
|
|
531
|
+
{
|
|
532
|
+
"enum": [
|
|
533
|
+
"open",
|
|
534
|
+
"closed"
|
|
535
|
+
],
|
|
536
|
+
"type": "string"
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
"const": false,
|
|
540
|
+
"type": "boolean"
|
|
541
|
+
}
|
|
542
|
+
]
|
|
317
543
|
}
|
|
318
544
|
},
|
|
319
545
|
"type": "object"
|
|
320
546
|
},
|
|
321
547
|
"extensions": {
|
|
322
548
|
"description": "Extension packages: bare package names (resolved project-first through the package exports map) or relative paths. Each must export jx-extension.json.",
|
|
323
|
-
"examples": [
|
|
549
|
+
"examples": [
|
|
550
|
+
[
|
|
551
|
+
"@jxsuite/parser"
|
|
552
|
+
]
|
|
553
|
+
],
|
|
324
554
|
"items": {
|
|
325
555
|
"type": "string"
|
|
326
556
|
},
|
|
327
557
|
"type": "array"
|
|
328
558
|
},
|
|
559
|
+
"manifest": {
|
|
560
|
+
"additionalProperties": false,
|
|
561
|
+
"description": "W3C Web App Manifest, emitted as manifest.webmanifest with a <link rel=\"manifest\"> on every page. Absent means no manifest: it is a claim that a site is meant to be installed, and most are not.",
|
|
562
|
+
"properties": {
|
|
563
|
+
"backgroundColor": {
|
|
564
|
+
"type": "string"
|
|
565
|
+
},
|
|
566
|
+
"categories": {
|
|
567
|
+
"items": {
|
|
568
|
+
"type": "string"
|
|
569
|
+
},
|
|
570
|
+
"type": "array"
|
|
571
|
+
},
|
|
572
|
+
"description": {
|
|
573
|
+
"type": "string"
|
|
574
|
+
},
|
|
575
|
+
"dir": {
|
|
576
|
+
"enum": [
|
|
577
|
+
"ltr",
|
|
578
|
+
"rtl",
|
|
579
|
+
"auto"
|
|
580
|
+
],
|
|
581
|
+
"type": "string"
|
|
582
|
+
},
|
|
583
|
+
"display": {
|
|
584
|
+
"default": "standalone",
|
|
585
|
+
"enum": [
|
|
586
|
+
"fullscreen",
|
|
587
|
+
"standalone",
|
|
588
|
+
"minimal-ui",
|
|
589
|
+
"browser"
|
|
590
|
+
],
|
|
591
|
+
"type": "string"
|
|
592
|
+
},
|
|
593
|
+
"enabled": {
|
|
594
|
+
"default": true,
|
|
595
|
+
"type": "boolean"
|
|
596
|
+
},
|
|
597
|
+
"icons": {
|
|
598
|
+
"description": "Icons at 192px and 512px are what browsers require before offering to install the site; the build warns when either is missing.",
|
|
599
|
+
"items": {
|
|
600
|
+
"additionalProperties": false,
|
|
601
|
+
"properties": {
|
|
602
|
+
"purpose": {
|
|
603
|
+
"type": "string"
|
|
604
|
+
},
|
|
605
|
+
"sizes": {
|
|
606
|
+
"examples": [
|
|
607
|
+
"192x192"
|
|
608
|
+
],
|
|
609
|
+
"type": "string"
|
|
610
|
+
},
|
|
611
|
+
"src": {
|
|
612
|
+
"type": "string"
|
|
613
|
+
},
|
|
614
|
+
"type": {
|
|
615
|
+
"type": "string"
|
|
616
|
+
}
|
|
617
|
+
},
|
|
618
|
+
"required": [
|
|
619
|
+
"src"
|
|
620
|
+
],
|
|
621
|
+
"type": "object"
|
|
622
|
+
},
|
|
623
|
+
"type": "array"
|
|
624
|
+
},
|
|
625
|
+
"lang": {
|
|
626
|
+
"type": "string"
|
|
627
|
+
},
|
|
628
|
+
"name": {
|
|
629
|
+
"description": "Defaults to the project name.",
|
|
630
|
+
"type": "string"
|
|
631
|
+
},
|
|
632
|
+
"orientation": {
|
|
633
|
+
"type": "string"
|
|
634
|
+
},
|
|
635
|
+
"scope": {
|
|
636
|
+
"type": "string"
|
|
637
|
+
},
|
|
638
|
+
"shortName": {
|
|
639
|
+
"type": "string"
|
|
640
|
+
},
|
|
641
|
+
"startUrl": {
|
|
642
|
+
"default": "/",
|
|
643
|
+
"type": "string"
|
|
644
|
+
},
|
|
645
|
+
"themeColor": {
|
|
646
|
+
"type": "string"
|
|
647
|
+
}
|
|
648
|
+
},
|
|
649
|
+
"type": "object"
|
|
650
|
+
},
|
|
651
|
+
"serviceWorker": {
|
|
652
|
+
"default": false,
|
|
653
|
+
"description": "W3C Service Worker, emitted as sw.js. Off unless declared — a worker is sticky, so it is the one output that can keep breaking visitors after a deploy tries to fix them. **Turning it off means `false`, not deleting the key**: `false` emits a tombstone at the same URL that unregisters the old worker and clears its caches, and a 404 there is not an instruction to stop. HTML is always network-first; only the content-addressed /images/_optimized/* is served cache-first.",
|
|
654
|
+
"oneOf": [
|
|
655
|
+
{
|
|
656
|
+
"type": "boolean"
|
|
657
|
+
},
|
|
658
|
+
{
|
|
659
|
+
"additionalProperties": false,
|
|
660
|
+
"properties": {
|
|
661
|
+
"enabled": {
|
|
662
|
+
"default": true,
|
|
663
|
+
"type": "boolean"
|
|
664
|
+
},
|
|
665
|
+
"offlineFallback": {
|
|
666
|
+
"description": "Page served for a failed navigation. Added to `precache` if not already there.",
|
|
667
|
+
"type": "string"
|
|
668
|
+
},
|
|
669
|
+
"precache": {
|
|
670
|
+
"description": "Site-absolute URLs fetched at install time. Each must be a file this build produces; one that is not fails the build, because a single unreachable entry stops the worker installing at all.",
|
|
671
|
+
"items": {
|
|
672
|
+
"pattern": "^/",
|
|
673
|
+
"type": "string"
|
|
674
|
+
},
|
|
675
|
+
"type": "array"
|
|
676
|
+
},
|
|
677
|
+
"scope": {
|
|
678
|
+
"default": "/",
|
|
679
|
+
"type": "string"
|
|
680
|
+
}
|
|
681
|
+
},
|
|
682
|
+
"type": "object"
|
|
683
|
+
}
|
|
684
|
+
]
|
|
685
|
+
},
|
|
686
|
+
"securityTxt": {
|
|
687
|
+
"additionalProperties": false,
|
|
688
|
+
"description": "RFC 9116 security.txt, emitted at .well-known/security.txt. `expires` is required by §2.5.5 and an absent or past value is a build error — an expired file advertises a reporting channel while telling the reporter not to trust it. A hand-placed public/.well-known/security.txt shadows this, which is how a clearsigned file ships.",
|
|
689
|
+
"properties": {
|
|
690
|
+
"acknowledgments": {
|
|
691
|
+
"items": {
|
|
692
|
+
"type": "string"
|
|
693
|
+
},
|
|
694
|
+
"type": "array"
|
|
695
|
+
},
|
|
696
|
+
"canonical": {
|
|
697
|
+
"type": "string"
|
|
698
|
+
},
|
|
699
|
+
"contact": {
|
|
700
|
+
"description": "At least one mailto:, https: or tel: URI (§2.5.3).",
|
|
701
|
+
"items": {
|
|
702
|
+
"type": "string"
|
|
703
|
+
},
|
|
704
|
+
"type": "array"
|
|
705
|
+
},
|
|
706
|
+
"enabled": {
|
|
707
|
+
"default": true,
|
|
708
|
+
"type": "boolean"
|
|
709
|
+
},
|
|
710
|
+
"encryption": {
|
|
711
|
+
"items": {
|
|
712
|
+
"type": "string"
|
|
713
|
+
},
|
|
714
|
+
"type": "array"
|
|
715
|
+
},
|
|
716
|
+
"expires": {
|
|
717
|
+
"format": "date-time",
|
|
718
|
+
"type": "string"
|
|
719
|
+
},
|
|
720
|
+
"hiring": {
|
|
721
|
+
"items": {
|
|
722
|
+
"type": "string"
|
|
723
|
+
},
|
|
724
|
+
"type": "array"
|
|
725
|
+
},
|
|
726
|
+
"policy": {
|
|
727
|
+
"items": {
|
|
728
|
+
"type": "string"
|
|
729
|
+
},
|
|
730
|
+
"type": "array"
|
|
731
|
+
},
|
|
732
|
+
"preferredLanguages": {
|
|
733
|
+
"description": "BCP 47 tags, validated and canonicalized like i18n.locales.",
|
|
734
|
+
"items": {
|
|
735
|
+
"pattern": "^[A-Za-z]{2,8}(-[A-Za-z0-9]{1,8})*$",
|
|
736
|
+
"type": "string"
|
|
737
|
+
},
|
|
738
|
+
"type": "array"
|
|
739
|
+
}
|
|
740
|
+
},
|
|
741
|
+
"type": "object"
|
|
742
|
+
},
|
|
329
743
|
"i18n": {
|
|
330
744
|
"description": "Internationalization configuration.",
|
|
331
745
|
"properties": {
|
|
332
746
|
"defaultLocale": {
|
|
333
|
-
"description": "Default locale
|
|
334
|
-
"examples": [
|
|
747
|
+
"description": "Default locale, as a BCP 47 language tag. The pattern catches shape errors (`en_US`, `en--US`); the build is the authority on well-formedness.",
|
|
748
|
+
"examples": [
|
|
749
|
+
"en"
|
|
750
|
+
],
|
|
751
|
+
"pattern": "^[A-Za-z]{2,8}(-[A-Za-z0-9]{1,8})*$",
|
|
335
752
|
"type": "string"
|
|
336
753
|
},
|
|
337
754
|
"locales": {
|
|
338
|
-
"description": "Available
|
|
339
|
-
"examples": [
|
|
755
|
+
"description": "Available locales, as BCP 47 language tags.",
|
|
756
|
+
"examples": [
|
|
757
|
+
[
|
|
758
|
+
"en",
|
|
759
|
+
"fr",
|
|
760
|
+
"de"
|
|
761
|
+
]
|
|
762
|
+
],
|
|
340
763
|
"items": {
|
|
764
|
+
"pattern": "^[A-Za-z]{2,8}(-[A-Za-z0-9]{1,8})*$",
|
|
341
765
|
"type": "string"
|
|
342
766
|
},
|
|
343
767
|
"type": "array"
|
|
344
768
|
},
|
|
345
769
|
"routing": {
|
|
346
770
|
"description": "Locale routing strategy.",
|
|
347
|
-
"enum": [
|
|
771
|
+
"enum": [
|
|
772
|
+
"prefix-except-default",
|
|
773
|
+
"prefix-always"
|
|
774
|
+
],
|
|
348
775
|
"type": "string"
|
|
349
776
|
}
|
|
350
777
|
},
|
|
351
778
|
"type": "object"
|
|
352
779
|
},
|
|
353
780
|
"images": {
|
|
354
|
-
"$ref": "#/$defs/ImageConfig"
|
|
781
|
+
"$ref": "#/$defs/project-core-v2/$defs/ImageConfig"
|
|
355
782
|
},
|
|
356
783
|
"imports": {
|
|
357
784
|
"additionalProperties": {
|
|
@@ -369,19 +796,81 @@
|
|
|
369
796
|
"name": {
|
|
370
797
|
"default": "Jx Site",
|
|
371
798
|
"description": "Human-readable project name.",
|
|
372
|
-
"examples": [
|
|
799
|
+
"examples": [
|
|
800
|
+
"My Portfolio",
|
|
801
|
+
"Jx Example Site"
|
|
802
|
+
],
|
|
373
803
|
"type": "string"
|
|
374
804
|
},
|
|
375
805
|
"redirects": {
|
|
376
806
|
"additionalProperties": {
|
|
377
|
-
"
|
|
807
|
+
"oneOf": [
|
|
808
|
+
{
|
|
809
|
+
"description": "Destination path or URL; implies a 301.",
|
|
810
|
+
"type": "string"
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
"additionalProperties": false,
|
|
814
|
+
"description": "A redirect with an explicit RFC 9110 §15.4 status.",
|
|
815
|
+
"properties": {
|
|
816
|
+
"destination": {
|
|
817
|
+
"type": "string"
|
|
818
|
+
},
|
|
819
|
+
"status": {
|
|
820
|
+
"default": 301,
|
|
821
|
+
"description": "RFC 9110 §15.4 redirection status. 307 and 308 preserve the request method; 301 and 302 historically do not.",
|
|
822
|
+
"enum": [
|
|
823
|
+
301,
|
|
824
|
+
302,
|
|
825
|
+
303,
|
|
826
|
+
307,
|
|
827
|
+
308
|
|
828
|
+
],
|
|
829
|
+
"type": "integer"
|
|
830
|
+
}
|
|
831
|
+
},
|
|
832
|
+
"required": [
|
|
833
|
+
"destination"
|
|
834
|
+
],
|
|
835
|
+
"type": "object"
|
|
836
|
+
},
|
|
837
|
+
{
|
|
838
|
+
"additionalProperties": false,
|
|
839
|
+
"description": "A rewrite (proxy): the destination's content is served AT the source URL, with no redirect. Emitted as status 200 in `_redirects`, which is the host convention — not an HTTP redirection status.",
|
|
840
|
+
"properties": {
|
|
841
|
+
"destination": {
|
|
842
|
+
"type": "string"
|
|
843
|
+
},
|
|
844
|
+
"rewrite": {
|
|
845
|
+
"const": true,
|
|
846
|
+
"type": "boolean"
|
|
847
|
+
}
|
|
848
|
+
},
|
|
849
|
+
"required": [
|
|
850
|
+
"destination",
|
|
851
|
+
"rewrite"
|
|
852
|
+
],
|
|
853
|
+
"type": "object"
|
|
854
|
+
}
|
|
855
|
+
]
|
|
378
856
|
},
|
|
379
|
-
"description": "Static redirect rules.
|
|
857
|
+
"description": "Static redirect and rewrite rules. Keys are source paths in URLPattern pathname syntax.",
|
|
380
858
|
"examples": [
|
|
381
859
|
{
|
|
860
|
+
"/api/*": {
|
|
861
|
+
"destination": "https://api.example.com/*",
|
|
862
|
+
"rewrite": true
|
|
863
|
+
},
|
|
864
|
+
"/legacy/*": {
|
|
865
|
+
"destination": "/archive/*",
|
|
866
|
+
"status": 308
|
|
867
|
+
},
|
|
382
868
|
"/old-about": "/about"
|
|
383
869
|
}
|
|
384
870
|
],
|
|
871
|
+
"propertyNames": {
|
|
872
|
+
"pattern": "^/"
|
|
873
|
+
},
|
|
385
874
|
"type": "object"
|
|
386
875
|
},
|
|
387
876
|
"state": {
|
|
@@ -398,7 +887,7 @@
|
|
|
398
887
|
"type": "number"
|
|
399
888
|
},
|
|
400
889
|
{
|
|
401
|
-
"$ref": "#/$defs/StyleObject"
|
|
890
|
+
"$ref": "#/$defs/project-core-v2/$defs/StyleObject"
|
|
402
891
|
}
|
|
403
892
|
]
|
|
404
893
|
},
|
|
@@ -407,15 +896,17 @@
|
|
|
407
896
|
},
|
|
408
897
|
"url": {
|
|
409
898
|
"description": "Production URL of the deployed site.",
|
|
410
|
-
"examples": [
|
|
899
|
+
"examples": [
|
|
900
|
+
"https://example.com",
|
|
901
|
+
"https://jxsuite.com"
|
|
902
|
+
],
|
|
411
903
|
"type": "string"
|
|
412
904
|
}
|
|
413
905
|
},
|
|
414
906
|
"title": "Jx Project Core",
|
|
415
907
|
"type": "object"
|
|
416
908
|
},
|
|
417
|
-
"
|
|
418
|
-
"$id": "https://jxsuite.com/schema/ext/parser/project/v1",
|
|
909
|
+
"ext-parser-project-v1": {
|
|
419
910
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
420
911
|
"title": "Parser project fragment",
|
|
421
912
|
"description": "Project-schema fragment contributed by @jxsuite/parser: the `content` section declaring file-based content collections.",
|
|
@@ -440,7 +931,9 @@
|
|
|
440
931
|
"type": "string"
|
|
441
932
|
}
|
|
442
933
|
},
|
|
443
|
-
"required": [
|
|
934
|
+
"required": [
|
|
935
|
+
"$ref"
|
|
936
|
+
]
|
|
444
937
|
},
|
|
445
938
|
{
|
|
446
939
|
"type": "string"
|
|
@@ -463,7 +956,7 @@
|
|
|
463
956
|
"description": "Field definitions; values are field schemas from the effective project field union.",
|
|
464
957
|
"type": "object",
|
|
465
958
|
"additionalProperties": {
|
|
466
|
-
"$ref": "
|
|
959
|
+
"$ref": "#/$defs/Fields"
|
|
467
960
|
}
|
|
468
961
|
},
|
|
469
962
|
"required": {
|
|
@@ -477,7 +970,10 @@
|
|
|
477
970
|
},
|
|
478
971
|
"source": {
|
|
479
972
|
"description": "Path to the content directory relative to the project root.",
|
|
480
|
-
"examples": [
|
|
973
|
+
"examples": [
|
|
974
|
+
"./content/blog/",
|
|
975
|
+
"./content/docs/"
|
|
976
|
+
],
|
|
481
977
|
"type": "string"
|
|
482
978
|
}
|
|
483
979
|
}
|
|
@@ -489,10 +985,10 @@
|
|
|
489
985
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
490
986
|
"allOf": [
|
|
491
987
|
{
|
|
492
|
-
"$ref": "
|
|
988
|
+
"$ref": "#/$defs/project-core-v2"
|
|
493
989
|
},
|
|
494
990
|
{
|
|
495
|
-
"$ref": "
|
|
991
|
+
"$ref": "#/$defs/ext-parser-project-v1"
|
|
496
992
|
}
|
|
497
993
|
],
|
|
498
994
|
"type": "object",
|