@antelopejs/interface-dms 0.13.3 → 0.14.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.
Files changed (204) hide show
  1. package/CHANGELOG.md +196 -2
  2. package/README.md +9 -9
  3. package/dist/auth/db/models/sessions.model.d.ts +3 -3
  4. package/dist/auth/db/models/userExternalIdentities.model.d.ts +3 -3
  5. package/dist/auth/db/models/users.model.d.ts +3 -3
  6. package/dist/auth/db/tables/users.table.d.ts +3 -3
  7. package/dist/base/activity-feed.d.ts +2 -2
  8. package/dist/base/block-registry/types.d.ts +1 -1
  9. package/dist/base/chart-schemas.d.ts +70 -70
  10. package/dist/base/chart.d.ts +1 -1
  11. package/dist/base/data-types/default/choices.d.ts +1 -1
  12. package/dist/base/data-types/default/choices.js +3 -6
  13. package/dist/base/data-types/default/choices.js.map +1 -1
  14. package/dist/base/data-types/default/inputs.d.ts +1 -1
  15. package/dist/base/data-types/default/numbers.d.ts +2 -1
  16. package/dist/base/data-types/default/numbers.js +4 -3
  17. package/dist/base/data-types/default/numbers.js.map +1 -1
  18. package/dist/base/data-types/default/relations.d.ts +0 -6
  19. package/dist/base/data-types/default/relations.js +0 -1
  20. package/dist/base/data-types/default/relations.js.map +1 -1
  21. package/dist/base/data-types/default-types.d.ts +0 -1
  22. package/dist/base/data-types/default-types.js +0 -2
  23. package/dist/base/data-types/default-types.js.map +1 -1
  24. package/dist/base/data-types/index.js +0 -1
  25. package/dist/base/data-types/index.js.map +1 -1
  26. package/dist/base/data-types/internal/relation-endpoints.js +5 -3
  27. package/dist/base/data-types/internal/relation-endpoints.js.map +1 -1
  28. package/dist/base/data-types/internal/table-view-meta-slot.d.ts +17 -0
  29. package/dist/base/data-types/internal/table-view-meta-slot.js +25 -0
  30. package/dist/base/data-types/internal/table-view-meta-slot.js.map +1 -0
  31. package/dist/base/empty-state.d.ts +1 -1
  32. package/dist/base/export-jobs.d.ts +47 -19
  33. package/dist/base/export-jobs.js +39 -4
  34. package/dist/base/export-jobs.js.map +1 -1
  35. package/dist/base/form-schema.d.ts +0 -1
  36. package/dist/base/form-schema.js +12 -12
  37. package/dist/base/form-schema.js.map +1 -1
  38. package/dist/base/grid.js +1 -1
  39. package/dist/base/grid.js.map +1 -1
  40. package/dist/base/guard.d.ts +4 -4
  41. package/dist/base/guard.js +1 -1
  42. package/dist/base/guard.js.map +1 -1
  43. package/dist/base/helpers/file-refs.js +4 -6
  44. package/dist/base/helpers/file-refs.js.map +1 -1
  45. package/dist/base/internal/chart.d.ts +1 -1
  46. package/dist/base/internal/chart.js +1 -1
  47. package/dist/base/internal/chart.js.map +1 -1
  48. package/dist/base/internal/export-jobs.d.ts +11 -0
  49. package/dist/base/internal/export-jobs.js +11 -0
  50. package/dist/base/internal/export-jobs.js.map +1 -1
  51. package/dist/base/internal/form-block-schema.d.ts +1 -1
  52. package/dist/base/internal/form-block-schema.js +1 -1
  53. package/dist/base/internal/form-block-schema.js.map +1 -1
  54. package/dist/base/key-value-list.d.ts +6 -6
  55. package/dist/base/meter.d.ts +1 -1
  56. package/dist/base/placeholder.js +1 -1
  57. package/dist/base/placeholder.js.map +1 -1
  58. package/dist/base/searchable.d.ts +3 -3
  59. package/dist/base/searchable.js.map +1 -1
  60. package/dist/base/stack.js +1 -1
  61. package/dist/base/stack.js.map +1 -1
  62. package/dist/base/tab.js +1 -1
  63. package/dist/base/tab.js.map +1 -1
  64. package/dist/base/table-view/data-functions.d.ts +10 -11
  65. package/dist/base/table-view/data-functions.js.map +1 -1
  66. package/dist/base/table-view/factory.js +2 -0
  67. package/dist/base/table-view/factory.js.map +1 -1
  68. package/dist/base/table-view/internal/archive-filter.d.ts +21 -0
  69. package/dist/base/table-view/internal/archive-filter.js +48 -0
  70. package/dist/base/table-view/internal/archive-filter.js.map +1 -0
  71. package/dist/base/table-view/internal/auth.d.ts +2 -2
  72. package/dist/base/table-view/internal/auth.js +1 -3
  73. package/dist/base/table-view/internal/auth.js.map +1 -1
  74. package/dist/base/table-view/internal/column-conditions.js.map +1 -1
  75. package/dist/base/table-view/internal/data-functions.d.ts +2 -2
  76. package/dist/base/table-view/internal/factory-lifecycle-created.js +3 -2
  77. package/dist/base/table-view/internal/factory-lifecycle-created.js.map +1 -1
  78. package/dist/base/table-view/internal/footer.js +21 -13
  79. package/dist/base/table-view/internal/footer.js.map +1 -1
  80. package/dist/base/table-view/internal/guards.d.ts +1 -1
  81. package/dist/base/table-view/internal/guards.js +11 -8
  82. package/dist/base/table-view/internal/guards.js.map +1 -1
  83. package/dist/base/table-view/internal/meta-helpers.js +3 -2
  84. package/dist/base/table-view/internal/meta-helpers.js.map +1 -1
  85. package/dist/base/table-view/internal/nav-badges.js +1 -3
  86. package/dist/base/table-view/internal/nav-badges.js.map +1 -1
  87. package/dist/base/table-view/internal/option-views.d.ts +7 -4
  88. package/dist/base/table-view/internal/row-actions-schema.d.ts +6 -6
  89. package/dist/base/table-view/meta.d.ts +5 -5
  90. package/dist/base/table-view/meta.js +6 -2
  91. package/dist/base/table-view/meta.js.map +1 -1
  92. package/dist/base/table-view/routes.d.ts +39 -12
  93. package/dist/base/table-view/routes.js +0 -1
  94. package/dist/base/table-view/routes.js.map +1 -1
  95. package/dist/base/table-view/schema.d.ts +127 -127
  96. package/dist/base/top-list-card.d.ts +4 -4
  97. package/dist/component-options/data-type.d.ts +2 -1
  98. package/dist/component-options/data-type.js +1 -1
  99. package/dist/component-options/data-type.js.map +1 -1
  100. package/dist/component-slots.js +1 -1
  101. package/dist/component-slots.js.map +1 -1
  102. package/dist/connection-access.d.ts +46 -0
  103. package/dist/connection-access.js +73 -0
  104. package/dist/connection-access.js.map +1 -0
  105. package/dist/data-controllers/members.d.ts +15 -2
  106. package/dist/data-controllers/roles.d.ts +15 -2
  107. package/dist/db/internal/exportJobs.model.d.ts +3 -3
  108. package/dist/db/internal/inviteResolutions.model.d.ts +3 -3
  109. package/dist/db/internal/tenantLifecycle.model.d.ts +4 -4
  110. package/dist/db/internal/tenantLifecycle.model.js +2 -3
  111. package/dist/db/internal/tenantLifecycle.model.js.map +1 -1
  112. package/dist/db/models/roles.model.d.ts +3 -3
  113. package/dist/db/models/tenantMembers.model.d.ts +3 -3
  114. package/dist/db/models/tenants.model.d.ts +3 -3
  115. package/dist/db/models/user_invites.model.d.ts +18 -3
  116. package/dist/db/models/user_invites.model.js +28 -0
  117. package/dist/db/models/user_invites.model.js.map +1 -1
  118. package/dist/db/tables/user_invites.table.d.ts +6 -1
  119. package/dist/db/tables/user_invites.table.js +3 -0
  120. package/dist/db/tables/user_invites.table.js.map +1 -1
  121. package/dist/index.d.ts +1 -1
  122. package/dist/index.js +3 -2
  123. package/dist/index.js.map +1 -1
  124. package/dist/internal/component-slots.js +1 -1
  125. package/dist/internal/component-slots.js.map +1 -1
  126. package/dist/internal/invite-content.d.ts +8 -0
  127. package/dist/internal/invite-content.js +36 -0
  128. package/dist/internal/invite-content.js.map +1 -0
  129. package/dist/internal/tenant-ownership.d.ts +5 -4
  130. package/dist/internal/tenant-ownership.js +5 -4
  131. package/dist/internal/tenant-ownership.js.map +1 -1
  132. package/dist/invite-extensions/internal/delivery.d.ts +3 -2
  133. package/dist/invite-extensions/internal/delivery.js +3 -2
  134. package/dist/invite-extensions/internal/delivery.js.map +1 -1
  135. package/dist/invite-resolution.d.ts +5 -1
  136. package/dist/invite-resolution.js +10 -26
  137. package/dist/invite-resolution.js.map +1 -1
  138. package/dist/invites.d.ts +5 -0
  139. package/dist/invites.js +27 -1
  140. package/dist/invites.js.map +1 -1
  141. package/dist/notifications/internal.d.ts +0 -1
  142. package/dist/notifications/internal.js +0 -1
  143. package/dist/notifications/internal.js.map +1 -1
  144. package/dist/notifications/sendable.d.ts +1 -2
  145. package/dist/notifications/sendable.js +1 -12
  146. package/dist/notifications/sendable.js.map +1 -1
  147. package/dist/notifications/types.d.ts +1 -4
  148. package/dist/page/categories.d.ts +6 -0
  149. package/dist/page/categories.js +10 -3
  150. package/dist/page/categories.js.map +1 -1
  151. package/dist/page/controllers.d.ts +6 -9
  152. package/dist/page/controllers.js +5 -6
  153. package/dist/page/controllers.js.map +1 -1
  154. package/dist/page/internal/categories.js +43 -32
  155. package/dist/page/internal/categories.js.map +1 -1
  156. package/dist/page/internal/category-resolution.d.ts +31 -0
  157. package/dist/page/internal/category-resolution.js +63 -0
  158. package/dist/page/internal/category-resolution.js.map +1 -0
  159. package/dist/page/internal/metadata-extension-contributions.js +1 -2
  160. package/dist/page/internal/metadata-extension-contributions.js.map +1 -1
  161. package/dist/page/internal/metadata-info.js +19 -7
  162. package/dist/page/internal/metadata-info.js.map +1 -1
  163. package/dist/page/internal/metadata-layout.d.ts +3 -2
  164. package/dist/page/internal/metadata-layout.js.map +1 -1
  165. package/dist/page/internal/metadata-lifecycle.js +1 -4
  166. package/dist/page/internal/metadata-lifecycle.js.map +1 -1
  167. package/dist/page/internal/metadata-publish.js +7 -6
  168. package/dist/page/internal/metadata-publish.js.map +1 -1
  169. package/dist/page/internal/metadata-registration.js +8 -6
  170. package/dist/page/internal/metadata-registration.js.map +1 -1
  171. package/dist/page/internal/page-controller.d.ts +18 -0
  172. package/dist/page/internal/page-controller.js +36 -0
  173. package/dist/page/internal/page-controller.js.map +1 -0
  174. package/dist/page/metadata.d.ts +3 -3
  175. package/dist/page/metadata.js +4 -2
  176. package/dist/page/metadata.js.map +1 -1
  177. package/dist/page/types.d.ts +8 -2
  178. package/dist/page.d.ts +1 -1
  179. package/dist/page.js +2 -1
  180. package/dist/page.js.map +1 -1
  181. package/dist/permissions.d.ts +2 -1
  182. package/dist/permissions.js +5 -2
  183. package/dist/permissions.js.map +1 -1
  184. package/dist/tenant-provisioning.js +1 -1
  185. package/dist/tenant-provisioning.js.map +1 -1
  186. package/dist/types.d.ts +7 -3
  187. package/docs/1.core/11.modules-and-dynamic-menus.md +3 -3
  188. package/docs/1.core/2.pages-and-modules.md +2 -1
  189. package/docs/1.core/4.permissions.md +2 -2
  190. package/docs/1.core/5.tenancy.md +1 -1
  191. package/docs/1.core/6.invites.md +3 -1
  192. package/docs/2.auth/2.authentication.md +1 -1
  193. package/docs/2.auth/3.tokens-and-sessions.md +1 -1
  194. package/docs/3.base/1.introduction.md +1 -1
  195. package/docs/3.base/14.table-events-and-helpers.md +1 -1
  196. package/docs/3.base/15.table-sources-and-gates.md +14 -2
  197. package/docs/3.base/3.forms.md +1 -1
  198. package/docs/3.base/4.tables.md +1 -1
  199. package/docs/3.base/5.charts-and-widgets.md +3 -3
  200. package/docs/3.base/8.data-types.md +1 -1
  201. package/docs/3.base/9.helpers.md +16 -5
  202. package/docs/4.notifications/3.sending.md +0 -11
  203. package/docs/index.md +1 -1
  204. package/package.json +11 -11
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PageTargetError = void 0;
4
+ exports.pageController = pageController;
5
+ const type_check_1 = require("../../utils/internal/type-check");
6
+ /**
7
+ * A page's metadata whose target is not a controller class: a class built
8
+ * with `Controller(location)` or `PageController(...)`. `GetMetadata` builds
9
+ * page metadata for every link of a class's prototype chain, so the target is
10
+ * typed as any decorator target; a page is only ever declared on a controller.
11
+ */
12
+ class PageTargetError extends TypeError {
13
+ constructor(target) {
14
+ super(`A page is declared on a controller class, not on ${target.constructor.name}`);
15
+ this.name = new.target.name;
16
+ }
17
+ }
18
+ exports.PageTargetError = PageTargetError;
19
+ function isControllerClass(target) {
20
+ return ((0, type_check_1.isClass)(target) &&
21
+ "extend" in target &&
22
+ (0, type_check_1.isFunction)(target.extend) &&
23
+ "location" in target &&
24
+ (0, type_check_1.isString)(target.location));
25
+ }
26
+ /**
27
+ * The controller class a page's metadata was built for.
28
+ *
29
+ * @throws {PageTargetError} When the target is not a controller class.
30
+ */
31
+ function pageController(target) {
32
+ if (isControllerClass(target))
33
+ return target;
34
+ throw new PageTargetError(target);
35
+ }
36
+ //# sourceMappingURL=page-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-controller.js","sourceRoot":"","sources":["../../../src/page/internal/page-controller.ts"],"names":[],"mappings":";;;AAmCA,wCAGC;AAnCD,gEAAgF;AAEhF;;;;;GAKG;AACH,MAAa,eAAgB,SAAQ,SAAS;IAC5C,YAAY,MAAuB;QACjC,KAAK,CACH,oDAAoD,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAC9E,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9B,CAAC;CACF;AAPD,0CAOC;AAED,SAAS,iBAAiB,CAAC,MAAuB;IAChD,OAAO,CACL,IAAA,oBAAO,EAAC,MAAM,CAAC;QACf,QAAQ,IAAI,MAAM;QAClB,IAAA,uBAAU,EAAC,MAAM,CAAC,MAAM,CAAC;QACzB,UAAU,IAAI,MAAM;QACpB,IAAA,qBAAQ,EAAC,MAAM,CAAC,QAAQ,CAAC,CAC1B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAAC,MAAuB;IACpD,IAAI,iBAAiB,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7C,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
@@ -1,9 +1,9 @@
1
- import { type ControllerClass } from "@antelopejs/interface-api";
1
+ import type { DecoratorTarget } from "@antelopejs/interface-core/decorators";
2
2
  import { type Component, type ComponentInfo } from "../component";
3
3
  import { type TenantGuardOptions } from "../guards";
4
4
  import { type MenuOptions, type PageInfo } from "./types";
5
5
  export declare class PageMetadata {
6
- readonly target: ControllerClass;
6
+ readonly target: DecoratorTarget;
7
7
  static key: symbol;
8
8
  pageInfo?: PageInfo;
9
9
  layout?: ComponentInfo;
@@ -41,7 +41,7 @@ export declare class PageMetadata {
41
41
  private registeredPagePermission;
42
42
  private skipComponentPermissions;
43
43
  private moduleScoped;
44
- constructor(target: ControllerClass);
44
+ constructor(target: DecoratorTarget);
45
45
  inherit(parent: PageMetadata): void;
46
46
  SetComponent(id: string, component: Component): void;
47
47
  SetInfo(id: string, fullSlug: string, menuOptions: MenuOptions, pageLayout?: ComponentInfo): void;
@@ -35,13 +35,15 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.PageMetadata = void 0;
37
37
  const metadata_upload_registration_1 = require("./internal/metadata-upload-registration");
38
- // oxlint-disable-next-line import/no-cycle -- Category proxies are read after evaluation.
39
38
  const metadata = __importStar(require("./internal/metadata-lifecycle"));
39
+ const category_resolution_1 = require("./internal/category-resolution");
40
+ const page_controller_1 = require("./internal/page-controller");
40
41
  const type_check_1 = require("../utils/internal/type-check");
41
42
  class PageMetadata {
42
43
  target;
43
44
  static key = Symbol();
44
45
  static {
46
+ (0, category_resolution_1.installPageMetadata)(PageMetadata);
45
47
  metadata.installMetadataOwner((page) => ({
46
48
  get registration() {
47
49
  return page.registration;
@@ -317,7 +319,7 @@ class PageMetadata {
317
319
  return metadata.registerPermission(this, pageInfo);
318
320
  }
319
321
  registerLayoutRoute(pageInfo) {
320
- metadata.registerLayoutRoute(() => this.target, pageInfo, () => this.registration, (request) => this.resolvePageLayout(request), (request, options) => this.resolvePageLayout(request, options));
322
+ metadata.registerLayoutRoute(() => (0, page_controller_1.pageController)(this.target), pageInfo, () => this.registration, (request) => this.resolvePageLayout(request), (request, options) => this.resolvePageLayout(request, options));
321
323
  }
322
324
  async resolvePageLayout({ user, memberModel, roleModel, tenantId, query, params, resolverContext, }, { enforceTenantAccessGate = false } = {}) {
323
325
  const layout = metadata.registeredLayout(this);
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/page/metadata.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/page/metadata.ts"],"names":[],"mappings":"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"}
@@ -69,8 +69,7 @@ export declare const MODULE_URL_PREFIX = "/modules";
69
69
  export type ModuleStatus = "live" | "beta" | "update" | "attention";
70
70
  /**
71
71
  * Tone of one readout line: `success` (healthy figure), `info` (neutral
72
- * fact), `warning` (worth a look) or `error` (something is failing). The
73
- * former `ok` is still read as `success` in 0.4, with a warning.
72
+ * fact), `warning` (worth a look) or `error` (something is failing).
74
73
  */
75
74
  export type ModuleReadoutTone = Extract<Tone, "success" | "info" | "warning" | "error">;
76
75
  /**
@@ -237,6 +236,13 @@ export interface MenuOptions {
237
236
  validation?: PageValidation;
238
237
  setupId?: string;
239
238
  noComponentPermissions?: boolean;
239
+ /**
240
+ * Only platform owners reach the entry, as on a module page: no role can be
241
+ * granted it or its blocks, Roles does not list them, anyone else gets 403.
242
+ * Inherited under a category; wins over `publicAccess`, `authOnly` and
243
+ * `memberAccess`.
244
+ */
245
+ ownerOnly?: boolean;
240
246
  /**
241
247
  * Query parameters carried by the entry's menu link, so a single page with
242
248
  * `validation.requiredQueryParams` can serve many entries
package/dist/page.d.ts CHANGED
@@ -19,7 +19,7 @@
19
19
  * (`extension-assembly`), extension validation, component targets and trees,
20
20
  * form page route claims and the registration identities.
21
21
  */
22
- export { internal, isInsideModule } from "./page/categories";
22
+ export { internal, isInsideModule, isOwnerOnly } from "./page/categories";
23
23
  export { AddFrontendModule, type AddFrontendModuleOptions, Category, type FrontendBackendProxy, type FrontendModuleContext, type FrontendModuleFunction, type FrontendModuleMetadata, type FrontendModuleOptions, type FrontendModuleRegistration, type FrontendModuleValue, type FrontendPublicEndpoint, type FrontendRendererMetadata, FrontendModulesChanged, GetFrontendModules, NotifyMenuChanged, PageController, RegisterDynamicMenuProvider, RegisterPage, RegisterPageExtension, RootCategory, RootPageController, } from "./page/controllers";
24
24
  export { PageDeclarationConflictError } from "./page/declaration-conflict";
25
25
  export { FormPageRouteConflictError } from "./page/form-page-routes";
package/dist/page.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.GetRegisteredPageIds = exports.GetPermissionId = exports.GetPageLayoutBySlug = exports.GetComponentPermissionIds = exports.ClearPageLayoutBySlug = exports.PageMetadata = exports.FormPageRouteConflictError = exports.PageDeclarationConflictError = exports.RootPageController = exports.RootCategory = exports.RegisterPageExtension = exports.RegisterPage = exports.RegisterDynamicMenuProvider = exports.PageController = exports.NotifyMenuChanged = exports.GetFrontendModules = exports.FrontendModulesChanged = exports.Category = exports.AddFrontendModule = exports.isInsideModule = exports.internal = void 0;
17
+ exports.GetRegisteredPageIds = exports.GetPermissionId = exports.GetPageLayoutBySlug = exports.GetComponentPermissionIds = exports.ClearPageLayoutBySlug = exports.PageMetadata = exports.FormPageRouteConflictError = exports.PageDeclarationConflictError = exports.RootPageController = exports.RootCategory = exports.RegisterPageExtension = exports.RegisterPage = exports.RegisterDynamicMenuProvider = exports.PageController = exports.NotifyMenuChanged = exports.GetFrontendModules = exports.FrontendModulesChanged = exports.Category = exports.AddFrontendModule = exports.isOwnerOnly = exports.isInsideModule = exports.internal = void 0;
18
18
  /**
19
19
  * Public entry of the page system, split by concern under `./page/`:
20
20
  *
@@ -39,6 +39,7 @@ exports.GetRegisteredPageIds = exports.GetPermissionId = exports.GetPageLayoutBy
39
39
  var categories_1 = require("./page/categories");
40
40
  Object.defineProperty(exports, "internal", { enumerable: true, get: function () { return categories_1.internal; } });
41
41
  Object.defineProperty(exports, "isInsideModule", { enumerable: true, get: function () { return categories_1.isInsideModule; } });
42
+ Object.defineProperty(exports, "isOwnerOnly", { enumerable: true, get: function () { return categories_1.isOwnerOnly; } });
42
43
  var controllers_1 = require("./page/controllers");
43
44
  Object.defineProperty(exports, "AddFrontendModule", { enumerable: true, get: function () { return controllers_1.AddFrontendModule; } });
44
45
  Object.defineProperty(exports, "Category", { enumerable: true, get: function () { return controllers_1.Category; } });
package/dist/page.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","sourceRoot":"","sources":["../src/page.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,gDAA6D;AAApD,sGAAA,QAAQ,OAAA;AAAE,4GAAA,cAAc,OAAA;AACjC,kDAsB4B;AArB1B,gHAAA,iBAAiB,OAAA;AAEjB,uGAAA,QAAQ,OAAA;AAUR,qHAAA,sBAAsB,OAAA;AACtB,iHAAA,kBAAkB,OAAA;AAClB,gHAAA,iBAAiB,OAAA;AACjB,6GAAA,cAAc,OAAA;AACd,0HAAA,2BAA2B,OAAA;AAC3B,2GAAA,YAAY,OAAA;AACZ,oHAAA,qBAAqB,OAAA;AACrB,2GAAA,YAAY,OAAA;AACZ,iHAAA,kBAAkB,OAAA;AAEpB,oEAA2E;AAAlE,oIAAA,4BAA4B,OAAA;AACrC,4DAAqE;AAA5D,8HAAA,0BAA0B,OAAA;AACnC,4CAA+C;AAAtC,wGAAA,YAAY,OAAA;AACrB,qDAAmC;AACnC,4CAMyB;AALvB,iHAAA,qBAAqB,OAAA;AACrB,qHAAA,yBAAyB,OAAA;AACzB,+GAAA,mBAAmB,OAAA;AACnB,2GAAA,eAAe,OAAA;AACf,gHAAA,oBAAoB,OAAA;AAEtB,+CAA6B;AAC7B,+CAA6B"}
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../src/page.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,gDAA0E;AAAjE,sGAAA,QAAQ,OAAA;AAAE,4GAAA,cAAc,OAAA;AAAE,yGAAA,WAAW,OAAA;AAC9C,kDAsB4B;AArB1B,gHAAA,iBAAiB,OAAA;AAEjB,uGAAA,QAAQ,OAAA;AAUR,qHAAA,sBAAsB,OAAA;AACtB,iHAAA,kBAAkB,OAAA;AAClB,gHAAA,iBAAiB,OAAA;AACjB,6GAAA,cAAc,OAAA;AACd,0HAAA,2BAA2B,OAAA;AAC3B,2GAAA,YAAY,OAAA;AACZ,oHAAA,qBAAqB,OAAA;AACrB,2GAAA,YAAY,OAAA;AACZ,iHAAA,kBAAkB,OAAA;AAEpB,oEAA2E;AAAlE,oIAAA,4BAA4B,OAAA;AACrC,4DAAqE;AAA5D,8HAAA,0BAA0B,OAAA;AACnC,4CAA+C;AAAtC,wGAAA,YAAY,OAAA;AACrB,qDAAmC;AACnC,4CAMyB;AALvB,iHAAA,qBAAqB,OAAA;AACrB,qHAAA,yBAAyB,OAAA;AACzB,+GAAA,mBAAmB,OAAA;AACnB,2GAAA,eAAe,OAAA;AACf,gHAAA,oBAAoB,OAAA;AAEtB,+CAA6B;AAC7B,+CAA6B"}
@@ -36,7 +36,8 @@ export declare const GetPermission: (id: string) => Promise<Permission | undefin
36
36
  export declare const GetPermissions: () => Promise<Record<string, PermissionTree>>;
37
37
  /**
38
38
  * Compute the user's BASE permission set from role grants (or `*` for
39
- * platform owners). This set does not account for registered permissions
39
+ * platform owners). Only `user.owner` yields `*`: a role that stores `*` grants
40
+ * nothing through it. This set does not account for registered permissions
40
41
  * resolvers (e.g. plan gating): authorization surfaces must use
41
42
  * {@link GetEffectiveUserPermissions} instead so that every surface (guards,
42
43
  * menus, table views, search) agrees on the same effective set.
@@ -44,7 +44,8 @@ exports.GetPermission = (0, interface_core_1.InterfaceFunction)();
44
44
  exports.GetPermissions = (0, interface_core_1.InterfaceFunction)();
45
45
  /**
46
46
  * Compute the user's BASE permission set from role grants (or `*` for
47
- * platform owners). This set does not account for registered permissions
47
+ * platform owners). Only `user.owner` yields `*`: a role that stores `*` grants
48
+ * nothing through it. This set does not account for registered permissions
48
49
  * resolvers (e.g. plan gating): authorization surfaces must use
49
50
  * {@link GetEffectiveUserPermissions} instead so that every surface (guards,
50
51
  * menus, table views, search) agrees on the same effective set.
@@ -57,7 +58,9 @@ async function GetUserPermissions(user, roleIds, roleModel) {
57
58
  return new Set();
58
59
  }
59
60
  const roles = await roleModel.getBy("_id", ...roleIds);
60
- return new Set(roles.flatMap((role) => role.permissions));
61
+ return new Set(roles
62
+ .flatMap((role) => role.permissions)
63
+ .filter((permissionId) => permissionId !== "*"));
61
64
  }
62
65
  /**
63
66
  * Compute the user's EFFECTIVE permission set: base permissions from roles,
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"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"}
@@ -21,7 +21,7 @@ const hooks_1 = require("./hooks");
21
21
  async function ProvisionTenant(payload) {
22
22
  const schema = interface_database_1.Schema.get(constants_1.TENANT_SCHEMA_NAME);
23
23
  (0, node_assert_1.strict)(schema, `Schema '${constants_1.TENANT_SCHEMA_NAME}' is not registered`);
24
- await schema.createInstance(payload.tenantId);
24
+ await schema.createInstance(payload.tenantId).run();
25
25
  await (0, hooks_1.ExecuteHooks)(hooks_1.Hook.TENANT_BEING_PROVISIONED, payload);
26
26
  }
27
27
  //# sourceMappingURL=tenant-provisioning.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tenant-provisioning.js","sourceRoot":"","sources":["../src/tenant-provisioning.ts"],"names":[],"mappings":";;AAsBA,0CAOC;AA7BD,6CAA+C;AAC/C,uEAAwD;AACxD,2CAAiD;AACjD,mCAIiB;AAEjB;;;;;;;;;;;;GAYG;AACI,KAAK,UAAU,eAAe,CACnC,OAAsC;IAEtC,MAAM,MAAM,GAAG,2BAAM,CAAC,GAAG,CAAC,8BAAkB,CAAC,CAAC;IAC9C,IAAA,oBAAM,EAAC,MAAM,EAAE,WAAW,8BAAkB,qBAAqB,CAAC,CAAC;IACnE,MAAM,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,IAAA,oBAAY,EAAC,YAAI,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"tenant-provisioning.js","sourceRoot":"","sources":["../src/tenant-provisioning.ts"],"names":[],"mappings":";;AAsBA,0CAOC;AA7BD,6CAA+C;AAC/C,uEAAwD;AACxD,2CAAiD;AACjD,mCAIiB;AAEjB;;;;;;;;;;;;GAYG;AACI,KAAK,UAAU,eAAe,CACnC,OAAsC;IAEtC,MAAM,MAAM,GAAG,2BAAM,CAAC,GAAG,CAAC,8BAAkB,CAAC,CAAC;IAC9C,IAAA,oBAAM,EAAC,MAAM,EAAE,WAAW,8BAAkB,qBAAqB,CAAC,CAAC;IACnE,MAAM,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;IACpD,MAAM,IAAA,oBAAY,EAAC,YAAI,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC"}
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { ControllerClass } from "@antelopejs/interface-api";
1
+ import type { DecoratorTarget } from "@antelopejs/interface-core/decorators";
2
2
  export type MaybePromise<T> = T | Promise<T>;
3
3
  /** An image stored by key, as the image data type and `User.avatar` hold it. */
4
4
  export interface ImageValue {
@@ -11,8 +11,12 @@ export interface ImageValue {
11
11
  * the page registers. `PageMetadata` implements it.
12
12
  */
13
13
  export interface CreatedPage {
14
- /** The page controller the component is placed on. */
15
- readonly target: ControllerClass;
14
+ /**
15
+ * The page controller the component is placed on, as page metadata holds
16
+ * it. `pageController` (`@antelopejs/interface-dms/page/internal/page-controller`)
17
+ * narrows it to the controller class, or throws `PageTargetError`.
18
+ */
19
+ readonly target: DecoratorTarget;
16
20
  /** The id and slug the page registered under, from the root category. */
17
21
  readonly pageInfo?: {
18
22
  readonly fullId: string;
@@ -86,12 +86,12 @@ A page that declares both `module` and a `category` must name a category under t
86
86
 
87
87
  `MODULE_URL_PREFIX` is `"/modules"`. The module root's `urlSlug` is the module id and its parent is `modulesCategory`, so module pages resolve under `/modules/<moduleId>/...`. Their ids follow the same chain. The module root's `fullId` is `modules.<moduleId>`. A page attached to the root is `modules.<moduleId>.<pageId>`, and a page in the default category is `modules.<moduleId>.pages.<pageId>`.
88
88
 
89
- `isInsideModule(entry)` returns whether an entry belongs to a module. It accepts any object with optional `module`, `category` and `isModuleRoot` fields, so a `CategoryInfo` or a `PageInfo` qualifies. It returns `true` when the entry is a module root or declares `module`, and otherwise walks the category chain looking for a module root.
89
+ `isInsideModule(entry)` returns whether an entry belongs to a module. It accepts any object with optional `module`, `category` and `isModuleRoot` fields, so a `CategoryInfo` or a `PageInfo` qualifies. It returns `true` when the entry is a module root or declares `module`, and otherwise walks the category chain looking for a module root. `isOwnerOnly(entry)` also holds for an entry that declares or inherits `ownerOnly`, and it decides who reaches the entry.
90
90
 
91
91
  ```typescript fragment
92
- import { isInsideModule } from "@antelopejs/interface-dms/page";
92
+ import { isOwnerOnly } from "@antelopejs/interface-dms/page";
93
93
 
94
- if (isInsideModule(pageInfo)) {
94
+ if (isOwnerOnly(pageInfo)) {
95
95
  showOwnerBadge();
96
96
  }
97
97
  ```
@@ -68,6 +68,7 @@ The third argument is the page layout, a `ComponentInfo` from a layout builder s
68
68
  | `validation` | `PageValidation` | Preconditions for opening the page. |
69
69
  | `setupId` | `string` | Id of a page setup function to run while the page is mounted. |
70
70
  | `noComponentPermissions` | `boolean` | Registers no permission for the page's components. |
71
+ | `ownerOnly` | `boolean` | Only a platform owner reaches the entry, as on a module page. Its permission and its components' are marked module-scoped instead of registered, so no role can be granted them and the roles editor does not list them. Anyone else is refused with `403`. A page inherits it from its category, and it wins over `publicAccess`, `authOnly` and `memberAccess`. |
71
72
  | `query` | `MenuItemQuery` | Query parameters carried by the entry's menu link. |
72
73
  | `variant` | `MenuItemVariant` | Semantic look of the entry. |
73
74
  | `status` | `MenuItemStatus` | Semantic state dot at the end of the entry. |
@@ -146,7 +147,7 @@ export const contacts = Category("contacts", {
146
147
  });
147
148
  ```
148
149
 
149
- Creating a category registers a permission keyed to its `fullId`. The permission is `defaultGranted` when the category declares `publicAccess` or `memberAccess`, and its `permission` option overrides the derived fields. A category inside a module marks its id module-scoped instead, and a category whose `permission` is an `Action` registers none. [Permissions](/docs/interfaces/core/permissions) covers both.
150
+ Creating a category registers a permission keyed to its `fullId`. The permission is `defaultGranted` when the category declares `publicAccess` or `memberAccess`, and its `permission` option overrides the derived fields. A category inside a module or declaring `ownerOnly` marks its id module-scoped instead, and a category whose `permission` is an `Action` registers none. [Permissions](/docs/interfaces/core/permissions) covers both.
150
151
 
151
152
  ### Root categories
152
153
 
@@ -4,7 +4,7 @@ description: "Permission ids are dot-separated strings built from the page tree.
4
4
  mode: reference
5
5
  ---
6
6
 
7
- A permission id is a dot-separated string built from the page tree: a page's `fullId`, then every component id in the position's path, then the action id when there is one. A role holds a flat list of granted ids, and a platform owner holds the wildcard `*`. `GetUserPermissions` returns the base set a user's roles grant. `GetEffectiveUserPermissions` runs that set through the registered resolvers, and every authorization surface uses the effective set.
7
+ A permission id is a dot-separated string built from the page tree: a page's `fullId`, then every component id in the position's path, then the action id when there is one. A role holds a flat list of granted ids, and a platform owner, a user flagged `owner`, holds the wildcard `*`. `GetUserPermissions` returns the base set a user's roles grant, without `*`: a role that lists it grants nothing through it. `GetEffectiveUserPermissions` runs that set through the registered resolvers, and every authorization surface uses the effective set.
8
8
 
9
9
  The API spans three subpaths:
10
10
 
@@ -152,7 +152,7 @@ UnmarkModuleScopedPermission("modules.automation.builder");
152
152
 
153
153
  `IsModuleScopedPermission(id)` checks the id and each id above it, one dot-separated segment at a time, so marking a page id also covers every component and action id derived from it. In the example, `scoped` is `true`. `UnmarkModuleScopedPermission(id)` removes the mark for that exact id only.
154
154
 
155
- Page and category registration calls `MarkModuleScopedPermission` whenever `isInsideModule` holds ([Modules and dynamic menus](/docs/interfaces/core/modules-and-dynamic-menus#module-urls-and-ids)). Call it directly only for ids you build outside that path.
155
+ Page and category registration calls `MarkModuleScopedPermission` whenever `isOwnerOnly` holds: the entry is inside a module or declares `ownerOnly` ([Modules and dynamic menus](/docs/interfaces/core/modules-and-dynamic-menus#module-urls-and-ids)). Call it directly only for ids you build outside that path.
156
156
 
157
157
  ## Reshape the effective set
158
158
 
@@ -280,7 +280,7 @@ await applyTenantOwnership(GetModel(UserModel), userId, tenantId, {
280
280
 
281
281
  `applyTenantOwnership` goes through [`changeTenantMembers`](#changetenantmembers), which fires `Hook.MEMBER_BEING_CHANGED` before any write, so a module can veto it. When the user is not a member yet, it also fires `Hook.MEMBER_BEING_ADDED` before the write and `Hook.MEMBER_ADDED` after it. For an existing member, it updates `roleIds` and `isTenantOwner` and fires neither of those two hooks ([Hooks](/docs/interfaces/core/hooks)).
282
282
 
283
- Two helpers keep the legacy platform-owner flag on the user row aligned with tenant ownership:
283
+ Two helpers keep the platform-owner flag on the user row aligned with tenant ownership:
284
284
 
285
285
  | Function | Signature |
286
286
  | -------- | --------- |
@@ -91,7 +91,7 @@ if (result.kind === "invited" && result.emailDelivery === "failed") {
91
91
 
92
92
  ## Create an invite token directly
93
93
 
94
- `createUserInviteToken` is the lower-level function. It always creates a row, and it never touches memberships or email.
94
+ `createUserInviteToken` is the lower-level function. It creates a row, and it never touches memberships or email.
95
95
 
96
96
  ```typescript fragment
97
97
  import { createUserInviteToken } from "@antelopejs/interface-dms/invites";
@@ -124,6 +124,8 @@ const { inviteId, token } = await createUserInviteToken({
124
124
 
125
125
  An existing invite for the same email in the same tenant is retired through a durable decision. Completion invokes `Hook.INVITE_DELETED` for the old invitation, creates the replacement through `Hook.INVITE_BEING_CREATED` and `Hook.INVITE_CREATED`, and removes the old row. A failed completion can replay hooks with the same delivery identity. See [Durable invite resolution](#durable-invite-resolution) and [Hooks](/docs/interfaces/core/hooks).
126
126
 
127
+ When concurrent calls for one email all find no invite, the tenant keeps one. A unique index on `email` and `creationResolutionId` refuses the second row. The call that loses returns the kept invite's `inviteId` and `token` when it asked for the same content, and fails with HTTP 409 when it did not.
128
+
127
129
  `inviteeDisplayName(firstname?, lastname?)` joins the two names into the name the invite email uses, and returns `undefined` when the invite carries neither. `inviteUserToTenant` calls it for you. Call it yourself when you render your own invite screen from a stored row, so a nameless invite falls back the same way the email does.
128
130
 
129
131
  ## Token constants
@@ -19,7 +19,7 @@ The `User` type they inject comes from `@antelopejs/interface-dms/auth/db` and i
19
19
 
20
20
  ## Require an authenticated user
21
21
 
22
- `AuthUser` injects the `User`, and enforces email validation when the deployment sets `auth.mustValidateEmail`. A caller whose email is not validated then gets `401` (`Email not validated`). Use it on any route that must have a signed-in caller.
22
+ `AuthUser` injects the `User`, and enforces email validation when the deployment sets `auth.mustValidateEmail`. A caller whose email is not validated then gets `401` (`Email not validated`). A token that is malformed, names no existing user, is badly signed, expired or issued for another purpose gets `401` (`Invalid session token`) whatever the reason, so a forged token cannot tell whether its `id` names a user. A token whose session was signed out gets `401` (`error.session_expired`). Use it on any route that must have a signed-in caller.
23
23
 
24
24
  ```typescript
25
25
  import { Controller, Get } from "@antelopejs/interface-api";
@@ -86,7 +86,7 @@ validateRefreshToken(
86
86
  ): Promise<{ id: string; tenantId: string; sessionId?: string }>
87
87
  ```
88
88
 
89
- The function decodes the token, loads the user it names, and verifies the signature against that user. It also checks that the token was issued as a refresh token and carries non-empty `id` and `tenantId` claims. It throws `HTTPResult(401)` when the user no longer exists (`Invalid user`), and when the token is malformed, expired, badly signed or issued for another purpose. It returns the claims only. The caller must still confirm three things: that the session exists, that the token is its current one (`isCurrentRefreshToken`), and that the user still has access to `tenantId`.
89
+ The function decodes the token, loads the user it names, and verifies the signature against that user. It also checks that the token was issued as a refresh token and carries non-empty `id` and `tenantId` claims. It throws `HTTPResult(401)` with the same message, `Invalid session token`, when the token is malformed, names no existing user, is badly signed, expired or issued for another purpose, so a forged token cannot tell whether its `id` names a user. A token naming no user is still verified, against a key no token is signed with, so the refusal takes as long either way. It returns the claims only. The caller must still confirm three things: that the session exists, that the token is its current one (`isCurrentRefreshToken`), and that the user still has access to `tenantId`.
90
90
 
91
91
  ```typescript
92
92
  import { HTTPResult } from "@antelopejs/interface-api";
@@ -172,7 +172,7 @@ export class SettingsPage extends PageController(
172
172
  _id: SETTINGS_ROW_ID,
173
173
  enabled: result.data.enabled ?? false,
174
174
  retentionDays: result.data.retentionDays,
175
- }, { conflict: "update" });
175
+ }, { conflict: "update" }).run();
176
176
  }
177
177
  }
178
178
  ```
@@ -83,7 +83,7 @@ Each entry of `config.columns` carries `id`, `header`, `isVisible`, `type` (the
83
83
 
84
84
  ## Route helpers
85
85
 
86
- `table-view` also exports the interface functions the wrapped routes call. They are the seam between the interface and its implementation. A consumer wires them by declaring `TableViewRoutes`, and does not normally call them directly.
86
+ `table-view` also exports the interface functions the wrapped routes call. They are the seam between the interface and its implementation. A consumer wires them by declaring `TableViewRoutes`, and does not normally call them directly. Each takes first the data controller instance the route runs on (`this` in the route, a `DataControllerInstance`), not a route descriptor.
87
87
 
88
88
  | Function | Role |
89
89
  | --- | --- |
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  title: "Table sources and tenant gates"
3
- description: Table views over a module's own route, and table views that stay readable behind a tenant access gate.
3
+ description: Table views over a module's own route, table views that stay readable behind a tenant access gate, and table views over an external connection.
4
4
  mode: reference
5
5
  ---
6
6
 
7
- A [table view](/docs/interfaces/base/tables) usually reads a data controller. These two cases differ: a table view over a module's own route, and a table view that stays readable while a tenant access gate denies the tenant.
7
+ A [table view](/docs/interfaces/base/tables) usually reads a data controller. These three cases differ: a table view over a module's own route, a table view that stays readable while a tenant access gate denies the tenant, and a table view over a table of an external connection.
8
8
 
9
9
  ## Tables over a module's route
10
10
 
@@ -22,3 +22,15 @@ Data routes are registered against the controller, not against a page, so the op
22
22
 
23
23
  - Declaring the flag on a controller opens its routes for every table view built on it, including one mounted on an ordinary page.
24
24
  - Actions that carry no permission id, such as a plain list on a component that was never mounted, are then served to any member of a denied tenant. That is the escape hatch working as intended, so keep every action of a flagged controller stamped with a permission.
25
+
26
+ ## Write to an external connection
27
+
28
+ `@ExternalConnection(connection)`, from `@antelopejs/interface-dms/connection-access`, marks a data controller whose table belongs to an external connection, as the builder does on each table it maps. Its `TableViewRoutes` write routes (`new`, `edit`, `delete`, `archive`, `restore`) then call `AssertConnectionWritable` first, which answers 403 unless `GetConnectionAccess(connection)` is `"read-write"`. Reads are not affected.
29
+
30
+ ```typescript fragment
31
+ @RegisterDataController()
32
+ @ExternalConnection("erp")
33
+ export class CountryDataAPI extends DataController(Country, TableViewRoutes.All, Controller("/erp/countries")) {}
34
+ ```
35
+
36
+ The module that owns the connections answers their access with `RegisterConnectionAccessSource(id, source)` during `construct()`, as `dms-database` does from `config.externalConnections`. `source(connection)` returns `"read"`, `"read-write"`, or `undefined` for a connection it does not own. A connection is `"read-write"` only when a source answers `"read-write"` and none answers `"read"`, so a connection no source answers stays read-only. A route a module writes itself on a marked controller calls `AssertConnectionWritable(controller)` before it writes.
@@ -301,7 +301,7 @@ The option interfaces live in the same namespace. The ones with more than a plac
301
301
  | `DatePickerRangeOptions` | `minDate?`, `maxDate?` |
302
302
  | `RelationOptions` | `searchUrl: string`, `placeholder?`, `multiple?`, `deselectable?`, `keyMapping?: { label?, value?, avatar?, disabled? }`, `addForm?: ComponentInfoSerialized<FormPropsSerialized>`, `addPermissionIds?: string[]`, `addFormTexts?: { displayName?, description? }` |
303
303
  | `CascaderRelationKeyMapping` | `label: string`, `value: string`, `parent: string`, `disabled?` |
304
- | `CascaderRelationOptions` | `searchUrl: string`, `keyMapping: CascaderRelationKeyMapping`, `placeholder?`, `multiple?`, `deselectable?`, `maxDepth?`, `leafOnly?`, `fallback?` |
304
+ | `CascaderRelationOptions` | `searchUrl: string`, `keyMapping: CascaderRelationKeyMapping`, `placeholder?`, `multiple?`, `deselectable?`, `maxDepth?`, `leafOnly?` |
305
305
  | `AddressOptions` | `placeholder?` (per address component), `autocomplete?: DefaultDataTypes.AddressAutocomplete` |
306
306
  | `FileOptions` | `multiple?`, `constraints?: { maxSize?, allowedMimetypes? }`, `path?`, `storage?` |
307
307
  | `ImageOptions` | `FileOptions` plus `max?` and `resize?: ImageResizeOptions` |
@@ -178,7 +178,7 @@ export class customerDataAPI extends DataController(/* … */) {
178
178
 
179
179
  ### The archive field
180
180
 
181
- `@ArchiveField` marks the boolean field that carries the archived state. It records the field on the table view metadata and also applies `Filter()` and `Listable()` to it, because archive filtering needs both.
181
+ `@ArchiveField` marks the boolean field that carries the archived state. It makes the field `Listable()` and registers a filter that reads `true` or `false` with `eq` or `ne`. `TableView` throws when another `Filter` replaces it.
182
182
 
183
183
  ```typescript fragment
184
184
  import { ArchiveField } from "@antelopejs/interface-dms/base/table-view";
@@ -310,7 +310,7 @@ const card = ChartCard({
310
310
  | `periodScope` | `string` | Id of the `PeriodSelector` to follow. |
311
311
  | `valueFormat` | `ValueFormat` | How the headline value is formatted. |
312
312
  | `currencyCode` | `string` | Currency for `valueFormat: "currency"`. |
313
- | `valuePrecision` | `ValuePrecision` | Fixed fraction digits or `"native"` Intl defaults; omitted keeps legacy formatting. Also applies to the previous value and nested chart's value axis and tooltip. |
313
+ | `valuePrecision` | `ValuePrecision` | Fixed fraction digits or `"native"` Intl defaults; omitted uses the format's default: whole currency amounts, at most one fraction digit for percent and compact. Also applies to the previous value and nested chart's value axis and tooltip. |
314
314
  | `showDelta` | `boolean` | Show the change against the comparison period. |
315
315
  | `invert` | `boolean` | Treat an increase as bad, for metrics where lower is better. |
316
316
  | `showLegend` | `boolean` | Show the primary / comparison legend. Defaults to `true`. |
@@ -349,7 +349,7 @@ const denied = KpiCard({
349
349
  | `realtimeTopic` | `string \| string[]` | Topics whose events make the card read `fetchUrl` again, through the page's `live` gate. The builder registers them on the page. |
350
350
  | `valueFormat` | `ValueFormat` | How the value is formatted. |
351
351
  | `currencyCode` | `string` | Currency for `valueFormat: "currency"`. |
352
- | `valuePrecision` | `ValuePrecision` | Fixed fraction digits or `"native"` Intl defaults; omitted keeps legacy formatting. |
352
+ | `valuePrecision` | `ValuePrecision` | Fixed fraction digits or `"native"` Intl defaults; omitted uses the format's default: whole currency amounts, at most one fraction digit for percent and compact. |
353
353
  | `showDelta` | `boolean` | Show the change against the comparison period. |
354
354
  | `showPreviousValue` | `boolean` | Show the route's `previousValue` next to the change ("vs €42,900"), formatted as the value. Defaults to `true`. |
355
355
  | `showSparkline` | `boolean` | Show the sparkline. |
@@ -389,7 +389,7 @@ const topSkills = TopListCard({
389
389
  | `periodScope` | `string` | Id of the `PeriodSelector` to follow. |
390
390
  | `valueFormat` | `ValueFormat` | How each item's value is formatted. |
391
391
  | `currencyCode` | `string` | Currency for `valueFormat: "currency"`. |
392
- | `valuePrecision` | `ValuePrecision` | Fixed fraction digits or `"native"` Intl defaults; omitted keeps legacy formatting. |
392
+ | `valuePrecision` | `ValuePrecision` | Fixed fraction digits or `"native"` Intl defaults; omitted uses the format's default: whole currency amounts, at most one fraction digit for percent and compact. |
393
393
  | `valueSuffix` | `string` | Unit written right after each formatted value, space included (`" ms"`); a `$`-prefixed key is translated. Not added to a `valueLabel`. |
394
394
  | `showRank` | `boolean` | Show the rank number. |
395
395
  | `highlightTopN` | `number` | How many leading items are highlighted. |
@@ -361,7 +361,7 @@ The type's options are `placeholder` (one string per address component), `autoco
361
361
 
362
362
  `FileTypeOptions` has `multiple?`, `constraints?: UploadConstraints`, `path?`, `storage?` and `fallback?`. `ImageTypeOptions` has `multiple?`, `max?`, `constraints?`, `path?`, `storage?` and `resize?`, the `FormComponents.ImageResizeOptions` the input applies client-side before uploading ([Forms](/docs/interfaces/base/forms)). Both accept `attachmentField?` for a stable native field identity and `visibility?: "private" | "public"`, defaulting to private. `constraints` is the `UploadConstraints` type from `@antelopejs/interface-file-storage`; `storage` names the storage backend and `path` the prefix uploads land under.
363
363
 
364
- A file value is the resource key as a string. Metadata-based validation checks configured constraints, matching `allowedMimetypes` patterns including the `type/*` form. A native field's save integration also validates upload provenance and canonical metadata before persistence. Existing unclassified legacy values may be retained, but cannot be introduced as new native attachments or read through the native metadata endpoint. A storage outage propagates as a server error rather than becoming a field validation error. An image value is an `ImageValue`, `{ key: string; alt?: string; principal?: boolean }`, and `ImageType` defaults `allowedMimetypes` to `["image/*"]`, caps the array at `max` when `multiple` is set, and rejects a list with more than one `principal` image.
364
+ A file value is the resource key as a string. Metadata-based validation checks configured constraints, matching `allowedMimetypes` patterns including the `type/*` form. A native field's save integration also validates upload provenance and canonical metadata before persistence. A key with no recorded upload is refused with HTTP 403, both in the submitted document and in the previously stored one, and the native metadata endpoint does not read it. A storage outage propagates as a server error rather than becoming a field validation error. An image value is an `ImageValue`, `{ key: string; alt?: string; principal?: boolean }`, and `ImageType` defaults `allowedMimetypes` to `["image/*"]`, caps the array at `max` when `multiple` is set, and rejects a list with more than one `principal` image.
365
365
 
366
366
  Both types enable the table view's native file handling: authorized saves promote staging keys, and successful edits or deletes clean removed native references. Failed saves retain promoted objects; cleanup is not reference-counted across records. See [File storage](/docs/components/file-storage) for authorization, visibility, retries, and custom save routes, and [Helpers](/docs/interfaces/base/helpers) for comparing references within records.
367
367
 
@@ -145,7 +145,7 @@ function runExportJob<TContext = unknown>(
145
145
  | `ctx` | `RequestContext` | The request. The job is stored in the schema of the tenant the request resolves to. Required. |
146
146
  | `user` | `User` | The owner of the job. Required; a missing user fails with `401`. |
147
147
  | `scope` | `string` | Free-form identifier for the origin of the job, checked again on status and download when you pass it there. Required. |
148
- | `context` | `TContext` | Scope-specific payload stored with the job and handed back to `generate` and to `isOwnedBy`. |
148
+ | `context` | `TContext` | Scope-specific payload stored with the job as JSON. `generate` receives it as passed; `isOwnedBy` receives it read back through `contextSchema`. |
149
149
  | `filename` | `string` | Base name of the produced file, without extension or timestamp. Required. |
150
150
  | `extension` | `string` | File extension. Required. |
151
151
  | `contentType` | `string` | MIME type used when uploading and when streaming the file back. Required. |
@@ -188,7 +188,7 @@ By default a job is deleted once it has been downloaded. Set `retainUntilExpiry`
188
188
  | `jobId` | `string` | Identifier of this job. |
189
189
  | `tenantId` | `string` | Tenant the job belongs to. |
190
190
  | `localPath` | `string` | Path your generator writes the file to. |
191
- | `context` | `TContext` | The payload passed as `context` to `runExportJob`. |
191
+ | `context` | `TContext \| undefined` | The payload passed as `context` to `runExportJob`, `undefined` when it passed none. |
192
192
  | `reportProgress` | `(progress: number) => Promise<void>` | Records progress. The value is floored and clamped to `0` through `99`; repeating the last value writes nothing. Throws once the job is aborted. |
193
193
  | `signal` | `AbortSignal` | Aborted when the job exceeds `maxExecutionTimeMs`. |
194
194
 
@@ -216,7 +216,7 @@ function downloadExportJob<TContext = unknown>(
216
216
 
217
217
  `downloadExportJob` requires a completed job with a stored result. Anything else fails with `400` or `500`. It sets `Content-Disposition` (with a filename built by `buildExportFilename`), `Content-Length` when the size is known, and `Access-Control-Expose-Headers`, then pipes the stored object to the response. The function returns as soon as the pipe is set up rather than awaiting it; once the response stream closes, the stored object and the job record are both deleted.
218
218
 
219
- `loadExportJobForUser(ctx, user, jobId, access?)` is the shared step underneath both: it resolves the tenant, loads the record, runs the access checks, and returns the model, the record and the parsed context. Use it when you need the record itself rather than its status.
219
+ `loadExportJobForUser(ctx, user, jobId, access?)` is the shared step underneath both: it resolves the tenant, loads the record, runs the access checks, and returns the model and the record. Use it when you need the record itself rather than its status.
220
220
 
221
221
  `downloadExportJob` deletes the stored object and the job record once the response stream closes, unless the job was started with `retainUntilExpiry`, in which case both survive until the sweep.
222
222
 
@@ -239,9 +239,20 @@ Returns the caller's own jobs, most recent first: the history a scope such as a
239
239
  | Option | Type | Description |
240
240
  | --- | --- | --- |
241
241
  | `scope` | `string` | When set, the job's stored `scope` must match. |
242
- | `isOwnedBy` | `(record, context, user) => boolean` | Extra ACL evaluated after the ownership and scope checks. |
242
+ | `contextSchema` | `ZodType<TContext, ZodTypeDef, unknown>` | Reads back the `context` the job was started with, from the JSON it was stored as: `null` for a job started without one, a `Date` as its ISO string. A stored context it refuses refuses the job. Required with `isOwnedBy`. |
243
+ | `isOwnedBy` | `(record, context, user) => boolean` | Extra ACL evaluated after the ownership and scope checks, on the context `contextSchema` read. Required with `contextSchema`. |
243
244
 
244
- `ExportJobOwnership<TContext>` carries only `isOwnedBy`; `ExportJobAccessOptions<TContext>` extends it with `scope`. The job's `userId` is always compared against the caller regardless of what you pass, and every failed check answers `403`.
245
+ `ExportJobContextCheck<TContext>` is the pair `contextSchema` and `isOwnedBy`. `ExportJobOwnership<TContext>` is that pair or neither of its members, and `ExportJobAccessOptions<TContext>` adds `scope` to it. The job's `userId` is always compared against the caller regardless of what you pass, and every failed check answers `403`.
246
+
247
+ ```typescript fragment
248
+ import { z } from "zod";
249
+
250
+ const status = await getExportJobStatus(ctx, user, jobId, {
251
+ scope: SCOPE,
252
+ contextSchema: z.object({ year: z.number() }),
253
+ isOwnedBy: (_record, context) => context.year === new Date().getFullYear(),
254
+ });
255
+ ```
245
256
 
246
257
  ### Formats and delivery
247
258