@authrim/setup 0.1.60 → 0.1.62

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/web/ui.js CHANGED
@@ -91,6 +91,7 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
91
91
  .status-running { background: #dbeafe; color: var(--primary); }
92
92
  .status-success { background: #d1fae5; color: var(--success); }
93
93
  .status-error { background: #fee2e2; color: var(--error); }
94
+ .status-warning { background: #fef3c7; color: #b45309; }
94
95
 
95
96
  /* Mode selection cards */
96
97
  .mode-cards {
@@ -997,7 +998,19 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
997
998
 
998
999
  <div id="config-preview-section" class="hidden">
999
1000
  <h3 style="font-size: 1rem; margin-bottom: 0.5rem;">Configuration Preview</h3>
1000
- <div class="config-preview" id="config-preview"></div>
1001
+ <div class="config-preview" id="config-preview-content"></div>
1002
+ </div>
1003
+
1004
+ <div id="config-validation-error" class="hidden" style="margin-top: 1rem; padding: 1rem; background: #fee2e2; border: 1px solid #fca5a5; border-radius: 8px;">
1005
+ <div style="display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem;">
1006
+ <span style="font-size: 1.25rem;">⚠️</span>
1007
+ <strong style="color: #b91c1c;">Configuration Validation Failed</strong>
1008
+ </div>
1009
+ <ul id="config-validation-errors" style="margin: 0; padding-left: 1.5rem; color: #991b1b; font-size: 0.875rem;"></ul>
1010
+ </div>
1011
+
1012
+ <div id="config-validation-success" class="hidden" style="margin-top: 1rem; padding: 0.75rem 1rem; background: #d1fae5; border: 1px solid #6ee7b7; border-radius: 8px;">
1013
+ <span style="color: #065f46;">✓ Configuration is valid</span>
1001
1014
  </div>
1002
1015
 
1003
1016
  <div class="button-group">
@@ -1556,6 +1569,31 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
1556
1569
  </div>
1557
1570
  </div>
1558
1571
 
1572
+ <!-- Admin Setup Section -->
1573
+ <div id="admin-setup-section" class="resource-section hidden" style="margin-top: 1.5rem; padding: 1rem; background: #fef3c7; border-radius: 8px; border: 1px solid #fcd34d;">
1574
+ <div style="display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem;">
1575
+ <span style="font-size: 1.5rem;">⚠️</span>
1576
+ <div>
1577
+ <div style="font-weight: 600; color: #92400e;">Admin Account Not Configured</div>
1578
+ <div style="font-size: 0.875rem; color: #a16207;">Initial administrator has not been set up for this environment.</div>
1579
+ </div>
1580
+ </div>
1581
+ <button class="btn-primary" id="btn-start-admin-setup" style="margin-top: 0.5rem;">
1582
+ 🔐 Start Admin Account Setup with Passkey
1583
+ </button>
1584
+ <div id="admin-setup-result" class="hidden" style="margin-top: 1rem; padding: 0.75rem; background: white; border-radius: 6px;">
1585
+ <div style="font-weight: 500; margin-bottom: 0.5rem;">Setup URL Generated:</div>
1586
+ <div style="display: flex; gap: 0.5rem; align-items: center;">
1587
+ <input type="text" id="admin-setup-url" readonly style="flex: 1; padding: 0.5rem; border: 1px solid #d1d5db; border-radius: 4px; font-family: monospace; font-size: 0.875rem;">
1588
+ <button class="btn-secondary" id="btn-copy-setup-url" style="white-space: nowrap;">📋 Copy</button>
1589
+ <a id="btn-open-setup-url" href="#" target="_blank" class="btn-primary" style="text-decoration: none; white-space: nowrap;">🔗 Open</a>
1590
+ </div>
1591
+ <div style="font-size: 0.75rem; color: #6b7280; margin-top: 0.5rem;">
1592
+ This URL is valid for 1 hour. Open it in a browser to register the first admin account.
1593
+ </div>
1594
+ </div>
1595
+ </div>
1596
+
1559
1597
  <div class="button-group">
1560
1598
  <button class="btn-secondary" id="btn-back-env-detail">← Back to List</button>
1561
1599
  <button class="btn-danger" id="btn-delete-from-detail">🗑️ Delete Environment...</button>
@@ -1929,23 +1967,76 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
1929
1967
  });
1930
1968
 
1931
1969
  // Load config handlers
1932
- document.getElementById('config-file').addEventListener('change', (e) => {
1970
+ document.getElementById('config-file').addEventListener('change', async (e) => {
1933
1971
  const file = e.target.files[0];
1934
1972
  if (!file) return;
1935
1973
 
1936
1974
  document.getElementById('config-file-name').textContent = file.name;
1937
1975
 
1976
+ // Reset validation display
1977
+ document.getElementById('config-validation-error').classList.add('hidden');
1978
+ document.getElementById('config-validation-success').classList.add('hidden');
1979
+ document.getElementById('config-preview-section').classList.add('hidden');
1980
+ document.getElementById('btn-load-config').disabled = true;
1981
+
1938
1982
  const reader = new FileReader();
1939
- reader.onload = (event) => {
1983
+ reader.onload = async (event) => {
1984
+ let rawConfig;
1940
1985
  try {
1941
- loadedConfig = JSON.parse(event.target.result);
1942
- document.getElementById('config-preview').textContent = JSON.stringify(loadedConfig, null, 2);
1943
- document.getElementById('config-preview-section').classList.remove('hidden');
1944
- document.getElementById('btn-load-config').disabled = false;
1986
+ rawConfig = JSON.parse(event.target.result);
1945
1987
  } catch (err) {
1946
- alert('Invalid JSON file: ' + err.message);
1988
+ document.getElementById('config-validation-error').classList.remove('hidden');
1989
+ const errorList = document.getElementById('config-validation-errors');
1990
+ while (errorList.firstChild) errorList.removeChild(errorList.firstChild);
1991
+ const li = document.createElement('li');
1992
+ li.textContent = 'Invalid JSON: ' + err.message;
1993
+ errorList.appendChild(li);
1994
+ loadedConfig = null;
1995
+ return;
1996
+ }
1997
+
1998
+ // Show preview
1999
+ document.getElementById('config-preview-content').textContent = JSON.stringify(rawConfig, null, 2);
2000
+ document.getElementById('config-preview-section').classList.remove('hidden');
2001
+
2002
+ // Validate via API
2003
+ try {
2004
+ const response = await api('/config/validate', {
2005
+ method: 'POST',
2006
+ headers: { 'Content-Type': 'application/json' },
2007
+ body: JSON.stringify(rawConfig),
2008
+ });
2009
+
2010
+ if (response.valid) {
2011
+ loadedConfig = response.config;
2012
+ document.getElementById('config-validation-success').classList.remove('hidden');
2013
+ document.getElementById('btn-load-config').disabled = false;
2014
+ } else {
2015
+ document.getElementById('config-validation-error').classList.remove('hidden');
2016
+ const errorList = document.getElementById('config-validation-errors');
2017
+ while (errorList.firstChild) errorList.removeChild(errorList.firstChild);
2018
+
2019
+ if (response.errors) {
2020
+ for (const err of response.errors) {
2021
+ const li = document.createElement('li');
2022
+ li.textContent = (err.path ? err.path + ': ' : '') + err.message;
2023
+ errorList.appendChild(li);
2024
+ }
2025
+ } else if (response.error) {
2026
+ const li = document.createElement('li');
2027
+ li.textContent = response.error;
2028
+ errorList.appendChild(li);
2029
+ }
2030
+ loadedConfig = null;
2031
+ }
2032
+ } catch (err) {
2033
+ document.getElementById('config-validation-error').classList.remove('hidden');
2034
+ const errorList = document.getElementById('config-validation-errors');
2035
+ while (errorList.firstChild) errorList.removeChild(errorList.firstChild);
2036
+ const li = document.createElement('li');
2037
+ li.textContent = 'Validation request failed: ' + err.message;
2038
+ errorList.appendChild(li);
1947
2039
  loadedConfig = null;
1948
- document.getElementById('btn-load-config').disabled = true;
1949
2040
  }
1950
2041
  };
1951
2042
  reader.readAsText(file);
@@ -2030,14 +2121,13 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
2030
2121
  // Trigger env input to update preview/default labels
2031
2122
  document.getElementById('env').dispatchEvent(new Event('input'));
2032
2123
 
2033
- // Skip to provisioning if resources already exist
2034
- if (loadedConfig.resources) {
2035
- setStep(4);
2036
- showSection('deploy');
2037
- } else {
2038
- setStep(3);
2039
- showSection('provision');
2040
- }
2124
+ // Show configuration screen for review/editing
2125
+ // User can modify settings before proceeding to provision
2126
+ setupMode = 'custom'; // Enable all options for editing
2127
+ document.getElementById('advanced-options').classList.remove('hidden');
2128
+ setStep(2);
2129
+ showSection('config');
2130
+ updatePreview();
2041
2131
  });
2042
2132
 
2043
2133
  // Configuration handlers
@@ -3097,7 +3187,10 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3097
3187
  const container = document.getElementById('env-cards');
3098
3188
  const noEnvsMessage = document.getElementById('no-envs-message');
3099
3189
 
3100
- container.innerHTML = '';
3190
+ // Clear existing cards using safe method
3191
+ while (container.firstChild) {
3192
+ container.removeChild(container.firstChild);
3193
+ }
3101
3194
 
3102
3195
  if (detectedEnvironments.length === 0) {
3103
3196
  noEnvsMessage.classList.remove('hidden');
@@ -3109,14 +3202,25 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3109
3202
  for (const env of detectedEnvironments) {
3110
3203
  const card = document.createElement('div');
3111
3204
  card.className = 'env-card';
3205
+ card.id = 'env-card-' + env.env.replace(/[^a-zA-Z0-9-]/g, '_');
3112
3206
 
3113
3207
  const info = document.createElement('div');
3114
3208
  info.className = 'env-card-info';
3115
3209
 
3210
+ const nameRow = document.createElement('div');
3211
+ nameRow.style.cssText = 'display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap;';
3212
+
3116
3213
  const name = document.createElement('div');
3117
3214
  name.className = 'env-card-name';
3118
3215
  name.textContent = env.env;
3119
- info.appendChild(name);
3216
+ nameRow.appendChild(name);
3217
+
3218
+ // Badge placeholder for admin status (will be populated async)
3219
+ const badgeContainer = document.createElement('span');
3220
+ badgeContainer.id = 'admin-badge-' + env.env.replace(/[^a-zA-Z0-9-]/g, '_');
3221
+ nameRow.appendChild(badgeContainer);
3222
+
3223
+ info.appendChild(nameRow);
3120
3224
 
3121
3225
  const stats = document.createElement('div');
3122
3226
  stats.className = 'env-card-stats';
@@ -3144,6 +3248,35 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3144
3248
  // Make entire card clickable
3145
3249
  card.addEventListener('click', () => showEnvDetail(env));
3146
3250
  container.appendChild(card);
3251
+
3252
+ // Check admin status and add badge if needed
3253
+ checkAndAddAdminBadge(env);
3254
+ }
3255
+ }
3256
+
3257
+ // Check admin status and add badge to environment card
3258
+ async function checkAndAddAdminBadge(env) {
3259
+ const configKv = env.kv.find(kv =>
3260
+ kv.name.toUpperCase().includes('AUTHRIM_CONFIG') ||
3261
+ kv.name.toUpperCase().includes('AUTHRIM-CONFIG')
3262
+ );
3263
+
3264
+ if (!configKv || !configKv.id) return;
3265
+
3266
+ try {
3267
+ const response = await api('/admin/status/' + encodeURIComponent(configKv.id));
3268
+ if (response.success && !response.adminSetupCompleted) {
3269
+ const badgeContainer = document.getElementById('admin-badge-' + env.env.replace(/[^a-zA-Z0-9-]/g, '_'));
3270
+ if (badgeContainer) {
3271
+ const badge = document.createElement('span');
3272
+ badge.className = 'status-badge status-warning';
3273
+ badge.style.cssText = 'font-size: 0.75rem; padding: 0.125rem 0.5rem;';
3274
+ badge.textContent = 'Admin未設定';
3275
+ badgeContainer.appendChild(badge);
3276
+ }
3277
+ }
3278
+ } catch (error) {
3279
+ console.error('Failed to check admin status for ' + env.env + ':', error);
3147
3280
  }
3148
3281
  }
3149
3282
 
@@ -3166,12 +3299,46 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3166
3299
  document.getElementById('detail-r2-section').style.display = env.r2.length === 0 ? 'none' : 'block';
3167
3300
  document.getElementById('detail-pages-section').style.display = (env.pages || []).length === 0 ? 'none' : 'block';
3168
3301
 
3302
+ // Check and show/hide admin setup section
3303
+ const adminSetupSection = document.getElementById('admin-setup-section');
3304
+ const resultDiv = document.getElementById('admin-setup-result');
3305
+ const btn = document.getElementById('btn-start-admin-setup');
3306
+
3307
+ // Reset state
3308
+ adminSetupSection.classList.add('hidden');
3309
+ resultDiv.classList.add('hidden');
3310
+ btn.disabled = false;
3311
+ btn.textContent = '🔐 Start Admin Account Setup with Passkey';
3312
+
3313
+ // Find AUTHRIM_CONFIG KV namespace
3314
+ const configKv = env.kv.find(kv =>
3315
+ kv.name.toUpperCase().includes('AUTHRIM_CONFIG') ||
3316
+ kv.name.toUpperCase().includes('AUTHRIM-CONFIG')
3317
+ );
3318
+
3319
+ if (configKv && configKv.id) {
3320
+ // Check admin setup status asynchronously
3321
+ checkAndShowAdminSetup(configKv.id);
3322
+ }
3323
+
3169
3324
  showSection('envDetail');
3170
3325
 
3171
3326
  // Load details asynchronously
3172
3327
  loadResourceDetails(env);
3173
3328
  }
3174
3329
 
3330
+ // Check admin setup status and show section if needed
3331
+ async function checkAndShowAdminSetup(kvNamespaceId) {
3332
+ try {
3333
+ const response = await api('/admin/status/' + encodeURIComponent(kvNamespaceId));
3334
+ if (response.success && !response.adminSetupCompleted) {
3335
+ document.getElementById('admin-setup-section').classList.remove('hidden');
3336
+ }
3337
+ } catch (error) {
3338
+ console.error('Failed to check admin status:', error);
3339
+ }
3340
+ }
3341
+
3175
3342
  // Helper to render resource list
3176
3343
  function renderResourceList(listId, countId, resources, nameKey, resourceType) {
3177
3344
  const list = document.getElementById(listId);
@@ -3370,6 +3537,88 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3370
3537
  }
3371
3538
  });
3372
3539
 
3540
+ // Admin setup button
3541
+ document.getElementById('btn-start-admin-setup').addEventListener('click', async () => {
3542
+ if (!selectedEnvForDetail) return;
3543
+
3544
+ const btn = document.getElementById('btn-start-admin-setup');
3545
+ const resultDiv = document.getElementById('admin-setup-result');
3546
+ const urlInput = document.getElementById('admin-setup-url');
3547
+ const openLink = document.getElementById('btn-open-setup-url');
3548
+
3549
+ btn.disabled = true;
3550
+ btn.textContent = '⏳ Generating token...';
3551
+
3552
+ try {
3553
+ // Find AUTHRIM_CONFIG KV namespace
3554
+ const configKv = selectedEnvForDetail.kv.find(kv =>
3555
+ kv.name.toUpperCase().includes('AUTHRIM_CONFIG') ||
3556
+ kv.name.toUpperCase().includes('AUTHRIM-CONFIG')
3557
+ );
3558
+
3559
+ if (!configKv) {
3560
+ alert('Could not find AUTHRIM_CONFIG KV namespace for this environment');
3561
+ btn.disabled = false;
3562
+ btn.textContent = '🔐 Start Admin Account Setup with Passkey';
3563
+ return;
3564
+ }
3565
+
3566
+ // Find router worker to construct base URL
3567
+ const router = selectedEnvForDetail.workers.find(w =>
3568
+ w.name.toLowerCase().includes('router')
3569
+ );
3570
+
3571
+ let baseUrl = '';
3572
+ if (router && router.name) {
3573
+ // Construct URL from worker name
3574
+ baseUrl = 'https://' + router.name + '.workers.dev';
3575
+ } else {
3576
+ // Fallback - ask for URL
3577
+ baseUrl = prompt('Enter the base URL for the router (e.g., https://myenv-ar-router.workers.dev):');
3578
+ if (!baseUrl) {
3579
+ btn.disabled = false;
3580
+ btn.textContent = '🔐 Start Admin Account Setup with Passkey';
3581
+ return;
3582
+ }
3583
+ }
3584
+
3585
+ const response = await api('/admin/generate-token', {
3586
+ method: 'POST',
3587
+ headers: { 'Content-Type': 'application/json' },
3588
+ body: JSON.stringify({
3589
+ kvNamespaceId: configKv.id,
3590
+ baseUrl: baseUrl,
3591
+ }),
3592
+ });
3593
+
3594
+ if (response.success && response.setupUrl) {
3595
+ urlInput.value = response.setupUrl;
3596
+ openLink.href = response.setupUrl;
3597
+ resultDiv.classList.remove('hidden');
3598
+ btn.textContent = '✓ Token Generated';
3599
+ } else {
3600
+ alert('Failed to generate token: ' + (response.error || 'Unknown error'));
3601
+ btn.disabled = false;
3602
+ btn.textContent = '🔐 Start Admin Account Setup with Passkey';
3603
+ }
3604
+ } catch (error) {
3605
+ alert('Error: ' + error.message);
3606
+ btn.disabled = false;
3607
+ btn.textContent = '🔐 Start Admin Account Setup with Passkey';
3608
+ }
3609
+ });
3610
+
3611
+ // Copy setup URL button
3612
+ document.getElementById('btn-copy-setup-url').addEventListener('click', () => {
3613
+ const urlInput = document.getElementById('admin-setup-url');
3614
+ urlInput.select();
3615
+ document.execCommand('copy');
3616
+ const btn = document.getElementById('btn-copy-setup-url');
3617
+ const originalText = btn.textContent;
3618
+ btn.textContent = '✓ Copied!';
3619
+ setTimeout(() => { btn.textContent = originalText; }, 2000);
3620
+ });
3621
+
3373
3622
  document.getElementById('btn-back-env-delete').addEventListener('click', () => {
3374
3623
  // Go back to detail view if we came from there
3375
3624
  if (selectedEnvForDetail) {
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,eAAe,CAAC,YAAqB,EAAE,UAAoB;IACzE,gDAAgD;IAChD,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAErD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAqnDoB,SAAS;0BACZ,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA6wDhC,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,EAAE,UAAoB;IACzE,gDAAgD;IAChD,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAErD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA2pDoB,SAAS;0BACZ,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAg+DhC,CAAC;AACT,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@authrim/setup",
3
- "version": "0.1.60",
3
+ "version": "0.1.62",
4
4
  "description": "CLI tool for setting up Authrim OIDC Provider on Cloudflare Workers",
5
5
  "type": "module",
6
6
  "bin": {