@elytracms/studio 0.0.95 → 0.0.97
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/convex/cms.ts +272 -16
- package/convex/delivery-folded-drift.test.ts +104 -0
- package/convex/delivery.ts +24 -8
- package/convex/depth-codec-lookalike.test.ts +192 -0
- package/convex/fixture-accounts.test.ts +305 -0
- package/convex/fixtureAccounts.ts +298 -0
- package/convex/incarnation.test.ts +149 -0
- package/convex/ingest.test.ts +145 -3
- package/convex/ingest.ts +123 -17
- package/convex/receipt-races.test.ts +184 -0
- package/convex/records-zod-copy.test.ts +76 -0
- package/convex/schema.ts +20 -1
- package/convex/strict-delete.test.ts +129 -0
- package/convex/strict-reference-race.test.ts +139 -0
- package/dist/components/ai/ai-chat-panel.js +15 -2
- package/dist/components/ai/ai-chat-panel.js.map +1 -1
- package/dist/components/ai/translate-document-action.d.ts +6 -0
- package/dist/components/ai/translate-document-action.js.map +1 -1
- package/dist/components/ai/translate-document-dialog.d.ts +1 -1
- package/dist/components/ai/translate-document-dialog.js +5 -5
- package/dist/components/ai/translate-document-dialog.js.map +1 -1
- package/dist/components/assets/asset-detail.js +5 -2
- package/dist/components/assets/asset-detail.js.map +1 -1
- package/dist/components/assets/asset-locale.d.ts +7 -0
- package/dist/components/assets/asset-locale.js +16 -2
- package/dist/components/assets/asset-locale.js.map +1 -1
- package/dist/components/assets/asset-meta-drift-notice.d.ts +13 -0
- package/dist/components/assets/asset-meta-drift-notice.js +22 -0
- package/dist/components/assets/asset-meta-drift-notice.js.map +1 -0
- package/dist/components/assets/asset-meta-label.d.ts +2 -1
- package/dist/components/assets/asset-meta-label.js +4 -2
- package/dist/components/assets/asset-meta-label.js.map +1 -1
- package/dist/components/assets/asset-metadata.d.ts +33 -13
- package/dist/components/assets/asset-metadata.js +46 -22
- package/dist/components/assets/asset-metadata.js.map +1 -1
- package/dist/components/assets/asset-search.d.ts +6 -2
- package/dist/components/assets/asset-search.js +15 -5
- package/dist/components/assets/asset-search.js.map +1 -1
- package/dist/components/assets/assets-collection-view-source.d.ts +5 -3
- package/dist/components/assets/assets-collection-view-source.js +7 -5
- package/dist/components/assets/assets-collection-view-source.js.map +1 -1
- package/dist/components/builder/canvas-rebase.d.ts +36 -12
- package/dist/components/builder/canvas-rebase.js +13 -3
- package/dist/components/builder/canvas-rebase.js.map +1 -1
- package/dist/components/builder/canvas-render-context.js +5 -4
- package/dist/components/builder/canvas-render-context.js.map +1 -1
- package/dist/components/builder/composition-field-editor.d.ts +12 -6
- package/dist/components/builder/composition-field-editor.js +6 -5
- package/dist/components/builder/composition-field-editor.js.map +1 -1
- package/dist/components/cms/asset-picker-core.d.ts +2 -2
- package/dist/components/cms/asset-picker-core.js +2 -2
- package/dist/components/cms/asset-picker-core.js.map +1 -1
- package/dist/components/cms/asset-picker.js +3 -1
- package/dist/components/cms/asset-picker.js.map +1 -1
- package/dist/components/cms/canvas-commit.d.ts +6 -0
- package/dist/components/cms/canvas-commit.js +5 -1
- package/dist/components/cms/canvas-commit.js.map +1 -1
- package/dist/components/cms/cms-store.d.ts +24 -8
- package/dist/components/cms/cms-store.js +21 -14
- package/dist/components/cms/cms-store.js.map +1 -1
- package/dist/components/cms/collection-table.js +4 -11
- package/dist/components/cms/collection-table.js.map +1 -1
- package/dist/components/cms/detail-editor.js +2 -2
- package/dist/components/cms/detail-editor.js.map +1 -1
- package/dist/components/cms/draft-commit.d.ts +16 -3
- package/dist/components/cms/draft-commit.js +3 -2
- package/dist/components/cms/draft-commit.js.map +1 -1
- package/dist/components/cms/use-document-draft.d.ts +107 -10
- package/dist/components/cms/use-document-draft.js +157 -42
- package/dist/components/cms/use-document-draft.js.map +1 -1
- package/dist/components/collection-view/cms-collection-view-source.js +6 -4
- package/dist/components/collection-view/cms-collection-view-source.js.map +1 -1
- package/dist/components/components/transfer-dialog.js +6 -4
- package/dist/components/components/transfer-dialog.js.map +1 -1
- package/dist/lib/ai/chat-state.d.ts +7 -0
- package/dist/lib/ai/chat-state.js.map +1 -1
- package/dist/lib/ai/tools.d.ts +8 -0
- package/dist/lib/ai/tools.js +4 -0
- package/dist/lib/ai/tools.js.map +1 -1
- package/dist/lib/cms-views/view-model.d.ts +15 -8
- package/dist/lib/cms-views/view-model.js +19 -5
- package/dist/lib/cms-views/view-model.js.map +1 -1
- package/dist/lib/collection-view/__fixtures__/document-writes.js +1 -0
- package/dist/lib/collection-view/__fixtures__/document-writes.js.map +1 -1
- package/dist/lib/collection-view/collection-view-source.d.ts +18 -7
- package/dist/lib/collection-view/collection-view-source.js.map +1 -1
- package/dist/lib/data/collection-content.js +5 -0
- package/dist/lib/data/collection-content.js.map +1 -1
- package/dist/lib/engine-version.d.ts +1 -1
- package/dist/lib/engine-version.js +1 -1
- package/dist/lib/engine-version.js.map +1 -1
- package/dist/lib/i18n/messages.de.js +15 -1
- package/dist/lib/i18n/messages.de.js.map +1 -1
- package/dist/lib/i18n/messages.en.d.ts +13 -0
- package/dist/lib/i18n/messages.en.js +16 -1
- package/dist/lib/i18n/messages.en.js.map +1 -1
- package/dist/lib/operations/cms-persistence.d.ts +119 -35
- package/dist/lib/operations/cms-persistence.js +441 -91
- package/dist/lib/operations/cms-persistence.js.map +1 -1
- package/dist/lib/persistence/convex-adapter.js +80 -8
- package/dist/lib/persistence/convex-adapter.js.map +1 -1
- package/dist/lib/persona/labels.js +2 -0
- package/dist/lib/persona/labels.js.map +1 -1
- package/package.json +4 -3
|
@@ -206,6 +206,8 @@ declare const MESSAGES: {
|
|
|
206
206
|
'operations.error.strictTargetsUnpublished': import("./types.js").SourceMessage;
|
|
207
207
|
'operations.error.publishNeedsLocales': import("./types.js").SourceMessage;
|
|
208
208
|
'operations.error.versionNotPinnable': import("./types.js").SourceMessage;
|
|
209
|
+
'operations.error.changesetBlocked': import("./types.js").SourceMessage;
|
|
210
|
+
'operations.error.changesetDeleteNotReversible': import("./types.js").SourceMessage;
|
|
209
211
|
'operations.errorDetail.andMore': import("./types.js").SourceMessage;
|
|
210
212
|
'content.queryError.nonFilterableField': import("./types.js").SourceMessage;
|
|
211
213
|
'content.queryError.unknownField': import("./types.js").SourceMessage;
|
|
@@ -220,6 +222,10 @@ declare const MESSAGES: {
|
|
|
220
222
|
'content.queryError.sortNotFilterable': import("./types.js").SourceMessage;
|
|
221
223
|
'content.queryError.sortUnknownField': import("./types.js").SourceMessage;
|
|
222
224
|
'content.queryError.sortDirection': import("./types.js").SourceMessage;
|
|
225
|
+
'content.queryError.sortShape': import("./types.js").SourceMessage;
|
|
226
|
+
'content.queryError.sortFieldName': import("./types.js").SourceMessage;
|
|
227
|
+
'content.queryError.sortKeyRenamed': import("./types.js").SourceMessage;
|
|
228
|
+
'content.queryError.sortUnknownKey': import("./types.js").SourceMessage;
|
|
223
229
|
'content.queryError.limitPositiveInteger': import("./types.js").SourceMessage;
|
|
224
230
|
'cms.index.heading': import("./types.js").SourceMessage;
|
|
225
231
|
'cms.index.description': import("./types.js").SourceMessage;
|
|
@@ -401,6 +407,7 @@ declare const MESSAGES: {
|
|
|
401
407
|
'cms.issue.cardinality-violation': import("./types.js").SourceMessage;
|
|
402
408
|
'cms.issue.unknown-asset': import("./types.js").SourceMessage;
|
|
403
409
|
'cms.issue.asset-without-url': import("./types.js").SourceMessage;
|
|
410
|
+
'cms.issue.asset-meta-drift': import("./types.js").SourceMessage;
|
|
404
411
|
'cms.issue.duplicate-document': import("./types.js").SourceMessage;
|
|
405
412
|
'cms.issue.unknown-locale': import("./types.js").SourceMessage;
|
|
406
413
|
'cms.issue.missing-localized-value': import("./types.js").SourceMessage;
|
|
@@ -419,6 +426,7 @@ declare const MESSAGES: {
|
|
|
419
426
|
'cms.issue.unaddressable-url': import("./types.js").SourceMessage;
|
|
420
427
|
'cms.issue.unknown-version': import("./types.js").SourceMessage;
|
|
421
428
|
'cms.issue.invalid-stored-document': import("./types.js").SourceMessage;
|
|
429
|
+
'cms.issue.props-not-judged': import("./types.js").SourceMessage;
|
|
422
430
|
'cms.issueBody.missing-required-field': import("./types.js").SourceMessage;
|
|
423
431
|
'cms.issueBody.missing-localized-value.default': import("./types.js").SourceMessage;
|
|
424
432
|
'cms.issueBody.missing-localized-value.fallback': import("./types.js").SourceMessage;
|
|
@@ -463,6 +471,7 @@ declare const MESSAGES: {
|
|
|
463
471
|
'cms.conflict.empty': import("./types.js").SourceMessage;
|
|
464
472
|
'cms.conflict.structured': import("./types.js").SourceMessage;
|
|
465
473
|
'cms.conflict.cellRefused': import("./types.js").SourceMessage;
|
|
474
|
+
'cms.conflict.unauthored': import("./types.js").SourceMessage;
|
|
466
475
|
'cms.presence.inField': import("./types.js").SourceMessage;
|
|
467
476
|
'cms.presence.inFieldMany': import("./types.js").SourceMessage;
|
|
468
477
|
'cms.presence.someone': import("./types.js").SourceMessage;
|
|
@@ -482,6 +491,7 @@ declare const MESSAGES: {
|
|
|
482
491
|
'cms.issueMessage.duplicateAlias': import("./types.js").SourceMessage;
|
|
483
492
|
'cms.issueMessage.unfilledSlot': import("./types.js").SourceMessage;
|
|
484
493
|
'cms.issueMessage.reservedFieldName': import("./types.js").SourceMessage;
|
|
494
|
+
'cms.issueMessage.reservedFieldTypeOption': import("./types.js").SourceMessage;
|
|
485
495
|
'cms.issueMessage.duplicateSelectOption': import("./types.js").SourceMessage;
|
|
486
496
|
'cms.issueMessage.duplicateObjectField': import("./types.js").SourceMessage;
|
|
487
497
|
'cms.issueMessage.assetCollectionSingleton': import("./types.js").SourceMessage;
|
|
@@ -700,6 +710,8 @@ declare const MESSAGES: {
|
|
|
700
710
|
'assets.viewToggle.grid': import("./types.js").SourceMessage;
|
|
701
711
|
'assets.detail.metadataHeading': import("./types.js").SourceMessage;
|
|
702
712
|
'assets.detail.noFileUrl': import("./types.js").SourceMessage;
|
|
713
|
+
'assets.detail.metaDriftNotLocalized': import("./types.js").SourceMessage;
|
|
714
|
+
'assets.detail.metaDriftUndeclared': import("./types.js").SourceMessage;
|
|
703
715
|
'assets.references.buttonLabel': import("./types.js").SourceMessage;
|
|
704
716
|
'assets.references.title': import("./types.js").SourceMessage;
|
|
705
717
|
'assets.references.description': import("./types.js").SourceMessage;
|
|
@@ -1122,6 +1134,7 @@ declare const MESSAGES: {
|
|
|
1122
1134
|
'builder.inspector.unset': import("./types.js").SourceMessage;
|
|
1123
1135
|
'builder.inspector.unsetWithHint': import("./types.js").SourceMessage;
|
|
1124
1136
|
'cms.issueMessage.nonCanonicalValue': import("./types.js").SourceMessage;
|
|
1137
|
+
'cms.issueMessage.propsNotJudged': import("./types.js").SourceMessage;
|
|
1125
1138
|
'cms.issueMessage.assetHoldsUrl': import("./types.js").SourceMessage;
|
|
1126
1139
|
'cms.issueMessage.emptyAllow': import("./types.js").SourceMessage;
|
|
1127
1140
|
'cms.issueMessage.unknownAllowComponent': import("./types.js").SourceMessage;
|
|
@@ -272,6 +272,9 @@ const MESSAGES = {
|
|
|
272
272
|
'operations.error.strictTargetsUnpublished': msg('Document “{target}” cannot be published: strict relation targets are missing or unpublished — publish them first.'),
|
|
273
273
|
'operations.error.publishNeedsLocales': msg('“{target}” cannot be published: its collection declares localized fields ({fields}), and no locale config was given to judge their hidden values in.', 'EC-585: a headless runtime publishing a localized collection without the project locale config; {fields} is a comma-separated list of field names.'),
|
|
274
274
|
'operations.error.versionNotPinnable': msg('Version {version} of “{target}” was not recorded by a publish, so it cannot be pinned live — restore it into the draft and publish that instead.', 'EC-585: only a version a publish recorded can be re-pinned; {version} is a number.'),
|
|
275
|
+
// EC-648 — changesets: apply blocked by an issue, and the step a changeset refuses because no undo can reverse it.
|
|
276
|
+
'operations.error.changesetBlocked': msg('Changeset “{changeset}” has blocking validation issues and cannot be applied.', '{changeset} is a changeset id, e.g. cs-0001; the blocking issues follow beneath it.'),
|
|
277
|
+
'operations.error.changesetDeleteNotReversible': msg('Step {step}: “{target}” cannot be deleted inside a changeset — a delete removes its version history and publication, which no undo can restore. Delete it on its own.', 'EC-648: {step} is the 0-based step number; {target} is the document key collection:id.'),
|
|
275
278
|
'operations.errorDetail.andMore': msg(', and {count} more', 'Truncation fragment spliced into the strict-reference sentences; keeps its leading comma and space.'),
|
|
276
279
|
// EC-494 — content-query errors (`core/content`'s validateWhere/validateSort/
|
|
277
280
|
// validateLimit). Two studio surfaces render them: the filter builder's per-clause
|
|
@@ -289,6 +292,11 @@ const MESSAGES = {
|
|
|
289
292
|
'content.queryError.sortNotFilterable': msg('Sort field "{field}" on "{collection}" is not declared filterable.'),
|
|
290
293
|
'content.queryError.sortUnknownField': msg('Sort field "{field}" does not exist on "{collection}".'),
|
|
291
294
|
'content.queryError.sortDirection': msg('Sort direction must be "asc" or "desc".'),
|
|
295
|
+
// EC-660 — THE sort shape (`{ field, direction? }`, strict) judged by validateSort.
|
|
296
|
+
'content.queryError.sortShape': msg('Sort must be an object { field, direction? }.', 'The braces are code — the literal shape of a sort; keep them and the key names untranslated.'),
|
|
297
|
+
'content.queryError.sortFieldName': msg('Sort field must be a non-empty field name.'),
|
|
298
|
+
'content.queryError.sortKeyRenamed': msg('Sort key "{key}" is spelled "{replacement}".', '{key} is a retired key name (dir), {replacement} the key that replaced it (direction) — identifiers.'),
|
|
299
|
+
'content.queryError.sortUnknownKey': msg('Sort key "{key}" is not read — a sort is { field, direction? }.', 'The braces are code — the literal shape of a sort; keep them and the key names untranslated.'),
|
|
292
300
|
'content.queryError.limitPositiveInteger': msg('Limit must be a positive integer.'),
|
|
293
301
|
// ─────────────────────────────────────────────────────────────────────────
|
|
294
302
|
// CMS — collection list / view bar / filters / cells
|
|
@@ -511,6 +519,7 @@ const MESSAGES = {
|
|
|
511
519
|
'cms.issue.cardinality-violation': msg('Wrong number of values'),
|
|
512
520
|
'cms.issue.unknown-asset': msg('Missing asset'),
|
|
513
521
|
'cms.issue.asset-without-url': msg('Asset without a file'),
|
|
522
|
+
'cms.issue.asset-meta-drift': msg('Unused asset translation', 'EC-659: an asset keeps a translated value (e.g. of its alt text) for a field that is no longer translatable — the shared value is shown; the stored translation is kept but not used.'),
|
|
514
523
|
'cms.issue.duplicate-document': msg('Duplicate entry'),
|
|
515
524
|
'cms.issue.unknown-locale': msg('Unknown language'),
|
|
516
525
|
'cms.issue.missing-localized-value': msg('Missing translation'),
|
|
@@ -529,6 +538,7 @@ const MESSAGES = {
|
|
|
529
538
|
'cms.issue.unaddressable-url': msg('Unreachable URL'),
|
|
530
539
|
'cms.issue.unknown-version': msg('Unknown version'),
|
|
531
540
|
'cms.issue.invalid-stored-document': msg('Unreadable stored document', 'EC-585: a stored row the delivery snapshot shipped is not a valid document, so it is not delivered.'),
|
|
541
|
+
'cms.issue.props-not-judged': msg('Component settings not checked', 'EC-662: a page was resolved without a component registry, so its component props were delivered unchecked.'),
|
|
532
542
|
// EC-443 — issue-card BODY templates, only for codes whose full body derives
|
|
533
543
|
// from `code` + `path`/`meta` (`issue-copy.ts`); every other code shows the
|
|
534
544
|
// raw English core message (honest fallback).
|
|
@@ -598,6 +608,7 @@ const MESSAGES = {
|
|
|
598
608
|
'cms.conflict.empty': msg('(empty)', 'EC-595 A2: {value} when the stored value is empty.'),
|
|
599
609
|
'cms.conflict.structured': msg('a structured value', 'EC-595 A2: {value} when the stored value is not plain text (an object, a list, rich text).'),
|
|
600
610
|
'cms.conflict.cellRefused': msg('This field was changed by someone else since you loaded it — their value is shown.', 'EC-595 A2: a table cell or bulk edit refused because the field changed meanwhile; the stored value is kept.'),
|
|
611
|
+
'cms.conflict.unauthored': msg('A change was not saved: it does not say which version of the document it was made on, so it could overwrite a newer change. Reload the document and make it again.', 'EC-647: a write that names no revision it was authored against is refused, never sent at the newest one (it could silently overwrite a colleague). Shown on the persistence error banner.'),
|
|
601
612
|
'cms.presence.inField': msg('{name} is in this field', 'EC-595 A2 thin presence: another session has this field focused. {name} is their name.'),
|
|
602
613
|
'cms.presence.inFieldMany': msg('{names} are in this field', 'EC-595 A2 thin presence: several sessions have this field focused. {names} is a comma-separated list of names.'),
|
|
603
614
|
'cms.presence.someone': msg('Someone', 'EC-595 A2 thin presence: the name of a present session that carries no name.'),
|
|
@@ -616,7 +627,8 @@ const MESSAGES = {
|
|
|
616
627
|
'cms.issueMessage.unknownAlias.other': msg('{count} documents are assigned the alias "{alias}", which is not a declared slot of "{collection}" ({declared}). Reassign to a valid slot.'),
|
|
617
628
|
'cms.issueMessage.duplicateAlias': msg('{count} documents share the alias "{alias}" in "{collection}". Each slot must be assigned to one document — reassign or clear the duplicates.'),
|
|
618
629
|
'cms.issueMessage.unfilledSlot': msg('The "{slot}" slot of "{collection}" has no document yet. Assign one so code that resolves "{slot}" finds it.'),
|
|
619
|
-
'cms.issueMessage.reservedFieldName': msg('Field name "{field}" is reserved (the self-describing node discriminator).'),
|
|
630
|
+
'cms.issueMessage.reservedFieldName': msg('Field name "{field}" is reserved (the self-describing node discriminator): a field named "{field}" may only be a select whose options exclude the engine\'s node types (reference, asset, block, elytra/*), and this one is a "{kind}" field.', 'EC-654: {kind} is a field type identifier (text, object, …); the parenthesised list is code — keep it untranslated.'),
|
|
631
|
+
'cms.issueMessage.reservedFieldTypeOption': msg('Select field "{field}" lists the option "{option}", an engine node type — a "{field}" of "{option}" would read as an engine node (reference, asset, block, elytra/*). Rename the option.', 'EC-654: {option} is the option value as declared; the parenthesised list is code — keep it untranslated.'),
|
|
620
632
|
'cms.issueMessage.duplicateSelectOption': msg('Duplicate select option "{option}" on field "{field}".'),
|
|
621
633
|
'cms.issueMessage.duplicateObjectField': msg('Duplicate field "{field}" in object field "{parent}".'),
|
|
622
634
|
'cms.issueMessage.assetCollectionSingleton': msg('Asset collection "{collection}" cannot be a singleton.'),
|
|
@@ -867,6 +879,8 @@ const MESSAGES = {
|
|
|
867
879
|
'assets.viewToggle.grid': msg('Grid view'),
|
|
868
880
|
'assets.detail.metadataHeading': msg('Metadata'),
|
|
869
881
|
'assets.detail.noFileUrl': msg('This asset has no file to serve — it renders as an empty image everywhere it is used. Replace the file.'),
|
|
882
|
+
'assets.detail.metaDriftNotLocalized': msg('Old translations are stored for {fields}, but the field is no longer translatable — every page shows its shared value. Saving the field removes them.', 'EC-659: {fields} lists field names with the locales holding an old translation, e.g. “alt (de, fr)”.'),
|
|
883
|
+
'assets.detail.metaDriftUndeclared': msg('Translated values are stored for {fields}, which this asset collection does not declare — they are not used anywhere.', 'EC-659: {fields} lists stored field names with their locales, e.g. “caption (de)”.'),
|
|
870
884
|
'assets.references.buttonLabel': msg('References'),
|
|
871
885
|
'assets.references.title': msg('Used by — {name}'),
|
|
872
886
|
'assets.references.description': msg('Everything referencing this asset, with deep links to the exact field or node.'),
|
|
@@ -1373,6 +1387,7 @@ const MESSAGES = {
|
|
|
1373
1387
|
'builder.inspector.unsetWithHint': msg('Not set (default: {hint})', '{hint} is the manifest default shown as a suggestion, e.g. "vertical" or "2".'),
|
|
1374
1388
|
// EC-586 / EC-581 (wave-0092, zone A) — canonical values and the per-FieldType definition
|
|
1375
1389
|
'cms.issueMessage.nonCanonicalValue': msg('Field "{field}" is stored in a non-canonical form for a "{type}" field — it was written past the write path that stores one form per field type. It still reads correctly; saving the document again stores the canonical form.'),
|
|
1390
|
+
'cms.issueMessage.propsNotJudged': msg('The component props in field "{field}" were not judged: the page was resolved without a component registry, so they are delivered as stored and their issues are not reported.'),
|
|
1376
1391
|
'cms.issueMessage.assetHoldsUrl': msg('Asset field "{field}" holds a URL — an asset value is a library asset, never a URL. Upload the image to the library and pick it, or put an external image’s address in the component’s URL prop (the Image’s “Image URL”).'),
|
|
1377
1392
|
// EC-584 — the AllowList parse (config load / registration).
|
|
1378
1393
|
'cms.issueMessage.emptyAllow': msg('Field "{field}" declares an empty "allow" — a list permits exactly the ids it names, so an empty one permits nothing. Omit "allow" for the type\'s default vocabulary, or list the component ids.'),
|