@antelopejs/dms 0.4.7 → 0.5.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 (116) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/crons/index.d.ts +1 -0
  3. package/dist/crons/index.js +7 -1
  4. package/dist/crons/index.js.map +1 -1
  5. package/dist/crons/sweep-expired-sessions.d.ts +4 -0
  6. package/dist/crons/sweep-expired-sessions.js +27 -0
  7. package/dist/crons/sweep-expired-sessions.js.map +1 -0
  8. package/dist/db/models/userNotificationPreferences.model.js +17 -11
  9. package/dist/db/models/userNotificationPreferences.model.js.map +1 -1
  10. package/dist/db/tables/userNotifications.table.js +3 -0
  11. package/dist/db/tables/userNotifications.table.js.map +1 -1
  12. package/dist/hooks/invite-extensions.js +0 -2
  13. package/dist/hooks/invite-extensions.js.map +1 -1
  14. package/dist/implementations/dms/page.js +6 -7
  15. package/dist/implementations/dms/page.js.map +1 -1
  16. package/dist/implementations/dms/realtime.d.ts +2 -2
  17. package/dist/implementations/dms/realtime.js +9 -3
  18. package/dist/implementations/dms/realtime.js.map +1 -1
  19. package/dist/implementations/dms-base/table-view.d.ts +5 -0
  20. package/dist/implementations/dms-base/table-view.js +7 -1
  21. package/dist/implementations/dms-base/table-view.js.map +1 -1
  22. package/dist/pages/settings/users/profile-helpers.d.ts +2 -1
  23. package/dist/pages/settings/users/profile-helpers.js +9 -0
  24. package/dist/pages/settings/users/profile-helpers.js.map +1 -1
  25. package/dist/pages/settings/users/profile.js +2 -2
  26. package/dist/pages/settings/users/profile.js.map +1 -1
  27. package/dist/realtime/index.js +0 -2
  28. package/dist/realtime/index.js.map +1 -1
  29. package/dist/realtime/registry.d.ts +1 -0
  30. package/dist/realtime/registry.js +9 -0
  31. package/dist/realtime/registry.js.map +1 -1
  32. package/dist/realtime/table-view.d.ts +3 -0
  33. package/dist/realtime/table-view.js +25 -0
  34. package/dist/realtime/table-view.js.map +1 -0
  35. package/dist/routes/auth/refresh.d.ts +1 -1
  36. package/dist/routes/auth/refresh.js +2 -1
  37. package/dist/routes/auth/refresh.js.map +1 -1
  38. package/dist/routes/auth/switch-tenant.d.ts +1 -1
  39. package/dist/routes/auth/switch-tenant.js +2 -1
  40. package/dist/routes/auth/switch-tenant.js.map +1 -1
  41. package/dist/routes/onboarding.js +1 -1
  42. package/dist/routes/onboarding.js.map +1 -1
  43. package/dist/test/antelope.test.js +7 -1
  44. package/dist/test/antelope.test.js.map +1 -1
  45. package/dist/test/helpers/db.d.ts +1 -0
  46. package/dist/test/helpers/db.js +14 -0
  47. package/dist/test/helpers/db.js.map +1 -1
  48. package/dist/test/helpers/reload-host.d.ts +9 -0
  49. package/dist/test/helpers/reload-host.js +21 -0
  50. package/dist/test/helpers/reload-host.js.map +1 -0
  51. package/dist/test/integration/invite-resolution.test.js +0 -2
  52. package/dist/test/integration/invite-resolution.test.js.map +1 -1
  53. package/dist/test/reload-host/index.d.ts +2 -0
  54. package/dist/test/reload-host/index.js +32 -0
  55. package/dist/test/reload-host/index.js.map +1 -0
  56. package/dist/test/reload-host/package.json +8 -0
  57. package/dist/test/unit/db/email-normalization.test.d.ts +1 -0
  58. package/dist/test/unit/db/email-normalization.test.js +59 -0
  59. package/dist/test/unit/db/email-normalization.test.js.map +1 -0
  60. package/dist/test/unit/db/notification-feed-index.test.d.ts +1 -0
  61. package/dist/test/unit/db/notification-feed-index.test.js +35 -0
  62. package/dist/test/unit/db/notification-feed-index.test.js.map +1 -0
  63. package/dist/test/unit/db/notification-preferences.test.d.ts +1 -0
  64. package/dist/test/unit/db/notification-preferences.test.js +21 -0
  65. package/dist/test/unit/db/notification-preferences.test.js.map +1 -0
  66. package/dist/test/unit/db/session-refresh-token.test.d.ts +1 -0
  67. package/dist/test/unit/db/session-refresh-token.test.js +52 -0
  68. package/dist/test/unit/db/session-refresh-token.test.js.map +1 -0
  69. package/dist/test/unit/db/session-sweep.test.d.ts +1 -0
  70. package/dist/test/unit/db/session-sweep.test.js +44 -0
  71. package/dist/test/unit/db/session-sweep.test.js.map +1 -0
  72. package/dist/test/unit/frontend-renderer-range.test.d.ts +1 -0
  73. package/dist/test/unit/frontend-renderer-range.test.js +45 -0
  74. package/dist/test/unit/frontend-renderer-range.test.js.map +1 -0
  75. package/dist/test/unit/interfaces/dms/invite-extension.test.js +22 -24
  76. package/dist/test/unit/interfaces/dms/invite-extension.test.js.map +1 -1
  77. package/dist/test/unit/interfaces/dms/module-reload-registrations.test.d.ts +1 -0
  78. package/dist/test/unit/interfaces/dms/module-reload-registrations.test.js +51 -0
  79. package/dist/test/unit/interfaces/dms/module-reload-registrations.test.js.map +1 -0
  80. package/dist/test/unit/interfaces/dms/page-topics.test.d.ts +1 -0
  81. package/dist/test/unit/interfaces/dms/page-topics.test.js +194 -0
  82. package/dist/test/unit/interfaces/dms/page-topics.test.js.map +1 -0
  83. package/dist/test/unit/interfaces/dms-auth/refresh-token-rotation.test.js +74 -9
  84. package/dist/test/unit/interfaces/dms-auth/refresh-token-rotation.test.js.map +1 -1
  85. package/dist/test/unit/interfaces/dms-base/layouts.test.js +16 -0
  86. package/dist/test/unit/interfaces/dms-base/layouts.test.js.map +1 -1
  87. package/dist/test/unit/interfaces/dms-base/table-view-evaluation-order.fixture.d.ts +5 -0
  88. package/dist/test/unit/interfaces/dms-base/table-view-evaluation-order.fixture.js +82 -0
  89. package/dist/test/unit/interfaces/dms-base/table-view-evaluation-order.fixture.js.map +1 -0
  90. package/dist/test/unit/interfaces/dms-base/table-view-evaluation-order.test.d.ts +1 -0
  91. package/dist/test/unit/interfaces/dms-base/table-view-evaluation-order.test.js +24 -0
  92. package/dist/test/unit/interfaces/dms-base/table-view-evaluation-order.test.js.map +1 -0
  93. package/dist/test/unit/interfaces/dms-base/table-view-get-guard.test.js +10 -4
  94. package/dist/test/unit/interfaces/dms-base/table-view-get-guard.test.js.map +1 -1
  95. package/dist/test/unit/interfaces/dms-base/table-view-realtime.test.d.ts +1 -0
  96. package/dist/test/unit/interfaces/dms-base/table-view-realtime.test.js +139 -0
  97. package/dist/test/unit/interfaces/dms-base/table-view-realtime.test.js.map +1 -0
  98. package/dist/test/unit/pages/settings/profile-email-change.test.d.ts +1 -0
  99. package/dist/test/unit/pages/settings/profile-email-change.test.js +50 -0
  100. package/dist/test/unit/pages/settings/profile-email-change.test.js.map +1 -0
  101. package/dist/test/unit/utils/owned-registry.test.d.ts +1 -0
  102. package/dist/test/unit/utils/owned-registry.test.js +61 -0
  103. package/dist/test/unit/utils/owned-registry.test.js.map +1 -0
  104. package/dist/validation/auth.schema.d.ts +2 -2
  105. package/frontend-vue/layers/dms-layout/app/composables/layout/usePageFillHeight.ts +37 -0
  106. package/frontend-vue/layers/dms-layout/app/custom-layouts/DefaultLayout.vue +9 -0
  107. package/frontend-vue/layers/dms-layout/app/pages/[...slug].vue +16 -1
  108. package/frontend-vue/package.json +4 -1
  109. package/frontend-vue/pnpm-lock.yaml +8 -8
  110. package/frontend-vue/tests/page-fill-height.test.ts +352 -0
  111. package/package.json +6 -6
  112. package/skills/dms-module/REFERENCE.md +2 -1
  113. package/skills/dms-module/SKILL.md +5 -0
  114. package/dist/realtime/tableview-bridge.d.ts +0 -1
  115. package/dist/realtime/tableview-bridge.js +0 -38
  116. package/dist/realtime/tableview-bridge.js.map +0 -1
@@ -50,10 +50,11 @@ const metadata_1 = require("@antelopejs/interface-data-api/metadata");
50
50
  const interface_database_1 = require("@antelopejs/interface-database");
51
51
  const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
52
52
  const chai_1 = require("chai");
53
+ const table_view_1 = require("../../../../implementations/dms-base/table-view");
53
54
  const tenantAccessImpl = __importStar(require("../../../../implementations/dms/tenant-access"));
54
55
  const tenantAccess = __importStar(require("@antelopejs/interface-dms/tenant-access"));
56
+ const table_view_2 = require("@antelopejs/interface-dms/base/table-view");
55
57
  const meta_1 = require("@antelopejs/interface-dms/base/table-view/meta");
56
- const realtime_1 = require("@antelopejs/interface-dms/base/table-view/realtime");
57
58
  const routes_1 = require("@antelopejs/interface-dms/base/table-view/routes");
58
59
  const SCHEMA = "get-guard-test";
59
60
  const TABLE = "documents";
@@ -148,8 +149,13 @@ describe("[unit] TableView Get guard", () => {
148
149
  name: "Invoice",
149
150
  });
150
151
  [quoteId] = await model.insert({ documentType: "quote", name: "Quote" });
151
- (0, realtime_1.setRealtimePresenceHook)(() => {
152
- events.push("presence");
152
+ (0, interface_core_1.ImplementInterface)({ internal: table_view_2.internal }, {
153
+ internal: {
154
+ PublishMutation: async () => undefined,
155
+ AcquirePresence: async () => {
156
+ events.push("presence");
157
+ },
158
+ },
153
159
  });
154
160
  });
155
161
  beforeEach(() => {
@@ -166,7 +172,7 @@ describe("[unit] TableView Get guard", () => {
166
172
  });
167
173
  after(() => {
168
174
  tenantAccess.internal.RegisterTenantAccessGate.unregister(gate);
169
- (0, realtime_1.setRealtimePresenceHook)(() => { });
175
+ (0, interface_core_1.ImplementInterface)({ internal: table_view_2.internal }, { internal: table_view_1.internal });
170
176
  });
171
177
  it("authorizes, loads once, guards hidden data, transforms, then acquires presence", async () => {
172
178
  (0, chai_1.expect)(await get(invoiceId)).to.deep.equal({ name: "INVOICE" });
@@ -1 +1 @@
1
- {"version":3,"file":"table-view-get-guard.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/table-view-get-guard.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"table-view-get-guard.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/table-view-get-guard.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const interface_api_1 = require("@antelopejs/interface-api");
37
+ const interface_core_1 = require("@antelopejs/interface-core");
38
+ const internal_1 = require("@antelopejs/interface-core/internal");
39
+ const chai_1 = require("chai");
40
+ const table_view_1 = require("../../../../implementations/dms-base/table-view");
41
+ const tableViewInterface = __importStar(require("@antelopejs/interface-dms/base/table-view"));
42
+ const table_view_2 = require("@antelopejs/interface-dms/base/table-view");
43
+ const realtime_1 = require("@antelopejs/interface-dms/base/table-view/realtime");
44
+ const LOCATION = "/api/table-view-realtime";
45
+ const SESSION = "table-view-realtime-session";
46
+ const PRESENCE_ACQUIRE = "1";
47
+ const USER = { _id: "table-view-realtime-user", name: "Realtime" };
48
+ const REMOVED_SETTERS = [
49
+ "setRealtimeMutationHook",
50
+ "setRealtimePresenceHook",
51
+ "setRealtimePageTopicHook",
52
+ ];
53
+ class RowsAPI extends (0, interface_api_1.Controller)(LOCATION) {
54
+ }
55
+ const controller = new RowsAPI();
56
+ const deliveries = [];
57
+ const editRoute = (0, realtime_1.withRealtimeMutation)({ eventType: "updated", extractIds: realtime_1.extractSingleParamId }, { method: "post", args: [], func: async () => ({ ok: true }) });
58
+ const getRoute = (0, realtime_1.withPresenceAcquire)({
59
+ method: "get",
60
+ args: [],
61
+ func: async () => ({ ok: true }),
62
+ });
63
+ function edit(id) {
64
+ return editRoute.func.call(controller, undefined, { id }, SESSION, USER);
65
+ }
66
+ function open(id) {
67
+ return getRoute.func.call(controller, undefined, { id }, SESSION, PRESENCE_ACQUIRE, USER);
68
+ }
69
+ function generation(name) {
70
+ return {
71
+ internal: {
72
+ PublishMutation: async ({ eventType, ids }) => {
73
+ deliveries.push(`${name} ${eventType} ${ids.join(",")}`);
74
+ },
75
+ AcquirePresence: async ({ rowId }) => {
76
+ deliveries.push(`${name} presence ${rowId}`);
77
+ },
78
+ },
79
+ };
80
+ }
81
+ function attach(implementation) {
82
+ (0, interface_core_1.ImplementInterface)({ internal: table_view_2.internal }, implementation);
83
+ }
84
+ function detachGeneration() {
85
+ for (const fn of [table_view_2.internal.PublishMutation, table_view_2.internal.AcquirePresence]) {
86
+ fn.proxy.detach();
87
+ }
88
+ }
89
+ function settle() {
90
+ return new Promise((resolve) => setImmediate(resolve));
91
+ }
92
+ describe("[unit] interfaces/dms-base — table-view realtime across DMS generations", () => {
93
+ beforeEach(() => {
94
+ deliveries.length = 0;
95
+ });
96
+ after(() => {
97
+ attach({ internal: table_view_1.internal });
98
+ });
99
+ it("delivers to the generation that implements the interface now", async () => {
100
+ attach(generation("first"));
101
+ await edit("row-1");
102
+ await open("row-1");
103
+ attach(generation("second"));
104
+ await edit("row-2");
105
+ await open("row-2");
106
+ (0, chai_1.expect)(deliveries).to.deep.equal([
107
+ "first updated row-1",
108
+ "first presence row-1",
109
+ "second updated row-2",
110
+ "second presence row-2",
111
+ ]);
112
+ });
113
+ it("holds what a route sends between two generations for the next one", async () => {
114
+ attach(generation("first"));
115
+ detachGeneration();
116
+ const stubMode = internal_1.internal.testStubMode;
117
+ internal_1.internal.testStubMode = false;
118
+ try {
119
+ const routes = Promise.all([edit("row-3"), open("row-3")]);
120
+ await settle();
121
+ (0, chai_1.expect)(deliveries).to.deep.equal([]);
122
+ attach(generation("second"));
123
+ await routes;
124
+ }
125
+ finally {
126
+ internal_1.internal.testStubMode = stubMode;
127
+ }
128
+ (0, chai_1.expect)(deliveries).to.deep.equal([
129
+ "second updated row-3",
130
+ "second presence row-3",
131
+ ]);
132
+ });
133
+ it("offers no setter to leave a DMS callback in the interface", () => {
134
+ for (const setter of REMOVED_SETTERS) {
135
+ (0, chai_1.expect)(tableViewInterface).to.not.have.property(setter);
136
+ }
137
+ });
138
+ });
139
+ //# sourceMappingURL=table-view-realtime.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-view-realtime.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/table-view-realtime.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const interface_api_1 = require("@antelopejs/interface-api");
4
+ const chai_1 = require("chai");
5
+ const profile_helpers_1 = require("../../../../pages/settings/users/profile-helpers");
6
+ const HTTP_CONFLICT = 409;
7
+ const EMAIL_TAKEN = "error.email_already_used";
8
+ const CURRENT_USER_ID = "profile-email-current";
9
+ const OTHER_USER_ID = "profile-email-other";
10
+ const OTHER_EMAIL = "holder@acme.dev";
11
+ const FREE_EMAIL = "free@acme.dev";
12
+ const OWN_EMAIL = "mine@acme.dev";
13
+ function modelHolding(accounts) {
14
+ return {
15
+ getByEmail: async (lookup) => {
16
+ const id = accounts[lookup.trim().toLowerCase()];
17
+ return id ? { _id: id } : undefined;
18
+ },
19
+ };
20
+ }
21
+ async function attempt(userModel, email) {
22
+ try {
23
+ return await (0, profile_helpers_1.assertEmailAvailable)(userModel, email, CURRENT_USER_ID);
24
+ }
25
+ catch (error) {
26
+ if (error instanceof interface_api_1.HTTPResult)
27
+ return error;
28
+ throw error;
29
+ }
30
+ }
31
+ describe("[unit] profile — e-mail change is refused for an address another account holds", () => {
32
+ const userModel = modelHolding({
33
+ [OTHER_EMAIL]: OTHER_USER_ID,
34
+ [OWN_EMAIL]: CURRENT_USER_ID,
35
+ });
36
+ it("refuses another account's address, whatever its casing", async () => {
37
+ const result = await attempt(userModel, " Holder@ACME.dev ");
38
+ (0, chai_1.expect)(result).to.be.instanceOf(interface_api_1.HTTPResult);
39
+ const refusal = result;
40
+ (0, chai_1.expect)(refusal.getStatus()).to.equal(HTTP_CONFLICT);
41
+ (0, chai_1.expect)(refusal.getBody()).to.equal(EMAIL_TAKEN);
42
+ });
43
+ it("accepts a free address, normalized", async () => {
44
+ (0, chai_1.expect)(await attempt(userModel, "Free@Acme.dev")).to.equal(FREE_EMAIL);
45
+ });
46
+ it("accepts the user's own address", async () => {
47
+ (0, chai_1.expect)(await attempt(userModel, "Mine@acme.dev")).to.equal(OWN_EMAIL);
48
+ });
49
+ });
50
+ //# sourceMappingURL=profile-email-change.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-email-change.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/pages/settings/profile-email-change.test.ts"],"names":[],"mappings":";;AAAA,6DAAuD;AACvD,+BAA8B;AAE9B,sFAAwF;AAExF,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAC/C,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAChD,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAC5C,MAAM,WAAW,GAAG,iBAAiB,CAAC;AACtC,MAAM,UAAU,GAAG,eAAe,CAAC;AACnC,MAAM,SAAS,GAAG,eAAe,CAAC;AAElC,SAAS,YAAY,CAAC,QAAgC;IACpD,OAAO;QAEL,UAAU,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;YACnC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YACjD,OAAO,EAAE,CAAC,CAAC,CAAE,EAAE,GAAG,EAAE,EAAE,EAAsB,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,CAAC;KACsB,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,SAAoB,EACpB,KAAa;IAEb,IAAI,CAAC;QACH,OAAO,MAAM,IAAA,sCAAoB,EAAC,SAAS,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,0BAAU;YAAE,OAAO,KAAK,CAAC;QAC9C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,gFAAgF,EAAE,GAAG,EAAE;IAC9F,MAAM,SAAS,GAAG,YAAY,CAAC;QAC7B,CAAC,WAAW,CAAC,EAAE,aAAa;QAC5B,CAAC,SAAS,CAAC,EAAE,eAAe;KAC7B,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAC7D,IAAA,aAAM,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,0BAAU,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAoB,CAAC;QACrC,IAAA,aAAM,EAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACpD,IAAA,aAAM,EAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,IAAA,aAAM,EAAC,MAAM,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,IAAA,aAAM,EAAC,MAAM,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const modules_1 = require("@antelopejs/interface-core/modules");
4
+ const owned_registry_1 = require("@antelopejs/interface-dms/utils/owned-registry");
5
+ const chai_1 = require("chai");
6
+ function generation(module, index) {
7
+ return { module, owner: `${module}#${index}` };
8
+ }
9
+ function addAs(context, registry, value) {
10
+ (0, modules_1.RunWithModuleContext)(context, () => registry.add(value));
11
+ }
12
+ function destroy(context) {
13
+ (0, modules_1.RunWithModuleContext)(context, () => {
14
+ modules_1.Events.ModuleDestroyed.emit(context.module);
15
+ });
16
+ }
17
+ describe("[unit] utils/owned-registry", () => {
18
+ it("releases what a generation added when it is destroyed, and only that", () => {
19
+ const registry = new owned_registry_1.OwnedRegistry();
20
+ const reloaded = generation("owned-registry-reloaded", 1);
21
+ const other = generation("owned-registry-other", 1);
22
+ addAs(reloaded, registry, "reloaded");
23
+ addAs(other, registry, "other");
24
+ destroy(reloaded);
25
+ (0, chai_1.expect)(registry.values()).to.deep.equal(["other"]);
26
+ destroy(other);
27
+ (0, chai_1.expect)(registry.values()).to.deep.equal([]);
28
+ });
29
+ it("keeps what the next generation of the same module adds", () => {
30
+ const registry = new owned_registry_1.OwnedRegistry();
31
+ const first = generation("owned-registry-next", 1);
32
+ const next = generation("owned-registry-next", 2);
33
+ addAs(first, registry, "first");
34
+ destroy(first);
35
+ addAs(next, registry, "next");
36
+ (0, chai_1.expect)(registry.values()).to.deep.equal(["next"]);
37
+ destroy(next);
38
+ });
39
+ it("lists the live values in the order they were added", () => {
40
+ const registry = new owned_registry_1.OwnedRegistry();
41
+ const owner = generation("owned-registry-order", 1);
42
+ for (const value of ["first", "second", "third"]) {
43
+ addAs(owner, registry, value);
44
+ }
45
+ (0, chai_1.expect)(registry.values()).to.deep.equal(["first", "second", "third"]);
46
+ destroy(owner);
47
+ });
48
+ it("removes only the oldest registration a matcher accepts", () => {
49
+ const registry = new owned_registry_1.OwnedRegistry();
50
+ const owner = generation("owned-registry-remove", 1);
51
+ for (const value of ["twice", "once", "twice"]) {
52
+ addAs(owner, registry, value);
53
+ }
54
+ registry.remove((value) => value === "twice");
55
+ (0, chai_1.expect)(registry.values()).to.deep.equal(["once", "twice"]);
56
+ (0, chai_1.expect)(registry.has((value) => value === "once")).to.equal(true);
57
+ (0, chai_1.expect)(registry.has((value) => value === "never")).to.equal(false);
58
+ destroy(owner);
59
+ });
60
+ });
61
+ //# sourceMappingURL=owned-registry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-registry.test.js","sourceRoot":"","sources":["../../../../src/test/unit/utils/owned-registry.test.ts"],"names":[],"mappings":"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"}
@@ -42,14 +42,14 @@ export declare const authSchema: {
42
42
  code: string;
43
43
  state: string;
44
44
  state_cookie: string;
45
- invite?: string | undefined;
46
45
  language?: string | undefined;
46
+ invite?: string | undefined;
47
47
  }, {
48
48
  code: string;
49
49
  state: string;
50
50
  state_cookie: string;
51
- invite?: string | undefined;
52
51
  language?: string | undefined;
52
+ invite?: string | undefined;
53
53
  }>;
54
54
  refresh: z.ZodObject<{
55
55
  token: z.ZodString;
@@ -0,0 +1,37 @@
1
+ import type { InjectionKey, Ref } from "vue";
2
+
3
+ const PAGE_FILL_HEIGHT_KEY: InjectionKey<Readonly<Ref<boolean>>> = Symbol(
4
+ "dms:page-fill-height",
5
+ );
6
+
7
+ /**
8
+ * The flex column a page filling the panel (`DefaultLayout({ fillHeight })`)
9
+ * is laid out in, from the scrolling panel body down to the component that
10
+ * takes the height left.
11
+ */
12
+ export const PAGE_FILL_HEIGHT_CLASSES = {
13
+ /**
14
+ * The page region, the panel body's only child. The minimum height sits
15
+ * here rather than on the component that fills: a floor set lower down
16
+ * overflows this region, and the panel then scrolls past its own bottom
17
+ * padding.
18
+ */
19
+ region: "flex min-h-[30rem] flex-1 flex-col",
20
+ /** The page stack, and the component wrapper that takes the height left. */
21
+ column: "flex min-h-0 flex-1 flex-col",
22
+ } as const;
23
+
24
+ /**
25
+ * Lets the page rendered in a layout's slot know whether the layout gives it
26
+ * the height of the panel.
27
+ */
28
+ export const providePageFillHeight = (fillHeight: Readonly<Ref<boolean>>) => {
29
+ provide(PAGE_FILL_HEIGHT_KEY, fillHeight);
30
+ };
31
+
32
+ /**
33
+ * Whether the layout rendering the page asked it to fill the panel height.
34
+ * `false` under a layout that does not provide it.
35
+ */
36
+ export const usePageFillHeight = (): Readonly<Ref<boolean>> =>
37
+ inject(PAGE_FILL_HEIGHT_KEY, () => ref(false), true);
@@ -8,6 +8,7 @@ import DashboardBanners from "../build/components/layout/DashboardBanners.vue";
8
8
  interface Props {
9
9
  fullWidth?: boolean;
10
10
  hideHeader?: boolean;
11
+ fillHeight?: boolean;
11
12
  icon?: string;
12
13
  title?: string;
13
14
  description?: string;
@@ -16,10 +17,17 @@ interface Props {
16
17
  const props = withDefaults(defineProps<Props>(), {
17
18
  fullWidth: true,
18
19
  hideHeader: false,
20
+ fillHeight: false,
19
21
  icon: "i-ph-file",
20
22
  title: undefined,
21
23
  description: undefined,
22
24
  });
25
+
26
+ providePageFillHeight(toRef(props, "fillHeight"));
27
+
28
+ const regionClass = computed(() =>
29
+ props.fillHeight ? PAGE_FILL_HEIGHT_CLASSES.region : undefined,
30
+ );
23
31
  </script>
24
32
 
25
33
  <template>
@@ -37,6 +45,7 @@ const props = withDefaults(defineProps<Props>(), {
37
45
  data-dms-page-region
38
46
  data-dms-page-content
39
47
  :full-width="props.fullWidth"
48
+ :class="regionClass"
40
49
  >
41
50
  <PageHeader
42
51
  v-if="props.title && !props.hideHeader"
@@ -339,6 +339,17 @@ const components = computed(() =>
339
339
  }),
340
340
  );
341
341
 
342
+ // A page filling the panel (`DefaultLayout({ fillHeight })`) gives the height
343
+ // left under its header to its last component; the ones above it keep theirs.
344
+ const fillHeight = usePageFillHeight();
345
+ const fillColumnClass = PAGE_FILL_HEIGHT_CLASSES.column;
346
+ const stackClass = computed(() =>
347
+ fillHeight.value ? fillColumnClass : undefined,
348
+ );
349
+ const fillingComponentId = computed(() =>
350
+ fillHeight.value ? components.value.at(-1)?.id : undefined,
351
+ );
352
+
342
353
  // --- Live-edit highlight ---------------------------------------------------
343
354
  // When the active page's layout changes in place (DMS dev hot-reload, same
344
355
  // route), animate the components that changed. Added/removed components are
@@ -457,12 +468,16 @@ if (import.meta.env.DEV) {
457
468
  tag="div"
458
469
  name="dms-fresh"
459
470
  class="dms-page-stack space-y-6"
471
+ :class="stackClass"
460
472
  :css="animateLayout"
461
473
  >
462
474
  <div
463
475
  v-for="component in components"
464
476
  :key="component.id"
465
- :class="{ 'dms-fresh-modified': freshComponentIds.has(component.id) }"
477
+ :class="[
478
+ { 'dms-fresh-modified': freshComponentIds.has(component.id) },
479
+ component.id === fillingComponentId && fillColumnClass,
480
+ ]"
466
481
  >
467
482
  <DmsRecursiveComponent
468
483
  :component="component"
@@ -10,6 +10,9 @@
10
10
  },
11
11
  "license": "Apache-2.0",
12
12
  "packageManager": "pnpm@10.6.5",
13
+ "engines": {
14
+ "@antelopejs/dms-frontend": ">=0.3.1 <0.4.0"
15
+ },
13
16
  "scripts": {
14
17
  "typecheck": "ajs dms verify-source --layer \"$PWD\" --local-package @antelopejs/dms=.. --local-package @antelopejs/interface-dms=../../interface-dms",
15
18
  "test": "vitest run",
@@ -58,7 +61,7 @@
58
61
  "zod": "^3.24.2"
59
62
  },
60
63
  "devDependencies": {
61
- "@antelopejs/core": ">=1.9.1 <2",
64
+ "@antelopejs/core": ">=1.10.1 <2",
62
65
  "@antelopejs/dms-frontend": ">=0.3.2 <1.0.0",
63
66
  "@eslint/js": "^8.57.0",
64
67
  "@inertiajs/vue3": "^3.7.0",
@@ -121,11 +121,11 @@ importers:
121
121
  version: 3.25.76
122
122
  devDependencies:
123
123
  '@antelopejs/core':
124
- specifier: '>=1.9.1 <2'
125
- version: 1.9.1(@types/node@24.8.1)
124
+ specifier: '>=1.10.1 <2'
125
+ version: 1.10.1(@types/node@24.8.1)
126
126
  '@antelopejs/dms-frontend':
127
127
  specifier: '>=0.3.2 <1.0.0'
128
- version: 0.3.2(@antelopejs/core@1.9.1(@types/node@24.8.1))
128
+ version: 0.3.2(@antelopejs/core@1.10.1(@types/node@24.8.1))
129
129
  '@eslint/js':
130
130
  specifier: ^8.57.0
131
131
  version: 8.57.0
@@ -196,8 +196,8 @@ packages:
196
196
  resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
197
197
  engines: {node: '>=10'}
198
198
 
199
- '@antelopejs/core@1.9.1':
200
- resolution: {integrity: sha512-MPLJak0rPluV4lgsdsO5ba03sgTxIGSncajBcoaoppuppQmksdpaemojIHiVLJ4LiG0iiH21Roaed8XXy1XkYQ==}
199
+ '@antelopejs/core@1.10.1':
200
+ resolution: {integrity: sha512-NcC6N8Aq14Ph7GRto0lpdRdgUKZAu3ZHDlAF5hXGFZPKKoNm8Da9i4nyB/NI4Sgx3rbE0/KoqCcHpTtQJgrAYg==}
201
201
  hasBin: true
202
202
 
203
203
  '@antelopejs/dms-frontend@0.3.2':
@@ -4312,7 +4312,7 @@ snapshots:
4312
4312
 
4313
4313
  '@alloc/quick-lru@5.2.0': {}
4314
4314
 
4315
- '@antelopejs/core@1.9.1(@types/node@24.8.1)':
4315
+ '@antelopejs/core@1.10.1(@types/node@24.8.1)':
4316
4316
  dependencies:
4317
4317
  '@antelopejs/interface-core': 0.1.1
4318
4318
  '@types/proper-lockfile': 4.1.4
@@ -4331,7 +4331,7 @@ snapshots:
4331
4331
  transitivePeerDependencies:
4332
4332
  - '@types/node'
4333
4333
 
4334
- '@antelopejs/dms-frontend@0.3.2(@antelopejs/core@1.9.1(@types/node@24.8.1))':
4334
+ '@antelopejs/dms-frontend@0.3.2(@antelopejs/core@1.10.1(@types/node@24.8.1))':
4335
4335
  dependencies:
4336
4336
  boxen: 5.1.2
4337
4337
  chalk: 4.1.2
@@ -4342,7 +4342,7 @@ snapshots:
4342
4342
  semver: 7.8.5
4343
4343
  unzipper: 0.12.5
4344
4344
  optionalDependencies:
4345
- '@antelopejs/core': 1.9.1(@types/node@24.8.1)
4345
+ '@antelopejs/core': 1.10.1(@types/node@24.8.1)
4346
4346
  '@oxc-parser/binding-darwin-arm64': 0.95.0
4347
4347
  '@oxc-parser/binding-darwin-x64': 0.95.0
4348
4348
  '@oxc-parser/binding-linux-arm64-gnu': 0.95.0