@antelopejs/dms 0.4.5 → 0.4.7

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 (178) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/hooks/invite-extensions.js +2 -2
  3. package/dist/hooks/invite-extensions.js.map +1 -1
  4. package/dist/implementations/dms/layout-banners.d.ts +18 -0
  5. package/dist/implementations/dms/layout-banners.js +60 -0
  6. package/dist/implementations/dms/layout-banners.js.map +1 -0
  7. package/dist/implementations/dms/page.d.ts +2 -0
  8. package/dist/implementations/dms/page.js +82 -27
  9. package/dist/implementations/dms/page.js.map +1 -1
  10. package/dist/implementations/dms/quick-actions.d.ts +5 -0
  11. package/dist/implementations/dms/quick-actions.js.map +1 -1
  12. package/dist/implementations/dms/resolver-timeout.d.ts +1 -0
  13. package/dist/implementations/dms/resolver-timeout.js +13 -0
  14. package/dist/implementations/dms/resolver-timeout.js.map +1 -0
  15. package/dist/implementations/dms/saas-mode.d.ts +8 -0
  16. package/dist/implementations/dms/saas-mode.js +20 -0
  17. package/dist/implementations/dms/saas-mode.js.map +1 -0
  18. package/dist/implementations/dms-auth/index.d.ts +2 -1
  19. package/dist/implementations/dms-auth/index.js +19 -8
  20. package/dist/implementations/dms-auth/index.js.map +1 -1
  21. package/dist/implementations/dms-html-render/service-jwt.js +2 -1
  22. package/dist/implementations/dms-html-render/service-jwt.js.map +1 -1
  23. package/dist/index.js +2 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/pages/settings/users/index.d.ts +1 -0
  26. package/dist/pages/settings/users/index.js +1 -0
  27. package/dist/pages/settings/users/index.js.map +1 -1
  28. package/dist/pages/settings/users/invite-extension-routes.d.ts +4 -0
  29. package/dist/pages/settings/users/invite-extension-routes.js +57 -0
  30. package/dist/pages/settings/users/invite-extension-routes.js.map +1 -0
  31. package/dist/pages/settings/users/invites.d.ts +2 -1
  32. package/dist/pages/settings/users/invites.js +17 -5
  33. package/dist/pages/settings/users/invites.js.map +1 -1
  34. package/dist/pages/settings/users/members.d.ts +4 -1
  35. package/dist/pages/settings/users/members.js +10 -6
  36. package/dist/pages/settings/users/members.js.map +1 -1
  37. package/dist/pages/settings/users/notifications.js +1 -1
  38. package/dist/pages/settings/users/notifications.js.map +1 -1
  39. package/dist/pages/settings/users/quick-actions.d.ts +1 -0
  40. package/dist/pages/settings/users/quick-actions.js +22 -0
  41. package/dist/pages/settings/users/quick-actions.js.map +1 -0
  42. package/dist/routes/auth/signup.d.ts +2 -0
  43. package/dist/routes/auth/signup.js +7 -2
  44. package/dist/routes/auth/signup.js.map +1 -1
  45. package/dist/test/integration/invite-extension-edit.test.d.ts +1 -0
  46. package/dist/test/integration/invite-extension-edit.test.js +122 -0
  47. package/dist/test/integration/invite-extension-edit.test.js.map +1 -0
  48. package/dist/test/integration/saas-mode-ownership.test.d.ts +1 -0
  49. package/dist/test/integration/saas-mode-ownership.test.js +81 -0
  50. package/dist/test/integration/saas-mode-ownership.test.js.map +1 -0
  51. package/dist/test/integration/tenant-lifecycle.test.js +38 -0
  52. package/dist/test/integration/tenant-lifecycle.test.js.map +1 -1
  53. package/dist/test/unit/implementations/dms/layout-banners.test.d.ts +1 -0
  54. package/dist/test/unit/implementations/dms/layout-banners.test.js +217 -0
  55. package/dist/test/unit/implementations/dms/layout-banners.test.js.map +1 -0
  56. package/dist/test/unit/implementations/dms/quick-actions-button.test.d.ts +1 -0
  57. package/dist/test/unit/implementations/dms/quick-actions-button.test.js +220 -0
  58. package/dist/test/unit/implementations/dms/quick-actions-button.test.js.map +1 -0
  59. package/dist/test/unit/implementations/dms-html-render/generate-html.test.js +1 -1
  60. package/dist/test/unit/implementations/dms-html-render/generate-html.test.js.map +1 -1
  61. package/dist/test/unit/implementations/dms-html-render/service-jwt.test.d.ts +1 -0
  62. package/dist/test/unit/implementations/dms-html-render/service-jwt.test.js +37 -0
  63. package/dist/test/unit/implementations/dms-html-render/service-jwt.test.js.map +1 -0
  64. package/dist/test/unit/interfaces/dms/invite-extension.test.js +138 -12
  65. package/dist/test/unit/interfaces/dms/invite-extension.test.js.map +1 -1
  66. package/dist/test/unit/interfaces/dms/password-policy.test.d.ts +1 -0
  67. package/dist/test/unit/interfaces/dms/password-policy.test.js +43 -0
  68. package/dist/test/unit/interfaces/dms/password-policy.test.js.map +1 -0
  69. package/dist/test/unit/interfaces/dms/saas-mode.test.d.ts +1 -0
  70. package/dist/test/unit/interfaces/dms/saas-mode.test.js +42 -0
  71. package/dist/test/unit/interfaces/dms/saas-mode.test.js.map +1 -0
  72. package/dist/test/unit/interfaces/dms/tenant-invite-email.test.d.ts +1 -0
  73. package/dist/test/unit/interfaces/dms/tenant-invite-email.test.js +53 -0
  74. package/dist/test/unit/interfaces/dms/tenant-invite-email.test.js.map +1 -0
  75. package/dist/test/unit/interfaces/dms-base/table-view-form-slots.test.d.ts +1 -0
  76. package/dist/test/unit/interfaces/dms-base/table-view-form-slots.test.js +80 -0
  77. package/dist/test/unit/interfaces/dms-base/table-view-form-slots.test.js.map +1 -0
  78. package/dist/test/unit/pages/settings/invite-member-quick-action.test.d.ts +1 -0
  79. package/dist/test/unit/pages/settings/invite-member-quick-action.test.js +104 -0
  80. package/dist/test/unit/pages/settings/invite-member-quick-action.test.js.map +1 -0
  81. package/dist/test/unit/pages/settings/notifications-access-gate.test.d.ts +1 -0
  82. package/dist/test/unit/pages/settings/notifications-access-gate.test.js +78 -0
  83. package/dist/test/unit/pages/settings/notifications-access-gate.test.js.map +1 -0
  84. package/dist/test/unit/signup-account-guard.test.js +20 -2
  85. package/dist/test/unit/signup-account-guard.test.js.map +1 -1
  86. package/dist/test/unit/utils/admin-invite-email.test.d.ts +1 -0
  87. package/dist/test/unit/utils/admin-invite-email.test.js +69 -0
  88. package/dist/test/unit/utils/admin-invite-email.test.js.map +1 -0
  89. package/dist/utils/admin-invite-email.d.ts +14 -0
  90. package/dist/utils/admin-invite-email.js +51 -0
  91. package/dist/utils/admin-invite-email.js.map +1 -0
  92. package/dist/utils/index.d.ts +0 -1
  93. package/dist/utils/index.js +0 -1
  94. package/dist/utils/index.js.map +1 -1
  95. package/dist/validation/auth.schema.d.ts +3 -3
  96. package/dist/validation/auth.schema.js +1 -1
  97. package/dist/validation/auth.schema.js.map +1 -1
  98. package/dist/validation/password.d.ts +0 -1
  99. package/dist/validation/password.js +6 -3
  100. package/dist/validation/password.js.map +1 -1
  101. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/signup.vue +37 -8
  102. package/frontend-vue/layers/dms-auth/i18n/locales/auth-en-GB.json +3 -1
  103. package/frontend-vue/layers/dms-auth/i18n/locales/auth-fr-FR.json +3 -1
  104. package/frontend-vue/layers/dms-core/i18n/locales/core-en-GB.json +4 -0
  105. package/frontend-vue/layers/dms-core/i18n/locales/core-fr-FR.json +4 -0
  106. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardBanners.vue +50 -0
  107. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardHeader.vue +16 -13
  108. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardSidebar.vue +2 -2
  109. package/frontend-vue/layers/dms-layout/app/build/components/notification/NotificationPopover.vue +11 -5
  110. package/frontend-vue/layers/dms-layout/app/build/components/notification/widgetRequest.ts +20 -0
  111. package/frontend-vue/layers/dms-layout/app/composables/layout/useLayoutBanners.ts +59 -0
  112. package/frontend-vue/layers/dms-layout/app/composables/page/useQuickActions.ts +15 -2
  113. package/frontend-vue/layers/dms-layout/app/custom-layouts/DefaultLayout.vue +2 -0
  114. package/frontend-vue/layers/dms-layout/app/emails/EmailAdminInvite.vue +54 -9
  115. package/frontend-vue/layers/dms-layout/app/error.vue +17 -2
  116. package/frontend-vue/layers/dms-layout/app/types/page.ts +22 -0
  117. package/frontend-vue/layers/dms-layout/app/utils/breadcrumb.ts +48 -0
  118. package/frontend-vue/layers/dms-layout/app/utils/favorites.ts +94 -0
  119. package/frontend-vue/layers/dms-layout/i18n/locales/layout-en-GB.json +21 -2
  120. package/frontend-vue/layers/dms-layout/i18n/locales/layout-fr-FR.json +21 -2
  121. package/frontend-vue/layers/dms-onboarding/app/composables/onboarding/index.ts +1 -1
  122. package/frontend-vue/layers/dms-onboarding/app/composables/onboarding/{useOnboardingMiddleware.ts → useOnboarding.ts} +0 -12
  123. package/frontend-vue/layers/dms-onboarding/app/custom-pages/onboarding.vue +4 -1
  124. package/frontend-vue/layers/dms-onboarding/app/middleware/onboarding.global.ts +21 -4
  125. package/frontend-vue/layers/dms-ui/app/build/components/containers/drawer/DynamicDrawer.vue +13 -3
  126. package/frontend-vue/layers/dms-ui/app/build/components/containers/modal/DynamicModal.vue +13 -3
  127. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViewConfig.ts +2 -7
  128. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/columnVisibility.ts +13 -0
  129. package/frontend-vue/layers/dms-ui/app/components/PasswordStrength.vue +1 -1
  130. package/frontend-vue/layers/dms-ui/app/components/activity/ActivityItem.vue +1 -1
  131. package/frontend-vue/layers/dms-ui/app/components/banner/Banner.vue +1 -1
  132. package/frontend-vue/layers/dms-ui/app/components/card/NavCard.vue +2 -2
  133. package/frontend-vue/layers/dms-ui/app/components/chart/Chart.vue +6 -16
  134. package/frontend-vue/layers/dms-ui/app/components/chart/ChartCard.vue +2 -2
  135. package/frontend-vue/layers/dms-ui/app/components/chart/internal/TrendBadge.vue +1 -1
  136. package/frontend-vue/layers/dms-ui/app/components/copy/CopyButton.vue +1 -1
  137. package/frontend-vue/layers/dms-ui/app/components/kpi/KpiCard.vue +3 -3
  138. package/frontend-vue/layers/dms-ui/app/components/master-detail/MasterDetail.vue +5 -1
  139. package/frontend-vue/layers/dms-ui/app/components/segmented/Segmented.vue +1 -1
  140. package/frontend-vue/layers/dms-ui/app/components/status/StatusSummary.vue +1 -1
  141. package/frontend-vue/layers/dms-ui/app/components/table-view/TableView.vue +35 -11
  142. package/frontend-vue/layers/dms-ui/app/components/tree/Tree.vue +10 -9
  143. package/frontend-vue/layers/dms-ui/app/composables/chart/donutRecords.ts +26 -0
  144. package/frontend-vue/layers/dms-ui/app/composables/tab/types/props.ts +4 -2
  145. package/frontend-vue/layers/dms-ui/app/composables/tab/useTab.ts +3 -3
  146. package/frontend-vue/layers/dms-ui/app/composables/table-view/shortcuts/index.ts +17 -4
  147. package/frontend-vue/layers/dms-ui/app/composables/table-view/shortcuts/tableViewEscape.ts +22 -0
  148. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/column.ts +1 -1
  149. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/custom-button.ts +2 -0
  150. package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/index.ts +19 -4
  151. package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/treeEscape.ts +21 -0
  152. package/frontend-vue/layers/dms-ui/app/types/quick-actions.ts +38 -3
  153. package/frontend-vue/layers/dms-ui/app/utils/overlayFocus.ts +16 -0
  154. package/frontend-vue/layers/dms-ui/i18n/locales/ui-en-GB.json +4 -2
  155. package/frontend-vue/layers/dms-ui/i18n/locales/ui-fr-FR.json +4 -2
  156. package/frontend-vue/package.json +1 -1
  157. package/frontend-vue/pnpm-lock.yaml +5 -5
  158. package/frontend-vue/tests/admin-invite-email.test.ts +86 -0
  159. package/frontend-vue/tests/breadcrumb-target.test.ts +50 -0
  160. package/frontend-vue/tests/chart-nested-donut.test.ts +97 -0
  161. package/frontend-vue/tests/error-page-message.test.ts +83 -0
  162. package/frontend-vue/tests/favorite-page.test.ts +104 -0
  163. package/frontend-vue/tests/icon-aria-hidden.test.ts +29 -0
  164. package/frontend-vue/tests/layout-banners.test.ts +224 -0
  165. package/frontend-vue/tests/notification-popover-errors.test.ts +147 -0
  166. package/frontend-vue/tests/onboarding-middleware.test.ts +103 -0
  167. package/frontend-vue/tests/password-strength-meter.test.ts +33 -0
  168. package/frontend-vue/tests/quick-action-intent.test.ts +74 -0
  169. package/frontend-vue/tests/quick-actions.test.ts +23 -0
  170. package/frontend-vue/tests/signup-invitation-link.test.ts +126 -0
  171. package/frontend-vue/tests/skeleton-paragraph.test.ts +30 -0
  172. package/frontend-vue/tests/tab-without-component-id.test.ts +51 -0
  173. package/frontend-vue/tests/table-column-visibility.test.ts +20 -0
  174. package/frontend-vue/tests/table-view-escape-shortcut.test.ts +141 -0
  175. package/frontend-vue/tests/tree-escape-shortcut.test.ts +138 -0
  176. package/frontend-vue/tests/vue-inventory.test.ts +1 -1
  177. package/package.json +2 -2
  178. package/skills/dms/REFERENCE.md +1 -1
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const chai_1 = require("chai");
4
+ const password_1 = require("@antelopejs/interface-dms/auth/password");
5
+ const COMPLIANT_PASSWORD = "StrongP@ss1";
6
+ const ALLOWED_SPECIAL_CHARS = "@$!%*?&";
7
+ describe("[unit] auth/password policy", () => {
8
+ it("requires at least 8 characters", () => {
9
+ (0, chai_1.expect)(password_1.PASSWORD_MIN_LENGTH).to.equal(8);
10
+ });
11
+ it("accepts a password meeting every rule", () => {
12
+ (0, chai_1.expect)((0, password_1.isPasswordCompliant)(COMPLIANT_PASSWORD)).to.equal(true);
13
+ });
14
+ it("accepts a password of exactly the minimum length", () => {
15
+ (0, chai_1.expect)((0, password_1.isPasswordCompliant)("Abcdef1@")).to.equal(true);
16
+ });
17
+ it("accepts every allowed special character", () => {
18
+ for (const special of ALLOWED_SPECIAL_CHARS) {
19
+ (0, chai_1.expect)((0, password_1.isPasswordCompliant)(`Abcdef1${special}`), special).to.equal(true);
20
+ }
21
+ });
22
+ it("rejects a password shorter than the minimum length", () => {
23
+ (0, chai_1.expect)((0, password_1.isPasswordCompliant)("Abcde1@")).to.equal(false);
24
+ });
25
+ it("rejects a password without an uppercase letter", () => {
26
+ (0, chai_1.expect)((0, password_1.isPasswordCompliant)("weakp@ss1")).to.equal(false);
27
+ });
28
+ it("rejects a password without a digit", () => {
29
+ (0, chai_1.expect)((0, password_1.isPasswordCompliant)("Weakpass@")).to.equal(false);
30
+ });
31
+ it("rejects a password without a special character", () => {
32
+ (0, chai_1.expect)((0, password_1.isPasswordCompliant)("Weakpass1")).to.equal(false);
33
+ });
34
+ it("rejects a character outside the allowed set", () => {
35
+ (0, chai_1.expect)((0, password_1.isPasswordCompliant)("StrongP@ss1#")).to.equal(false);
36
+ (0, chai_1.expect)((0, password_1.isPasswordCompliant)("StrongP@ss1 ")).to.equal(false);
37
+ (0, chai_1.expect)((0, password_1.isPasswordCompliant)("StrongP@ss1é")).to.equal(false);
38
+ });
39
+ it("rejects an empty password", () => {
40
+ (0, chai_1.expect)((0, password_1.isPasswordCompliant)("")).to.equal(false);
41
+ });
42
+ });
43
+ //# sourceMappingURL=password-policy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-policy.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms/password-policy.test.ts"],"names":[],"mappings":";;AAAA,+BAA8B;AAC9B,sEAGiD;AAEjD,MAAM,kBAAkB,GAAG,aAAa,CAAC;AACzC,MAAM,qBAAqB,GAAG,SAAS,CAAC;AAExC,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,IAAA,aAAM,EAAC,8BAAmB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,IAAA,aAAM,EAAC,IAAA,8BAAmB,EAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,IAAA,aAAM,EAAC,IAAA,8BAAmB,EAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,KAAK,MAAM,OAAO,IAAI,qBAAqB,EAAE,CAAC;YAC5C,IAAA,aAAM,EAAC,IAAA,8BAAmB,EAAC,UAAU,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,IAAA,aAAM,EAAC,IAAA,8BAAmB,EAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,IAAA,aAAM,EAAC,IAAA,8BAAmB,EAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,IAAA,aAAM,EAAC,IAAA,8BAAmB,EAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,IAAA,aAAM,EAAC,IAAA,8BAAmB,EAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,IAAA,aAAM,EAAC,IAAA,8BAAmB,EAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAA,aAAM,EAAC,IAAA,8BAAmB,EAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAA,aAAM,EAAC,IAAA,8BAAmB,EAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,IAAA,aAAM,EAAC,IAAA,8BAAmB,EAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const interface_core_1 = require("@antelopejs/interface-core");
4
+ const chai_1 = require("chai");
5
+ const saas_mode_1 = require("@antelopejs/interface-dms/utils/saas-mode");
6
+ const EXPLICIT_REGISTRATION = { id: "saas-mode-test-registration" };
7
+ function unloadRegisteringModule() {
8
+ const moduleId = (0, interface_core_1.GetResponsibleModule)();
9
+ if (!moduleId)
10
+ throw new Error("No responsible module for the test");
11
+ saas_mode_1.internal.RegisterSaasMode.unregisterModule(moduleId);
12
+ }
13
+ describe("[unit] SaaS mode registration", () => {
14
+ afterEach(() => {
15
+ unloadRegisteringModule();
16
+ });
17
+ it("is off while no module has registered it", async () => {
18
+ (0, chai_1.expect)(await (0, saas_mode_1.isSaasMode)()).to.equal(false);
19
+ });
20
+ it("is on once a module registers it", async () => {
21
+ (0, saas_mode_1.RegisterSaasMode)();
22
+ (0, chai_1.expect)(await (0, saas_mode_1.isSaasMode)()).to.equal(true);
23
+ });
24
+ it("turns off when the registration is revoked", async () => {
25
+ saas_mode_1.internal.RegisterSaasMode.register(EXPLICIT_REGISTRATION);
26
+ (0, chai_1.expect)(await (0, saas_mode_1.isSaasMode)()).to.equal(true);
27
+ saas_mode_1.internal.RegisterSaasMode.unregister(EXPLICIT_REGISTRATION);
28
+ (0, chai_1.expect)(await (0, saas_mode_1.isSaasMode)()).to.equal(false);
29
+ });
30
+ it("turns off when the registering module unloads", async () => {
31
+ (0, saas_mode_1.RegisterSaasMode)();
32
+ unloadRegisteringModule();
33
+ (0, chai_1.expect)(await (0, saas_mode_1.isSaasMode)()).to.equal(false);
34
+ });
35
+ it("stays on while another registration is still active", async () => {
36
+ (0, saas_mode_1.RegisterSaasMode)();
37
+ saas_mode_1.internal.RegisterSaasMode.register(EXPLICIT_REGISTRATION);
38
+ saas_mode_1.internal.RegisterSaasMode.unregister(EXPLICIT_REGISTRATION);
39
+ (0, chai_1.expect)(await (0, saas_mode_1.isSaasMode)()).to.equal(true);
40
+ });
41
+ });
42
+ //# sourceMappingURL=saas-mode.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saas-mode.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms/saas-mode.test.ts"],"names":[],"mappings":";;AAAA,+DAAkE;AAClE,+BAA8B;AAC9B,yEAImD;AAEnD,MAAM,qBAAqB,GAAG,EAAE,EAAE,EAAE,6BAA6B,EAAE,CAAC;AAGpE,SAAS,uBAAuB;IAC9B,MAAM,QAAQ,GAAG,IAAA,qCAAoB,GAAE,CAAC;IACxC,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACrE,oBAAgB,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AAC/D,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,SAAS,CAAC,GAAG,EAAE;QACb,uBAAuB,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,IAAA,aAAM,EAAC,MAAM,IAAA,sBAAU,GAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,IAAA,4BAAgB,GAAE,CAAC;QACnB,IAAA,aAAM,EAAC,MAAM,IAAA,sBAAU,GAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,oBAAgB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QAClE,IAAA,aAAM,EAAC,MAAM,IAAA,sBAAU,GAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,oBAAgB,CAAC,gBAAgB,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;QACpE,IAAA,aAAM,EAAC,MAAM,IAAA,sBAAU,GAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,IAAA,4BAAgB,GAAE,CAAC;QACnB,uBAAuB,EAAE,CAAC;QAC1B,IAAA,aAAM,EAAC,MAAM,IAAA,sBAAU,GAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,IAAA,4BAAgB,GAAE,CAAC;QACnB,oBAAgB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QAClE,oBAAgB,CAAC,gBAAgB,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;QACpE,IAAA,aAAM,EAAC,MAAM,IAAA,sBAAU,GAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const interface_core_1 = require("@antelopejs/interface-core");
4
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
5
+ const chai_1 = require("chai");
6
+ const auth_1 = require("@antelopejs/interface-dms/auth");
7
+ const db_1 = require("@antelopejs/interface-dms/db");
8
+ const invites_1 = require("@antelopejs/interface-dms/invites");
9
+ const WORKSPACE_ID = "tenant-invite-email-workspace";
10
+ const WORKSPACE_NAME = "Storefront";
11
+ const INVITEE_EMAIL = "invitee@acme.dev";
12
+ const TOKEN = "tenant-invite-email-token";
13
+ describe("[unit] interfaces/dms — tenant invitation emails", () => {
14
+ const sent = [];
15
+ before(async () => {
16
+ (0, interface_core_1.ImplementInterface)({ sendAdminInviteEmail: auth_1.sendAdminInviteEmail }, {
17
+ sendAdminInviteEmail: async (email, token, inviteeName, context) => {
18
+ sent.push({ email, token, inviteeName, context });
19
+ },
20
+ });
21
+ const now = new Date();
22
+ await (0, interface_database_decorators_1.GetModel)(db_1.TenantModel).insert({
23
+ _id: WORKSPACE_ID,
24
+ name: WORKSPACE_NAME,
25
+ createdAt: now,
26
+ updatedAt: now,
27
+ });
28
+ });
29
+ beforeEach(() => {
30
+ sent.length = 0;
31
+ });
32
+ it("names the workspace and the inviter, in the invitation's language", async () => {
33
+ await invites_1.internal.sendTenantInviteEmail({
34
+ tenantId: WORKSPACE_ID,
35
+ email: INVITEE_EMAIL,
36
+ token: TOKEN,
37
+ firstname: "Ada",
38
+ lastname: "Lovelace",
39
+ language: "fr",
40
+ inviterName: "Grace Hopper",
41
+ });
42
+ (0, chai_1.expect)(sent).to.have.length(1);
43
+ (0, chai_1.expect)(sent[0].email).to.equal(INVITEE_EMAIL);
44
+ (0, chai_1.expect)(sent[0].token).to.equal(TOKEN);
45
+ (0, chai_1.expect)(sent[0].inviteeName).to.equal("Ada Lovelace");
46
+ (0, chai_1.expect)(sent[0].context).to.deep.equal({
47
+ workspaceName: WORKSPACE_NAME,
48
+ inviterName: "Grace Hopper",
49
+ language: "fr",
50
+ });
51
+ });
52
+ });
53
+ //# sourceMappingURL=tenant-invite-email.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-invite-email.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms/tenant-invite-email.test.ts"],"names":[],"mappings":";;AAAA,+DAAgE;AAChE,6FAAqE;AACrE,+BAA8B;AAC9B,yDAGwC;AACxC,qDAA2D;AAC3D,+DAA6D;AAE7D,MAAM,YAAY,GAAG,+BAA+B,CAAC;AACrD,MAAM,cAAc,GAAG,YAAY,CAAC;AACpC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AACzC,MAAM,KAAK,GAAG,2BAA2B,CAAC;AAS1C,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,MAAM,IAAI,GAAsB,EAAE,CAAC;IAEnC,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,IAAA,mCAAkB,EAChB,EAAE,oBAAoB,EAApB,2BAAoB,EAAE,EACxB;YACE,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE;gBACjE,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,CAAC;SACF,CACF,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAA,wCAAQ,EAAC,gBAAW,CAAC,CAAC,MAAM,CAAC;YACjC,GAAG,EAAE,YAAY;YACjB,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,kBAAQ,CAAC,qBAAqB,CAAC;YACnC,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,aAAa;YACpB,KAAK,EAAE,KAAK;YACZ,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,cAAc;SAC5B,CAAC,CAAC;QAEH,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACrD,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACpC,aAAa,EAAE,cAAc;YAC7B,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const interface_api_1 = require("@antelopejs/interface-api");
13
+ const interface_data_api_1 = require("@antelopejs/interface-data-api");
14
+ const metadata_1 = require("@antelopejs/interface-data-api/metadata");
15
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
16
+ const chai_1 = require("chai");
17
+ const constants_1 = require("@antelopejs/interface-dms/constants");
18
+ const default_types_1 = require("@antelopejs/interface-dms/base/data-types/default-types");
19
+ const table_view_1 = require("@antelopejs/interface-dms/base/table-view");
20
+ const TABLE = "form-slot-notes";
21
+ const EDIT_SLOT = "test.notes-edit";
22
+ let Note = class Note extends interface_database_decorators_1.Table {
23
+ };
24
+ __decorate([
25
+ (0, interface_database_decorators_1.Field)("string"),
26
+ __metadata("design:type", String)
27
+ ], Note.prototype, "title", void 0);
28
+ Note = __decorate([
29
+ (0, interface_database_decorators_1.RegisterTable)(TABLE, constants_1.CORE_SCHEMA_NAME)
30
+ ], Note);
31
+ class NoteModel extends (0, interface_database_decorators_1.BasicDataModel)(Note, TABLE) {
32
+ }
33
+ let NoteAPI = class NoteAPI extends (0, interface_data_api_1.DataController)(Note, {
34
+ get: table_view_1.TableViewRoutes.Get,
35
+ new: table_view_1.TableViewRoutes.New,
36
+ edit: table_view_1.TableViewRoutes.Edit,
37
+ }, (0, interface_api_1.Controller)("/api/form-slot-notes")) {
38
+ };
39
+ __decorate([
40
+ (0, metadata_1.ModelReference)(),
41
+ (0, interface_database_decorators_1.Model)(NoteModel),
42
+ __metadata("design:type", NoteModel)
43
+ ], NoteAPI.prototype, "model", void 0);
44
+ __decorate([
45
+ (0, table_view_1.Column)({ name: "Title", type: new default_types_1.DefaultDataTypes.StringType() }),
46
+ (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
47
+ __metadata("design:type", String)
48
+ ], NoteAPI.prototype, "title", void 0);
49
+ NoteAPI = __decorate([
50
+ (0, interface_data_api_1.RegisterDataController)()
51
+ ], NoteAPI);
52
+ function formSlotIds(table) {
53
+ const options = table.serializeSync().options;
54
+ return Object.fromEntries(Object.entries(options.formComponents).map(([kind, form]) => [
55
+ kind,
56
+ form?.options?.slotId,
57
+ ]));
58
+ }
59
+ describe("[unit] interfaces/dms-base — table view form slots", () => {
60
+ it("opens the declared slot on the matching generated form only", () => {
61
+ const table = (0, table_view_1.TableView)(NoteAPI, {
62
+ formSlots: { edit: EDIT_SLOT },
63
+ realtime: false,
64
+ });
65
+ (0, chai_1.expect)(formSlotIds(table)).to.deep.equal({
66
+ new: undefined,
67
+ edit: EDIT_SLOT,
68
+ view: undefined,
69
+ });
70
+ });
71
+ it("opens no slot unless one is declared", () => {
72
+ const table = (0, table_view_1.TableView)(NoteAPI, { realtime: false });
73
+ (0, chai_1.expect)(formSlotIds(table)).to.deep.equal({
74
+ new: undefined,
75
+ edit: undefined,
76
+ view: undefined,
77
+ });
78
+ });
79
+ });
80
+ //# sourceMappingURL=table-view-form-slots.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-view-form-slots.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/table-view-form-slots.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,6DAAuD;AACvD,uEAGwC;AACxC,sEAIiD;AACjD,6FAMmD;AACnD,+BAA8B;AAC9B,mEAAuE;AACvE,2FAA2F;AAC3F,0EAKmD;AAEnD,MAAM,KAAK,GAAG,iBAAiB,CAAC;AAChC,MAAM,SAAS,GAAG,iBAAiB,CAAC;AAGpC,IAAM,IAAI,GAAV,MAAM,IAAK,SAAQ,qCAAK;CAEvB,CAAA;AAD0B;IAAxB,IAAA,qCAAK,EAAC,QAAQ,CAAC;;mCAAuB;AADnC,IAAI;IADT,IAAA,6CAAa,EAAC,KAAK,EAAE,4BAAgB,CAAC;GACjC,IAAI,CAET;AAED,MAAM,SAAU,SAAQ,IAAA,8CAAc,EAAC,IAAI,EAAE,KAAK,CAAC;CAAG;AAGtD,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,IAAA,mCAAc,EAClC,IAAI,EACJ;IACE,GAAG,EAAE,4BAAe,CAAC,GAAG;IACxB,GAAG,EAAE,4BAAe,CAAC,GAAG;IACxB,IAAI,EAAE,4BAAe,CAAC,IAAI;CAC3B,EACD,IAAA,0BAAU,EAAC,sBAAsB,CAAC,CACnC;CAOA,CAAA;AAJS;IAFP,IAAA,yBAAc,GAAE;IAChB,IAAA,qCAAK,EAAC,SAAS,CAAC;8BACF,SAAS;sCAAC;AAGjB;IAFP,IAAA,mBAAM,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,gCAAgB,CAAC,UAAU,EAAE,EAAE,CAAC;IAClE,IAAA,iBAAM,EAAC,qBAAU,CAAC,SAAS,CAAC;;sCACP;AAdlB,OAAO;IADZ,IAAA,2CAAsB,GAAE;GACnB,OAAO,CAeZ;AAED,SAAS,WAAW,CAClB,KAAmC;IAEnC,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC,OAAqC,CAAC;IAC5E,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAC3D,IAAI;QACH,IAAI,EAAE,OAA2C,EAAE,MAAM;KAC3D,CAAC,CACH,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAClE,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,KAAK,GAAG,IAAA,sBAAS,EAAC,OAAO,EAAE;YAC/B,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC9B,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,IAAA,aAAM,EAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACvC,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,KAAK,GAAG,IAAA,sBAAS,EAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAEtD,IAAA,aAAM,EAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACvC,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,104 @@
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_core_1 = require("@antelopejs/interface-core");
37
+ const chai_1 = require("chai");
38
+ const page_1 = require("@antelopejs/interface-dms/page");
39
+ const permissionsInterface = __importStar(require("@antelopejs/interface-dms/permissions"));
40
+ const permissionsResolverInterface = __importStar(require("@antelopejs/interface-dms/permissions-resolver"));
41
+ const quick_actions_1 = require("@antelopejs/interface-dms/quick-actions");
42
+ const tenantAccessInterface = __importStar(require("@antelopejs/interface-dms/tenant-access"));
43
+ const page_2 = require("../../../../implementations/dms/page");
44
+ const permissionsImpl = __importStar(require("../../../../implementations/dms/permissions"));
45
+ const permissionsResolverImpl = __importStar(require("../../../../implementations/dms/permissions-resolver"));
46
+ const quickActionsImpl = __importStar(require("../../../../implementations/dms/quick-actions"));
47
+ const tenantAccessImpl = __importStar(require("../../../../implementations/dms/tenant-access"));
48
+ const members_1 = require("../../../../pages/settings/users/members");
49
+ const quick_actions_2 = require("../../../../pages/settings/users/quick-actions");
50
+ const page_access_1 = require("../../../helpers/page-access");
51
+ const ACTION_KEY = `${quick_actions_2.inviteMemberQuickAction.category.id}:${quick_actions_2.inviteMemberQuickAction.id}`;
52
+ const TENANT_ID = "invite-quick-action-tenant";
53
+ function membersPagePermission() {
54
+ const pageInfo = (0, interface_core_1.GetMetadata)(members_1.MembersSettingsController, page_1.PageMetadata).pageInfo;
55
+ if (!pageInfo) {
56
+ throw new Error("The members page is not registered");
57
+ }
58
+ return pageInfo.fullId;
59
+ }
60
+ function invitePermission() {
61
+ const permissionId = members_1.membersTableAddAction.permissionId;
62
+ if (!permissionId) {
63
+ throw new Error("The members table add action has no permission id");
64
+ }
65
+ return permissionId;
66
+ }
67
+ async function actionsFor(grantedPermissions) {
68
+ const { memberModel, roleModel } = (0, page_access_1.stubPageAccessModels)(grantedPermissions);
69
+ const payload = await (0, page_2.buildSiteLayoutPayload)({ _id: "invite-quick-action-member" }, memberModel, roleModel, TENANT_ID);
70
+ return payload.quickActions.actions;
71
+ }
72
+ describe("[unit] pages/settings/users/quick-actions — invite a member", () => {
73
+ before(() => {
74
+ (0, interface_core_1.ImplementInterface)(permissionsInterface, permissionsImpl);
75
+ (0, interface_core_1.ImplementInterface)(permissionsResolverInterface, permissionsResolverImpl);
76
+ (0, interface_core_1.ImplementInterface)(tenantAccessInterface, tenantAccessImpl);
77
+ (0, interface_core_1.ImplementInterface)(page_1.internal, page_2.internal);
78
+ (0, interface_core_1.ImplementInterface)(quick_actions_1.internal, quickActionsImpl.internal);
79
+ });
80
+ it("presses the members table's invite button", async () => {
81
+ const actions = await actionsFor([
82
+ membersPagePermission(),
83
+ invitePermission(),
84
+ ]);
85
+ (0, chai_1.expect)(actions[ACTION_KEY]).to.deep.include({
86
+ displayName: "$quickActions.invite_member",
87
+ target: {
88
+ type: "button",
89
+ to: "/settings/user/members",
90
+ component: "table",
91
+ button: members_1.MEMBER_INVITE_BUTTON_ID,
92
+ },
93
+ });
94
+ });
95
+ it("is left out for a member who sees the members page but cannot invite", async () => {
96
+ const actions = await actionsFor([membersPagePermission()]);
97
+ (0, chai_1.expect)(actions).to.not.have.property(ACTION_KEY);
98
+ });
99
+ it("is left out for a caller who cannot reach the members page", async () => {
100
+ const actions = await actionsFor([]);
101
+ (0, chai_1.expect)(actions).to.not.have.property(ACTION_KEY);
102
+ });
103
+ });
104
+ //# sourceMappingURL=invite-member-quick-action.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invite-member-quick-action.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/pages/settings/invite-member-quick-action.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const interface_api_1 = require("@antelopejs/interface-api");
4
+ const interface_core_1 = require("@antelopejs/interface-core");
5
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
6
+ const chai_1 = require("chai");
7
+ const dms_auth_1 = require("../../../../implementations/dms-auth");
8
+ const notifications_1 = require("../../../../pages/settings/users/notifications");
9
+ const db_1 = require("@antelopejs/interface-dms/db");
10
+ const tenant_access_1 = require("@antelopejs/interface-dms/tenant-access");
11
+ const db_2 = require("@antelopejs/interface-dms/auth/db");
12
+ const page_access_1 = require("../../../helpers/page-access");
13
+ const DENIED_TENANT = "notifications-gate-tenant";
14
+ const MEMBER_ID = "notifications-gate-member";
15
+ const OUTSIDER_ID = "notifications-gate-outsider";
16
+ const AUTH_KEY = "notifications-gate-key";
17
+ const HTTP_FORBIDDEN = 403;
18
+ const gate = (0, page_access_1.denyingTenantGate)("notifications-gate", DENIED_TENANT);
19
+ function context(token) {
20
+ return {
21
+ rawRequest: { headers: { authorization: `Bearer ${token}` } },
22
+ };
23
+ }
24
+ async function insertUser(id) {
25
+ await (0, interface_database_decorators_1.GetModel)(db_2.UserModel).insert({
26
+ _id: id,
27
+ email: `${id}@test.local`,
28
+ name: id,
29
+ authKey: AUTH_KEY,
30
+ isValidated: true,
31
+ language: "en",
32
+ password: null,
33
+ });
34
+ const stored = await (0, interface_database_decorators_1.GetModel)(db_2.UserModel).get(id);
35
+ if (!stored)
36
+ throw new Error(`Missing test user ${id}`);
37
+ return stored;
38
+ }
39
+ function resolveControllerUser(token) {
40
+ const meta = (0, interface_core_1.GetMetadata)(notifications_1.NotificationsApiController, interface_api_1.ControllerMeta);
41
+ return (0, interface_api_1.computeParameter)(context(token), meta.computed_props.user, new notifications_1.NotificationsApiController());
42
+ }
43
+ describe("[unit] pages/settings/users/notifications — tenant access gate", () => {
44
+ let memberToken;
45
+ let outsiderToken;
46
+ before(async () => {
47
+ const member = await insertUser(MEMBER_ID);
48
+ const outsider = await insertUser(OUTSIDER_ID);
49
+ memberToken = (0, dms_auth_1.generateAccessToken)(DENIED_TENANT, member).token;
50
+ outsiderToken = (0, dms_auth_1.generateAccessToken)(DENIED_TENANT, outsider).token;
51
+ await (0, interface_database_decorators_1.GetModel)(db_1.TenantMemberModel, DENIED_TENANT).insert({
52
+ userId: MEMBER_ID,
53
+ roleIds: [],
54
+ isTenantOwner: false,
55
+ joinedAt: new Date(),
56
+ invitedBy: null,
57
+ });
58
+ (0, tenant_access_1.RegisterTenantAccessGate)(gate);
59
+ });
60
+ after(() => {
61
+ tenant_access_1.internal.RegisterTenantAccessGate.unregister(gate);
62
+ });
63
+ it("serves a member's own notifications while a gate denies the tenant", async () => {
64
+ const user = (await resolveControllerUser(memberToken));
65
+ (0, chai_1.expect)(user._id).to.equal(MEMBER_ID);
66
+ });
67
+ it("still refuses a user who is not a member of the tenant", async () => {
68
+ try {
69
+ await resolveControllerUser(outsiderToken);
70
+ chai_1.expect.fail("Expected the membership check to refuse");
71
+ }
72
+ catch (error) {
73
+ (0, chai_1.expect)(error).to.be.instanceOf(interface_api_1.HTTPResult);
74
+ (0, chai_1.expect)(error.getStatus()).to.equal(HTTP_FORBIDDEN);
75
+ }
76
+ });
77
+ });
78
+ //# sourceMappingURL=notifications-access-gate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications-access-gate.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/pages/settings/notifications-access-gate.test.ts"],"names":[],"mappings":"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"}
@@ -39,7 +39,7 @@ async function joinWorkspace(userId) {
39
39
  invitedBy: null,
40
40
  });
41
41
  }
42
- async function attemptSignup(existingUser, token, claimedEmail = existingUser.email) {
42
+ async function attemptSignup(existingUser, token, claimedEmail = existingUser.email, lang) {
43
43
  const updatedUsers = [];
44
44
  const userModel = {
45
45
  getByEmail: async (lookup) => lookup === existingUser.email ? existingUser : undefined,
@@ -57,7 +57,7 @@ async function attemptSignup(existingUser, token, claimedEmail = existingUser.em
57
57
  name: INVITEE_NAME,
58
58
  email: claimedEmail,
59
59
  password: INVITEE_PASSWORD,
60
- lang: "en",
60
+ lang,
61
61
  token,
62
62
  }, USER_AGENT, IP);
63
63
  }
@@ -113,6 +113,24 @@ describe("[unit] auth/signup — overwriting an existing account", () => {
113
113
  await attemptSignup(draft, token, "Draft-Case@Acme.dev");
114
114
  (0, chai_1.expect)(draft.email).to.equal("draft-case@acme.dev");
115
115
  });
116
+ it("takes over a draft in the invitation's language when none is chosen", async () => {
117
+ const draft = buildAccount("signup-guard-draft-language", "draft-language@acme.dev", false);
118
+ const { token } = await (0, fixtures_1.seedUserInvite)({
119
+ email: draft.email,
120
+ language: "fr",
121
+ });
122
+ await attemptSignup(draft, token);
123
+ (0, chai_1.expect)(draft.language).to.equal("fr");
124
+ });
125
+ it("keeps the language the invitee chose over the invitation's", async () => {
126
+ const draft = buildAccount("signup-guard-draft-chosen-language", "draft-chosen-language@acme.dev", false);
127
+ const { token } = await (0, fixtures_1.seedUserInvite)({
128
+ email: draft.email,
129
+ language: "fr",
130
+ });
131
+ await attemptSignup(draft, token, draft.email, "en");
132
+ (0, chai_1.expect)(draft.language).to.equal("en");
133
+ });
116
134
  it("settles the invitation before disclosing that the address is taken", async () => {
117
135
  const provisioned = buildAccount("signup-guard-probed", "probed@acme.dev", false);
118
136
  await joinWorkspace(provisioned._id);
@@ -1 +1 @@
1
- {"version":3,"file":"signup-account-guard.test.js","sourceRoot":"","sources":["../../../src/test/unit/signup-account-guard.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signup-account-guard.test.js","sourceRoot":"","sources":["../../../src/test/unit/signup-account-guard.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const chai_1 = require("chai");
4
+ const admin_invite_email_1 = require("../../../utils/admin-invite-email");
5
+ describe("[unit] utils/admin-invite-email", () => {
6
+ describe("resolveAdminInviteLanguage", () => {
7
+ it("keeps a supported language, regional variants included", () => {
8
+ (0, chai_1.expect)((0, admin_invite_email_1.resolveAdminInviteLanguage)("fr")).to.equal("fr");
9
+ (0, chai_1.expect)((0, admin_invite_email_1.resolveAdminInviteLanguage)("fr-FR")).to.equal("fr");
10
+ (0, chai_1.expect)((0, admin_invite_email_1.resolveAdminInviteLanguage)("en-GB")).to.equal("en");
11
+ });
12
+ it("falls back to English for a missing or unsupported language", () => {
13
+ (0, chai_1.expect)((0, admin_invite_email_1.resolveAdminInviteLanguage)()).to.equal("en");
14
+ (0, chai_1.expect)((0, admin_invite_email_1.resolveAdminInviteLanguage)("de")).to.equal("en");
15
+ (0, chai_1.expect)((0, admin_invite_email_1.resolveAdminInviteLanguage)("constructor")).to.equal("en");
16
+ });
17
+ });
18
+ describe("buildAdminInviteSubject", () => {
19
+ it("keeps the generic subject without any name", () => {
20
+ (0, chai_1.expect)((0, admin_invite_email_1.buildAdminInviteSubject)({})).to.equal("You're Invited to Join");
21
+ (0, chai_1.expect)((0, admin_invite_email_1.buildAdminInviteSubject)({ inviterName: "Ada" })).to.equal("You're Invited to Join");
22
+ });
23
+ it("names the platform alone", () => {
24
+ (0, chai_1.expect)((0, admin_invite_email_1.buildAdminInviteSubject)({ platformName: "Acme" })).to.equal("You're invited to join Acme");
25
+ });
26
+ it("names the workspace, the platform and the inviter", () => {
27
+ (0, chai_1.expect)((0, admin_invite_email_1.buildAdminInviteSubject)({
28
+ workspaceName: "Storefront",
29
+ platformName: "Acme",
30
+ inviterName: "Ada",
31
+ })).to.equal("Ada invited you to join Storefront on Acme");
32
+ (0, chai_1.expect)((0, admin_invite_email_1.buildAdminInviteSubject)({ workspaceName: "Storefront" })).to.equal("You're invited to join Storefront");
33
+ });
34
+ it("writes the subject in French", () => {
35
+ (0, chai_1.expect)((0, admin_invite_email_1.buildAdminInviteSubject)({}, "fr")).to.equal("Vous êtes invité à nous rejoindre");
36
+ (0, chai_1.expect)((0, admin_invite_email_1.buildAdminInviteSubject)({
37
+ workspaceName: "Storefront",
38
+ platformName: "Acme",
39
+ inviterName: "Ada",
40
+ }, "fr-FR")).to.equal("Ada vous invite à rejoindre Storefront sur Acme");
41
+ });
42
+ });
43
+ describe("buildAdminInviteSignupLink", () => {
44
+ const BASE_URL = "https://app.local";
45
+ it("carries the token, the address and the invitation's language", () => {
46
+ const link = new URL((0, admin_invite_email_1.buildAdminInviteSignupLink)(BASE_URL, {
47
+ email: "ada+team@acme.dev",
48
+ token: "t0ken",
49
+ inviteeName: "Ada Lovelace",
50
+ language: "fr",
51
+ }));
52
+ (0, chai_1.expect)(link.origin + link.pathname).to.equal(`${BASE_URL}/auth/signup`);
53
+ (0, chai_1.expect)(Object.fromEntries(link.searchParams)).to.deep.equal({
54
+ token: "t0ken",
55
+ email: "ada+team@acme.dev",
56
+ name: "Ada Lovelace",
57
+ lang: "fr",
58
+ });
59
+ });
60
+ it("leaves out the name and the language when unknown", () => {
61
+ const link = new URL((0, admin_invite_email_1.buildAdminInviteSignupLink)(BASE_URL, {
62
+ email: "ada@acme.dev",
63
+ token: "t0ken",
64
+ }));
65
+ (0, chai_1.expect)([...link.searchParams.keys()]).to.deep.equal(["token", "email"]);
66
+ });
67
+ });
68
+ });
69
+ //# sourceMappingURL=admin-invite-email.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-invite-email.test.js","sourceRoot":"","sources":["../../../../src/test/unit/utils/admin-invite-email.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface AdminInviteEmailNames {
2
+ workspaceName?: string;
3
+ inviterName?: string;
4
+ platformName?: string;
5
+ }
6
+ export declare function resolveAdminInviteLanguage(language?: string): string;
7
+ export declare function buildAdminInviteSubject(names: AdminInviteEmailNames, language?: string): string;
8
+ export interface AdminInviteSignupTarget {
9
+ email: string;
10
+ token: string;
11
+ inviteeName?: string;
12
+ language?: string;
13
+ }
14
+ export declare function buildAdminInviteSignupLink(clientBaseUrl: string, { email, token, inviteeName, language }: AdminInviteSignupTarget): string;