@elementspanel/panel 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/app.js +3940 -180
  2. package/app.js.map +1 -1
  3. package/package.json +18 -18
  4. package/public/assets/{AppDialog.vue_vue_type_style_index_0_lang-8b56f871.js → AppDialog.vue_vue_type_style_index_0_lang-e6e38e8b.js} +2 -2
  5. package/public/assets/AppDialog.vue_vue_type_style_index_0_lang-e6e38e8b.js.map +1 -0
  6. package/public/assets/CardPanel-59b7da2e.js +2 -0
  7. package/public/assets/CardPanel-59b7da2e.js.map +1 -0
  8. package/public/assets/{DesktopDialog-081410ca.js → DesktopDialog-e4041e4e.js} +2 -2
  9. package/public/assets/DesktopDialog-e4041e4e.js.map +1 -0
  10. package/public/assets/{Loading.vue_vue_type_script_setup_true_lang-9e79de95.js → Loading.vue_vue_type_script_setup_true_lang-1b74dd54.js} +2 -2
  11. package/public/assets/Loading.vue_vue_type_script_setup_true_lang-1b74dd54.js.map +1 -0
  12. package/public/assets/{PageToolbar-5ca1a069.js → PageToolbar-7130e13d.js} +2 -2
  13. package/public/assets/PageToolbar-7130e13d.js.map +1 -0
  14. package/public/assets/{_elements-sdk_pinia-fc8ba898.js → _elements-sdk_pinia-2c56d2c1.js} +3 -3
  15. package/public/assets/{_elements-sdk_pinia-fc8ba898.js.map → _elements-sdk_pinia-2c56d2c1.js.map} +1 -1
  16. package/public/assets/{_elements-sdk_vue-b86b0db6.js → _elements-sdk_vue-80f42d87.js} +2 -2
  17. package/public/assets/_elements-sdk_vue-80f42d87.js.map +1 -0
  18. package/public/assets/{_elements-sdk_vue-i18n-64f8e172.js → _elements-sdk_vue-i18n-4b8a106a.js} +2 -2
  19. package/public/assets/_elements-sdk_vue-i18n-4b8a106a.js.map +1 -0
  20. package/public/assets/{_elements-sdk_vue-router-a62f518d.js → _elements-sdk_vue-router-a171591a.js} +2 -2
  21. package/public/assets/_elements-sdk_vue-router-a171591a.js.map +1 -0
  22. package/public/assets/{const-cfe7ddfe.js → const-93b324c0.js} +2 -2
  23. package/public/assets/const-93b324c0.js.map +1 -0
  24. package/public/assets/{const-01673e6b.js → const-ea30795c.js} +2 -2
  25. package/public/assets/const-ea30795c.js.map +1 -0
  26. package/public/assets/{context-b16af9cc.js → context-cc90576e.js} +2 -2
  27. package/public/assets/{context-b16af9cc.js.map → context-cc90576e.js.map} +1 -1
  28. package/public/assets/{copy-4d64fc1f.js → copy-b106bb10.js} +2 -2
  29. package/public/assets/copy-b106bb10.js.map +1 -0
  30. package/public/assets/{core-b6992169.js → core-d3bfdede.js} +2 -2
  31. package/public/assets/core-d3bfdede.js.map +1 -0
  32. package/public/assets/{desktopNotice-2c886f6b.js → desktopNotice-5ca3448c.js} +2 -2
  33. package/public/assets/desktopNotice-5ca3448c.js.map +1 -0
  34. package/public/assets/dom-ff483262.js.map +1 -1
  35. package/public/assets/{i18n-fe0f1ee7.js → i18n-e810b9fa.js} +2 -2
  36. package/public/assets/i18n-e810b9fa.js.map +1 -0
  37. package/public/assets/{index-76b0df52.js → index-6e8d74f8.js} +2 -2
  38. package/public/assets/{index-76b0df52.js.map → index-6e8d74f8.js.map} +1 -1
  39. package/public/assets/index-e3f35709.js.map +1 -1
  40. package/public/assets/{instance-26cca4c8.js → instance-cc59e210.js} +2 -2
  41. package/public/assets/instance-cc59e210.js.map +1 -0
  42. package/public/assets/lodash-001e4f93.js.map +1 -1
  43. package/public/assets/{nodes-402cdcbd.js → nodes-a56b1b35.js} +2 -2
  44. package/public/assets/nodes-a56b1b35.js.map +1 -0
  45. package/public/assets/protocol-97f7bab7.js.map +1 -1
  46. package/public/assets/randId-56f93901.js +2 -0
  47. package/public/assets/randId-56f93901.js.map +1 -0
  48. package/public/assets/{router-0f7d4714.js → router-eff205cc.js} +2 -2
  49. package/public/assets/router-eff205cc.js.map +1 -0
  50. package/public/assets/safe-87846d89.js.map +1 -1
  51. package/public/assets/{sdk-01dda668.js → sdk-3f2277ab.js} +2 -2
  52. package/public/assets/sdk-3f2277ab.js.map +1 -0
  53. package/public/assets/{shared-f2e37690.js → shared-597ef52b.js} +2 -2
  54. package/public/assets/shared-597ef52b.js.map +1 -0
  55. package/public/assets/{useAppConfigStore-289073ec.js → useAppConfigStore-352fe033.js} +2 -2
  56. package/public/assets/useAppConfigStore-352fe033.js.map +1 -0
  57. package/public/assets/useAppRouters-747b627a.js +2 -0
  58. package/public/assets/useAppRouters-747b627a.js.map +1 -0
  59. package/public/assets/{useAppStateStore-a644582a.js → useAppStateStore-a438b9a6.js} +2 -2
  60. package/public/assets/useAppStateStore-a438b9a6.js.map +1 -0
  61. package/public/assets/{useAppToolsStore-3a911226.js → useAppToolsStore-288c4fe8.js} +2 -2
  62. package/public/assets/useAppToolsStore-288c4fe8.js.map +1 -0
  63. package/public/assets/{useDefineApi-ead2616e.js → useDefineApi-b726db1e.js} +2 -2
  64. package/public/assets/useDefineApi-b726db1e.js.map +1 -0
  65. package/public/assets/{useInstanceActionAvailability-dec16c10.js → useInstanceActionAvailability-16de3001.js} +2 -2
  66. package/public/assets/useInstanceActionAvailability-16de3001.js.map +1 -0
  67. package/public/assets/{useKeyboardEvents-dba9d5ca.js → useKeyboardEvents-6f7f845c.js} +2 -2
  68. package/public/assets/useKeyboardEvents-6f7f845c.js.map +1 -0
  69. package/public/assets/{useMountComponent-dd1fcfea.js → useMountComponent-4043cb4c.js} +2 -2
  70. package/public/assets/useMountComponent-4043cb4c.js.map +1 -0
  71. package/public/assets/{useOverviewChart-119bda3b.js → useOverviewChart-7d758bc4.js} +2 -2
  72. package/public/assets/useOverviewChart-7d758bc4.js.map +1 -0
  73. package/public/assets/{useOverviewInfo-a149d634.js → useOverviewInfo-9ca25ab9.js} +2 -2
  74. package/public/assets/useOverviewInfo-9ca25ab9.js.map +1 -0
  75. package/public/assets/{usePolling-f2f09d27.js → usePolling-1bc2009b.js} +2 -2
  76. package/public/assets/usePolling-1bc2009b.js.map +1 -0
  77. package/public/assets/{useScreen-e3715e1f.js → useScreen-fad29b7c.js} +2 -2
  78. package/public/assets/useScreen-fad29b7c.js.map +1 -0
  79. package/public/assets/{useSocketIo-bc0a62c2.js → useSocketIo-ea3c9a61.js} +2 -2
  80. package/public/assets/useSocketIo-ea3c9a61.js.map +1 -0
  81. package/public/assets/{useThemeSwitch-6ff90248.js → useThemeSwitch-dc70883c.js} +2 -2
  82. package/public/assets/useThemeSwitch-dc70883c.js.map +1 -0
  83. package/public/assets/{vue-2433bd89.js → vue-6b52a630.js} +2 -2
  84. package/public/assets/{vue-2433bd89.js.map → vue-6b52a630.js.map} +1 -1
  85. package/public/assets/{vuetifyModal-49cb95ba.js → vuetifyModal-8382b175.js} +2 -2
  86. package/public/assets/vuetifyModal-8382b175.js.map +1 -0
  87. package/public/index.html +4 -4
  88. package/public/stats.html +2 -2
  89. package/runtime/npm-plugins.cjs +42 -11
  90. package/runtime/plugin-resolution.cjs +27 -9
  91. package/public/assets/AppDialog.vue_vue_type_style_index_0_lang-8b56f871.js.map +0 -1
  92. package/public/assets/CardPanel-a704f146.js +0 -2
  93. package/public/assets/CardPanel-a704f146.js.map +0 -1
  94. package/public/assets/DesktopDialog-081410ca.js.map +0 -1
  95. package/public/assets/Loading.vue_vue_type_script_setup_true_lang-9e79de95.js.map +0 -1
  96. package/public/assets/PageToolbar-5ca1a069.js.map +0 -1
  97. package/public/assets/_elements-sdk_vue-b86b0db6.js.map +0 -1
  98. package/public/assets/_elements-sdk_vue-i18n-64f8e172.js.map +0 -1
  99. package/public/assets/_elements-sdk_vue-router-a62f518d.js.map +0 -1
  100. package/public/assets/const-01673e6b.js.map +0 -1
  101. package/public/assets/const-cfe7ddfe.js.map +0 -1
  102. package/public/assets/copy-4d64fc1f.js.map +0 -1
  103. package/public/assets/core-b6992169.js.map +0 -1
  104. package/public/assets/desktopNotice-2c886f6b.js.map +0 -1
  105. package/public/assets/i18n-fe0f1ee7.js.map +0 -1
  106. package/public/assets/instance-26cca4c8.js.map +0 -1
  107. package/public/assets/nodes-402cdcbd.js.map +0 -1
  108. package/public/assets/randId-ed0b95b7.js +0 -2
  109. package/public/assets/randId-ed0b95b7.js.map +0 -1
  110. package/public/assets/router-0f7d4714.js.map +0 -1
  111. package/public/assets/sdk-01dda668.js.map +0 -1
  112. package/public/assets/shared-f2e37690.js.map +0 -1
  113. package/public/assets/useAppConfigStore-289073ec.js.map +0 -1
  114. package/public/assets/useAppRouters-5f58db32.js +0 -2
  115. package/public/assets/useAppRouters-5f58db32.js.map +0 -1
  116. package/public/assets/useAppStateStore-a644582a.js.map +0 -1
  117. package/public/assets/useAppToolsStore-3a911226.js.map +0 -1
  118. package/public/assets/useDefineApi-ead2616e.js.map +0 -1
  119. package/public/assets/useInstanceActionAvailability-dec16c10.js.map +0 -1
  120. package/public/assets/useKeyboardEvents-dba9d5ca.js.map +0 -1
  121. package/public/assets/useMountComponent-dd1fcfea.js.map +0 -1
  122. package/public/assets/useOverviewChart-119bda3b.js.map +0 -1
  123. package/public/assets/useOverviewInfo-a149d634.js.map +0 -1
  124. package/public/assets/usePolling-f2f09d27.js.map +0 -1
  125. package/public/assets/useScreen-e3715e1f.js.map +0 -1
  126. package/public/assets/useSocketIo-bc0a62c2.js.map +0 -1
  127. package/public/assets/useThemeSwitch-6ff90248.js.map +0 -1
  128. package/public/assets/vuetifyModal-49cb95ba.js.map +0 -1
@@ -14,6 +14,15 @@ const readOptional = (filename) => {
14
14
  const validId = /^[a-z][a-z0-9_-]{1,63}$/;
15
15
  const validName = /^(?:@[a-z0-9_.-]+\/)?epanel-plugin-[a-z0-9_.-]+$/;
16
16
 
17
+ function packageManifest(root, name) {
18
+ const localRequire = createRequire(path.join(root, "package.json"));
19
+ const filename = (localRequire.resolve.paths(name) || [])
20
+ .map((directory) => path.join(directory, name, "package.json"))
21
+ .find((candidate) => fs.existsSync(candidate));
22
+ if (!filename) throw new Error(`Missing npm package: ${name}`);
23
+ return fs.realpathSync(filename);
24
+ }
25
+
17
26
  function within(root, filename) {
18
27
  const relative = path.relative(root, filename);
19
28
  return (
@@ -25,9 +34,10 @@ function within(root, filename) {
25
34
  function projectRoot(packageRoot) {
26
35
  if (process.env.EPANEL_PROJECT_ROOT) return path.resolve(process.env.EPANEL_PROJECT_ROOT);
27
36
  const parent = path.resolve(packageRoot, "..");
37
+ if (path.basename(parent) === "core") return path.dirname(parent);
28
38
  // An installed runtime sits at <project>/node_modules/@scope/<side>; the
29
39
  // project itself is three levels above the package. A development checkout
30
- // sits directly under the project instead.
40
+ // sits below core/ and is handled above.
31
41
  const scope = parent;
32
42
  const nodeModules = path.dirname(scope);
33
43
  if (path.basename(nodeModules) === "node_modules" && path.basename(scope).startsWith("@")) {
@@ -73,15 +83,29 @@ function resolveNpmPlugins(packageRoot, side, options = {}) {
73
83
  // Project mappings are read first so the host's built-in plugins win an id
74
84
  // collision: a market package must not shadow a plugin that ships with the runtime.
75
85
  const configured = new Map();
76
- for (const [id, name] of Object.entries(mappingOf(project))) configured.set(id, { name, source: "project" });
77
- for (const [id, name] of Object.entries(mappingOf(host))) configured.set(id, { name, source: "bundled" });
86
+ for (const [id, name] of Object.entries(mappingOf(project)))
87
+ configured.set(id, { name, source: "project" });
88
+ for (const name of Object.keys(dependenciesOf(project))) {
89
+ if (!validName.test(name) || [...configured.values()].some((item) => item.name === name))
90
+ continue;
91
+ try {
92
+ const metadata = readJson(packageManifest(projectRoot(packageRoot), name));
93
+ const id = metadata.elementspanel?.id;
94
+ if (validId.test(id) && !configured.has(id))
95
+ configured.set(id, { name, source: "project", automatic: true });
96
+ } catch {
97
+ /* Ignore incomplete npm installations until the next scan. */
98
+ }
99
+ }
100
+ for (const [id, name] of Object.entries(mappingOf(host))) {
101
+ if (dependenciesOf(host)[name] !== undefined) configured.set(id, { name, source: "bundled" });
102
+ }
78
103
 
79
104
  const hostDependencies = dependenciesOf(host);
80
105
  const projectDependencies = dependenciesOf(project);
81
106
  const roots = [packageRoot];
82
107
  const parentRoot = projectRoot(packageRoot);
83
108
  if (path.resolve(parentRoot) !== path.resolve(packageRoot)) roots.push(parentRoot);
84
- const requireAt = (root) => createRequire(path.join(root, "package.json"));
85
109
  const folders = new Set();
86
110
  const records = [];
87
111
 
@@ -99,9 +123,9 @@ function resolveNpmPlugins(packageRoot, side, options = {}) {
99
123
 
100
124
  let manifestPath;
101
125
  let failure;
102
- for (const root of roots) {
126
+ for (const root of mapping.source === "project" ? [...roots].reverse() : roots) {
103
127
  try {
104
- manifestPath = requireAt(root).resolve(`${name}/package.json`);
128
+ manifestPath = packageManifest(root, name);
105
129
  break;
106
130
  } catch (error) {
107
131
  failure = error;
@@ -142,16 +166,23 @@ function resolveNpmPlugins(packageRoot, side, options = {}) {
142
166
  if (skipInvalid) continue;
143
167
  throw new Error(`Npm plugin entry escapes its package: ${name}.`);
144
168
  }
145
- let manifest;
169
+ let entries;
146
170
  try {
147
- manifest = readJson(path.join(directory, "plugin.json"));
171
+ entries = readJson(path.join(directory, "plugin.json"));
148
172
  } catch (error) {
149
173
  if (skipInvalid) continue;
150
174
  throw error;
151
175
  }
152
- if (manifest.id !== id || manifest.version !== metadata.version) {
176
+ if (
177
+ metadata.elementspanel?.id !== id ||
178
+ typeof metadata.version !== "string" ||
179
+ !metadata.version.trim() ||
180
+ !entries ||
181
+ typeof entries !== "object" ||
182
+ Array.isArray(entries)
183
+ ) {
153
184
  if (skipInvalid) continue;
154
- throw new Error(`Npm plugin identity or version does not match its manifest: ${name}.`);
185
+ throw new Error(`Invalid npm plugin identity or version in package.json: ${name}.`);
155
186
  }
156
187
  if (folders.has(definition.folder)) {
157
188
  if (skipInvalid) continue;
@@ -163,7 +194,7 @@ function resolveNpmPlugins(packageRoot, side, options = {}) {
163
194
  name,
164
195
  version: metadata.version,
165
196
  source: mapping.source,
166
- defaultEnabled: mapping.source !== "project",
197
+ defaultEnabled: mapping.automatic === true || mapping.source !== "project",
167
198
  packageRoot: pluginRoot,
168
199
  directory,
169
200
  folder: definition.folder,
@@ -12,26 +12,37 @@ const shared = new Set(sharedModules);
12
12
  * running. Caching the npm plugin list by the project manifest's mtime lets a
13
13
  * freshly installed package be resolved without restarting the process.
14
14
  */
15
- let npmPluginSnapshot = { key: "", records: [] };
15
+ let npmPluginSnapshot = { key: "", records: [], expires: 0 };
16
16
 
17
17
  function fileStamp(filename) {
18
18
  try {
19
- return String(fs.statSync(filename).mtimeMs);
19
+ const stat = fs.statSync(filename);
20
+ return `${stat.size}:${stat.mtimeMs}:${stat.ctimeMs}`;
20
21
  } catch {
21
22
  return "-";
22
23
  }
23
24
  }
24
25
 
25
26
  function npmPlugins(packageRoot) {
26
- const files = [path.join(packageRoot, "package.json")];
27
+ const files = [];
27
28
  const projectFile = projectManifestFile(packageRoot);
28
- if (projectFile) files.push(projectFile);
29
+ for (const root of [packageRoot, ...(projectFile ? [path.dirname(projectFile)] : [])]) {
30
+ for (const filename of [
31
+ "package.json",
32
+ "package-lock.json",
33
+ "npm-shrinkwrap.json",
34
+ "node_modules/.package-lock.json",
35
+ "node_modules"
36
+ ])
37
+ files.push(path.join(root, filename));
38
+ }
29
39
  // Paths are part of the key: two fixtures created within the same millisecond
30
40
  // must not share a cached plugin list.
31
41
  const key = files.map((file) => `${file}:${fileStamp(file)}`).join("|");
32
- if (key !== npmPluginSnapshot.key) {
42
+ if (key !== npmPluginSnapshot.key || Date.now() >= npmPluginSnapshot.expires) {
33
43
  npmPluginSnapshot = {
34
44
  key,
45
+ expires: Date.now() + 2000,
35
46
  records: resolveNpmPlugins(packageRoot, undefined, { skipInvalid: true })
36
47
  };
37
48
  }
@@ -39,8 +50,9 @@ function npmPlugins(packageRoot) {
39
50
  }
40
51
 
41
52
  function resolveFile(filename, context, nextResolve) {
53
+ // Node.js versions expose hook conditions as either an array or a Set.
42
54
  return nextResolve(
43
- context.conditions.includes("require") ? filename : pathToFileURL(filename).href,
55
+ Array.from(context.conditions).includes("require") ? filename : pathToFileURL(filename).href,
44
56
  context
45
57
  );
46
58
  }
@@ -60,9 +72,15 @@ function installPluginResolution(packageRoot, workRoot) {
60
72
  const hostURL = pathToFileURL(path.join(packageRoot, "app.js")).href;
61
73
  const hostRequire = createRequire(hostURL);
62
74
  const resolveShared = createSharedResolver(packageRoot);
63
- // Development checkouts load their source plugins from <side>/plugins; a
75
+ // Development checkouts load unified source packages from <project>/plugins; a
64
76
  // published runtime loads npm plugins only and has no source root.
65
- const roots = process.env.EPANEL_PACKAGE_ROOT ? [] : [path.join(workRoot, "plugins")];
77
+ const roots = process.env.EPANEL_PACKAGE_ROOT
78
+ ? []
79
+ : [
80
+ path.basename(path.dirname(packageRoot)) === "core"
81
+ ? path.resolve(packageRoot, "../../plugins")
82
+ : path.join(workRoot, "plugins")
83
+ ];
66
84
  // Node 24 routes require.resolve() calls made by this hook back through the
67
85
  // hook itself. Without this guard, resolving plugin metadata recurses forever.
68
86
  let resolving = false;
@@ -107,7 +125,7 @@ function installPluginResolution(packageRoot, workRoot) {
107
125
  )
108
126
  return resolved;
109
127
  if (hostPackages.has(name)) {
110
- if (context.conditions.includes("import"))
128
+ if (Array.from(context.conditions).includes("import"))
111
129
  return nextResolve(specifier, { ...context, parentURL: hostURL });
112
130
  return resolveFile(hostRequire.resolve(specifier), context, nextResolve);
113
131
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"AppDialog.vue_vue_type_style_index_0_lang-8b56f871.js","sources":["../../../panel/plugins/console/src/components/AppDialog.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { t } from \"@/lang/i18n\";\nimport { computed, getCurrentInstance, ref, useAttrs, useSlots, watch } from \"vue\";\nimport {\n VBtn,\n VCard,\n VCardActions,\n VCardText,\n VDialog\n} from \"vuetify/components\";\n\ndefineOptions({ inheritAttrs: false });\n\ninterface Props {\n modelValue?: boolean;\n open?: boolean;\n visible?: boolean;\n title?: string | null;\n width?: string | number;\n maxWidth?: string | number;\n footer?: unknown;\n closable?: boolean;\n maskClosable?: boolean;\n keyboard?: boolean;\n destroyOnClose?: boolean;\n confirmLoading?: boolean;\n okText?: string;\n cancelText?: string;\n showCancel?: boolean;\n okColor?: string;\n okType?: string;\n okButtonProps?: Record<string, unknown>;\n compact?: boolean;\n wrapClassName?: string;\n style?: string | Record<string, string | number>;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n // Explicit undefined defaults prevent Vue's Boolean prop casting from\n // turning omitted channels into `false` and masking the active v-model.\n modelValue: undefined,\n open: undefined,\n visible: undefined,\n closable: true,\n maskClosable: true,\n keyboard: true,\n destroyOnClose: false,\n confirmLoading: false,\n showCancel: true\n});\n\nconst emit = defineEmits<{\n \"update:modelValue\": [value: boolean];\n \"update:open\": [value: boolean];\n \"update:visible\": [value: boolean];\n ok: [];\n cancel: [];\n close: [];\n \"after-close\": [];\n}>();\n\nconst attrs = useAttrs();\nconst slots = useSlots();\nconst localOpen = ref(false);\nconst instance = getCurrentInstance();\n\n// Boolean props are cast to `false` when omitted. Inspect the vnode to tell\n// which v-model channel the caller supplied, so an omitted `open` prop cannot\n// mask a `modelValue` controlled by the parent.\nconst hasVnodeProp = (name: string) =>\n Object.prototype.hasOwnProperty.call(instance?.vnode.props ?? {}, name);\n\nconst sourceOpen = computed(() => {\n if (hasVnodeProp(\"open\")) return props.open ?? false;\n if (hasVnodeProp(\"visible\")) return props.visible ?? false;\n return props.modelValue ?? false;\n});\nconst renderCard = ref(!props.destroyOnClose || sourceOpen.value);\n\nwatch(\n sourceOpen,\n (value) => {\n localOpen.value = value;\n if (value) renderCard.value = true;\n },\n { immediate: true }\n);\n\nconst isOpen = computed({\n get: () => localOpen.value,\n set: (value: boolean) => {\n const wasOpen = localOpen.value;\n localOpen.value = value;\n emit(\"update:modelValue\", value);\n emit(\"update:open\", value);\n emit(\"update:visible\", value);\n if (wasOpen && !value) {\n emit(\"cancel\");\n emit(\"close\");\n }\n }\n});\n\n// Vuetify already sizes and centers every dialog at `calc(100% - 48px)`, so a\n// dialog only needs a ceiling. Declaring `width` as well would replace that\n// viewport gap and force callers to clamp against `100vw` themselves.\nconst dialogMaxWidth = computed(() => {\n const width = props.maxWidth ?? props.width;\n if (width == null) return props.compact ? \"460px\" : \"1120px\";\n if (props.wrapClassName?.split(/\\s+/).includes(\"full-modal\")) return width;\n return typeof width === \"number\" ? `${width}px` : width;\n});\nconst dialogStyle = computed(() => [attrs.style as any, props.style] as any);\n\nconst showFooter = computed(() => props.footer !== null && props.footer !== false);\nconst okButtonAttrs = computed(() => {\n const buttonProps = { ...(props.okButtonProps ?? {}) };\n delete buttonProps.danger;\n return {\n ...buttonProps,\n color: props.okColor ?? (props.okType === \"danger\" ? \"error\" : \"primary\")\n };\n});\n\nconst close = () => {\n isOpen.value = false;\n};\n\nconst confirm = () => {\n emit(\"ok\");\n};\n\nconst afterLeave = () => {\n if (props.destroyOnClose) renderCard.value = false;\n emit(\"after-close\");\n};\n</script>\n\n<template>\n <VDialog v-model=\"isOpen\" class=\"app-dialog\" :class=\"[attrs.class, props.wrapClassName]\" :style=\"dialogStyle\"\n :max-width=\"dialogMaxWidth\" :persistent=\"props.maskClosable === false\"\n :close-on-back=\"props.keyboard !== false\" @after-leave=\"afterLeave\">\n <VCard v-if=\"renderCard\" :title=\"props.title || undefined\" class=\"app-dialog-card\" rounded=\"xl\">\n <template v-if=\"slots.title\" #title>\n <slot name=\"title\" />\n </template>\n\n <VCardText class=\"app-dialog-content\">\n <slot />\n </VCardText>\n\n <VCardActions v-if=\"showFooter\" class=\"app-dialog-actions\">\n <slot name=\"footer\">\n <VBtn v-if=\"props.showCancel\" variant=\"text\" @click=\"close\">\n {{ props.cancelText ?? t(\"TXT_CODE_a0451c97\") }}\n </VBtn>\n <VBtn v-bind=\"okButtonAttrs\" :loading=\"props.confirmLoading\" @click=\"confirm\">\n {{ props.okText ?? t(\"TXT_CODE_d507abff\") }}\n </VBtn>\n </slot>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n\n<style lang=\"scss\">\n.app-dialog-card {\n max-width: 100%;\n overflow: hidden;\n}\n\n.app-dialog-actions {\n justify-content: flex-end;\n gap: 8px;\n}\n</style>\n"],"names":["props","__props","emit","__emit","attrs","useAttrs","slots","useSlots","localOpen","ref","instance","getCurrentInstance","hasVnodeProp","name","sourceOpen","computed","renderCard","watch","value","isOpen","wasOpen","dialogMaxWidth","width","_a","dialogStyle","showFooter","okButtonAttrs","buttonProps","close","confirm","afterLeave","_cache","$event","_normalizeClass","_unref","_normalizeStyle","_openBlock","_createBlock","VCard","_createSlots","_createVNode","VCardText","_withCtx","_renderSlot","_ctx","VBtn","_createTextVNode","_toDisplayString","t"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{a1 as d,aE as s,Q as l,R as e,aL as t,P as r,bM as i}from"./vue-2433bd89.js";import{_ as c}from"./_plugin-vue_export-helper-c27b6911.js";const p={key:0,class:"card-panel-title"},_={class:"card-panel-heading"},u={class:"card-panel-content"},f=d({__name:"CardPanel",props:{fullHeight:{type:Boolean,default:!0},padding:{type:Boolean,default:!0}},setup(n){const o=n;return(a,m)=>(s(),l("div",{class:i({"card-panel":!0,"global-card-container-shadow":!0,"h-100":o.fullHeight,padding:o.padding})},[a.$slots.title?(s(),l("div",p,[e("div",null,[e("h3",_,[t(a.$slots,"title",{},void 0,!0)])]),e("div",null,[e("span",null,[t(a.$slots,"operator",{},void 0,!0)])])])):r("",!0),e("div",u,[t(a.$slots,"body",{},void 0,!0)])],2))}});const g=c(f,[["__scopeId","data-v-ee021fae"]]);export{g as C};
2
- //# sourceMappingURL=CardPanel-a704f146.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CardPanel-a704f146.js","sources":["../../../panel/plugins/console/src/components/CardPanel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nconst props = defineProps({\n fullHeight: {\n type: Boolean,\n default: true\n },\n padding: {\n type: Boolean,\n default: true\n }\n});\n</script>\n\n<template>\n <div\n :class=\"{\n 'card-panel': true,\n 'global-card-container-shadow': true,\n 'h-100': props.fullHeight,\n padding: props.padding\n }\"\n >\n <div v-if=\"$slots.title\" class=\"card-panel-title\">\n <div>\n <h3 class=\"card-panel-heading\">\n <slot name=\"title\"></slot>\n </h3>\n </div>\n <div>\n <span>\n <slot name=\"operator\"></slot>\n </span>\n </div>\n </div>\n <div class=\"card-panel-content\">\n <slot name=\"body\"></slot>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n@import \"@/assets/global.scss\";\n\n.padding {\n padding: 16px;\n}\n\n.card-panel {\n border: none;\n background-color: var(--background-color-white);\n display: flex;\n flex-direction: column;\n position: relative;\n\n .card-panel-title {\n font-weight: 600;\n color: var(--text-color);\n\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 0;\n margin-bottom: 8px;\n }\n\n .card-panel-heading {\n margin: 0;\n font-size: 1rem;\n line-height: 1.5;\n }\n .card-panel-content {\n flex-grow: 1;\n color: var(--text-color);\n position: relative;\n }\n}\n\n.card-panel-content {\n overflow: hidden;\n zoom: 1;\n word-break: break-all;\n}\n</style>\n"],"names":["props","__props","_normalizeClass","_createElementVNode","_hoisted_2","_renderSlot","_ctx"],"mappings":"uWACA,MAAAA,EAAAC,6BAoCQ,MAAAC,EAAA,CAtBE,aAAA,0DAA+F,QAAAF,EAAA,OAAiC,CAAA,mCAkBhIG,EAAA,MAAA,KAAA,CANEA,EAAA,KAAAC,EAAA,CADCC,EAAAC,EAAA,OAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CADuB,CAAA,kBAOxBH,EAAA,OAAA,KAAA,CADGE,EAAAC,EAAA,OAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CADwB,CAAA,2BAM7BD,EAAAC,EAAA,OAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CADqB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DesktopDialog-081410ca.js","sources":["../../../panel/plugins/console/src/components/DesktopDialog.vue"],"sourcesContent":["<script lang=\"ts\">\nlet dialogSequence = 0;\n</script>\n\n<script setup lang=\"ts\">\nimport { ctx } from \"@/plugin/context\";\nimport { computed, onMounted, onUnmounted, ref, useSlots, type Component } from \"vue\";\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(defineProps<{\n modelValue: boolean;\n id?: string;\n title?: string | null;\n icon?: string | Component;\n width?: number | string;\n height?: number;\n zIndex?: number;\n resizable?: boolean;\n closable?: boolean;\n keyboard?: boolean;\n padded?: boolean;\n scrollable?: boolean;\n transition?: string;\n}>(), {\n width: 420,\n height: 485,\n zIndex: 10001,\n resizable: false,\n closable: true,\n keyboard: true,\n padded: true,\n scrollable: true,\n transition: \"desktop-window\"\n});\n\nconst emit = defineEmits<{\n \"update:modelValue\": [value: boolean];\n close: [];\n focus: [];\n \"after-leave\": [];\n}>();\nconst slots = useSlots();\nconst shell = computed(() => ctx.desktop.window);\nconst instanceId = ++dialogSequence;\nconst windowId = computed(() => props.id || `desktop-dialog-${instanceId}`);\nconst dialogElement = ref<{ $el: HTMLElement }>();\nconst viewport = ref({ width: window.innerWidth, height: window.innerHeight });\nconst updateViewport = () => {\n viewport.value = { width: window.innerWidth, height: window.innerHeight };\n};\nconst size = computed(() => ({\n width: Math.min(Number.parseFloat(String(props.width)) || 420, Math.max(1, viewport.value.width - 32)),\n height: Math.min(props.height, Math.max(1, viewport.value.height - 80))\n}));\nonMounted(() => window.addEventListener(\"resize\", updateViewport));\nonUnmounted(() => window.removeEventListener(\"resize\", updateViewport));\n\nconst close = () => {\n if (!props.modelValue || !props.closable) return;\n emit(\"close\");\n emit(\"update:modelValue\", false);\n};\n\ndefineExpose({ getElement: () => dialogElement.value?.$el });\n</script>\n\n<template>\n <Teleport to=\"body\">\n <Transition :name=\"transition\" @after-leave=\"emit('after-leave')\">\n <component\n :is=\"shell\"\n v-if=\"modelValue && shell\"\n :id=\"windowId\"\n ref=\"dialogElement\"\n v-bind=\"$attrs\"\n class=\"desktop-dialog\"\n :title=\"title || ''\"\n :icon=\"icon\"\n :visible=\"true\"\n :minimized=\"false\"\n :maximized=\"false\"\n :active=\"true\"\n :initial-width=\"size.width\"\n :initial-height=\"size.height\"\n :initial-x=\"(viewport.width - size.width) / 2\"\n :initial-y=\"Math.max(16, (viewport.height - 48 - size.height) / 2)\"\n :z-index=\"zIndex\"\n :show-minimize=\"false\"\n :show-maximize=\"false\"\n :show-close=\"closable\"\n :resizable=\"resizable\"\n role=\"dialog\"\n :aria-labelledby=\"`${windowId}-title`\"\n tabindex=\"-1\"\n @focus=\"emit('focus')\"\n @close=\"close\"\n @keydown.esc.stop=\"keyboard && close()\"\n >\n <template v-if=\"slots.title\" #title><slot name=\"title\" /></template>\n <div class=\"desktop-dialog__content\">\n <div\n class=\"desktop-dialog__body\"\n :class=\"{\n 'desktop-dialog__body--unpadded': !padded,\n 'desktop-dialog__body--contained': !scrollable\n }\"\n ><slot /></div>\n <div v-if=\"slots.footer\" class=\"desktop-dialog__footer\"><slot name=\"footer\" /></div>\n </div>\n </component>\n </Transition>\n </Teleport>\n</template>\n\n<style lang=\"scss\" scoped>\n.desktop-dialog__content {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n}\n\n.desktop-dialog__body {\n flex: 1;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n padding: 16px 20px;\n color: var(--desktop-window-text);\n\n &--unpadded { padding: 0; }\n &--contained {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n}\n\n.desktop-dialog__footer {\n display: flex;\n flex: 0 0 auto;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 12px 20px;\n}\n</style>\n"],"names":["dialogSequence","props","__props","emit","__emit","slots","useSlots","shell","computed","ctx","instanceId","windowId","dialogElement","ref","viewport","updateViewport","size","onMounted","onUnmounted","close","__expose","_a","_createVNode","_Transition","_cache","$event","_openBlock","_createBlock","_resolveDynamicComponent","_mergeProps","_ctx","_withKeys","_withModifiers","_createSlots","_createElementVNode","_hoisted_1","_normalizeClass","_renderSlot","_createCommentVNode","_withCtx"],"mappings":"qYACA,IAAAA,EAAA,wdASA,MAAAC,EAAAC,EA0BAC,EAAAC,EAMAC,EAAAC,IACAC,EAAAC,EAAA,IAAAC,EAAA,QAAA,MAAA,EACAC,EAAA,EAAAV,EACAW,EAAAH,EAAA,IAAAP,EAAA,IAAA,kBAAAS,CAAA,EAAA,EACAE,EAAAC,IACAC,EAAAD,EAAA,CAAA,MAAA,OAAA,WAAA,OAAA,OAAA,WAAA,CAAA,EACAE,EAAA,IAAA,CACED,EAAA,MAAA,CAAA,MAAA,OAAA,WAAA,OAAA,OAAA,YAAwE,EAE1EE,EAAAR,EAAA,KAAA,CAA6B,MAAA,KAAA,IAAA,OAAA,WAAA,OAAAP,EAAA,KAAA,CAAA,GAAA,IAAA,KAAA,IAAA,EAAAa,EAAA,MAAA,MAAA,EAAA,CAAA,EAC0E,OAAA,KAAA,IAAAb,EAAA,OAAA,KAAA,IAAA,EAAAa,EAAA,MAAA,OAAA,EAAA,CAAA,CAC/B,EAAA,EAExEG,EAAA,IAAA,OAAA,iBAAA,SAAAF,CAAA,CAAA,EACAG,EAAA,IAAA,OAAA,oBAAA,SAAAH,CAAA,CAAA,EAEA,MAAAI,EAAA,IAAA,CACE,CAAAlB,EAAA,YAAA,CAAAA,EAAA,WACAE,EAAA,OAAA,EACAA,EAAA,oBAAA,EAAA,EAA+B,EAGjC,OAAAiB,EAAA,CAAA,WAAA,IAAA,OAAA,OAAAC,EAAAT,EAAA,QAAA,YAAAS,EAAA,IAAA,CAAA,+BAIqBC,EAAAC,EAAA,CA2CJ,KAAArB,EAAA,WA1CgB,aAAAsB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAAtB,EAAA,aAAA,EAAoB,EAAA,gBAyCnCD,EAAA,YAAAK,EAAA,OAAAmB,EAAA,EAAAC,EAAAC,EAAArB,EAAA,KAAA,EAAAsB,EAAA,CAAA,IAAA,aArCG,QAAA,gBACT,IAAAjB,CAAA,EAAAkB,EAAA,OAAA,CACU,MAAA,iBACR,MAAA5B,EAAA,OAAA,GACO,KAAAA,EAAA,KACF,QAAA,GACD,UAAA,GACE,UAAA,GACA,OAAA,GACH,gBAAAc,EAAA,MAAA,MACY,iBAAAA,EAAA,MAAA,OACC,aAAAF,EAAA,MAAA,MAAAE,EAAA,MAAA,OAAA,EACkB,YAAA,KAAA,IAAA,IAAAF,EAAA,MAAA,OAAA,GAAAE,EAAA,MAAA,QAAA,CAAA,EACoB,UAAAd,EAAA,OAC5C,gBAAA,GACA,gBAAA,GACA,aAAAA,EAAA,SACK,UAAAA,EAAA,UACA,KAAA,SAChB,kBAAA,GAAAS,EAAA,KAAA,SACwB,SAAA,KACpB,QAAAa,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAAtB,EAAA,OAAA,GACG,QAAAgB,EACJ,UAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAO,EAAAC,EAAAP,GAAAvB,EAAA,UAAAiB,IAAA,CAAA,MAAA,CAAA,EAAA,CAAA,KAAA,CAAA,EAC4B,CAAA,EAAAc,EAAA,gBAY9BC,EAAA,MAAAC,EAAA,CAAAD,EAAA,MAAA,CAFW,MAAAE,EAAA,CAAA,uBAAA,CALe,iCAAA,CAAAlC,EAAA,OACqC,kCAAA,CAAAA,EAAA,UAA8D,CAAA,CAAA,sCAIxH,EAAA,CAAA,8BAC2EmC,EAAAP,EAAA,OAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAN,CAAA,GAAAQ,EAAA,GAAA,EAAA,qCATlD,GAAAC,EAAA,IAAA,CAA2BF,EAAAP,EAAA,OAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Loading.vue_vue_type_script_setup_true_lang-9e79de95.js","sources":["../../../panel/plugins/console/src/tools/array.ts","../../../panel/plugins/console/src/services/apis/envImage.ts","../../../panel/plugins/console/src/components/Loading.vue"],"sourcesContent":["/* eslint-disable no-unused-vars */\n\nexport interface ConditionFilterItem {\n condition?: (index?: number) => boolean;\n}\n\nexport function arrayFilter<T>(arr: (T & ConditionFilterItem)[]): T[] {\n return arr.filter((item, index) => {\n if (typeof item.condition === \"function\") {\n return item.condition(index);\n } else {\n return true;\n }\n });\n}\n\nexport function arrayUnique<T>(arr: T[], felidName?: string): T[] {\n if (!felidName) return Array.from(new Set(arr));\n const map = new Map();\n return arr.filter((v: any) => !map.has(v[felidName]) && map.set(v[felidName], v));\n}\n","import { usePluginService } from \"@/plugin/context\";\nimport type * as InstanceApi from \"@instance/api\";\n\ntype EnvironmentApi = Pick<\n typeof InstanceApi,\n | \"imageList\"\n | \"getNetworkModeList\"\n | \"containerList\"\n | \"buildProgress\"\n | \"getImagePlatforms\"\n | \"getDockerHubImagePlatforms\"\n>;\n\nfunction resolveEnvironmentApi(): EnvironmentApi {\n const instance = usePluginService<{ api: EnvironmentApi }>(\"instance\");\n if (!instance) {\n throw new Error('Panel frontend plugin \"instance\" is not loaded.');\n }\n return instance.api;\n}\n\nconst call = <K extends keyof EnvironmentApi>(name: K) =>\n ((...args: any[]) => (resolveEnvironmentApi()[name] as any)(...args)) as EnvironmentApi[K];\n\nexport const imageList = call(\"imageList\");\nexport const getNetworkModeList = call(\"getNetworkModeList\");\nexport const containerList = call(\"containerList\");\nexport const buildProgress = call(\"buildProgress\");\nexport const getImagePlatforms = call(\"getImagePlatforms\");\nexport const getDockerHubImagePlatforms = call(\"getDockerHubImagePlatforms\");\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = defineProps<{ fontSize?: number }>();\n\nconst fontSize = computed(() => {\n return props.fontSize ?? 48;\n});\n\n</script>\n\n<template>\n <div class=\"flex align-center justify-center h-100 w-100\">\n <VProgressCircular indeterminate :size=\"fontSize\" />\n </div>\n</template>\n\n<style lang=\"scss\" scoped></style>\n"],"names":["arrayFilter","arr","item","index","arrayUnique","felidName","map","v","resolveEnvironmentApi","instance","usePluginService","call","name","args","imageList","getNetworkModeList","containerList","buildProgress","props","__props","fontSize","computed","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_component_VProgressCircular"],"mappings":"sHAMO,SAASA,EAAeC,EAAuC,CACpE,OAAOA,EAAI,OAAO,CAACC,EAAMC,IACnB,OAAOD,EAAK,WAAc,WACrBA,EAAK,UAAUC,CAAK,EAEpB,EAEV,CACH,CAEgB,SAAAC,EAAeH,EAAUI,EAAyB,CAChE,GAAI,CAACA,EAAW,OAAO,MAAM,KAAK,IAAI,IAAIJ,CAAG,CAAC,EACxC,MAAAK,MAAU,IAChB,OAAOL,EAAI,OAAQM,GAAW,CAACD,EAAI,IAAIC,EAAEF,CAAS,CAAC,GAAKC,EAAI,IAAIC,EAAEF,CAAS,EAAGE,CAAC,CAAC,CAClF,CCPA,SAASC,GAAwC,CACzC,MAAAC,EAAWC,EAA0C,UAAU,EACrE,GAAI,CAACD,EACG,MAAA,IAAI,MAAM,iDAAiD,EAEnE,OAAOA,EAAS,GAClB,CAEA,MAAME,EAAwCC,GAC3C,IAAIC,IAAiBL,IAAwBI,CAAI,EAAU,GAAGC,CAAI,EAExDC,EAAYH,EAAK,WAAW,EAC5BI,EAAqBJ,EAAK,oBAAoB,EAC9CK,EAAgBL,EAAK,eAAe,EACpCM,EAAgBN,EAAK,eAAe,8GCxBjD,MAAAO,EAAAC,EAEAC,EAAAC,EAAA,IACEH,EAAA,UAAA,EAAyB,+CAMzB,OAAAI,EAAA,EAAAC,EAAA,MAAAC,EAAA,CAEMC,EAAAC,EAAA,CADgD,cAAA,GAAjC,KAAAN,EAAA,KAA6B,EAAA,KAAA,EAAA,CAAA,MAAA,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PageToolbar-5ca1a069.js","sources":["../../../panel/plugins/console/src/components/PageToolbar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { VCol, VIcon, VRow } from \"vuetify/components\";\n\nwithDefaults(\n defineProps<{\n title: string;\n icon?: string;\n }>(),\n {\n icon: \"mdi-view-dashboard-outline\"\n }\n);\n</script>\n\n<template>\n <VRow class=\"page-toolbar align-center\" density=\"comfortable\">\n <VCol cols=\"12\" :md=\"$slots.search ? 3 : 4\" class=\"page-toolbar-title\">\n <VIcon :icon=\"icon\" class=\"page-toolbar-icon\" size=\"28\" />\n <span>{{ title }}</span>\n </VCol>\n <VCol v-if=\"$slots.search\" cols=\"12\" md=\"5\" class=\"page-toolbar-search\">\n <slot name=\"search\" />\n </VCol>\n <VCol cols=\"12\" :md=\"$slots.search ? 4 : 8\" class=\"page-toolbar-actions\">\n <slot name=\"actions\" />\n </VCol>\n </VRow>\n</template>\n\n<style lang=\"scss\" scoped>\n.page-toolbar {\n width: 100%;\n margin-bottom: 20px;\n}\n\n.page-toolbar > .v-col {\n min-width: 0;\n}\n\n.page-toolbar-title {\n display: flex;\n align-items: center;\n gap: 10px;\n color: var(--text-color);\n font-size: 20px;\n font-weight: 600;\n}\n\n.page-toolbar-icon {\n color: var(--text-color);\n}\n\n.page-toolbar-search,\n.page-toolbar-actions {\n display: flex;\n align-items: center;\n min-width: 0;\n color: var(--text-color);\n}\n\n.page-toolbar-search {\n justify-content: center;\n\n :deep(.v-field),\n :deep(.v-field__input),\n :deep(.v-field__input input),\n :deep(.v-select__selection-text) {\n color: var(--text-color) !important;\n }\n\n :deep(.v-field__input input)::placeholder,\n :deep(textarea)::placeholder {\n color: var(--text-color) !important;\n opacity: 0.55 !important;\n }\n}\n\n.page-toolbar-actions {\n justify-content: flex-end;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n@media (max-width: 992px) {\n .page-toolbar-title {\n font-size: 18px;\n }\n\n .page-toolbar-search,\n .page-toolbar-actions {\n justify-content: flex-start;\n }\n}\n</style>\n"],"names":["_createVNode","_unref","VCol","_ctx","VIcon","__props","_renderSlot"],"mappings":"+TA0BS,MAAA,4BAXK,QAAA,aAAoC,EAAA,gBAIvCA,EAAAC,EAAAC,CAAA,EAAA,CAAA,KAAA,KAHI,GAAAC,EAAA,OAAA,OAAA,EAAA,EAAuB,MAAA,oBAAgB,EAAA,gBACUH,EAAAC,EAAAG,CAAA,EAAA,CAAA,KAAAC,EAAA,KAAxC,MAAA,oBAAQ,KAAA,IAAyB,EAAA,KAAA,EAAA,CAAA,MAAA,CAAA,6BACrC,CAAA,8CAIT,IAAA,YAFyB,GAAA,IAAQ,MAAA,qBAAU,EAAA,gBAC1BC,EAAAH,EAAA,OAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,CAAA,0BAIjB,KAAA,KAFI,GAAAA,EAAA,OAAA,OAAA,EAAA,EAAuB,MAAA,sBAAgB,EAAA,gBACzBG,EAAAH,EAAA,OAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"_elements-sdk_vue-b86b0db6.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"_elements-sdk_vue-i18n-64f8e172.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"_elements-sdk_vue-router-a62f518d.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"const-01673e6b.js","sources":["../../../panel/plugins/console/src/types/const.ts"],"sourcesContent":["/* eslint-disable no-unused-vars */\nimport { t } from \"@/lang/i18n\";\nimport type { QuickStartPackages } from \".\";\n\nexport enum AppTheme {\n AUTO = 0,\n LIGHT,\n DARK\n}\n\nexport const THEME_KEY = \"THEME_KEY\";\n\n/**\n * Marks that the legacy stored theme has been migrated once. Before AUTO became\n * the default, a first visit persisted LIGHT, which is indistinguishable from a\n * deliberate light choice — so the migration runs exactly once.\n */\nexport const THEME_AUTO_MIGRATED_KEY = \"THEME_AUTO_MIGRATED\";\n\nexport const CARD_FIXED_HEIGHT = 200;\n\nexport const TERMINAL_CODE = [\n \"UTF-8\",\n \"GBK\",\n \"GB2312\",\n \"GB18030\",\n \"BIG5\",\n \"Big5-HKSCS\",\n \"Shift_JIS\",\n \"KS_C_5601\",\n \"UTF-16\"\n];\n\nexport enum INSTANCE_STATUS_CODE {\n BUSY = -1,\n STOPPED = 0,\n STOPPING = 1,\n STARTING = 2,\n RUNNING = 3\n}\n\nexport const INSTANCE_STATUS: Record<INSTANCE_STATUS_CODE, string> = {\n [INSTANCE_STATUS_CODE.BUSY]: t(\"TXT_CODE_342a04a9\"),\n [INSTANCE_STATUS_CODE.STOPPED]: t(\"TXT_CODE_15f2e564\"),\n [INSTANCE_STATUS_CODE.STOPPING]: t(\"TXT_CODE_a409b8a9\"),\n [INSTANCE_STATUS_CODE.STARTING]: t(\"TXT_CODE_175b570d\"),\n [INSTANCE_STATUS_CODE.RUNNING]: t(\"TXT_CODE_bdb620b9\")\n};\n\nexport const INSTANCE_CRASH_TIMEOUT = 2000;\n\nexport const defaultDockerfile = `FROM ubuntu:latest\\nRUN mkdir -p /workspace\\nWORKDIR /workspace\\n`;\n\nexport const jdk8Dockerfile = `FROM eclipse-temurin:8\nRUN mkdir -p /workspace\nWORKDIR /workspace\n`;\n\nexport const ubuntu22Dockerfile = `FROM ubuntu:22.04\nRUN apt update && apt -y install libcurl4 && DEBIAN_FRONTEND=\"noninteractive\" apt -y install tzdata\nRUN mkdir -p /workspace\nWORKDIR /workspace\n`;\n\nexport const jdk17Dockerfile = `FROM eclipse-temurin:17\nRUN mkdir -p /workspace\nWORKDIR /workspace\n`;\n\nexport const jdk8DockerfileCN = `FROM eclipse-temurin:8\nRUN echo \"zh_CN.UTF-8 UTF-8\">/etc/locale.gen && locale-gen\nENV LANG=zh_CN.UTF-8\nENV LANGUAGE=zh_CN.UTF-8\nENV LC_ALL=zh_CN.UTF-8\nENV TZ=Asia/Shanghai\nRUN mkdir -p /workspace\nWORKDIR /workspace\n`;\n\nexport const ubuntu22DockerfileCN = `FROM ubuntu:22.04\nENV TZ=Asia/Shanghai\nRUN sed -i -E 's/http:\\\\/\\\\/(archive|security).ubuntu.com/http:\\\\/\\\\/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list\nRUN apt update && apt -y install libcurl4 && DEBIAN_FRONTEND=\"noninteractive\" apt -y install tzdata\nRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone\nRUN mkdir -p /workspace\nWORKDIR /workspace\n`;\n\nexport const jdk17DockerfileCN = `FROM eclipse-temurin:17\nRUN echo \"zh_CN.UTF-8 UTF-8\">/etc/locale.gen && locale-gen\nENV LANG=zh_CN.UTF-8\nENV LANGUAGE=zh_CN.UTF-8\nENV LC_ALL=zh_CN.UTF-8\nENV TZ=Asia/Shanghai\nRUN mkdir -p /workspace\nWORKDIR /workspace\n`;\n\nexport enum ScheduleActionTypeEnum {\n Delay = \"delay\",\n Command = \"command\",\n Stop = \"stop\",\n Start = \"start\",\n Restart = \"restart\",\n Kill = \"kill\",\n /** Provided by the optional backup plugin. */\n Backup = \"backup\"\n}\n\nexport const ScheduleTypeEnum = {\n Interval: 1,\n Cycle: 2,\n Specify: 3\n};\n\nexport const ScheduleActionType = {\n [ScheduleActionTypeEnum.Delay]: t(\"TXT_CODE_735baf9f\"),\n [ScheduleActionTypeEnum.Command]: t(\"TXT_CODE_b7cab91d\"),\n [ScheduleActionTypeEnum.Stop]: t(\"TXT_CODE_148d6467\"),\n [ScheduleActionTypeEnum.Start]: t(\"TXT_CODE_8c7318b3\"),\n [ScheduleActionTypeEnum.Restart]: t(\"TXT_CODE_77cc12da\"),\n [ScheduleActionTypeEnum.Kill]: t(\"TXT_CODE_1c36c8f2\")\n};\n\nexport const ScheduleType = {\n [ScheduleTypeEnum.Interval]: t(\"TXT_CODE_ba497a8b\"),\n [ScheduleTypeEnum.Cycle]: t(\"TXT_CODE_f17af923\"),\n [ScheduleTypeEnum.Specify]: t(\"TXT_CODE_c4f90da6\")\n};\n\nexport enum ScheduleCreateType {\n INTERVAL = 1,\n CYCLE,\n SPECIFY\n}\n\nexport const defaultDockerConfig: IGlobalInstanceDockerConfig = {\n updateCommandImage: \"\",\n containerName: \"\",\n image: \"\",\n memory: undefined,\n ports: [],\n extraVolumes: [],\n maxSpace: undefined,\n network: undefined,\n io: undefined,\n networkMode: \"bridge\",\n networkAliases: [],\n cpusetCpus: \"\",\n cpuUsage: undefined,\n workingDir: \"/data\",\n env: [],\n changeWorkdir: true,\n memorySwap: undefined,\n memorySwappiness: undefined,\n labels: [],\n gpuEnabled: false,\n gpuCount: -1,\n gpuDeviceIds: [],\n gpuDriver: \"nvidia\"\n};\n\nexport const defaultInstanceJavaConfig: IInstanceJavaConfig = {\n id: \"\"\n};\n\nexport const defaultInstanceInfo: IGlobalInstanceConfig = {\n nickname: \"\",\n startCommand: \"\",\n stopCommand: \"^c\",\n cwd: \"\",\n ie: \"UTF-8\",\n oe: \"UTF-8\",\n createDatetime: new Date().getTime(),\n lastDatetime: 0,\n type: \"universal\",\n tag: [],\n endTime: 0,\n fileCode: \"UTF-8\",\n processType: \"general\",\n updateCommand: \"\",\n runAs: \"\",\n actionCommandList: [],\n crlf: 1,\n category: 0,\n basePort: undefined as any,\n\n // Steam RCON\n enableRcon: false,\n rconPassword: \"\",\n rconPort: undefined,\n rconIp: \"\",\n\n // Java\n java: defaultInstanceJavaConfig,\n\n // Old fields\n terminalOption: {\n haveColor: true,\n pty: false,\n ptyWindowCol: 164,\n ptyWindowRow: 40\n },\n eventTask: {\n autoStart: false,\n autoRestart: false,\n autoRestartMaxTimes: 3,\n ignore: false\n },\n docker: defaultDockerConfig,\n pingConfig: {\n ip: \"\",\n port: undefined,\n type: 1\n },\n extraServiceConfig: {\n openFrpTunnelId: \"\",\n openFrpToken: \"\"\n }\n};\n\nexport const defaultQuickStartPackages: QuickStartPackages = {\n language: \"\",\n description: \"\",\n title: \"\",\n category: \"\",\n runtime: \"\",\n size: \"\",\n hardware: \"\",\n remark: \"\",\n targetLink: \"\",\n author: \"\",\n setupInfo: defaultInstanceInfo,\n gameType: \"\",\n image: \"\",\n platform: \"\",\n tags: [],\n isSummary: false\n};\n\n/**\n * Sentinel used by the app market's filters to mean \"no filter\". It lives here\n * because the instance-detail dialog, which the market editor reuses to edit a\n * package's instance configuration, filters it out of the option lists.\n */\nexport const SEARCH_ALL_KEY = \"ALL\";\n"],"names":["AppTheme","AppTheme2","THEME_KEY","THEME_AUTO_MIGRATED_KEY","TERMINAL_CODE","INSTANCE_STATUS_CODE","INSTANCE_STATUS","t","INSTANCE_CRASH_TIMEOUT","defaultDockerfile","jdk8Dockerfile","ubuntu22Dockerfile","jdk17Dockerfile","jdk8DockerfileCN","ubuntu22DockerfileCN","jdk17DockerfileCN","ScheduleActionTypeEnum","ScheduleTypeEnum","ScheduleActionType","ScheduleType","ScheduleCreateType","ScheduleCreateType2","defaultDockerConfig","defaultInstanceJavaConfig","defaultInstanceInfo","defaultQuickStartPackages","SEARCH_ALL_KEY"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"const-cfe7ddfe.js","sources":["../../../panel/plugins/console/src/config/const.ts"],"sourcesContent":["import { t } from \"@/lang/i18n\";\n\nexport const GLOBAL_INSTANCE_NAME = \"__MCSM_GLOBAL_INSTANCE__\";\n\nexport const GLOBAL_INSTANCE_UUID = \"global0001\";\n\nexport const PERMISSION_MAP: Record<string, string> = {\n \"1\": t(\"TXT_CODE_eb880db2\"),\n \"10\": t(\"TXT_CODE_cd978243\"),\n \"-1\": t(\"TXT_CODE_7c76dbf\")\n};\n"],"names":["GLOBAL_INSTANCE_NAME","GLOBAL_INSTANCE_UUID","PERMISSION_MAP","t"],"mappings":"uCAEO,MAAMA,EAAuB,2BAEvBC,EAAuB,aAEvBC,EAAyC,CACpD,EAAKC,EAAE,mBAAmB,EAC1B,GAAMA,EAAE,mBAAmB,EAC3B,KAAMA,EAAE,kBAAkB,CAC5B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"copy-4d64fc1f.js","sources":["../../../panel/plugins/console/src/components/fc/KvOptionsDialog.vue","../../../panel/plugins/console/src/components/fc/index.ts","../../../panel/plugins/console/src/tools/time.ts","../../../panel/plugins/console/src/tools/common.ts","../../../panel/plugins/console/src/tools/copy.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { t } from \"@/lang/i18n\";\nimport type { MountComponent } from \"../../types\";\nimport _ from \"lodash\";\nimport { computed, ref } from \"vue\";\nimport { VBtn, VCard, VCardActions, VCardText, VDataTable, VDialog, VForm, VIcon, VSpacer, VTextarea, VTextField } from \"vuetify/components\";\nimport { emptyValueValidator, reportValidatorError } from \"../../tools/validator\";\n\ninterface KvColumn {\n align?: string;\n key?: string;\n dataIndex?: string;\n title?: string;\n placeholder?: string;\n}\n\ninterface Props extends MountComponent {\n title: string;\n keyTitle?: string;\n valueTitle?: string;\n data: any[];\n subTitle?: string;\n columns?: KvColumn[];\n textarea?: boolean;\n}\n\nconst props = defineProps<Props>();\nconst dataSource = ref<any[]>(props.data instanceof Array ? _.cloneDeep(props.data) : []);\n\nconst open = ref(true);\nconst formInstance = ref<any>();\n\nconst cancel = async () => {\n open.value = false;\n if (props.destroyComponent) props.destroyComponent();\n};\n\nconst submit = async () => {\n try {\n const result = await formInstance.value?.validate();\n if (!result?.valid) return;\n } catch (error: any) {\n return reportValidatorError(error);\n }\n if (props.emitResult) props.emitResult(dataSource.value);\n await cancel();\n};\n\nconst columns = computed<KvColumn[]>(() => {\n if (props.columns) {\n return [\n ...props.columns,\n {\n align: \"center\",\n key: \"operation\",\n dataIndex: \"operation\",\n title: t(\"TXT_CODE_fe731dfc\")\n }\n ];\n }\n return [\n {\n align: \"center\",\n key: \"k\",\n dataIndex: \"k\",\n title: props.keyTitle\n },\n {\n align: \"center\",\n key: \"v\",\n dataIndex: \"v\",\n title: props.valueTitle\n },\n {\n align: \"center\",\n key: \"operation\",\n dataIndex: \"operation\",\n title: t(\"TXT_CODE_fe731dfc\")\n }\n ];\n});\n\nconst tableHeaders = computed(() =>\n columns.value.map((column) => ({\n title: column.title || \"\",\n key: String(column.dataIndex || column.key || \"\"),\n align: (column.align || \"center\") as \"start\" | \"center\" | \"end\",\n sortable: false\n }))\n);\n\nconst getRecord = (item: any) => item?.raw ?? item;\nconst getColumnKey = (column: KvColumn) => String(column.dataIndex || column.key || \"\");\n\nconst operation = (type: \"add\" | \"del\", index = 0) => {\n if (type === \"add\") {\n const keys = columns.value.filter((v) => v.dataIndex).map((v) => String(v.dataIndex));\n const obj: any = {};\n for (const key of keys) {\n if (key === \"operation\") continue;\n obj[key] = \"\";\n }\n dataSource.value.push(obj);\n } else {\n dataSource.value.splice(index, 1);\n }\n};\n</script>\n\n<template>\n <VDialog v-model=\"open\" class=\"app-dialog\" max-width=\"1300\" persistent>\n <VCard :title=\"props.title\">\n <VCardText class=\"dialog-overflow-container\">\n <div v-if=\"props.subTitle\" class=\"text-body-medium text-medium-emphasis mb-4\">\n <!-- eslint-disable-next-line vue/no-v-html -->\n <span v-html=\"props.subTitle\"></span>\n </div>\n <div class=\"d-flex justify-end mb-5\">\n <VBtn variant=\"tonal\" @click=\"operation('add')\">\n <VIcon start icon=\"mdi-plus-circle-outline\" />\n {{ t(\"TXT_CODE_dfc17a0c\") }}\n </VBtn>\n </div>\n <VForm ref=\"formInstance\">\n <VDataTable :headers=\"tableHeaders\" :items=\"dataSource\" :items-per-page=\"-1\" hide-default-footer density=\"comfortable\">\n <template #item=\"{ item, index }\">\n <tr>\n <td v-for=\"column in columns\" :key=\"getColumnKey(column)\" :class=\"`text-${column.align || 'center'}`\">\n <VBtn v-if=\"getColumnKey(column) === 'operation'\" icon variant=\"text\" color=\"error\" size=\"small\" @click=\"operation('del', index)\">\n <VIcon icon=\"mdi-minus-circle-outline\" />\n </VBtn>\n <VTextarea\n v-else-if=\"props.textarea\"\n :model-value=\"getRecord(item)[getColumnKey(column)]\"\n :placeholder=\"column.placeholder\"\n rows=\"2\"\n auto-grow\n hide-details=\"auto\"\n :rules=\"[(value) => emptyValueValidator(value).then(() => true).catch((error) => error.message)]\"\n @update:model-value=\"(value) => (getRecord(item)[getColumnKey(column)] = value)\"\n />\n <VTextField\n v-else\n :model-value=\"getRecord(item)[getColumnKey(column)]\"\n :placeholder=\"column.placeholder\"\n hide-details=\"auto\"\n :rules=\"[(value) => emptyValueValidator(value).then(() => true).catch((error) => error.message)]\"\n @update:model-value=\"(value) => (getRecord(item)[getColumnKey(column)] = value)\"\n />\n </td>\n </tr>\n </template>\n </VDataTable>\n </VForm>\n </VCardText>\n <VCardActions>\n <VSpacer />\n <VBtn variant=\"text\" @click=\"cancel\">{{ t(\"TXT_CODE_a0451c97\") }}</VBtn>\n <VBtn color=\"primary\" @click=\"submit\">{{ t(\"TXT_CODE_d507abff\") }}</VBtn>\n </VCardActions>\n </VCard>\n </VDialog>\n</template>\n\n<style lang=\"scss\" scoped></style>\n","import { useMountComponent } from \"@/hooks/useMountComponent\";\nimport { usePluginService, type FrontendInstanceService } from \"@/plugin/context\";\nimport type { UserInstance } from \"@/types/user\";\n\nimport KvOptionsDialogVue from \"@/components/fc/KvOptionsDialog.vue\";\nimport { t } from \"@/lang/i18n\";\nimport TaskLoadingDialog from \"./TaskLoadingDialog.vue\";\n\n// The file manager's own dialogs — upload, download-from-URL and the image\n// viewer — moved to `plugins/file`, which owns the components they mount.\n\ninterface DockerConfigItem {\n host: string;\n container: string;\n}\ninterface PortConfigItem extends DockerConfigItem {\n protocol: string;\n}\n\ninterface DockerEnvItem {\n label: string;\n value: string;\n}\n\ninterface DockerLabelItem {\n label: string;\n value: string;\n}\n\ninterface DockerCapabilityItem {\n label: string;\n value: string;\n}\n\ninterface DockerDeviceItem {\n PathOnHost: string;\n PathInContainer: string;\n CgroupPermissions: string;\n}\n\nfunction instanceComponents() {\n const instance = usePluginService<FrontendInstanceService>(\"instance\");\n if (!instance) throw new Error('Panel frontend plugin \"instance\" is not loaded.');\n return instance.components;\n}\n\nexport async function useSelectInstances(data: UserInstance[] = []) {\n return useMountComponent({ data }).mount<UserInstance[]>(instanceComponents().SelectInstances);\n}\n\nexport async function useCmdAssistantDialog() {\n return await useMountComponent().mount<string>(instanceComponents().CmdAssistantDialog);\n}\n\nexport async function usePortEditDialog(data: PortConfigItem[] = []) {\n return useMountComponent({ data }).mount<PortConfigItem[]>(instanceComponents().DockerPortDialog);\n}\n\nexport async function useVolumeEditDialog(data: DockerConfigItem[] = []) {\n return useMountComponent({\n data,\n subTitle: t(\"TXT_CODE_6c232c9c\"),\n title: t(\"TXT_CODE_820ebc92\"),\n columns: [\n {\n align: \"center\",\n dataIndex: \"host\",\n title: t(\"TXT_CODE_681aaeb9\")\n },\n {\n align: \"center\",\n dataIndex: \"container\",\n title: t(\"TXT_CODE_30258325\")\n }\n ],\n textarea: true\n }).mount<DockerConfigItem[]>(KvOptionsDialogVue);\n}\n\nexport async function useDockerEnvEditDialog(data: DockerEnvItem[] = []) {\n return useMountComponent({\n data,\n title: t(\"TXT_CODE_90a9d317\"),\n columns: [\n {\n align: \"center\",\n dataIndex: \"label\",\n title: t(\"TXT_CODE_a42984e\")\n },\n {\n align: \"center\",\n dataIndex: \"value\",\n title: t(\"TXT_CODE_115e8a25\")\n }\n ],\n textarea: true\n }).mount<DockerEnvItem[]>(KvOptionsDialogVue);\n}\n\nexport async function useDockerLabelEditDialog(data: DockerLabelItem[] = []) {\n return useMountComponent({\n data,\n title: t(\"TXT_CODE_g1c43s2h\"),\n subTitle: t(\"TXT_CODE_MimBB1Ea\"),\n columns: [\n {\n align: \"center\",\n dataIndex: \"label\",\n title: t(\"TXT_CODE_a42984e\")\n },\n {\n align: \"center\",\n dataIndex: \"value\",\n title: t(\"TXT_CODE_115e8a25\")\n }\n ],\n textarea: true\n }).mount<DockerLabelItem[]>(KvOptionsDialogVue);\n}\n\nexport async function useDockerCapabilityEditDialog(data: DockerCapabilityItem[] = []) {\n return useMountComponent({\n data,\n title: t(\"TXT_CODE_bbbd4133\"),\n subTitle: t(\"TXT_CODE_377319df\"),\n textarea: false\n }).mount<DockerCapabilityItem[]>(instanceComponents().DockerCapabilityDialog);\n}\n\nexport async function useDockerDeviceEditDialog(data: DockerDeviceItem[] = []) {\n return useMountComponent({\n data,\n title: t(\"TXT_CODE_b3a60c78\"),\n subTitle: t(\"TXT_CODE_b6e18b87\"),\n textarea: false\n }).mount<DockerDeviceItem[]>(instanceComponents().DockerDeviceDialog);\n}\n\nexport async function openLoadingDialog(title: string, text: string, subTitle?: string) {\n const component = useMountComponent({\n title,\n text,\n subTitle\n }).load<InstanceType<typeof TaskLoadingDialog>>(TaskLoadingDialog);\n return component;\n}\n\nexport async function openInstanceTagsEditor(\n instanceId: string,\n daemonId: string,\n tags: string[],\n tagsTips?: string[]\n) {\n return await useMountComponent({\n instanceId,\n daemonId,\n tagsTips,\n tags\n })\n .load<any>(instanceComponents().TagsDialog)\n .openDialog();\n}\n\nexport async function useDeleteInstanceDialog(instanceId: string, daemonId: string) {\n return await useMountComponent({ instanceId, daemonId }).mount<boolean>(\n instanceComponents().DeleteInstanceDialog\n );\n}\n\nexport async function openNodeSelectDialog(targetPlatforms?: string[]) {\n const dialog = useMountComponent({ targetPlatforms }).load<any>(\n instanceComponents().NodeSelectDialog\n );\n return dialog!.openDialog();\n}\n\nexport async function openDockerVersionSelectDialog() {\n const dialog = useMountComponent().load<any>(instanceComponents().DockerVersionSelectDialog);\n return dialog!.openDialog();\n}\n","import dayjs from \"dayjs\";\nimport type { Dayjs } from \"dayjs\";\n\nexport function parseTimestamp(st = 0) {\n if (!st) return \"\";\n return dayjs(st).format(\"YYYY-MM-DD HH:mm:ss\");\n}\n\nexport function dayjsToTimestamp(dayjs?: Dayjs) {\n if (!dayjs) return 0;\n return dayjs.valueOf();\n}\n\nexport function timestampToDayjs(st = 0) {\n if (!st) return;\n return dayjs(st);\n}\n","import type { JsonData } from \"@/types\";\nimport { h } from \"vue\";\n\nexport async function sleep(t: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, t));\n}\n\nexport async function loadingIconFc(fontSize = 24) {\n const indicator = h(\"i\", {\n class: \"mdi mdi-loading mdi-spin\",\n style: { fontSize: `${fontSize}px` }\n });\n return indicator;\n}\n\ninterface Description {\n [key: string]: any;\n}\n\nexport function getDescriptionByTitle(description: Description, title: string = \"\") {\n const arr: string[] = title.split(\"/\");\n\n function _exec(keys: string[], _description: Description) {\n if (!_description) return null;\n const currentTitle: string | undefined = keys.shift();\n if (keys.length !== 0) {\n return _exec(keys, _description[currentTitle!]);\n } else {\n return _description[currentTitle!];\n }\n }\n\n return _exec(arr, description);\n}\n\nexport function jsonToMap(json: JsonData, topTitle = \"\", map = {}) {\n for (const key in json) {\n let title = null;\n if (topTitle) {\n title = `${topTitle}/${key}`;\n } else {\n title = `${key}`;\n }\n const value = json[key];\n if (value === null || value === \"\") {\n Object.defineProperty(map, title, {\n enumerable: true,\n configurable: true,\n get() {\n return json[key] ?? \"\";\n },\n set(v) {\n json[key] = v;\n }\n });\n } else if (value instanceof Array) {\n if (typeof value[0] === \"object\") {\n jsonToMap(value, title, map);\n } else {\n Object.defineProperty(map, title, {\n enumerable: true,\n configurable: true,\n get() {\n return json[key];\n },\n set(v) {\n json[key] = String(v).split(\",\");\n }\n });\n }\n } else if (typeof value === \"object\") {\n jsonToMap(value, title, map);\n } else {\n Object.defineProperty(map, title, {\n enumerable: true,\n configurable: true,\n get() {\n const value = json[key];\n if (\n (typeof value === \"number\" && value >= Number.MAX_SAFE_INTEGER) ||\n value <= Number.MIN_SAFE_INTEGER\n ) {\n return BigInt(value).toString();\n }\n return json[key];\n },\n set(v) {\n if (\n (typeof value === \"number\" && value >= Number.MAX_SAFE_INTEGER) ||\n value <= Number.MIN_SAFE_INTEGER\n ) {\n json[key] = BigInt(value).toString();\n }\n const preValue = json[key];\n if (typeof preValue === \"number\" && !isNaN(Number(v))) return (json[key] = Number(v));\n json[key] = v;\n }\n });\n }\n }\n return map;\n}\n\nexport function toUnicode(str: string) {\n let value = \"\";\n for (let i = 0; i < str.length; i++) {\n if (/([\\u4E00-\\u9FA5]|[\\uFE30-\\uFFA0])/g.test(str[i])) {\n value += \"\\\\u\" + leftZero4(parseInt(str.charCodeAt(i).toString(16)).toString());\n } else {\n value += str[i];\n }\n }\n return value;\n}\n\nfunction leftZero4(str: string) {\n if (str != null && str !== \"\" && str !== \"undefined\") {\n if (str.length == 2) {\n return \"00\" + str;\n }\n }\n return str || \"\";\n}\n\nconst isIPv6 = (str: string) => {\n return /\\[([0-9a-fA-F:]+)\\]/g.test(str);\n};\n\nexport const dockerPortsParse = (ports: string[]) => {\n let joinArr = ports.join(\":\");\n let tempAddr: RegExpMatchArray | null;\n const ipMaps = new Map();\n\n if (isIPv6(joinArr)) {\n tempAddr = joinArr.match(/\\[([0-9a-fA-F:]+)\\]/g);\n for (let i = 0; i < tempAddr!.length; i++) {\n joinArr = joinArr.replace(tempAddr![i], \"IPv6_\" + i);\n ipMaps.set(\"IPv6_\" + i, tempAddr![i]);\n }\n }\n\n let p = isIPv6(ports.join(\":\")) ? joinArr.split(\":\") : ports;\n\n let p1 = [],\n p2 = [];\n\n for (let i = 0; i < p.length; i++) {\n if (\n (isInt(p[0]) && p.length === 3 && i < 1) ||\n (!isInt(p[0]) && p.length === 3 && i < 2) ||\n (p.length === 4 && i < 2)\n ) {\n p1.push(p[i]);\n } else if (p.length === 2) {\n return { port1: p[0], port2: p[1] };\n } else {\n p2.push(p[i]);\n }\n }\n\n const v4 = { port1: p1.join(\":\"), port2: p2.join(\":\") };\n\n const v6 = {\n port1: p1.length === 1 ? p1[0] : p1.join(\":\").replace(p1[0], ipMaps.get(p1[0])),\n port2: p2.length === 1 ? p2[0] : p2.join(\":\").replace(p2[0], ipMaps.get(p2[0]))\n };\n\n return isIPv6(ports.join(\":\")) ? v6 : v4;\n};\n\nexport const dockerPortsArray = (ports: string[]) => {\n const portArray = ports.map((iterator) => {\n const pad = iterator.split(\"/\");\n const ports = pad[0];\n const protocol = pad[1];\n const { port1, port2 } = dockerPortsParse(ports.split(\":\"));\n return {\n host: port1,\n container: port2,\n protocol\n };\n });\n return portArray;\n};\n\nexport const isInt = (x: any) => {\n if (x === null || x === \"\") {\n return false;\n }\n for (let i = 0; i < x.length; i++) {\n const char = x[i];\n if (char < \"0\" || char > \"9\") {\n return false;\n }\n }\n return true;\n};\n\nexport const padZero = (num: string) => (num === \"0\" ? num : num.padStart(2, \"0\"));\n\nexport const getUsageColor = (num: number, normalColor: string = \"var(--color-primary)\"): string =>\n num >= 80 ? \"var(--color-danger)\" : num >= 60 ? \"var(--color-warning)\" : normalColor;\n","import { t } from \"@/lang/i18n\";\nimport { useClipboard } from \"@vueuse/core\";\nimport { message } from \"@/tools/vuetifyToast\";\nimport { Modal } from \"@/tools/vuetifyModal\";\nimport { h } from \"vue\";\n\nconst { copy, copied, isSupported } = useClipboard();\n\nexport const toCopy = async (sth: string | number) => {\n try {\n if (!isSupported.value) {\n const input = document.createElement(\"input\");\n input.setAttribute(\"value\", String(sth));\n document.body.appendChild(input);\n input.select();\n document.execCommand(\"copy\");\n document.body.removeChild(input);\n return message.success(t(\"TXT_CODE_b858d78a\"));\n } else {\n await copy(String(sth));\n if (copied.value) return message.success(t(\"TXT_CODE_b858d78a\"));\n }\n } catch (err: any) {\n console.error(err);\n Modal.warning({\n title: t(\"TXT_CODE_ca07c84c\"),\n content: [h(\"span\", t(\"TXT_CODE_2452016e\")), h(\"br\"), h(\"span\", sth)]\n });\n }\n};\n"],"names":["props","__props","dataSource","ref","_","open","formInstance","cancel","submit","result","_a","error","reportValidatorError","columns","computed","t","tableHeaders","column","getRecord","item","getColumnKey","operation","type","index","keys","v","obj","key","_cache","$event","_createVNode","_unref","VCard","VCardText","_withCtx","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","VBtn","VIcon","VDataTable","_Fragment","_renderList","_normalizeClass","value","emptyValueValidator","_createBlock","VTextField","VSpacer","_createTextVNode","_toDisplayString","instanceComponents","instance","usePluginService","useSelectInstances","data","useMountComponent","usePortEditDialog","useVolumeEditDialog","KvOptionsDialogVue","useDockerEnvEditDialog","useDockerLabelEditDialog","useDockerCapabilityEditDialog","useDockerDeviceEditDialog","openInstanceTagsEditor","instanceId","daemonId","tags","tagsTips","parseTimestamp","st","dayjs","dayjsToTimestamp","timestampToDayjs","sleep","resolve","getDescriptionByTitle","description","title","arr","_exec","_description","currentTitle","jsonToMap","json","topTitle","map","toUnicode","str","i","leftZero4","isIPv6","dockerPortsParse","ports","joinArr","tempAddr","ipMaps","p","p1","p2","isInt","v4","v6","dockerPortsArray","iterator","pad","protocol","port1","port2","x","char","padZero","num","copy","copied","isSupported","useClipboard","toCopy","sth","message","input","err","Modal","h"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-b6992169.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"desktopNotice-2c886f6b.js","sources":["../../../panel/plugins/console/src/tools/desktopNotice.ts"],"sourcesContent":["import { notification } from \"@/tools/vuetifyToast\";\n\nexport type DesktopNoticeType = \"success\" | \"error\" | \"warning\" | \"info\";\n\nexport interface DesktopNoticeInput {\n message?: string;\n description?: string;\n}\n\nexport function notifyDesktop(\n input: string | DesktopNoticeInput,\n type: DesktopNoticeType = \"info\"\n) {\n const options = typeof input === \"string\"\n ? { message: input }\n : { message: input.message, description: input.description };\n if (!options.message && !options.description) return;\n notification[type]({ ...options, placement: \"top\" });\n}\n\nexport function notifyDesktopError(error: unknown, fallback = \"\") {\n const text = typeof error === \"string\"\n ? error\n : error instanceof Error\n ? error.message\n : String((error as { message?: unknown } | null)?.message ?? fallback);\n notifyDesktop(text || fallback, \"error\");\n}\n"],"names":["notifyDesktop","input","type","options","notification","notifyDesktopError","error","fallback","text"],"mappings":"+CASgB,SAAAA,EACdC,EACAC,EAA0B,OAC1B,CACA,MAAMC,EAAU,OAAOF,GAAU,SAC7B,CAAE,QAASA,CAAA,EACX,CAAE,QAASA,EAAM,QAAS,YAAaA,EAAM,WAAY,EACzD,CAACE,EAAQ,SAAW,CAACA,EAAQ,aACjCC,EAAaF,CAAI,EAAE,CAAE,GAAGC,EAAS,UAAW,MAAO,CACrD,CAEgB,SAAAE,EAAmBC,EAAgBC,EAAW,GAAI,CAChE,MAAMC,EAAO,OAAOF,GAAU,SAC1BA,EACAA,aAAiB,MACfA,EAAM,QACN,QAAQA,GAAA,YAAAA,EAAwC,UAAWC,CAAQ,EAC3DP,EAAAQ,GAAQD,EAAU,OAAO,CACzC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"i18n-fe0f1ee7.js","sources":["../../../panel/plugins/i18n/src/lang/i18n.ts"],"sourcesContent":["import type { I18n } from \"vue-i18n\";\nimport { ctx } from \"@/plugin/context\";\nimport type { FrontendI18nService, PanelLanguageOption } from \"@/plugin\";\n\nexport const LANGUAGE_KEY = \"LANGUAGE\";\n\nexport function toStandardLang(language?: string) {\n if (!language) return \"en_us\";\n return language.trim().replace(/-/g, \"_\").toLowerCase();\n}\n\nfunction service(): FrontendI18nService {\n const i18n = ctx.get(\"i18n\");\n if (!i18n) throw new Error('Panel frontend plugin \"i18n\" is not loaded.');\n return i18n;\n}\n\nexport function getI18nInstance(): I18n {\n return service().instance;\n}\n\nexport function getSupportedLanguageOptions(): readonly PanelLanguageOption[] {\n return service().supportedLanguages;\n}\n\nexport function getSupportLanguages(): string[] {\n return service().getSupportLanguages();\n}\n\nexport function searchSupportLanguage(language: string): string {\n return service().searchSupportLanguage(language);\n}\n\nexport function setLanguage(language: string, reload = true): void {\n service().setLanguage(language, reload);\n}\n\nexport function getCurrentLang(): string {\n return service().getCurrentLang();\n}\n\nexport function isCN(): boolean {\n return service().isCN();\n}\n\nexport function isEN(): boolean {\n return service().isEN();\n}\n\nexport function $t(...args: any[]): string {\n return service().translate(...args);\n}\n\nexport const t = $t;\n"],"names":["LANGUAGE_KEY","toStandardLang","language","service","i18n","ctx","getI18nInstance","setLanguage","reload","getCurrentLang","isCN","$t","args","t"],"mappings":"0CAIO,MAAMA,EAAe,WAErB,SAASC,EAAeC,EAAmB,CAChD,OAAKA,EACEA,EAAS,OAAO,QAAQ,KAAM,GAAG,EAAE,cADpB,OAExB,CAEA,SAASC,GAA+B,CAChC,MAAAC,EAAOC,EAAI,IAAI,MAAM,EAC3B,GAAI,CAACD,EAAY,MAAA,IAAI,MAAM,6CAA6C,EACjE,OAAAA,CACT,CAEO,SAASE,GAAwB,CACtC,OAAOH,EAAU,EAAA,QACnB,CAcgB,SAAAI,EAAYL,EAAkBM,EAAS,GAAY,CACzDL,IAAE,YAAYD,EAAUM,CAAM,CACxC,CAEO,SAASC,GAAyB,CAChC,OAAAN,EAAA,EAAU,gBACnB,CAEO,SAASO,GAAgB,CACvB,OAAAP,EAAA,EAAU,MACnB,CAMO,SAASQ,KAAMC,EAAqB,CACzC,OAAOT,EAAQ,EAAE,UAAU,GAAGS,CAAI,CACpC,CAEO,MAAMC,EAAIF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"instance-26cca4c8.js","sources":["../../../panel/plugins/console/src/services/apis/instance.ts"],"sourcesContent":["import { usePluginService } from \"@/plugin/context\";\nimport type * as InstanceApi from \"@instance/api\";\n\nexport type InstancePluginApi = typeof InstanceApi;\n\nfunction resolveInstanceApi(): InstancePluginApi {\n const instance = usePluginService<{ api: InstancePluginApi }>(\"instance\");\n if (!instance) {\n throw new Error('Panel frontend plugin \"instance\" is not loaded.');\n }\n return instance.api;\n}\n\nconst call = <K extends keyof InstancePluginApi>(name: K) =>\n ((...args: any[]) => (resolveInstanceApi()[name] as any)(...args)) as InstancePluginApi[K];\n\nexport const remoteInstances = call(\"remoteInstances\");\nexport const getInstanceInfo = call(\"getInstanceInfo\");\nexport const openInstance = call(\"openInstance\");\nexport const stopInstance = call(\"stopInstance\");\nexport const restartInstance = call(\"restartInstance\");\nexport const killInstance = call(\"killInstance\");\nexport const updateInstance = call(\"updateInstance\");\nexport const updateInstanceConfig = call(\"updateInstanceConfig\");\nexport const updateAnyInstanceConfig = call(\"updateAnyInstanceConfig\");\nexport const uploadAddress = call(\"uploadAddress\");\nexport const uploadInstanceFile = call(\"uploadInstanceFile\");\nexport const createInstance = call(\"createInstance\");\nexport const createAsyncTask = call(\"createAsyncTask\");\nexport const queryAsyncTask = call(\"queryAsyncTask\");\nexport const getConfigFileList = call(\"getConfigFileList\");\nexport const getConfigFile = call(\"getConfigFile\");\nexport const updateConfigFile = call(\"updateConfigFile\");\nexport const batchStart = call(\"batchStart\");\nexport const batchStop = call(\"batchStop\");\nexport const batchKill = call(\"batchKill\");\nexport const batchRestart = call(\"batchRestart\");\nexport const batchDelete = call(\"batchDelete\");\nexport const scheduleList = call(\"scheduleList\");\nexport const scheduleDelete = call(\"scheduleDelete\");\nexport const scheduleCreate = call(\"scheduleCreate\");\n"],"names":["resolveInstanceApi","instance","usePluginService","call","name","args","remoteInstances","getInstanceInfo","openInstance","stopInstance","restartInstance","killInstance","updateInstance","updateInstanceConfig","updateAnyInstanceConfig","uploadAddress","createInstance","createAsyncTask","queryAsyncTask","getConfigFileList","getConfigFile","updateConfigFile","batchStart","batchStop","batchKill","batchRestart","batchDelete","scheduleList","scheduleDelete","scheduleCreate"],"mappings":"0CAKA,SAASA,GAAwC,CACzC,MAAAC,EAAWC,EAA6C,UAAU,EACxE,GAAI,CAACD,EACG,MAAA,IAAI,MAAM,iDAAiD,EAEnE,OAAOA,EAAS,GAClB,CAEA,MAAME,EAA2CC,GAC9C,IAAIC,IAAiBL,IAAqBI,CAAI,EAAU,GAAGC,CAAI,EAErDC,EAAkBH,EAAK,iBAAiB,EACxCI,EAAkBJ,EAAK,iBAAiB,EACxCK,EAAeL,EAAK,cAAc,EAClCM,EAAeN,EAAK,cAAc,EAClCO,EAAkBP,EAAK,iBAAiB,EACxCQ,EAAeR,EAAK,cAAc,EAClCS,EAAiBT,EAAK,gBAAgB,EACtCU,EAAuBV,EAAK,sBAAsB,EAClDW,EAA0BX,EAAK,yBAAyB,EACxDY,EAAgBZ,EAAK,eAAe,EAEpCa,EAAiBb,EAAK,gBAAgB,EACtCc,EAAkBd,EAAK,iBAAiB,EACxCe,EAAiBf,EAAK,gBAAgB,EACtCgB,EAAoBhB,EAAK,mBAAmB,EAC5CiB,EAAgBjB,EAAK,eAAe,EACpCkB,EAAmBlB,EAAK,kBAAkB,EAC1CmB,EAAanB,EAAK,YAAY,EAC9BoB,EAAYpB,EAAK,WAAW,EAC5BqB,EAAYrB,EAAK,WAAW,EAC5BsB,EAAetB,EAAK,cAAc,EAClCuB,EAAcvB,EAAK,aAAa,EAChCwB,EAAexB,EAAK,cAAc,EAClCyB,EAAiBzB,EAAK,gBAAgB,EACtC0B,EAAiB1B,EAAK,gBAAgB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"nodes-402cdcbd.js","sources":["../../../panel/plugins/console/src/services/apis/node.ts","../../../panel/plugins/console/src/tools/nodes.ts"],"sourcesContent":["import { usePluginService } from \"@/plugin/context\";\nimport type { Ref } from \"vue\";\nimport type { NodeStatus } from \"@/types\";\n\nexport interface NodeApiResult<T> {\n isLoading: Ref<boolean>;\n state: Ref<T | undefined>;\n isReady: Ref<boolean>;\n execute: (config?: any) => Promise<Ref<T | undefined>>;\n}\n\nexport interface NodePluginApi {\n remoteNodeList: () => NodeApiResult<NodeStatus[]>;\n editNode: () => NodeApiResult<any>;\n addNode: () => NodeApiResult<any>;\n deleteNode: () => NodeApiResult<any>;\n connectNode: () => NodeApiResult<any>;\n}\n\nfunction resolveNodeApi(): NodePluginApi {\n const node = usePluginService<{ api: NodePluginApi }>(\"node\");\n if (!node) {\n throw new Error('Panel frontend plugin \"node\" is not loaded.');\n }\n return node.api;\n}\n\nexport const remoteNodeList = () => resolveNodeApi().remoteNodeList();\nexport const editNode = () => resolveNodeApi().editNode();\nexport const addNode = () => resolveNodeApi().addNode();\nexport const deleteNode = () => resolveNodeApi().deleteNode();\nexport const connectNode = () => resolveNodeApi().connectNode();\n","import { t } from \"@/lang/i18n\";\n\nexport function computeNodeName(ip: string, available: boolean, remark?: string) {\n if (!ip) return t(\"TXT_CODE_aa373641\");\n const online = available ? \"\" : t(\"TXT_CODE_836addb9\");\n return remark ? `${remark} - ${ip} ${online}` : `${ip} ${online}`;\n}\n"],"names":["resolveNodeApi","node","usePluginService","remoteNodeList","computeNodeName","ip","available","remark","online"],"mappings":"4EAmBA,SAASA,GAAgC,CACjC,MAAAC,EAAOC,EAAyC,MAAM,EAC5D,GAAI,CAACD,EACG,MAAA,IAAI,MAAM,6CAA6C,EAE/D,OAAOA,EAAK,GACd,CAEO,MAAME,EAAiB,IAAMH,EAAe,EAAE,eAAe,ECzBpD,SAAAI,EAAgBC,EAAYC,EAAoBC,EAAiB,CAC/E,GAAI,CAACF,EAAI,OAAO,EAAE,mBAAmB,EACrC,MAAMG,EAASF,EAAY,GAAK,EAAE,mBAAmB,EAC9C,OAAAC,EAAS,GAAGA,CAAM,MAAMF,CAAE,IAAIG,CAAM,GAAK,GAAGH,CAAE,IAAIG,CAAM,EACjE"}
@@ -1,2 +0,0 @@
1
- var d,a=new Uint8Array(16);function f(){if(!d&&(d=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||typeof msCrypto<"u"&&typeof msCrypto.getRandomValues=="function"&&msCrypto.getRandomValues.bind(msCrypto),!d))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return d(a)}const i=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function g(t){return typeof t=="string"&&i.test(t)}var e=[];for(var s=0;s<256;++s)e.push((s+256).toString(16).substr(1));function p(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,o=(e[t[n+0]]+e[t[n+1]]+e[t[n+2]]+e[t[n+3]]+"-"+e[t[n+4]]+e[t[n+5]]+"-"+e[t[n+6]]+e[t[n+7]]+"-"+e[t[n+8]]+e[t[n+9]]+"-"+e[t[n+10]]+e[t[n+11]]+e[t[n+12]]+e[t[n+13]]+e[t[n+14]]+e[t[n+15]]).toLowerCase();if(!g(o))throw TypeError("Stringified UUID is invalid");return o}function m(t,n,o){t=t||{};var u=t.random||(t.rng||f)();if(u[6]=u[6]&15|64,u[8]=u[8]&63|128,n){o=o||0;for(var r=0;r<16;++r)n[o+r]=u[r];return n}return p(u)}function y(){return m()}export{y as g,m as v};
2
- //# sourceMappingURL=randId-ed0b95b7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"randId-ed0b95b7.js","sources":["../../../panel/node_modules/uuid/dist/esm-browser/rng.js","../../../panel/node_modules/uuid/dist/esm-browser/regex.js","../../../panel/node_modules/uuid/dist/esm-browser/validate.js","../../../panel/node_modules/uuid/dist/esm-browser/stringify.js","../../../panel/node_modules/uuid/dist/esm-browser/v4.js","../../../panel/plugins/console/src/tools/randId.ts"],"sourcesContent":["// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","import { v4 } from \"uuid\";\n\nexport function generateRandomString(len = 16) {\n const characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n let randomString = \"\";\n\n for (let i = 0; i < len; i++) {\n const randomIndex = Math.floor(Math.random() * characters.length);\n randomString += characters.charAt(randomIndex);\n }\n\n return randomString;\n}\nexport function getRandomId() {\n return v4();\n}\n"],"names":["getRandomValues","rnds8","rng","REGEX","validate","uuid","byteToHex","i","stringify","arr","offset","v4","options","buf","rnds","getRandomId"],"mappings":"AAGA,IAAIA,EACAC,EAAQ,IAAI,WAAW,EAAE,EACd,SAASC,GAAM,CAE5B,GAAI,CAACF,IAGHA,EAAkB,OAAO,OAAW,KAAe,OAAO,iBAAmB,OAAO,gBAAgB,KAAK,MAAM,GAAK,OAAO,SAAa,KAAe,OAAO,SAAS,iBAAoB,YAAc,SAAS,gBAAgB,KAAK,QAAQ,EAE3O,CAACA,GACH,MAAM,IAAI,MAAM,0GAA0G,EAI9H,OAAOA,EAAgBC,CAAK,CAC9B,CClBA,MAAAE,EAAe,sHCEf,SAASC,EAASC,EAAM,CACtB,OAAO,OAAOA,GAAS,UAAYF,EAAM,KAAKE,CAAI,CACpD,CCEA,IAAIC,EAAY,CAAA,EAEhB,QAASC,EAAI,EAAGA,EAAI,IAAK,EAAEA,EACzBD,EAAU,MAAMC,EAAI,KAAO,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC,EAGnD,SAASC,EAAUC,EAAK,CACtB,IAAIC,EAAS,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,EAG7EL,GAAQC,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,GAAG,cAMzf,GAAI,CAACN,EAASC,CAAI,EAChB,MAAM,UAAU,6BAA6B,EAG/C,OAAOA,CACT,CCxBA,SAASM,EAAGC,EAASC,EAAKH,EAAQ,CAChCE,EAAUA,GAAW,GACrB,IAAIE,EAAOF,EAAQ,SAAWA,EAAQ,KAAOV,KAK7C,GAHAY,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAI,GAAO,GAC3BA,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAI,GAAO,IAEvBD,EAAK,CACPH,EAASA,GAAU,EAEnB,QAASH,EAAI,EAAGA,EAAI,GAAI,EAAEA,EACxBM,EAAIH,EAASH,CAAC,EAAIO,EAAKP,CAAC,EAG1B,OAAOM,CACR,CAED,OAAOL,EAAUM,CAAI,CACvB,CCRO,SAASC,GAAc,CAC5B,OAAOJ,EAAG,CACZ","x_google_ignoreList":[0,1,2,3,4]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"router-0f7d4714.js","sources":["../../../panel/plugins/console/src/services/TopProgressBar.ts","../../../panel/plugins/console/src/config/router.ts"],"sourcesContent":["class TopProgressBar {\n private element: HTMLElement | null = null;\n private timer: number | null = null;\n private progress: number = 0;\n private isDone: boolean = false;\n private hideTimeout: number | null = null;\n\n constructor() {\n this.init();\n }\n\n private init() {\n if (typeof document === \"undefined\") return;\n\n if (document.getElementById(\"top-progress-bar\")) {\n this.element = document.getElementById(\"top-progress-bar\");\n return;\n }\n\n this.element = document.createElement(\"div\");\n this.element.id = \"top-progress-bar\";\n document.body.appendChild(this.element);\n }\n\n start() {\n if (!this.element) this.init();\n\n this.isDone = false;\n this.progress = 0;\n\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n\n if (this.element) {\n this.element.classList.add(\"active\");\n this.element.style.width = \"0%\";\n this.element.style.opacity = \"1\";\n }\n\n this.inc();\n }\n\n private inc() {\n if (this.isDone) return;\n\n if (this.timer) {\n clearTimeout(this.timer);\n }\n\n let amount = 0;\n if (this.progress >= 0 && this.progress < 0.2) {\n amount = 0.1;\n } else if (this.progress >= 0.2 && this.progress < 0.5) {\n amount = 0.04;\n } else if (this.progress >= 0.5 && this.progress < 0.8) {\n amount = 0.02;\n } else if (this.progress >= 0.8 && this.progress < 0.99) {\n amount = 0.005;\n }\n\n this.progress += amount;\n\n if (this.progress > 0.994) {\n this.progress = 0.994;\n }\n\n if (this.element) {\n this.element.style.width = `${this.progress * 100}%`;\n }\n\n this.timer = window.setTimeout(() => {\n this.inc();\n }, 200);\n }\n\n done() {\n this.isDone = true;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n\n if (this.element) {\n this.element.style.width = \"100%\";\n\n this.hideTimeout = window.setTimeout(() => {\n if (this.element) {\n this.element.style.opacity = \"0\";\n this.element.classList.remove(\"active\");\n\n setTimeout(() => {\n if (this.element && !this.element.classList.contains(\"active\")) {\n this.element.style.width = \"0%\";\n }\n }, 400);\n }\n }, 1000);\n }\n }\n}\n\nexport const topProgressBar = new TopProgressBar();\n","import { topProgressBar } from \"@/services/TopProgressBar\";\nimport { useAppStateStore } from \"@/stores/useAppStateStore\";\nimport type { LoginUserInfo } from \"@/types/user\";\nimport type { Component } from \"vue\";\nimport {\n createRouter,\n createWebHashHistory,\n type RouteLocationNormalized,\n type RouteRecordRaw\n} from \"vue-router\";\n\nexport interface RouterMetaInfo {\n icon?: Component | string;\n mainMenu?: boolean;\n permission?: number;\n redirect?:\n | string\n | ((userInfo: LoginUserInfo | undefined,\n to: RouteLocationNormalized,\n from: RouteLocationNormalized\n ) => string);\n customClass?: string[];\n condition?: () => boolean;\n public?: boolean;\n immersive?: boolean;\n breadcrumbs?: Array<{\n name: string;\n path: string;\n mainMenu?: boolean;\n permission: number;\n }>;\n}\n\nexport interface RouterConfig {\n path: string;\n name: string;\n component?: any;\n children?: RouterConfig[];\n meta: RouterMetaInfo;\n redirect?:\n | string\n | ((\n userInfo: LoginUserInfo,\n to: RouteLocationNormalized,\n from: RouteLocationNormalized\n ) => string);\n}\n\nexport enum ROLE {\n // eslint-disable-next-line no-unused-vars\n ADMIN = 10,\n // eslint-disable-next-line no-unused-vars\n USER = 1,\n // eslint-disable-next-line no-unused-vars\n GUEST = 0\n}\n\n// The base routes belong to the `console` plugin. Keeping the router itself in\n// core lets every plugin register routes before the Vue app is mounted.\nconst originRouterConfig: RouterConfig[] = [];\n\nconst router = createRouter({\n history: createWebHashHistory(),\n routes: originRouterConfig as RouteRecordRaw[]\n});\n\nrouter.beforeEach(async (to, from, next) => {\n topProgressBar.start();\n const { state, updateUserInfo, isAdmin, authEnabled } = useAppStateStore();\n\n // Without the user plugin every visitor is an anonymous administrator.\n const requiresLogin = authEnabled.value;\n const userPermission = state.userInfo?.permission ?? 0;\n const toPagePermission = Number(to.meta.permission ?? 0);\n const fromRoutePath = router.currentRoute.value.path.trim();\n const toRoutePath = to.path.trim();\n console.info(\n \"Router Changed:\",\n fromRoutePath,\n \"->\",\n toRoutePath,\n \"\\nMyPermission:\",\n userPermission,\n \"toPagePermission:\",\n toPagePermission\n );\n\n if (to.meta?.redirect) {\n if (typeof to.meta.redirect === \"function\") {\n const userInfo = state.userInfo;\n return next(to.meta.redirect(userInfo, to, from));\n }\n return next(to.meta.redirect as string);\n }\n\n if (toRoutePath === \"/sso/callback\") {\n try {\n await updateUserInfo();\n return next(isAdmin.value ? \"/\" : \"/customer\");\n } catch {\n return next(\"/login\");\n }\n }\n\n if (\n toRoutePath.startsWith(\"/sso/\") ||\n to.meta.public === true ||\n [\"/login\", \"/404\"].includes(toRoutePath)\n ) {\n return next();\n }\n\n if (!to.name) return next(\"/404\");\n\n if (requiresLogin && !state.userInfo?.token) return next(\"/login\");\n\n if (toPagePermission > userPermission && userPermission !== ROLE.ADMIN) {\n return next(\"/customer\");\n }\n\n if (toPagePermission <= userPermission) {\n next();\n } else {\n next(\"/404\");\n }\n});\n\nrouter.afterEach(() => {\n topProgressBar.done();\n});\n\nexport { originRouterConfig, router };\n"],"names":["TopProgressBar","amount","topProgressBar","ROLE","originRouterConfig","router","createRouter","createWebHashHistory","to","from","next","state","updateUserInfo","isAdmin","authEnabled","useAppStateStore","requiresLogin","userPermission","_a","toPagePermission","fromRoutePath","toRoutePath","_b","userInfo","_c"],"mappings":"kGAAA,MAAMA,CAAe,CAOjB,aAAc,CANd,KAAQ,QAA8B,KACtC,KAAQ,MAAuB,KAC/B,KAAQ,SAAmB,EAC3B,KAAQ,OAAkB,GAC1B,KAAQ,YAA6B,KAGjC,KAAK,KAAK,CACd,CAEQ,MAAO,CACX,GAAI,SAAO,SAAa,KAEpB,IAAA,SAAS,eAAe,kBAAkB,EAAG,CACxC,KAAA,QAAU,SAAS,eAAe,kBAAkB,EACzD,MACJ,CAEK,KAAA,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,GAAK,mBACT,SAAA,KAAK,YAAY,KAAK,OAAO,EAC1C,CAEA,OAAQ,CACC,KAAK,SAAS,KAAK,KAAK,EAE7B,KAAK,OAAS,GACd,KAAK,SAAW,EAEZ,KAAK,cACL,aAAa,KAAK,WAAW,EAC7B,KAAK,YAAc,MAGnB,KAAK,UACA,KAAA,QAAQ,UAAU,IAAI,QAAQ,EAC9B,KAAA,QAAQ,MAAM,MAAQ,KACtB,KAAA,QAAQ,MAAM,QAAU,KAGjC,KAAK,IAAI,CACb,CAEQ,KAAM,CACV,GAAI,KAAK,OAAQ,OAEb,KAAK,OACL,aAAa,KAAK,KAAK,EAG3B,IAAIC,EAAS,EACT,KAAK,UAAY,GAAK,KAAK,SAAW,GAC7BA,EAAA,GACF,KAAK,UAAY,IAAO,KAAK,SAAW,GACtCA,EAAA,IACF,KAAK,UAAY,IAAO,KAAK,SAAW,GACtCA,EAAA,IACF,KAAK,UAAY,IAAO,KAAK,SAAW,MACtCA,EAAA,MAGb,KAAK,UAAYA,EAEb,KAAK,SAAW,OAChB,KAAK,SAAW,MAGhB,KAAK,UACL,KAAK,QAAQ,MAAM,MAAQ,GAAG,KAAK,SAAW,GAAG,KAGhD,KAAA,MAAQ,OAAO,WAAW,IAAM,CACjC,KAAK,IAAI,GACV,GAAG,CACV,CAEA,MAAO,CACH,KAAK,OAAS,GACV,KAAK,QACL,aAAa,KAAK,KAAK,EACvB,KAAK,MAAQ,MAGb,KAAK,UACA,KAAA,QAAQ,MAAM,MAAQ,OAEtB,KAAA,YAAc,OAAO,WAAW,IAAM,CACnC,KAAK,UACA,KAAA,QAAQ,MAAM,QAAU,IACxB,KAAA,QAAQ,UAAU,OAAO,QAAQ,EAEtC,WAAW,IAAM,CACT,KAAK,SAAW,CAAC,KAAK,QAAQ,UAAU,SAAS,QAAQ,IACpD,KAAA,QAAQ,MAAM,MAAQ,OAEhC,GAAG,IAEX,GAAI,EAEf,CACJ,CAEa,MAAAC,EAAiB,IAAIF,ECvDtB,IAAAG,GAAAA,IAEVA,EAAAA,EAAA,MAAQ,EAAR,EAAA,QAEAA,EAAAA,EAAA,KAAO,CAAP,EAAA,OAEAA,EAAAA,EAAA,MAAQ,CAAR,EAAA,QANUA,IAAAA,GAAA,CAAA,CAAA,EAWZ,MAAMC,EAAqC,CAAA,EAErCC,EAASC,EAAa,CAC1B,QAASC,EAAqB,EAC9B,OAAQH,CACV,CAAC,EAEDC,EAAO,WAAW,MAAOG,EAAIC,EAAMC,IAAS,WAC1CR,EAAe,MAAM,EACrB,KAAM,CAAE,MAAAS,EAAO,eAAAC,EAAgB,QAAAC,EAAS,YAAAC,CAAA,EAAgBC,IAGlDC,EAAgBF,EAAY,MAC5BG,IAAiBC,EAAAP,EAAM,WAAN,YAAAO,EAAgB,aAAc,EAC/CC,EAAmB,OAAOX,EAAG,KAAK,YAAc,CAAC,EACjDY,EAAgBf,EAAO,aAAa,MAAM,KAAK,OAC/CgB,EAAcb,EAAG,KAAK,KAAK,EAY7B,GAXI,QAAA,KACN,kBACAY,EACA,KACAC,EACA;AAAA,eACAJ,EACA,oBACAE,CAAA,GAGEG,EAAAd,EAAG,OAAH,MAAAc,EAAS,SAAU,CACrB,GAAI,OAAOd,EAAG,KAAK,UAAa,WAAY,CAC1C,MAAMe,EAAWZ,EAAM,SACvB,OAAOD,EAAKF,EAAG,KAAK,SAASe,EAAUf,EAAIC,CAAI,CAAC,CAClD,CACO,OAAAC,EAAKF,EAAG,KAAK,QAAkB,CACxC,CAEA,GAAIa,IAAgB,gBACd,GAAA,CACF,aAAMT,EAAe,EACdF,EAAKG,EAAQ,MAAQ,IAAM,WAAW,CAAA,MACvC,CACN,OAAOH,EAAK,QAAQ,CACtB,CAGF,GACEW,EAAY,WAAW,OAAO,GAC9Bb,EAAG,KAAK,SAAW,IACnB,CAAC,SAAU,MAAM,EAAE,SAASa,CAAW,EAEvC,OAAOX,EAAK,EAGd,GAAI,CAACF,EAAG,KAAM,OAAOE,EAAK,MAAM,EAE5B,GAAAM,GAAiB,GAACQ,EAAAb,EAAM,WAAN,MAAAa,EAAgB,OAAO,OAAOd,EAAK,QAAQ,EAE7D,GAAAS,EAAmBF,GAAkBA,IAAmB,GAC1D,OAAOP,EAAK,WAAW,EAGrBS,GAAoBF,EACjBP,IAELA,EAAK,MAAM,CAEf,CAAC,EAEDL,EAAO,UAAU,IAAM,CACrBH,EAAe,KAAK,CACtB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sdk-01dda668.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"shared-f2e37690.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAppConfigStore-289073ec.js","sources":["../../../panel/plugins/console/src/assets/logo.svg","../../../panel/plugins/console/src/assets/logo_b.svg","../../../panel/plugins/console/src/services/apis/appearance.ts","../../../panel/plugins/console/src/stores/useAppConfigStore.ts"],"sourcesContent":["export default \"__VITE_ASSET__c2b3a5f0__\"","export default \"__VITE_ASSET__b23f8509__\"","import { useDefineApi } from \"@/stores/useDefineApi\";\n\nexport interface PanelAppearance {\n pageTitle: string;\n logoImage: string;\n logoImageLight?: string;\n logoImageDark?: string;\n backgroundImage: string;\n}\n\n/** Public: the shell reads it before authentication is restored. */\nexport const getAppearance = useDefineApi<unknown, PanelAppearance>({\n url: \"/api/overview/appearance\",\n method: \"GET\"\n});\n","/* eslint-disable no-unused-vars */\nimport logo from \"@/assets/logo.svg\";\nimport logoB from \"@/assets/logo_b.svg\";\nimport { getCurrentLang, setLanguage } from \"@/lang/i18n\";\nimport { AppTheme, THEME_AUTO_MIGRATED_KEY, THEME_KEY } from \"@/types/const\";\nimport { createGlobalState, useBreakpoints, useLocalStorage, usePreferredDark } from \"@vueuse/core\";\nimport { getAppearance, type PanelAppearance } from \"@/services/apis/appearance\";\nimport { computed, onMounted, reactive, ref, watch } from \"vue\";\n\n/**\n * Older builds defaulted to LIGHT and wrote that value on the very first visit,\n * so an upgraded browser keeps rendering the light background even on a dark\n * system. Rewrite that one stored value to AUTO, once: a light theme picked\n * after this has run is left alone.\n */\nconst migrateLegacyLightDefault = () => {\n try {\n if (localStorage.getItem(THEME_AUTO_MIGRATED_KEY)) return;\n localStorage.setItem(THEME_AUTO_MIGRATED_KEY, \"1\");\n if (Number(localStorage.getItem(THEME_KEY)) === AppTheme.LIGHT) {\n localStorage.setItem(THEME_KEY, String(AppTheme.AUTO));\n }\n } catch {\n // Storage can be unavailable (private mode, blocked cookies): nothing to migrate.\n }\n};\n\nmigrateLegacyLightDefault();\n\nexport const useAppConfigStore = createGlobalState(() => {\n const isPreferredDark = usePreferredDark();\n\n const appConfig = reactive({\n logoImage: \"\",\n logoImageLight: undefined as string | undefined,\n logoImageDark: undefined as string | undefined\n });\n\n const isDarkTheme = computed(() => {\n if (currentTheme.value === AppTheme.DARK) return true;\n if (currentTheme.value === AppTheme.AUTO) return isPreferredDark.value;\n return false;\n });\n\n const logoImage = computed(() => {\n const themedLogo = isDarkTheme.value ? appConfig.logoImageDark : appConfig.logoImageLight;\n return (themedLogo ?? appConfig.logoImage) || (isDarkTheme.value ? logo : logoB);\n });\n\n // Default to AUTO so a fresh visit follows the system dark mode\n // (index.html's loading screen already does the same).\n const currentTheme = useLocalStorage<AppTheme>(THEME_KEY, AppTheme.AUTO);\n\n const hasBgImage = ref(false);\n\n /** Desktop uses the sidebar/header layout; phones keep the compact navigation. */\n const breakpoints = useBreakpoints({ sidebar: 993 });\n const isWideEnoughForSidebar = breakpoints.greaterOrEqual(\"sidebar\");\n const useSidebarLayout = computed(() => isWideEnoughForSidebar.value);\n const sidebarOpen = useLocalStorage(\"app-sidebar-open\", true);\n const isSidebarOpen = computed(() => useSidebarLayout.value && sidebarOpen.value);\n\n const toggleSidebar = () => {\n sidebarOpen.value = !sidebarOpen.value;\n };\n\n const clearBackgroundImage = () => {\n const body = document.querySelector(\"body\");\n if (!body) return;\n body.style.removeProperty(\"background-image\");\n body.style.removeProperty(\"background-size\");\n body.style.removeProperty(\"background-position\");\n body.style.removeProperty(\"background-repeat\");\n body.classList.remove(\"app-light-extend-theme\", \"app-dark-extend-theme\");\n hasBgImage.value = false;\n };\n\n const setBackgroundImage = (url: string) => {\n if (!url) {\n clearBackgroundImage();\n return;\n }\n const body = document.querySelector(\"body\");\n if (body) {\n body.style.backgroundSize = \"cover\";\n body.style.backgroundPosition = \"center\";\n body.style.backgroundRepeat = \"no-repeat\";\n if (isDarkTheme.value) {\n body.style.backgroundImage = `linear-gradient(135deg, rgba(0,0,0,0.65), rgba(0,0,0,0.65) 100%), url(${url})`;\n body.classList.remove(\"app-light-extend-theme\");\n body.classList.add(\"app-dark-extend-theme\");\n } else {\n body.style.backgroundImage = `linear-gradient(135deg, rgba(220,220,220,0.3), rgba(53,53,53,0.3) 100%), url(${url})`;\n body.classList.remove(\"app-dark-extend-theme\");\n body.classList.add(\"app-light-extend-theme\");\n }\n\n hasBgImage.value = true;\n }\n };\n\n const setLight = () => {\n document.body.classList.add(\"app-light-theme\");\n document.body.classList.remove(\"app-dark-theme\");\n };\n\n const setDark = () => {\n document.body.classList.add(\"app-dark-theme\");\n document.body.classList.remove(\"app-light-theme\");\n };\n\n const resetTheme = () => (currentTheme.value = AppTheme.AUTO);\n\n const initAppTheme = async () => {\n if (\n isNaN(currentTheme.value) ||\n currentTheme.value < AppTheme.AUTO ||\n currentTheme.value > AppTheme.DARK\n ) {\n resetTheme();\n }\n const fn = {\n [AppTheme.AUTO]: () => (isPreferredDark.value ? setDark() : setLight()),\n [AppTheme.LIGHT]: () => setLight(),\n [AppTheme.DARK]: () => setDark()\n };\n fn[currentTheme.value]?.();\n\n const { value: appearance } = await getAppearance().execute();\n setLogoImages(appearance);\n setBackgroundImage(appearance?.backgroundImage || \"\");\n };\n\n const setTheme = (t: AppTheme) => {\n currentTheme.value = t;\n initAppTheme();\n };\n\n const changeLanguage = (lang: string) => {\n setLanguage(lang);\n };\n\n const getCurrentLanguage = () => {\n return getCurrentLang() ?? \"en_us\";\n };\n\n const setLogoImage = (url: string) => {\n appConfig.logoImage = url;\n };\n\n const setLogoImages = (appearance?: PanelAppearance) => {\n setLogoImage(appearance?.logoImage || \"\");\n appConfig.logoImageLight = appearance?.logoImageLight;\n appConfig.logoImageDark = appearance?.logoImageDark;\n };\n\n watch(isPreferredDark, () => {\n if (currentTheme.value === AppTheme.AUTO) {\n initAppTheme();\n }\n });\n\n onMounted(async () => {\n try {\n const { value: appearance } = await getAppearance().execute();\n setLogoImages(appearance);\n } catch (error) {\n console.error(\"Failed to load appearance settings:\", error);\n }\n });\n\n return {\n appConfig,\n logoImage,\n hasBgImage,\n useSidebarLayout,\n isSidebarOpen,\n toggleSidebar,\n setLogoImage,\n changeLanguage,\n getCurrentLanguage,\n isDarkTheme,\n initAppTheme,\n setTheme,\n clearBackgroundImage,\n setBackgroundImage,\n currentTheme\n };\n});\n"],"names":["logo","logoB","getAppearance","useDefineApi","migrateLegacyLightDefault","THEME_AUTO_MIGRATED_KEY","THEME_KEY","AppTheme","useAppConfigStore","createGlobalState","isPreferredDark","usePreferredDark","appConfig","reactive","isDarkTheme","computed","currentTheme","logoImage","useLocalStorage","hasBgImage","ref","isWideEnoughForSidebar","useBreakpoints","useSidebarLayout","sidebarOpen","isSidebarOpen","toggleSidebar","clearBackgroundImage","body","setBackgroundImage","url","setLight","setDark","resetTheme","initAppTheme","fn","_a","appearance","setLogoImages","setTheme","t","changeLanguage","lang","setLanguage","getCurrentLanguage","getCurrentLang","setLogoImage","watch","onMounted","error"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{r as o}from"./router-0f7d4714.js";import{c9 as u}from"./vue-2433bd89.js";function c(){const t=u();return{getRouteParamsUrl:()=>t.fullPath.split("?")[1]||"",toPage:r=>{const e={...r};return e.query={...t.query||{},...r.query||{}},o.push(e)}}}export{c as u};
2
- //# sourceMappingURL=useAppRouters-5f58db32.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAppRouters-5f58db32.js","sources":["../../../panel/plugins/console/src/hooks/useAppRouters.ts"],"sourcesContent":["import { router } from \"@/config/router\";\nimport { useRoute, type RouteLocationPathRaw } from \"vue-router\";\n\nexport function useAppRouters() {\n const route = useRoute();\n\n const getRouteParamsUrl = () => {\n return route.fullPath.split(\"?\")[1] || \"\";\n };\n\n const toPage = (params: RouteLocationPathRaw) => {\n const tmp = {\n ...params\n };\n tmp.query = {\n ...(route.query || {}),\n ...(params.query || {})\n };\n\n return router.push(tmp);\n };\n\n return {\n getRouteParamsUrl,\n toPage\n };\n}\n"],"names":["useAppRouters","route","useRoute","params","tmp","router"],"mappings":"gFAGO,SAASA,GAAgB,CAC9B,MAAMC,EAAQC,IAkBP,MAAA,CACL,kBAjBwB,IACjBD,EAAM,SAAS,MAAM,GAAG,EAAE,CAAC,GAAK,GAiBvC,OAdcE,GAAiC,CAC/C,MAAMC,EAAM,CACV,GAAGD,CAAA,EAEL,OAAAC,EAAI,MAAQ,CACV,GAAIH,EAAM,OAAS,CAAC,EACpB,GAAIE,EAAO,OAAS,CAAC,CAAA,EAGhBE,EAAO,KAAKD,CAAG,CAAA,CAKtB,CAEJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAppStateStore-a644582a.js","sources":["../../../panel/plugins/console/src/services/apis/user.ts","../../../panel/plugins/console/src/services/apis/index.ts","../../../panel/plugins/console/src/stores/useAppStateStore.ts"],"sourcesContent":["import { usePluginService } from \"@/plugin/context\";\nimport type { BaseUserInfo, EditUserInfo, LoginUserInfo, UserInstance } from \"@/types/user\";\nimport type { Ref } from \"vue\";\n\n/**\n * Facade over the account API, which is owned by the \"user\" panel plugin.\n *\n * The console implementation and other plugins keep importing these names from\n * `@/services/apis`; the real definitions are registered by the plugin as the\n * `user.api` service and resolved at call time, so unloading the plugin takes\n * the API with it. Without the plugin the panel runs unauthenticated and\n * nothing should be calling these — guard with `isUserPluginLoaded()` or with\n * `useAppStateStore().authEnabled`.\n *\n * Imports `@/plugin/context` rather than `@/plugin` on purpose: the barrel pulls\n * the whole card and route registry into the app entry graph.\n */\n\nexport interface ApiCall<P, T> {\n isLoading: Ref<boolean>;\n state: Ref<T | undefined>;\n isReady: Ref<boolean>;\n execute: (config?: P & Record<string, any>) => Promise<Ref<T | undefined>>;\n}\n\nexport interface SsoPublicConfig {\n enabled: boolean;\n onlyMode: boolean;\n autoRedirect: boolean;\n providerName: string;\n iconUrl: string;\n}\n\nexport interface UserPluginApi {\n loginUser: () => ApiCall<\n { data: { username: string; password: string; code?: string } } | undefined,\n string\n >;\n loginPageInfo: () => ApiCall<any, { loginInfo: string; isFirstStartup: boolean }>;\n logoutUser: () => ApiCall<any, any>;\n userInfoApi: () => ApiCall<any, LoginUserInfo>;\n userInfoApiAdvanced: () => ApiCall<\n { params: { uuid: string; advanced: boolean } },\n BaseUserInfo\n >;\n getUserInfo: () => ApiCall<\n { params: { userName: string; page: number; page_size: number; role: string } },\n { total: number; pageSize: number; page: number; maxPage: number; data: BaseUserInfo[] }\n >;\n deleteUser: () => ApiCall<{ data: string[] }, any>;\n addUser: () => ApiCall<\n { data: { username: string; password: string; permission: number } },\n { uuid: string }\n >;\n editUserInfo: () => ApiCall<{ data: { config: EditUserInfo; uuid: string } }, boolean>;\n updateUserInstance: () => ApiCall<\n { data: { config: { instances: UserInstance[] }; uuid: string } },\n boolean\n >;\n setUserApiKey: () => ApiCall<{ data: { enable: boolean } }, string>;\n updatePassword: () => ApiCall<{ data: { passWord: string } }, boolean>;\n bind2FA: () => ApiCall<any, string>;\n confirm2FA: () => ApiCall<{ data: { enable: boolean; TOTPCode: string } }, undefined>;\n queryUsername: () => ApiCall<\n { params: { username: string } },\n { uuid?: string; userName?: string }\n >;\n ssoConfig: () => ApiCall<any, SsoPublicConfig | null>;\n ssoBindLogin: () => ApiCall<\n { data: { username: string; password: string; code?: string } },\n string\n >;\n ssoBindCurrent: () => ApiCall<any, boolean>;\n ssoUnbind: () => ApiCall<{ data: { uuid: string } }, boolean>;\n}\n\nexport function isUserPluginLoaded(): boolean {\n return usePluginService(\"user\") != null;\n}\n\nfunction resolveUserApi(): UserPluginApi {\n const user = usePluginService<{ api: UserPluginApi }>(\"user\");\n if (!user) {\n throw new Error('Panel frontend plugin \"user\" is not loaded.');\n }\n return user.api;\n}\n\nexport const loginUser = () => resolveUserApi().loginUser();\nexport const loginPageInfo = () => resolveUserApi().loginPageInfo();\nexport const logoutUser = () => resolveUserApi().logoutUser();\nexport const userInfoApi = () => resolveUserApi().userInfoApi();\nexport const userInfoApiAdvanced = () => resolveUserApi().userInfoApiAdvanced();\nexport const getUserInfo = () => resolveUserApi().getUserInfo();\nexport const deleteUser = () => resolveUserApi().deleteUser();\nexport const addUser = () => resolveUserApi().addUser();\nexport const editUserInfo = () => resolveUserApi().editUserInfo();\nexport const updateUserInstance = () => resolveUserApi().updateUserInstance();\nexport const setUserApiKey = () => resolveUserApi().setUserApiKey();\nexport const updatePassword = () => resolveUserApi().updatePassword();\nexport const bind2FA = () => resolveUserApi().bind2FA();\nexport const confirm2FA = () => resolveUserApi().confirm2FA();\nexport const queryUsername = () => resolveUserApi().queryUsername();\nexport const ssoConfig = () => resolveUserApi().ssoConfig();\nexport const ssoBindLogin = () => resolveUserApi().ssoBindLogin();\nexport const ssoBindCurrent = () => resolveUserApi().ssoBindCurrent();\nexport const ssoUnbind = () => resolveUserApi().ssoUnbind();\n","import { useDefineApi } from \"@/stores/useDefineApi\";\nimport type { PanelStatus, Settings } from \"@/types\";\nexport { addNode, connectNode, deleteNode, editNode, remoteNodeList } from \"./node\";\nexport { remoteInstances } from \"./instance\";\n// Account APIs live in the \"user\" plugin; these are facades over its\n// `user.api` service so existing call sites keep working.\nexport {\n addUser,\n bind2FA,\n confirm2FA,\n deleteUser,\n editUserInfo,\n getUserInfo,\n isUserPluginLoaded,\n loginPageInfo,\n loginUser,\n logoutUser,\n queryUsername,\n setUserApiKey,\n ssoBindCurrent,\n ssoBindLogin,\n ssoConfig,\n ssoUnbind,\n updatePassword,\n updateUserInstance,\n userInfoApi,\n userInfoApiAdvanced,\n type SsoPublicConfig\n} from \"./user\";\n\nexport const panelStatus = useDefineApi<any, PanelStatus>({\n url: \"/api/auth/status\",\n method: \"GET\"\n});\n\nexport const settingInfo = useDefineApi<any, Settings>({\n url: \"/api/overview/setting\"\n});\n\nexport const setSettingInfo = useDefineApi<\n | {\n data: Partial<Settings>;\n }\n | undefined,\n string\n>({\n url: \"/api/overview/setting\",\n method: \"PUT\"\n});\n\nexport const overviewInfo = useDefineApi<any, IPanelOverviewResponse>({\n url: \"/api/overview\"\n});\n","import { LANGUAGE_KEY, toStandardLang } from \"@/lang/i18n\";\nimport { setAuthToken } from \"@/services/apiService\";\nimport { panelStatus } from \"@/services/apis\";\nimport { isUserPluginLoaded, userInfoApi } from \"@/services/apis/user\";\nimport type { PanelStatus } from \"@/types\";\nimport type { LoginUserInfo } from \"@/types/user\";\nimport { createGlobalState, useLocalStorage } from \"@vueuse/core\";\nimport _ from \"lodash\";\nimport { computed, reactive } from \"vue\";\n\ninterface AppStateInfo extends PanelStatus {\n userInfo: LoginUserInfo | null;\n}\n\n/**\n * Identity used when the \"user\" plugin is absent. Authentication then lives\n * nowhere, the backend treats every request as an administrator, and the\n * frontend has to agree so the router lets the user in without a login page.\n */\nconst ANONYMOUS_ADMIN = {\n uuid: \"\",\n userName: \"\",\n permission: 10,\n token: \"\",\n instances: []\n} as unknown as LoginUserInfo;\n\nexport const useAppStateStore = createGlobalState(() => {\n const language = useLocalStorage(LANGUAGE_KEY, toStandardLang(window.navigator.language));\n const state: AppStateInfo = reactive<AppStateInfo>({\n userInfo: null,\n versionChange: false,\n language: language.value,\n settings: {\n canFileManager: false,\n allowChangeCmd: false,\n allowJavaManager: true\n }\n });\n\n const cloneState = (): AppStateInfo => {\n const tmp = _.cloneDeep(state);\n return reactive(tmp);\n };\n\n /** False when the \"user\" plugin is not installed: the panel has no login. */\n const authEnabled = computed(() => isUserPluginLoaded());\n const isAdmin = computed(() => state.userInfo?.permission === 10);\n const isLogged = computed(() => Number(state.userInfo?.permission) > 0);\n const setStateUserInfo = (userInfo: LoginUserInfo | null) => {\n state.userInfo = userInfo;\n setAuthToken(userInfo?.token);\n };\n\n const updateUserInfo = async (userInfo?: LoginUserInfo) => {\n if (!authEnabled.value) {\n setStateUserInfo({ ...ANONYMOUS_ADMIN });\n return;\n }\n try {\n if (userInfo) {\n setStateUserInfo(userInfo);\n } else {\n const info = await userInfoApi().execute();\n if (info.value) {\n setStateUserInfo(info.value);\n } else {\n throw new Error(\"Failed to get user information from server!\");\n }\n }\n } catch (err: any) {\n console.error(err);\n throw new Error(err.message);\n }\n };\n\n const updatePanelStatus = async () => {\n const { state } = useAppStateStore();\n const panelStatusRes = await panelStatus().execute();\n state.versionChange = panelStatusRes.value?.versionChange ? true : false;\n if (panelStatusRes.value?.settings) {\n state.settings = panelStatusRes.value?.settings;\n }\n state.language = language.value = toStandardLang(panelStatusRes.value?.language);\n console.info(\"Window.navigator.language:\", window.navigator.language);\n console.info(\"Panel Language:\", state.language);\n };\n\n return {\n cloneState,\n updateUserInfo,\n updatePanelStatus,\n authEnabled,\n isAdmin,\n isLogged,\n state\n };\n});\n"],"names":["isUserPluginLoaded","usePluginService","resolveUserApi","user","loginUser","loginPageInfo","logoutUser","userInfoApi","userInfoApiAdvanced","getUserInfo","deleteUser","addUser","editUserInfo","updateUserInstance","setUserApiKey","updatePassword","bind2FA","confirm2FA","ssoConfig","ssoBindLogin","ssoBindCurrent","ssoUnbind","panelStatus","useDefineApi","overviewInfo","ANONYMOUS_ADMIN","useAppStateStore","createGlobalState","language","useLocalStorage","LANGUAGE_KEY","toStandardLang","state","reactive","cloneState","tmp","_","authEnabled","computed","isAdmin","_a","isLogged","setStateUserInfo","userInfo","setAuthToken","info","err","panelStatusRes","_b","_c","_d"],"mappings":"qPA4EO,SAASA,GAA8B,CACrC,OAAAC,EAAiB,MAAM,GAAK,IACrC,CAEA,SAASC,GAAgC,CACjC,MAAAC,EAAOF,EAAyC,MAAM,EAC5D,GAAI,CAACE,EACG,MAAA,IAAI,MAAM,6CAA6C,EAE/D,OAAOA,EAAK,GACd,CAEO,MAAMC,EAAY,IAAMF,EAAe,EAAE,UAAU,EAC7CG,EAAgB,IAAMH,EAAe,EAAE,cAAc,EACrDI,EAAa,IAAMJ,EAAe,EAAE,WAAW,EAC/CK,EAAc,IAAML,EAAe,EAAE,YAAY,EACjDM,EAAsB,IAAMN,EAAe,EAAE,oBAAoB,EACjEO,EAAc,IAAMP,EAAe,EAAE,YAAY,EACjDQ,EAAa,IAAMR,EAAe,EAAE,WAAW,EAC/CS,EAAU,IAAMT,EAAe,EAAE,QAAQ,EACzCU,EAAe,IAAMV,EAAe,EAAE,aAAa,EACnDW,EAAqB,IAAMX,EAAe,EAAE,mBAAmB,EAC/DY,EAAgB,IAAMZ,EAAe,EAAE,cAAc,EACrDa,EAAiB,IAAMb,EAAe,EAAE,eAAe,EACvDc,EAAU,IAAMd,EAAe,EAAE,QAAQ,EACzCe,EAAa,IAAMf,EAAe,EAAE,WAAW,EAE/CgB,EAAY,IAAMhB,EAAe,EAAE,UAAU,EAC7CiB,EAAe,IAAMjB,EAAe,EAAE,aAAa,EACnDkB,EAAiB,IAAMlB,EAAe,EAAE,eAAe,EACvDmB,EAAY,IAAMnB,EAAe,EAAE,UAAU,EC5E7CoB,EAAcC,EAA+B,CACxD,IAAK,mBACL,OAAQ,KACV,CAAC,EAiBYC,EAAeD,EAA0C,CACpE,IAAK,eACP,CAAC,ECjCKE,EAAkB,CACtB,KAAM,GACN,SAAU,GACV,WAAY,GACZ,MAAO,GACP,UAAW,CAAC,CACd,EAEaC,EAAmBC,EAAkB,IAAM,CACtD,MAAMC,EAAWC,EAAgBC,EAAcC,EAAe,OAAO,UAAU,QAAQ,CAAC,EAClFC,EAAsBC,EAAuB,CACjD,SAAU,KACV,cAAe,GACf,SAAUL,EAAS,MACnB,SAAU,CACR,eAAgB,GAChB,eAAgB,GAChB,iBAAkB,EACpB,CAAA,CACD,EAEKM,EAAa,IAAoB,CAC/B,MAAAC,EAAMC,EAAE,UAAUJ,CAAK,EAC7B,OAAOC,EAASE,CAAG,CAAA,EAIfE,EAAcC,EAAS,IAAMtC,EAAoB,CAAA,EACjDuC,EAAUD,EAAS,IAAM,OAAA,QAAAE,EAAAR,EAAM,WAAN,YAAAQ,EAAgB,cAAe,GAAE,EAC1DC,EAAWH,EAAS,WAAM,eAAOE,EAAAR,EAAM,WAAN,YAAAQ,EAAgB,UAAU,EAAI,EAAC,EAChEE,EAAoBC,GAAmC,CAC3DX,EAAM,SAAWW,EACjBC,EAAaD,GAAA,YAAAA,EAAU,KAAK,CAAA,EAqCvB,MAAA,CACL,WAAAT,EACA,eApCqB,MAAOS,GAA6B,CACrD,GAAA,CAACN,EAAY,MAAO,CACLK,EAAA,CAAE,GAAGjB,CAAA,CAAiB,EACvC,MACF,CACI,GAAA,CACF,GAAIkB,EACFD,EAAiBC,CAAQ,MACpB,CACL,MAAME,EAAO,MAAMtC,EAAY,EAAE,QAAQ,EACzC,GAAIsC,EAAK,MACPH,EAAiBG,EAAK,KAAK,MAErB,OAAA,IAAI,MAAM,6CAA6C,CAEjE,QACOC,EAAU,CACjB,cAAQ,MAAMA,CAAG,EACX,IAAI,MAAMA,EAAI,OAAO,CAC7B,CAAA,EAkBA,kBAfwB,SAAY,aACpC,KAAM,CAAE,MAAAd,CAAM,EAAIN,EAAiB,EAC7BqB,EAAiB,MAAMzB,EAAY,EAAE,QAAQ,EACnDU,EAAM,cAAgB,IAAAQ,EAAAO,EAAe,QAAf,MAAAP,EAAsB,gBACxCQ,EAAAD,EAAe,QAAf,MAAAC,EAAsB,WACxBhB,EAAM,UAAWiB,EAAAF,EAAe,QAAf,YAAAE,EAAsB,UAEzCjB,EAAM,SAAWJ,EAAS,MAAQG,GAAemB,EAAAH,EAAe,QAAf,YAAAG,EAAsB,QAAQ,EAC/E,QAAQ,KAAK,6BAA8B,OAAO,UAAU,QAAQ,EAC5D,QAAA,KAAK,kBAAmBlB,EAAM,QAAQ,CAAA,EAO9C,YAAAK,EACA,QAAAE,EACA,SAAAE,EACA,MAAAT,CAAA,CAEJ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAppToolsStore-3a911226.js","sources":["../../../panel/plugins/console/src/stores/useAppToolsStore.ts"],"sourcesContent":["/* eslint-disable no-unused-vars */\nimport { createGlobalState } from \"@vueuse/core\";\nimport { reactive } from \"vue\";\n\nexport const useAppToolsStore = createGlobalState(() => {\n const state = reactive({\n inputDialog: {\n title: \"\",\n show: false,\n resolve: (value: any) => {},\n reject: (value: any) => {}\n },\n showUserInfoDialog: false\n });\n\n const openInputDialog = (title: string) => {\n state.inputDialog.title = title;\n state.inputDialog.show = true;\n return new Promise<any>((resolve, reject) => {\n state.inputDialog.resolve = resolve;\n state.inputDialog.reject = reject;\n });\n };\n\n return {\n state,\n openInputDialog\n };\n});\n"],"names":["useAppToolsStore","createGlobalState","state","reactive","value","title","resolve","reject"],"mappings":"+CAIa,MAAAA,EAAmBC,EAAkB,IAAM,CACtD,MAAMC,EAAQC,EAAS,CACrB,YAAa,CACX,MAAO,GACP,KAAM,GACN,QAAUC,GAAe,CAAC,EAC1B,OAASA,GAAe,CAAC,CAC3B,EACA,mBAAoB,EAAA,CACrB,EAWM,MAAA,CACL,MAAAF,EACA,gBAXuBG,IACvBH,EAAM,YAAY,MAAQG,EAC1BH,EAAM,YAAY,KAAO,GAClB,IAAI,QAAa,CAACI,EAASC,IAAW,CAC3CL,EAAM,YAAY,QAAUI,EAC5BJ,EAAM,YAAY,OAASK,CAAA,CAC5B,EAKD,CAEJ,CAAC"}