@objectstack/metadata 7.3.0 → 7.4.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/node.js CHANGED
@@ -163,6 +163,7 @@ var init_hmr_routes = __esm({
163
163
  });
164
164
 
165
165
  // src/metadata-manager.ts
166
+ import { getMetadataTypeActions } from "@objectstack/spec/kernel";
166
167
  import { createLogger } from "@objectstack/core";
167
168
 
168
169
  // src/serializers/json-serializer.ts
@@ -1444,6 +1445,22 @@ var _MetadataManager = class _MetadataManager {
1444
1445
  }
1445
1446
  }
1446
1447
  }
1448
+ /**
1449
+ * Register a metadata item into the in-memory registry ONLY, never persisting
1450
+ * to a writable loader. Used for GitOps-managed artefacts that must be
1451
+ * *listable* (so `list(type)` returns them) but must never leak into the
1452
+ * runtime DB store — e.g. code-defined datasources (`origin:'code'`, ADR-0015
1453
+ * Addendum) declared in `*.datasource.ts` and owned by source control. Writing
1454
+ * them through `register()` would persist them to `sys_metadata` and create
1455
+ * drift between the artefact and the DB; this method avoids that.
1456
+ */
1457
+ registerInMemory(type, name, data) {
1458
+ if (!this.registry.has(type)) {
1459
+ this.registry.set(type, /* @__PURE__ */ new Map());
1460
+ }
1461
+ this.registry.get(type).set(name, data);
1462
+ this.invalidateListCache(type);
1463
+ }
1447
1464
  /**
1448
1465
  * Get a metadata item by type and name.
1449
1466
  * Checks in-memory registry first, then falls back to loaders.
@@ -1598,6 +1615,26 @@ var _MetadataManager = class _MetadataManager {
1598
1615
  }
1599
1616
  return views;
1600
1617
  }
1618
+ /**
1619
+ * List the independent ViewItems bound to an object, sorted for the runtime
1620
+ * view switcher / Studio left rail ("Object has-many View").
1621
+ *
1622
+ * Returns only expanded ViewItems (those carrying a `viewKind`) — never the
1623
+ * legacy aggregated container kept under the bare `<object>` key — so callers
1624
+ * get exactly one entry per named view. Sorted by `order`, then `name`.
1625
+ *
1626
+ * Runtime-authored `shared` / `personal` views (`sys_view_definition`) are
1627
+ * merged in by the REST layer; this method returns the `package` layer that
1628
+ * was registered from source.
1629
+ */
1630
+ async getViewsByObject(object) {
1631
+ const views = await this.list("view");
1632
+ return views.filter(
1633
+ (v) => v && typeof v === "object" && v.viewKind && v.object === object
1634
+ ).sort(
1635
+ (a, b) => (a.order ?? 0) - (b.order ?? 0) || String(a.name).localeCompare(String(b.name))
1636
+ );
1637
+ }
1601
1638
  /**
1602
1639
  * Convenience: get a dashboard definition by name
1603
1640
  */
@@ -2147,13 +2184,18 @@ var _MetadataManager = class _MetadataManager {
2147
2184
  async getTypeInfo(type) {
2148
2185
  const entry = this.typeRegistry.find((e) => e.type === type);
2149
2186
  if (!entry) return void 0;
2187
+ const byName = /* @__PURE__ */ new Map();
2188
+ for (const a of entry.actions ?? []) byName.set(a.name, a);
2189
+ for (const a of getMetadataTypeActions(type)) byName.set(a.name, a);
2190
+ const actions = Array.from(byName.values());
2150
2191
  return {
2151
2192
  type: entry.type,
2152
2193
  label: entry.label,
2153
2194
  description: entry.description,
2154
2195
  filePatterns: entry.filePatterns,
2155
2196
  supportsOverlay: entry.supportsOverlay,
2156
- domain: entry.domain
2197
+ domain: entry.domain,
2198
+ ...actions.length > 0 ? { actions } : {}
2157
2199
  };
2158
2200
  }
2159
2201
  // ==========================================
@@ -3106,12 +3148,19 @@ import { applyProtection } from "@objectstack/spec/shared";
3106
3148
  import {
3107
3149
  SysMetadataObject as SysMetadataObject2,
3108
3150
  SysMetadataHistoryObject as SysMetadataHistoryObject2,
3109
- SysMetadataAuditObject
3151
+ SysMetadataAuditObject,
3152
+ SysViewDefinitionObject
3110
3153
  } from "@objectstack/platform-objects/metadata";
3154
+ import { isAggregatedViewContainer, expandViewContainer } from "@objectstack/spec";
3155
+ import { isAggregatedViewContainer as isAggregatedViewContainer2, expandViewContainer as expandViewContainer2 } from "@objectstack/spec";
3111
3156
  var queryableMetadataObjects = [
3112
3157
  SysMetadataObject2,
3113
3158
  SysMetadataHistoryObject2,
3114
- SysMetadataAuditObject
3159
+ SysMetadataAuditObject,
3160
+ // Runtime view storage (shared / personal). Must always be provisioned so
3161
+ // end-user view creation via the generic data API has a place to write —
3162
+ // mirroring why sys_metadata is always provisioned for PUT /meta.
3163
+ SysViewDefinitionObject
3115
3164
  ];
3116
3165
  var REPO_SUBDIR = ".objectstack/metadata";
3117
3166
  var ARTIFACT_FIELD_TO_TYPE = {
@@ -3125,7 +3174,6 @@ var ARTIFACT_FIELD_TO_TYPE = {
3125
3174
  actions: "action",
3126
3175
  themes: "theme",
3127
3176
  workflows: "workflow",
3128
- approvals: "approval",
3129
3177
  flows: "flow",
3130
3178
  roles: "role",
3131
3179
  permissions: "permission",
@@ -3423,6 +3471,27 @@ var MetadataPlugin = class {
3423
3471
  const items = metadata[field];
3424
3472
  if (!Array.isArray(items) || items.length === 0) continue;
3425
3473
  for (const item of items) {
3474
+ if (metaType === "view" && isAggregatedViewContainer2(item)) {
3475
+ const viewObject = item?.list?.data?.object ?? item?.form?.data?.object;
3476
+ if (!viewObject) continue;
3477
+ applyProtection(item, {
3478
+ packageId: manifestPackageId,
3479
+ packageVersion: manifestVersion
3480
+ });
3481
+ await memLoader.save("view", viewObject, item);
3482
+ await this.manager.register("view", viewObject, item);
3483
+ totalRegistered++;
3484
+ for (const vi of expandViewContainer2(viewObject, item)) {
3485
+ applyProtection(vi, {
3486
+ packageId: manifestPackageId,
3487
+ packageVersion: manifestVersion
3488
+ });
3489
+ await memLoader.save("view", vi.name, vi);
3490
+ await this.manager.register("view", vi.name, vi);
3491
+ totalRegistered++;
3492
+ }
3493
+ continue;
3494
+ }
3426
3495
  let name = item?.name;
3427
3496
  if (!name) {
3428
3497
  if (metaType === "view") {