@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.
- package/CHANGELOG.md +47 -0
- package/dist/hooks/invite-extensions.js +2 -2
- package/dist/hooks/invite-extensions.js.map +1 -1
- package/dist/implementations/dms/layout-banners.d.ts +18 -0
- package/dist/implementations/dms/layout-banners.js +60 -0
- package/dist/implementations/dms/layout-banners.js.map +1 -0
- package/dist/implementations/dms/page.d.ts +2 -0
- package/dist/implementations/dms/page.js +82 -27
- package/dist/implementations/dms/page.js.map +1 -1
- package/dist/implementations/dms/quick-actions.d.ts +5 -0
- package/dist/implementations/dms/quick-actions.js.map +1 -1
- package/dist/implementations/dms/resolver-timeout.d.ts +1 -0
- package/dist/implementations/dms/resolver-timeout.js +13 -0
- package/dist/implementations/dms/resolver-timeout.js.map +1 -0
- package/dist/implementations/dms/saas-mode.d.ts +8 -0
- package/dist/implementations/dms/saas-mode.js +20 -0
- package/dist/implementations/dms/saas-mode.js.map +1 -0
- package/dist/implementations/dms-auth/index.d.ts +2 -1
- package/dist/implementations/dms-auth/index.js +19 -8
- package/dist/implementations/dms-auth/index.js.map +1 -1
- package/dist/implementations/dms-html-render/service-jwt.js +2 -1
- package/dist/implementations/dms-html-render/service-jwt.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/pages/settings/users/index.d.ts +1 -0
- package/dist/pages/settings/users/index.js +1 -0
- package/dist/pages/settings/users/index.js.map +1 -1
- package/dist/pages/settings/users/invite-extension-routes.d.ts +4 -0
- package/dist/pages/settings/users/invite-extension-routes.js +57 -0
- package/dist/pages/settings/users/invite-extension-routes.js.map +1 -0
- package/dist/pages/settings/users/invites.d.ts +2 -1
- package/dist/pages/settings/users/invites.js +17 -5
- package/dist/pages/settings/users/invites.js.map +1 -1
- package/dist/pages/settings/users/members.d.ts +4 -1
- package/dist/pages/settings/users/members.js +10 -6
- package/dist/pages/settings/users/members.js.map +1 -1
- package/dist/pages/settings/users/notifications.js +1 -1
- package/dist/pages/settings/users/notifications.js.map +1 -1
- package/dist/pages/settings/users/quick-actions.d.ts +1 -0
- package/dist/pages/settings/users/quick-actions.js +22 -0
- package/dist/pages/settings/users/quick-actions.js.map +1 -0
- package/dist/routes/auth/signup.d.ts +2 -0
- package/dist/routes/auth/signup.js +7 -2
- package/dist/routes/auth/signup.js.map +1 -1
- package/dist/test/integration/invite-extension-edit.test.d.ts +1 -0
- package/dist/test/integration/invite-extension-edit.test.js +122 -0
- package/dist/test/integration/invite-extension-edit.test.js.map +1 -0
- package/dist/test/integration/saas-mode-ownership.test.d.ts +1 -0
- package/dist/test/integration/saas-mode-ownership.test.js +81 -0
- package/dist/test/integration/saas-mode-ownership.test.js.map +1 -0
- package/dist/test/integration/tenant-lifecycle.test.js +38 -0
- package/dist/test/integration/tenant-lifecycle.test.js.map +1 -1
- package/dist/test/unit/implementations/dms/layout-banners.test.d.ts +1 -0
- package/dist/test/unit/implementations/dms/layout-banners.test.js +217 -0
- package/dist/test/unit/implementations/dms/layout-banners.test.js.map +1 -0
- package/dist/test/unit/implementations/dms/quick-actions-button.test.d.ts +1 -0
- package/dist/test/unit/implementations/dms/quick-actions-button.test.js +220 -0
- package/dist/test/unit/implementations/dms/quick-actions-button.test.js.map +1 -0
- package/dist/test/unit/implementations/dms-html-render/generate-html.test.js +1 -1
- package/dist/test/unit/implementations/dms-html-render/generate-html.test.js.map +1 -1
- package/dist/test/unit/implementations/dms-html-render/service-jwt.test.d.ts +1 -0
- package/dist/test/unit/implementations/dms-html-render/service-jwt.test.js +37 -0
- package/dist/test/unit/implementations/dms-html-render/service-jwt.test.js.map +1 -0
- package/dist/test/unit/interfaces/dms/invite-extension.test.js +138 -12
- package/dist/test/unit/interfaces/dms/invite-extension.test.js.map +1 -1
- package/dist/test/unit/interfaces/dms/password-policy.test.d.ts +1 -0
- package/dist/test/unit/interfaces/dms/password-policy.test.js +43 -0
- package/dist/test/unit/interfaces/dms/password-policy.test.js.map +1 -0
- package/dist/test/unit/interfaces/dms/saas-mode.test.d.ts +1 -0
- package/dist/test/unit/interfaces/dms/saas-mode.test.js +42 -0
- package/dist/test/unit/interfaces/dms/saas-mode.test.js.map +1 -0
- package/dist/test/unit/interfaces/dms/tenant-invite-email.test.d.ts +1 -0
- package/dist/test/unit/interfaces/dms/tenant-invite-email.test.js +53 -0
- package/dist/test/unit/interfaces/dms/tenant-invite-email.test.js.map +1 -0
- package/dist/test/unit/interfaces/dms-base/table-view-form-slots.test.d.ts +1 -0
- package/dist/test/unit/interfaces/dms-base/table-view-form-slots.test.js +80 -0
- package/dist/test/unit/interfaces/dms-base/table-view-form-slots.test.js.map +1 -0
- package/dist/test/unit/pages/settings/invite-member-quick-action.test.d.ts +1 -0
- package/dist/test/unit/pages/settings/invite-member-quick-action.test.js +104 -0
- package/dist/test/unit/pages/settings/invite-member-quick-action.test.js.map +1 -0
- package/dist/test/unit/pages/settings/notifications-access-gate.test.d.ts +1 -0
- package/dist/test/unit/pages/settings/notifications-access-gate.test.js +78 -0
- package/dist/test/unit/pages/settings/notifications-access-gate.test.js.map +1 -0
- package/dist/test/unit/signup-account-guard.test.js +20 -2
- package/dist/test/unit/signup-account-guard.test.js.map +1 -1
- package/dist/test/unit/utils/admin-invite-email.test.d.ts +1 -0
- package/dist/test/unit/utils/admin-invite-email.test.js +69 -0
- package/dist/test/unit/utils/admin-invite-email.test.js.map +1 -0
- package/dist/utils/admin-invite-email.d.ts +14 -0
- package/dist/utils/admin-invite-email.js +51 -0
- package/dist/utils/admin-invite-email.js.map +1 -0
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.js +0 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/validation/auth.schema.d.ts +3 -3
- package/dist/validation/auth.schema.js +1 -1
- package/dist/validation/auth.schema.js.map +1 -1
- package/dist/validation/password.d.ts +0 -1
- package/dist/validation/password.js +6 -3
- package/dist/validation/password.js.map +1 -1
- package/frontend-vue/layers/dms-auth/app/custom-pages/auth/signup.vue +37 -8
- package/frontend-vue/layers/dms-auth/i18n/locales/auth-en-GB.json +3 -1
- package/frontend-vue/layers/dms-auth/i18n/locales/auth-fr-FR.json +3 -1
- package/frontend-vue/layers/dms-core/i18n/locales/core-en-GB.json +4 -0
- package/frontend-vue/layers/dms-core/i18n/locales/core-fr-FR.json +4 -0
- package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardBanners.vue +50 -0
- package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardHeader.vue +16 -13
- package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardSidebar.vue +2 -2
- package/frontend-vue/layers/dms-layout/app/build/components/notification/NotificationPopover.vue +11 -5
- package/frontend-vue/layers/dms-layout/app/build/components/notification/widgetRequest.ts +20 -0
- package/frontend-vue/layers/dms-layout/app/composables/layout/useLayoutBanners.ts +59 -0
- package/frontend-vue/layers/dms-layout/app/composables/page/useQuickActions.ts +15 -2
- package/frontend-vue/layers/dms-layout/app/custom-layouts/DefaultLayout.vue +2 -0
- package/frontend-vue/layers/dms-layout/app/emails/EmailAdminInvite.vue +54 -9
- package/frontend-vue/layers/dms-layout/app/error.vue +17 -2
- package/frontend-vue/layers/dms-layout/app/types/page.ts +22 -0
- package/frontend-vue/layers/dms-layout/app/utils/breadcrumb.ts +48 -0
- package/frontend-vue/layers/dms-layout/app/utils/favorites.ts +94 -0
- package/frontend-vue/layers/dms-layout/i18n/locales/layout-en-GB.json +21 -2
- package/frontend-vue/layers/dms-layout/i18n/locales/layout-fr-FR.json +21 -2
- package/frontend-vue/layers/dms-onboarding/app/composables/onboarding/index.ts +1 -1
- package/frontend-vue/layers/dms-onboarding/app/composables/onboarding/{useOnboardingMiddleware.ts → useOnboarding.ts} +0 -12
- package/frontend-vue/layers/dms-onboarding/app/custom-pages/onboarding.vue +4 -1
- package/frontend-vue/layers/dms-onboarding/app/middleware/onboarding.global.ts +21 -4
- package/frontend-vue/layers/dms-ui/app/build/components/containers/drawer/DynamicDrawer.vue +13 -3
- package/frontend-vue/layers/dms-ui/app/build/components/containers/modal/DynamicModal.vue +13 -3
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViewConfig.ts +2 -7
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/columnVisibility.ts +13 -0
- package/frontend-vue/layers/dms-ui/app/components/PasswordStrength.vue +1 -1
- package/frontend-vue/layers/dms-ui/app/components/activity/ActivityItem.vue +1 -1
- package/frontend-vue/layers/dms-ui/app/components/banner/Banner.vue +1 -1
- package/frontend-vue/layers/dms-ui/app/components/card/NavCard.vue +2 -2
- package/frontend-vue/layers/dms-ui/app/components/chart/Chart.vue +6 -16
- package/frontend-vue/layers/dms-ui/app/components/chart/ChartCard.vue +2 -2
- package/frontend-vue/layers/dms-ui/app/components/chart/internal/TrendBadge.vue +1 -1
- package/frontend-vue/layers/dms-ui/app/components/copy/CopyButton.vue +1 -1
- package/frontend-vue/layers/dms-ui/app/components/kpi/KpiCard.vue +3 -3
- package/frontend-vue/layers/dms-ui/app/components/master-detail/MasterDetail.vue +5 -1
- package/frontend-vue/layers/dms-ui/app/components/segmented/Segmented.vue +1 -1
- package/frontend-vue/layers/dms-ui/app/components/status/StatusSummary.vue +1 -1
- package/frontend-vue/layers/dms-ui/app/components/table-view/TableView.vue +35 -11
- package/frontend-vue/layers/dms-ui/app/components/tree/Tree.vue +10 -9
- package/frontend-vue/layers/dms-ui/app/composables/chart/donutRecords.ts +26 -0
- package/frontend-vue/layers/dms-ui/app/composables/tab/types/props.ts +4 -2
- package/frontend-vue/layers/dms-ui/app/composables/tab/useTab.ts +3 -3
- package/frontend-vue/layers/dms-ui/app/composables/table-view/shortcuts/index.ts +17 -4
- package/frontend-vue/layers/dms-ui/app/composables/table-view/shortcuts/tableViewEscape.ts +22 -0
- package/frontend-vue/layers/dms-ui/app/composables/table-view/types/column.ts +1 -1
- package/frontend-vue/layers/dms-ui/app/composables/table-view/types/custom-button.ts +2 -0
- package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/index.ts +19 -4
- package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/treeEscape.ts +21 -0
- package/frontend-vue/layers/dms-ui/app/types/quick-actions.ts +38 -3
- package/frontend-vue/layers/dms-ui/app/utils/overlayFocus.ts +16 -0
- package/frontend-vue/layers/dms-ui/i18n/locales/ui-en-GB.json +4 -2
- package/frontend-vue/layers/dms-ui/i18n/locales/ui-fr-FR.json +4 -2
- package/frontend-vue/package.json +1 -1
- package/frontend-vue/pnpm-lock.yaml +5 -5
- package/frontend-vue/tests/admin-invite-email.test.ts +86 -0
- package/frontend-vue/tests/breadcrumb-target.test.ts +50 -0
- package/frontend-vue/tests/chart-nested-donut.test.ts +97 -0
- package/frontend-vue/tests/error-page-message.test.ts +83 -0
- package/frontend-vue/tests/favorite-page.test.ts +104 -0
- package/frontend-vue/tests/icon-aria-hidden.test.ts +29 -0
- package/frontend-vue/tests/layout-banners.test.ts +224 -0
- package/frontend-vue/tests/notification-popover-errors.test.ts +147 -0
- package/frontend-vue/tests/onboarding-middleware.test.ts +103 -0
- package/frontend-vue/tests/password-strength-meter.test.ts +33 -0
- package/frontend-vue/tests/quick-action-intent.test.ts +74 -0
- package/frontend-vue/tests/quick-actions.test.ts +23 -0
- package/frontend-vue/tests/signup-invitation-link.test.ts +126 -0
- package/frontend-vue/tests/skeleton-paragraph.test.ts +30 -0
- package/frontend-vue/tests/tab-without-component-id.test.ts +51 -0
- package/frontend-vue/tests/table-column-visibility.test.ts +20 -0
- package/frontend-vue/tests/table-view-escape-shortcut.test.ts +141 -0
- package/frontend-vue/tests/tree-escape-shortcut.test.ts +138 -0
- package/frontend-vue/tests/vue-inventory.test.ts +1 -1
- package/package.json +2 -2
- 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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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
|
|
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":";;AAAA,6DAAuD;AACvD,6FAAqE;AACrE,+BAA8B;AAC9B,qDAAiE;AAMjE,qDAAkD;AAClD,kDAAqD;AAErD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAC/C,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAI5C,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAC9C,MAAM,oBAAoB,GAAG,sCAAsC,CAAC;AACpE,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAC5C,MAAM,WAAW,GAAG,iBAAiB,CAAC;AACtC,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAC/C,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAC1C,MAAM,UAAU,GAAG,mBAAmB,CAAC;AACvC,MAAM,EAAE,GAAG,WAAW,CAAC;AAOvB,SAAS,YAAY,CAAC,EAAU,EAAE,KAAa,EAAE,WAAoB;IACnE,OAAO;QACL,GAAG,EAAE,EAAE;QACP,KAAK;QACL,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,eAAe;QACzB,OAAO,EAAE,eAAe;QACxB,WAAW;QACX,QAAQ,EAAE,IAAI;KACI,CAAC;AACvB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAc;IACzC,MAAM,IAAA,wCAAQ,EAAC,sBAAiB,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC;QACrD,GAAG,EAAE,GAAG,YAAY,IAAI,MAAM,EAAE;QAChC,MAAM;QACN,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,KAAK;QACpB,QAAQ,EAAE,IAAI,IAAI,EAAE;QACpB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;AACL,CAAC;AAQD,KAAK,UAAU,aAAa,CAC1B,YAAkB,EAClB,KAAa,EACb,eAAuB,YAAY,CAAC,KAAK;
|
|
1
|
+
{"version":3,"file":"signup-account-guard.test.js","sourceRoot":"","sources":["../../../src/test/unit/signup-account-guard.test.ts"],"names":[],"mappings":";;AAAA,6DAAuD;AACvD,6FAAqE;AACrE,+BAA8B;AAC9B,qDAAiE;AAMjE,qDAAkD;AAClD,kDAAqD;AAErD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAC/C,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAI5C,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAC9C,MAAM,oBAAoB,GAAG,sCAAsC,CAAC;AACpE,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAC5C,MAAM,WAAW,GAAG,iBAAiB,CAAC;AACtC,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAC/C,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAC1C,MAAM,UAAU,GAAG,mBAAmB,CAAC;AACvC,MAAM,EAAE,GAAG,WAAW,CAAC;AAOvB,SAAS,YAAY,CAAC,EAAU,EAAE,KAAa,EAAE,WAAoB;IACnE,OAAO;QACL,GAAG,EAAE,EAAE;QACP,KAAK;QACL,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,eAAe;QACzB,OAAO,EAAE,eAAe;QACxB,WAAW;QACX,QAAQ,EAAE,IAAI;KACI,CAAC;AACvB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAc;IACzC,MAAM,IAAA,wCAAQ,EAAC,sBAAiB,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC;QACrD,GAAG,EAAE,GAAG,YAAY,IAAI,MAAM,EAAE;QAChC,MAAM;QACN,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,KAAK;QACpB,QAAQ,EAAE,IAAI,IAAI,EAAE;QACpB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;AACL,CAAC;AAQD,KAAK,UAAU,aAAa,CAC1B,YAAkB,EAClB,KAAa,EACb,eAAuB,YAAY,CAAC,KAAK,EACzC,IAAa;IAEb,MAAM,YAAY,GAAW,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG;QAGhB,UAAU,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE,CACnC,MAAM,KAAK,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;QAC1D,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,YAAY;QAC7B,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;QACzB,MAAM,EAAE,KAAK,EAAE,IAAU,EAAE,EAAE;YAC3B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,EAAE,KAAK,IAAI,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;KACsB,CAAC;IAE1B,IAAI,CAAC;QACH,MAAM,IAAA,eAAM,EACV,SAAS,EACT,EAAkB,EAClB;YACE,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,gBAAgB;YAC1B,IAAI;YACJ,KAAK;SACN,EACD,UAAU,EACV,EAAE,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,aAAa,CAAC,OAAsB,EAAE,OAAe;IAC5D,IAAA,aAAM,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,0BAAU,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAmB,CAAC;IAC5C,IAAA,aAAM,EAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACvD,IAAA,aAAM,EAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,QAAQ,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAIpE,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,WAAW,GAAG,YAAY,CAC9B,0BAA0B,EAC1B,sBAAsB,EACtB,KAAK,CACN,CAAC;QACF,MAAM,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,yBAAc,EAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;QAErE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAExD,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACpC,IAAA,aAAM,EAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAA,aAAM,EAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAA,aAAM,EAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACvD,IAAA,aAAM,EAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAKH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,WAAW,GAAG,YAAY,CAC9B,yBAAyB,EACzB,qBAAqB,EACrB,KAAK,CACN,CAAC;QACF,MAAM,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,yBAAc,EAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;QAErE,MAAM,OAAO,GAAG,MAAM,aAAa,CACjC,WAAW,EACX,KAAK,EACL,qBAAqB,CACtB,CAAC;QAEF,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACpC,IAAA,aAAM,EAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,SAAS,GAAG,YAAY,CAC5B,wBAAwB,EACxB,oBAAoB,EACpB,IAAI,CACL,CAAC;QACF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,yBAAc,EAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;QAEnE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAEtD,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACpC,IAAA,aAAM,EAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,KAAK,GAAG,YAAY,CAAC,oBAAoB,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC1E,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,yBAAc,EAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAE/D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAElD,IAAA,aAAM,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,0BAAU,CAAC,CAAC;QACvD,IAAA,aAAM,EAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAC9D,YAAY,CACb,CAAC;QACF,IAAA,aAAM,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAIH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,KAAK,GAAG,YAAY,CACxB,yBAAyB,EACzB,qBAAqB,EACrB,KAAK,CACN,CAAC;QACF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,yBAAc,EAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAE/D,MAAM,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;QAEzD,IAAA,aAAM,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,KAAK,GAAG,YAAY,CACxB,6BAA6B,EAC7B,yBAAyB,EACzB,KAAK,CACN,CAAC;QACF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,yBAAc,EAAC;YACrC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,MAAM,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAElC,IAAA,aAAM,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,KAAK,GAAG,YAAY,CACxB,oCAAoC,EACpC,gCAAgC,EAChC,KAAK,CACN,CAAC;QACF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,yBAAc,EAAC;YACrC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,MAAM,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAErD,IAAA,aAAM,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAIH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,WAAW,GAAG,YAAY,CAC9B,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,CACN,CAAC;QACF,MAAM,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAErC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;QAEvE,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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;
|