@authrim/setup 0.1.4 → 0.1.5

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.
@@ -23,7 +23,7 @@ function printBanner() {
23
23
  console.log('');
24
24
  console.log(chalk.blue('╔═══════════════════════════════════════════════════════════╗'));
25
25
  console.log(chalk.blue('║') +
26
- chalk.bold.white(' 🔐 Authrim Setup v0.1.4 ') +
26
+ chalk.bold.white(' 🔐 Authrim Setup v0.1.5 ') +
27
27
  chalk.blue('║'));
28
28
  console.log(chalk.blue('║') +
29
29
  chalk.gray(' OIDC Provider on Cloudflare Workers ') +
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ const program = new Command();
15
15
  program
16
16
  .name('authrim-setup')
17
17
  .description('CLI tool for setting up Authrim OIDC Provider on Cloudflare Workers')
18
- .version('0.1.4');
18
+ .version('0.1.5');
19
19
  program
20
20
  .command('init', { isDefault: true })
21
21
  .description('Initialize a new Authrim setup')
package/dist/web/ui.d.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  * HTML Template for Authrim Setup Web UI
3
3
  *
4
4
  * A simple, self-contained UI for the setup wizard.
5
+ * Follows the setup flow defined in the design document.
5
6
  */
6
7
  export declare function getHtmlTemplate(sessionToken?: string): string;
7
8
  //# sourceMappingURL=ui.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAuvB7D"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CA0kC7D"}
package/dist/web/ui.js CHANGED
@@ -2,6 +2,7 @@
2
2
  * HTML Template for Authrim Setup Web UI
3
3
  *
4
4
  * A simple, self-contained UI for the setup wizard.
5
+ * Follows the setup flow defined in the design document.
5
6
  */
6
7
  export function getHtmlTemplate(sessionToken) {
7
8
  // Escape token for safe embedding in JavaScript
@@ -90,6 +91,71 @@ export function getHtmlTemplate(sessionToken) {
90
91
  .status-success { background: #d1fae5; color: var(--success); }
91
92
  .status-error { background: #fee2e2; color: var(--error); }
92
93
 
94
+ /* Mode selection cards */
95
+ .mode-cards {
96
+ display: grid;
97
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
98
+ gap: 1rem;
99
+ margin-bottom: 1rem;
100
+ }
101
+
102
+ .mode-card {
103
+ border: 2px solid var(--border);
104
+ border-radius: 12px;
105
+ padding: 1.5rem;
106
+ cursor: pointer;
107
+ transition: all 0.2s;
108
+ position: relative;
109
+ }
110
+
111
+ .mode-card:hover {
112
+ border-color: var(--primary);
113
+ background: #f8fafc;
114
+ }
115
+
116
+ .mode-card.selected {
117
+ border-color: var(--primary);
118
+ background: #eff6ff;
119
+ }
120
+
121
+ .mode-card .mode-icon {
122
+ font-size: 2rem;
123
+ margin-bottom: 0.5rem;
124
+ }
125
+
126
+ .mode-card h3 {
127
+ font-size: 1.1rem;
128
+ margin-bottom: 0.5rem;
129
+ }
130
+
131
+ .mode-card p {
132
+ font-size: 0.875rem;
133
+ color: var(--text-muted);
134
+ margin-bottom: 0.75rem;
135
+ }
136
+
137
+ .mode-card ul {
138
+ font-size: 0.8rem;
139
+ color: var(--text-muted);
140
+ margin-left: 1rem;
141
+ }
142
+
143
+ .mode-card ul li {
144
+ margin-bottom: 0.25rem;
145
+ }
146
+
147
+ .mode-badge {
148
+ position: absolute;
149
+ top: -8px;
150
+ right: 10px;
151
+ background: var(--primary);
152
+ color: white;
153
+ font-size: 0.7rem;
154
+ padding: 0.2rem 0.5rem;
155
+ border-radius: 4px;
156
+ font-weight: 500;
157
+ }
158
+
93
159
  .form-group {
94
160
  margin-bottom: 1rem;
95
161
  }
@@ -102,6 +168,7 @@ export function getHtmlTemplate(sessionToken) {
102
168
 
103
169
  input[type="text"],
104
170
  input[type="password"],
171
+ input[type="file"],
105
172
  select {
106
173
  width: 100%;
107
174
  padding: 0.75rem;
@@ -257,6 +324,46 @@ export function getHtmlTemplate(sessionToken) {
257
324
  color: var(--primary);
258
325
  }
259
326
 
327
+ .file-input-wrapper {
328
+ position: relative;
329
+ overflow: hidden;
330
+ display: inline-block;
331
+ }
332
+
333
+ .file-input-wrapper input[type=file] {
334
+ position: absolute;
335
+ left: 0;
336
+ top: 0;
337
+ opacity: 0;
338
+ cursor: pointer;
339
+ width: 100%;
340
+ height: 100%;
341
+ }
342
+
343
+ .file-input-btn {
344
+ display: inline-block;
345
+ padding: 0.75rem 1.5rem;
346
+ background: var(--border);
347
+ color: var(--text);
348
+ border-radius: 8px;
349
+ cursor: pointer;
350
+ }
351
+
352
+ .file-input-btn:hover {
353
+ background: #cbd5e1;
354
+ }
355
+
356
+ .config-preview {
357
+ background: var(--bg);
358
+ border-radius: 8px;
359
+ padding: 1rem;
360
+ margin-top: 1rem;
361
+ font-family: 'Monaco', 'Menlo', monospace;
362
+ font-size: 0.8rem;
363
+ max-height: 200px;
364
+ overflow-y: auto;
365
+ }
366
+
260
367
  .hidden { display: none; }
261
368
  </style>
262
369
  </head>
@@ -267,7 +374,7 @@ export function getHtmlTemplate(sessionToken) {
267
374
  <p class="subtitle">OIDC Provider on Cloudflare Workers</p>
268
375
  </header>
269
376
 
270
- <div class="step-indicator">
377
+ <div class="step-indicator" id="step-indicator">
271
378
  <div class="step step-active" id="step-1">1</div>
272
379
  <div class="step-connector"></div>
273
380
  <div class="step step-pending" id="step-2">2</div>
@@ -288,6 +395,85 @@ export function getHtmlTemplate(sessionToken) {
288
395
  </div>
289
396
  </div>
290
397
 
398
+ <!-- Step 1.5: Top Menu (New Setup / Load Config) -->
399
+ <div id="section-top-menu" class="card hidden">
400
+ <h2 class="card-title">Get Started</h2>
401
+ <p style="margin-bottom: 1.5rem; color: var(--text-muted);">Choose an option to continue:</p>
402
+
403
+ <div class="mode-cards">
404
+ <div class="mode-card" id="menu-new-setup">
405
+ <div class="mode-icon">🆕</div>
406
+ <h3>New Setup</h3>
407
+ <p>Create a new Authrim deployment from scratch</p>
408
+ </div>
409
+
410
+ <div class="mode-card" id="menu-load-config">
411
+ <div class="mode-icon">📂</div>
412
+ <h3>Load Existing Config</h3>
413
+ <p>Resume or redeploy using an existing authrim-config.json</p>
414
+ </div>
415
+ </div>
416
+ </div>
417
+
418
+ <!-- Step 1.6: Setup Mode Selection (Quick / Custom) -->
419
+ <div id="section-mode" class="card hidden">
420
+ <h2 class="card-title">Setup Mode</h2>
421
+ <p style="margin-bottom: 1.5rem; color: var(--text-muted);">Choose how you want to set up Authrim:</p>
422
+
423
+ <div class="mode-cards">
424
+ <div class="mode-card" id="mode-quick">
425
+ <div class="mode-icon">⚡</div>
426
+ <h3>Quick Setup</h3>
427
+ <p>Get started in ~5 minutes</p>
428
+ <ul>
429
+ <li>Environment selection</li>
430
+ <li>Optional custom domain</li>
431
+ <li>Default components</li>
432
+ </ul>
433
+ <span class="mode-badge">Recommended</span>
434
+ </div>
435
+
436
+ <div class="mode-card" id="mode-custom">
437
+ <div class="mode-icon">🔧</div>
438
+ <h3>Custom Setup</h3>
439
+ <p>Full control over configuration</p>
440
+ <ul>
441
+ <li>Component selection</li>
442
+ <li>URL configuration</li>
443
+ <li>Advanced settings</li>
444
+ </ul>
445
+ </div>
446
+ </div>
447
+
448
+ <div class="button-group">
449
+ <button class="btn-secondary" id="btn-back-top">Back</button>
450
+ </div>
451
+ </div>
452
+
453
+ <!-- Step 1.7: Load Config -->
454
+ <div id="section-load-config" class="card hidden">
455
+ <h2 class="card-title">Load Configuration</h2>
456
+ <p style="margin-bottom: 1rem; color: var(--text-muted);">Select your authrim-config.json file:</p>
457
+
458
+ <div class="form-group">
459
+ <div class="file-input-wrapper">
460
+ <span class="file-input-btn">📁 Choose File</span>
461
+ <input type="file" id="config-file" accept=".json">
462
+ </div>
463
+ <span id="config-file-name" style="margin-left: 1rem; color: var(--text-muted);"></span>
464
+ </div>
465
+
466
+ <div id="config-preview-section" class="hidden">
467
+ <h3 style="font-size: 1rem; margin-bottom: 0.5rem;">Configuration Preview</h3>
468
+ <div class="config-preview" id="config-preview"></div>
469
+ </div>
470
+
471
+ <div class="button-group">
472
+ <button class="btn-secondary" id="btn-back-top-2">Back</button>
473
+ <button class="btn-primary" id="btn-load-config" disabled>Load & Continue</button>
474
+ </div>
475
+ </div>
476
+
291
477
  <!-- Step 2: Configuration -->
292
478
  <div id="section-config" class="card hidden">
293
479
  <h2 class="card-title">Configuration</h2>
@@ -298,40 +484,55 @@ export function getHtmlTemplate(sessionToken) {
298
484
  <option value="prod">Production (prod)</option>
299
485
  <option value="staging">Staging</option>
300
486
  <option value="dev">Development (dev)</option>
487
+ <option value="custom">Custom...</option>
301
488
  </select>
302
489
  </div>
303
490
 
491
+ <div class="form-group hidden" id="custom-env-group">
492
+ <label for="custom-env">Custom Environment Name</label>
493
+ <input type="text" id="custom-env" placeholder="e.g., test, demo, myenv">
494
+ <small style="color: var(--text-muted)">Lowercase letters, numbers, and hyphens only</small>
495
+ </div>
496
+
304
497
  <div class="form-group">
305
498
  <label for="domain">Custom Domain (optional)</label>
306
499
  <input type="text" id="domain" placeholder="auth.example.com">
307
500
  <small style="color: var(--text-muted)">Leave empty to use workers.dev / pages.dev</small>
308
501
  </div>
309
502
 
310
- <h3 style="margin: 1.5rem 0 1rem; font-size: 1rem;">Components</h3>
311
- <div class="checkbox-group">
312
- <label class="checkbox-item">
313
- <input type="checkbox" id="comp-api" checked disabled>
314
- API (required)
315
- </label>
316
- <label class="checkbox-item">
317
- <input type="checkbox" id="comp-login-ui" checked>
318
- Login UI
319
- </label>
320
- <label class="checkbox-item">
321
- <input type="checkbox" id="comp-admin-ui" checked>
322
- Admin UI
323
- </label>
324
- <label class="checkbox-item">
325
- <input type="checkbox" id="comp-saml">
326
- SAML IdP
327
- </label>
328
- <label class="checkbox-item">
329
- <input type="checkbox" id="comp-vc">
330
- Verifiable Credentials
331
- </label>
503
+ <!-- Advanced options (shown in custom mode) -->
504
+ <div id="advanced-options" class="hidden">
505
+ <h3 style="margin: 1.5rem 0 1rem; font-size: 1rem;">Components</h3>
506
+ <div class="checkbox-group">
507
+ <label class="checkbox-item">
508
+ <input type="checkbox" id="comp-api" checked disabled>
509
+ API (required)
510
+ </label>
511
+ <label class="checkbox-item">
512
+ <input type="checkbox" id="comp-login-ui" checked>
513
+ Login UI
514
+ </label>
515
+ <label class="checkbox-item">
516
+ <input type="checkbox" id="comp-admin-ui" checked>
517
+ Admin UI
518
+ </label>
519
+ <label class="checkbox-item">
520
+ <input type="checkbox" id="comp-saml">
521
+ SAML IdP
522
+ </label>
523
+ <label class="checkbox-item">
524
+ <input type="checkbox" id="comp-async">
525
+ Device Flow / CIBA
526
+ </label>
527
+ <label class="checkbox-item">
528
+ <input type="checkbox" id="comp-vc">
529
+ Verifiable Credentials
530
+ </label>
531
+ </div>
332
532
  </div>
333
533
 
334
534
  <div class="button-group">
535
+ <button class="btn-secondary" id="btn-back-mode">Back</button>
335
536
  <button class="btn-primary" id="btn-configure">Continue</button>
336
537
  </div>
337
538
  </div>
@@ -382,7 +583,7 @@ export function getHtmlTemplate(sessionToken) {
382
583
  <!-- Complete -->
383
584
  <div id="section-complete" class="card hidden">
384
585
  <h2 class="card-title" style="color: var(--success);">
385
- Setup Complete!
586
+ Setup Complete!
386
587
  </h2>
387
588
 
388
589
  <p>Authrim has been successfully deployed.</p>
@@ -394,7 +595,8 @@ export function getHtmlTemplate(sessionToken) {
394
595
  <div class="alert alert-info" style="margin-top: 1rem;">
395
596
  <strong>Next Steps:</strong>
396
597
  <ol style="margin-left: 1.5rem; margin-top: 0.5rem;">
397
- <li>Visit the Admin UI to create your first client</li>
598
+ <li>Visit the setup URL to create your first admin account</li>
599
+ <li>Log in to the Admin UI to create OAuth clients</li>
398
600
  <li>Configure your application to use the OIDC endpoints</li>
399
601
  </ol>
400
602
  </div>
@@ -407,7 +609,9 @@ export function getHtmlTemplate(sessionToken) {
407
609
 
408
610
  // State
409
611
  let currentStep = 1;
612
+ let setupMode = 'quick'; // 'quick' or 'custom'
410
613
  let config = {};
614
+ let loadedConfig = null;
411
615
 
412
616
  // Elements
413
617
  const steps = {
@@ -419,6 +623,9 @@ export function getHtmlTemplate(sessionToken) {
419
623
 
420
624
  const sections = {
421
625
  prerequisites: document.getElementById('section-prerequisites'),
626
+ topMenu: document.getElementById('section-top-menu'),
627
+ mode: document.getElementById('section-mode'),
628
+ loadConfig: document.getElementById('section-load-config'),
422
629
  config: document.getElementById('section-config'),
423
630
  provision: document.getElementById('section-provision'),
424
631
  deploy: document.getElementById('section-deploy'),
@@ -512,6 +719,9 @@ export function getHtmlTemplate(sessionToken) {
512
719
  const code = document.createElement('code');
513
720
  code.style.display = 'block';
514
721
  code.style.marginTop = '0.5rem';
722
+ code.style.padding = '0.5rem';
723
+ code.style.background = '#f1f5f9';
724
+ code.style.borderRadius = '4px';
515
725
  code.textContent = 'npm install -g wrangler';
516
726
  alertDiv.appendChild(code);
517
727
 
@@ -537,6 +747,9 @@ export function getHtmlTemplate(sessionToken) {
537
747
  const code = document.createElement('code');
538
748
  code.style.display = 'block';
539
749
  code.style.marginTop = '0.5rem';
750
+ code.style.padding = '0.5rem';
751
+ code.style.background = '#f1f5f9';
752
+ code.style.borderRadius = '4px';
540
753
  code.textContent = 'wrangler login';
541
754
  alertDiv.appendChild(code);
542
755
 
@@ -556,11 +769,11 @@ export function getHtmlTemplate(sessionToken) {
556
769
  alertDiv.className = 'alert alert-success';
557
770
 
558
771
  const p1 = document.createElement('p');
559
- p1.textContent = 'Wrangler installed';
772
+ p1.textContent = 'Wrangler installed';
560
773
  alertDiv.appendChild(p1);
561
774
 
562
775
  const p2 = document.createElement('p');
563
- p2.textContent = 'Logged in as ' + (result.auth.email || 'Unknown');
776
+ p2.textContent = 'Logged in as ' + (result.auth.email || 'Unknown');
564
777
  alertDiv.appendChild(p2);
565
778
 
566
779
  prereqContent.appendChild(alertDiv);
@@ -570,8 +783,8 @@ export function getHtmlTemplate(sessionToken) {
570
783
 
571
784
  const btn = document.createElement('button');
572
785
  btn.className = 'btn-primary';
573
- btn.textContent = 'Start Setup';
574
- btn.addEventListener('click', startSetup);
786
+ btn.textContent = 'Continue';
787
+ btn.addEventListener('click', showTopMenu);
575
788
  buttonGroup.appendChild(btn);
576
789
 
577
790
  prereqContent.appendChild(buttonGroup);
@@ -586,15 +799,134 @@ export function getHtmlTemplate(sessionToken) {
586
799
  }
587
800
  }
588
801
 
589
- // Start setup
590
- function startSetup() {
802
+ // Show top menu
803
+ function showTopMenu() {
804
+ showSection('topMenu');
805
+ }
806
+
807
+ // Top menu handlers
808
+ document.getElementById('menu-new-setup').addEventListener('click', () => {
809
+ showSection('mode');
810
+ });
811
+
812
+ document.getElementById('menu-load-config').addEventListener('click', () => {
813
+ showSection('loadConfig');
814
+ });
815
+
816
+ // Setup mode handlers
817
+ document.getElementById('mode-quick').addEventListener('click', () => {
818
+ setupMode = 'quick';
819
+ document.getElementById('mode-quick').classList.add('selected');
820
+ document.getElementById('mode-custom').classList.remove('selected');
821
+ document.getElementById('advanced-options').classList.add('hidden');
591
822
  setStep(2);
592
823
  showSection('config');
593
- }
824
+ });
825
+
826
+ document.getElementById('mode-custom').addEventListener('click', () => {
827
+ setupMode = 'custom';
828
+ document.getElementById('mode-custom').classList.add('selected');
829
+ document.getElementById('mode-quick').classList.remove('selected');
830
+ document.getElementById('advanced-options').classList.remove('hidden');
831
+ setStep(2);
832
+ showSection('config');
833
+ });
834
+
835
+ document.getElementById('btn-back-top').addEventListener('click', () => {
836
+ showSection('topMenu');
837
+ });
838
+
839
+ document.getElementById('btn-back-top-2').addEventListener('click', () => {
840
+ showSection('topMenu');
841
+ });
842
+
843
+ // Load config handlers
844
+ document.getElementById('config-file').addEventListener('change', (e) => {
845
+ const file = e.target.files[0];
846
+ if (!file) return;
847
+
848
+ document.getElementById('config-file-name').textContent = file.name;
849
+
850
+ const reader = new FileReader();
851
+ reader.onload = (event) => {
852
+ try {
853
+ loadedConfig = JSON.parse(event.target.result);
854
+ document.getElementById('config-preview').textContent = JSON.stringify(loadedConfig, null, 2);
855
+ document.getElementById('config-preview-section').classList.remove('hidden');
856
+ document.getElementById('btn-load-config').disabled = false;
857
+ } catch (err) {
858
+ alert('Invalid JSON file: ' + err.message);
859
+ loadedConfig = null;
860
+ document.getElementById('btn-load-config').disabled = true;
861
+ }
862
+ };
863
+ reader.readAsText(file);
864
+ });
865
+
866
+ document.getElementById('btn-load-config').addEventListener('click', async () => {
867
+ if (!loadedConfig) return;
868
+
869
+ // Use loaded config
870
+ config = {
871
+ env: loadedConfig.environment?.prefix || 'prod',
872
+ domain: loadedConfig.urls?.api?.custom || null,
873
+ components: loadedConfig.components || {
874
+ api: true,
875
+ loginUi: true,
876
+ adminUi: true,
877
+ saml: false,
878
+ async: false,
879
+ vc: false,
880
+ },
881
+ };
882
+
883
+ // Set form values
884
+ const envSelect = document.getElementById('env');
885
+ if (['prod', 'staging', 'dev'].includes(config.env)) {
886
+ envSelect.value = config.env;
887
+ } else {
888
+ envSelect.value = 'custom';
889
+ document.getElementById('custom-env').value = config.env;
890
+ document.getElementById('custom-env-group').classList.remove('hidden');
891
+ }
892
+ document.getElementById('domain').value = config.domain || '';
893
+
894
+ // Skip to provisioning if resources already exist
895
+ if (loadedConfig.resources) {
896
+ setStep(4);
897
+ showSection('deploy');
898
+ } else {
899
+ setStep(3);
900
+ showSection('provision');
901
+ }
902
+ });
903
+
904
+ // Environment dropdown handler
905
+ document.getElementById('env').addEventListener('change', (e) => {
906
+ const customGroup = document.getElementById('custom-env-group');
907
+ if (e.target.value === 'custom') {
908
+ customGroup.classList.remove('hidden');
909
+ } else {
910
+ customGroup.classList.add('hidden');
911
+ }
912
+ });
913
+
914
+ // Configuration handlers
915
+ document.getElementById('btn-back-mode').addEventListener('click', () => {
916
+ setStep(1);
917
+ showSection('mode');
918
+ });
594
919
 
595
- // Configure
596
920
  document.getElementById('btn-configure').addEventListener('click', async () => {
597
- const env = document.getElementById('env').value;
921
+ let env = document.getElementById('env').value;
922
+ if (env === 'custom') {
923
+ env = document.getElementById('custom-env').value.toLowerCase().replace(/[^a-z0-9-]/g, '');
924
+ if (!env) {
925
+ alert('Please enter a valid environment name');
926
+ return;
927
+ }
928
+ }
929
+
598
930
  const domain = document.getElementById('domain').value;
599
931
 
600
932
  config = {
@@ -602,10 +934,11 @@ export function getHtmlTemplate(sessionToken) {
602
934
  domain: domain || null,
603
935
  components: {
604
936
  api: true,
605
- loginUi: document.getElementById('comp-login-ui').checked,
606
- adminUi: document.getElementById('comp-admin-ui').checked,
607
- saml: document.getElementById('comp-saml').checked,
608
- vc: document.getElementById('comp-vc').checked,
937
+ loginUi: setupMode === 'quick' || document.getElementById('comp-login-ui').checked,
938
+ adminUi: setupMode === 'quick' || document.getElementById('comp-admin-ui').checked,
939
+ saml: setupMode === 'custom' && document.getElementById('comp-saml').checked,
940
+ async: setupMode === 'custom' && document.getElementById('comp-async').checked,
941
+ vc: setupMode === 'custom' && document.getElementById('comp-vc').checked,
609
942
  },
610
943
  };
611
944
 
@@ -644,7 +977,7 @@ export function getHtmlTemplate(sessionToken) {
644
977
  method: 'POST',
645
978
  body: { keyId: config.env + '-key-' + Date.now() },
646
979
  });
647
- output.textContent += 'Keys generated\\n\\n';
980
+ output.textContent += 'Keys generated\\n\\n';
648
981
 
649
982
  // Provision resources
650
983
  output.textContent += 'Provisioning Cloudflare resources...\\n';
@@ -654,7 +987,7 @@ export function getHtmlTemplate(sessionToken) {
654
987
  });
655
988
 
656
989
  if (result.success) {
657
- output.textContent += '\\nProvisioning complete!\\n';
990
+ output.textContent += '\\n✓ Provisioning complete!\\n';
658
991
  status.textContent = 'Complete';
659
992
  status.className = 'status-badge status-success';
660
993
 
@@ -664,7 +997,7 @@ export function getHtmlTemplate(sessionToken) {
664
997
  throw new Error(result.error);
665
998
  }
666
999
  } catch (error) {
667
- output.textContent += '\\nError: ' + error.message + '\\n';
1000
+ output.textContent += '\\n✗ Error: ' + error.message + '\\n';
668
1001
  status.textContent = 'Error';
669
1002
  status.className = 'status-badge status-error';
670
1003
  btn.disabled = false;
@@ -696,7 +1029,7 @@ export function getHtmlTemplate(sessionToken) {
696
1029
  method: 'POST',
697
1030
  body: { env: config.env },
698
1031
  });
699
- output.textContent += 'Config files generated\\n\\n';
1032
+ output.textContent += 'Config files generated\\n\\n';
700
1033
 
701
1034
  // Start deployment
702
1035
  output.textContent += 'Deploying workers...\\n';
@@ -704,7 +1037,7 @@ export function getHtmlTemplate(sessionToken) {
704
1037
  // Poll for status updates
705
1038
  const pollInterval = setInterval(async () => {
706
1039
  const statusResult = await api('/deploy/status');
707
- if (statusResult.progress.length > 0) {
1040
+ if (statusResult.progress && statusResult.progress.length > 0) {
708
1041
  output.textContent = statusResult.progress.join('\\n') + '\\n';
709
1042
  }
710
1043
  }, 1000);
@@ -720,17 +1053,17 @@ export function getHtmlTemplate(sessionToken) {
720
1053
  clearInterval(pollInterval);
721
1054
 
722
1055
  if (result.success) {
723
- output.textContent += '\\nDeployment complete!\\n';
1056
+ output.textContent += '\\n✓ Deployment complete!\\n';
724
1057
  status.textContent = 'Complete';
725
1058
  status.className = 'status-badge status-success';
726
1059
 
727
1060
  // Show completion
728
- showComplete();
1061
+ showComplete(result);
729
1062
  } else {
730
1063
  throw new Error(result.error || 'Deployment failed');
731
1064
  }
732
1065
  } catch (error) {
733
- output.textContent += '\\nError: ' + error.message + '\\n';
1066
+ output.textContent += '\\n✗ Error: ' + error.message + '\\n';
734
1067
  status.textContent = 'Error';
735
1068
  status.className = 'status-badge status-error';
736
1069
  btn.disabled = false;
@@ -738,7 +1071,7 @@ export function getHtmlTemplate(sessionToken) {
738
1071
  });
739
1072
 
740
1073
  // Show completion
741
- function showComplete() {
1074
+ function showComplete(result) {
742
1075
  const urlsEl = document.getElementById('urls');
743
1076
  const env = config.env;
744
1077
  const domain = config.domain;
@@ -753,6 +1086,13 @@ export function getHtmlTemplate(sessionToken) {
753
1086
  urlsEl.appendChild(createUrlItem('Login UI:', loginUrl));
754
1087
  urlsEl.appendChild(createUrlItem('Admin UI:', adminUrl));
755
1088
 
1089
+ // Add setup URL if available
1090
+ if (result && result.setupUrl) {
1091
+ const setupItem = createUrlItem('Admin Setup:', result.setupUrl);
1092
+ setupItem.querySelector('a').style.fontWeight = 'bold';
1093
+ urlsEl.appendChild(setupItem);
1094
+ }
1095
+
756
1096
  showSection('complete');
757
1097
  }
758
1098
 
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,eAAe,CAAC,YAAqB;IACnD,gDAAgD;IAChD,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1E,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA6YoB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAqW9B,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,eAAe,CAAC,YAAqB;IACnD,gDAAgD;IAChD,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1E,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAslBoB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA+e9B,CAAC;AACT,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@authrim/setup",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "CLI tool for setting up Authrim OIDC Provider on Cloudflare Workers",
5
5
  "type": "module",
6
6
  "bin": {