@antelopejs/dms 0.15.1 → 0.16.1
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 +31 -0
- package/README.md +36 -26
- package/bin/control/base.mjs +9 -4
- package/bin/control/browser-client.mjs +24 -5
- package/bin/control/browser-wire.mjs +41 -0
- package/bin/control/browser-wire.test.mjs +96 -0
- package/bin/control/browser.mjs +78 -27
- package/bin/control/commands-stack.mjs +58 -8
- package/bin/control/commands-verify.mjs +47 -1
- package/bin/control/doctor.mjs +49 -4
- package/bin/control/failure.mjs +9 -0
- package/bin/control/journey.mjs +158 -30
- package/bin/control/journey.test.mjs +61 -0
- package/bin/control/json.mjs +229 -0
- package/bin/control/json.test.mjs +130 -0
- package/bin/control/mail.mjs +57 -7
- package/bin/control/mail.test.mjs +55 -0
- package/bin/control/mongo.mjs +205 -27
- package/bin/control/mongo.test.mjs +298 -0
- package/bin/control/options.mjs +33 -0
- package/bin/control/processes.mjs +24 -2
- package/bin/control/renderer.mjs +39 -0
- package/bin/control/renderer.test.mjs +324 -0
- package/bin/control/run-state.mjs +119 -6
- package/bin/control/run-state.test.mjs +171 -0
- package/bin/control/session.mjs +30 -14
- package/bin/control/stack.mjs +95 -24
- package/bin/control/tab.mjs +117 -18
- package/bin/control/verify/behaviour.mjs +44 -6
- package/bin/control/verify/behaviour.test.mjs +130 -22
- package/bin/control/verify/decode.mjs +220 -0
- package/bin/control/verify/decode.test.mjs +245 -0
- package/bin/control/verify/doors.mjs +1 -1
- package/bin/control/verify/doors.test.mjs +40 -0
- package/bin/control/verify/emit.mjs +135 -9
- package/bin/control/verify/formal.mjs +61 -10
- package/bin/control/verify/formal.test.mjs +19 -3
- package/bin/control/verify/judgement.mjs +22 -3
- package/bin/control/verify/map.mjs +25 -5
- package/bin/control/verify/publish.mjs +20 -14
- package/bin/control/verify/seeded.mjs +65 -16
- package/bin/control/verify/skill.mjs +27 -6
- package/bin/control/verify/types.mjs +29 -0
- package/bin/control/verify/verdict.mjs +72 -7
- package/bin/dms-control.mjs +8 -28
- package/checks/api-error-presentation.d.mts +61 -0
- package/dist/attachments/access.js +1 -1
- package/dist/attachments/access.js.map +1 -1
- package/dist/attachments/fields.d.ts +2 -2
- package/dist/attachments/fields.js +26 -13
- package/dist/attachments/fields.js.map +1 -1
- package/dist/attachments/index.d.ts +1 -0
- package/dist/attachments/index.js +1 -0
- package/dist/attachments/index.js.map +1 -1
- package/dist/attachments/read.js.map +1 -1
- package/dist/attachments/save.d.ts +1 -1
- package/dist/attachments/save.js +49 -17
- package/dist/attachments/save.js.map +1 -1
- package/dist/attachments/table-view.d.ts +1 -2
- package/dist/attachments/table-view.js +23 -13
- package/dist/attachments/table-view.js.map +1 -1
- package/dist/automation/events.d.ts +10 -10
- package/dist/automation/index.js +3 -4
- package/dist/automation/index.js.map +1 -1
- package/dist/automation/send-notification.d.ts +2 -2
- package/dist/automation/send-notification.js +4 -6
- package/dist/automation/send-notification.js.map +1 -1
- package/dist/crons/cleanup-user-invites.js.map +1 -1
- package/dist/crons/sweep-expired-sessions.js.map +1 -1
- package/dist/crons/sweep-stale-exports.js.map +1 -1
- package/dist/db/guard-row.d.ts +2 -3
- package/dist/db/guard-row.js +1 -2
- package/dist/db/guard-row.js.map +1 -1
- package/dist/db/models/attachments.model.d.ts +7 -5
- package/dist/db/models/setupToken.model.d.ts +7 -5
- package/dist/db/models/signInAttempts.model.d.ts +7 -5
- package/dist/db/models/systemState.model.d.ts +7 -5
- package/dist/db/models/userEmailChanges.model.d.ts +7 -5
- package/dist/db/models/userKnownDevices.model.d.ts +7 -5
- package/dist/db/models/userNotificationPreferences.model.d.ts +7 -5
- package/dist/db/models/userNotifications.model.d.ts +9 -6
- package/dist/db/models/userNotifications.model.js.map +1 -1
- package/dist/dev/module-update-notifications.js.map +1 -1
- package/dist/hooks/internal/sign-in-monitor.js +6 -6
- package/dist/hooks/internal/sign-in-monitor.js.map +1 -1
- package/dist/implementations/dms/page/controller.d.ts +2 -2
- package/dist/implementations/dms/page/controller.js +3 -1
- package/dist/implementations/dms/page/controller.js.map +1 -1
- package/dist/implementations/dms/page/dynamic-menu.js +3 -2
- package/dist/implementations/dms/page/dynamic-menu.js.map +1 -1
- package/dist/implementations/dms/page/notifications.d.ts +6 -2
- package/dist/implementations/dms/page/notifications.js +1 -0
- package/dist/implementations/dms/page/notifications.js.map +1 -1
- package/dist/implementations/dms/page/preview-pages.js +6 -3
- package/dist/implementations/dms/page/preview-pages.js.map +1 -1
- package/dist/implementations/dms/page/registry.js +10 -4
- package/dist/implementations/dms/page/registry.js.map +1 -1
- package/dist/implementations/dms/permissions.js +12 -12
- package/dist/implementations/dms/permissions.js.map +1 -1
- package/dist/implementations/dms-base/bulk-selection.d.ts +3 -4
- package/dist/implementations/dms-base/bulk-selection.js +18 -6
- package/dist/implementations/dms-base/bulk-selection.js.map +1 -1
- package/dist/implementations/dms-base/filter-tokens.js.map +1 -1
- package/dist/implementations/dms-base/footer-summary.js +44 -27
- package/dist/implementations/dms-base/footer-summary.js.map +1 -1
- package/dist/implementations/dms-base/row-rule-operand.d.ts +6 -0
- package/dist/implementations/dms-base/row-rule-operand.js +41 -0
- package/dist/implementations/dms-base/row-rule-operand.js.map +1 -0
- package/dist/implementations/dms-base/search-route.d.ts +9 -13
- package/dist/implementations/dms-base/search-route.js +7 -6
- package/dist/implementations/dms-base/search-route.js.map +1 -1
- package/dist/implementations/dms-base/services.d.ts +1 -0
- package/dist/implementations/dms-base/services.js +1 -0
- package/dist/implementations/dms-base/services.js.map +1 -1
- package/dist/implementations/dms-base/table-view.d.ts +5 -6
- package/dist/implementations/dms-base/table-view.js +17 -6
- package/dist/implementations/dms-base/table-view.js.map +1 -1
- package/dist/implementations/dms-html-render/index.js +16 -6
- package/dist/implementations/dms-html-render/index.js.map +1 -1
- package/dist/implementations/dms-notifications/delivery-guard.d.ts +3 -2
- package/dist/implementations/dms-notifications/delivery-guard.js.map +1 -1
- package/dist/implementations/dms-notifications/index.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/pages/public/preview/block-types.d.ts +1 -2
- package/dist/pages/public/preview/block-types.js.map +1 -1
- package/dist/pages/settings/overview/account-summary.js +4 -1
- package/dist/pages/settings/overview/account-summary.js.map +1 -1
- package/dist/pages/settings/users/account-activity-feed.js +3 -2
- package/dist/pages/settings/users/account-activity-feed.js.map +1 -1
- package/dist/pages/settings/users/account-credentials.d.ts +1 -1
- package/dist/pages/settings/users/account-credentials.js +1 -2
- package/dist/pages/settings/users/account-credentials.js.map +1 -1
- package/dist/pages/settings/users/account-data-store.d.ts +1 -1
- package/dist/pages/settings/users/account-data-store.js +1 -3
- package/dist/pages/settings/users/account-data-store.js.map +1 -1
- package/dist/pages/settings/users/email-change.d.ts +2 -2
- package/dist/pages/settings/users/email-change.js +2 -3
- package/dist/pages/settings/users/email-change.js.map +1 -1
- package/dist/pages/settings/users/invite-extension-routes.d.ts +2 -2
- package/dist/pages/settings/users/invite-extension-routes.js +11 -4
- package/dist/pages/settings/users/invite-extension-routes.js.map +1 -1
- package/dist/pages/settings/users/invites.d.ts +2 -2
- package/dist/pages/settings/users/member-invite-batch.d.ts +2 -2
- package/dist/pages/settings/users/member-invite-batch.js +7 -3
- package/dist/pages/settings/users/member-invite-batch.js.map +1 -1
- package/dist/pages/settings/users/member-roles-field.js +1 -4
- package/dist/pages/settings/users/member-roles-field.js.map +1 -1
- package/dist/pages/settings/users/members.d.ts +2 -3
- package/dist/pages/settings/users/members.js.map +1 -1
- package/dist/pages/settings/users/notifications.d.ts +2 -3
- package/dist/pages/settings/users/notifications.js +2 -1
- package/dist/pages/settings/users/notifications.js.map +1 -1
- package/dist/pages/settings/users/profile-helpers.d.ts +0 -1
- package/dist/pages/settings/users/profile-helpers.js +0 -17
- package/dist/pages/settings/users/profile-helpers.js.map +1 -1
- package/dist/pages/settings/users/profile.d.ts +3 -4
- package/dist/pages/settings/users/profile.js +12 -12
- package/dist/pages/settings/users/profile.js.map +1 -1
- package/dist/pages/settings/users/region.d.ts +3 -4
- package/dist/pages/settings/users/region.js.map +1 -1
- package/dist/pages/settings/users/regional-preferences.d.ts +8 -1
- package/dist/pages/settings/users/regional-preferences.js +10 -6
- package/dist/pages/settings/users/regional-preferences.js.map +1 -1
- package/dist/pages/settings/users/role-preview.js +3 -2
- package/dist/pages/settings/users/role-preview.js.map +1 -1
- package/dist/pages/settings/users/roles.d.ts +4 -5
- package/dist/pages/settings/users/roles.js.map +1 -1
- package/dist/pages/settings/users/security.d.ts +9 -12
- package/dist/pages/settings/users/security.js +11 -9
- package/dist/pages/settings/users/security.js.map +1 -1
- package/dist/pages/settings/users/two-factor-operations.d.ts +7 -7
- package/dist/pages/settings/users/two-factor-operations.js +5 -7
- package/dist/pages/settings/users/two-factor-operations.js.map +1 -1
- package/dist/realtime/broker.js.map +1 -1
- package/dist/realtime/heartbeat.js.map +1 -1
- package/dist/realtime/redis-broker.js.map +1 -1
- package/dist/realtime/sessions.js.map +1 -1
- package/dist/realtime/sse.js +1 -2
- package/dist/realtime/sse.js.map +1 -1
- package/dist/routes/auth/forgot-password.d.ts +1 -1
- package/dist/routes/auth/forgot-password.js +1 -3
- package/dist/routes/auth/forgot-password.js.map +1 -1
- package/dist/routes/auth/login.d.ts +1 -1
- package/dist/routes/auth/login.js +1 -2
- package/dist/routes/auth/login.js.map +1 -1
- package/dist/routes/auth/logout.d.ts +1 -1
- package/dist/routes/auth/logout.js +1 -2
- package/dist/routes/auth/logout.js.map +1 -1
- package/dist/routes/auth/oauth/providers.js +30 -6
- package/dist/routes/auth/oauth/providers.js.map +1 -1
- package/dist/routes/auth/oauth/state.js +8 -5
- package/dist/routes/auth/oauth/state.js.map +1 -1
- package/dist/routes/auth/oauth/token-exchange.js +8 -1
- package/dist/routes/auth/oauth/token-exchange.js.map +1 -1
- package/dist/routes/auth/refresh.d.ts +1 -1
- package/dist/routes/auth/refresh.js +1 -2
- package/dist/routes/auth/refresh.js.map +1 -1
- package/dist/routes/auth/request-2fa-email.d.ts +1 -1
- package/dist/routes/auth/request-2fa-email.js +1 -2
- package/dist/routes/auth/request-2fa-email.js.map +1 -1
- package/dist/routes/auth/reset-password.d.ts +1 -1
- package/dist/routes/auth/reset-password.js +1 -3
- package/dist/routes/auth/reset-password.js.map +1 -1
- package/dist/routes/auth/session-handoff.d.ts +1 -1
- package/dist/routes/auth/session-handoff.js +1 -2
- package/dist/routes/auth/session-handoff.js.map +1 -1
- package/dist/routes/auth/signup.d.ts +1 -1
- package/dist/routes/auth/signup.js +1 -2
- package/dist/routes/auth/signup.js.map +1 -1
- package/dist/routes/auth/switch-tenant.d.ts +2 -3
- package/dist/routes/auth/switch-tenant.js +3 -2
- package/dist/routes/auth/switch-tenant.js.map +1 -1
- package/dist/routes/auth/validate-forgot-password-token.d.ts +1 -1
- package/dist/routes/auth/validate-forgot-password-token.js +1 -3
- package/dist/routes/auth/validate-forgot-password-token.js.map +1 -1
- package/dist/routes/auth/validate-invite-token.d.ts +1 -1
- package/dist/routes/auth/validate-invite-token.js +1 -3
- package/dist/routes/auth/validate-invite-token.js.map +1 -1
- package/dist/routes/auth/verify-2fa.d.ts +1 -1
- package/dist/routes/auth/verify-2fa.js +1 -2
- package/dist/routes/auth/verify-2fa.js.map +1 -1
- package/dist/routes/auth/verify-email.d.ts +1 -1
- package/dist/routes/auth/verify-email.js +1 -2
- package/dist/routes/auth/verify-email.js.map +1 -1
- package/dist/routes/auth.d.ts +14 -15
- package/dist/routes/auth.js +15 -13
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/files.d.ts +1 -2
- package/dist/routes/files.js.map +1 -1
- package/dist/routes/onboarding.d.ts +1 -2
- package/dist/routes/onboarding.js.map +1 -1
- package/dist/routes/realtime.js +5 -6
- package/dist/routes/realtime.js.map +1 -1
- package/dist/routes/store.d.ts +6 -7
- package/dist/routes/store.js +19 -13
- package/dist/routes/store.js.map +1 -1
- package/dist/store/catalog.d.ts +13 -5
- package/dist/store/catalog.js +19 -9
- package/dist/store/catalog.js.map +1 -1
- package/dist/store/compatibility.d.ts +1 -0
- package/dist/store/compatibility.js +24 -8
- package/dist/store/compatibility.js.map +1 -1
- package/dist/store/frontend-compatibility.js +15 -3
- package/dist/store/frontend-compatibility.js.map +1 -1
- package/dist/store/interfaces.js +35 -13
- package/dist/store/interfaces.js.map +1 -1
- package/dist/store/internal/frontend/frontend-modules.js +7 -3
- package/dist/store/internal/frontend/frontend-modules.js.map +1 -1
- package/dist/store/internal/frontend/frontend-ready.d.ts +2 -1
- package/dist/store/internal/frontend/frontend-ready.js +6 -4
- package/dist/store/internal/frontend/frontend-ready.js.map +1 -1
- package/dist/store/internal/frontend/manifest.js +6 -7
- package/dist/store/internal/frontend/manifest.js.map +1 -1
- package/dist/store/operations.js.map +1 -1
- package/dist/store/registry.js.map +1 -1
- package/dist/store/runtime.d.ts +13 -0
- package/dist/store/runtime.js +9 -1
- package/dist/store/runtime.js.map +1 -1
- package/dist/utils/admin-invite-email.js +3 -1
- package/dist/utils/admin-invite-email.js.map +1 -1
- package/dist/utils/email-subjects.js +3 -1
- package/dist/utils/email-subjects.js.map +1 -1
- package/dist/utils/export-jobs-run.js.map +1 -1
- package/dist/utils/export-jobs.js +3 -9
- package/dist/utils/export-jobs.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/own-value.d.ts +1 -0
- package/dist/utils/own-value.js +7 -0
- package/dist/utils/own-value.js.map +1 -0
- package/dist/utils/row-action-rule-evaluator.js +31 -35
- package/dist/utils/row-action-rule-evaluator.js.map +1 -1
- package/dist/utils/sign-in-country.js +4 -2
- package/dist/utils/sign-in-country.js.map +1 -1
- package/dist/utils/tenant-export-archive.js +9 -14
- package/dist/utils/tenant-export-archive.js.map +1 -1
- package/dist/utils/user-agent.js +2 -1
- package/dist/utils/user-agent.js.map +1 -1
- package/dist/validation/auth.schema.d.ts +10 -10
- package/dist/validation/regional-preferences.schema.d.ts +2 -2
- package/dist/validation/role-editor.schema.d.ts +1 -1
- package/frontend-vue/build/backend-boundary.ts +49 -18
- package/frontend-vue/dms.frontend.ts +8 -12
- package/frontend-vue/layers/dms-auth/server/accounts.ts +44 -3
- package/frontend-vue/layers/dms-auth/server/actions.ts +17 -4
- package/frontend-vue/layers/dms-auth/server/oauth.ts +42 -4
- package/frontend-vue/layers/dms-core/app/types/watch.ts +1 -2
- package/frontend-vue/layers/dms-ui/app/build/composables/form/fieldValueRule.ts +57 -6
- package/frontend-vue/layers/dms-ui/app/build/composables/form/registerFormFunctions.ts +7 -9
- package/frontend-vue/layers/dms-ui/app/entries/composables/form/registerFormFunctions.ts +1 -0
- package/frontend-vue/lazy-plugin.ts +18 -0
- package/frontend-vue/package.json +2 -2
- package/package.json +19 -13
- package/skills/dms-project/SKILL.md +4 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"row-action-rule-evaluator.js","sourceRoot":"","sources":["../../src/utils/row-action-rule-evaluator.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"row-action-rule-evaluator.js","sourceRoot":"","sources":["../../src/utils/row-action-rule-evaluator.ts"],"names":[],"mappings":";;;AACA,oGAA4F;AAQ5F,SAAS,KAAK,CAAC,KAAc;IAC3B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAGM,MAAM,qBAAqB,GAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IAChE,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,6BAAqB,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,6BAAqB,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,IAAA,6BAAqB,EAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAErC,IAAI,UAAU,GAAY,GAAG,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACvB,UAAU,GAAG,SAAS,CAAC;YACvB,MAAM;QACR,CAAC;QACD,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,CAAC;IACD,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,OAAO,sCAAe,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;QACxB,OAAO,sCAAe,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,OAAO,sCAAe,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,OAAO,sCAAe,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAjCW,QAAA,qBAAqB,yBAiChC"}
|
|
@@ -9,6 +9,7 @@ exports.normalizeCountryCode = normalizeCountryCode;
|
|
|
9
9
|
exports.lookupCountry = lookupCountry;
|
|
10
10
|
exports.resolveClientOrigin = resolveClientOrigin;
|
|
11
11
|
exports.countryDisplayName = countryDisplayName;
|
|
12
|
+
const own_value_1 = require("./own-value");
|
|
12
13
|
const node_fs_1 = require("node:fs");
|
|
13
14
|
const node_path_1 = __importDefault(require("node:path"));
|
|
14
15
|
const logging_1 = require("@antelopejs/interface-core/logging");
|
|
@@ -66,8 +67,9 @@ function lookupCountry(ip, lookup = countryLookup()) {
|
|
|
66
67
|
}
|
|
67
68
|
function resolveClientOrigin(ip, headers) {
|
|
68
69
|
const headerName = (0, config_1.getAuthConfig)().signInCountry?.header?.toLowerCase();
|
|
69
|
-
const country = (headerName
|
|
70
|
-
|
|
70
|
+
const country = (headerName
|
|
71
|
+
? normalizeCountryCode((0, own_value_1.ownValue)(headers, headerName))
|
|
72
|
+
: undefined) ?? lookupCountry(ip);
|
|
71
73
|
return { ip, country };
|
|
72
74
|
}
|
|
73
75
|
function displayLocales(language) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign-in-country.js","sourceRoot":"","sources":["../../src/utils/sign-in-country.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"sign-in-country.js","sourceRoot":"","sources":["../../src/utils/sign-in-country.ts"],"names":[],"mappings":";;;;;;AAgEA,gDAEC;AAID,oDASC;AAQD,sCAUC;AASD,kDAUC;AAiBD,gDAKC;AA1ID,2CAAuC;AACvC,qCAAuC;AACvC,0DAA6B;AAC7B,gEAA6D;AAC7D,uCAAwD;AACxD,sCAA0C;AAE1C,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,MAAM,oBAAoB,GAAG,YAAY,CAAC;AAE1C,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAKxD,QAAA,wBAAwB,GAAG,mBAAI,CAAC,IAAI,CAC/C,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,wBAAwB,CACzB,CAAC;AAeF,IAAI,YAA8C,CAAC;AAEnD,SAAS,YAAY;IACnB,MAAM,UAAU,GAAG,IAAA,sBAAa,GAAE,CAAC,aAAa,EAAE,QAAQ,CAAC;IAC3D,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,UAAU,IAAI,gCAAwB,CAAC;AAChD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,iBAAM,CAAkB,IAAA,sBAAY,EAAC,IAAI,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,iBAAO,CAAC,IAAI,CACV,yCAAyC,IAAI,sLAAsL,MAAM,CAAC,KAAK,CAAC,GAAG,CACpP,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAGD,SAAS,aAAa;IACpB,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC;IACpD,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,OAAO,YAAY,CAAC;AACtB,CAAC;AAGD,SAAgB,kBAAkB;IAChC,YAAY,GAAG,SAAS,CAAC;AAC3B,CAAC;AAID,SAAgB,oBAAoB,CAAC,KAAc;IACjD,MAAM,SAAS,GAAY,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAEnE,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACpD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAQD,SAAgB,aAAa,CAC3B,EAAU,EACV,SAA+B,aAAa,EAAE;IAE9C,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,CAAC;QACH,OAAO,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AASD,SAAgB,mBAAmB,CACjC,EAAU,EACV,OAAuB;IAEvB,MAAM,UAAU,GAAG,IAAA,sBAAa,GAAE,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACxE,MAAM,OAAO,GACX,CAAC,UAAU;QACT,CAAC,CAAC,oBAAoB,CAAC,IAAA,oBAAQ,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC;IACtC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,cAAc,CAAC,QAA4B;IAClD,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AASD,SAAgB,kBAAkB,CAAC,IAAY,EAAE,QAAiB;IAChE,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;QAC5D,IAAI,EAAE,QAAQ;KACf,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAChC,CAAC"}
|
|
@@ -16,6 +16,7 @@ const export_jobs_run_1 = require("./export-jobs-run");
|
|
|
16
16
|
var tenant_export_archive_2 = require("@antelopejs/interface-dms/base/tenant-export-archive");
|
|
17
17
|
Object.defineProperty(exports, "TENANT_EXPORT_CONTENT_TYPE", { enumerable: true, get: function () { return tenant_export_archive_2.TENANT_EXPORT_CONTENT_TYPE; } });
|
|
18
18
|
Object.defineProperty(exports, "TENANT_EXPORT_EXTENSION", { enumerable: true, get: function () { return tenant_export_archive_2.TENANT_EXPORT_EXTENSION; } });
|
|
19
|
+
const ABORTED_MESSAGE = "Tenant export aborted";
|
|
19
20
|
const MANIFEST_ENTRY = "manifest.json";
|
|
20
21
|
const MODULES_DIRECTORY = "modules";
|
|
21
22
|
const JSON_INDENT = 2;
|
|
@@ -27,12 +28,6 @@ const PATH_SEPARATORS = /[\\/]+/;
|
|
|
27
28
|
const TRAVERSAL_SEGMENTS = [".", ".."];
|
|
28
29
|
const FULL_PROGRESS = 100;
|
|
29
30
|
const DEDUPE_START_SUFFIX = 2;
|
|
30
|
-
function describeError(error) {
|
|
31
|
-
return error instanceof Error ? error.message : String(error);
|
|
32
|
-
}
|
|
33
|
-
function abortReason(signal) {
|
|
34
|
-
return signal.reason ?? new Error("Tenant export aborted");
|
|
35
|
-
}
|
|
36
31
|
class ExportArchiveWriter {
|
|
37
32
|
signal;
|
|
38
33
|
archive = (0, archiver_1.default)("zip");
|
|
@@ -57,7 +52,7 @@ class ExportArchiveWriter {
|
|
|
57
52
|
}
|
|
58
53
|
throwIfAborted() {
|
|
59
54
|
if (this.signal.aborted) {
|
|
60
|
-
throw
|
|
55
|
+
throw this.signal.reason ?? new Error(ABORTED_MESSAGE);
|
|
61
56
|
}
|
|
62
57
|
}
|
|
63
58
|
assertUsable() {
|
|
@@ -65,8 +60,8 @@ class ExportArchiveWriter {
|
|
|
65
60
|
throw this.failure;
|
|
66
61
|
}
|
|
67
62
|
}
|
|
68
|
-
|
|
69
|
-
const payload = Buffer.from(
|
|
63
|
+
appendJsonText(name, text) {
|
|
64
|
+
const payload = Buffer.from(text);
|
|
70
65
|
return this.append(name, () => {
|
|
71
66
|
this.archive.append(payload, { name });
|
|
72
67
|
});
|
|
@@ -112,7 +107,7 @@ class ExportArchiveWriter {
|
|
|
112
107
|
settle(resolve);
|
|
113
108
|
};
|
|
114
109
|
const onError = (error) => settle(() => reject(error));
|
|
115
|
-
const onAbort = () => settle(() => reject(
|
|
110
|
+
const onAbort = () => settle(() => reject(this.signal.reason ?? new Error(ABORTED_MESSAGE)));
|
|
116
111
|
this.archive.on("entry", onEntry);
|
|
117
112
|
this.archive.on("error", onError);
|
|
118
113
|
this.signal.addEventListener("abort", onAbort, { once: true });
|
|
@@ -132,7 +127,7 @@ class ScopedTenantExportArchive {
|
|
|
132
127
|
this.closed = true;
|
|
133
128
|
}
|
|
134
129
|
addJson(path, data) {
|
|
135
|
-
return this.add(path, (name) => this.writer.
|
|
130
|
+
return this.add(path, (name) => this.writer.appendJsonText(name, JSON.stringify(data, null, JSON_INDENT)));
|
|
136
131
|
}
|
|
137
132
|
addFile(path, localPath) {
|
|
138
133
|
return this.add(path, (name) => this.writer.appendFile(name, localPath));
|
|
@@ -178,7 +173,7 @@ function resolveModuleIds(contributors) {
|
|
|
178
173
|
async function writeContribution(writer, moduleId, contribution) {
|
|
179
174
|
if (!contribution)
|
|
180
175
|
return undefined;
|
|
181
|
-
await writer.
|
|
176
|
+
await writer.appendJsonText(`${MODULES_DIRECTORY}/${moduleId}.${JSON_EXTENSION}`, JSON.stringify(contribution.data, null, JSON_INDENT));
|
|
182
177
|
return contribution.moduleId === moduleId ? undefined : contribution.moduleId;
|
|
183
178
|
}
|
|
184
179
|
async function collectContribution(scoped, contributor, options) {
|
|
@@ -209,7 +204,7 @@ async function runContributor(writer, moduleId, contributor, options) {
|
|
|
209
204
|
moduleId,
|
|
210
205
|
entries: scoped.entries,
|
|
211
206
|
failed: true,
|
|
212
|
-
error:
|
|
207
|
+
error: error instanceof Error ? error.message : String(error),
|
|
213
208
|
};
|
|
214
209
|
}
|
|
215
210
|
}
|
|
@@ -245,7 +240,7 @@ async function buildTenantExportArchive(options) {
|
|
|
245
240
|
const writer = new ExportArchiveWriter(options.localPath, options.signal);
|
|
246
241
|
try {
|
|
247
242
|
const reports = await runContributors(writer, options);
|
|
248
|
-
await writer.
|
|
243
|
+
await writer.appendJsonText(MANIFEST_ENTRY, JSON.stringify(buildManifest(options.tenantId, reports), null, JSON_INDENT));
|
|
249
244
|
await writer.finalize();
|
|
250
245
|
return summarize(reports);
|
|
251
246
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-export-archive.js","sourceRoot":"","sources":["../../src/utils/tenant-export-archive.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"tenant-export-archive.js","sourceRoot":"","sources":["../../src/utils/tenant-export-archive.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/user-agent.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseUserAgent = parseUserAgent;
|
|
4
|
+
const own_value_1 = require("./own-value");
|
|
4
5
|
const ua_parser_js_1 = require("ua-parser-js");
|
|
5
6
|
const DEVICE_TYPES = {
|
|
6
7
|
mobile: "mobile",
|
|
@@ -16,7 +17,7 @@ function parseUserAgent(userAgent) {
|
|
|
16
17
|
browserVersion: browser.version ?? "",
|
|
17
18
|
osName: os.name ?? "",
|
|
18
19
|
osVersion: os.version ?? "",
|
|
19
|
-
deviceType: DEVICE_TYPES
|
|
20
|
+
deviceType: (0, own_value_1.ownValue)(DEVICE_TYPES, device.type ?? "") ?? "desktop",
|
|
20
21
|
};
|
|
21
22
|
}
|
|
22
23
|
//# sourceMappingURL=user-agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-agent.js","sourceRoot":"","sources":["../../src/utils/user-agent.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"user-agent.js","sourceRoot":"","sources":["../../src/utils/user-agent.ts"],"names":[],"mappings":";;AAkBA,wCAaC;AA/BD,2CAAuC;AAKvC,+CAAwC;AAQxC,MAAM,YAAY,GAA+B;IAC/C,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,SAAgB,cAAc,CAAC,SAAiB;IAC9C,MAAM,MAAM,GAAG,IAAI,uBAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACpC,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAElC,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QAC/B,cAAc,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QACrC,MAAM,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE;QACrB,SAAS,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE;QAC3B,UAAU,EAAE,IAAA,oBAAQ,EAAC,YAAY,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,SAAS;KACnE,CAAC;AACJ,CAAC"}
|
|
@@ -9,14 +9,14 @@ export declare const authSchema: {
|
|
|
9
9
|
}, "strip", z.ZodTypeAny, {
|
|
10
10
|
email: string;
|
|
11
11
|
name: string;
|
|
12
|
-
token: string;
|
|
13
12
|
password: string;
|
|
13
|
+
token: string;
|
|
14
14
|
lang?: string | undefined;
|
|
15
15
|
}, {
|
|
16
16
|
email: string;
|
|
17
17
|
name: string;
|
|
18
|
-
token: string;
|
|
19
18
|
password: string;
|
|
19
|
+
token: string;
|
|
20
20
|
lang?: string | undefined;
|
|
21
21
|
}>;
|
|
22
22
|
login: z.ZodObject<{
|
|
@@ -112,25 +112,25 @@ export declare const authSchema: {
|
|
|
112
112
|
password: z.ZodString;
|
|
113
113
|
}, "strip", z.ZodTypeAny, {
|
|
114
114
|
email: string;
|
|
115
|
-
token: string;
|
|
116
115
|
password: string;
|
|
116
|
+
token: string;
|
|
117
117
|
}, {
|
|
118
118
|
email: string;
|
|
119
|
-
token: string;
|
|
120
119
|
password: string;
|
|
120
|
+
token: string;
|
|
121
121
|
}>;
|
|
122
122
|
verify2FA: z.ZodObject<{
|
|
123
123
|
token: z.ZodString;
|
|
124
124
|
code: z.ZodString;
|
|
125
125
|
method: z.ZodEnum<["totp", "email", "backup"]>;
|
|
126
126
|
}, "strip", z.ZodTypeAny, {
|
|
127
|
-
method: "email" | "totp" | "backup";
|
|
128
|
-
code: string;
|
|
129
127
|
token: string;
|
|
130
|
-
}, {
|
|
131
|
-
method: "email" | "totp" | "backup";
|
|
132
128
|
code: string;
|
|
129
|
+
method: "email" | "totp" | "backup";
|
|
130
|
+
}, {
|
|
133
131
|
token: string;
|
|
132
|
+
code: string;
|
|
133
|
+
method: "email" | "totp" | "backup";
|
|
134
134
|
}>;
|
|
135
135
|
request2FAEmail: z.ZodObject<{
|
|
136
136
|
token: z.ZodString;
|
|
@@ -157,11 +157,11 @@ export declare const authSchema: {
|
|
|
157
157
|
method: z.ZodEnum<["totp", "email"]>;
|
|
158
158
|
code: z.ZodString;
|
|
159
159
|
}, "strip", z.ZodTypeAny, {
|
|
160
|
-
method: "email" | "totp";
|
|
161
160
|
code: string;
|
|
162
|
-
}, {
|
|
163
161
|
method: "email" | "totp";
|
|
162
|
+
}, {
|
|
164
163
|
code: string;
|
|
164
|
+
method: "email" | "totp";
|
|
165
165
|
}>;
|
|
166
166
|
regenerateBackup: z.ZodObject<{
|
|
167
167
|
code: z.ZodString;
|
|
@@ -11,12 +11,12 @@ export declare const regionalPreferencesSchema: z.ZodObject<{
|
|
|
11
11
|
timeZone?: string | null | undefined;
|
|
12
12
|
weekStart?: 0 | 1 | 6 | null | undefined;
|
|
13
13
|
timeFormat?: "h23" | "h12" | null | undefined;
|
|
14
|
-
dateFormat?: "
|
|
14
|
+
dateFormat?: "numeric" | "text" | null | undefined;
|
|
15
15
|
}, {
|
|
16
16
|
language?: string | undefined;
|
|
17
17
|
timeZone?: string | null | undefined;
|
|
18
18
|
weekStart?: 0 | 1 | 6 | null | undefined;
|
|
19
19
|
timeFormat?: "h23" | "h12" | null | undefined;
|
|
20
|
-
dateFormat?: "
|
|
20
|
+
dateFormat?: "numeric" | "text" | null | undefined;
|
|
21
21
|
}>;
|
|
22
22
|
export type RegionalPreferencesInput = z.infer<typeof regionalPreferencesSchema>;
|
|
@@ -6,8 +6,8 @@ export declare const roleEditorSchema: z.ZodObject<{
|
|
|
6
6
|
description: z.ZodDefault<z.ZodString>;
|
|
7
7
|
permissions: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
8
8
|
}, "strip", z.ZodTypeAny, {
|
|
9
|
-
description: string;
|
|
10
9
|
name: string;
|
|
10
|
+
description: string;
|
|
11
11
|
permissions: string[];
|
|
12
12
|
}, {
|
|
13
13
|
name: string;
|
|
@@ -10,20 +10,32 @@ const QUERY_OR_HASH = /[?#].*$/;
|
|
|
10
10
|
|
|
11
11
|
const backendRoots = new Map<string, string | null>();
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
/** Whether a parsed manifest names its package. */
|
|
14
|
+
function isNamedManifest(value: unknown): value is { name: string } {
|
|
15
|
+
return (
|
|
16
|
+
typeof value === "object" &&
|
|
17
|
+
value !== null &&
|
|
18
|
+
"name" in value &&
|
|
19
|
+
typeof value.name === "string"
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** The package name a `package.json` declares, or `undefined`. */
|
|
24
|
+
function packageName(manifest: string): string | undefined {
|
|
14
25
|
try {
|
|
15
|
-
const parsed:
|
|
16
|
-
|
|
17
|
-
);
|
|
18
|
-
return parsed.name;
|
|
26
|
+
const parsed: unknown = JSON.parse(readFileSync(manifest, "utf8"));
|
|
27
|
+
return isNamedManifest(parsed) ? parsed.name : undefined;
|
|
19
28
|
} catch {
|
|
20
29
|
return undefined;
|
|
21
30
|
}
|
|
22
31
|
}
|
|
23
32
|
|
|
33
|
+
/** The directory of the backend package that holds `directory`, or null. */
|
|
24
34
|
function backendRoot(directory: string): string | null {
|
|
25
35
|
const known = backendRoots.get(directory);
|
|
26
|
-
if (known !== undefined)
|
|
36
|
+
if (known !== undefined) {
|
|
37
|
+
return known;
|
|
38
|
+
}
|
|
27
39
|
const manifest = join(directory, "package.json");
|
|
28
40
|
const parent = dirname(directory);
|
|
29
41
|
let root: string | null = null;
|
|
@@ -44,7 +56,9 @@ function backendRoot(directory: string): string | null {
|
|
|
44
56
|
*/
|
|
45
57
|
function backendSourceFile(id: string): string | undefined {
|
|
46
58
|
const path = id.replace(QUERY_OR_HASH, "");
|
|
47
|
-
if (!isAbsolute(path))
|
|
59
|
+
if (!isAbsolute(path)) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
48
62
|
let real: string;
|
|
49
63
|
try {
|
|
50
64
|
real = realpathSync(path);
|
|
@@ -52,39 +66,56 @@ function backendSourceFile(id: string): string | undefined {
|
|
|
52
66
|
return undefined;
|
|
53
67
|
}
|
|
54
68
|
const root = backendRoot(dirname(real));
|
|
55
|
-
if (root === null)
|
|
69
|
+
if (root === null) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
56
72
|
return relative(root, real).split(sep)[0] === BACKEND_SOURCE
|
|
57
73
|
? real
|
|
58
74
|
: undefined;
|
|
59
75
|
}
|
|
60
76
|
|
|
61
77
|
/**
|
|
62
|
-
* Fails the build
|
|
63
|
-
*
|
|
78
|
+
* Fails the build and the dev server when a module of the frontend resolves to
|
|
79
|
+
* a file under the `src` of the backend package: the browser reaches the
|
|
64
80
|
* backend only through its HTTP interface. It checks what the whole resolution
|
|
65
|
-
* chain returns, so an alias is seen through
|
|
66
|
-
* returns is followed to its real path, and it runs
|
|
67
|
-
* (`enforce: "pre"`).
|
|
68
|
-
*
|
|
81
|
+
* chain returns, an id marked external included, so an alias is seen through
|
|
82
|
+
* and a symlink the resolver returns is followed to its real path, and it runs
|
|
83
|
+
* before the other plugins (`enforce: "pre"`). Vite builds workers with their
|
|
84
|
+
* own plugin list, so the plugin adds itself there too.
|
|
85
|
+
*
|
|
86
|
+
* antelopejs-sync writes this file from `@antelopejs/tooling-configs` and
|
|
87
|
+
* restores it on every run: change the plugin in the pack, not here.
|
|
69
88
|
*/
|
|
70
89
|
export function backendBoundary(): VitePlugin {
|
|
71
90
|
return {
|
|
72
|
-
|
|
91
|
+
...boundaryCheck(),
|
|
92
|
+
config: () => ({ worker: { plugins: () => [boundaryCheck()] } }),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** The check alone, as a worker build runs it. */
|
|
97
|
+
function boundaryCheck(): VitePlugin {
|
|
98
|
+
return {
|
|
99
|
+
name: `${BACKEND_PACKAGE}:backend-boundary`,
|
|
73
100
|
enforce: "pre",
|
|
74
101
|
async resolveId(source, importer, options) {
|
|
75
102
|
const resolved = await this.resolve(source, importer, {
|
|
76
103
|
...options,
|
|
77
104
|
skipSelf: true,
|
|
78
105
|
});
|
|
79
|
-
if (resolved === null
|
|
106
|
+
if (resolved === null) {
|
|
107
|
+
return resolved;
|
|
108
|
+
}
|
|
80
109
|
const file = backendSourceFile(resolved.id);
|
|
81
|
-
if (file === undefined)
|
|
110
|
+
if (file === undefined) {
|
|
111
|
+
return resolved;
|
|
112
|
+
}
|
|
82
113
|
const from =
|
|
83
114
|
importer === undefined
|
|
84
115
|
? "an entry point"
|
|
85
116
|
: importer.replace(QUERY_OR_HASH, "");
|
|
86
117
|
return this.error(
|
|
87
|
-
`Backend boundary: ${from} imports ${file}, which is under
|
|
118
|
+
`Backend boundary: ${from} imports ${file}, which is under the src of ${BACKEND_PACKAGE}. The frontend reaches the backend only through its HTTP interface.`,
|
|
88
119
|
);
|
|
89
120
|
},
|
|
90
121
|
};
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
type DmsFrontendSdk,
|
|
9
9
|
useDmsRuntimeConfig,
|
|
10
10
|
} from "#dms/frontend-module";
|
|
11
|
+
import { lazyPlugin } from "./lazy-plugin";
|
|
11
12
|
import authMiddleware from "./layers/dms-auth/app/middleware/auth";
|
|
12
13
|
import permissionsPreloadPlugin from "./layers/dms-auth/app/plugins/permissions-preload";
|
|
13
14
|
import asyncDataScopePlugin from "./layers/dms-core/app/plugins/async-data-scope";
|
|
@@ -164,20 +165,15 @@ function registerDeferredPlugins(
|
|
|
164
165
|
function registerPlugins(sdk: Parameters<DmsFrontendModule["setup"]>[0]): void {
|
|
165
166
|
const clientOnly = { clientOnly: true };
|
|
166
167
|
if (import.meta.env.DEV) {
|
|
167
|
-
sdk.registerPlugin(
|
|
168
|
-
|
|
169
|
-
"./layers/dms-layout/app/plugins/dms-dev-reload.client"
|
|
170
|
-
)
|
|
171
|
-
|
|
172
|
-
|
|
168
|
+
sdk.registerPlugin(
|
|
169
|
+
lazyPlugin(
|
|
170
|
+
() => import("./layers/dms-layout/app/plugins/dms-dev-reload.client"),
|
|
171
|
+
),
|
|
172
|
+
clientOnly,
|
|
173
|
+
);
|
|
173
174
|
|
|
174
175
|
sdk.registerPlugin(
|
|
175
|
-
|
|
176
|
-
const plugin = await import(
|
|
177
|
-
"./layers/dms-core/app/plugins/dev-error-log"
|
|
178
|
-
);
|
|
179
|
-
await plugin.default(context);
|
|
180
|
-
},
|
|
176
|
+
lazyPlugin(() => import("./layers/dms-core/app/plugins/dev-error-log")),
|
|
181
177
|
{ ...clientOnly, enforce: "pre" },
|
|
182
178
|
);
|
|
183
179
|
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import type { DmsServerEvent, DmsSession } from "#dms/server";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
isBoolean,
|
|
5
|
+
isObject,
|
|
6
|
+
isString,
|
|
7
|
+
} from "../../dms-core/app/utils/type-check";
|
|
4
8
|
|
|
5
9
|
/**
|
|
6
10
|
* The accounts this browser is signed in to: an index of their descriptors,
|
|
@@ -68,8 +72,42 @@ function descriptor(session: DmsSession, accountId: string): AccountDescriptor {
|
|
|
68
72
|
};
|
|
69
73
|
}
|
|
70
74
|
|
|
75
|
+
function isOptionalText(value: unknown): value is string | undefined {
|
|
76
|
+
return value === undefined || isString(value);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function isAccountDescriptor(value: unknown): value is AccountDescriptor {
|
|
80
|
+
return (
|
|
81
|
+
isObject(value) &&
|
|
82
|
+
value !== null &&
|
|
83
|
+
isString(value.accountId) &&
|
|
84
|
+
isOptionalText(value.userId) &&
|
|
85
|
+
isOptionalText(value.email) &&
|
|
86
|
+
isOptionalText(value.name) &&
|
|
87
|
+
isOptionalText(value.activeTenantId) &&
|
|
88
|
+
isBoolean(value.persistent)
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function isStoredAccount(value: unknown): value is StoredAccount {
|
|
93
|
+
return (
|
|
94
|
+
isAccountDescriptor(value) &&
|
|
95
|
+
isObject(value) &&
|
|
96
|
+
isOptionalText(value.refreshToken)
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function isAccountIndex(value: unknown): value is AccountIndex {
|
|
101
|
+
return (
|
|
102
|
+
isObject(value) &&
|
|
103
|
+
value !== null &&
|
|
104
|
+
!Array.isArray(value) &&
|
|
105
|
+
Object.values(value).every(isAccountDescriptor)
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
71
109
|
export function readAccounts(event: DmsServerEvent): AccountIndex {
|
|
72
|
-
return event.cookies.readSealed
|
|
110
|
+
return event.cookies.readSealed(ACCOUNT_INDEX_COOKIE, isAccountIndex) ?? {};
|
|
73
111
|
}
|
|
74
112
|
|
|
75
113
|
function writeAccountIndex(event: DmsServerEvent, accounts: AccountIndex) {
|
|
@@ -84,7 +122,10 @@ export function readAccount(
|
|
|
84
122
|
accountId: Parameters<typeof isString>[0],
|
|
85
123
|
): StoredAccount | undefined {
|
|
86
124
|
if (!isString(accountId) || !UUID.test(accountId)) return undefined;
|
|
87
|
-
return event.cookies.readSealed
|
|
125
|
+
return event.cookies.readSealed(
|
|
126
|
+
accountCookieName(accountId),
|
|
127
|
+
isStoredAccount,
|
|
128
|
+
);
|
|
88
129
|
}
|
|
89
130
|
|
|
90
131
|
export function storeAccount(
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
isBoolean,
|
|
3
|
+
isObject,
|
|
4
|
+
isString,
|
|
5
|
+
} from "../../dms-core/app/utils/type-check";
|
|
2
6
|
import type { DmsBackendRequest, DmsServerEvent } from "#dms/server";
|
|
3
7
|
import {
|
|
4
8
|
isPersistent,
|
|
@@ -30,6 +34,15 @@ interface PendingLogin {
|
|
|
30
34
|
persistent: boolean;
|
|
31
35
|
}
|
|
32
36
|
|
|
37
|
+
function isPendingLogin(value: unknown): value is PendingLogin {
|
|
38
|
+
return (
|
|
39
|
+
isObject(value) &&
|
|
40
|
+
value !== null &&
|
|
41
|
+
isString(value.token) &&
|
|
42
|
+
isBoolean(value.persistent)
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
33
46
|
/**
|
|
34
47
|
* Calls a backend endpoint that opens a session and, unless it asks for a
|
|
35
48
|
* second step, writes the session and stores the account.
|
|
@@ -51,7 +64,7 @@ async function establishWith(
|
|
|
51
64
|
{ maxAge: PENDING_LOGIN_LIFETIME_S, path: PENDING_LOGIN_PATH },
|
|
52
65
|
);
|
|
53
66
|
if (result.requires_2fa || result.requires_tenant_assignment) return result;
|
|
54
|
-
if (event.cookies.readSealed(PENDING_LOGIN))
|
|
67
|
+
if (event.cookies.readSealed(PENDING_LOGIN, isPendingLogin))
|
|
55
68
|
event.cookies.clear(PENDING_LOGIN, { path: PENDING_LOGIN_PATH });
|
|
56
69
|
const account = persistAccountSession(event, sessionFrom(result, persistent));
|
|
57
70
|
return { user: result.user, account };
|
|
@@ -83,9 +96,9 @@ export async function signup(event: DmsServerEvent) {
|
|
|
83
96
|
*/
|
|
84
97
|
export async function verifyTwoFactor(event: DmsServerEvent) {
|
|
85
98
|
const input = await event.readJson<Input>();
|
|
86
|
-
const pending = event.cookies.readSealed
|
|
99
|
+
const pending = event.cookies.readSealed(PENDING_LOGIN, isPendingLogin);
|
|
87
100
|
const persistent =
|
|
88
|
-
|
|
101
|
+
pending !== undefined && pending.token === input.token
|
|
89
102
|
? isPersistent(pending)
|
|
90
103
|
: true;
|
|
91
104
|
return establishWith(event, "/api/auth/verify-2fa", input, persistent);
|
|
@@ -3,7 +3,16 @@ import type { DmsServerEvent } from "#dms/server";
|
|
|
3
3
|
import { privateSecret } from "../../../server/private-options";
|
|
4
4
|
import { persistAccountSession } from "./accounts";
|
|
5
5
|
import { type SessionTokens, sessionFrom } from "./session";
|
|
6
|
-
import {
|
|
6
|
+
import type {
|
|
7
|
+
NoHandoff,
|
|
8
|
+
NoWorkspaceHandoff,
|
|
9
|
+
TwoFactorHandoff,
|
|
10
|
+
} from "../shared/oauth";
|
|
11
|
+
import {
|
|
12
|
+
isNumber,
|
|
13
|
+
isObject,
|
|
14
|
+
isString,
|
|
15
|
+
} from "../../dms-core/app/utils/type-check";
|
|
7
16
|
|
|
8
17
|
const FLOW = "dms_oauth_flow";
|
|
9
18
|
const HANDOFF = "dms_oauth_handoff";
|
|
@@ -43,6 +52,35 @@ interface OAuthResult extends SessionTokens {
|
|
|
43
52
|
|
|
44
53
|
const attempts = new Map<string, RateWindow>();
|
|
45
54
|
|
|
55
|
+
function isOAuthFlow(value: unknown): value is OAuthFlow {
|
|
56
|
+
return (
|
|
57
|
+
isObject(value) &&
|
|
58
|
+
value !== null &&
|
|
59
|
+
isString(value.state) &&
|
|
60
|
+
isNumber(value.expiresAt) &&
|
|
61
|
+
isString(value.redirect) &&
|
|
62
|
+
isString(value.language) &&
|
|
63
|
+
isString(value.invite)
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function isTextList(value: unknown): value is string[] {
|
|
68
|
+
return Array.isArray(value) && value.every(isString);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function isOAuthHandoff(
|
|
72
|
+
value: unknown,
|
|
73
|
+
): value is TwoFactorHandoff | NoWorkspaceHandoff {
|
|
74
|
+
if (!isObject(value) || value === null) return false;
|
|
75
|
+
if (value.kind === "2fa")
|
|
76
|
+
return isString(value.token) && isTextList(value.methods);
|
|
77
|
+
return (
|
|
78
|
+
value.kind === "no-workspace" &&
|
|
79
|
+
isString(value.token) &&
|
|
80
|
+
isString(value.provider)
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
46
84
|
function sweepAttempts(now: number) {
|
|
47
85
|
for (const [key, window] of attempts)
|
|
48
86
|
if (now - window.startedAt >= RATE_WINDOW_MS) attempts.delete(key);
|
|
@@ -155,7 +193,6 @@ function sameState(
|
|
|
155
193
|
left: OAuthFlow["state"],
|
|
156
194
|
right: OAuthFlow["state"],
|
|
157
195
|
): boolean {
|
|
158
|
-
if (!isString(left) || !isString(right)) return false;
|
|
159
196
|
const a = Buffer.from(left);
|
|
160
197
|
const b = Buffer.from(right);
|
|
161
198
|
return a.length === b.length && timingSafeEqual(a, b);
|
|
@@ -239,7 +276,7 @@ export async function oauthCallback(event: DmsServerEvent): Promise<Response> {
|
|
|
239
276
|
const { provider } = event.params;
|
|
240
277
|
if (!isValidOAuthProvider(provider) || rateLimited(event, "callback"))
|
|
241
278
|
return errorRedirect(FAILED);
|
|
242
|
-
const flow = event.cookies.readSealed
|
|
279
|
+
const flow = event.cookies.readSealed(FLOW, isOAuthFlow);
|
|
243
280
|
event.cookies.clear(FLOW, { path: FLOW_PATH });
|
|
244
281
|
const query = event.url.searchParams;
|
|
245
282
|
if (query.has("error")) return errorRedirect("error.oauth.cancelled");
|
|
@@ -253,7 +290,8 @@ export async function oauthCallback(event: DmsServerEvent): Promise<Response> {
|
|
|
253
290
|
* finish (a 2FA step, a workspace to pick), once.
|
|
254
291
|
*/
|
|
255
292
|
export function oauthHandoff(event: DmsServerEvent) {
|
|
256
|
-
const handoff
|
|
293
|
+
const handoff: TwoFactorHandoff | NoWorkspaceHandoff | NoHandoff =
|
|
294
|
+
event.cookies.readSealed(HANDOFF, isOAuthHandoff) ?? { kind: "none" };
|
|
257
295
|
event.cookies.clear(HANDOFF, { path: FLOW_PATH });
|
|
258
296
|
return handoff;
|
|
259
297
|
}
|