@happyvertical/smrt-reports 0.55.21 → 0.55.22
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/AGENTS.md +21 -1
- package/README.md +38 -0
- package/dist/__smrt-register__.d.ts +2 -0
- package/dist/__smrt-register__.d.ts.map +1 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +101 -25
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +1 -1
- package/dist/runtime-compiler.d.ts +4 -0
- package/dist/runtime-compiler.d.ts.map +1 -1
- package/dist/runtime-report.d.ts +1 -0
- package/dist/runtime-report.d.ts.map +1 -1
- package/dist/scheduler.d.ts +6 -2
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +84 -15
- package/dist/scheduler.js.map +1 -1
- package/dist/smrt-knowledge.json +13 -7
- package/dist/state.d.ts +1 -0
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +4 -1
- package/dist/state.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -7
package/AGENTS.md
CHANGED
|
@@ -70,7 +70,7 @@ Materialized aggregate report models for SMRT.
|
|
|
70
70
|
A runtime report is data, not code: `parseRuntimeReportSpec()` accepts a closed
|
|
71
71
|
grammar (no SQL, expressions, joins, tables, or tenants), and
|
|
72
72
|
`compileRuntimeReportSpec()` resolves it against a server-owned source
|
|
73
|
-
allow-list, the ObjectRegistry field policy, the live principal's permissions,
|
|
73
|
+
allow-list (including optional `fields`/`excludeFields`), the ObjectRegistry field policy, the live principal's permissions,
|
|
74
74
|
and an explicit fail-closed tenant predicate. Stored `RuntimeReport` specs are
|
|
75
75
|
re-compiled for the running principal on every run, and result rows are never
|
|
76
76
|
persisted. Assistant tools are in `@happyvertical/smrt-chat`. The full
|
|
@@ -109,3 +109,23 @@ See [core recipes](../core/agents/recipes.md).
|
|
|
109
109
|
- Raw aggregate refreshes must explicitly filter `tenant_id`; the tenancy interceptor only protects normal collection reads.
|
|
110
110
|
- Scheduled/on-change refreshes enqueue `SmrtReportRefreshTask.run()` through `@happyvertical/smrt-jobs`; do not add a separate report queue.
|
|
111
111
|
- `SmrtReportCollection` is a framework collection base (core's `SMRT_COLLECTION_BASE_NAMES`): a report collection never owns its model's table, even when an app manifest attributes the two to different packages. `pnpm test:postgres` runs the `*.optional.test.ts` lane (#3110).
|
|
112
|
+
|
|
113
|
+
## Package registration
|
|
114
|
+
|
|
115
|
+
`src/__smrt-register__.ts` embeds the provider manifest during library builds.
|
|
116
|
+
Import it before model decorators, including model-bearing subpaths (`state`
|
|
117
|
+
and `scheduler`), so consumer SSR bundles retain reports-qualified identities.
|
|
118
|
+
The bundle gate executes these public entries in a fresh consumer process.
|
|
119
|
+
Audit #3525 found no other published domain model package missing its shim;
|
|
120
|
+
packages without one contain framework utilities or example/test decorators.
|
|
121
|
+
|
|
122
|
+
## Schedule lifecycle
|
|
123
|
+
|
|
124
|
+
`tenantFanout: 'discover'` resolves non-null tenants in the source and existing
|
|
125
|
+
materialization at execution time only for signed global scheduled maintenance.
|
|
126
|
+
Include materialized scopes so rebuilds clear groups after their last source
|
|
127
|
+
row is deleted; discovery does not change incremental watermark semantics. Empty discovery must not call
|
|
128
|
+
refresh with an empty tenant array, which would select the global slice.
|
|
129
|
+
Schedule provisioning preserves existing state. Hosts bind terminal job events
|
|
130
|
+
with `ReportScheduleRunner.bindTaskRunner()` and dispose the returned binding
|
|
131
|
+
on shutdown; see [scheduled refresh lifecycle](README.md#scheduled-refresh-lifecycle).
|
package/README.md
CHANGED
|
@@ -185,6 +185,14 @@ database-backed dimension facets. A descriptor marks group/time fields as
|
|
|
185
185
|
combine the two scopes, but an OR or NOT cannot mix them, because moving either
|
|
186
186
|
side across a source `WHERE`/`HAVING` boundary would change its meaning.
|
|
187
187
|
|
|
188
|
+
Materialized query results normalize hydrated values against their declared
|
|
189
|
+
column types. Objects in scalar columns become JSON text; JSON columns retain
|
|
190
|
+
structured values. Date-only and timezone-less timestamps use UTC, matching
|
|
191
|
+
SQLite storage, and temporal facet buckets follow the same rule. Strings over
|
|
192
|
+
4096 characters are shortened with `truncated` and a warning, except row IDs:
|
|
193
|
+
identities are never rewritten, and unsupported IDs fail validation. Unsafe bigint
|
|
194
|
+
values fail instead of silently losing precision.
|
|
195
|
+
|
|
188
196
|
The materialized collection executes the normalized, allowlisted predicate as
|
|
189
197
|
parameterized SQL and applies it identically to rows, totals, and facets. It
|
|
190
198
|
never accepts raw SQL, source field paths, tenant ids, or principal ids.
|
|
@@ -238,6 +246,36 @@ payloads use the same integrity boundary. Only a registered `SmrtReportCollectio
|
|
|
238
246
|
synchronously refresh a stale read, and only when its TTL policy is positive and
|
|
239
247
|
not manual.
|
|
240
248
|
|
|
249
|
+
### Scheduled refresh lifecycle
|
|
250
|
+
|
|
251
|
+
Declare `refresh: { schedule: '*/5 * * * *', tenantFanout: 'discover' }`
|
|
252
|
+
on a tenant-scoped report to discover distinct non-null source tenants each
|
|
253
|
+
scheduled run. Include scopes still present in the materialized table so a
|
|
254
|
+
the next rebuild removes stale groups for tenants losing their final source row.
|
|
255
|
+
Discovery preserves the configured refresh mode. Incremental reports still need
|
|
256
|
+
a `fullRebuildSchedule` to catch hard deletions that do not advance a source
|
|
257
|
+
watermark. Provision schedules with `ensureReportRefreshSchedules({ db,
|
|
258
|
+
reports })`; no discovered scopes means no work, and discovery never refreshes
|
|
259
|
+
the global slice.
|
|
260
|
+
The worker uses the registered source/report tenant columns and its supplied
|
|
261
|
+
maintenance executor. Discovery does not grant database privileges or widen a
|
|
262
|
+
tenant-bound or manual job. Keep `tenantFanout: true` with explicit `tenantIds`
|
|
263
|
+
when the host owns a fixed tenant list.
|
|
264
|
+
|
|
265
|
+
Initialize a `ReportScheduleRunner` and a jobs `TaskRunner` against the migrated
|
|
266
|
+
database, then call `const unbind = schedules.bindTaskRunner(tasks)` before
|
|
267
|
+
starting them. This connects terminal job events to schedule counters, freeing
|
|
268
|
+
the concurrency slot after success or failure. Repeated binding is idempotent;
|
|
269
|
+
call `unbind()` on shutdown. Listen for `runner:error` to detect failed counter
|
|
270
|
+
updates. Persisted failure messages use the jobs package redaction policy.
|
|
271
|
+
Durable payload signing and execution-time authority checks remain
|
|
272
|
+
required; completion accounting uses the signed schedule identity.
|
|
273
|
+
|
|
274
|
+
Repeated schedule provisioning inserts missing identities and preserves existing
|
|
275
|
+
history, next-run time, running count, and operator settings. A different cron,
|
|
276
|
+
mode, or tenant scope identifies a different schedule; explicitly disable obsolete
|
|
277
|
+
schedules when changing those settings.
|
|
278
|
+
|
|
241
279
|
### Saved views and snapshot exports
|
|
242
280
|
|
|
243
281
|
`normalizeReportSavedView()` and `restoreReportSavedView()` provide the
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"__smrt-register__.d.ts","sourceRoot":"","sources":["../src/__smrt-register__.ts"],"names":[],"mappings":""}
|
package/dist/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,UAAU,EAChB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAEV,wBAAwB,EACxB,eAAe,EAGf,gBAAgB,EAChB,eAAe,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import './__smrt-register__.js';
|
|
1
2
|
export type { ReportAdapterDescriptor, ReportAdapterOptions, ReportBackgroundQueryOptions, ReportBackgroundQueryResult, ReportBackgroundQueryTask, ReportColumnCapability, ReportColumnDescriptor, ReportColumnKind, ReportColumnSensitivity, ReportDataQueryResult, ReportDataTableColumn, ReportDataTableColumnOverride, ReportDataTableColumnResponsive, ReportDataTableColumnRole, ReportDataTableDescriptor, ReportDataTableHeaderPathSegment, ReportDataTablePresentationOptions, ReportDataTableStructuralRow, ReportDataTableStructuralRowInput, ReportDataTableStructuralRowKind, ReportDataTableValueFormat, ReportDrilldownConstraint, ReportDrilldownDescriptor, ReportDrilldownFieldDescriptor, ReportDrilldownQuery, ReportFilterScope, ReportMaterializedReadLifecycle, ReportQueryExecutionDescriptor, ReportQueryExecutionMode, ReportQueryOptions, ReportRefreshActionDescriptor, ReportRefreshDescriptor, } from './adapter.js';
|
|
2
3
|
export { buildReportAdapterDescriptor, buildReportDrilldownQuery, queryReportMaterializedRows, reportMaterializedRowKey, splitReportFilterScopes, } from './adapter.js';
|
|
3
4
|
export { bucketExpr, buildAggregate, } from './aggregate.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -736,8 +736,33 @@ function splitReportFilterScopes(descriptor, filter) {
|
|
|
736
736
|
};
|
|
737
737
|
return split(filter);
|
|
738
738
|
}
|
|
739
|
+
var DATE_ONLY_VALUE = /^\d{4}-\d{2}-\d{2}$/;
|
|
740
|
+
var NAIVE_TIMESTAMP_VALUE = /^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d{1,9})?)?$/;
|
|
741
|
+
function instantOrNull(value) {
|
|
742
|
+
return Number.isNaN(value.getTime()) ? null : value.toISOString();
|
|
743
|
+
}
|
|
744
|
+
function epochToInstant(value) {
|
|
745
|
+
if (!Number.isFinite(value)) return null;
|
|
746
|
+
return instantOrNull(new Date(value));
|
|
747
|
+
}
|
|
748
|
+
function temporalToInstant(value) {
|
|
749
|
+
if (value instanceof Date) return instantOrNull(value);
|
|
750
|
+
if (typeof value === "number") return epochToInstant(value);
|
|
751
|
+
if (typeof value === "bigint") {
|
|
752
|
+
const numeric = Number(value);
|
|
753
|
+
return Number.isSafeInteger(numeric) ? epochToInstant(numeric) : null;
|
|
754
|
+
}
|
|
755
|
+
if (typeof value !== "string") return value;
|
|
756
|
+
const text = value.trim();
|
|
757
|
+
if (text.length === 0) return null;
|
|
758
|
+
if (DATE_ONLY_VALUE.test(text)) return `${text}T00:00:00.000Z`;
|
|
759
|
+
if (NAIVE_TIMESTAMP_VALUE.test(text)) return epochToInstant(Date.parse(`${text.replace(" ", "T")}Z`)) ?? value;
|
|
760
|
+
const parsed = Date.parse(text);
|
|
761
|
+
if (!Number.isFinite(parsed)) return value;
|
|
762
|
+
return epochToInstant(parsed) ?? value;
|
|
763
|
+
}
|
|
739
764
|
function jsonSafeValue(value, ancestors = /* @__PURE__ */ new WeakSet()) {
|
|
740
|
-
if (value instanceof Date) return value
|
|
765
|
+
if (value instanceof Date) return instantOrNull(value);
|
|
741
766
|
if (typeof value === "bigint") {
|
|
742
767
|
const numeric = Number(value);
|
|
743
768
|
if (!Number.isSafeInteger(numeric)) throw new RangeError("Materialized bigint values must be safely representable as numbers");
|
|
@@ -755,11 +780,36 @@ function jsonSafeValue(value, ancestors = /* @__PURE__ */ new WeakSet()) {
|
|
|
755
780
|
}
|
|
756
781
|
return value;
|
|
757
782
|
}
|
|
758
|
-
function
|
|
783
|
+
function toDeclaredValue(value, descriptor, shortened) {
|
|
784
|
+
const cap = (text) => {
|
|
785
|
+
if (text.length <= 4096) return text;
|
|
786
|
+
shortened.add(descriptor.id);
|
|
787
|
+
const last = text.charCodeAt(4095);
|
|
788
|
+
const next = text.charCodeAt(4096);
|
|
789
|
+
const splitsPair = last >= 55296 && last <= 56319 && next >= 56320 && next <= 57343;
|
|
790
|
+
return text.slice(0, splitsPair ? 4095 : 4096);
|
|
791
|
+
};
|
|
792
|
+
if (descriptor.id === "id") return value;
|
|
793
|
+
if (value === void 0 || value === null) return null;
|
|
794
|
+
if (descriptor.type === "datetime") return temporalToInstant(value);
|
|
795
|
+
if (descriptor.type === "json") return jsonSafeValue(value);
|
|
796
|
+
if (typeof value === "object" && !(value instanceof Date)) try {
|
|
797
|
+
const rendered = JSON.stringify(jsonSafeValue(value));
|
|
798
|
+
return rendered === void 0 ? null : cap(rendered);
|
|
799
|
+
} catch (error) {
|
|
800
|
+
if (error instanceof RangeError) throw error;
|
|
801
|
+
return null;
|
|
802
|
+
}
|
|
803
|
+
if (descriptor.type === "boolean" && typeof value === "number") return value !== 0;
|
|
804
|
+
if (typeof value === "string") return cap(value);
|
|
805
|
+
return jsonSafeValue(value);
|
|
806
|
+
}
|
|
807
|
+
function mapMaterializedRow(row, projection, fieldMap, schema, shortened) {
|
|
759
808
|
const mapped = {};
|
|
760
809
|
for (const id of projection) {
|
|
761
810
|
const sourceField = fieldMap.get(id) ?? id;
|
|
762
|
-
|
|
811
|
+
const descriptor = schema.fields.find((field) => field.id === id);
|
|
812
|
+
if (sourceField in row && descriptor) mapped[id] = toDeclaredValue(row[sourceField], descriptor, shortened);
|
|
763
813
|
}
|
|
764
814
|
return mapped;
|
|
765
815
|
}
|
|
@@ -820,6 +870,7 @@ async function queryReportMaterializedRows(reportCtor, input, options = {}) {
|
|
|
820
870
|
const fieldMap = publicFieldMap(descriptor);
|
|
821
871
|
const where = materializedWhere(request.filter, fieldMap);
|
|
822
872
|
const collection = options.collection ?? await ObjectRegistry.getCollection(descriptor.reportClassName, { db: options.db });
|
|
873
|
+
const shortened = /* @__PURE__ */ new Set();
|
|
823
874
|
let rows = [];
|
|
824
875
|
let page;
|
|
825
876
|
let total;
|
|
@@ -836,7 +887,7 @@ async function queryReportMaterializedRows(reportCtor, input, options = {}) {
|
|
|
836
887
|
limit,
|
|
837
888
|
orderBy: orderBy?.length === 1 ? orderBy[0] : orderBy,
|
|
838
889
|
...where === void 0 ? {} : { where }
|
|
839
|
-
})).map((row) => mapMaterializedRow(row, projection, fieldMap));
|
|
890
|
+
})).map((row) => mapMaterializedRow(row, projection, fieldMap, descriptor.schema, shortened));
|
|
840
891
|
rows.forEach((row) => {
|
|
841
892
|
if (typeof row.id !== "string" || row.id.length === 0) throw new Error("Materialized report rows require a non-empty string id");
|
|
842
893
|
});
|
|
@@ -870,10 +921,12 @@ async function queryReportMaterializedRows(reportCtor, input, options = {}) {
|
|
|
870
921
|
facets = requested.map((facet) => {
|
|
871
922
|
const sourceField = fieldMap.get(facet.field) ?? facet.field;
|
|
872
923
|
const values = byField.get(sourceField)?.values ?? [];
|
|
924
|
+
const field = descriptor.schema.fields.find((field2) => field2.id === facet.field);
|
|
925
|
+
if (!field) throw new Error("Unknown report facet field");
|
|
873
926
|
return {
|
|
874
927
|
field: facet.field,
|
|
875
928
|
values: values.map((value) => ({
|
|
876
|
-
value: value.value,
|
|
929
|
+
value: toDeclaredValue(value.value, field, shortened),
|
|
877
930
|
count: value.count
|
|
878
931
|
})),
|
|
879
932
|
truncated: values.length >= facet.limit
|
|
@@ -894,8 +947,8 @@ async function queryReportMaterializedRows(reportCtor, input, options = {}) {
|
|
|
894
947
|
},
|
|
895
948
|
...facets === void 0 ? {} : { facets },
|
|
896
949
|
freshness: { state: "unknown" },
|
|
897
|
-
warnings: [],
|
|
898
|
-
truncated:
|
|
950
|
+
warnings: shortened.size ? ["Values exceeding the scalar result limit were shortened."] : [],
|
|
951
|
+
truncated: shortened.size > 0
|
|
899
952
|
}, request, descriptor.schema);
|
|
900
953
|
if (!lifecycleBefore || !lifecycleOptions) return {
|
|
901
954
|
...normalized,
|
|
@@ -1454,30 +1507,53 @@ function isExcluded(name, field, tenantField, permissions) {
|
|
|
1454
1507
|
if (tenantField && toSnakeCase(name) === tenantField) return true;
|
|
1455
1508
|
return false;
|
|
1456
1509
|
}
|
|
1457
|
-
async function loadSourceFields(qualifiedName, tenantField, permissions) {
|
|
1510
|
+
async function loadSourceFields(qualifiedName, tenantField, permissions, source) {
|
|
1458
1511
|
const registered = await ObjectRegistry.getAllFields(qualifiedName);
|
|
1459
|
-
const
|
|
1512
|
+
const baseNames = new Map(Object.keys(BASE_FIELDS).map((name) => [toSnakeCase(name), name]));
|
|
1513
|
+
const columns = /* @__PURE__ */ new Map();
|
|
1460
1514
|
for (const [name, field] of registered) {
|
|
1461
|
-
|
|
1462
|
-
const
|
|
1463
|
-
|
|
1464
|
-
const format = strictFormat(field);
|
|
1465
|
-
fields.set(name, {
|
|
1515
|
+
const column = toSnakeCase(explicitColumn(field) ?? name);
|
|
1516
|
+
const entries = columns.get(column) ?? [];
|
|
1517
|
+
entries.push({
|
|
1466
1518
|
name,
|
|
1467
|
-
|
|
1468
|
-
type,
|
|
1469
|
-
...format ? { format } : {},
|
|
1470
|
-
label: typeof field.description === "string" && field.description.length > 0 ? field.description : humanize(name)
|
|
1519
|
+
field
|
|
1471
1520
|
});
|
|
1521
|
+
columns.set(column, entries);
|
|
1472
1522
|
}
|
|
1473
1523
|
for (const [name, type] of Object.entries(BASE_FIELDS)) {
|
|
1474
|
-
|
|
1475
|
-
|
|
1524
|
+
const column = toSnakeCase(name);
|
|
1525
|
+
if (!columns.has(column) && !registered.has(name)) columns.set(column, [{
|
|
1476
1526
|
name,
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1527
|
+
field: { type: type === "id" ? "foreignKey" : type === "string" ? "text" : type }
|
|
1528
|
+
}]);
|
|
1529
|
+
}
|
|
1530
|
+
const knownNames = /* @__PURE__ */ new Set();
|
|
1531
|
+
for (const [column, entries] of columns) for (const entry of entries) knownNames.add(baseNames.get(column) ?? entry.name);
|
|
1532
|
+
const policy = (key) => {
|
|
1533
|
+
const value = source[key];
|
|
1534
|
+
if (value === void 0) return void 0;
|
|
1535
|
+
if (!Array.isArray(value) || Array.from(value).some((name) => typeof name !== "string" || !knownNames.has(name))) throw new RuntimeReportError("unsupported_source", `source.${key}`, `${key} must contain canonical field names declared on the source`);
|
|
1536
|
+
return new Set(value);
|
|
1537
|
+
};
|
|
1538
|
+
const included = policy("fields");
|
|
1539
|
+
const excluded = policy("excludeFields");
|
|
1540
|
+
const fields = /* @__PURE__ */ new Map();
|
|
1541
|
+
for (const [column, entries] of columns) {
|
|
1542
|
+
if (column === tenantField || column === "tenant_id" || entries.some(({ name, field }) => isExcluded(name, field, tenantField, permissions) || excluded?.has(baseNames.get(column) ?? name))) continue;
|
|
1543
|
+
for (const { name: registeredName, field } of entries) {
|
|
1544
|
+
const name = baseNames.get(column) ?? registeredName;
|
|
1545
|
+
if (fields.has(name) || included && !included.has(name)) continue;
|
|
1546
|
+
const type = columnTypeFor(field.type);
|
|
1547
|
+
if (!type) continue;
|
|
1548
|
+
const format = strictFormat(field);
|
|
1549
|
+
fields.set(name, {
|
|
1550
|
+
name,
|
|
1551
|
+
column,
|
|
1552
|
+
type,
|
|
1553
|
+
...format ? { format } : {},
|
|
1554
|
+
label: typeof field.description === "string" && field.description.length > 0 ? field.description : humanize(name)
|
|
1555
|
+
});
|
|
1556
|
+
}
|
|
1481
1557
|
}
|
|
1482
1558
|
return fields;
|
|
1483
1559
|
}
|
|
@@ -1622,7 +1698,7 @@ async function prepareSource(context, id) {
|
|
|
1622
1698
|
if (!table) throw new RuntimeReportError("unsupported_source", "spec.source", "this source has no registered table");
|
|
1623
1699
|
const tenantCol = await tenantColumn(qualifiedName);
|
|
1624
1700
|
if (isTenantScopedClass(qualifiedName) && !tenantCol) throw new RuntimeReportError("unsupported_source", "spec.source", "this tenant-scoped source does not expose a tenant column");
|
|
1625
|
-
const fields = await loadSourceFields(qualifiedName, tenantCol, new Set(context.permissions ?? []));
|
|
1701
|
+
const fields = await loadSourceFields(qualifiedName, tenantCol, new Set(context.permissions ?? []), source);
|
|
1626
1702
|
return {
|
|
1627
1703
|
source,
|
|
1628
1704
|
registeredName: registered.name,
|