@portaidentity/cli 1.7.3 → 1.9.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 +18 -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 +486 -0
- package/dist/admin/client-service.js.map +1 -0
- package/dist/admin/client-state.d.ts +159 -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 +491 -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 +102 -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,62 @@
|
|
|
1
|
+
/** Direct DataGrid pages for Application role and permission administration. */
|
|
2
|
+
import { Group } from '@jsvision/ui';
|
|
3
|
+
import type { View } from '@jsvision/ui';
|
|
4
|
+
import type { AdminApplication, AdminApplicationModule } from './application-state.js';
|
|
5
|
+
import type { AdminApplicationRbacViewState, AdminPermission } from './rbac-state.js';
|
|
6
|
+
import type { AdminCapabilities } from './state.js';
|
|
7
|
+
/** Closed set of role and permission intents emitted by the two Application pages. */
|
|
8
|
+
export type AdminApplicationRbacIntent = {
|
|
9
|
+
readonly kind: 'add-role';
|
|
10
|
+
} | {
|
|
11
|
+
readonly kind: 'edit-role';
|
|
12
|
+
readonly roleId: string;
|
|
13
|
+
} | {
|
|
14
|
+
readonly kind: 'delete-role';
|
|
15
|
+
readonly roleId: string;
|
|
16
|
+
} | {
|
|
17
|
+
readonly kind: 'manage-role-permissions';
|
|
18
|
+
readonly roleId: string;
|
|
19
|
+
} | {
|
|
20
|
+
readonly kind: 'add-permission';
|
|
21
|
+
} | {
|
|
22
|
+
readonly kind: 'edit-permission';
|
|
23
|
+
readonly permissionId: string;
|
|
24
|
+
} | {
|
|
25
|
+
readonly kind: 'delete-permission';
|
|
26
|
+
readonly permissionId: string;
|
|
27
|
+
} | {
|
|
28
|
+
readonly kind: 'reload';
|
|
29
|
+
};
|
|
30
|
+
/** Construction inputs for the two Application RBAC pages. */
|
|
31
|
+
export interface AdminApplicationRbacWorkspaceOptions {
|
|
32
|
+
/** Selected immutable Application owner. */
|
|
33
|
+
readonly application: AdminApplication;
|
|
34
|
+
/** Complete module catalog used to render permission scope. */
|
|
35
|
+
readonly modules: readonly AdminApplicationModule[];
|
|
36
|
+
/** Exact capabilities from the current verified session. */
|
|
37
|
+
readonly capabilities: AdminCapabilities;
|
|
38
|
+
/** Receives one explicit user intent. */
|
|
39
|
+
readonly onIntent: (intent: AdminApplicationRbacIntent) => void;
|
|
40
|
+
/** Restores keyboard focus after the parent mounts or repaints a page. */
|
|
41
|
+
readonly focusView?: (view: View) => void;
|
|
42
|
+
}
|
|
43
|
+
/** Mounted pair of Application RBAC pages. */
|
|
44
|
+
export interface AdminApplicationRbacWorkspace {
|
|
45
|
+
/** Direct Roles tab content. */
|
|
46
|
+
readonly roles: Group;
|
|
47
|
+
/** Direct Permissions tab content. */
|
|
48
|
+
readonly permissions: Group;
|
|
49
|
+
/** Replaces both pages from one immutable controller state. */
|
|
50
|
+
readonly setState: (state: AdminApplicationRbacViewState) => void;
|
|
51
|
+
/** Focuses the most relevant control on the active page. */
|
|
52
|
+
readonly focusCurrent: (page: 'roles' | 'permissions') => void;
|
|
53
|
+
/** Clears both pages without disposing their owner. */
|
|
54
|
+
readonly clear: () => void;
|
|
55
|
+
/** Releases retained rows and prevents later publication. */
|
|
56
|
+
readonly dispose: () => void;
|
|
57
|
+
}
|
|
58
|
+
/** Returns whether a permission is one of the immutable built-ins in the canonical Application. */
|
|
59
|
+
export declare function isCanonicalPermission(application: AdminApplication, permission: AdminPermission | undefined): boolean;
|
|
60
|
+
/** Creates both direct RBAC pages without introducing a reusable CRUD framework. */
|
|
61
|
+
export declare function createAdminApplicationRbacWorkspace(options: AdminApplicationRbacWorkspaceOptions): AdminApplicationRbacWorkspace;
|
|
62
|
+
//# sourceMappingURL=application-rbac-workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application-rbac-workspace.d.ts","sourceRoot":"","sources":["../../src/admin/application-rbac-workspace.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAQL,KAAK,EAON,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAA6B,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,KAAK,EAAE,6BAA6B,EAAE,eAAe,EAAa,MAAM,iBAAiB,CAAC;AACjG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,sFAAsF;AACtF,MAAM,MAAM,0BAA0B,GAClC;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GACnC;IAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEhC,8DAA8D;AAC9D,MAAM,WAAW,oCAAoC;IACnD,4CAA4C;IAC5C,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;IACvC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACpD,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAChE,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CAC3C;AAED,8CAA8C;AAC9C,MAAM,WAAW,6BAA6B;IAC5C,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,sCAAsC;IACtC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,IAAI,CAAC;IAClE,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,KAAK,IAAI,CAAC;IAC/D,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAuHD,mGAAmG;AACnG,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,gBAAgB,EAC7B,UAAU,EAAE,eAAe,GAAG,SAAS,GACtC,OAAO,CAMT;AAmCD,oFAAoF;AACpF,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,oCAAoC,GAC5C,6BAA6B,CAyN/B"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/** Direct DataGrid pages for Application role and permission administration. */
|
|
2
|
+
import { Button, col, cover, createRoot, DataGrid, effect, fixed, Group, grow, row, signal, sortRows, spacer, Text, } from '@jsvision/ui';
|
|
3
|
+
import { formatAdminDateTime } from './admin-date-time.js';
|
|
4
|
+
const ROLE_COLUMNS = [
|
|
5
|
+
{ title: 'Name', accessor: (role) => role.name, width: '1fr', minWidth: 18 },
|
|
6
|
+
{ title: 'Slug', accessor: (role) => role.slug, width: '1fr', minWidth: 18 },
|
|
7
|
+
{
|
|
8
|
+
title: 'Description',
|
|
9
|
+
accessor: (role) => role.description ?? '',
|
|
10
|
+
width: '1fr',
|
|
11
|
+
minWidth: 20,
|
|
12
|
+
},
|
|
13
|
+
{ title: 'Created', accessor: (role) => formatAdminDateTime(role.createdAt), width: 18 },
|
|
14
|
+
{ title: 'Updated', accessor: (role) => formatAdminDateTime(role.updatedAt), width: 18 },
|
|
15
|
+
];
|
|
16
|
+
/** Returns columns whose scope accessor resolves through the selected Application modules. */
|
|
17
|
+
function permissionColumns(modules) {
|
|
18
|
+
const moduleNames = new Map(modules.map((module) => [module.id, module.name]));
|
|
19
|
+
return [
|
|
20
|
+
{ title: 'Name', accessor: (permission) => permission.name, width: '1fr', minWidth: 18 },
|
|
21
|
+
{ title: 'Slug', accessor: (permission) => permission.slug, width: '1fr', minWidth: 20 },
|
|
22
|
+
{
|
|
23
|
+
title: 'Scope',
|
|
24
|
+
accessor: (permission) => permission.moduleId
|
|
25
|
+
? (moduleNames.get(permission.moduleId) ?? permission.moduleId)
|
|
26
|
+
: 'Application',
|
|
27
|
+
width: 18,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
title: 'Created',
|
|
31
|
+
accessor: (permission) => formatAdminDateTime(permission.createdAt),
|
|
32
|
+
width: 18,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
title: 'Description',
|
|
36
|
+
accessor: (permission) => permission.description ?? '',
|
|
37
|
+
width: '1fr',
|
|
38
|
+
minWidth: 20,
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
/** Fixed canonical role slugs seeded in the Porta Admin Application. */
|
|
43
|
+
const CANONICAL_ROLE_SLUGS = new Set([
|
|
44
|
+
'porta-admin',
|
|
45
|
+
'porta-super-admin',
|
|
46
|
+
'porta-org-admin',
|
|
47
|
+
'porta-user-admin',
|
|
48
|
+
'porta-app-admin',
|
|
49
|
+
'porta-auditor',
|
|
50
|
+
]);
|
|
51
|
+
/** Exact built-in permission slugs seeded in the canonical Porta Admin Application. */
|
|
52
|
+
const CANONICAL_PERMISSION_SLUGS = new Set([
|
|
53
|
+
'admin:org:create',
|
|
54
|
+
'admin:org:read',
|
|
55
|
+
'admin:org:update',
|
|
56
|
+
'admin:org:suspend',
|
|
57
|
+
'admin:org:delete',
|
|
58
|
+
'admin:app:create',
|
|
59
|
+
'admin:app:read',
|
|
60
|
+
'admin:app:update',
|
|
61
|
+
'admin:app:delete',
|
|
62
|
+
'admin:module:delete',
|
|
63
|
+
'admin:client:create',
|
|
64
|
+
'admin:client:read',
|
|
65
|
+
'admin:client:update',
|
|
66
|
+
'admin:client:revoke',
|
|
67
|
+
'admin:client:delete',
|
|
68
|
+
'admin:user:create',
|
|
69
|
+
'admin:user:read',
|
|
70
|
+
'admin:user:update',
|
|
71
|
+
'admin:user:lifecycle',
|
|
72
|
+
'admin:user:delete',
|
|
73
|
+
'admin:user:invite',
|
|
74
|
+
'admin:user:2fa',
|
|
75
|
+
'admin:role:create',
|
|
76
|
+
'admin:role:read',
|
|
77
|
+
'admin:role:update',
|
|
78
|
+
'admin:role:delete',
|
|
79
|
+
'admin:role:assign',
|
|
80
|
+
'admin:permission:create',
|
|
81
|
+
'admin:permission:read',
|
|
82
|
+
'admin:permission:update',
|
|
83
|
+
'admin:permission:delete',
|
|
84
|
+
'admin:claim:create',
|
|
85
|
+
'admin:claim:read',
|
|
86
|
+
'admin:claim:update',
|
|
87
|
+
'admin:claim:delete',
|
|
88
|
+
'admin:config:read',
|
|
89
|
+
'admin:config:update',
|
|
90
|
+
'admin:key:read',
|
|
91
|
+
'admin:key:generate',
|
|
92
|
+
'admin:key:rotate',
|
|
93
|
+
'admin:audit:read',
|
|
94
|
+
'admin:session:read',
|
|
95
|
+
'admin:session:revoke',
|
|
96
|
+
'admin:stats:read',
|
|
97
|
+
'admin:export:read',
|
|
98
|
+
'admin:import:write',
|
|
99
|
+
]);
|
|
100
|
+
/** Fixed safe labels for RBAC operation failures. */
|
|
101
|
+
const FAILURE_LABELS = {
|
|
102
|
+
validation: 'Validation failed',
|
|
103
|
+
unauthorized: 'Not authorized',
|
|
104
|
+
conflict: 'Conflict',
|
|
105
|
+
unavailable: 'Service unavailable',
|
|
106
|
+
'invalid-response': 'Invalid server response',
|
|
107
|
+
};
|
|
108
|
+
/** Returns whether a role is one of the immutable built-ins in the canonical Application. */
|
|
109
|
+
function isCanonicalRole(application, role) {
|
|
110
|
+
return (application.slug === 'porta-admin' && role !== undefined && CANONICAL_ROLE_SLUGS.has(role.slug));
|
|
111
|
+
}
|
|
112
|
+
/** Returns whether a permission is one of the immutable built-ins in the canonical Application. */
|
|
113
|
+
export function isCanonicalPermission(application, permission) {
|
|
114
|
+
return (application.slug === 'porta-admin' &&
|
|
115
|
+
permission !== undefined &&
|
|
116
|
+
CANONICAL_PERMISSION_SLUGS.has(permission.slug));
|
|
117
|
+
}
|
|
118
|
+
/** Returns the last complete validated collection retained by the controller state. */
|
|
119
|
+
function retainedProjection(state) {
|
|
120
|
+
if (state.kind === 'ready')
|
|
121
|
+
return state;
|
|
122
|
+
if (state.kind === 'loading' || state.kind === 'failure' || state.kind === 'indeterminate') {
|
|
123
|
+
return state.previous;
|
|
124
|
+
}
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
/** Returns the fixed status text that explains non-authoritative RBAC rows. */
|
|
128
|
+
function stateNotice(state) {
|
|
129
|
+
if (state.kind === 'loading')
|
|
130
|
+
return 'Loading roles and permissions…';
|
|
131
|
+
if (state.kind === 'indeterminate') {
|
|
132
|
+
return 'The operation outcome is unknown; reload is required';
|
|
133
|
+
}
|
|
134
|
+
return state.kind === 'failure' ? FAILURE_LABELS[state.failure] : undefined;
|
|
135
|
+
}
|
|
136
|
+
/** Clears positional selection whenever a DataGrid changes its display order. */
|
|
137
|
+
function clearSelectionOnSort(sort, selected) {
|
|
138
|
+
return createRoot((dispose) => {
|
|
139
|
+
let initialized = false;
|
|
140
|
+
effect(() => {
|
|
141
|
+
sort();
|
|
142
|
+
if (initialized)
|
|
143
|
+
selected.set(-1);
|
|
144
|
+
initialized = true;
|
|
145
|
+
});
|
|
146
|
+
return dispose;
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/** Creates both direct RBAC pages without introducing a reusable CRUD framework. */
|
|
150
|
+
export function createAdminApplicationRbacWorkspace(options) {
|
|
151
|
+
const roles = new Group();
|
|
152
|
+
const permissions = new Group();
|
|
153
|
+
let state = { kind: 'closed' };
|
|
154
|
+
let roleRows = signal([]);
|
|
155
|
+
let permissionRows = signal([]);
|
|
156
|
+
let selectedRoleIndex = signal(-1);
|
|
157
|
+
let selectedPermissionIndex = signal(-1);
|
|
158
|
+
let roleSort = signal(null);
|
|
159
|
+
let permissionSort = signal(null);
|
|
160
|
+
let roleFocus;
|
|
161
|
+
let permissionFocus;
|
|
162
|
+
let disposeRoleSort = () => undefined;
|
|
163
|
+
let disposePermissionSort = () => undefined;
|
|
164
|
+
let disposed = false;
|
|
165
|
+
/** Prevents mutations while an authoritative read or reconciliation owns the view. */
|
|
166
|
+
const mutationsBlocked = () => state.kind === 'loading' || state.kind === 'indeterminate';
|
|
167
|
+
/** Resolves the explicit selected role after the current sort is applied. */
|
|
168
|
+
const selectedRole = () => sortRows(roleRows(), ROLE_COLUMNS, roleSort())[selectedRoleIndex()];
|
|
169
|
+
const columns = permissionColumns(options.modules);
|
|
170
|
+
/** Resolves the explicit selected permission after the current sort is applied. */
|
|
171
|
+
const selectedPermission = () => sortRows(permissionRows(), columns, permissionSort())[selectedPermissionIndex()];
|
|
172
|
+
/** Replaces one page's children so stale rows never remain visible. */
|
|
173
|
+
const replace = (page, content) => {
|
|
174
|
+
for (const child of [...page.children])
|
|
175
|
+
page.remove(child);
|
|
176
|
+
page.add(cover(content));
|
|
177
|
+
};
|
|
178
|
+
/** Builds the Roles DataGrid and its exact action row. */
|
|
179
|
+
const renderRoles = () => {
|
|
180
|
+
disposeRoleSort();
|
|
181
|
+
const projection = retainedProjection(state);
|
|
182
|
+
roleRows = signal([...(projection?.roles ?? [])]);
|
|
183
|
+
selectedRoleIndex = signal(-1);
|
|
184
|
+
roleSort = signal(null);
|
|
185
|
+
disposeRoleSort = clearSelectionOnSort(roleSort, selectedRoleIndex);
|
|
186
|
+
const grid = new DataGrid({
|
|
187
|
+
rows: roleRows,
|
|
188
|
+
columns: ROLE_COLUMNS,
|
|
189
|
+
selected: selectedRoleIndex,
|
|
190
|
+
sort: roleSort,
|
|
191
|
+
zebra: true,
|
|
192
|
+
});
|
|
193
|
+
const add = new Button('Add', {
|
|
194
|
+
disabled: () => mutationsBlocked() || !options.capabilities.canCreateRoles,
|
|
195
|
+
onClick: () => options.onIntent({ kind: 'add-role' }),
|
|
196
|
+
});
|
|
197
|
+
const edit = new Button('Edit', {
|
|
198
|
+
disabled: () => mutationsBlocked() ||
|
|
199
|
+
!options.capabilities.canUpdateRoles ||
|
|
200
|
+
!selectedRole() ||
|
|
201
|
+
isCanonicalRole(options.application, selectedRole()),
|
|
202
|
+
onClick: () => {
|
|
203
|
+
const target = selectedRole();
|
|
204
|
+
if (target)
|
|
205
|
+
options.onIntent({ kind: 'edit-role', roleId: target.id });
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
const remove = new Button('Delete', {
|
|
209
|
+
disabled: () => mutationsBlocked() ||
|
|
210
|
+
!options.capabilities.canDeleteRoles ||
|
|
211
|
+
!selectedRole() ||
|
|
212
|
+
isCanonicalRole(options.application, selectedRole()),
|
|
213
|
+
onClick: () => {
|
|
214
|
+
const target = selectedRole();
|
|
215
|
+
if (target)
|
|
216
|
+
options.onIntent({ kind: 'delete-role', roleId: target.id });
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
const manage = new Button('Manage permissions', {
|
|
220
|
+
disabled: () => mutationsBlocked() ||
|
|
221
|
+
!options.capabilities.canUpdateRoles ||
|
|
222
|
+
!options.capabilities.canReadPermissions ||
|
|
223
|
+
!selectedRole() ||
|
|
224
|
+
isCanonicalRole(options.application, selectedRole()),
|
|
225
|
+
onClick: () => {
|
|
226
|
+
const target = selectedRole();
|
|
227
|
+
if (target)
|
|
228
|
+
options.onIntent({ kind: 'manage-role-permissions', roleId: target.id });
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
const reload = new Button('Reload', {
|
|
232
|
+
onClick: () => options.onIntent({ kind: 'reload' }),
|
|
233
|
+
});
|
|
234
|
+
const notices = [
|
|
235
|
+
stateNotice(state),
|
|
236
|
+
!options.capabilities.canCreateRoles ? 'Role create permission required.' : undefined,
|
|
237
|
+
options.application.slug === 'porta-admin'
|
|
238
|
+
? 'This built-in Porta Admin record cannot be changed.'
|
|
239
|
+
: undefined,
|
|
240
|
+
].filter((value) => value !== undefined);
|
|
241
|
+
const actionRow = row({ gap: 1 }, add, edit, remove, manage, spacer(), reload);
|
|
242
|
+
replace(roles, col({ gap: 1, padding: 1 }, fixed(new Text(`Application: ${options.application.name}`), 1), ...notices.map((notice) => fixed(new Text(notice), 1)), grow(grid), fixed(actionRow, 2)));
|
|
243
|
+
roleFocus = grid.rows;
|
|
244
|
+
};
|
|
245
|
+
/** Builds the Permissions DataGrid and its exact action row. */
|
|
246
|
+
const renderPermissions = () => {
|
|
247
|
+
disposePermissionSort();
|
|
248
|
+
const projection = retainedProjection(state);
|
|
249
|
+
permissionRows = signal([...(projection?.permissions ?? [])]);
|
|
250
|
+
selectedPermissionIndex = signal(-1);
|
|
251
|
+
permissionSort = signal(null);
|
|
252
|
+
disposePermissionSort = clearSelectionOnSort(permissionSort, selectedPermissionIndex);
|
|
253
|
+
const grid = new DataGrid({
|
|
254
|
+
rows: permissionRows,
|
|
255
|
+
columns,
|
|
256
|
+
selected: selectedPermissionIndex,
|
|
257
|
+
sort: permissionSort,
|
|
258
|
+
zebra: true,
|
|
259
|
+
});
|
|
260
|
+
const add = new Button('Add', {
|
|
261
|
+
disabled: () => mutationsBlocked() || !options.capabilities.canCreatePermissions,
|
|
262
|
+
onClick: () => options.onIntent({ kind: 'add-permission' }),
|
|
263
|
+
});
|
|
264
|
+
const edit = new Button('Edit', {
|
|
265
|
+
disabled: () => mutationsBlocked() ||
|
|
266
|
+
!options.capabilities.canUpdatePermissions ||
|
|
267
|
+
!selectedPermission() ||
|
|
268
|
+
isCanonicalPermission(options.application, selectedPermission()),
|
|
269
|
+
onClick: () => {
|
|
270
|
+
const target = selectedPermission();
|
|
271
|
+
if (target)
|
|
272
|
+
options.onIntent({ kind: 'edit-permission', permissionId: target.id });
|
|
273
|
+
},
|
|
274
|
+
});
|
|
275
|
+
const remove = new Button('Delete', {
|
|
276
|
+
disabled: () => mutationsBlocked() ||
|
|
277
|
+
!options.capabilities.canDeletePermissions ||
|
|
278
|
+
!selectedPermission() ||
|
|
279
|
+
isCanonicalPermission(options.application, selectedPermission()),
|
|
280
|
+
onClick: () => {
|
|
281
|
+
const target = selectedPermission();
|
|
282
|
+
if (target)
|
|
283
|
+
options.onIntent({ kind: 'delete-permission', permissionId: target.id });
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
const reload = new Button('Reload', {
|
|
287
|
+
onClick: () => options.onIntent({ kind: 'reload' }),
|
|
288
|
+
});
|
|
289
|
+
const notices = [
|
|
290
|
+
stateNotice(state),
|
|
291
|
+
!options.capabilities.canCreatePermissions
|
|
292
|
+
? 'Permission create permission required.'
|
|
293
|
+
: undefined,
|
|
294
|
+
!options.capabilities.canUpdatePermissions
|
|
295
|
+
? 'Permission update permission required.'
|
|
296
|
+
: undefined,
|
|
297
|
+
options.application.slug === 'porta-admin'
|
|
298
|
+
? 'Built-in Porta Admin records are read only; custom permissions remain editable.'
|
|
299
|
+
: undefined,
|
|
300
|
+
].filter((value) => value !== undefined);
|
|
301
|
+
const actionRow = row({ gap: 1 }, add, edit, remove, spacer(), reload);
|
|
302
|
+
replace(permissions, col({ gap: 1, padding: 1 }, fixed(new Text(`Application: ${options.application.name}`), 1), ...notices.map((notice) => fixed(new Text(notice), 1)), grow(grid), fixed(actionRow, 2)));
|
|
303
|
+
permissionFocus = grid.rows;
|
|
304
|
+
};
|
|
305
|
+
/** Repaints both pages from one immutable state snapshot. */
|
|
306
|
+
const render = () => {
|
|
307
|
+
if (disposed)
|
|
308
|
+
return;
|
|
309
|
+
renderRoles();
|
|
310
|
+
renderPermissions();
|
|
311
|
+
};
|
|
312
|
+
render();
|
|
313
|
+
return {
|
|
314
|
+
roles,
|
|
315
|
+
permissions,
|
|
316
|
+
setState(next) {
|
|
317
|
+
if (disposed)
|
|
318
|
+
return;
|
|
319
|
+
state = next;
|
|
320
|
+
render();
|
|
321
|
+
},
|
|
322
|
+
focusCurrent(page) {
|
|
323
|
+
const target = page === 'roles' ? roleFocus : permissionFocus;
|
|
324
|
+
if (target)
|
|
325
|
+
options.focusView?.(target);
|
|
326
|
+
},
|
|
327
|
+
clear() {
|
|
328
|
+
if (disposed)
|
|
329
|
+
return;
|
|
330
|
+
state = { kind: 'closed' };
|
|
331
|
+
render();
|
|
332
|
+
},
|
|
333
|
+
dispose() {
|
|
334
|
+
if (disposed)
|
|
335
|
+
return;
|
|
336
|
+
state = { kind: 'closed' };
|
|
337
|
+
render();
|
|
338
|
+
disposeRoleSort();
|
|
339
|
+
disposePermissionSort();
|
|
340
|
+
disposed = true;
|
|
341
|
+
},
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=application-rbac-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application-rbac-workspace.js","sourceRoot":"","sources":["../../src/admin/application-rbac-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** Native terminal host adapter for the embedded administration application. */
|
|
2
|
+
import type { CapabilityProfile } from '@jsvision/core';
|
|
3
|
+
import type { Application, EventLoop, ModalDialogHost } from '@jsvision/ui';
|
|
4
|
+
import type { LoginInteraction } from '../auth/login-coordinator.js';
|
|
5
|
+
import type { createAdminPresentation } from './presentation.js';
|
|
6
|
+
/** Dialog interactions owned by the live administration application. */
|
|
7
|
+
export interface AdminApplicationInteraction extends LoginInteraction {
|
|
8
|
+
/** Asks for and validates the first Porta server origin. */
|
|
9
|
+
readonly selectServer: (signal: AbortSignal) => Promise<URL | undefined>;
|
|
10
|
+
}
|
|
11
|
+
/** Closes an active modal promptly when its owning operation is cancelled. */
|
|
12
|
+
export declare function runAbortableAdminDialog<T>(loop: Pick<EventLoop, 'endModal'>, signal_: AbortSignal, open: () => Promise<T>): Promise<T>;
|
|
13
|
+
/** Creates the modal login and first-run interactions over the application body. */
|
|
14
|
+
export declare function createAdminInteraction(application: Application, dialogHost: ModalDialogHost): AdminApplicationInteraction;
|
|
15
|
+
/** Shared modal surface plus synchronous removal used during resize and shutdown. */
|
|
16
|
+
export interface AdminDialogSurface {
|
|
17
|
+
/** Host passed to ordinary JSVision dialog helpers. */
|
|
18
|
+
readonly host: ModalDialogHost & {
|
|
19
|
+
/** Event loop that also supports synchronous abort-driven modal closure. */
|
|
20
|
+
readonly loop: ModalDialogHost['loop'] & Pick<EventLoop, 'endModal' | 'focusView'>;
|
|
21
|
+
};
|
|
22
|
+
/** Immediately removes every mounted dialog before a terminal redraw. */
|
|
23
|
+
readonly removeAll: () => void;
|
|
24
|
+
/** Handles a shell command inside the otherwise isolated active modal subtree. */
|
|
25
|
+
readonly setModalCommandHandler: (handler: ((command: string) => boolean) | undefined) => void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Creates the modal host over the administration landing view.
|
|
29
|
+
*
|
|
30
|
+
* @param application - Mounted JSVision application.
|
|
31
|
+
* @param presentation - Landing presentation that owns modal windows.
|
|
32
|
+
* @returns A standard dialog host and a synchronous teardown operation.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createAdminDialogSurface(application: Application, presentation: ReturnType<typeof createAdminPresentation>): AdminDialogSurface;
|
|
35
|
+
/**
|
|
36
|
+
* Runs the native terminal host while allowing application-owned signal handling to finish first.
|
|
37
|
+
*
|
|
38
|
+
* @param application - Mounted JSVision application.
|
|
39
|
+
* @param caps - Terminal capabilities shared with the renderer.
|
|
40
|
+
* @param onSignal - Receives the terminal host's exit code before application shutdown.
|
|
41
|
+
* @returns The application command-loop exit code.
|
|
42
|
+
*/
|
|
43
|
+
export declare function runNativeAdminApplication(application: Application, caps: CapabilityProfile, onSignal: (code: number) => void): Promise<number>;
|
|
44
|
+
//# sourceMappingURL=application-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application-runtime.d.ts","sourceRoot":"","sources":["../../src/admin/application-runtime.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAGhF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,KAAK,EAAE,WAAW,EAAiB,SAAS,EAAE,eAAe,EAAa,MAAM,cAAc,CAAC;AACtG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,wEAAwE;AACxE,MAAM,WAAW,2BAA4B,SAAQ,gBAAgB;IACnE,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;CAC1E;AAOD,8EAA8E;AAC9E,wBAAsB,uBAAuB,CAAC,CAAC,EAC7C,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EACjC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,CAAC,CAAC,CASZ;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,eAAe,GAC1B,2BAA2B,CA4D7B;AAED,qFAAqF;AACrF,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG;QAC/B,4EAA4E;QAC5E,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC;KACpF,CAAC;IACF,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;IAC/B,kFAAkF;IAClF,QAAQ,CAAC,sBAAsB,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC;CAChG;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,GACvD,kBAAkB,CAuCpB;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC/B,OAAO,CAAC,MAAM,CAAC,CAuDjB"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/** Native terminal host adapter for the embedded administration application. */
|
|
2
|
+
import { createHost, cursor } from '@jsvision/core';
|
|
3
|
+
import { Commands, confirm, inputBox, signal } from '@jsvision/ui';
|
|
4
|
+
import { normalizeServerOrigin } from '../global-options.js';
|
|
5
|
+
/** Converts a cancelled dialog into the cancellation used by the login coordinator. */
|
|
6
|
+
function cancelledInteraction() {
|
|
7
|
+
return new DOMException('The operation was aborted', 'AbortError');
|
|
8
|
+
}
|
|
9
|
+
/** Closes an active modal promptly when its owning operation is cancelled. */
|
|
10
|
+
export async function runAbortableAdminDialog(loop, signal_, open) {
|
|
11
|
+
if (signal_.aborted)
|
|
12
|
+
throw cancelledInteraction();
|
|
13
|
+
const abort = () => loop.endModal(Commands.cancel);
|
|
14
|
+
signal_.addEventListener('abort', abort, { once: true });
|
|
15
|
+
try {
|
|
16
|
+
return await open();
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
signal_.removeEventListener('abort', abort);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Creates the modal login and first-run interactions over the application body. */
|
|
23
|
+
export function createAdminInteraction(application, dialogHost) {
|
|
24
|
+
const serverValidator = {
|
|
25
|
+
isValidInput: (value) => value.length <= 2_048,
|
|
26
|
+
isValid: (value) => {
|
|
27
|
+
try {
|
|
28
|
+
normalizeServerOrigin(value);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
error: 'Enter a valid HTTPS Porta server origin.',
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
selectServer: async (operationSignal) => {
|
|
39
|
+
const value = signal('https://');
|
|
40
|
+
const selected = await runAbortableAdminDialog(application.loop, operationSignal, () => inputBox(dialogHost, {
|
|
41
|
+
title: 'Select Porta Server',
|
|
42
|
+
label: '~S~erver origin',
|
|
43
|
+
value,
|
|
44
|
+
validator: serverValidator,
|
|
45
|
+
placeholder: 'https://porta.example.com',
|
|
46
|
+
}));
|
|
47
|
+
return selected === null ? undefined : normalizeServerOrigin(selected);
|
|
48
|
+
},
|
|
49
|
+
presentAuthorizationUrl: async (url, operationSignal) => {
|
|
50
|
+
const value = signal(url.toString());
|
|
51
|
+
const acknowledged = await runAbortableAdminDialog(application.loop, operationSignal, () => inputBox(dialogHost, {
|
|
52
|
+
title: 'Open Authorization URL',
|
|
53
|
+
label: '~U~RL',
|
|
54
|
+
value,
|
|
55
|
+
}));
|
|
56
|
+
if (acknowledged === null)
|
|
57
|
+
throw cancelledInteraction();
|
|
58
|
+
},
|
|
59
|
+
requestManualCallback: async (operationSignal) => {
|
|
60
|
+
const value = signal('');
|
|
61
|
+
const callback = await runAbortableAdminDialog(application.loop, operationSignal, () => inputBox(dialogHost, {
|
|
62
|
+
title: 'Complete Authentication',
|
|
63
|
+
label: '~C~allback URL',
|
|
64
|
+
value,
|
|
65
|
+
placeholder: 'Paste the complete callback URL',
|
|
66
|
+
}));
|
|
67
|
+
if (callback === null)
|
|
68
|
+
throw cancelledInteraction();
|
|
69
|
+
return callback;
|
|
70
|
+
},
|
|
71
|
+
confirmCredentialReplacement: (currentServer, nextServer, operationSignal) => runAbortableAdminDialog(application.loop, operationSignal, () => confirm(dialogHost, `Replace credentials for ${currentServer.origin} with ${nextServer.origin}?`)),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates the modal host over the administration landing view.
|
|
76
|
+
*
|
|
77
|
+
* @param application - Mounted JSVision application.
|
|
78
|
+
* @param presentation - Landing presentation that owns modal windows.
|
|
79
|
+
* @returns A standard dialog host and a synchronous teardown operation.
|
|
80
|
+
*/
|
|
81
|
+
export function createAdminDialogSurface(application, presentation) {
|
|
82
|
+
const windows = new Set();
|
|
83
|
+
let modalCommandHandler;
|
|
84
|
+
return {
|
|
85
|
+
host: {
|
|
86
|
+
i18n: application.i18n,
|
|
87
|
+
loop: application.loop,
|
|
88
|
+
desktop: {
|
|
89
|
+
addWindow: (window) => {
|
|
90
|
+
windows.add(window);
|
|
91
|
+
const route = window.onEvent.bind(window);
|
|
92
|
+
window.onEvent = (event) => {
|
|
93
|
+
if (event.event.type === 'command' &&
|
|
94
|
+
modalCommandHandler?.(event.event.command)) {
|
|
95
|
+
event.handled = true;
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
route(event);
|
|
99
|
+
};
|
|
100
|
+
presentation.content.addWindow(window);
|
|
101
|
+
},
|
|
102
|
+
removeWindow: (window) => {
|
|
103
|
+
if (windows.delete(window))
|
|
104
|
+
presentation.content.removeWindow(window);
|
|
105
|
+
},
|
|
106
|
+
get bounds() {
|
|
107
|
+
return presentation.content.bounds;
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
removeAll: () => {
|
|
112
|
+
for (const window of windows)
|
|
113
|
+
presentation.content.removeWindow(window);
|
|
114
|
+
windows.clear();
|
|
115
|
+
},
|
|
116
|
+
setModalCommandHandler: (handler) => {
|
|
117
|
+
modalCommandHandler = handler;
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Runs the native terminal host while allowing application-owned signal handling to finish first.
|
|
123
|
+
*
|
|
124
|
+
* @param application - Mounted JSVision application.
|
|
125
|
+
* @param caps - Terminal capabilities shared with the renderer.
|
|
126
|
+
* @param onSignal - Receives the terminal host's exit code before application shutdown.
|
|
127
|
+
* @returns The application command-loop exit code.
|
|
128
|
+
*/
|
|
129
|
+
export async function runNativeAdminApplication(application, caps, onSignal) {
|
|
130
|
+
const output = process.stdout;
|
|
131
|
+
let lastCaret = null;
|
|
132
|
+
let pendingFrame = null;
|
|
133
|
+
let resolveQuit = () => undefined;
|
|
134
|
+
const quit = new Promise((resolve) => {
|
|
135
|
+
resolveQuit = resolve;
|
|
136
|
+
});
|
|
137
|
+
const unregisterQuit = application.onCommand(Commands.quit, () => resolveQuit(0));
|
|
138
|
+
const host = createHost({
|
|
139
|
+
caps,
|
|
140
|
+
input: process.stdin,
|
|
141
|
+
output,
|
|
142
|
+
exitOnSignal: false,
|
|
143
|
+
warnAmbiguousWidth: true,
|
|
144
|
+
adaptAmbiguousWidth: true,
|
|
145
|
+
onInput: (event) => application.loop.dispatch(event),
|
|
146
|
+
onResize: (event) => application.loop.resize({ width: event.columns, height: event.rows }),
|
|
147
|
+
onResume: () => {
|
|
148
|
+
output.write(lastCaret === null
|
|
149
|
+
? cursor.hide()
|
|
150
|
+
: cursor.show() + cursor.to(lastCaret.y + 1, lastCaret.x + 1));
|
|
151
|
+
},
|
|
152
|
+
onBeforeExit: onSignal,
|
|
153
|
+
});
|
|
154
|
+
application.loop.onFrame = (buffer) => {
|
|
155
|
+
pendingFrame = buffer;
|
|
156
|
+
};
|
|
157
|
+
application.loop.onCaret = (cell) => {
|
|
158
|
+
lastCaret = cell;
|
|
159
|
+
const caret = cell === null ? cursor.hide() : cursor.show() + cursor.to(cell.y + 1, cell.x + 1);
|
|
160
|
+
if (pendingFrame) {
|
|
161
|
+
const frame = pendingFrame;
|
|
162
|
+
pendingFrame = null;
|
|
163
|
+
host.render(frame, caret);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
output.write(caret);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
try {
|
|
170
|
+
await host.start();
|
|
171
|
+
host.render(application.loop.renderRoot.buffer());
|
|
172
|
+
application.loop.refreshCaret();
|
|
173
|
+
return await quit;
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
application.loop.stop();
|
|
177
|
+
await host.stop();
|
|
178
|
+
application.loop.onFrame = undefined;
|
|
179
|
+
application.loop.onCaret = undefined;
|
|
180
|
+
unregisterQuit();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=application-runtime.js.map
|