@portaidentity/cli 1.7.3 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/README.md +125 -105
- package/dist/admin/admin-date-time.d.ts +6 -0
- package/dist/admin/admin-date-time.d.ts.map +1 -0
- package/dist/admin/admin-date-time.js +33 -0
- package/dist/admin/admin-date-time.js.map +1 -0
- package/dist/admin/application-client-features.d.ts +38 -0
- package/dist/admin/application-client-features.d.ts.map +1 -0
- package/dist/admin/application-client-features.js +545 -0
- package/dist/admin/application-client-features.js.map +1 -0
- package/dist/admin/application-controller.d.ts +58 -0
- package/dist/admin/application-controller.d.ts.map +1 -0
- package/dist/admin/application-controller.js +286 -0
- package/dist/admin/application-controller.js.map +1 -0
- package/dist/admin/application-dialogs.d.ts +91 -0
- package/dist/admin/application-dialogs.d.ts.map +1 -0
- package/dist/admin/application-dialogs.js +250 -0
- package/dist/admin/application-dialogs.js.map +1 -0
- package/dist/admin/application-rbac-controller.d.ts +56 -0
- package/dist/admin/application-rbac-controller.d.ts.map +1 -0
- package/dist/admin/application-rbac-controller.js +280 -0
- package/dist/admin/application-rbac-controller.js.map +1 -0
- package/dist/admin/application-rbac-features.d.ts +51 -0
- package/dist/admin/application-rbac-features.d.ts.map +1 -0
- package/dist/admin/application-rbac-features.js +175 -0
- package/dist/admin/application-rbac-features.js.map +1 -0
- package/dist/admin/application-rbac-workspace.d.ts +62 -0
- package/dist/admin/application-rbac-workspace.d.ts.map +1 -0
- package/dist/admin/application-rbac-workspace.js +344 -0
- package/dist/admin/application-rbac-workspace.js.map +1 -0
- package/dist/admin/application-runtime.d.ts +44 -0
- package/dist/admin/application-runtime.d.ts.map +1 -0
- package/dist/admin/application-runtime.js +183 -0
- package/dist/admin/application-runtime.js.map +1 -0
- package/dist/admin/application-service.d.ts +39 -0
- package/dist/admin/application-service.d.ts.map +1 -0
- package/dist/admin/application-service.js +248 -0
- package/dist/admin/application-service.js.map +1 -0
- package/dist/admin/application-state.d.ts +109 -0
- package/dist/admin/application-state.d.ts.map +1 -0
- package/dist/admin/application-state.js +3 -0
- package/dist/admin/application-state.js.map +1 -0
- package/dist/admin/application-workspace.d.ts +77 -0
- package/dist/admin/application-workspace.d.ts.map +1 -0
- package/dist/admin/application-workspace.js +302 -0
- package/dist/admin/application-workspace.js.map +1 -0
- package/dist/admin/application.d.ts +88 -0
- package/dist/admin/application.d.ts.map +1 -0
- package/dist/admin/application.js +932 -0
- package/dist/admin/application.js.map +1 -0
- package/dist/admin/client-authentication-dialog.d.ts +77 -0
- package/dist/admin/client-authentication-dialog.d.ts.map +1 -0
- package/dist/admin/client-authentication-dialog.js +217 -0
- package/dist/admin/client-authentication-dialog.js.map +1 -0
- package/dist/admin/client-controller.d.ts +58 -0
- package/dist/admin/client-controller.d.ts.map +1 -0
- package/dist/admin/client-controller.js +462 -0
- package/dist/admin/client-controller.js.map +1 -0
- package/dist/admin/client-credential-dialogs.d.ts +36 -0
- package/dist/admin/client-credential-dialogs.d.ts.map +1 -0
- package/dist/admin/client-credential-dialogs.js +145 -0
- package/dist/admin/client-credential-dialogs.js.map +1 -0
- package/dist/admin/client-dialogs.d.ts +64 -0
- package/dist/admin/client-dialogs.d.ts.map +1 -0
- package/dist/admin/client-dialogs.js +110 -0
- package/dist/admin/client-dialogs.js.map +1 -0
- package/dist/admin/client-form-scroller.d.ts +17 -0
- package/dist/admin/client-form-scroller.d.ts.map +1 -0
- package/dist/admin/client-form-scroller.js +67 -0
- package/dist/admin/client-form-scroller.js.map +1 -0
- package/dist/admin/client-registration-dialog.d.ts +27 -0
- package/dist/admin/client-registration-dialog.d.ts.map +1 -0
- package/dist/admin/client-registration-dialog.js +195 -0
- package/dist/admin/client-registration-dialog.js.map +1 -0
- package/dist/admin/client-service.d.ts +41 -0
- package/dist/admin/client-service.d.ts.map +1 -0
- package/dist/admin/client-service.js +484 -0
- package/dist/admin/client-service.js.map +1 -0
- package/dist/admin/client-state.d.ts +157 -0
- package/dist/admin/client-state.d.ts.map +1 -0
- package/dist/admin/client-state.js +3 -0
- package/dist/admin/client-state.js.map +1 -0
- package/dist/admin/client-workspace.d.ts +88 -0
- package/dist/admin/client-workspace.d.ts.map +1 -0
- package/dist/admin/client-workspace.js +484 -0
- package/dist/admin/client-workspace.js.map +1 -0
- package/dist/admin/delete-confirmation-layout.d.ts +38 -0
- package/dist/admin/delete-confirmation-layout.d.ts.map +1 -0
- package/dist/admin/delete-confirmation-layout.js +52 -0
- package/dist/admin/delete-confirmation-layout.js.map +1 -0
- package/dist/admin/index.d.ts +64 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +31 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/organization-controller.d.ts +77 -0
- package/dist/admin/organization-controller.d.ts.map +1 -0
- package/dist/admin/organization-controller.js +472 -0
- package/dist/admin/organization-controller.js.map +1 -0
- package/dist/admin/organization-dialogs.d.ts +63 -0
- package/dist/admin/organization-dialogs.d.ts.map +1 -0
- package/dist/admin/organization-dialogs.js +303 -0
- package/dist/admin/organization-dialogs.js.map +1 -0
- package/dist/admin/organization-service.d.ts +110 -0
- package/dist/admin/organization-service.d.ts.map +1 -0
- package/dist/admin/organization-service.js +548 -0
- package/dist/admin/organization-service.js.map +1 -0
- package/dist/admin/organization-workspace.d.ts +29 -0
- package/dist/admin/organization-workspace.d.ts.map +1 -0
- package/dist/admin/organization-workspace.js +421 -0
- package/dist/admin/organization-workspace.js.map +1 -0
- package/dist/admin/portability-controller.d.ts +83 -0
- package/dist/admin/portability-controller.d.ts.map +1 -0
- package/dist/admin/portability-controller.js +466 -0
- package/dist/admin/portability-controller.js.map +1 -0
- package/dist/admin/portability-service.d.ts +31 -0
- package/dist/admin/portability-service.d.ts.map +1 -0
- package/dist/admin/portability-service.js +51 -0
- package/dist/admin/portability-service.js.map +1 -0
- package/dist/admin/portability-state.d.ts +88 -0
- package/dist/admin/portability-state.d.ts.map +1 -0
- package/dist/admin/portability-state.js +3 -0
- package/dist/admin/portability-state.js.map +1 -0
- package/dist/admin/portability-workspace.d.ts +78 -0
- package/dist/admin/portability-workspace.d.ts.map +1 -0
- package/dist/admin/portability-workspace.js +337 -0
- package/dist/admin/portability-workspace.js.map +1 -0
- package/dist/admin/presentation.d.ts +46 -0
- package/dist/admin/presentation.d.ts.map +1 -0
- package/dist/admin/presentation.js +271 -0
- package/dist/admin/presentation.js.map +1 -0
- package/dist/admin/rbac-dialogs.d.ts +73 -0
- package/dist/admin/rbac-dialogs.d.ts.map +1 -0
- package/dist/admin/rbac-dialogs.js +345 -0
- package/dist/admin/rbac-dialogs.js.map +1 -0
- package/dist/admin/rbac-service.d.ts +47 -0
- package/dist/admin/rbac-service.d.ts.map +1 -0
- package/dist/admin/rbac-service.js +258 -0
- package/dist/admin/rbac-service.js.map +1 -0
- package/dist/admin/rbac-state.d.ts +129 -0
- package/dist/admin/rbac-state.d.ts.map +1 -0
- package/dist/admin/rbac-state.js +136 -0
- package/dist/admin/rbac-state.js.map +1 -0
- package/dist/admin/selectable-read-only-input.d.ts +18 -0
- package/dist/admin/selectable-read-only-input.d.ts.map +1 -0
- package/dist/admin/selectable-read-only-input.js +24 -0
- package/dist/admin/selectable-read-only-input.js.map +1 -0
- package/dist/admin/session-service.d.ts +169 -0
- package/dist/admin/session-service.d.ts.map +1 -0
- package/dist/admin/session-service.js +353 -0
- package/dist/admin/session-service.js.map +1 -0
- package/dist/admin/state.d.ts +301 -0
- package/dist/admin/state.d.ts.map +1 -0
- package/dist/admin/state.js +10 -0
- package/dist/admin/state.js.map +1 -0
- package/dist/admin/system-config-controller.d.ts +58 -0
- package/dist/admin/system-config-controller.d.ts.map +1 -0
- package/dist/admin/system-config-controller.js +218 -0
- package/dist/admin/system-config-controller.js.map +1 -0
- package/dist/admin/system-config-service.d.ts +54 -0
- package/dist/admin/system-config-service.d.ts.map +1 -0
- package/dist/admin/system-config-service.js +180 -0
- package/dist/admin/system-config-service.js.map +1 -0
- package/dist/admin/system-config-state.d.ts +77 -0
- package/dist/admin/system-config-state.d.ts.map +1 -0
- package/dist/admin/system-config-state.js +78 -0
- package/dist/admin/system-config-state.js.map +1 -0
- package/dist/admin/system-config-workspace.d.ts +47 -0
- package/dist/admin/system-config-workspace.d.ts.map +1 -0
- package/dist/admin/system-config-workspace.js +217 -0
- package/dist/admin/system-config-workspace.js.map +1 -0
- package/dist/admin/user-controller-types.d.ts +67 -0
- package/dist/admin/user-controller-types.d.ts.map +1 -0
- package/dist/admin/user-controller-types.js +3 -0
- package/dist/admin/user-controller-types.js.map +1 -0
- package/dist/admin/user-controller.d.ts +6 -0
- package/dist/admin/user-controller.d.ts.map +1 -0
- package/dist/admin/user-controller.js +674 -0
- package/dist/admin/user-controller.js.map +1 -0
- package/dist/admin/user-dialog-fields.d.ts +44 -0
- package/dist/admin/user-dialog-fields.d.ts.map +1 -0
- package/dist/admin/user-dialog-fields.js +130 -0
- package/dist/admin/user-dialog-fields.js.map +1 -0
- package/dist/admin/user-dialogs.d.ts +66 -0
- package/dist/admin/user-dialogs.d.ts.map +1 -0
- package/dist/admin/user-dialogs.js +374 -0
- package/dist/admin/user-dialogs.js.map +1 -0
- package/dist/admin/user-role-controller.d.ts +82 -0
- package/dist/admin/user-role-controller.d.ts.map +1 -0
- package/dist/admin/user-role-controller.js +337 -0
- package/dist/admin/user-role-controller.js.map +1 -0
- package/dist/admin/user-role-dialog.d.ts +94 -0
- package/dist/admin/user-role-dialog.d.ts.map +1 -0
- package/dist/admin/user-role-dialog.js +265 -0
- package/dist/admin/user-role-dialog.js.map +1 -0
- package/dist/admin/user-service-types.d.ts +100 -0
- package/dist/admin/user-service-types.d.ts.map +1 -0
- package/dist/admin/user-service-types.js +3 -0
- package/dist/admin/user-service-types.js.map +1 -0
- package/dist/admin/user-service.d.ts +14 -0
- package/dist/admin/user-service.d.ts.map +1 -0
- package/dist/admin/user-service.js +612 -0
- package/dist/admin/user-service.js.map +1 -0
- package/dist/admin/user-state.d.ts +158 -0
- package/dist/admin/user-state.d.ts.map +1 -0
- package/dist/admin/user-state.js +3 -0
- package/dist/admin/user-state.js.map +1 -0
- package/dist/admin/user-workspace.d.ts +65 -0
- package/dist/admin/user-workspace.d.ts.map +1 -0
- package/dist/admin/user-workspace.js +366 -0
- package/dist/admin/user-workspace.js.map +1 -0
- package/dist/auth/browser-flow.d.ts +27 -1
- package/dist/auth/browser-flow.d.ts.map +1 -1
- package/dist/auth/browser-flow.js +55 -33
- package/dist/auth/browser-flow.js.map +1 -1
- package/dist/auth/callback-server.d.ts.map +1 -1
- package/dist/auth/callback-server.js +5 -9
- package/dist/auth/callback-server.js.map +1 -1
- package/dist/auth/id-token-verifier.d.ts +39 -0
- package/dist/auth/id-token-verifier.d.ts.map +1 -0
- package/dist/auth/id-token-verifier.js +104 -0
- package/dist/auth/id-token-verifier.js.map +1 -0
- package/dist/auth/login-coordinator.d.ts +72 -0
- package/dist/auth/login-coordinator.d.ts.map +1 -0
- package/dist/auth/login-coordinator.js +190 -0
- package/dist/auth/login-coordinator.js.map +1 -0
- package/dist/auth/metadata.d.ts +2 -1
- package/dist/auth/metadata.d.ts.map +1 -1
- package/dist/auth/metadata.js +67 -6
- package/dist/auth/metadata.js.map +1 -1
- package/dist/auth/types.d.ts +14 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/client-factory.d.ts.map +1 -1
- package/dist/client-factory.js +15 -2
- package/dist/client-factory.js.map +1 -1
- package/dist/commands/admin.d.ts +22 -0
- package/dist/commands/admin.d.ts.map +1 -0
- package/dist/commands/admin.js +112 -0
- package/dist/commands/admin.js.map +1 -0
- package/dist/commands/app-claim.d.ts.map +1 -1
- package/dist/commands/app-claim.js +11 -4
- package/dist/commands/app-claim.js.map +1 -1
- package/dist/commands/app-module.d.ts.map +1 -1
- package/dist/commands/app-module.js +61 -12
- package/dist/commands/app-module.js.map +1 -1
- package/dist/commands/app-permission.d.ts.map +1 -1
- package/dist/commands/app-permission.js +66 -24
- package/dist/commands/app-permission.js.map +1 -1
- package/dist/commands/app-role.d.ts.map +1 -1
- package/dist/commands/app-role.js +48 -27
- package/dist/commands/app-role.js.map +1 -1
- package/dist/commands/app.d.ts.map +1 -1
- package/dist/commands/app.js +37 -25
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/bulk.d.ts.map +1 -1
- package/dist/commands/bulk.js +9 -2
- package/dist/commands/bulk.js.map +1 -1
- package/dist/commands/client-secret.d.ts.map +1 -1
- package/dist/commands/client-secret.js +12 -6
- package/dist/commands/client-secret.js.map +1 -1
- package/dist/commands/client.d.ts +3 -2
- package/dist/commands/client.d.ts.map +1 -1
- package/dist/commands/client.js +87 -43
- package/dist/commands/client.js.map +1 -1
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +68 -7
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/export.d.ts +6 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +182 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import.d.ts +6 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +142 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/keys.d.ts.map +1 -1
- package/dist/commands/keys.js +11 -4
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +24 -10
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/org.d.ts +2 -4
- package/dist/commands/org.d.ts.map +1 -1
- package/dist/commands/org.js +16 -76
- package/dist/commands/org.js.map +1 -1
- package/dist/commands/user-role.d.ts.map +1 -1
- package/dist/commands/user-role.js +19 -14
- package/dist/commands/user-role.js.map +1 -1
- package/dist/commands/user.d.ts +3 -2
- package/dist/commands/user.d.ts.map +1 -1
- package/dist/commands/user.js +47 -71
- package/dist/commands/user.js.map +1 -1
- package/dist/commands/version.d.ts +1 -1
- package/dist/commands/version.js +1 -1
- package/dist/credential-lock.d.ts +20 -0
- package/dist/credential-lock.d.ts.map +1 -0
- package/dist/credential-lock.js +130 -0
- package/dist/credential-lock.js.map +1 -0
- package/dist/credential-store.d.ts +14 -0
- package/dist/credential-store.d.ts.map +1 -1
- package/dist/credential-store.js +114 -3
- package/dist/credential-store.js.map +1 -1
- package/dist/error-handler.d.ts.map +1 -1
- package/dist/error-handler.js +2 -0
- package/dist/error-handler.js.map +1 -1
- package/dist/global-options.d.ts +8 -0
- package/dist/global-options.d.ts.map +1 -1
- package/dist/global-options.js +19 -8
- package/dist/global-options.js.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/output.d.ts +11 -0
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +25 -6
- package/dist/output.js.map +1 -1
- package/dist/prompt.d.ts +2 -2
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +27 -7
- package/dist/prompt.js.map +1 -1
- package/package.json +7 -3
- package/dist/commands/gui.d.ts +0 -21
- package/dist/commands/gui.d.ts.map +0 -1
- package/dist/commands/gui.js +0 -67
- package/dist/commands/gui.js.map +0 -1
- package/dist/commands/provision.d.ts +0 -47
- package/dist/commands/provision.d.ts.map +0 -1
- package/dist/commands/provision.js +0 -444
- package/dist/commands/provision.js.map +0 -1
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
/** Operation ownership and local file workflow for terminal manifest portability. */
|
|
2
|
+
import { readFile, stat, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { basename } from 'node:path';
|
|
4
|
+
import { FileDialog, nodeFileSystem, openFile } from '@jsvision/files';
|
|
5
|
+
import { filesEn } from '@jsvision/files/locales/en';
|
|
6
|
+
import { Commands, confirm, createI18n, signal } from '@jsvision/ui';
|
|
7
|
+
import { PortaAuthenticationError } from '@portaidentity/sdk';
|
|
8
|
+
import { showOneTimeClientSecretDialog } from './client-dialogs.js';
|
|
9
|
+
import { createAdminPortabilityWorkspace } from './portability-workspace.js';
|
|
10
|
+
/** Stable command recognized by the portability controller and presentation. */
|
|
11
|
+
export const PORTABILITY_COMMAND = 'portability';
|
|
12
|
+
/** Largest local JSON document read before the server repeats strict validation. */
|
|
13
|
+
const MAX_MANIFEST_BYTES = 64 * 1024 * 1024;
|
|
14
|
+
/** Marker used only to distinguish the fixed local size failure. */
|
|
15
|
+
const MANIFEST_TOO_LARGE = 'MAX_BYTES_EXCEEDED';
|
|
16
|
+
/** Keep Clear and Cancel reachable without changing the application's translation service. */
|
|
17
|
+
const manifestFileI18n = createI18n({
|
|
18
|
+
locale: 'en',
|
|
19
|
+
catalogs: [filesEn, { schema: 1, locale: 'en', messages: { 'files.action.clear': 'C~l~ear' } }],
|
|
20
|
+
});
|
|
21
|
+
/** Result groups in the dependency order used for first-error focus. */
|
|
22
|
+
const ENTITY_ORDER = [
|
|
23
|
+
'organizations',
|
|
24
|
+
'applications',
|
|
25
|
+
'application_modules',
|
|
26
|
+
'roles',
|
|
27
|
+
'permissions',
|
|
28
|
+
'claim_definitions',
|
|
29
|
+
'role_permission_mappings',
|
|
30
|
+
'users',
|
|
31
|
+
'user_role_assignments',
|
|
32
|
+
'user_claim_values',
|
|
33
|
+
'clients',
|
|
34
|
+
];
|
|
35
|
+
/** Returns whether all portability capability fields came from live verified booleans. */
|
|
36
|
+
function portabilityCapabilities(state) {
|
|
37
|
+
if (state.kind !== 'authenticated')
|
|
38
|
+
return undefined;
|
|
39
|
+
const capabilities = state.capabilities;
|
|
40
|
+
if (typeof capabilities.canExportData !== 'boolean' ||
|
|
41
|
+
typeof capabilities.canImportData !== 'boolean' ||
|
|
42
|
+
typeof capabilities.isSuperAdmin !== 'boolean') {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
canExportData: capabilities.canExportData,
|
|
47
|
+
canImportData: capabilities.canImportData,
|
|
48
|
+
isSuperAdmin: capabilities.isSuperAdmin,
|
|
49
|
+
canReadOrganizations: capabilities.canReadOrganizations ?? false,
|
|
50
|
+
canReadApplications: capabilities.canReadApplications ?? false,
|
|
51
|
+
canReadRoles: capabilities.canReadRoles ?? false,
|
|
52
|
+
canReadPermissions: capabilities.canReadPermissions ?? false,
|
|
53
|
+
canReadClaims: capabilities.canReadClaims ?? false,
|
|
54
|
+
canReadUsers: capabilities.canReadUsers ?? false,
|
|
55
|
+
canReadClients: capabilities.canReadClients ?? false,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Creates the default categories without enabling the optional client section. */
|
|
59
|
+
function initialExportSelection(state, capabilities) {
|
|
60
|
+
const categories = [];
|
|
61
|
+
if (capabilities.canReadOrganizations)
|
|
62
|
+
categories.push('organizations');
|
|
63
|
+
if (capabilities.canReadApplications &&
|
|
64
|
+
capabilities.canReadRoles &&
|
|
65
|
+
capabilities.canReadPermissions &&
|
|
66
|
+
capabilities.canReadClaims) {
|
|
67
|
+
categories.push('applications_authorization');
|
|
68
|
+
}
|
|
69
|
+
if (capabilities.canReadUsers && capabilities.canReadRoles && capabilities.canReadClaims) {
|
|
70
|
+
categories.push('users_assignments');
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
...(state.organization && !state.organization.isSuperAdmin
|
|
74
|
+
? { scope: { kind: 'organization', organization_slug: state.organization.slug } }
|
|
75
|
+
: capabilities.isSuperAdmin
|
|
76
|
+
? { scope: { kind: 'environment' } }
|
|
77
|
+
: {}),
|
|
78
|
+
categories,
|
|
79
|
+
applications: { kind: 'all' },
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Opens one seeded save-mode JSVision file dialog. */
|
|
83
|
+
async function saveManifestPath(host, filename) {
|
|
84
|
+
const dialog = new FileDialog({
|
|
85
|
+
fs: nodeFileSystem,
|
|
86
|
+
directory: signal(nodeFileSystem.resolve('.')),
|
|
87
|
+
wildcard: signal('*.json'),
|
|
88
|
+
filename: signal(filename),
|
|
89
|
+
save: true,
|
|
90
|
+
title: 'Save manifest',
|
|
91
|
+
i18n: manifestFileI18n,
|
|
92
|
+
});
|
|
93
|
+
host.desktop.addWindow(dialog);
|
|
94
|
+
try {
|
|
95
|
+
return (await host.loop.execView(dialog)) === Commands.ok ? dialog.result() : null;
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
host.desktop.removeWindow(dialog);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Reads one bounded UTF-8 file using the same direct policy as the conventional CLI. */
|
|
102
|
+
async function readBoundedUtf8(path, maximumBytes) {
|
|
103
|
+
const size = (await stat(path)).size;
|
|
104
|
+
if (size > maximumBytes)
|
|
105
|
+
throw new Error(MANIFEST_TOO_LARGE);
|
|
106
|
+
const content = await readFile(path, 'utf8');
|
|
107
|
+
if (Buffer.byteLength(content, 'utf8') > maximumBytes)
|
|
108
|
+
throw new Error(MANIFEST_TOO_LARGE);
|
|
109
|
+
return content;
|
|
110
|
+
}
|
|
111
|
+
/** Parses JSON while keeping the server as the single strict manifest validator. */
|
|
112
|
+
function parseManifest(content) {
|
|
113
|
+
const parsed = JSON.parse(content);
|
|
114
|
+
return parsed;
|
|
115
|
+
}
|
|
116
|
+
/** Returns the first rejected group in dependency order. */
|
|
117
|
+
function firstErrorEntity(errors) {
|
|
118
|
+
return ENTITY_ORDER.find((entity) => errors.some((error) => error.entity_type === entity));
|
|
119
|
+
}
|
|
120
|
+
/** Removes one-time credentials before an apply result enters reusable view state. */
|
|
121
|
+
function reusableApplyResult(result) {
|
|
122
|
+
const { credentials: _credentials, ...reusable } = result;
|
|
123
|
+
return reusable;
|
|
124
|
+
}
|
|
125
|
+
/** Creates direct controller ownership for one maximized portability workspace. */
|
|
126
|
+
export function createAdminPortabilityController(options) {
|
|
127
|
+
const workspaceFactory = options.workspaceFactory ?? createAdminPortabilityWorkspace;
|
|
128
|
+
const dialogs = {
|
|
129
|
+
chooseManifest: () => openFile({ ...options.host, i18n: manifestFileI18n }, { wildcard: '*.json', title: 'Choose manifest' }),
|
|
130
|
+
saveManifest: (filename) => saveManifestPath(options.host, filename),
|
|
131
|
+
confirmApply: () => confirm(options.host, 'Are you sure?'),
|
|
132
|
+
showOneTimeClientSecret: (operationSignal, value) => showOneTimeClientSecretDialog(options.host, operationSignal, value),
|
|
133
|
+
...options.dialogs,
|
|
134
|
+
};
|
|
135
|
+
const files = {
|
|
136
|
+
readUtf8: readBoundedUtf8,
|
|
137
|
+
writeUtf8: async (path, content) => writeFile(path, content, 'utf8'),
|
|
138
|
+
...options.files,
|
|
139
|
+
};
|
|
140
|
+
let generation = 0;
|
|
141
|
+
let contextKey;
|
|
142
|
+
let workspace;
|
|
143
|
+
let operation;
|
|
144
|
+
let opening = false;
|
|
145
|
+
let disposed = false;
|
|
146
|
+
let selectedManifest;
|
|
147
|
+
let importMode = 'keep-existing';
|
|
148
|
+
let preview;
|
|
149
|
+
let applied;
|
|
150
|
+
let exportSelection;
|
|
151
|
+
let pending;
|
|
152
|
+
let feedback;
|
|
153
|
+
/** Publishes only reusable state and never a parsed manifest or plaintext credential. */
|
|
154
|
+
const publish = () => {
|
|
155
|
+
if (!workspace)
|
|
156
|
+
return;
|
|
157
|
+
const next = {
|
|
158
|
+
kind: 'ready',
|
|
159
|
+
...(exportSelection ? { exportSelection } : {}),
|
|
160
|
+
...(selectedManifest
|
|
161
|
+
? { importSelection: { filename: selectedManifest.filename, mode: importMode } }
|
|
162
|
+
: {}),
|
|
163
|
+
...(preview
|
|
164
|
+
? { preview, errors: preview.errors, focusedEntity: firstErrorEntity(preview.errors) }
|
|
165
|
+
: {}),
|
|
166
|
+
...(applied ? { applied } : {}),
|
|
167
|
+
...(pending ? { pending } : {}),
|
|
168
|
+
...(feedback ? { feedback } : {}),
|
|
169
|
+
};
|
|
170
|
+
workspace.setState(next);
|
|
171
|
+
workspace.focusCurrent();
|
|
172
|
+
};
|
|
173
|
+
/** Returns whether a continuation still owns the current mounted workspace. */
|
|
174
|
+
const owns = (owner) => !disposed && workspace !== undefined && owner.generation === generation;
|
|
175
|
+
/** Starts one locally cancellable operation and invalidates any older continuation. */
|
|
176
|
+
const begin = (kind) => {
|
|
177
|
+
operation?.abort();
|
|
178
|
+
operation = new AbortController();
|
|
179
|
+
generation += 1;
|
|
180
|
+
pending = kind;
|
|
181
|
+
feedback = undefined;
|
|
182
|
+
publish();
|
|
183
|
+
return { generation, signal: operation.signal };
|
|
184
|
+
};
|
|
185
|
+
/** Finishes one still-owned operation and publishes its final state. */
|
|
186
|
+
const finish = (owner) => {
|
|
187
|
+
if (!owns(owner))
|
|
188
|
+
return false;
|
|
189
|
+
pending = undefined;
|
|
190
|
+
operation = undefined;
|
|
191
|
+
publish();
|
|
192
|
+
return true;
|
|
193
|
+
};
|
|
194
|
+
/** Closes the workspace and aborts only local result ownership. */
|
|
195
|
+
const close = () => {
|
|
196
|
+
generation += 1;
|
|
197
|
+
opening = false;
|
|
198
|
+
operation?.abort();
|
|
199
|
+
operation = undefined;
|
|
200
|
+
pending = undefined;
|
|
201
|
+
selectedManifest = undefined;
|
|
202
|
+
preview = undefined;
|
|
203
|
+
applied = undefined;
|
|
204
|
+
feedback = undefined;
|
|
205
|
+
workspace?.clear?.();
|
|
206
|
+
workspace = undefined;
|
|
207
|
+
options.mountWorkspace(null);
|
|
208
|
+
};
|
|
209
|
+
/** Converts an SDK failure into fixed feedback or the existing authentication recovery flow. */
|
|
210
|
+
const fail = (owner, error, operationFeedback) => {
|
|
211
|
+
if (!owns(owner))
|
|
212
|
+
return;
|
|
213
|
+
pending = undefined;
|
|
214
|
+
operation = undefined;
|
|
215
|
+
if (error instanceof PortaAuthenticationError) {
|
|
216
|
+
close();
|
|
217
|
+
options.requestAuthentication?.();
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
feedback = operationFeedback;
|
|
221
|
+
publish();
|
|
222
|
+
};
|
|
223
|
+
/** Performs server export before asking where to save its audited response. */
|
|
224
|
+
const exportManifest = async (request) => {
|
|
225
|
+
const operations = options.readOperations();
|
|
226
|
+
if (!operations)
|
|
227
|
+
return;
|
|
228
|
+
exportSelection = {
|
|
229
|
+
scope: request.scope,
|
|
230
|
+
categories: request.categories,
|
|
231
|
+
applications: request.application_selection.all_applications
|
|
232
|
+
? { kind: 'all' }
|
|
233
|
+
: { kind: 'selected', slugs: request.application_selection.application_slugs },
|
|
234
|
+
};
|
|
235
|
+
const owner = begin('export');
|
|
236
|
+
try {
|
|
237
|
+
const response = await operations.exportManifest(request, owner.signal);
|
|
238
|
+
if (!owns(owner))
|
|
239
|
+
return;
|
|
240
|
+
const path = await dialogs.saveManifest(response.filename);
|
|
241
|
+
if (!owns(owner))
|
|
242
|
+
return;
|
|
243
|
+
if (!path) {
|
|
244
|
+
finish(owner);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
try {
|
|
248
|
+
await files.writeUtf8(path, `${JSON.stringify(response.manifest, null, 2)}\n`);
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
if (!owns(owner))
|
|
252
|
+
return;
|
|
253
|
+
pending = undefined;
|
|
254
|
+
operation = undefined;
|
|
255
|
+
feedback = 'Could not save the export file.';
|
|
256
|
+
publish();
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
finish(owner);
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
fail(owner, error, 'Export is unavailable.');
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
/** Chooses and parses one local manifest without calling the server. */
|
|
266
|
+
const chooseManifest = async () => {
|
|
267
|
+
const owner = begin('choose-manifest');
|
|
268
|
+
try {
|
|
269
|
+
const path = await dialogs.chooseManifest();
|
|
270
|
+
if (!owns(owner))
|
|
271
|
+
return;
|
|
272
|
+
if (!path) {
|
|
273
|
+
finish(owner);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
try {
|
|
277
|
+
const content = await files.readUtf8(path, MAX_MANIFEST_BYTES);
|
|
278
|
+
if (!owns(owner))
|
|
279
|
+
return;
|
|
280
|
+
selectedManifest = { filename: basename(path), value: parseManifest(content) };
|
|
281
|
+
preview = undefined;
|
|
282
|
+
applied = undefined;
|
|
283
|
+
feedback = undefined;
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
if (!owns(owner))
|
|
287
|
+
return;
|
|
288
|
+
selectedManifest = undefined;
|
|
289
|
+
preview = undefined;
|
|
290
|
+
applied = undefined;
|
|
291
|
+
feedback =
|
|
292
|
+
error instanceof Error && error.message === MANIFEST_TOO_LARGE
|
|
293
|
+
? 'The manifest file is too large.'
|
|
294
|
+
: error instanceof SyntaxError
|
|
295
|
+
? 'Invalid manifest.'
|
|
296
|
+
: 'Could not read the manifest file.';
|
|
297
|
+
}
|
|
298
|
+
finish(owner);
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
fail(owner, error, 'Could not read the manifest file.');
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
/** Builds a fresh preview for the exact selected file and mode. */
|
|
305
|
+
const previewManifest = async (mode) => {
|
|
306
|
+
const operations = options.readOperations();
|
|
307
|
+
const selected = selectedManifest;
|
|
308
|
+
if (!operations || !selected)
|
|
309
|
+
return;
|
|
310
|
+
importMode = mode;
|
|
311
|
+
preview = undefined;
|
|
312
|
+
applied = undefined;
|
|
313
|
+
const owner = begin('preview');
|
|
314
|
+
try {
|
|
315
|
+
preview = await operations.preview(selected.value, owner.signal);
|
|
316
|
+
finish(owner);
|
|
317
|
+
}
|
|
318
|
+
catch (error) {
|
|
319
|
+
fail(owner, error, 'Preview is unavailable.');
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
/** Confirms and applies the current successful preview exactly once. */
|
|
323
|
+
const applyManifest = async (mode) => {
|
|
324
|
+
const operations = options.readOperations();
|
|
325
|
+
const selected = selectedManifest;
|
|
326
|
+
if (!operations || !selected || !preview || preview.errors.length > 0 || mode !== importMode)
|
|
327
|
+
return;
|
|
328
|
+
const owner = begin('apply');
|
|
329
|
+
try {
|
|
330
|
+
const confirmed = await dialogs.confirmApply();
|
|
331
|
+
if (!owns(owner))
|
|
332
|
+
return;
|
|
333
|
+
if (!confirmed ||
|
|
334
|
+
selectedManifest !== selected ||
|
|
335
|
+
!preview ||
|
|
336
|
+
preview.errors.length > 0 ||
|
|
337
|
+
mode !== importMode) {
|
|
338
|
+
finish(owner);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
const result = await operations.apply(selected.value, mode, owner.signal);
|
|
342
|
+
if (!owns(owner))
|
|
343
|
+
return;
|
|
344
|
+
applied = reusableApplyResult(result);
|
|
345
|
+
preview = undefined;
|
|
346
|
+
for (const credential of result.credentials ?? []) {
|
|
347
|
+
await dialogs.showOneTimeClientSecret(owner.signal, {
|
|
348
|
+
clientName: credential.client_id,
|
|
349
|
+
clientId: credential.client_id,
|
|
350
|
+
label: credential.label,
|
|
351
|
+
plaintext: credential.secret,
|
|
352
|
+
expiresAt: credential.expires_at,
|
|
353
|
+
});
|
|
354
|
+
if (!owns(owner))
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
finish(owner);
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
fail(owner, error, 'Apply is unavailable.');
|
|
361
|
+
}
|
|
362
|
+
};
|
|
363
|
+
/** Dispatches one view intent without exposing asynchronous work to the workspace. */
|
|
364
|
+
const handleIntent = (intent) => {
|
|
365
|
+
switch (intent.kind) {
|
|
366
|
+
case 'export':
|
|
367
|
+
void exportManifest(intent.request);
|
|
368
|
+
return;
|
|
369
|
+
case 'choose-manifest':
|
|
370
|
+
void chooseManifest();
|
|
371
|
+
return;
|
|
372
|
+
case 'set-import-mode':
|
|
373
|
+
importMode = intent.mode;
|
|
374
|
+
preview = undefined;
|
|
375
|
+
applied = undefined;
|
|
376
|
+
publish();
|
|
377
|
+
return;
|
|
378
|
+
case 'preview':
|
|
379
|
+
void previewManifest(intent.mode ?? importMode);
|
|
380
|
+
return;
|
|
381
|
+
case 'apply':
|
|
382
|
+
void applyManifest(intent.mode ?? importMode);
|
|
383
|
+
return;
|
|
384
|
+
case 'close':
|
|
385
|
+
close();
|
|
386
|
+
options.onWorkspaceClosed?.();
|
|
387
|
+
return;
|
|
388
|
+
case 'set-export-scope':
|
|
389
|
+
case 'set-export-category':
|
|
390
|
+
case 'set-all-applications':
|
|
391
|
+
case 'set-application':
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
/** Opens one workspace after reusing the existing application list operation when available. */
|
|
396
|
+
const openWorkspace = async (state, capabilities) => {
|
|
397
|
+
if (disposed || opening || workspace)
|
|
398
|
+
return;
|
|
399
|
+
const openGeneration = generation;
|
|
400
|
+
opening = true;
|
|
401
|
+
options.onWorkspaceOpened?.();
|
|
402
|
+
let applications = [];
|
|
403
|
+
const applicationOperations = options.readApplicationOperations?.();
|
|
404
|
+
if (applicationOperations && capabilities.canReadApplications) {
|
|
405
|
+
const result = await applicationOperations.listAll();
|
|
406
|
+
if (result.kind === 'success')
|
|
407
|
+
applications = result.value;
|
|
408
|
+
}
|
|
409
|
+
if (disposed || !opening || workspace || generation !== openGeneration)
|
|
410
|
+
return;
|
|
411
|
+
exportSelection = initialExportSelection(state, capabilities);
|
|
412
|
+
workspace = workspaceFactory({
|
|
413
|
+
capabilities,
|
|
414
|
+
...(state.organization ? { organization: state.organization } : {}),
|
|
415
|
+
applications,
|
|
416
|
+
onIntent: handleIntent,
|
|
417
|
+
focusView: (view) => options.host.loop.focusView(view),
|
|
418
|
+
onClose: () => {
|
|
419
|
+
close();
|
|
420
|
+
options.onWorkspaceClosed?.();
|
|
421
|
+
},
|
|
422
|
+
});
|
|
423
|
+
opening = false;
|
|
424
|
+
options.mountWorkspace(workspace.content);
|
|
425
|
+
publish();
|
|
426
|
+
};
|
|
427
|
+
return {
|
|
428
|
+
syncContext(state, sessionEpoch) {
|
|
429
|
+
const nextKey = state.kind === 'authenticated'
|
|
430
|
+
? `${sessionEpoch}:${state.organization?.id ?? 'environment'}`
|
|
431
|
+
: undefined;
|
|
432
|
+
if (nextKey === contextKey)
|
|
433
|
+
return;
|
|
434
|
+
if (workspace || contextKey !== undefined)
|
|
435
|
+
close();
|
|
436
|
+
contextKey = nextKey;
|
|
437
|
+
},
|
|
438
|
+
handleCommand(command) {
|
|
439
|
+
if (command !== PORTABILITY_COMMAND)
|
|
440
|
+
return false;
|
|
441
|
+
const state = options.readState();
|
|
442
|
+
const capabilities = portabilityCapabilities(state);
|
|
443
|
+
if (disposed ||
|
|
444
|
+
opening ||
|
|
445
|
+
workspace ||
|
|
446
|
+
state.kind !== 'authenticated' ||
|
|
447
|
+
!capabilities ||
|
|
448
|
+
(!capabilities.canExportData && !capabilities.canImportData) ||
|
|
449
|
+
!options.readOperations()) {
|
|
450
|
+
return true;
|
|
451
|
+
}
|
|
452
|
+
void openWorkspace(state, capabilities);
|
|
453
|
+
return true;
|
|
454
|
+
},
|
|
455
|
+
handleIntent,
|
|
456
|
+
isOpen: () => opening || workspace !== undefined,
|
|
457
|
+
cancelActiveOperation: close,
|
|
458
|
+
dispose() {
|
|
459
|
+
if (disposed)
|
|
460
|
+
return;
|
|
461
|
+
close();
|
|
462
|
+
disposed = true;
|
|
463
|
+
},
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
//# sourceMappingURL=portability-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portability-controller.js","sourceRoot":"","sources":["../../src/admin/portability-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Thin SDK operation adapter for terminal portability controllers. */
|
|
2
|
+
import type { ExportManifestRequest, ExportManifestResponse, ExportsDomain, ImportsDomain, PortabilityApplyResult, PortabilityManifest, PortabilityPreviewResult } from '@portaidentity/sdk';
|
|
3
|
+
import type { AdminPortabilityImportMode } from './portability-state.js';
|
|
4
|
+
/** UI-neutral portability calls owned by an authenticated administration session. */
|
|
5
|
+
export interface AdminPortabilityOperations {
|
|
6
|
+
/** Exports one manifest without choosing or writing a local file. */
|
|
7
|
+
readonly exportManifest: (request: ExportManifestRequest, signal?: AbortSignal) => Promise<ExportManifestResponse>;
|
|
8
|
+
/** Builds one mutation-free import preview. */
|
|
9
|
+
readonly preview: (manifest: PortabilityManifest, signal?: AbortSignal) => Promise<PortabilityPreviewResult>;
|
|
10
|
+
/** Applies a previously previewed manifest exactly once. */
|
|
11
|
+
readonly apply: (manifest: PortabilityManifest, mode: AdminPortabilityImportMode, signal?: AbortSignal) => Promise<PortabilityApplyResult>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Creates direct portability operations over the existing SDK domains.
|
|
15
|
+
*
|
|
16
|
+
* The signal controls only whether this UI still owns a result. The SDK request may already have
|
|
17
|
+
* reached Porta, so aborting locally never claims that a server-side apply was cancelled.
|
|
18
|
+
*
|
|
19
|
+
* @param exportsDomain - Returns the SDK manifest export operation for the verified session.
|
|
20
|
+
* @param importsDomain - Returns the SDK preview and apply operations for the verified session.
|
|
21
|
+
* @returns Three direct, non-retrying operations for the Admin UI controller.
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* const operations = createAdminPortabilityOperations(
|
|
25
|
+
* () => client.exports,
|
|
26
|
+
* () => client.imports,
|
|
27
|
+
* );
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function createAdminPortabilityOperations(exportsDomain: () => Pick<ExportsDomain, 'manifest'>, importsDomain: () => Pick<ImportsDomain, 'preview' | 'apply'>): AdminPortabilityOperations;
|
|
31
|
+
//# sourceMappingURL=portability-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portability-service.d.ts","sourceRoot":"","sources":["../../src/admin/portability-service.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEzE,qFAAqF;AACrF,MAAM,WAAW,0BAA0B;IACzC,qEAAqE;IACrE,QAAQ,CAAC,cAAc,EAAE,CACvB,OAAO,EAAE,qBAAqB,EAC9B,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACrC,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,CAChB,QAAQ,EAAE,mBAAmB,EAC7B,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACvC,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,CACd,QAAQ,EAAE,mBAAmB,EAC7B,IAAI,EAAE,0BAA0B,EAChC,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACtC;AAOD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gCAAgC,CAC9C,aAAa,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,EACpD,aAAa,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,OAAO,CAAC,GAC5D,0BAA0B,CA2B5B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** Thin SDK operation adapter for terminal portability controllers. */
|
|
2
|
+
/** Throws the platform AbortError when local operation ownership has ended. */
|
|
3
|
+
function rejectReleasedOwnership(signal) {
|
|
4
|
+
signal?.throwIfAborted();
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Creates direct portability operations over the existing SDK domains.
|
|
8
|
+
*
|
|
9
|
+
* The signal controls only whether this UI still owns a result. The SDK request may already have
|
|
10
|
+
* reached Porta, so aborting locally never claims that a server-side apply was cancelled.
|
|
11
|
+
*
|
|
12
|
+
* @param exportsDomain - Returns the SDK manifest export operation for the verified session.
|
|
13
|
+
* @param importsDomain - Returns the SDK preview and apply operations for the verified session.
|
|
14
|
+
* @returns Three direct, non-retrying operations for the Admin UI controller.
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const operations = createAdminPortabilityOperations(
|
|
18
|
+
* () => client.exports,
|
|
19
|
+
* () => client.imports,
|
|
20
|
+
* );
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function createAdminPortabilityOperations(exportsDomain, importsDomain) {
|
|
24
|
+
return {
|
|
25
|
+
async exportManifest(request, signal) {
|
|
26
|
+
rejectReleasedOwnership(signal);
|
|
27
|
+
const response = await exportsDomain().manifest(request);
|
|
28
|
+
rejectReleasedOwnership(signal);
|
|
29
|
+
return response;
|
|
30
|
+
},
|
|
31
|
+
async preview(manifest, signal) {
|
|
32
|
+
rejectReleasedOwnership(signal);
|
|
33
|
+
const result = await importsDomain().preview(manifest);
|
|
34
|
+
rejectReleasedOwnership(signal);
|
|
35
|
+
if (result.mode !== 'dry-run') {
|
|
36
|
+
throw new TypeError('Portability preview returned an unexpected result mode.');
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
},
|
|
40
|
+
async apply(manifest, mode, signal) {
|
|
41
|
+
rejectReleasedOwnership(signal);
|
|
42
|
+
const result = await importsDomain().apply(manifest, mode);
|
|
43
|
+
rejectReleasedOwnership(signal);
|
|
44
|
+
if (result.mode === 'dry-run') {
|
|
45
|
+
throw new TypeError('Portability apply returned an unexpected result mode.');
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=portability-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portability-service.js","sourceRoot":"","sources":["../../src/admin/portability-service.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAkCvE,+EAA+E;AAC/E,SAAS,uBAAuB,CAAC,MAA+B;IAC9D,MAAM,EAAE,cAAc,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,gCAAgC,CAC9C,aAAoD,EACpD,aAA6D;IAE7D,OAAO;QACL,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM;YAClC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACzD,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAChC,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM;YAC5B,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACvD,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,IAAI,SAAS,CAAC,yDAAyD,CAAC,CAAC;YACjF,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM;YAChC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC3D,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
|