@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.
Files changed (157) hide show
  1. package/dist/auth/browser-flow.d.ts +42 -0
  2. package/dist/auth/browser-flow.d.ts.map +1 -0
  3. package/dist/auth/browser-flow.js +193 -0
  4. package/dist/auth/browser-flow.js.map +1 -0
  5. package/dist/auth/callback-server.d.ts +81 -0
  6. package/dist/auth/callback-server.d.ts.map +1 -0
  7. package/dist/auth/callback-server.js +193 -0
  8. package/dist/auth/callback-server.js.map +1 -0
  9. package/dist/auth/metadata.d.ts +43 -0
  10. package/dist/auth/metadata.d.ts.map +1 -0
  11. package/dist/auth/metadata.js +66 -0
  12. package/dist/auth/metadata.js.map +1 -0
  13. package/dist/auth/pkce.d.ts +42 -0
  14. package/dist/auth/pkce.d.ts.map +1 -0
  15. package/dist/auth/pkce.js +52 -0
  16. package/dist/auth/pkce.js.map +1 -0
  17. package/dist/auth/types.d.ts +72 -0
  18. package/dist/auth/types.d.ts.map +1 -0
  19. package/dist/auth/types.js +11 -0
  20. package/dist/auth/types.js.map +1 -0
  21. package/dist/client-factory.d.ts +29 -0
  22. package/dist/client-factory.d.ts.map +1 -0
  23. package/dist/client-factory.js +43 -0
  24. package/dist/client-factory.js.map +1 -0
  25. package/dist/commands/app-claim.d.ts +9 -0
  26. package/dist/commands/app-claim.d.ts.map +1 -0
  27. package/dist/commands/app-claim.js +128 -0
  28. package/dist/commands/app-claim.js.map +1 -0
  29. package/dist/commands/app-module.d.ts +9 -0
  30. package/dist/commands/app-module.d.ts.map +1 -0
  31. package/dist/commands/app-module.js +104 -0
  32. package/dist/commands/app-module.js.map +1 -0
  33. package/dist/commands/app-permission.d.ts +9 -0
  34. package/dist/commands/app-permission.d.ts.map +1 -0
  35. package/dist/commands/app-permission.js +118 -0
  36. package/dist/commands/app-permission.js.map +1 -0
  37. package/dist/commands/app-role.d.ts +9 -0
  38. package/dist/commands/app-role.d.ts.map +1 -0
  39. package/dist/commands/app-role.js +166 -0
  40. package/dist/commands/app-role.js.map +1 -0
  41. package/dist/commands/app.d.ts +12 -0
  42. package/dist/commands/app.d.ts.map +1 -0
  43. package/dist/commands/app.js +255 -0
  44. package/dist/commands/app.js.map +1 -0
  45. package/dist/commands/audit.d.ts +12 -0
  46. package/dist/commands/audit.d.ts.map +1 -0
  47. package/dist/commands/audit.js +96 -0
  48. package/dist/commands/audit.js.map +1 -0
  49. package/dist/commands/bulk.d.ts +12 -0
  50. package/dist/commands/bulk.d.ts.map +1 -0
  51. package/dist/commands/bulk.js +77 -0
  52. package/dist/commands/bulk.js.map +1 -0
  53. package/dist/commands/client-secret.d.ts +18 -0
  54. package/dist/commands/client-secret.d.ts.map +1 -0
  55. package/dist/commands/client-secret.js +126 -0
  56. package/dist/commands/client-secret.js.map +1 -0
  57. package/dist/commands/client.d.ts +27 -0
  58. package/dist/commands/client.d.ts.map +1 -0
  59. package/dist/commands/client.js +385 -0
  60. package/dist/commands/client.js.map +1 -0
  61. package/dist/commands/completion.d.ts +27 -0
  62. package/dist/commands/completion.d.ts.map +1 -0
  63. package/dist/commands/completion.js +42 -0
  64. package/dist/commands/completion.js.map +1 -0
  65. package/dist/commands/config.d.ts +14 -0
  66. package/dist/commands/config.d.ts.map +1 -0
  67. package/dist/commands/config.js +85 -0
  68. package/dist/commands/config.js.map +1 -0
  69. package/dist/commands/doctor.d.ts +25 -0
  70. package/dist/commands/doctor.d.ts.map +1 -0
  71. package/dist/commands/doctor.js +198 -0
  72. package/dist/commands/doctor.js.map +1 -0
  73. package/dist/commands/exports.d.ts +12 -0
  74. package/dist/commands/exports.d.ts.map +1 -0
  75. package/dist/commands/exports.js +80 -0
  76. package/dist/commands/exports.js.map +1 -0
  77. package/dist/commands/health.d.ts +12 -0
  78. package/dist/commands/health.d.ts.map +1 -0
  79. package/dist/commands/health.js +53 -0
  80. package/dist/commands/health.js.map +1 -0
  81. package/dist/commands/keys.d.ts +14 -0
  82. package/dist/commands/keys.d.ts.map +1 -0
  83. package/dist/commands/keys.js +91 -0
  84. package/dist/commands/keys.js.map +1 -0
  85. package/dist/commands/login.d.ts +36 -0
  86. package/dist/commands/login.d.ts.map +1 -0
  87. package/dist/commands/login.js +78 -0
  88. package/dist/commands/login.js.map +1 -0
  89. package/dist/commands/logout.d.ts +25 -0
  90. package/dist/commands/logout.d.ts.map +1 -0
  91. package/dist/commands/logout.js +43 -0
  92. package/dist/commands/logout.js.map +1 -0
  93. package/dist/commands/org.d.ts +26 -0
  94. package/dist/commands/org.d.ts.map +1 -0
  95. package/dist/commands/org.js +396 -0
  96. package/dist/commands/org.js.map +1 -0
  97. package/dist/commands/provision.d.ts +47 -0
  98. package/dist/commands/provision.d.ts.map +1 -0
  99. package/dist/commands/provision.js +400 -0
  100. package/dist/commands/provision.js.map +1 -0
  101. package/dist/commands/sessions.d.ts +14 -0
  102. package/dist/commands/sessions.d.ts.map +1 -0
  103. package/dist/commands/sessions.js +122 -0
  104. package/dist/commands/sessions.js.map +1 -0
  105. package/dist/commands/stats.d.ts +12 -0
  106. package/dist/commands/stats.d.ts.map +1 -0
  107. package/dist/commands/stats.js +46 -0
  108. package/dist/commands/stats.js.map +1 -0
  109. package/dist/commands/user-claim.d.ts +17 -0
  110. package/dist/commands/user-claim.d.ts.map +1 -0
  111. package/dist/commands/user-claim.js +123 -0
  112. package/dist/commands/user-claim.js.map +1 -0
  113. package/dist/commands/user-role.d.ts +17 -0
  114. package/dist/commands/user-role.d.ts.map +1 -0
  115. package/dist/commands/user-role.js +118 -0
  116. package/dist/commands/user-role.js.map +1 -0
  117. package/dist/commands/user.d.ts +26 -0
  118. package/dist/commands/user.d.ts.map +1 -0
  119. package/dist/commands/user.js +352 -0
  120. package/dist/commands/user.js.map +1 -0
  121. package/dist/commands/version.d.ts +25 -0
  122. package/dist/commands/version.d.ts.map +1 -0
  123. package/dist/commands/version.js +83 -0
  124. package/dist/commands/version.js.map +1 -0
  125. package/dist/commands/whoami.d.ts +26 -0
  126. package/dist/commands/whoami.d.ts.map +1 -0
  127. package/dist/commands/whoami.js +66 -0
  128. package/dist/commands/whoami.js.map +1 -0
  129. package/dist/credential-store.d.ts +101 -0
  130. package/dist/credential-store.d.ts.map +1 -0
  131. package/dist/credential-store.js +121 -0
  132. package/dist/credential-store.js.map +1 -0
  133. package/dist/error-handler.d.ts +47 -0
  134. package/dist/error-handler.d.ts.map +1 -0
  135. package/dist/error-handler.js +166 -0
  136. package/dist/error-handler.js.map +1 -0
  137. package/dist/global-options.d.ts +50 -0
  138. package/dist/global-options.d.ts.map +1 -0
  139. package/dist/global-options.js +62 -0
  140. package/dist/global-options.js.map +1 -0
  141. package/dist/index.d.ts +29 -0
  142. package/dist/index.d.ts.map +1 -0
  143. package/dist/index.js +122 -0
  144. package/dist/index.js.map +1 -0
  145. package/dist/output.d.ts +75 -0
  146. package/dist/output.d.ts.map +1 -0
  147. package/dist/output.js +100 -0
  148. package/dist/output.js.map +1 -0
  149. package/dist/parsers.d.ts +74 -0
  150. package/dist/parsers.d.ts.map +1 -0
  151. package/dist/parsers.js +125 -0
  152. package/dist/parsers.js.map +1 -0
  153. package/dist/prompt.d.ts +50 -0
  154. package/dist/prompt.d.ts.map +1 -0
  155. package/dist/prompt.js +98 -0
  156. package/dist/prompt.js.map +1 -0
  157. 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"}