@cosmicdrift/kumiko-types 0.387.0 → 0.389.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/dist/config.d.ts +3 -0
- package/dist/db-connection.d.ts +4 -4
- package/dist/define-handler.d.ts +6 -0
- package/dist/event-store-executor-types.d.ts +37 -21
- package/dist/feature-registrar.d.ts +326 -0
- package/dist/feature-registrar.js +1 -0
- package/dist/feature.d.ts +6 -314
- package/dist/fields.js +1 -1
- package/dist/handlers.d.ts +8 -6
- package/dist/list-aggregate-types.d.ts +43 -0
- package/dist/list-aggregate-types.js +22 -0
- package/dist/screen-entity-edit.d.ts +8 -20
- package/dist/screen-entity-edit.js +6 -4
- package/dist/screen-entity-list.d.ts +21 -8
- package/dist/screen-expandable-row.d.ts +16 -0
- package/dist/screen-expandable-row.js +1 -0
- package/dist/screen-list-bulk.d.ts +12 -0
- package/dist/screen-list-bulk.js +3 -0
- package/dist/screen-list-table.d.ts +70 -0
- package/dist/screen-list-table.js +28 -0
- package/dist/screen-projection.d.ts +6 -0
- package/dist/screen.d.ts +12 -4
- package/dist/screen.js +2 -0
- package/dist/tenant-db-types.d.ts +5 -0
- package/package.json +20 -4
- package/src/changes.json +13 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { ListAggregateMeasureKind } from "./list-aggregate-types.ts";
|
|
2
|
+
export declare const LIST_TABLE_DENSITIES: readonly ["comfortable", "compact"];
|
|
3
|
+
export type ListTableDensity = (typeof LIST_TABLE_DENSITIES)[number];
|
|
4
|
+
export declare const LIST_COLUMN_PINS: readonly ["left", "right"];
|
|
5
|
+
export type ListColumnPin = (typeof LIST_COLUMN_PINS)[number];
|
|
6
|
+
export declare const LIST_TABLE_OPTION_KEYS: readonly ["rememberState", "resetAll", "columnPicker", "density", "pinning", "resizing", "keyboardNavigation", "export", "grouping", "totals"];
|
|
7
|
+
export declare const LIST_TABLE_GROUPING_KEYS: readonly ["field", "label", "labels", "collapsedWhen", "userChoice", "fields"];
|
|
8
|
+
export declare const LIST_TABLE_TOTAL_KEYS: readonly ["field", "kind"];
|
|
9
|
+
export declare const LIST_TABLE_EXPORT_KEYS: readonly ["xlsx", "maxRows"];
|
|
10
|
+
export declare const DEFAULT_EXPORT_MAX_ROWS = 10000;
|
|
11
|
+
/** Hard cap: the server builds the whole workbook in memory. */
|
|
12
|
+
export declare const MAX_EXPORT_MAX_ROWS = 100000;
|
|
13
|
+
export declare const LIST_TABLE_DENSITY_KEYS: readonly ["default", "userChoice"];
|
|
14
|
+
/** Opt-in table behaviour of a list. Without the block a list renders and behaves exactly as before. */
|
|
15
|
+
export type ListTableOptions = {
|
|
16
|
+
/** Keeps search, sort, page size, facets and date range for the browser session and restores them when the screen is opened without list parameters in the URL. A link with parameters always wins. */
|
|
17
|
+
readonly rememberState?: boolean;
|
|
18
|
+
/** Replaces the facet reset with one button that resets search, sort, page size, facets and date range, and drops the remembered list parameters (column and density choices stay). */
|
|
19
|
+
readonly resetAll?: boolean;
|
|
20
|
+
/** Lets the user hide and reorder columns in the view menu. Columns marked `hidden` start hidden. */
|
|
21
|
+
readonly columnPicker?: boolean;
|
|
22
|
+
/** Lets the user pin columns left or right in the view menu; columns may start pinned via `pinned`. Pinned columns stay sticky while scrolling horizontally. No effect in the card layout below `md`. */
|
|
23
|
+
readonly pinning?: boolean;
|
|
24
|
+
/** Switches the table to table-layout fixed; the user drags or uses the arrow keys on the header edge to resize. `width` and `minWidth` on a column are start values; widths are remembered per session. No effect in the card layout. */
|
|
25
|
+
readonly resizing?: boolean;
|
|
26
|
+
/** Rows become one tab stop; ArrowUp/ArrowDown move, Home/End jump, Enter runs the row click. Space stays reserved for selection. */
|
|
27
|
+
readonly keyboardNavigation?: boolean;
|
|
28
|
+
readonly density?: {
|
|
29
|
+
/** Row density on first visit. Default "comfortable". */
|
|
30
|
+
readonly default?: ListTableDensity;
|
|
31
|
+
/** Shows the density choice in the view menu and remembers it per session. */
|
|
32
|
+
readonly userChoice?: boolean;
|
|
33
|
+
};
|
|
34
|
+
/** Shows an export button; the server reads the whole filtered list (not just the visible page). */
|
|
35
|
+
readonly export?: ListTableExportOptions;
|
|
36
|
+
/** Server-side grouping: group headers with count and the `totals` measures over all matching rows; each open group loads its own rows. */
|
|
37
|
+
readonly grouping?: ListTableGrouping;
|
|
38
|
+
/** Footer row under the rows, computed by the server over all rows matching the current filters and search. In grouped mode the same measures show in each group header. */
|
|
39
|
+
readonly totals?: readonly ListTableTotal[];
|
|
40
|
+
};
|
|
41
|
+
export type ListTableGrouping = {
|
|
42
|
+
/** Start grouping. Without it the list starts ungrouped and the user picks from `fields`. */
|
|
43
|
+
readonly field?: string;
|
|
44
|
+
/** Groups whose key equals this start collapsed and load no rows until opened. */
|
|
45
|
+
readonly collapsedWhen?: string | number | boolean | null;
|
|
46
|
+
/** i18n key of the group header. Placeholders: `{count}` rows in the group, `{value}` the group's value. Default: the value itself. */
|
|
47
|
+
readonly label?: string;
|
|
48
|
+
/** Header i18n key per group key (as string), overriding `label`. */
|
|
49
|
+
readonly labels?: Readonly<Record<string, string>>;
|
|
50
|
+
/** Shows "Group by" in the view menu (needs `fields` or `field`) and remembers the choice per session. */
|
|
51
|
+
readonly userChoice?: boolean;
|
|
52
|
+
/** Fields offered under "Group by"; `field` is always offered. */
|
|
53
|
+
readonly fields?: readonly string[];
|
|
54
|
+
};
|
|
55
|
+
export type ListTableTotal = {
|
|
56
|
+
readonly field: string;
|
|
57
|
+
/** sum and avg on number, decimal, money and bigInt; min and max also on date and timestamp. Money is shown per currency, never added across currencies. */
|
|
58
|
+
readonly kind: ListAggregateMeasureKind;
|
|
59
|
+
};
|
|
60
|
+
export type ListTableExportOptions = {
|
|
61
|
+
readonly xlsx: true;
|
|
62
|
+
/** Export is refused above this many rows. Default 10000, hard cap 100000. Encrypted, sensitive and virtual columns are never written. */
|
|
63
|
+
readonly maxRows?: number;
|
|
64
|
+
};
|
|
65
|
+
/** One `table` block for every entityList, projectionList and relatedList of the bundled features. A screen's own `table` keys win per key. `grouping` and `totals` are not accepted here. */
|
|
66
|
+
export type BundledListsOptions = {
|
|
67
|
+
readonly table: ListTableOptions;
|
|
68
|
+
/** Pins the first column left on every bundled list where no column is pinned. Needs `table.pinning: true`. */
|
|
69
|
+
readonly pinFirstColumn?: boolean;
|
|
70
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const LIST_TABLE_DENSITIES = ["comfortable", "compact"];
|
|
2
|
+
export const LIST_COLUMN_PINS = ["left", "right"];
|
|
3
|
+
export const LIST_TABLE_OPTION_KEYS = [
|
|
4
|
+
"rememberState",
|
|
5
|
+
"resetAll",
|
|
6
|
+
"columnPicker",
|
|
7
|
+
"density",
|
|
8
|
+
"pinning",
|
|
9
|
+
"resizing",
|
|
10
|
+
"keyboardNavigation",
|
|
11
|
+
"export",
|
|
12
|
+
"grouping",
|
|
13
|
+
"totals",
|
|
14
|
+
];
|
|
15
|
+
export const LIST_TABLE_GROUPING_KEYS = [
|
|
16
|
+
"field",
|
|
17
|
+
"label",
|
|
18
|
+
"labels",
|
|
19
|
+
"collapsedWhen",
|
|
20
|
+
"userChoice",
|
|
21
|
+
"fields",
|
|
22
|
+
];
|
|
23
|
+
export const LIST_TABLE_TOTAL_KEYS = ["field", "kind"];
|
|
24
|
+
export const LIST_TABLE_EXPORT_KEYS = ["xlsx", "maxRows"];
|
|
25
|
+
export const DEFAULT_EXPORT_MAX_ROWS = 10000;
|
|
26
|
+
/** Hard cap: the server builds the whole workbook in memory. */
|
|
27
|
+
export const MAX_EXPORT_MAX_ROWS = 100000;
|
|
28
|
+
export const LIST_TABLE_DENSITY_KEYS = ["default", "userChoice"];
|
|
@@ -4,6 +4,8 @@ import type { PlatformComponent, ScreenNavSugar, ScreenSlots } from "./screen.ts
|
|
|
4
4
|
import type { DashboardPanelVisibility } from "./screen-dashboard.ts";
|
|
5
5
|
import type { EditLayout, ListEmptyStateSpec } from "./screen-entity-edit.ts";
|
|
6
6
|
import type { ListColumnSpec, ListPaginationMode, ListSortSpec, RowAction, RowActionMode, RowFieldExtractor, ScreenFilter, ToolbarAction } from "./screen-entity-list.ts";
|
|
7
|
+
import type { ListBulkAction } from "./screen-list-bulk.ts";
|
|
8
|
+
import type { ListTableOptions } from "./screen-list-table.ts";
|
|
7
9
|
export type ListFacetSpec = {
|
|
8
10
|
readonly field: string;
|
|
9
11
|
readonly type: "select";
|
|
@@ -71,9 +73,13 @@ export type ProjectionListScreenDefinition = {
|
|
|
71
73
|
readonly rowActions?: readonly RowAction[];
|
|
72
74
|
/** Layout of the row-action column — see `RowActionMode`. */
|
|
73
75
|
readonly rowActionMode?: RowActionMode;
|
|
76
|
+
/** Bulk actions over checkbox-selected rows, each pointing at a writeHandler row action. Adds a checkbox column and a selection bar; without it the list has no checkboxes. */
|
|
77
|
+
readonly bulkActions?: readonly ListBulkAction[];
|
|
74
78
|
readonly toolbarActions?: readonly ToolbarAction[];
|
|
75
79
|
readonly pagination?: ListPaginationMode;
|
|
76
80
|
readonly pageSize?: number;
|
|
81
|
+
/** Opt-in table behaviour: remembered state, reset, column picker, density. */
|
|
82
|
+
readonly table?: ListTableOptions;
|
|
77
83
|
readonly defaultSort?: ListSortSpec;
|
|
78
84
|
/** Replaces the default empty-list title/hint; the create button stays when the list can create. */
|
|
79
85
|
readonly emptyState?: ListEmptyStateSpec;
|
package/dist/screen.d.ts
CHANGED
|
@@ -72,8 +72,11 @@ export interface FieldFormatRegistry {
|
|
|
72
72
|
};
|
|
73
73
|
/** FileRef id (or id array) as a download link with the file name. On a
|
|
74
74
|
* read-only detail field it renders a file list with download links and an
|
|
75
|
-
* inline preview for PDFs; elsewhere the raw value is shown.
|
|
76
|
-
|
|
75
|
+
* inline preview for PDFs; elsewhere the raw value is shown.
|
|
76
|
+
* `previewOpenByDefault` opens the first file's PDF preview initially. */
|
|
77
|
+
file: {
|
|
78
|
+
readonly previewOpenByDefault?: boolean;
|
|
79
|
+
};
|
|
77
80
|
}
|
|
78
81
|
export type FormatSpec = {
|
|
79
82
|
[K in keyof FieldFormatRegistry]: {
|
|
@@ -111,7 +114,12 @@ export type { ActionFormFooterAction, ActionFormLoad, ActionFormRedirect, Action
|
|
|
111
114
|
export type { ConfigEditScreenDefinition, CustomScreenDefinition, CustomScreenRoute, SecretsEditScreenDefinition, SecretsEditSection, } from "./screen-custom-config.ts";
|
|
112
115
|
export type { DashboardChartKind, DashboardChartMarkerKind, DashboardChartPanel, DashboardChartRangeOption, DashboardChartRanges, DashboardChartTone, DashboardCurrencyFormat, DashboardCustomPanel, DashboardDateParam, DashboardFeedPanel, DashboardFilterDefinition, DashboardI18nText, DashboardListPanel, DashboardMoneyParam, DashboardPanelDefinition, DashboardPanelEmptyState, DashboardPanelGate, DashboardPanelQueryOptions, DashboardPanelSpan, DashboardPanelVisibility, DashboardProgressListPanel, DashboardProgressTone, DashboardRecordBinding, DashboardRefresh, DashboardRelativeTimeFormat, DashboardRelativeTimeParam, DashboardScopeDefinition, DashboardScreenDefinition, DashboardScreenPanel, DashboardStatGroupPanel, DashboardStatPanel, DashboardStatTone, DashboardText, DashboardTextBlock, DashboardTextPanel, DashboardTextParam, DashboardTimeRangeDefinition, DashboardValueFormat, } from "./screen-dashboard.ts";
|
|
113
116
|
export { DASHBOARD_MIN_REFRESH_SECONDS, DASHBOARD_STAT_TONES } from "./screen-dashboard.ts";
|
|
114
|
-
export type { EditExtensionSection, EditFieldGroup, EditFieldPrefill, EditFieldSpec, EditFieldsSection, EditLayout, EditRelatedListSection, EditSectionSpec, EditWriteFormSection, EmbeddedListEditSpec, EntityEditAction, EntityEditActionPlacement, EntityEditScreenDefinition, EntityWriteExcludedFields, FieldAffix, FieldFillAction, FormWidth, ListEmptyStateSpec,
|
|
117
|
+
export type { EditExtensionSection, EditFieldGroup, EditFieldPrefill, EditFieldSpec, EditFieldsSection, EditLayout, EditRelatedListSection, EditSectionSpec, EditWriteFormSection, EmbeddedListEditSpec, EntityEditAction, EntityEditActionPlacement, EntityEditScreenDefinition, EntityWriteExcludedFields, FieldAffix, FieldFillAction, FormWidth, ListEmptyStateSpec, RelatedListRowTone, } from "./screen-entity-edit.ts";
|
|
115
118
|
export { relatedListGroupHeaderLabel, relatedListGroupKey } from "./screen-entity-edit.ts";
|
|
116
|
-
export type {
|
|
119
|
+
export type { EntityListFacetConfig, EntityListFacetExtraOption, EntityListScreenDefinition, ListBadgeTone, ListColumnDisplay, ListColumnSpec, ListPaginationMode, ListSortDir, ListSortSpec, RelatedListToolbarAction, RowAction, RowActionClientAction, RowActionDisplay, RowActionDrawer, RowActionMode, RowActionNavigate, RowActionNavigateBase, RowActionWriteHandler, RowFieldExtractor, ScreenFilter, ScreenFilterOp, ToolbarAction, } from "./screen-entity-list.ts";
|
|
120
|
+
export type { EntityListExpandableRow, ExpandableRowGrouping } from "./screen-expandable-row.ts";
|
|
121
|
+
export type { ListBulkAction } from "./screen-list-bulk.ts";
|
|
122
|
+
export { LIST_BULK_ACTION_KEYS, MAX_BULK_SELECTION } from "./screen-list-bulk.ts";
|
|
123
|
+
export type { BundledListsOptions, ListColumnPin, ListTableDensity, ListTableExportOptions, ListTableGrouping, ListTableOptions, ListTableTotal, } from "./screen-list-table.ts";
|
|
124
|
+
export { DEFAULT_EXPORT_MAX_ROWS, LIST_COLUMN_PINS, LIST_TABLE_DENSITIES, LIST_TABLE_DENSITY_KEYS, LIST_TABLE_EXPORT_KEYS, LIST_TABLE_GROUPING_KEYS, LIST_TABLE_OPTION_KEYS, LIST_TABLE_TOTAL_KEYS, MAX_EXPORT_MAX_ROWS, } from "./screen-list-table.ts";
|
|
117
125
|
export type { ListFacetSpec, MetricNavigate, MetricSpec, ProjectionDetailScreenDefinition, ProjectionListScreenDefinition, RecordHeaderSpec, RecordHeaderSubtitlePart, } from "./screen-projection.ts";
|
package/dist/screen.js
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
export { DASHBOARD_MIN_REFRESH_SECONDS, DASHBOARD_STAT_TONES } from "./screen-dashboard.js";
|
|
2
2
|
export { relatedListGroupHeaderLabel, relatedListGroupKey } from "./screen-entity-edit.js";
|
|
3
|
+
export { LIST_BULK_ACTION_KEYS, MAX_BULK_SELECTION } from "./screen-list-bulk.js";
|
|
4
|
+
export { DEFAULT_EXPORT_MAX_ROWS, LIST_COLUMN_PINS, LIST_TABLE_DENSITIES, LIST_TABLE_DENSITY_KEYS, LIST_TABLE_EXPORT_KEYS, LIST_TABLE_GROUPING_KEYS, LIST_TABLE_OPTION_KEYS, LIST_TABLE_TOTAL_KEYS, MAX_EXPORT_MAX_ROWS, } from "./screen-list-table.js";
|
|
@@ -58,6 +58,11 @@ type TenantDbNonWrites = {
|
|
|
58
58
|
/** Postgres `now()`; inside a transaction this is the transaction start. */
|
|
59
59
|
databaseNow(): Promise<Date>;
|
|
60
60
|
aggregate(table: SchemaTable | EntityTableMeta, spec: AggregateSpec, where?: WhereObject): Promise<readonly AggregateRow[]>;
|
|
61
|
+
upsert<T = Record<string, unknown>>(table: WritableTable, values: Record<string, unknown>, options: TenantDbUpsertOptions): Promise<T | undefined>;
|
|
62
|
+
};
|
|
63
|
+
export type TenantDbUpsertOptions = {
|
|
64
|
+
readonly conflictTarget: readonly string[];
|
|
65
|
+
readonly update?: Record<string, unknown>;
|
|
61
66
|
};
|
|
62
67
|
export type TenantDb = TenantDbNonWrites & TenantDbWrites<WritableTable>;
|
|
63
68
|
export type ExecutorManagedTenantDb = TenantDbNonWrites & TenantDbWrites<EntityTableMeta> & ExecutorManagedWriteCapability;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cosmicdrift/kumiko-types",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.389.0",
|
|
4
4
|
"description": "Framework-Type-Definitions für Kumiko — FeatureDefinition, BootCheck-Types und die reinen Engine-Types. Erlaubt Downstream-Konsumenten, gegen die Type-Contracts zu bauen, ohne das ganze Framework-Package zu importieren. Enthaelt keine identitaets-sensitiven Runtime-Werte mehr (Error-Klassen leben seit #1629 in kumiko-framework, Brand-Symbole nutzen Symbol.for) und ist deshalb eine plain dependency, keine peerDependency.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
|
|
@@ -154,6 +154,10 @@
|
|
|
154
154
|
"types": "./dist/aggregate-types.d.ts",
|
|
155
155
|
"default": "./dist/aggregate-types.js"
|
|
156
156
|
},
|
|
157
|
+
"./list-aggregate-types": {
|
|
158
|
+
"types": "./dist/list-aggregate-types.d.ts",
|
|
159
|
+
"default": "./dist/list-aggregate-types.js"
|
|
160
|
+
},
|
|
157
161
|
"./tenant-db-types": {
|
|
158
162
|
"types": "./dist/tenant-db-types.d.ts",
|
|
159
163
|
"default": "./dist/tenant-db-types.js"
|
|
@@ -174,6 +178,10 @@
|
|
|
174
178
|
"types": "./dist/feature.d.ts",
|
|
175
179
|
"default": "./dist/feature.js"
|
|
176
180
|
},
|
|
181
|
+
"./feature-registrar": {
|
|
182
|
+
"types": "./dist/feature-registrar.d.ts",
|
|
183
|
+
"default": "./dist/feature-registrar.js"
|
|
184
|
+
},
|
|
177
185
|
"./fields": {
|
|
178
186
|
"types": "./dist/fields.d.ts",
|
|
179
187
|
"default": "./dist/fields.js"
|
|
@@ -280,18 +288,18 @@
|
|
|
280
288
|
}
|
|
281
289
|
},
|
|
282
290
|
"devDependencies": {
|
|
291
|
+
"bun-types": "^1.4.4",
|
|
283
292
|
"hono": "^4.13.1",
|
|
284
|
-
"postgres": "npm:@bender0oo0/postgres@3.4.9-kumiko.1",
|
|
285
293
|
"temporal-polyfill": "^0.3.2",
|
|
286
294
|
"zod": "^4.4.3",
|
|
287
295
|
"ioredis": "^5.10.1"
|
|
288
296
|
},
|
|
289
297
|
"peerDependencies": {
|
|
290
298
|
"hono": "^4.13.1",
|
|
291
|
-
"postgres": "^3.4.9-0",
|
|
292
299
|
"temporal-polyfill": "^0.3.2",
|
|
293
300
|
"zod": "^4.4.3",
|
|
294
|
-
"ioredis": "^5.10.1"
|
|
301
|
+
"ioredis": "^5.10.1",
|
|
302
|
+
"bun-types": "^1.4.4"
|
|
295
303
|
},
|
|
296
304
|
"publishConfig": {
|
|
297
305
|
"registry": "https://registry.npmjs.org",
|
|
@@ -433,6 +441,10 @@
|
|
|
433
441
|
"types": "./dist/aggregate-types.d.ts",
|
|
434
442
|
"default": "./dist/aggregate-types.js"
|
|
435
443
|
},
|
|
444
|
+
"./list-aggregate-types": {
|
|
445
|
+
"types": "./dist/list-aggregate-types.d.ts",
|
|
446
|
+
"default": "./dist/list-aggregate-types.js"
|
|
447
|
+
},
|
|
436
448
|
"./tenant-db-types": {
|
|
437
449
|
"types": "./dist/tenant-db-types.d.ts",
|
|
438
450
|
"default": "./dist/tenant-db-types.js"
|
|
@@ -453,6 +465,10 @@
|
|
|
453
465
|
"types": "./dist/feature.d.ts",
|
|
454
466
|
"default": "./dist/feature.js"
|
|
455
467
|
},
|
|
468
|
+
"./feature-registrar": {
|
|
469
|
+
"types": "./dist/feature-registrar.d.ts",
|
|
470
|
+
"default": "./dist/feature-registrar.js"
|
|
471
|
+
},
|
|
456
472
|
"./fields": {
|
|
457
473
|
"types": "./dist/fields.d.ts",
|
|
458
474
|
"default": "./dist/fields.js"
|
package/src/changes.json
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.389.0",
|
|
4
|
+
"type": "breaking",
|
|
5
|
+
"title": "DbConnection, DbTx and PgClient are Bun.SQL types and postgres is no longer a peer dependency",
|
|
6
|
+
"detail": "DbConnection is SQL | RawDbClient, DbTx is TransactionSQL | RawDbClient and PgClient is SQL from the bun module, so the package type-checks against bun-types instead of postgres. The postgres peer dependency is removed.",
|
|
7
|
+
"migration": "Remove postgres from your dependencies unless your own code imports it. Annotations that named postgres.Sql or postgres.TransactionSql for framework handles become SQL and TransactionSQL from \"bun\", or the DbConnection and DbTx aliases. Manual migration, there is no codemod."
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"version": "0.389.0",
|
|
11
|
+
"type": "improvement",
|
|
12
|
+
"title": "Config validators can read a key's cascade",
|
|
13
|
+
"detail": "ConfigValidateContext gains readCascade(qualifiedKey), which returns the full cascade of any registered key from the writing tenant and user. Unknown keys throw."
|
|
14
|
+
},
|
|
2
15
|
{
|
|
3
16
|
"version": "0.386.0",
|
|
4
17
|
"type": "improvement",
|