@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.cjs CHANGED
@@ -208,6 +208,7 @@ __export(node_exports, {
208
208
  module.exports = __toCommonJS(node_exports);
209
209
 
210
210
  // src/metadata-manager.ts
211
+ var import_kernel = require("@objectstack/spec/kernel");
211
212
  var import_core = require("@objectstack/core");
212
213
 
213
214
  // src/serializers/json-serializer.ts
@@ -1489,6 +1490,22 @@ var _MetadataManager = class _MetadataManager {
1489
1490
  }
1490
1491
  }
1491
1492
  }
1493
+ /**
1494
+ * Register a metadata item into the in-memory registry ONLY, never persisting
1495
+ * to a writable loader. Used for GitOps-managed artefacts that must be
1496
+ * *listable* (so `list(type)` returns them) but must never leak into the
1497
+ * runtime DB store — e.g. code-defined datasources (`origin:'code'`, ADR-0015
1498
+ * Addendum) declared in `*.datasource.ts` and owned by source control. Writing
1499
+ * them through `register()` would persist them to `sys_metadata` and create
1500
+ * drift between the artefact and the DB; this method avoids that.
1501
+ */
1502
+ registerInMemory(type, name, data) {
1503
+ if (!this.registry.has(type)) {
1504
+ this.registry.set(type, /* @__PURE__ */ new Map());
1505
+ }
1506
+ this.registry.get(type).set(name, data);
1507
+ this.invalidateListCache(type);
1508
+ }
1492
1509
  /**
1493
1510
  * Get a metadata item by type and name.
1494
1511
  * Checks in-memory registry first, then falls back to loaders.
@@ -1643,6 +1660,26 @@ var _MetadataManager = class _MetadataManager {
1643
1660
  }
1644
1661
  return views;
1645
1662
  }
1663
+ /**
1664
+ * List the independent ViewItems bound to an object, sorted for the runtime
1665
+ * view switcher / Studio left rail ("Object has-many View").
1666
+ *
1667
+ * Returns only expanded ViewItems (those carrying a `viewKind`) — never the
1668
+ * legacy aggregated container kept under the bare `<object>` key — so callers
1669
+ * get exactly one entry per named view. Sorted by `order`, then `name`.
1670
+ *
1671
+ * Runtime-authored `shared` / `personal` views (`sys_view_definition`) are
1672
+ * merged in by the REST layer; this method returns the `package` layer that
1673
+ * was registered from source.
1674
+ */
1675
+ async getViewsByObject(object) {
1676
+ const views = await this.list("view");
1677
+ return views.filter(
1678
+ (v) => v && typeof v === "object" && v.viewKind && v.object === object
1679
+ ).sort(
1680
+ (a, b) => (a.order ?? 0) - (b.order ?? 0) || String(a.name).localeCompare(String(b.name))
1681
+ );
1682
+ }
1646
1683
  /**
1647
1684
  * Convenience: get a dashboard definition by name
1648
1685
  */
@@ -2192,13 +2229,18 @@ var _MetadataManager = class _MetadataManager {
2192
2229
  async getTypeInfo(type) {
2193
2230
  const entry = this.typeRegistry.find((e) => e.type === type);
2194
2231
  if (!entry) return void 0;
2232
+ const byName = /* @__PURE__ */ new Map();
2233
+ for (const a of entry.actions ?? []) byName.set(a.name, a);
2234
+ for (const a of (0, import_kernel.getMetadataTypeActions)(type)) byName.set(a.name, a);
2235
+ const actions = Array.from(byName.values());
2195
2236
  return {
2196
2237
  type: entry.type,
2197
2238
  label: entry.label,
2198
2239
  description: entry.description,
2199
2240
  filePatterns: entry.filePatterns,
2200
2241
  supportsOverlay: entry.supportsOverlay,
2201
- domain: entry.domain
2242
+ domain: entry.domain,
2243
+ ...actions.length > 0 ? { actions } : {}
2202
2244
  };
2203
2245
  }
2204
2246
  // ==========================================
@@ -3146,13 +3188,19 @@ var MemoryLoader = class {
3146
3188
  };
3147
3189
 
3148
3190
  // src/plugin.ts
3149
- var import_kernel = require("@objectstack/spec/kernel");
3191
+ var import_kernel2 = require("@objectstack/spec/kernel");
3150
3192
  var import_shared = require("@objectstack/spec/shared");
3151
3193
  var import_metadata2 = require("@objectstack/platform-objects/metadata");
3194
+ var import_spec = require("@objectstack/spec");
3195
+ var import_spec2 = require("@objectstack/spec");
3152
3196
  var queryableMetadataObjects = [
3153
3197
  import_metadata2.SysMetadataObject,
3154
3198
  import_metadata2.SysMetadataHistoryObject,
3155
- import_metadata2.SysMetadataAuditObject
3199
+ import_metadata2.SysMetadataAuditObject,
3200
+ // Runtime view storage (shared / personal). Must always be provisioned so
3201
+ // end-user view creation via the generic data API has a place to write —
3202
+ // mirroring why sys_metadata is always provisioned for PUT /meta.
3203
+ import_metadata2.SysViewDefinitionObject
3156
3204
  ];
3157
3205
  var REPO_SUBDIR = ".objectstack/metadata";
3158
3206
  var ARTIFACT_FIELD_TO_TYPE = {
@@ -3166,7 +3214,6 @@ var ARTIFACT_FIELD_TO_TYPE = {
3166
3214
  actions: "action",
3167
3215
  themes: "theme",
3168
3216
  workflows: "workflow",
3169
- approvals: "approval",
3170
3217
  flows: "flow",
3171
3218
  roles: "role",
3172
3219
  permissions: "permission",
@@ -3399,7 +3446,7 @@ var MetadataPlugin = class {
3399
3446
  watch: effectiveWatch,
3400
3447
  formats: ["yaml", "json", "typescript", "javascript"]
3401
3448
  });
3402
- this.manager.setTypeRegistry(import_kernel.DEFAULT_METADATA_TYPE_REGISTRY);
3449
+ this.manager.setTypeRegistry(import_kernel2.DEFAULT_METADATA_TYPE_REGISTRY);
3403
3450
  }
3404
3451
  /**
3405
3452
  * Fetch JSON content from a URL with configurable timeout.
@@ -3464,6 +3511,27 @@ var MetadataPlugin = class {
3464
3511
  const items = metadata[field];
3465
3512
  if (!Array.isArray(items) || items.length === 0) continue;
3466
3513
  for (const item of items) {
3514
+ if (metaType === "view" && (0, import_spec2.isAggregatedViewContainer)(item)) {
3515
+ const viewObject = item?.list?.data?.object ?? item?.form?.data?.object;
3516
+ if (!viewObject) continue;
3517
+ (0, import_shared.applyProtection)(item, {
3518
+ packageId: manifestPackageId,
3519
+ packageVersion: manifestVersion
3520
+ });
3521
+ await memLoader.save("view", viewObject, item);
3522
+ await this.manager.register("view", viewObject, item);
3523
+ totalRegistered++;
3524
+ for (const vi of (0, import_spec2.expandViewContainer)(viewObject, item)) {
3525
+ (0, import_shared.applyProtection)(vi, {
3526
+ packageId: manifestPackageId,
3527
+ packageVersion: manifestVersion
3528
+ });
3529
+ await memLoader.save("view", vi.name, vi);
3530
+ await this.manager.register("view", vi.name, vi);
3531
+ totalRegistered++;
3532
+ }
3533
+ continue;
3534
+ }
3467
3535
  let name = item?.name;
3468
3536
  if (!name) {
3469
3537
  if (metaType === "view") {
@@ -3529,7 +3597,7 @@ var MetadataPlugin = class {
3529
3597
  }
3530
3598
  async _loadFromFileSystem(ctx) {
3531
3599
  ctx.logger.info("Loading metadata from file system...");
3532
- const sortedTypes = [...import_kernel.DEFAULT_METADATA_TYPE_REGISTRY].sort((a, b) => a.loadOrder - b.loadOrder);
3600
+ const sortedTypes = [...import_kernel2.DEFAULT_METADATA_TYPE_REGISTRY].sort((a, b) => a.loadOrder - b.loadOrder);
3533
3601
  let totalLoaded = 0;
3534
3602
  for (const entry of sortedTypes) {
3535
3603
  try {
@@ -3659,9 +3727,9 @@ var RemoteLoader = class {
3659
3727
  var import_metadata3 = require("@objectstack/platform-objects/metadata");
3660
3728
 
3661
3729
  // src/utils/history-cleanup.ts
3662
- var import_kernel2 = require("@objectstack/spec/kernel");
3730
+ var import_kernel3 = require("@objectstack/spec/kernel");
3663
3731
  function executionPinnedTypes() {
3664
- return import_kernel2.DEFAULT_METADATA_TYPE_REGISTRY.filter((entry) => entry.executionPinned).map((entry) => entry.type);
3732
+ return import_kernel3.DEFAULT_METADATA_TYPE_REGISTRY.filter((entry) => entry.executionPinned).map((entry) => entry.type);
3665
3733
  }
3666
3734
  var HistoryCleanupManager = class {
3667
3735
  constructor(policy, dbLoader) {