@samyx/preview-stacks-ui 0.39.1 → 0.40.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/assets/{ActionButton-OewKsFrK.js → ActionButton-BaGfzZKv.js} +2 -2
- package/dist/assets/{ActionButton-OewKsFrK.js.map → ActionButton-BaGfzZKv.js.map} +1 -1
- package/dist/assets/{AxesTab-DSzgRhgG.js → AxesTab-8px21p5I.js} +2 -2
- package/dist/assets/{AxesTab-DSzgRhgG.js.map → AxesTab-8px21p5I.js.map} +1 -1
- package/dist/assets/{ConfigTab-DhtUF0Dh.js → ConfigTab-XMpNHvgd.js} +2 -2
- package/dist/assets/{ConfigTab-DhtUF0Dh.js.map → ConfigTab-XMpNHvgd.js.map} +1 -1
- package/dist/assets/{ConfigView-wXO4j8H7.js → ConfigView-Ed9sCukp.js} +2 -2
- package/dist/assets/{ConfigView-wXO4j8H7.js.map → ConfigView-Ed9sCukp.js.map} +1 -1
- package/dist/assets/{ConflictNote.vue_vue_type_script_setup_true_lang-B2fgJAmK.js → ConflictNote.vue_vue_type_script_setup_true_lang-B4a9DxS8.js} +2 -2
- package/dist/assets/{ConflictNote.vue_vue_type_script_setup_true_lang-B2fgJAmK.js.map → ConflictNote.vue_vue_type_script_setup_true_lang-B4a9DxS8.js.map} +1 -1
- package/dist/assets/ControlView-B-gr_xQ3.css +1 -0
- package/dist/assets/ControlView-C4R1joVF.js +2 -0
- package/dist/assets/ControlView-C4R1joVF.js.map +1 -0
- package/dist/assets/{DangerTab-D2dFrj4t.js → DangerTab-CMIMyWEv.js} +2 -2
- package/dist/assets/{DangerTab-D2dFrj4t.js.map → DangerTab-CMIMyWEv.js.map} +1 -1
- package/dist/assets/{DashboardView-FpEFhaCl.js → DashboardView-gTjtsiF-.js} +2 -2
- package/dist/assets/{DashboardView-FpEFhaCl.js.map → DashboardView-gTjtsiF-.js.map} +1 -1
- package/dist/assets/{DeploymentDetailView-B1dKUzvp.js → DeploymentDetailView-Dg-9p6_v.js} +2 -2
- package/dist/assets/{DeploymentDetailView-B1dKUzvp.js.map → DeploymentDetailView-Dg-9p6_v.js.map} +1 -1
- package/dist/assets/{DeploymentsView-_V93UC6F.js → DeploymentsView-CNzMaxE7.js} +2 -2
- package/dist/assets/{DeploymentsView-_V93UC6F.js.map → DeploymentsView-CNzMaxE7.js.map} +1 -1
- package/dist/assets/{EquivalentCommand-D-mkbReY.js → EquivalentCommand-CAhOGrAR.js} +2 -2
- package/dist/assets/{EquivalentCommand-D-mkbReY.js.map → EquivalentCommand-CAhOGrAR.js.map} +1 -1
- package/dist/assets/{ErrorNote.vue_vue_type_script_setup_true_lang-FEOV8vdM.js → ErrorNote.vue_vue_type_script_setup_true_lang-DU01Dqor.js} +2 -2
- package/dist/assets/{ErrorNote.vue_vue_type_script_setup_true_lang-FEOV8vdM.js.map → ErrorNote.vue_vue_type_script_setup_true_lang-DU01Dqor.js.map} +1 -1
- package/dist/assets/{JobDetailView-RD5MxdA7.js → JobDetailView-ChKP7xeI.js} +2 -2
- package/dist/assets/{JobDetailView-RD5MxdA7.js.map → JobDetailView-ChKP7xeI.js.map} +1 -1
- package/dist/assets/{JobsView-BJrH9ViP.js → JobsView-DndjCwKL.js} +2 -2
- package/dist/assets/{JobsView-BJrH9ViP.js.map → JobsView-DndjCwKL.js.map} +1 -1
- package/dist/assets/{LogViewer.vue_vue_type_script_setup_true_lang-BRSt9Exf.js → LogViewer.vue_vue_type_script_setup_true_lang-D2yEiI2n.js} +2 -2
- package/dist/assets/{LogViewer.vue_vue_type_script_setup_true_lang-BRSt9Exf.js.map → LogViewer.vue_vue_type_script_setup_true_lang-D2yEiI2n.js.map} +1 -1
- package/dist/assets/LoginView-B9aLjuvQ.css +1 -0
- package/dist/assets/LoginView-C2Yny6iz.js +2 -0
- package/dist/assets/LoginView-C2Yny6iz.js.map +1 -0
- package/dist/assets/{LogsTab--Q-KHeWj.js → LogsTab-B6R6j6Uv.js} +2 -2
- package/dist/assets/{LogsTab--Q-KHeWj.js.map → LogsTab-B6R6j6Uv.js.map} +1 -1
- package/dist/assets/{NotFoundView-1lI66Xt-.js → NotFoundView-CvHMcInC.js} +2 -2
- package/dist/assets/{NotFoundView-1lI66Xt-.js.map → NotFoundView-CvHMcInC.js.map} +1 -1
- package/dist/assets/{NotifiersView-BfWfRzg4.js → NotifiersView-9rwo6wXV.js} +2 -2
- package/dist/assets/{NotifiersView-BfWfRzg4.js.map → NotifiersView-9rwo6wXV.js.map} +1 -1
- package/dist/assets/{OverviewTab-P3htOnPs.js → OverviewTab-BO8-8pTB.js} +2 -2
- package/dist/assets/{OverviewTab-P3htOnPs.js.map → OverviewTab-BO8-8pTB.js.map} +1 -1
- package/dist/assets/{PublicLogsView-DcDQMivg.js → PublicLogsView-BA7ao_jC.js} +2 -2
- package/dist/assets/{PublicLogsView-DcDQMivg.js.map → PublicLogsView-BA7ao_jC.js.map} +1 -1
- package/dist/assets/{RefreshButton.vue_vue_type_script_setup_true_lang-CQvD4Out.js → RefreshButton.vue_vue_type_script_setup_true_lang-Dk-lSii3.js} +2 -2
- package/dist/assets/{RefreshButton.vue_vue_type_script_setup_true_lang-CQvD4Out.js.map → RefreshButton.vue_vue_type_script_setup_true_lang-Dk-lSii3.js.map} +1 -1
- package/dist/assets/{RegistriesView-9hPjVsOW.js → RegistriesView-y9nKbmQz.js} +2 -2
- package/dist/assets/{RegistriesView-9hPjVsOW.js.map → RegistriesView-y9nKbmQz.js.map} +1 -1
- package/dist/assets/{RelativeTime.vue_vue_type_script_setup_true_lang-BxIqRu_b.js → RelativeTime.vue_vue_type_script_setup_true_lang-B1_l0Vtf.js} +2 -2
- package/dist/assets/{RelativeTime.vue_vue_type_script_setup_true_lang-BxIqRu_b.js.map → RelativeTime.vue_vue_type_script_setup_true_lang-B1_l0Vtf.js.map} +1 -1
- package/dist/assets/{RequiresTab--C-3QPQB.js → RequiresTab-DJZagYBh.js} +2 -2
- package/dist/assets/{RequiresTab--C-3QPQB.js.map → RequiresTab-DJZagYBh.js.map} +1 -1
- package/dist/assets/{RouteTarget.vue_vue_type_script_setup_true_lang-D3FLq6Mt.js → RouteTarget.vue_vue_type_script_setup_true_lang-Ct40NR9a.js} +2 -2
- package/dist/assets/{RouteTarget.vue_vue_type_script_setup_true_lang-D3FLq6Mt.js.map → RouteTarget.vue_vue_type_script_setup_true_lang-Ct40NR9a.js.map} +1 -1
- package/dist/assets/{RoutingView-CC8xPrcT.js → RoutingView-DzE98-qV.js} +2 -2
- package/dist/assets/{RoutingView-CC8xPrcT.js.map → RoutingView-DzE98-qV.js.map} +1 -1
- package/dist/assets/{RuntimeTab-Do1xfTp8.js → RuntimeTab-Cp6CxBJG.js} +2 -2
- package/dist/assets/{RuntimeTab-Do1xfTp8.js.map → RuntimeTab-Cp6CxBJG.js.map} +1 -1
- package/dist/assets/{SelectMenu.vue_vue_type_script_setup_true_lang-CMLYr7A7.js → SelectMenu.vue_vue_type_script_setup_true_lang-PIaLSNsk.js} +2 -2
- package/dist/assets/{SelectMenu.vue_vue_type_script_setup_true_lang-CMLYr7A7.js.map → SelectMenu.vue_vue_type_script_setup_true_lang-PIaLSNsk.js.map} +1 -1
- package/dist/assets/{SettingsView-Dxbl6HZA.js → SettingsView-iWRluEj5.js} +2 -2
- package/dist/assets/{SettingsView-Dxbl6HZA.js.map → SettingsView-iWRluEj5.js.map} +1 -1
- package/dist/assets/{SkeletonList.vue_vue_type_script_setup_true_lang-D4pkKZAr.js → SkeletonList.vue_vue_type_script_setup_true_lang-7pKEuaEM.js} +2 -2
- package/dist/assets/{SkeletonList.vue_vue_type_script_setup_true_lang-D4pkKZAr.js.map → SkeletonList.vue_vue_type_script_setup_true_lang-7pKEuaEM.js.map} +1 -1
- package/dist/assets/{SpecDetailView-DyFAAMfr.js → SpecDetailView-Ca4WXLH1.js} +2 -2
- package/dist/assets/{SpecDetailView-DyFAAMfr.js.map → SpecDetailView-Ca4WXLH1.js.map} +1 -1
- package/dist/assets/{SpecsView-CfV1_GDx.js → SpecsView-DN6EIbcC.js} +2 -2
- package/dist/assets/{SpecsView-CfV1_GDx.js.map → SpecsView-DN6EIbcC.js.map} +1 -1
- package/dist/assets/{SsoMark.vue_vue_type_script_setup_true_lang-BU6ThRhq.js → SsoMark.vue_vue_type_script_setup_true_lang-rMP20d_u.js} +2 -2
- package/dist/assets/{SsoMark.vue_vue_type_script_setup_true_lang-BU6ThRhq.js.map → SsoMark.vue_vue_type_script_setup_true_lang-rMP20d_u.js.map} +1 -1
- package/dist/assets/{SsoView-CxFylJ9d.js → SsoView-wGpab5Q8.js} +2 -2
- package/dist/assets/{SsoView-CxFylJ9d.js.map → SsoView-wGpab5Q8.js.map} +1 -1
- package/dist/assets/{StateBadge.vue_vue_type_script_setup_true_lang-CfjzlWSc.js → StateBadge.vue_vue_type_script_setup_true_lang-aK93ZMhG.js} +2 -2
- package/dist/assets/{StateBadge.vue_vue_type_script_setup_true_lang-CfjzlWSc.js.map → StateBadge.vue_vue_type_script_setup_true_lang-aK93ZMhG.js.map} +1 -1
- package/dist/assets/{SubmitView-BcAcTlwC.js → SubmitView-BTK9zNDd.js} +2 -2
- package/dist/assets/{SubmitView-BcAcTlwC.js.map → SubmitView-BTK9zNDd.js.map} +1 -1
- package/dist/assets/SwarmView-DXLQlbD0.css +1 -0
- package/dist/assets/SwarmView-m2XvvAfR.js +2 -0
- package/dist/assets/SwarmView-m2XvvAfR.js.map +1 -0
- package/dist/assets/{TerminalTab-DF8cSjcg.js → TerminalTab-CFKfVx8D.js} +2 -2
- package/dist/assets/{TerminalTab-DF8cSjcg.js.map → TerminalTab-CFKfVx8D.js.map} +1 -1
- package/dist/assets/{UsersView-CbPtmnP6.js → UsersView-BnN_hvh2.js} +2 -2
- package/dist/assets/{UsersView-CbPtmnP6.js.map → UsersView-BnN_hvh2.js.map} +1 -1
- package/dist/assets/{VarEditor.vue_vue_type_script_setup_true_lang-BNQTEru_.js → VarEditor.vue_vue_type_script_setup_true_lang-Dg_ORvZN.js} +2 -2
- package/dist/assets/{VarEditor.vue_vue_type_script_setup_true_lang-BNQTEru_.js.map → VarEditor.vue_vue_type_script_setup_true_lang-Dg_ORvZN.js.map} +1 -1
- package/dist/assets/{VarIO-BFBaI8oU.js → VarIO-CNugbzeb.js} +2 -2
- package/dist/assets/{VarIO-BFBaI8oU.js.map → VarIO-CNugbzeb.js.map} +1 -1
- package/dist/assets/{VariablesView-BEcI8Bi0.js → VariablesView-qrqDNseI.js} +2 -2
- package/dist/assets/{VariablesView-BEcI8Bi0.js.map → VariablesView-qrqDNseI.js.map} +1 -1
- package/dist/assets/{index-D_Ks6aQi.js → index-DlhYSSKq.js} +25 -20
- package/dist/assets/index-DlhYSSKq.js.map +1 -0
- package/dist/assets/{useDeployment-DFuBcVnK.js → useDeployment-BJuUhf9K.js} +2 -2
- package/dist/assets/{useDeployment-DFuBcVnK.js.map → useDeployment-BJuUhf9K.js.map} +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/dist/assets/ControlView-ninZ6BIV.js +0 -2
- package/dist/assets/ControlView-ninZ6BIV.js.map +0 -1
- package/dist/assets/LoginView-wAfA0Ozk.css +0 -1
- package/dist/assets/LoginView-zWd9FvKS.js +0 -2
- package/dist/assets/LoginView-zWd9FvKS.js.map +0 -1
- package/dist/assets/SwarmView-BHtmW4QF.js +0 -2
- package/dist/assets/SwarmView-BHtmW4QF.js.map +0 -1
- package/dist/assets/index-D_Ks6aQi.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariablesView-BEcI8Bi0.js","sources":["../../src/views/VariablesView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Host variables & secrets — the GitHub model, scoped to this host.\n *\n * TWO SECTIONS BECAUSE THEY ARE TWO CONTRACTS. A variable's value is configuration anyone may read\n * back; a secret's value goes IN through this form and never comes back OUT — the list shows its\n * name and when it changed, nothing else, because the server keeps no route that returns it. The\n * form says so at the moment of storing, not in documentation nobody reads.\n *\n * Specs reference these as `${vars.NAME}` and `${secrets.NAME}` — spelled differently from plain\n * `${NAME}` on purpose, so a spec that reads host state says so on its face.\n *\n * THE TWO CONTRACTS DECIDE WHAT `VarIO` MAY DO HERE, and each panel mounts its own:\n * - A copied secret list carries NAMES ONLY. There is no value to copy — the API never returns\n * one — and copying the mask would put `••••••••` in a `.env` someone then deploys with,\n * which is a real value that fails somewhere far away from here. Empty is honest, and pstack\n * treats an empty variable as undefined (invariant 7), so a paste of one fails loudly at\n * resolve time instead of quietly running with a wrong value.\n * - An import therefore SKIPS an entry with no value rather than storing `\"\"` over a live\n * secret. Copy this page's secrets and paste them straight back and nothing changes — which is\n * the only safe answer for an export that cannot contain what it lists.\n * - Only merge is offered. A \"replace\" would have to delete the names a paste omits, and this\n * page's deletes are one confirmed click each for a reason.\n */\nimport { computed, ref } from 'vue';\nimport { api, problem } from '../api/client';\nimport type { VarPair } from '../api/types';\nimport { toast } from '../composables/useToasts';\nimport ActionButton from '../components/ActionButton.vue';\nimport EquivalentCommand from '../components/EquivalentCommand.vue';\nimport ErrorNote from '../components/ErrorNote.vue';\nimport RelativeTime from '../components/RelativeTime.vue';\nimport SkeletonList from '../components/SkeletonList.vue';\nimport RefreshButton from '../components/RefreshButton.vue';\nimport VarIO from '../components/VarIO.vue';\n\ntype Entry = { name: string; value: string | null; secret: boolean; updatedAt: number };\n\nconst entries = ref<Entry[]>([]);\nconst loaded = ref(false);\nconst listError = ref('');\nconst unsupported = ref(false);\n\nconst vars = computed(() => entries.value.filter((e) => !e.secret));\nconst secrets = computed(() => entries.value.filter((e) => e.secret));\n\nconst varPairs = computed<VarPair[]>(() => vars.value.map((e) => ({ k: e.name, v: e.value ?? '' })));\n/** Names with no values — see the header. `WITHHELD` travels with the `.env` export. */\nconst secretPairs = computed<VarPair[]>(() => secrets.value.map((e) => ({ k: e.name, v: '' })));\nconst WITHHELD = 'Values are never exported. Fill each one in.';\n\nconst form = ref({ name: '', value: '', secret: false });\nconst saving = ref(false);\nconst importing = ref(false);\n/** Editing state: the row being replaced. For a secret this means re-entering the value. */\nconst editing = ref<Entry | null>(null);\n\nconst NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst canSave = computed(\n () => !saving.value && NAME.test(form.value.name) && form.value.value.length > 0,\n);\n\nasync function load(): Promise<void> {\n const r = await api.get<{ entries: Entry[] }>('/api/host-vars');\n loaded.value = true;\n if (r.status === 404) {\n unsupported.value = true;\n return;\n }\n if (!r.ok) {\n listError.value = problem(r, 'load the variables');\n return;\n }\n listError.value = '';\n entries.value = r.body.entries ?? [];\n}\nvoid load();\n\nfunction startEdit(e: Entry): void {\n editing.value = e;\n form.value = { name: e.name, value: e.value ?? '', secret: e.secret };\n}\n\nfunction cancelEdit(): void {\n editing.value = null;\n form.value = { name: '', value: '', secret: false };\n}\n\nasync function save(): Promise<void> {\n saving.value = true;\n const r = await api.put(`/api/host-vars/${form.value.name}`, {\n value: form.value.value,\n secret: form.value.secret,\n });\n saving.value = false;\n if (!r.ok) {\n listError.value = problem(r, `store ${form.value.name}`);\n return;\n }\n listError.value = '';\n toast('ok', `${editing.value ? 'Saved' : 'Added'} ${form.value.name}.`);\n cancelEdit();\n void load();\n}\n\n/**\n * One PUT per entry: there is no bulk route, and inventing one so a paste box can be one request\n * is a route this feature does not need. Sequential, and every failure is named — \"3 of 5 stored,\n * these 2 failed\" is something an operator can act on; a single red toast is not.\n */\nasync function importEntries(secret: boolean, pairs: VarPair[]): Promise<void> {\n importing.value = true;\n const failed: string[] = [];\n for (const e of pairs) {\n const r = await api.put(`/api/host-vars/${encodeURIComponent(e.k)}`, { value: e.v, secret });\n if (!r.ok) failed.push(e.k);\n }\n importing.value = false;\n const noun = secret ? 'secret' : 'variable';\n const stored = pairs.length - failed.length;\n if (failed.length) {\n listError.value = `Stored ${stored} of ${pairs.length}. Failed: ${failed.join(', ')}.`;\n } else {\n listError.value = '';\n toast('ok', `Stored ${stored} ${noun}${stored === 1 ? '' : 's'}.`);\n }\n void load();\n}\n\nconst importVars = (pairs: VarPair[]): Promise<void> => importEntries(false, pairs);\nconst importSecrets = (pairs: VarPair[]): Promise<void> => importEntries(true, pairs);\n\nasync function remove(e: Entry): Promise<void> {\n const r = await api.del(`/api/host-vars/${e.name}`);\n if (!r.ok) {\n listError.value = problem(r, `delete ${e.name}`);\n return;\n }\n toast('ok', `Deleted ${e.name}. Specs using it will not resolve.`);\n if (editing.value?.name === e.name) cancelEdit();\n void load();\n}\n</script>\n\n<template>\n <div>\n <div class=\"page-head\">\n <div>\n <h1>Variables & secrets</h1>\n <div class=\"sub\">\n Host-level values every spec can reference. Deleting one stops the specs using it from\n resolving.\n </div>\n </div>\n <span class=\"grow\" />\n <RefreshButton :run=\"load\" />\n </div>\n\n <ErrorNote v-if=\"listError\" :text=\"listError\" title=\"Could not load the variables.\" />\n\n <section v-if=\"unsupported\" class=\"panel\">\n <div class=\"banner plain\">\n <b>This server has no variable store.</b>\n <p>Upgrade the host to use these.</p>\n </div>\n </section>\n\n <template v-else>\n <div class=\"grid-2\">\n <section class=\"panel\">\n <div class=\"phead\">\n <h2 class=\"section\">Variables</h2>\n <span class=\"grow\" />\n <span class=\"mute\" style=\"font-size: var(--t-xs)\">{{ vars.length }}</span>\n </div>\n\n <SkeletonList v-if=\"!loaded\" :rows=\"2\" tall />\n <table v-else-if=\"vars.length\" role=\"table\" class=\"cards\">\n <thead role=\"rowgroup\">\n <tr role=\"row\">\n <th role=\"columnheader\">Name</th>\n <th role=\"columnheader\">Value</th>\n <th role=\"columnheader\">Updated</th>\n <th role=\"columnheader\" aria-label=\"Actions\" />\n </tr>\n </thead>\n <tbody role=\"rowgroup\">\n <tr v-for=\"e in vars\" :key=\"e.name\" role=\"row\">\n <td role=\"cell\" class=\"name\" data-label=\"name\"><code>{{ e.name }}</code></td>\n <td role=\"cell\" class=\"break\" data-label=\"value\">{{ e.value }}</td>\n <td role=\"cell\" class=\"dim nowrap\" data-label=\"updated\"><RelativeTime :at=\"e.updatedAt\" /></td>\n <td role=\"cell\" class=\"right nowrap\" data-label=\"\">\n <button class=\"ghost sm\" @click=\"startEdit(e)\">Edit</button>\n <ActionButton class=\"danger sm\" :confirm=\"`Delete ${e.name}?`\" @run=\"remove(e)\">\n Delete\n </ActionButton>\n </td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"hint\">Add your first variable below.</p>\n\n <VarIO :pairs=\"varPairs\" :busy=\"importing\" skip-empty @apply=\"importVars\">\n <p class=\"hint\" style=\"margin-top: 0\">Overwrites matching names. Deletes nothing.</p>\n </VarIO>\n </section>\n\n <section class=\"panel\">\n <div class=\"phead\">\n <h2 class=\"section\">Secrets</h2>\n <span class=\"grow\" />\n <span class=\"mute\" style=\"font-size: var(--t-xs)\">{{ secrets.length }}</span>\n </div>\n\n <SkeletonList v-if=\"!loaded\" :rows=\"2\" tall />\n <table v-else-if=\"secrets.length\" role=\"table\" class=\"cards\">\n <thead role=\"rowgroup\">\n <tr role=\"row\">\n <th role=\"columnheader\">Name</th>\n <th role=\"columnheader\">Updated</th>\n <th role=\"columnheader\" aria-label=\"Actions\" />\n </tr>\n </thead>\n <tbody role=\"rowgroup\">\n <tr v-for=\"e in secrets\" :key=\"e.name\" role=\"row\">\n <td role=\"cell\" class=\"name\" data-label=\"name\"><code>{{ e.name }}</code></td>\n <td role=\"cell\" class=\"dim nowrap\" data-label=\"updated\"><RelativeTime :at=\"e.updatedAt\" /></td>\n <td role=\"cell\" class=\"right nowrap\" data-label=\"\">\n <button class=\"ghost sm\" @click=\"startEdit(e)\">Replace</button>\n <ActionButton class=\"danger sm\" :confirm=\"`Delete ${e.name}?`\" @run=\"remove(e)\">\n Delete\n </ActionButton>\n </td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"hint\">Add your first secret below.</p>\n\n <!--\n Said on the page, not only in the copied file: an export that cannot contain the thing\n it lists has to admit that where the button is.\n -->\n <p class=\"hint\">A copied list carries <b>names only</b> — values cannot be read back.</p>\n <VarIO\n :pairs=\"secretPairs\"\n :note=\"WITHHELD\"\n :busy=\"importing\"\n skip-empty\n @apply=\"importSecrets\"\n >\n <p class=\"hint\" style=\"margin-top: 0\">\n Stored <b>write-only</b>. Empty lines are skipped, never stored over a live secret.\n </p>\n </VarIO>\n </section>\n </div>\n\n <section class=\"panel\">\n <h2 class=\"section\" style=\"margin-bottom: var(--s3)\">\n {{ editing ? (editing.secret ? `Replace the value of ${editing.name}` : `Edit ${editing.name}`) : 'Add a variable or secret' }}\n </h2>\n\n <form @submit.prevent=\"save\">\n <div class=\"row wrap two-up\">\n <label class=\"field grow\">\n <span>Name</span>\n <input\n v-model.trim=\"form.name\"\n type=\"text\"\n placeholder=\"DB_PASSWORD\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n :disabled=\"!!editing\"\n aria-describedby=\"var-name-err\"\n :aria-invalid=\"!!form.name && !NAME.test(form.name)\"\n />\n </label>\n <label class=\"field grow\">\n <span>Value</span>\n <input\n v-model=\"form.value\"\n :type=\"form.secret ? 'password' : 'text'\"\n :placeholder=\"editing?.secret ? 'enter the new value' : 'eu-central'\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n />\n </label>\n </div>\n <p\n v-if=\"form.name && !NAME.test(form.name)\"\n id=\"var-name-err\"\n class=\"s-failed\"\n style=\"margin-top: var(--s2)\"\n >\n Letters, digits and _ only, not starting with a digit.\n </p>\n\n <div class=\"row\" style=\"margin-top: var(--s3)\">\n <label class=\"check\">\n <input v-model=\"form.secret\" type=\"checkbox\" :disabled=\"editing?.secret === true\" />\n Secret — the value is never shown again\n </label>\n </div>\n <p v-if=\"editing?.secret\" class=\"hint\">\n A secret cannot become a readable variable. Delete it and add a variable instead.\n </p>\n\n <div class=\"row\" style=\"margin-top: var(--s4)\">\n <button class=\"primary\" type=\"submit\" :disabled=\"!canSave\">\n {{ editing ? 'Save' : 'Add' }}\n </button>\n <button v-if=\"editing\" type=\"button\" class=\"ghost\" @click=\"cancelEdit\">Cancel</button>\n <span v-if=\"!editing\" class=\"mute\" style=\"font-size: var(--t-sm)\">\n Reference it as <code>${{ '{' }}{{ form.secret ? 'secrets' : 'vars' }}.{{ form.name || 'NAME' }}{{ '}' }}</code> in any spec\n </span>\n </div>\n <EquivalentCommand\n what=\"storing this value\"\n method=\"PUT\"\n :path=\"`/api/host-vars/${form.name || 'NAME'}`\"\n :body=\"{ value: form.secret ? '…' : form.value || '…', secret: form.secret }\"\n />\n </form>\n </section>\n </template>\n </div>\n</template>\n\n<style scoped>\ntd.right {\n text-align: end;\n}\ntd.right button {\n margin-inline-start: var(--s2);\n}\n.two-up > .field {\n /* A form caps itself even though the page does not — a 1300px-wide text input reads as a text\n editor, not a field. See docs/ui-rules.md. */\n flex: 1 1 200px;\n max-width: 420px;\n}\n</style>\n"],"names":["WITHHELD","entries","ref","loaded","listError","unsupported","vars","computed","e","secrets","varPairs","secretPairs","form","saving","importing","editing","NAME","canSave","load","r","api","problem","startEdit","cancelEdit","save","toast","importEntries","secret","pairs","failed","noun","stored","importVars","importSecrets","remove","_a","_createElementBlock","_createElementVNode","_hoisted_1","_createVNode","RefreshButton","_createBlock","ErrorNote","_openBlock","_hoisted_2","_cache","_Fragment","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_toDisplayString","_hoisted_7","_hoisted_8","_renderList","_hoisted_9","_hoisted_10","_hoisted_11","RelativeTime","_hoisted_12","$event","_hoisted_13","ActionButton","_hoisted_14","SkeletonList","VarIO","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_30","_vModelDynamic","_hoisted_32","_hoisted_33","_hoisted_34","_b","_vModelCheckbox","_c","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","EquivalentCommand"],"mappings":"olEAiDMA,GAAW,sFAXjB,MAAMC,EAAUC,EAAa,EAAE,EACzBC,EAASD,EAAI,EAAK,EAClBE,EAAYF,EAAI,EAAE,EAClBG,EAAcH,EAAI,EAAK,EAEvBI,EAAOC,EAAS,IAAMN,EAAQ,MAAM,OAAQO,GAAM,CAACA,EAAE,MAAM,CAAC,EAC5DC,EAAUF,EAAS,IAAMN,EAAQ,MAAM,OAAQO,GAAMA,EAAE,MAAM,CAAC,EAE9DE,EAAWH,EAAoB,IAAMD,EAAK,MAAM,IAAKE,IAAO,CAAE,EAAGA,EAAE,KAAM,EAAGA,EAAE,OAAS,EAAA,EAAK,CAAC,EAE7FG,EAAcJ,EAAoB,IAAME,EAAQ,MAAM,IAAKD,IAAO,CAAE,EAAGA,EAAE,KAAM,EAAG,EAAA,EAAK,CAAC,EAGxFI,EAAOV,EAAI,CAAE,KAAM,GAAI,MAAO,GAAI,OAAQ,GAAO,EACjDW,EAASX,EAAI,EAAK,EAClBY,EAAYZ,EAAI,EAAK,EAErBa,EAAUb,EAAkB,IAAI,EAEhCc,EAAO,2BACPC,EAAUV,EACd,IAAM,CAACM,EAAO,OAASG,EAAK,KAAKJ,EAAK,MAAM,IAAI,GAAKA,EAAK,MAAM,MAAM,OAAS,CAAA,EAGjF,eAAeM,GAAsB,CACnC,MAAMC,EAAI,MAAMC,EAAI,IAA0B,gBAAgB,EAE9D,GADAjB,EAAO,MAAQ,GACXgB,EAAE,SAAW,IAAK,CACpBd,EAAY,MAAQ,GACpB,MACF,CACA,GAAI,CAACc,EAAE,GAAI,CACTf,EAAU,MAAQiB,EAAQF,EAAG,oBAAoB,EACjD,MACF,CACAf,EAAU,MAAQ,GAClBH,EAAQ,MAAQkB,EAAE,KAAK,SAAW,CAAA,CACpC,CACKD,EAAA,EAEL,SAASI,EAAUd,EAAgB,CACjCO,EAAQ,MAAQP,EAChBI,EAAK,MAAQ,CAAE,KAAMJ,EAAE,KAAM,MAAOA,EAAE,OAAS,GAAI,OAAQA,EAAE,MAAA,CAC/D,CAEA,SAASe,GAAmB,CAC1BR,EAAQ,MAAQ,KAChBH,EAAK,MAAQ,CAAE,KAAM,GAAI,MAAO,GAAI,OAAQ,EAAA,CAC9C,CAEA,eAAeY,GAAsB,CACnCX,EAAO,MAAQ,GACf,MAAMM,EAAI,MAAMC,EAAI,IAAI,kBAAkBR,EAAK,MAAM,IAAI,GAAI,CAC3D,MAAOA,EAAK,MAAM,MAClB,OAAQA,EAAK,MAAM,MAAA,CACpB,EAED,GADAC,EAAO,MAAQ,GACX,CAACM,EAAE,GAAI,CACTf,EAAU,MAAQiB,EAAQF,EAAG,SAASP,EAAK,MAAM,IAAI,EAAE,EACvD,MACF,CACAR,EAAU,MAAQ,GAClBqB,EAAM,KAAM,GAAGV,EAAQ,MAAQ,QAAU,OAAO,IAAIH,EAAK,MAAM,IAAI,GAAG,EACtEW,EAAA,EACKL,EAAA,CACP,CAOA,eAAeQ,EAAcC,EAAiBC,EAAiC,CAC7Ed,EAAU,MAAQ,GAClB,MAAMe,EAAmB,CAAA,EACzB,UAAWrB,KAAKoB,GACJ,MAAMR,EAAI,IAAI,kBAAkB,mBAAmBZ,EAAE,CAAC,CAAC,GAAI,CAAE,MAAOA,EAAE,EAAG,OAAAmB,EAAQ,GACpF,IAAIE,EAAO,KAAKrB,EAAE,CAAC,EAE5BM,EAAU,MAAQ,GAClB,MAAMgB,EAAOH,EAAS,SAAW,WAC3BI,EAASH,EAAM,OAASC,EAAO,OACjCA,EAAO,OACTzB,EAAU,MAAQ,UAAU2B,CAAM,OAAOH,EAAM,MAAM,aAAaC,EAAO,KAAK,IAAI,CAAC,KAEnFzB,EAAU,MAAQ,GAClBqB,EAAM,KAAM,UAAUM,CAAM,IAAID,CAAI,GAAGC,IAAW,EAAI,GAAK,GAAG,GAAG,GAE9Db,EAAA,CACP,CAEA,MAAMc,EAAcJ,GAAoCF,EAAc,GAAOE,CAAK,EAC5EK,EAAiBL,GAAoCF,EAAc,GAAME,CAAK,EAEpF,eAAeM,EAAO1B,EAAyB,OAC7C,MAAMW,EAAI,MAAMC,EAAI,IAAI,kBAAkBZ,EAAE,IAAI,EAAE,EAClD,GAAI,CAACW,EAAE,GAAI,CACTf,EAAU,MAAQiB,EAAQF,EAAG,UAAUX,EAAE,IAAI,EAAE,EAC/C,MACF,CACAiB,EAAM,KAAM,WAAWjB,EAAE,IAAI,oCAAoC,IAC7D2B,EAAApB,EAAQ,QAAR,YAAAoB,EAAe,QAAS3B,EAAE,MAAMe,EAAA,EAC/BL,EAAA,CACP,oCAIEkB,EAoLM,MAAA,KAAA,CAnLJC,EAUM,MAVNC,GAUM,aATJD,EAMM,MAAA,KAAA,CALJA,EAAgC,UAA5B,qBAAuB,EAC3BA,EAGM,MAAA,CAHD,MAAM,KAAA,EAAM,qGAGjB,CAAA,mBAEFA,EAAqB,OAAA,CAAf,MAAM,MAAA,EAAM,KAAA,EAAA,GAClBE,EAA6BC,GAAA,CAAb,IAAKtB,EAAI,CAAA,GAGVd,EAAA,WAAjBqC,EAAsFC,GAAA,OAAzD,KAAMtC,EAAA,MAAW,MAAM,+BAAA,6BAErCC,EAAA,OAAfsC,IAAAP,EAKU,UALVQ,GAKU,CAAA,GAAAC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAJRR,EAGM,MAAA,CAHD,MAAM,gBAAc,CACvBA,EAAyC,SAAtC,oCAAkC,EACrCA,EAAqC,SAAlC,gCAA8B,CAAA,gBAIrCD,EA6JWU,EAAA,CAAA,IAAA,GAAA,CA5JTT,EAuFM,MAvFNU,GAuFM,CAtFJV,EAoCU,UApCVW,GAoCU,CAnCRX,EAIM,MAJNY,GAIM,CAHJJ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAR,EAAkC,KAAA,CAA9B,MAAM,SAAA,EAAU,YAAS,EAAA,eAC7BA,EAAqB,OAAA,CAAf,MAAM,MAAA,EAAM,KAAA,EAAA,GAClBA,EAA0E,OAA1Ea,GAA0EC,EAArB7C,EAAA,MAAK,MAAM,EAAA,CAAA,CAAA,GAG7CH,EAAA,MACHG,EAAA,MAAK,QAAvBqC,EAAA,EAAAP,EAsBQ,QAtBRgB,GAsBQ,aArBNf,EAOQ,QAAA,CAPD,KAAK,YAAU,CACpBA,EAKK,KAAA,CALD,KAAK,OAAK,CACZA,EAAiC,KAAA,CAA7B,KAAK,cAAA,EAAe,MAAI,EAC5BA,EAAkC,KAAA,CAA9B,KAAK,cAAA,EAAe,OAAK,EAC7BA,EAAoC,KAAA,CAAhC,KAAK,cAAA,EAAe,SAAO,EAC/BA,EAA+C,KAAA,CAA3C,KAAK,eAAe,aAAW,SAAA,WAGvCA,EAYQ,QAZRgB,GAYQ,QAXNjB,EAUKU,EAAA,KAAAQ,EAVWhD,EAAA,MAALE,QAAX4B,EAUK,KAAA,CAVkB,IAAK5B,EAAE,KAAM,KAAK,KAAA,GACvC6B,EAA6E,KAA7EkB,GAA6E,CAA9BlB,EAAyB,OAAA,KAAAc,EAAhB3C,EAAE,IAAI,EAAA,CAAA,CAAA,GAC9D6B,EAAmE,KAAnEmB,GAAmEL,EAAf3C,EAAE,KAAK,EAAA,CAAA,EAC3D6B,EAA+F,KAA/FoB,GAA+F,CAAvClB,EAAkCmB,EAAA,CAAnB,GAAIlD,EAAE,SAAA,mBAC7E6B,EAKK,KALLsB,GAKK,CAJHtB,EAA4D,SAAA,CAApD,MAAM,WAAY,QAAKuB,GAAEtC,EAAUd,CAAC,CAAA,EAAG,OAAI,EAAAqD,EAAA,EACnDtB,EAEeuB,EAAA,CAFD,MAAM,YAAa,QAAO,UAAYtD,EAAE,IAAI,IAAM,MAAGoD,GAAE1B,EAAO1B,CAAC,CAAA,aAAG,IAEhF,CAAA,GAAAqC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,GAFgF,WAEhF,EAAA,CAAA,uDAKRT,EAAyD,IAAzD2B,GAAuB,gCAA8B,QAxBrDtB,EAA8CuB,EAAA,OAAhB,KAAM,EAAG,KAAA,EAAA,IA0BvCzB,EAEQ0B,EAAA,CAFA,MAAOvD,EAAA,MAAW,KAAMI,EAAA,MAAW,aAAA,GAAY,QAAOkB,CAAA,aAC5D,IAAqF,CAAA,GAAAa,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAArFR,EAAqF,IAAA,CAAlF,MAAM,OAAO,MAAA,CAAA,aAAA,GAAA,CAAA,EAAsB,8CAA2C,EAAA,CAAA,gCAIrFA,EA+CU,UA/CV6B,GA+CU,CA9CR7B,EAIM,MAJN8B,GAIM,CAHJtB,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAgC,KAAA,CAA5B,MAAM,SAAA,EAAU,UAAO,EAAA,iBAC3BA,EAAqB,OAAA,CAAf,MAAM,MAAA,EAAM,KAAA,EAAA,GAClBA,EAA6E,OAA7E+B,GAA6EjB,EAAxB1C,EAAA,MAAQ,MAAM,EAAA,CAAA,CAAA,GAGhDN,EAAA,MACHM,EAAA,MAAQ,QAA1BkC,EAAA,EAAAP,EAoBQ,QApBRiC,GAoBQ,eAnBNhC,EAMQ,QAAA,CAND,KAAK,YAAU,CACpBA,EAIK,KAAA,CAJD,KAAK,OAAK,CACZA,EAAiC,KAAA,CAA7B,KAAK,cAAA,EAAe,MAAI,EAC5BA,EAAoC,KAAA,CAAhC,KAAK,cAAA,EAAe,SAAO,EAC/BA,EAA+C,KAAA,CAA3C,KAAK,eAAe,aAAW,SAAA,WAGvCA,EAWQ,QAXRiC,GAWQ,QAVNlC,EASKU,EAAA,KAAAQ,EATW7C,EAAA,MAALD,QAAX4B,EASK,KAAA,CATqB,IAAK5B,EAAE,KAAM,KAAK,KAAA,GAC1C6B,EAA6E,KAA7EkC,GAA6E,CAA9BlC,EAAyB,OAAA,KAAAc,EAAhB3C,EAAE,IAAI,EAAA,CAAA,CAAA,GAC9D6B,EAA+F,KAA/FmC,GAA+F,CAAvCjC,EAAkCmB,EAAA,CAAnB,GAAIlD,EAAE,SAAA,mBAC7E6B,EAKK,KALLoC,GAKK,CAJHpC,EAA+D,SAAA,CAAvD,MAAM,WAAY,QAAKuB,GAAEtC,EAAUd,CAAC,CAAA,EAAG,UAAO,EAAAkE,EAAA,EACtDnC,EAEeuB,EAAA,CAFD,MAAM,YAAa,QAAO,UAAYtD,EAAE,IAAI,IAAM,MAAGoD,GAAE1B,EAAO1B,CAAC,CAAA,aAAG,IAEhF,CAAA,GAAAqC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,GAFgF,WAEhF,EAAA,CAAA,uDAKRT,EAAuD,IAAvDuC,GAAuB,8BAA4B,QAtBnDlC,EAA8CuB,EAAA,OAAhB,KAAM,EAAG,KAAA,EAAA,kBA4BvC3B,EAAyF,IAAA,CAAtF,MAAM,QAAM,GAAC,wBAAsB,EAAAA,EAAiB,SAAd,YAAU,IAAI,gCAA8B,CAAA,OACrFE,EAUQ0B,EAAA,CATL,MAAOtD,EAAA,MACP,KAAMX,GACN,KAAMc,EAAA,MACP,aAAA,GACC,QAAOmB,CAAA,aAER,IAEI,CAAA,GAAAY,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAFJR,EAEI,IAAA,CAFD,MAAM,OAAO,MAAA,CAAA,aAAA,GAAA,CAAA,KAAsB,UAC7B,EAAAA,EAAiB,SAAd,YAAU,IAAI,8DAC1B,CAAA,uCAKNA,EAkEU,UAlEVuC,GAkEU,CAjERvC,EAEK,KAFLwC,GAEK1B,EADApC,EAAA,MAAWA,EAAA,MAAQ,OAAM,wBAA2BA,QAAQ,IAAI,GAAA,QAAaA,EAAA,MAAQ,IAAI,GAAA,0BAAA,EAAA,CAAA,EAG9FsB,EA4DO,OAAA,CA5DA,WAAgBb,EAAI,CAAA,SAAA,CAAA,CAAA,GACzBa,EAwBM,MAxBNyC,GAwBM,CAvBJzC,EAYQ,QAZR0C,GAYQ,CAXNlC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAiB,YAAX,OAAI,EAAA,KACVA,EASE,QAAA,CARc,sBAAAQ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAe,GAAAhD,EAAA,MAAK,KAAIgD,GACvB,KAAK,OACL,YAAY,cACZ,WAAW,QACX,aAAa,MACZ,WAAY7C,EAAA,MACb,mBAAiB,eAChB,eAAY,CAAA,CAAIH,EAAA,MAAK,MAAI,CAAKI,EAAK,KAAKJ,EAAA,MAAK,IAAI,CAAA,iBAPpCA,EAAA,MAAK,YAAX,CAAA,KAAR,EAAA,CAAwB,MAU5ByB,EASQ,QATR2C,GASQ,CARNnC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAR,EAAkB,YAAZ,QAAK,EAAA,KACXA,EAME,QAAA,CALS,sBAAAQ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAe,GAAAhD,EAAA,MAAK,MAAKgD,GAClB,KAAMhD,EAAA,MAAK,OAAM,WAAA,OACjB,aAAauB,EAAApB,EAAA,QAAA,MAAAoB,EAAS,OAAM,sBAAA,aAC7B,WAAW,QACX,aAAa,KAAA,cAJJ,CAAA8C,EAAArE,EAAA,MAAK,KAAK,CAAA,OASjBA,EAAA,MAAK,MAAI,CAAKI,EAAK,KAAKJ,EAAA,MAAK,IAAI,OADzCwB,EAOI,IAPJ8C,GAKC,0DAED,YAEA7C,EAKM,MALN8C,GAKM,CAJJ9C,EAGQ,QAHR+C,GAGQ,GAFN/C,EAAoF,QAAA,CAApE,sBAAAQ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAe,GAAAhD,EAAA,MAAK,OAAMgD,GAAE,KAAK,WAAY,WAAUyB,EAAAtE,EAAA,QAAA,YAAAsE,EAAS,UAAM,EAAA,cAAvD,CAAAC,GAAA1E,EAAA,MAAK,MAAM,CAAA,mBAAyD,4CAEtF,EAAA,EAAA,MAEO2E,EAAAxE,EAAA,QAAA,MAAAwE,EAAS,YAAlBnD,EAEI,IAFJoD,GAAuC,qFAEvC,YAEAnD,EAQM,MARNoD,GAQM,CAPJpD,EAES,SAAA,CAFD,MAAM,UAAU,KAAK,SAAU,UAAWpB,EAAA,KAAA,IAC7CF,EAAA,MAAO,OAAA,KAAA,EAAA,EAAA2E,EAAA,EAEE3E,EAAA,WAAdqB,EAAsF,SAAA,OAA/D,KAAK,SAAS,MAAM,QAAS,QAAOb,CAAA,EAAY,QAAM,YAChER,EAAA,gBAAb4B,IAAAP,EAEO,OAFPuD,GAEO,iBAF2D,oBAChD,EAAA,GAAAtD,EAAgG,OAAA,KAA1F,IAACc,EAAG,GAAG,IAAMvC,EAAA,MAAK,OAAM,UAAA,MAAA,EAAwB,IAACuC,EAAGvC,EAAA,MAAK,gBAAoB,GAAG,EAAA,CAAA,kBAAU,gBAClH,EAAA,EAAA,MAEF2B,EAKEqD,GAAA,CAJA,KAAK,qBACL,OAAO,MACN,KAAI,kBAAoBhF,EAAA,MAAK,MAAI,MAAA,GACjC,KAAI,CAAA,MAAWA,EAAA,MAAK,OAAM,IAASA,EAAA,MAAK,OAAK,IAAA,OAAiBA,EAAA,MAAK,MAAA,CAAM"}
|
|
1
|
+
{"version":3,"file":"VariablesView-qrqDNseI.js","sources":["../../src/views/VariablesView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Host variables & secrets — the GitHub model, scoped to this host.\n *\n * TWO SECTIONS BECAUSE THEY ARE TWO CONTRACTS. A variable's value is configuration anyone may read\n * back; a secret's value goes IN through this form and never comes back OUT — the list shows its\n * name and when it changed, nothing else, because the server keeps no route that returns it. The\n * form says so at the moment of storing, not in documentation nobody reads.\n *\n * Specs reference these as `${vars.NAME}` and `${secrets.NAME}` — spelled differently from plain\n * `${NAME}` on purpose, so a spec that reads host state says so on its face.\n *\n * THE TWO CONTRACTS DECIDE WHAT `VarIO` MAY DO HERE, and each panel mounts its own:\n * - A copied secret list carries NAMES ONLY. There is no value to copy — the API never returns\n * one — and copying the mask would put `••••••••` in a `.env` someone then deploys with,\n * which is a real value that fails somewhere far away from here. Empty is honest, and pstack\n * treats an empty variable as undefined (invariant 7), so a paste of one fails loudly at\n * resolve time instead of quietly running with a wrong value.\n * - An import therefore SKIPS an entry with no value rather than storing `\"\"` over a live\n * secret. Copy this page's secrets and paste them straight back and nothing changes — which is\n * the only safe answer for an export that cannot contain what it lists.\n * - Only merge is offered. A \"replace\" would have to delete the names a paste omits, and this\n * page's deletes are one confirmed click each for a reason.\n */\nimport { computed, ref } from 'vue';\nimport { api, problem } from '../api/client';\nimport type { VarPair } from '../api/types';\nimport { toast } from '../composables/useToasts';\nimport ActionButton from '../components/ActionButton.vue';\nimport EquivalentCommand from '../components/EquivalentCommand.vue';\nimport ErrorNote from '../components/ErrorNote.vue';\nimport RelativeTime from '../components/RelativeTime.vue';\nimport SkeletonList from '../components/SkeletonList.vue';\nimport RefreshButton from '../components/RefreshButton.vue';\nimport VarIO from '../components/VarIO.vue';\n\ntype Entry = { name: string; value: string | null; secret: boolean; updatedAt: number };\n\nconst entries = ref<Entry[]>([]);\nconst loaded = ref(false);\nconst listError = ref('');\nconst unsupported = ref(false);\n\nconst vars = computed(() => entries.value.filter((e) => !e.secret));\nconst secrets = computed(() => entries.value.filter((e) => e.secret));\n\nconst varPairs = computed<VarPair[]>(() => vars.value.map((e) => ({ k: e.name, v: e.value ?? '' })));\n/** Names with no values — see the header. `WITHHELD` travels with the `.env` export. */\nconst secretPairs = computed<VarPair[]>(() => secrets.value.map((e) => ({ k: e.name, v: '' })));\nconst WITHHELD = 'Values are never exported. Fill each one in.';\n\nconst form = ref({ name: '', value: '', secret: false });\nconst saving = ref(false);\nconst importing = ref(false);\n/** Editing state: the row being replaced. For a secret this means re-entering the value. */\nconst editing = ref<Entry | null>(null);\n\nconst NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst canSave = computed(\n () => !saving.value && NAME.test(form.value.name) && form.value.value.length > 0,\n);\n\nasync function load(): Promise<void> {\n const r = await api.get<{ entries: Entry[] }>('/api/host-vars');\n loaded.value = true;\n if (r.status === 404) {\n unsupported.value = true;\n return;\n }\n if (!r.ok) {\n listError.value = problem(r, 'load the variables');\n return;\n }\n listError.value = '';\n entries.value = r.body.entries ?? [];\n}\nvoid load();\n\nfunction startEdit(e: Entry): void {\n editing.value = e;\n form.value = { name: e.name, value: e.value ?? '', secret: e.secret };\n}\n\nfunction cancelEdit(): void {\n editing.value = null;\n form.value = { name: '', value: '', secret: false };\n}\n\nasync function save(): Promise<void> {\n saving.value = true;\n const r = await api.put(`/api/host-vars/${form.value.name}`, {\n value: form.value.value,\n secret: form.value.secret,\n });\n saving.value = false;\n if (!r.ok) {\n listError.value = problem(r, `store ${form.value.name}`);\n return;\n }\n listError.value = '';\n toast('ok', `${editing.value ? 'Saved' : 'Added'} ${form.value.name}.`);\n cancelEdit();\n void load();\n}\n\n/**\n * One PUT per entry: there is no bulk route, and inventing one so a paste box can be one request\n * is a route this feature does not need. Sequential, and every failure is named — \"3 of 5 stored,\n * these 2 failed\" is something an operator can act on; a single red toast is not.\n */\nasync function importEntries(secret: boolean, pairs: VarPair[]): Promise<void> {\n importing.value = true;\n const failed: string[] = [];\n for (const e of pairs) {\n const r = await api.put(`/api/host-vars/${encodeURIComponent(e.k)}`, { value: e.v, secret });\n if (!r.ok) failed.push(e.k);\n }\n importing.value = false;\n const noun = secret ? 'secret' : 'variable';\n const stored = pairs.length - failed.length;\n if (failed.length) {\n listError.value = `Stored ${stored} of ${pairs.length}. Failed: ${failed.join(', ')}.`;\n } else {\n listError.value = '';\n toast('ok', `Stored ${stored} ${noun}${stored === 1 ? '' : 's'}.`);\n }\n void load();\n}\n\nconst importVars = (pairs: VarPair[]): Promise<void> => importEntries(false, pairs);\nconst importSecrets = (pairs: VarPair[]): Promise<void> => importEntries(true, pairs);\n\nasync function remove(e: Entry): Promise<void> {\n const r = await api.del(`/api/host-vars/${e.name}`);\n if (!r.ok) {\n listError.value = problem(r, `delete ${e.name}`);\n return;\n }\n toast('ok', `Deleted ${e.name}. Specs using it will not resolve.`);\n if (editing.value?.name === e.name) cancelEdit();\n void load();\n}\n</script>\n\n<template>\n <div>\n <div class=\"page-head\">\n <div>\n <h1>Variables & secrets</h1>\n <div class=\"sub\">\n Host-level values every spec can reference. Deleting one stops the specs using it from\n resolving.\n </div>\n </div>\n <span class=\"grow\" />\n <RefreshButton :run=\"load\" />\n </div>\n\n <ErrorNote v-if=\"listError\" :text=\"listError\" title=\"Could not load the variables.\" />\n\n <section v-if=\"unsupported\" class=\"panel\">\n <div class=\"banner plain\">\n <b>This server has no variable store.</b>\n <p>Upgrade the host to use these.</p>\n </div>\n </section>\n\n <template v-else>\n <div class=\"grid-2\">\n <section class=\"panel\">\n <div class=\"phead\">\n <h2 class=\"section\">Variables</h2>\n <span class=\"grow\" />\n <span class=\"mute\" style=\"font-size: var(--t-xs)\">{{ vars.length }}</span>\n </div>\n\n <SkeletonList v-if=\"!loaded\" :rows=\"2\" tall />\n <table v-else-if=\"vars.length\" role=\"table\" class=\"cards\">\n <thead role=\"rowgroup\">\n <tr role=\"row\">\n <th role=\"columnheader\">Name</th>\n <th role=\"columnheader\">Value</th>\n <th role=\"columnheader\">Updated</th>\n <th role=\"columnheader\" aria-label=\"Actions\" />\n </tr>\n </thead>\n <tbody role=\"rowgroup\">\n <tr v-for=\"e in vars\" :key=\"e.name\" role=\"row\">\n <td role=\"cell\" class=\"name\" data-label=\"name\"><code>{{ e.name }}</code></td>\n <td role=\"cell\" class=\"break\" data-label=\"value\">{{ e.value }}</td>\n <td role=\"cell\" class=\"dim nowrap\" data-label=\"updated\"><RelativeTime :at=\"e.updatedAt\" /></td>\n <td role=\"cell\" class=\"right nowrap\" data-label=\"\">\n <button class=\"ghost sm\" @click=\"startEdit(e)\">Edit</button>\n <ActionButton class=\"danger sm\" :confirm=\"`Delete ${e.name}?`\" @run=\"remove(e)\">\n Delete\n </ActionButton>\n </td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"hint\">Add your first variable below.</p>\n\n <VarIO :pairs=\"varPairs\" :busy=\"importing\" skip-empty @apply=\"importVars\">\n <p class=\"hint\" style=\"margin-top: 0\">Overwrites matching names. Deletes nothing.</p>\n </VarIO>\n </section>\n\n <section class=\"panel\">\n <div class=\"phead\">\n <h2 class=\"section\">Secrets</h2>\n <span class=\"grow\" />\n <span class=\"mute\" style=\"font-size: var(--t-xs)\">{{ secrets.length }}</span>\n </div>\n\n <SkeletonList v-if=\"!loaded\" :rows=\"2\" tall />\n <table v-else-if=\"secrets.length\" role=\"table\" class=\"cards\">\n <thead role=\"rowgroup\">\n <tr role=\"row\">\n <th role=\"columnheader\">Name</th>\n <th role=\"columnheader\">Updated</th>\n <th role=\"columnheader\" aria-label=\"Actions\" />\n </tr>\n </thead>\n <tbody role=\"rowgroup\">\n <tr v-for=\"e in secrets\" :key=\"e.name\" role=\"row\">\n <td role=\"cell\" class=\"name\" data-label=\"name\"><code>{{ e.name }}</code></td>\n <td role=\"cell\" class=\"dim nowrap\" data-label=\"updated\"><RelativeTime :at=\"e.updatedAt\" /></td>\n <td role=\"cell\" class=\"right nowrap\" data-label=\"\">\n <button class=\"ghost sm\" @click=\"startEdit(e)\">Replace</button>\n <ActionButton class=\"danger sm\" :confirm=\"`Delete ${e.name}?`\" @run=\"remove(e)\">\n Delete\n </ActionButton>\n </td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"hint\">Add your first secret below.</p>\n\n <!--\n Said on the page, not only in the copied file: an export that cannot contain the thing\n it lists has to admit that where the button is.\n -->\n <p class=\"hint\">A copied list carries <b>names only</b> — values cannot be read back.</p>\n <VarIO\n :pairs=\"secretPairs\"\n :note=\"WITHHELD\"\n :busy=\"importing\"\n skip-empty\n @apply=\"importSecrets\"\n >\n <p class=\"hint\" style=\"margin-top: 0\">\n Stored <b>write-only</b>. Empty lines are skipped, never stored over a live secret.\n </p>\n </VarIO>\n </section>\n </div>\n\n <section class=\"panel\">\n <h2 class=\"section\" style=\"margin-bottom: var(--s3)\">\n {{ editing ? (editing.secret ? `Replace the value of ${editing.name}` : `Edit ${editing.name}`) : 'Add a variable or secret' }}\n </h2>\n\n <form @submit.prevent=\"save\">\n <div class=\"row wrap two-up\">\n <label class=\"field grow\">\n <span>Name</span>\n <input\n v-model.trim=\"form.name\"\n type=\"text\"\n placeholder=\"DB_PASSWORD\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n :disabled=\"!!editing\"\n aria-describedby=\"var-name-err\"\n :aria-invalid=\"!!form.name && !NAME.test(form.name)\"\n />\n </label>\n <label class=\"field grow\">\n <span>Value</span>\n <input\n v-model=\"form.value\"\n :type=\"form.secret ? 'password' : 'text'\"\n :placeholder=\"editing?.secret ? 'enter the new value' : 'eu-central'\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n />\n </label>\n </div>\n <p\n v-if=\"form.name && !NAME.test(form.name)\"\n id=\"var-name-err\"\n class=\"s-failed\"\n style=\"margin-top: var(--s2)\"\n >\n Letters, digits and _ only, not starting with a digit.\n </p>\n\n <div class=\"row\" style=\"margin-top: var(--s3)\">\n <label class=\"check\">\n <input v-model=\"form.secret\" type=\"checkbox\" :disabled=\"editing?.secret === true\" />\n Secret — the value is never shown again\n </label>\n </div>\n <p v-if=\"editing?.secret\" class=\"hint\">\n A secret cannot become a readable variable. Delete it and add a variable instead.\n </p>\n\n <div class=\"row\" style=\"margin-top: var(--s4)\">\n <button class=\"primary\" type=\"submit\" :disabled=\"!canSave\">\n {{ editing ? 'Save' : 'Add' }}\n </button>\n <button v-if=\"editing\" type=\"button\" class=\"ghost\" @click=\"cancelEdit\">Cancel</button>\n <span v-if=\"!editing\" class=\"mute\" style=\"font-size: var(--t-sm)\">\n Reference it as <code>${{ '{' }}{{ form.secret ? 'secrets' : 'vars' }}.{{ form.name || 'NAME' }}{{ '}' }}</code> in any spec\n </span>\n </div>\n <EquivalentCommand\n what=\"storing this value\"\n method=\"PUT\"\n :path=\"`/api/host-vars/${form.name || 'NAME'}`\"\n :body=\"{ value: form.secret ? '…' : form.value || '…', secret: form.secret }\"\n />\n </form>\n </section>\n </template>\n </div>\n</template>\n\n<style scoped>\ntd.right {\n text-align: end;\n}\ntd.right button {\n margin-inline-start: var(--s2);\n}\n.two-up > .field {\n /* A form caps itself even though the page does not — a 1300px-wide text input reads as a text\n editor, not a field. See docs/ui-rules.md. */\n flex: 1 1 200px;\n max-width: 420px;\n}\n</style>\n"],"names":["WITHHELD","entries","ref","loaded","listError","unsupported","vars","computed","e","secrets","varPairs","secretPairs","form","saving","importing","editing","NAME","canSave","load","r","api","problem","startEdit","cancelEdit","save","toast","importEntries","secret","pairs","failed","noun","stored","importVars","importSecrets","remove","_a","_createElementBlock","_createElementVNode","_hoisted_1","_createVNode","RefreshButton","_createBlock","ErrorNote","_openBlock","_hoisted_2","_cache","_Fragment","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_toDisplayString","_hoisted_7","_hoisted_8","_renderList","_hoisted_9","_hoisted_10","_hoisted_11","RelativeTime","_hoisted_12","$event","_hoisted_13","ActionButton","_hoisted_14","SkeletonList","VarIO","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_30","_vModelDynamic","_hoisted_32","_hoisted_33","_hoisted_34","_b","_vModelCheckbox","_c","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","EquivalentCommand"],"mappings":"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"}
|