@portaidentity/cli 0.1.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/dist/auth/browser-flow.d.ts +42 -0
- package/dist/auth/browser-flow.d.ts.map +1 -0
- package/dist/auth/browser-flow.js +193 -0
- package/dist/auth/browser-flow.js.map +1 -0
- package/dist/auth/callback-server.d.ts +81 -0
- package/dist/auth/callback-server.d.ts.map +1 -0
- package/dist/auth/callback-server.js +193 -0
- package/dist/auth/callback-server.js.map +1 -0
- package/dist/auth/metadata.d.ts +43 -0
- package/dist/auth/metadata.d.ts.map +1 -0
- package/dist/auth/metadata.js +66 -0
- package/dist/auth/metadata.js.map +1 -0
- package/dist/auth/pkce.d.ts +42 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +52 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/types.d.ts +72 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +11 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/client-factory.d.ts +29 -0
- package/dist/client-factory.d.ts.map +1 -0
- package/dist/client-factory.js +43 -0
- package/dist/client-factory.js.map +1 -0
- package/dist/commands/app-claim.d.ts +9 -0
- package/dist/commands/app-claim.d.ts.map +1 -0
- package/dist/commands/app-claim.js +128 -0
- package/dist/commands/app-claim.js.map +1 -0
- package/dist/commands/app-module.d.ts +9 -0
- package/dist/commands/app-module.d.ts.map +1 -0
- package/dist/commands/app-module.js +104 -0
- package/dist/commands/app-module.js.map +1 -0
- package/dist/commands/app-permission.d.ts +9 -0
- package/dist/commands/app-permission.d.ts.map +1 -0
- package/dist/commands/app-permission.js +118 -0
- package/dist/commands/app-permission.js.map +1 -0
- package/dist/commands/app-role.d.ts +9 -0
- package/dist/commands/app-role.d.ts.map +1 -0
- package/dist/commands/app-role.js +166 -0
- package/dist/commands/app-role.js.map +1 -0
- package/dist/commands/app.d.ts +12 -0
- package/dist/commands/app.d.ts.map +1 -0
- package/dist/commands/app.js +255 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/audit.d.ts +12 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +96 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/bulk.d.ts +12 -0
- package/dist/commands/bulk.d.ts.map +1 -0
- package/dist/commands/bulk.js +77 -0
- package/dist/commands/bulk.js.map +1 -0
- package/dist/commands/client-secret.d.ts +18 -0
- package/dist/commands/client-secret.d.ts.map +1 -0
- package/dist/commands/client-secret.js +126 -0
- package/dist/commands/client-secret.js.map +1 -0
- package/dist/commands/client.d.ts +27 -0
- package/dist/commands/client.d.ts.map +1 -0
- package/dist/commands/client.js +385 -0
- package/dist/commands/client.js.map +1 -0
- package/dist/commands/completion.d.ts +27 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +42 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +14 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +85 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts +25 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +198 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/exports.d.ts +12 -0
- package/dist/commands/exports.d.ts.map +1 -0
- package/dist/commands/exports.js +80 -0
- package/dist/commands/exports.js.map +1 -0
- package/dist/commands/health.d.ts +12 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +53 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/keys.d.ts +14 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +91 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/login.d.ts +36 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +78 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +25 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +43 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/org.d.ts +26 -0
- package/dist/commands/org.d.ts.map +1 -0
- package/dist/commands/org.js +396 -0
- package/dist/commands/org.js.map +1 -0
- package/dist/commands/provision.d.ts +47 -0
- package/dist/commands/provision.d.ts.map +1 -0
- package/dist/commands/provision.js +400 -0
- package/dist/commands/provision.js.map +1 -0
- package/dist/commands/sessions.d.ts +14 -0
- package/dist/commands/sessions.d.ts.map +1 -0
- package/dist/commands/sessions.js +122 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/stats.d.ts +12 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +46 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/user-claim.d.ts +17 -0
- package/dist/commands/user-claim.d.ts.map +1 -0
- package/dist/commands/user-claim.js +123 -0
- package/dist/commands/user-claim.js.map +1 -0
- package/dist/commands/user-role.d.ts +17 -0
- package/dist/commands/user-role.d.ts.map +1 -0
- package/dist/commands/user-role.js +118 -0
- package/dist/commands/user-role.js.map +1 -0
- package/dist/commands/user.d.ts +26 -0
- package/dist/commands/user.d.ts.map +1 -0
- package/dist/commands/user.js +352 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/commands/version.d.ts +25 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +83 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/commands/whoami.d.ts +26 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +66 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/credential-store.d.ts +101 -0
- package/dist/credential-store.d.ts.map +1 -0
- package/dist/credential-store.js +121 -0
- package/dist/credential-store.js.map +1 -0
- package/dist/error-handler.d.ts +47 -0
- package/dist/error-handler.d.ts.map +1 -0
- package/dist/error-handler.js +166 -0
- package/dist/error-handler.js.map +1 -0
- package/dist/global-options.d.ts +50 -0
- package/dist/global-options.d.ts.map +1 -0
- package/dist/global-options.js +62 -0
- package/dist/global-options.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +122 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +75 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +100 -0
- package/dist/output.js.map +1 -0
- package/dist/parsers.d.ts +74 -0
- package/dist/parsers.d.ts.map +1 -0
- package/dist/parsers.js +125 -0
- package/dist/parsers.js.map +1 -0
- package/dist/prompt.d.ts +50 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +98 -0
- package/dist/prompt.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provision command — declarative tenant infrastructure from YAML/JSON.
|
|
3
|
+
*
|
|
4
|
+
* Reads a YAML (or JSON) provisioning file with a nested structure
|
|
5
|
+
* (organizations → applications → clients/roles/permissions/claims),
|
|
6
|
+
* transforms it into the flat import manifest format, and sends it
|
|
7
|
+
* to the import API via the SDK. All entities are created in a single
|
|
8
|
+
* transaction.
|
|
9
|
+
*
|
|
10
|
+
* Supports three modes:
|
|
11
|
+
* merge (default): skip existing entities, create new
|
|
12
|
+
* overwrite: update existing entities, create new
|
|
13
|
+
* dry-run: preview what would change without applying
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* porta provision --file infrastructure.yaml
|
|
17
|
+
* porta provision --file infrastructure.yaml --dry-run
|
|
18
|
+
* porta provision --file infrastructure.yaml --mode overwrite
|
|
19
|
+
* porta provision --file infrastructure.yaml --json
|
|
20
|
+
*
|
|
21
|
+
* @module commands/provision
|
|
22
|
+
*/
|
|
23
|
+
import fs from 'node:fs';
|
|
24
|
+
import path from 'node:path';
|
|
25
|
+
import { parse as parseYaml } from 'yaml';
|
|
26
|
+
import { createClient } from '../client-factory.js';
|
|
27
|
+
import { handleError } from '../error-handler.js';
|
|
28
|
+
import { printTable, printJson, success, warn, error as printError } from '../output.js';
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Slug generation — simple kebab-case conversion
|
|
31
|
+
// ============================================================================
|
|
32
|
+
/**
|
|
33
|
+
* Generate a URL-safe slug from a name.
|
|
34
|
+
*
|
|
35
|
+
* Converts to lowercase, replaces non-alphanumeric chars with hyphens,
|
|
36
|
+
* collapses multiple hyphens, and trims leading/trailing hyphens.
|
|
37
|
+
*/
|
|
38
|
+
function slugify(name) {
|
|
39
|
+
return name
|
|
40
|
+
.toLowerCase()
|
|
41
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
42
|
+
.replace(/-+/g, '-')
|
|
43
|
+
.replace(/^-|-$/g, '');
|
|
44
|
+
}
|
|
45
|
+
// ============================================================================
|
|
46
|
+
// Duration parser — converts human-friendly durations to ISO dates
|
|
47
|
+
// ============================================================================
|
|
48
|
+
/**
|
|
49
|
+
* Parse a duration string into a future Date.
|
|
50
|
+
*
|
|
51
|
+
* Supports: Nd (days), Nm (months), Ny (years), Nh (hours).
|
|
52
|
+
* Examples: "90d" (90 days), "6m" (6 months), "1y" (1 year), "24h" (24 hours).
|
|
53
|
+
*/
|
|
54
|
+
export function parseDuration(duration) {
|
|
55
|
+
const match = duration.match(/^(\d+)([dmyh])$/);
|
|
56
|
+
if (!match) {
|
|
57
|
+
throw new Error(`Invalid duration format: "${duration}". Use Nd, Nm, Ny, or Nh (e.g., 90d, 6m, 1y, 24h).`);
|
|
58
|
+
}
|
|
59
|
+
const amount = parseInt(match[1], 10);
|
|
60
|
+
const unit = match[2];
|
|
61
|
+
const date = new Date();
|
|
62
|
+
switch (unit) {
|
|
63
|
+
case 'd':
|
|
64
|
+
date.setDate(date.getDate() + amount);
|
|
65
|
+
break;
|
|
66
|
+
case 'm':
|
|
67
|
+
date.setMonth(date.getMonth() + amount);
|
|
68
|
+
break;
|
|
69
|
+
case 'y':
|
|
70
|
+
date.setFullYear(date.getFullYear() + amount);
|
|
71
|
+
break;
|
|
72
|
+
case 'h':
|
|
73
|
+
date.setHours(date.getHours() + amount);
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
return date;
|
|
77
|
+
}
|
|
78
|
+
// ============================================================================
|
|
79
|
+
// File parser — reads YAML or JSON based on extension
|
|
80
|
+
// ============================================================================
|
|
81
|
+
/**
|
|
82
|
+
* Read and parse a provisioning file from disk or stdin.
|
|
83
|
+
*
|
|
84
|
+
* Detects format by file extension (.yaml/.yml for YAML, .json for JSON).
|
|
85
|
+
* When reading from `/dev/stdin` (no extension), defaults to YAML parsing
|
|
86
|
+
* which also handles valid JSON since YAML is a superset of JSON.
|
|
87
|
+
*/
|
|
88
|
+
export function parseProvisioningFile(filePath) {
|
|
89
|
+
const isStdin = filePath === '/dev/stdin';
|
|
90
|
+
if (!isStdin && !fs.existsSync(filePath)) {
|
|
91
|
+
throw new Error(`File not found: ${filePath}`);
|
|
92
|
+
}
|
|
93
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
94
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
95
|
+
if (ext === '.yaml' || ext === '.yml') {
|
|
96
|
+
return parseYaml(content);
|
|
97
|
+
}
|
|
98
|
+
else if (ext === '.json') {
|
|
99
|
+
return JSON.parse(content);
|
|
100
|
+
}
|
|
101
|
+
else if (isStdin || ext === '') {
|
|
102
|
+
return parseYaml(content);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
throw new Error(`Unsupported file format: ${ext}. Use .yaml, .yml, or .json`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Transform a nested provisioning file into a flat import manifest.
|
|
110
|
+
*
|
|
111
|
+
* Walks the nested org → app → (clients, roles, permissions, claims) tree
|
|
112
|
+
* and produces flat arrays with explicit organization_slug and application_slug
|
|
113
|
+
* references for each entity.
|
|
114
|
+
*/
|
|
115
|
+
function transformToManifest(input) {
|
|
116
|
+
const manifest = {
|
|
117
|
+
version: input.version,
|
|
118
|
+
organizations: [],
|
|
119
|
+
applications: [],
|
|
120
|
+
clients: [],
|
|
121
|
+
roles: [],
|
|
122
|
+
permissions: [],
|
|
123
|
+
claim_definitions: [],
|
|
124
|
+
users: [],
|
|
125
|
+
application_modules: [],
|
|
126
|
+
role_permission_mappings: [],
|
|
127
|
+
user_role_assignments: [],
|
|
128
|
+
user_claim_values: [],
|
|
129
|
+
};
|
|
130
|
+
// Validate allow_passwords enforcement
|
|
131
|
+
if (!input.allow_passwords) {
|
|
132
|
+
for (const org of input.organizations) {
|
|
133
|
+
for (const user of org.users ?? []) {
|
|
134
|
+
if (user.password) {
|
|
135
|
+
throw new Error(`User "${user.email}": password field requires "allow_passwords: true" at top level. ` +
|
|
136
|
+
'Password provisioning is for development/testing only.');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
for (const org of input.organizations) {
|
|
142
|
+
const orgSlug = org.slug ?? slugify(org.name);
|
|
143
|
+
// Add organization
|
|
144
|
+
manifest.organizations.push({
|
|
145
|
+
name: org.name,
|
|
146
|
+
slug: orgSlug,
|
|
147
|
+
default_locale: org.default_locale,
|
|
148
|
+
default_login_methods: org.default_login_methods,
|
|
149
|
+
two_factor_policy: org.two_factor_policy,
|
|
150
|
+
branding_primary_color: org.branding?.primary_color,
|
|
151
|
+
branding_company_name: org.branding?.company_name,
|
|
152
|
+
branding_custom_css: org.branding?.custom_css,
|
|
153
|
+
branding_logo_url: org.branding?.logo_url,
|
|
154
|
+
branding_favicon_url: org.branding?.favicon_url,
|
|
155
|
+
});
|
|
156
|
+
// Flatten users + extract role/claim assignments
|
|
157
|
+
for (const user of org.users ?? []) {
|
|
158
|
+
manifest.users.push({
|
|
159
|
+
email: user.email,
|
|
160
|
+
organization_slug: orgSlug,
|
|
161
|
+
given_name: user.given_name,
|
|
162
|
+
family_name: user.family_name,
|
|
163
|
+
locale: user.locale,
|
|
164
|
+
status: user.status,
|
|
165
|
+
email_verified: user.email_verified,
|
|
166
|
+
password: user.password,
|
|
167
|
+
});
|
|
168
|
+
for (const roleRef of user.roles ?? []) {
|
|
169
|
+
manifest.user_role_assignments.push({
|
|
170
|
+
email: user.email,
|
|
171
|
+
organization_slug: orgSlug,
|
|
172
|
+
application_slug: roleRef.app,
|
|
173
|
+
role_slug: roleRef.role,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
for (const claimRef of user.claims ?? []) {
|
|
177
|
+
manifest.user_claim_values.push({
|
|
178
|
+
email: user.email,
|
|
179
|
+
organization_slug: orgSlug,
|
|
180
|
+
application_slug: claimRef.app,
|
|
181
|
+
claim_slug: claimRef.claim,
|
|
182
|
+
value: claimRef.value,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
for (const app of org.applications ?? []) {
|
|
187
|
+
const appSlug = app.slug ?? slugify(app.name);
|
|
188
|
+
// Add application
|
|
189
|
+
manifest.applications.push({
|
|
190
|
+
name: app.name,
|
|
191
|
+
slug: appSlug,
|
|
192
|
+
organization_slug: orgSlug,
|
|
193
|
+
description: app.description,
|
|
194
|
+
});
|
|
195
|
+
// Flatten clients
|
|
196
|
+
for (const clientDef of app.clients ?? []) {
|
|
197
|
+
// Validate and flatten secret block
|
|
198
|
+
if (clientDef.secret) {
|
|
199
|
+
if (clientDef.client_type === 'public') {
|
|
200
|
+
throw new Error(`Client "${clientDef.client_name}": secret block not allowed on public clients`);
|
|
201
|
+
}
|
|
202
|
+
if (clientDef.secret.expires_at && clientDef.secret.expires_in) {
|
|
203
|
+
throw new Error(`Client "${clientDef.client_name}": expires_at and expires_in are mutually exclusive`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
let secretLabel;
|
|
207
|
+
let secretExpiresAt;
|
|
208
|
+
if (clientDef.secret) {
|
|
209
|
+
secretLabel = clientDef.secret.label;
|
|
210
|
+
if (clientDef.secret.expires_at) {
|
|
211
|
+
secretExpiresAt = clientDef.secret.expires_at;
|
|
212
|
+
}
|
|
213
|
+
else if (clientDef.secret.expires_in) {
|
|
214
|
+
secretExpiresAt = parseDuration(clientDef.secret.expires_in).toISOString();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
const { secret: _secretBlock, ...clientFields } = clientDef;
|
|
218
|
+
manifest.clients.push({
|
|
219
|
+
...clientFields,
|
|
220
|
+
application_slug: appSlug,
|
|
221
|
+
organization_slug: orgSlug,
|
|
222
|
+
...(secretLabel !== undefined ? { secret_label: secretLabel } : {}),
|
|
223
|
+
...(secretExpiresAt !== undefined ? { secret_expires_at: secretExpiresAt } : {}),
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
// Flatten permissions
|
|
227
|
+
for (const perm of app.permissions ?? []) {
|
|
228
|
+
manifest.permissions.push({
|
|
229
|
+
...perm,
|
|
230
|
+
application_slug: appSlug,
|
|
231
|
+
organization_slug: orgSlug,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
// Flatten roles + extract permission mappings
|
|
235
|
+
for (const role of app.roles ?? []) {
|
|
236
|
+
const roleSlug = role.slug ?? slugify(role.name);
|
|
237
|
+
manifest.roles.push({
|
|
238
|
+
name: role.name,
|
|
239
|
+
slug: roleSlug,
|
|
240
|
+
description: role.description,
|
|
241
|
+
application_slug: appSlug,
|
|
242
|
+
organization_slug: orgSlug,
|
|
243
|
+
});
|
|
244
|
+
if (role.permissions && role.permissions.length > 0) {
|
|
245
|
+
manifest.role_permission_mappings.push({
|
|
246
|
+
role_slug: roleSlug,
|
|
247
|
+
permission_slugs: role.permissions,
|
|
248
|
+
application_slug: appSlug,
|
|
249
|
+
organization_slug: orgSlug,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Flatten claim definitions
|
|
254
|
+
for (const claim of app.claim_definitions ?? []) {
|
|
255
|
+
manifest.claim_definitions.push({
|
|
256
|
+
...claim,
|
|
257
|
+
application_slug: appSlug,
|
|
258
|
+
organization_slug: orgSlug,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
// Flatten application modules
|
|
262
|
+
for (const mod of app.modules ?? []) {
|
|
263
|
+
manifest.application_modules.push({
|
|
264
|
+
name: mod.name,
|
|
265
|
+
slug: mod.slug,
|
|
266
|
+
description: mod.description,
|
|
267
|
+
status: mod.status,
|
|
268
|
+
application_slug: appSlug,
|
|
269
|
+
organization_slug: orgSlug,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Attach config overrides
|
|
275
|
+
if (input.config) {
|
|
276
|
+
manifest.config = input.config;
|
|
277
|
+
}
|
|
278
|
+
return manifest;
|
|
279
|
+
}
|
|
280
|
+
// ============================================================================
|
|
281
|
+
// Result display helpers
|
|
282
|
+
// ============================================================================
|
|
283
|
+
/**
|
|
284
|
+
* Display a summary of the import result.
|
|
285
|
+
*/
|
|
286
|
+
function displayResult(result, mode) {
|
|
287
|
+
const label = mode === 'dry-run' ? 'Dry-run preview' : 'Provisioning complete';
|
|
288
|
+
if (result.dryRun) {
|
|
289
|
+
success(`${label} (dry-run mode)`);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
success(`${label} (${mode} mode)`);
|
|
293
|
+
}
|
|
294
|
+
console.log();
|
|
295
|
+
// Display entity counts
|
|
296
|
+
const countEntries = Object.entries(result.counts);
|
|
297
|
+
if (countEntries.length > 0) {
|
|
298
|
+
printTable(['Entity Type', 'Count'], countEntries.map(([type, count]) => [
|
|
299
|
+
formatTypeName(type),
|
|
300
|
+
String(count),
|
|
301
|
+
]));
|
|
302
|
+
}
|
|
303
|
+
// Display errors
|
|
304
|
+
if (result.errors.length > 0) {
|
|
305
|
+
console.log();
|
|
306
|
+
printError(`${result.errors.length} error(s):`);
|
|
307
|
+
printTable(['Entity Type', 'Identifier', 'Error'], result.errors.map((e) => [e.entityType, e.identifier, e.error]));
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
console.log(` Errors: 0`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Format an entity type name for display (e.g., "claim_definitions" → "Claim Definitions").
|
|
315
|
+
*/
|
|
316
|
+
function formatTypeName(type) {
|
|
317
|
+
return type
|
|
318
|
+
.split('_')
|
|
319
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
320
|
+
.join(' ');
|
|
321
|
+
}
|
|
322
|
+
export const provisionCommand = {
|
|
323
|
+
command: 'provision',
|
|
324
|
+
describe: 'Provision tenant infrastructure from a YAML or JSON file',
|
|
325
|
+
builder: (yargs) => yargs
|
|
326
|
+
.option('file', {
|
|
327
|
+
alias: 'f',
|
|
328
|
+
type: 'string',
|
|
329
|
+
describe: 'Path to provisioning YAML or JSON file',
|
|
330
|
+
demandOption: true,
|
|
331
|
+
})
|
|
332
|
+
.option('mode', {
|
|
333
|
+
type: 'string',
|
|
334
|
+
describe: 'Import mode: merge (skip existing) or overwrite (update existing)',
|
|
335
|
+
choices: ['merge', 'overwrite'],
|
|
336
|
+
default: 'merge',
|
|
337
|
+
})
|
|
338
|
+
.option('dry-run', {
|
|
339
|
+
type: 'boolean',
|
|
340
|
+
describe: 'Preview what would change without applying',
|
|
341
|
+
default: false,
|
|
342
|
+
}),
|
|
343
|
+
handler: async (argv) => {
|
|
344
|
+
try {
|
|
345
|
+
const isJson = argv.json;
|
|
346
|
+
const isDryRun = argv['dry-run'];
|
|
347
|
+
// 1. Read and parse provisioning file
|
|
348
|
+
if (!isJson) {
|
|
349
|
+
console.log(`Reading ${argv.file}...`);
|
|
350
|
+
}
|
|
351
|
+
const rawData = parseProvisioningFile(argv.file);
|
|
352
|
+
// 2. Basic validation
|
|
353
|
+
const data = rawData;
|
|
354
|
+
if (!data.version || !data.organizations || !Array.isArray(data.organizations)) {
|
|
355
|
+
throw new Error('Invalid provisioning file: must contain "version" and "organizations" array');
|
|
356
|
+
}
|
|
357
|
+
// 3. Transform nested → flat manifest
|
|
358
|
+
const manifest = transformToManifest(data);
|
|
359
|
+
if (!isJson) {
|
|
360
|
+
const entityCount = manifest.organizations.length +
|
|
361
|
+
manifest.applications.length +
|
|
362
|
+
manifest.clients.length +
|
|
363
|
+
manifest.roles.length +
|
|
364
|
+
manifest.permissions.length +
|
|
365
|
+
manifest.claim_definitions.length +
|
|
366
|
+
manifest.users.length;
|
|
367
|
+
const mappingCount = manifest.role_permission_mappings.length;
|
|
368
|
+
const hasConfig = !!manifest.config;
|
|
369
|
+
console.log(`Found ${entityCount} entities, ${mappingCount} role-permission mappings${hasConfig ? ', config overrides' : ''}`);
|
|
370
|
+
console.log();
|
|
371
|
+
}
|
|
372
|
+
// 4. Determine import mode
|
|
373
|
+
const importMode = isDryRun ? 'dry-run' : argv.mode;
|
|
374
|
+
// 5. Send via SDK imports.provision()
|
|
375
|
+
const client = createClient(argv);
|
|
376
|
+
const sdkManifest = {
|
|
377
|
+
data: manifest,
|
|
378
|
+
mode: isDryRun ? undefined : argv.mode,
|
|
379
|
+
dryRun: isDryRun,
|
|
380
|
+
};
|
|
381
|
+
const result = await client.imports.provision(sdkManifest);
|
|
382
|
+
// 6. Display results
|
|
383
|
+
if (isJson) {
|
|
384
|
+
printJson(result);
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
displayResult(result, importMode);
|
|
388
|
+
}
|
|
389
|
+
// 7. Show dry-run warning
|
|
390
|
+
if (isDryRun && !isJson) {
|
|
391
|
+
console.log();
|
|
392
|
+
warn('Dry-run mode — no changes were applied. Remove --dry-run to apply.');
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
catch (err) {
|
|
396
|
+
handleError(err, argv.verbose);
|
|
397
|
+
}
|
|
398
|
+
},
|
|
399
|
+
};
|
|
400
|
+
//# sourceMappingURL=provision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision.js","sourceRoot":"","sources":["../../src/commands/provision.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sessions command — manage admin sessions.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* list List active admin sessions
|
|
6
|
+
* revoke Revoke a specific session by ID
|
|
7
|
+
* revoke-user Revoke all sessions for a user
|
|
8
|
+
*
|
|
9
|
+
* @module commands/sessions
|
|
10
|
+
*/
|
|
11
|
+
import type { CommandModule } from 'yargs';
|
|
12
|
+
import type { GlobalOptions } from '../global-options.js';
|
|
13
|
+
export declare const sessionsCommand: CommandModule<GlobalOptions, GlobalOptions>;
|
|
14
|
+
//# sourceMappingURL=sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA4B1D,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,aAAa,EAAE,aAAa,CAqIvE,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sessions command — manage admin sessions.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* list List active admin sessions
|
|
6
|
+
* revoke Revoke a specific session by ID
|
|
7
|
+
* revoke-user Revoke all sessions for a user
|
|
8
|
+
*
|
|
9
|
+
* @module commands/sessions
|
|
10
|
+
*/
|
|
11
|
+
import { createClient } from '../client-factory.js';
|
|
12
|
+
import { handleError } from '../error-handler.js';
|
|
13
|
+
import { printTable, printJson, success, warn, formatDate, truncate } from '../output.js';
|
|
14
|
+
import { confirm } from '../prompt.js';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Command
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
export const sessionsCommand = {
|
|
19
|
+
command: 'sessions',
|
|
20
|
+
describe: 'Manage admin sessions',
|
|
21
|
+
builder: (yargs) => yargs
|
|
22
|
+
// ── list ──────────────────────────────────────────────────────────
|
|
23
|
+
.command('list', 'List active admin sessions', (y) => y
|
|
24
|
+
.option('user-id', {
|
|
25
|
+
type: 'string',
|
|
26
|
+
describe: 'Filter by user ID',
|
|
27
|
+
})
|
|
28
|
+
.option('page', {
|
|
29
|
+
type: 'number',
|
|
30
|
+
describe: 'Page number',
|
|
31
|
+
})
|
|
32
|
+
.option('page-size', {
|
|
33
|
+
type: 'number',
|
|
34
|
+
describe: 'Results per page',
|
|
35
|
+
}), async (argv) => {
|
|
36
|
+
try {
|
|
37
|
+
const client = createClient(argv);
|
|
38
|
+
const result = await client.sessions.list({
|
|
39
|
+
userId: argv['user-id'],
|
|
40
|
+
page: argv.page,
|
|
41
|
+
pageSize: argv['page-size'],
|
|
42
|
+
});
|
|
43
|
+
if (argv.json) {
|
|
44
|
+
printJson(result);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const sessions = result.data ?? [];
|
|
48
|
+
if (sessions.length === 0) {
|
|
49
|
+
warn('No active sessions found');
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
printTable(['Session ID', 'User ID', 'IP', 'Last Activity', 'Expires'], sessions.map((s) => [
|
|
53
|
+
truncate(s.sessionId, 12),
|
|
54
|
+
truncate(s.userId, 12),
|
|
55
|
+
s.ipAddress ?? '—',
|
|
56
|
+
formatDate(s.lastActivityAt),
|
|
57
|
+
formatDate(s.expiresAt),
|
|
58
|
+
]));
|
|
59
|
+
success(`${sessions.length} session(s)`);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
handleError(err, argv.verbose);
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
// ── revoke ────────────────────────────────────────────────────────
|
|
66
|
+
.command('revoke <id>', 'Revoke a specific session', (y) => y.positional('id', {
|
|
67
|
+
type: 'string',
|
|
68
|
+
describe: 'Session ID to revoke',
|
|
69
|
+
demandOption: true,
|
|
70
|
+
}), async (argv) => {
|
|
71
|
+
try {
|
|
72
|
+
if (!argv.force) {
|
|
73
|
+
const ok = await confirm(`Revoke session ${truncate(argv.id, 12)}?`);
|
|
74
|
+
if (!ok) {
|
|
75
|
+
warn('Aborted');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const client = createClient(argv);
|
|
80
|
+
await client.sessions.revoke(argv.id);
|
|
81
|
+
if (argv.json) {
|
|
82
|
+
printJson({ revoked: argv.id });
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
success(`Revoked session ${truncate(argv.id, 12)}`);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
handleError(err, argv.verbose);
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
// ── revoke-user ───────────────────────────────────────────────────
|
|
92
|
+
.command('revoke-user <user-id>', 'Revoke all sessions for a user', (y) => y.positional('user-id', {
|
|
93
|
+
type: 'string',
|
|
94
|
+
describe: 'User ID',
|
|
95
|
+
demandOption: true,
|
|
96
|
+
}), async (argv) => {
|
|
97
|
+
try {
|
|
98
|
+
if (!argv.force) {
|
|
99
|
+
const ok = await confirm(`Revoke all sessions for user ${truncate(argv['user-id'], 12)}?`);
|
|
100
|
+
if (!ok) {
|
|
101
|
+
warn('Aborted');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const client = createClient(argv);
|
|
106
|
+
await client.sessions.revokeForUser(argv['user-id']);
|
|
107
|
+
if (argv.json) {
|
|
108
|
+
printJson({ revokedForUser: argv['user-id'] });
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
success(`Revoked all sessions for user ${truncate(argv['user-id'], 12)}`);
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
handleError(err, argv.verbose);
|
|
115
|
+
}
|
|
116
|
+
})
|
|
117
|
+
.demandCommand(1, 'Please specify a sessions subcommand: list, revoke, revoke-user'),
|
|
118
|
+
handler: () => {
|
|
119
|
+
// No-op — subcommands handle execution
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stats command — view dashboard statistics.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* show Display dashboard statistics
|
|
6
|
+
*
|
|
7
|
+
* @module commands/stats
|
|
8
|
+
*/
|
|
9
|
+
import type { CommandModule } from 'yargs';
|
|
10
|
+
import type { GlobalOptions } from '../global-options.js';
|
|
11
|
+
export declare const statsCommand: CommandModule<GlobalOptions, GlobalOptions>;
|
|
12
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAS1D,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,aAAa,EAAE,aAAa,CAwCpE,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stats command — view dashboard statistics.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* show Display dashboard statistics
|
|
6
|
+
*
|
|
7
|
+
* @module commands/stats
|
|
8
|
+
*/
|
|
9
|
+
import { createClient } from '../client-factory.js';
|
|
10
|
+
import { handleError } from '../error-handler.js';
|
|
11
|
+
import { printTable, printJson, success } from '../output.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Command
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
export const statsCommand = {
|
|
16
|
+
command: 'stats',
|
|
17
|
+
describe: 'View dashboard statistics',
|
|
18
|
+
builder: (yargs) => yargs
|
|
19
|
+
.command('show', 'Display dashboard statistics', (y) => y, async (argv) => {
|
|
20
|
+
try {
|
|
21
|
+
const client = createClient(argv);
|
|
22
|
+
const stats = await client.stats.get();
|
|
23
|
+
if (argv.json) {
|
|
24
|
+
printJson(stats);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
printTable(['Metric', 'Total', 'Active'], [
|
|
28
|
+
['Organizations', String(stats.organizations.total), String(stats.organizations.active)],
|
|
29
|
+
['Applications', String(stats.applications.total), String(stats.applications.active)],
|
|
30
|
+
['Clients', String(stats.clients.total), String(stats.clients.active)],
|
|
31
|
+
['Users', String(stats.users.total), String(stats.users.active)],
|
|
32
|
+
['Active Sessions', String(stats.activeSessionCount), '—'],
|
|
33
|
+
['Audit Events', String(stats.auditEventCount), '—'],
|
|
34
|
+
]);
|
|
35
|
+
success('Dashboard statistics');
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
handleError(err, argv.verbose);
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
.demandCommand(1, 'Please specify a stats subcommand: show'),
|
|
42
|
+
handler: () => {
|
|
43
|
+
// No-op — subcommands handle execution
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE9D,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,CAAC,MAAM,YAAY,GAAgD;IACvE,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,2BAA2B;IACrC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CACN,MAAM,EACN,8BAA8B,EAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EACR,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAEvC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,SAAS,CAAC,KAAK,CAAC,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,UAAU,CACR,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAC7B;gBACE,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBACxF,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBACrF,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACtE,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAChE,CAAC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,GAAG,CAAC;gBAC1D,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC;aACrD,CACF,CAAC;YACF,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CACF;SACA,aAAa,CAAC,CAAC,EAAE,yCAAyC,CAAC;IAChE,OAAO,EAAE,GAAG,EAAE;QACZ,uCAAuC;IACzC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI user custom claim value subcommands.
|
|
3
|
+
*
|
|
4
|
+
* Manages custom claim values for users within an organization.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* porta user claims list --org <org-id> <user-id>
|
|
8
|
+
* porta user claims set --org <org-id> <user-id> --claim <claim-id> --value <value>
|
|
9
|
+
* porta user claims remove --org <org-id> <user-id> --claim <claim-id>
|
|
10
|
+
*
|
|
11
|
+
* @module commands/user-claim
|
|
12
|
+
*/
|
|
13
|
+
import type { CommandModule } from 'yargs';
|
|
14
|
+
import type { GlobalOptions } from '../global-options.js';
|
|
15
|
+
/** User claims subcommand group — registered under `user` */
|
|
16
|
+
export declare const userClaimsCommand: CommandModule<GlobalOptions, GlobalOptions>;
|
|
17
|
+
//# sourceMappingURL=user-claim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-claim.d.ts","sourceRoot":"","sources":["../../src/commands/user-claim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA4B1D,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,EAAE,aAAa,CAAC,aAAa,EAAE,aAAa,CA2HzE,CAAC"}
|