@elementspanel/panel 1.0.0 → 1.0.2

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 (130) hide show
  1. package/app.js +3995 -197
  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-1da88aed.js +2 -0
  38. package/public/assets/index-1da88aed.js.map +1 -0
  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 +49 -13
  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/index-76b0df52.js +0 -2
  107. package/public/assets/index-76b0df52.js.map +0 -1
  108. package/public/assets/instance-26cca4c8.js.map +0 -1
  109. package/public/assets/nodes-402cdcbd.js.map +0 -1
  110. package/public/assets/randId-ed0b95b7.js +0 -2
  111. package/public/assets/randId-ed0b95b7.js.map +0 -1
  112. package/public/assets/router-0f7d4714.js.map +0 -1
  113. package/public/assets/sdk-01dda668.js.map +0 -1
  114. package/public/assets/shared-f2e37690.js.map +0 -1
  115. package/public/assets/useAppConfigStore-289073ec.js.map +0 -1
  116. package/public/assets/useAppRouters-5f58db32.js +0 -2
  117. package/public/assets/useAppRouters-5f58db32.js.map +0 -1
  118. package/public/assets/useAppStateStore-a644582a.js.map +0 -1
  119. package/public/assets/useAppToolsStore-3a911226.js.map +0 -1
  120. package/public/assets/useDefineApi-ead2616e.js.map +0 -1
  121. package/public/assets/useInstanceActionAvailability-dec16c10.js.map +0 -1
  122. package/public/assets/useKeyboardEvents-dba9d5ca.js.map +0 -1
  123. package/public/assets/useMountComponent-dd1fcfea.js.map +0 -1
  124. package/public/assets/useOverviewChart-119bda3b.js.map +0 -1
  125. package/public/assets/useOverviewInfo-a149d634.js.map +0 -1
  126. package/public/assets/usePolling-f2f09d27.js.map +0 -1
  127. package/public/assets/useScreen-e3715e1f.js.map +0 -1
  128. package/public/assets/useSocketIo-bc0a62c2.js.map +0 -1
  129. package/public/assets/useThemeSwitch-6ff90248.js.map +0 -1
  130. 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("@")) {
@@ -70,18 +80,37 @@ function resolveNpmPlugins(packageRoot, side, options = {}) {
70
80
  const project = projectFile ? readOptional(projectFile) : null;
71
81
  const selectedSide = side || host.elementspanel?.side;
72
82
 
73
- // Project mappings are read first so the host's built-in plugins win an id
74
- // collision: a market package must not shadow a plugin that ships with the runtime.
83
+ // Keep the host's package identity, while allowing npm install in the project
84
+ // to select another version of that same package (even with nested installs).
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)
102
+ configured.set(id, {
103
+ name,
104
+ source: dependenciesOf(project)[name] === undefined ? "bundled" : "project",
105
+ automatic: true
106
+ });
107
+ }
78
108
 
79
109
  const hostDependencies = dependenciesOf(host);
80
110
  const projectDependencies = dependenciesOf(project);
81
111
  const roots = [packageRoot];
82
112
  const parentRoot = projectRoot(packageRoot);
83
113
  if (path.resolve(parentRoot) !== path.resolve(packageRoot)) roots.push(parentRoot);
84
- const requireAt = (root) => createRequire(path.join(root, "package.json"));
85
114
  const folders = new Set();
86
115
  const records = [];
87
116
 
@@ -99,9 +128,9 @@ function resolveNpmPlugins(packageRoot, side, options = {}) {
99
128
 
100
129
  let manifestPath;
101
130
  let failure;
102
- for (const root of roots) {
131
+ for (const root of mapping.source === "project" ? [...roots].reverse() : roots) {
103
132
  try {
104
- manifestPath = requireAt(root).resolve(`${name}/package.json`);
133
+ manifestPath = packageManifest(root, name);
105
134
  break;
106
135
  } catch (error) {
107
136
  failure = error;
@@ -142,16 +171,23 @@ function resolveNpmPlugins(packageRoot, side, options = {}) {
142
171
  if (skipInvalid) continue;
143
172
  throw new Error(`Npm plugin entry escapes its package: ${name}.`);
144
173
  }
145
- let manifest;
174
+ let entries;
146
175
  try {
147
- manifest = readJson(path.join(directory, "plugin.json"));
176
+ entries = readJson(path.join(directory, "plugin.json"));
148
177
  } catch (error) {
149
178
  if (skipInvalid) continue;
150
179
  throw error;
151
180
  }
152
- if (manifest.id !== id || manifest.version !== metadata.version) {
181
+ if (
182
+ metadata.elementspanel?.id !== id ||
183
+ typeof metadata.version !== "string" ||
184
+ !metadata.version.trim() ||
185
+ !entries ||
186
+ typeof entries !== "object" ||
187
+ Array.isArray(entries)
188
+ ) {
153
189
  if (skipInvalid) continue;
154
- throw new Error(`Npm plugin identity or version does not match its manifest: ${name}.`);
190
+ throw new Error(`Invalid npm plugin identity or version in package.json: ${name}.`);
155
191
  }
156
192
  if (folders.has(definition.folder)) {
157
193
  if (skipInvalid) continue;
@@ -163,7 +199,7 @@ function resolveNpmPlugins(packageRoot, side, options = {}) {
163
199
  name,
164
200
  version: metadata.version,
165
201
  source: mapping.source,
166
- defaultEnabled: mapping.source !== "project",
202
+ defaultEnabled: mapping.automatic === true || mapping.source !== "project",
167
203
  packageRoot: pluginRoot,
168
204
  directory,
169
205
  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,2 +0,0 @@
1
- import{c as d}from"./context-b16af9cc.js";import{_ as B}from"./preload-helper-a4192956.js";import{c as M,v as U,r as J}from"./plugin_contract-691cd37a.js";import{bA as b}from"./vue-2433bd89.js";import"./_elements-sdk_cordis-e3bebc89.js";import"./_elements-sdk_cosmokit-e4842f5c.js";import"./htmlparser2-bcb8f9db.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))a(i);new MutationObserver(i=>{for(const n of i)if(n.type==="childList")for(const o of n.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&a(o)}).observe(document,{childList:!0,subtree:!0});function r(i){const n={};return i.integrity&&(n.integrity=i.integrity),i.referrerPolicy&&(n.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?n.credentials="include":i.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function a(i){if(i.ep)return;i.ep=!0;const n=r(i);fetch(i.href,n)}})();function G(e){const t=new Set,r=[],a=new WeakSet,i=new WeakSet,n=o=>{if(i.has(o))return;i.add(o);const c=o.reset;o.reset=function(){return this.disposables=this.disposables.map(l=>{if(a.has(l))return l;const m=(...s)=>{let f;try{f=l(...s)}catch(p){throw r.push(p),p}if(f&&typeof f.then=="function"){const p=Promise.resolve(f).catch(w=>{r.push(w)}).finally(()=>t.delete(p));t.add(p)}return f};for(const s of Object.getOwnPropertySymbols(l))Object.defineProperty(m,s,Object.getOwnPropertyDescriptor(l,s));return a.add(m),m}),c.call(this)}};return e.on("internal/runtime",n),e.on("internal/fork",n),async()=>{do await e.events.flush(),await Promise.all([...t]);while(t.size);if(r.length){const o=r.splice(0);throw new Error(`Plugin cleanup failed: ${o.map(String).join("; ")}`)}}}const N={runtime:"startup",i18n:"i18n",console:"console"},y=new Set(Object.keys(N)),P=M(),_=G(d),u=b([]),g=new Map;function D(e,t){return(Number(e.metadata.priority)||0)-(Number(t.metadata.priority)||0)||e.metadata.id.localeCompare(t.metadata.id)}function H(e){return Array.isArray(e.inject)?[...new Set(e.inject)]:e.inject?Object.entries(e.inject).filter(([,t])=>t==null?void 0:t.required).map(([t])=>t):[]}function V(e){if(!e||e.error||e.runtime.error)return"failed";switch(e.status){case 0:return"pending";case 1:return"loading";case 2:return"active";case 3:case 4:return"failed";default:return"pending"}}function W(e){e.missingServices=e.requiredServices.filter(t=>!d.get(t)),e.state=e.restartRequired||e.reloadRequired?"restart-required":e.error?"failed":V(e.fork)}function Q(e){var r,a;const t=e.error||((r=e.fork)==null?void 0:r.error)||((a=e.fork)==null?void 0:a.runtime.error);if(t!=null)return t instanceof Error?t:new Error(String(t))}function h(){for(const e of u)W(e)}d.on("internal/status",e=>{u.find(r=>r.fork===e)&&h()});function T(e){const t=typeof e.id=="string"?e.id.trim():"";return t?{...e,id:t}:null}function K(e,t){for(const r of[e,e==null?void 0:e.default])if(!(typeof r!="object"||r===null)&&typeof r.apply=="function")return r;d.logger("plugin").warn(`Panel frontend plugin "${t}" must export an apply() function.`)}async function X(e){const t=[];try{await Promise.all((e.styles||[]).map(r=>new Promise((a,i)=>{const n=document.createElement("link");n.rel="stylesheet",n.href=r,n.dataset.panelPlugin=e.metadata.id,n.addEventListener("load",()=>a(),{once:!0}),n.addEventListener("error",()=>i(new Error(`Failed to load panel plugin stylesheet: ${r}`)),{once:!0}),document.head.appendChild(n),t.push(n)})))}catch(r){throw t.forEach(a=>a.remove()),r}return()=>t.forEach(r=>r.remove())}function Y(e){document.querySelectorAll(`style[data-panel-plugin=${JSON.stringify(e.metadata.id)}]`).forEach(t=>t.remove());for(const t of e.styles||[]){const r=new URL(t,document.baseURI).href;document.querySelectorAll("link[rel='stylesheet']").forEach(a=>{try{new URL(a.href,document.baseURI).href===r&&a.remove()}catch{}})}}async function Z(){const e=new URL("plugins/manifest.json",document.baseURI),t=await fetch(e.href,{cache:"no-store"});if(!t.ok){if(t.status===404)return[];throw new Error(`Failed to load panel plugin manifest: HTTP ${t.status}`)}const r=await t.json(),a=Array.isArray(r)?r:r==null?void 0:r.data;if(!Array.isArray(a))throw new Error("Invalid panel plugin manifest.");const i=o=>new URL(o,e).href,n=[];for(const o of a){if(!o||typeof o!="object"||Array.isArray(o))continue;const c=T(o.metadata||o),l=typeof o.entry=="string"?o.entry:"";if(!c||c.enabled===!1||!l)continue;const m=i(l);n.push({metadata:c,directory:typeof o.directory=="string"?o.directory:c.id,assetDirectory:typeof o.assetDirectory=="string"?o.assetDirectory:c.id,entry:m,revision:typeof o.revision=="string"?o.revision:String(c.version||""),styles:Array.isArray(o.styles)?o.styles.filter(s=>typeof s=="string").map(i):[],load:async s=>{const f=new URL(m);return s&&f.searchParams.set("panel_plugin_reload",s),B(()=>import(f.href),[],import.meta.url)}})}return n}async function O(){const e=await Z(),t=new Map;for(const r of e){const a=T(r.metadata);!a||a.enabled===!1||t.has(a.id)||t.set(a.id,{...r,metadata:a})}return[...t.values()].sort(D)}function C(e){return J(e,{id:t=>t.metadata.id,dependencies:t=>t.metadata.frontendInject,compare:D})}function ee(e){const t=[];for(const r of C(e).ordered){try{U(r.metadata.elements)}catch{continue}if(r.metadata.restartRequired||!r.entry)continue;const a=document.createElement("link");a.rel="modulepreload",a.href=r.entry,a.crossOrigin="anonymous",document.head.appendChild(a),t.push(a);for(const i of r.styles||[]){const n=document.createElement("link");n.rel="preload",n.setAttribute("as","style"),n.href=i,document.head.appendChild(n),t.push(n)}}return()=>t.forEach(r=>r.remove())}async function F(e,t){let r;try{if(U(e.metadata.elements),e.metadata.restartRequired)throw new Error("The plugin backend requires a restart before this version can load.");const[a,i]=await Promise.allSettled([X(e),Promise.resolve().then(()=>e.load(t))]);if(a.status==="rejected")throw a.reason;if(r=a.value,i.status==="rejected")throw i.reason;const n=K(i.value,e.metadata.id);if(!n)throw new Error(`Panel frontend plugin has no apply() export: ${e.metadata.id}`);return{module:n,removeStyles:r}}catch(a){return r==null||r(),{error:a instanceof Error?a:new Error(String(a))}}}function x(e,t){const r=u.find(i=>i.metadata.id===e.metadata.id);if(r)return r.error=t,r.state="failed",h(),r;const a=b({source:e,metadata:e.metadata,directory:e.directory,revision:e.revision,state:"failed",requiredServices:[],missingServices:[],error:t});return u.push(a),h(),a}async function E(e,t,r,a){var c,l,m;const i=u.find(s=>s.metadata.id===e.metadata.id);if(i)return i;const n=(e.metadata.frontendInject||[]).filter(s=>{var f;return((f=u.find(p=>p.metadata.id===s))==null?void 0:f.state)!=="active"});if(n.length)return a&&"module"in a&&((c=a.removeStyles)==null||c.call(a)),x(e,new Error(`Frontend plugin dependencies are not active: ${n.join(", ")}`));const o=b({source:e,metadata:e.metadata,directory:e.directory,revision:e.revision,state:"loading",requiredServices:[],missingServices:[]});u.push(o),h();try{const s=a??await F(e,t);if("error"in s)throw s.error;o.removeStyles=s.removeStyles;const{module:f}=s;o.requiredServices=H(f);{let p,w;if(o.fork=d.plugin({...f,name:e.metadata.id,apply:(...z)=>{try{return p=f.apply(...z)}catch(j){throw w=j,j}}},r===void 0?e.metadata.config:r),w)throw w;await p,d.logger("plugin").info(`Panel frontend plugin loaded: ${e.metadata.id}`)}}catch(s){o.error=s instanceof Error?s:new Error(String(s)),(l=o.fork)==null||l.dispose(),o.fork=void 0,(m=o.removeStyles)==null||m.call(o),d.logger("plugin").error(`Panel frontend plugin failed to load: ${e.metadata.id}`,s)}return h(),o}function te(e){const t=d.get("vue"),r=d.get("routes");return!t||!r?!1:t.router.currentRoute.value.matched.some(a=>r.ownerOf(a.path)===e.metadata.id)}async function v(e){var i,n;if(y.has(e))throw new Error(`The essential frontend plugin "${e}" cannot be unloaded.`);const t=u.find(o=>o.metadata.id===e);if(!t)return!1;t.state="unloading",h();const r=d.get("vue");r&&te(t)&&await r.router.replace("/404"),(i=t.fork)==null||i.dispose();try{await _()}catch(o){throw t.error=o instanceof Error?o:new Error(String(o)),o}(n=t.removeStyles)==null||n.call(t),Y(t.source);const a=u.indexOf(t);return a>=0&&u.splice(a,1),h(),d.logger("plugin").info(`Panel frontend plugin unloaded: ${e}`),!0}async function re(e){let t=g.get(e);if(t||(await $(),t=g.get(e)),!t)throw new Error(`Panel frontend plugin not found: ${e}`);return E(t)}async function ne(e){if(y.has(e))throw new Error(`The essential frontend plugin "${e}" cannot be reloaded.`);await v(e);{const r=await O();g.clear(),r.forEach(a=>g.set(a.metadata.id,a))}const t=g.get(e);if(!t)throw new Error(`Panel frontend plugin not found: ${e}`);return E(t,t.revision||String(t.metadata.version||"reload"))}async function $(e){e??(e=await O());const t=new Map(e.map(n=>[n.metadata.id,n]));g.clear(),t.forEach((n,o)=>g.set(o,n));for(const n of[...u].reverse())y.has(n.metadata.id)||t.has(n.metadata.id)||await v(n.metadata.id);const r=C(e);for(const[n,o]of r.issues){const c=t.get(n);if(!c)continue;u.find(m=>m.metadata.id===n)&&!y.has(n)&&await v(n),x(c,new Error(o.message))}const a=[];for(const n of r.ordered){const o=u.find(l=>l.metadata.id===n.metadata.id);o&&(o.restartRequired=!!n.metadata.restartRequired);const c=o&&(n.revision!==o.source.revision||JSON.stringify(n.metadata)!==JSON.stringify(o.metadata)||!!n.metadata.restartRequired!=!!o.source.metadata.restartRequired);if(o&&(c||n.metadata.restartRequired)){if(y.has(n.metadata.id)||n.metadata.restartRequired){o.restartRequired=!!n.metadata.restartRequired,o.reloadRequired=!!(c&&y.has(n.metadata.id));continue}await v(n.metadata.id)}u.some(l=>l.metadata.id===n.metadata.id)||a.push(n)}const i=await Promise.all(a.map(n=>F(n)));for(const[n,o]of a.entries())await E(o,void 0,void 0,i[n]);return await _(),h(),e.map(n=>n.metadata)}async function ae(){const e=await O();g.clear(),e.forEach(r=>g.set(r.metadata.id,r));const t=ee(e);try{for(const r of y){const a=g.get(r);if(!a)throw new Error(`Panel frontend foundation plugin not found: ${r}`);const i=await E(a);if(i.error)throw i.error;if(!i.fork||!d.get(N[r]))throw new Error(`Panel frontend foundation plugin failed to initialize: ${r}`)}await $(e),window.dispatchEvent(new CustomEvent("elementspanel:plugins-changed"))}finally{t()}}function k(){return u}function q(){return u.map(e=>{const t=Q(e);return{id:e.metadata.id,state:e.state,required:!!e.metadata.frontendRequired,revision:e.revision,requiredServices:[...e.requiredServices],missingServices:[...e.missingServices],...t?{error:t.message}:{}}})}function S(){h();const e=q().filter(t=>t.required&&t.state!=="active");if(e.length)throw new Error(`Required frontend plugins are not active: ${e.map(t=>`${t.id} (${t.state}${t.error?`: ${t.error}`:""})`).join(", ")}`)}const A=e=>P(()=>v(e)),I=e=>P(()=>re(e)),L=e=>P(()=>ne(e)),R=()=>P(async()=>{const e=await $();return window.dispatchEvent(new CustomEvent("elementspanel:plugins-changed")),e});function oe(){if(typeof EventSource>"u")return()=>{};const e=new EventSource(new URL("plugins/events",document.baseURI).href);let t="",r=!1,a;const i=()=>{r||R().catch(n=>{d.logger("plugin").error("Failed to synchronize plugins",n),a=setTimeout(i,2e3)})};return e.onmessage=n=>{let o;try{o=JSON.parse(n.data).revision}catch{return}typeof o!="string"||o===t||r||(t=o,a&&clearTimeout(a),i())},()=>{r=!0,a&&clearTimeout(a),e.close()}}async function ie(){d.provide("plugins",void 0,!0),d.set("plugins",{get loaded(){return k()},get diagnostics(){return q()},load:I,unload:A,reload:L,refresh:R,audit:S}),await ae(),S(),window.ElementsPanelPlugins={load:I,unload:A,reload:L,refresh:R,loaded:k,diagnostics:q,audit:S},await d.parallel("plugins/loaded"),await d.start(),d.effect(oe)}ie().catch(async e=>{var r;console.error("Plugin startup failed:",e);const t=d.get("startup");if(t)t.showError(e);else{const a=window;(r=a.setAppLoadingError)==null||r.call(a,e instanceof Error?e.message:String(e))}await d.stop()});
2
- //# sourceMappingURL=index-76b0df52.js.map
@@ -1 +0,0 @@
1
- {"version":3,"mappings":"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","names":["trackPluginDisposal","ctx","pending","failures","tracked","scopes","observe","scope","reset","dispose","wrapper","args","result","error","task","key","errors","FOUNDATION_SERVICES","ESSENTIAL_PLUGIN_IDS","change","createPluginQueue","settle","plugins","shallowReactive","sources","compareSources","a","b","requiredServices","module","value","name","scopeState","refreshPluginState","plugin","pluginError","_a","_b","notifyPluginDiagnostics","candidate","normalizeMetadata","id","toModule","loadStyles","source","links","href","resolve","reject","link","removePluginStyles","style","normalizedHref","fetchProductionSources","manifestUrl","response","body","manifest","toUrl","item","metadata","entry","entryUrl","cacheKey","url","__vitePreload","discoverSources","discovered","unique","resolveSourceGraph","resolvePluginDependencyOrder","preloadPluginAssets","validatePluginCompatibility","preparePlugin","removeStyles","styles","recordGraphFailure","existing","install","configOverride","prepared","unavailableDependencies","resources","applied","thrown","_c","isCurrentRoute","vue","routes","record","unloadPluginInternal","index","loadPluginInternal","refreshPluginsInternal","reloadPluginInternal","next","graph","issue","current","changed","bootstrapPanelFrontendPlugins","removePreloads","getLoadedPlugins","getPluginDiagnostics","auditFrontendPlugins","unloadPlugin","loadPlugin","reloadPlugin","refreshPlugins","watchPluginChanges","events","revision","stopped","retry","synchronize","event","setupPanelFrontendPlugins","startup","host"],"sources":["../../../common/src/plugin_lifecycle.ts","../../src/plugin/loader.ts","../../src/plugin/install.ts","../../src/main.ts"],"sourcesContent":["/** Cordis 3 starts async disposers without awaiting them. Track them per host. */\nexport function trackPluginDisposal(ctx: any) {\n const pending = new Set<Promise<unknown>>();\n const failures: unknown[] = [];\n const tracked = new WeakSet<Function>();\n const scopes = new WeakSet<object>();\n const observe = (scope: any) => {\n if (scopes.has(scope)) return;\n scopes.add(scope);\n const reset = scope.reset;\n scope.reset = function () {\n this.disposables = this.disposables.map((dispose: Function) => {\n if (tracked.has(dispose)) return dispose;\n const wrapper = (...args: unknown[]) => {\n let result: unknown;\n try {\n result = dispose(...args);\n } catch (error) {\n failures.push(error);\n throw error;\n }\n if (result && typeof (result as Promise<unknown>).then === \"function\") {\n const task = Promise.resolve(result)\n .catch((error) => {\n failures.push(error);\n })\n .finally(() => pending.delete(task));\n pending.add(task);\n }\n return result;\n };\n // Cordis marks persistent disposers with a symbol; preserve its semantics.\n for (const key of Object.getOwnPropertySymbols(dispose))\n Object.defineProperty(wrapper, key, Object.getOwnPropertyDescriptor(dispose, key)!);\n tracked.add(wrapper);\n return wrapper;\n });\n return reset.call(this);\n };\n };\n ctx.on(\"internal/runtime\", observe);\n ctx.on(\"internal/fork\", observe);\n return async () => {\n do {\n await ctx.events.flush();\n await Promise.all([...pending]);\n } while (pending.size);\n if (failures.length) {\n const errors = failures.splice(0);\n throw new Error(`Plugin cleanup failed: ${errors.map(String).join(\"; \")}`);\n }\n };\n}\n","import {\n createPluginQueue,\n resolvePluginDependencyOrder,\n type PluginState,\n validatePluginCompatibility\n} from \"../../../common/src/plugin_contract\";\nimport { trackPluginDisposal } from \"../../../common/src/plugin_lifecycle\";\nimport { shallowReactive } from \"vue\";\nimport type { EffectScope, ForkScope } from \"cordis\";\nimport {\n ctx,\n type PanelFrontendPluginContext,\n type PanelFrontendPluginDiagnostic\n} from \"./context\";\nimport { panelPluginModules } from \"virtual:panel-plugins\";\n\nconst FOUNDATION_SERVICES: Record<string, string> = {\n runtime: \"startup\",\n i18n: \"i18n\",\n console: \"console\"\n};\nconst ESSENTIAL_PLUGIN_IDS = new Set(Object.keys(FOUNDATION_SERVICES));\nconst change = createPluginQueue();\nconst settle = trackPluginDisposal(ctx);\n\n/**\n * Fetches plugin code and hands it to cordis.\n *\n * Discovery is unchanged: in development the Vite plugin supplies a virtual\n * module of static imports; in production the browser fetches\n * `plugins/manifest.json` and imports each entry by URL. What that feeds is now\n * `ctx.plugin()`, and unloading is `fork.dispose()` — every route, card, menu,\n * action and translation the plugin registered is an effect of its scope.\n */\n\nexport interface PanelFrontendPluginMetadata {\n id: string;\n version?: string;\n description?: string;\n enabled?: boolean;\n priority?: number;\n frontend?: string;\n ui?: string;\n frontendInject?: string[];\n frontendImmediate?: boolean;\n frontendRequired?: boolean;\n config?: unknown;\n restartRequired?: boolean;\n [key: string]: unknown;\n}\n\n/** A frontend plugin module, as its entry exports it. */\nexport interface PanelFrontendPluginModule {\n inject?: string[] | Record<string, { required: boolean }>;\n apply(ctx: PanelFrontendPluginContext, config?: unknown): void | Promise<void>;\n}\n\ninterface PluginSource {\n metadata: PanelFrontendPluginMetadata;\n directory: string;\n assetDirectory: string;\n entry?: string;\n revision?: string;\n styles?: string[];\n load: (cacheKey?: string) => Promise<Record<string, unknown>>;\n}\n\ntype PreparedPlugin =\n | { module: PanelFrontendPluginModule; removeStyles?: () => void }\n | { error: Error };\n\nexport interface LoadedPanelFrontendPlugin {\n metadata: PanelFrontendPluginMetadata;\n directory: string;\n state: PluginState;\n requiredServices: readonly string[];\n missingServices: readonly string[];\n revision?: string;\n fork?: ForkScope;\n error?: Error;\n restartRequired?: boolean;\n reloadRequired?: boolean;\n}\n\ninterface InternalPlugin extends LoadedPanelFrontendPlugin {\n source: PluginSource;\n /** Only the stylesheet links, which are not cordis effects. */\n removeStyles?: () => void;\n}\n\nconst plugins = shallowReactive<InternalPlugin[]>([]);\nconst sources = new Map<string, PluginSource>();\n\nfunction compareSources(a: PluginSource, b: PluginSource) {\n return (\n (Number(a.metadata.priority) || 0) - (Number(b.metadata.priority) || 0) ||\n a.metadata.id.localeCompare(b.metadata.id)\n );\n}\n\nfunction requiredServices(module: PanelFrontendPluginModule) {\n if (Array.isArray(module.inject)) return [...new Set(module.inject)];\n if (!module.inject) return [];\n return Object.entries(module.inject)\n .filter(([, value]) => value?.required)\n .map(([name]) => name);\n}\n\nfunction scopeState(scope?: ForkScope): PluginState {\n if (!scope) return \"failed\";\n if (scope.error || scope.runtime.error) return \"failed\";\n switch (scope.status) {\n case 0: // ScopeStatus.PENDING\n return \"pending\";\n case 1: // ScopeStatus.LOADING\n return \"loading\";\n case 2: // ScopeStatus.ACTIVE\n return \"active\";\n case 3: // ScopeStatus.FAILED\n case 4: // ScopeStatus.DISPOSED\n return \"failed\";\n default:\n return \"pending\";\n }\n}\n\nfunction refreshPluginState(plugin: InternalPlugin) {\n plugin.missingServices = plugin.requiredServices.filter((name) => !ctx.get(name as never));\n plugin.state =\n plugin.restartRequired || plugin.reloadRequired\n ? \"restart-required\"\n : plugin.error\n ? \"failed\"\n : scopeState(plugin.fork);\n}\n\nfunction pluginError(plugin: InternalPlugin): Error | undefined {\n const error = plugin.error || plugin.fork?.error || plugin.fork?.runtime.error;\n if (error === undefined || error === null) return undefined;\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction notifyPluginDiagnostics() {\n for (const plugin of plugins) refreshPluginState(plugin);\n}\n\nctx.on(\"internal/status\", (scope: EffectScope) => {\n const plugin = plugins.find((candidate) => candidate.fork === scope);\n if (plugin) notifyPluginDiagnostics();\n});\n\nfunction normalizeMetadata(value: Record<string, unknown>): PanelFrontendPluginMetadata | null {\n const id = typeof value.id === \"string\" ? value.id.trim() : \"\";\n if (!id) return null;\n return { ...value, id } as PanelFrontendPluginMetadata;\n}\n\n/**\n * The plugin object a module exports, whether as named exports or as `default`.\n *\n * Only an object counts: every function has `Function.prototype.apply`, so a\n * module whose default export is a function would otherwise be mistaken for a\n * plugin and then called with the context as `this`.\n */\nfunction toModule(value: any, id: string): PanelFrontendPluginModule | undefined {\n for (const candidate of [value, value?.default]) {\n if (typeof candidate !== \"object\" || candidate === null) continue;\n if (typeof candidate.apply === \"function\") return candidate;\n }\n ctx.logger(\"plugin\").warn(`Panel frontend plugin \"${id}\" must export an apply() function.`);\n return undefined;\n}\n\nasync function loadStyles(source: PluginSource) {\n const links: HTMLLinkElement[] = [];\n try {\n await Promise.all(\n (source.styles || []).map(\n (href) =>\n new Promise<void>((resolve, reject) => {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = href;\n link.dataset.panelPlugin = source.metadata.id;\n link.addEventListener(\"load\", () => resolve(), { once: true });\n link.addEventListener(\n \"error\",\n () => reject(new Error(`Failed to load panel plugin stylesheet: ${href}`)),\n { once: true }\n );\n document.head.appendChild(link);\n links.push(link);\n })\n )\n );\n } catch (error) {\n links.forEach((link) => link.remove());\n throw error;\n }\n return () => links.forEach((link) => link.remove());\n}\n\n/**\n * Removes stylesheets the plugin injected itself, which the core cannot track:\n * `<style>` elements it tagged, and any `<link>` matching one of its hrefs.\n */\nfunction removePluginStyles(source: PluginSource) {\n document\n .querySelectorAll<HTMLStyleElement>(\n `style[data-panel-plugin=${JSON.stringify(source.metadata.id)}]`\n )\n .forEach((style) => style.remove());\n for (const href of source.styles || []) {\n const normalizedHref = new URL(href, document.baseURI).href;\n document.querySelectorAll<HTMLLinkElement>(\"link[rel='stylesheet']\").forEach((link) => {\n try {\n if (new URL(link.href, document.baseURI).href === normalizedHref) link.remove();\n } catch {\n // Ignore malformed third-party stylesheet URLs.\n }\n });\n }\n}\n\nasync function fetchProductionSources(): Promise<PluginSource[]> {\n const manifestUrl = new URL(\"plugins/manifest.json\", document.baseURI);\n const response = await fetch(manifestUrl.href, { cache: \"no-store\" });\n if (!response.ok) {\n if (response.status === 404) return [];\n throw new Error(`Failed to load panel plugin manifest: HTTP ${response.status}`);\n }\n const body = await response.json();\n // Older panel builds may still pass the manifest through the standard API\n // envelope. Accept both the raw array and `{ data: [...] }` forms.\n const manifest = Array.isArray(body) ? body : body?.data;\n if (!Array.isArray(manifest)) throw new Error(\"Invalid panel plugin manifest.\");\n\n const toUrl = (value: string) => new URL(value, manifestUrl).href;\n const result: PluginSource[] = [];\n for (const item of manifest) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const metadata = normalizeMetadata((item as any).metadata || item);\n const entry = typeof (item as any).entry === \"string\" ? (item as any).entry : \"\";\n if (!metadata || metadata.enabled === false || !entry) continue;\n const entryUrl = toUrl(entry);\n result.push({\n metadata,\n directory:\n typeof (item as any).directory === \"string\" ? (item as any).directory : metadata.id,\n assetDirectory:\n typeof (item as any).assetDirectory === \"string\"\n ? (item as any).assetDirectory\n : metadata.id,\n entry: entryUrl,\n revision: typeof item.revision === \"string\" ? item.revision : String(metadata.version || \"\"),\n styles: Array.isArray((item as any).styles)\n ? (item as any).styles\n .filter((style: unknown): style is string => typeof style === \"string\")\n .map(toUrl)\n : [],\n load: async (cacheKey) => {\n const url = new URL(entryUrl);\n if (cacheKey) url.searchParams.set(\"panel_plugin_reload\", cacheKey);\n return import(/* @vite-ignore */ url.href) as Promise<Record<string, unknown>>;\n }\n });\n }\n return result;\n}\n\nasync function discoverSources() {\n const discovered = import.meta.env.DEV\n ? (panelPluginModules as PluginSource[])\n : await fetchProductionSources();\n const unique = new Map<string, PluginSource>();\n for (const source of discovered) {\n const metadata = normalizeMetadata(source.metadata);\n if (!metadata || metadata.enabled === false || unique.has(metadata.id)) continue;\n unique.set(metadata.id, { ...source, metadata });\n }\n return [...unique.values()].sort(compareSources);\n}\n\nfunction resolveSourceGraph(discovered: readonly PluginSource[]) {\n return resolvePluginDependencyOrder(discovered, {\n id: (source) => source.metadata.id,\n dependencies: (source) => source.metadata.frontendInject,\n compare: compareSources\n });\n}\n\n/** Fetch production assets during foundation startup without evaluating plugin code. */\nfunction preloadPluginAssets(discovered: readonly PluginSource[]) {\n const links: HTMLLinkElement[] = [];\n if (!import.meta.env.DEV) {\n for (const source of resolveSourceGraph(discovered).ordered) {\n try {\n validatePluginCompatibility(source.metadata.elements);\n } catch {\n continue;\n }\n if (source.metadata.restartRequired || !source.entry) continue;\n const module = document.createElement(\"link\");\n module.rel = \"modulepreload\";\n module.href = source.entry;\n module.crossOrigin = \"anonymous\";\n document.head.appendChild(module);\n links.push(module);\n for (const href of source.styles || []) {\n const style = document.createElement(\"link\");\n style.rel = \"preload\";\n style.setAttribute(\"as\", \"style\");\n style.href = href;\n document.head.appendChild(style);\n links.push(style);\n }\n }\n }\n return () => links.forEach((link) => link.remove());\n}\n\n/** Preparation never rejects, so an optional download failure cannot abort the batch. */\nasync function preparePlugin(source: PluginSource, cacheKey?: string): Promise<PreparedPlugin> {\n let removeStyles: (() => void) | undefined;\n try {\n validatePluginCompatibility(source.metadata.elements);\n if (source.metadata.restartRequired)\n throw new Error(\"The plugin backend requires a restart before this version can load.\");\n const [styles, entry] = await Promise.allSettled([\n import.meta.env.DEV ? Promise.resolve(undefined) : loadStyles(source),\n Promise.resolve().then(() => source.load(cacheKey))\n ]);\n if (styles.status === \"rejected\") throw styles.reason;\n removeStyles = styles.value;\n if (entry.status === \"rejected\") throw entry.reason;\n const module = toModule(entry.value, source.metadata.id);\n if (!module)\n throw new Error(`Panel frontend plugin has no apply() export: ${source.metadata.id}`);\n return { module, removeStyles };\n } catch (error) {\n removeStyles?.();\n return { error: error instanceof Error ? error : new Error(String(error)) };\n }\n}\n\nfunction recordGraphFailure(source: PluginSource, error: Error) {\n const existing = plugins.find((plugin) => plugin.metadata.id === source.metadata.id);\n if (existing) {\n existing.error = error;\n existing.state = \"failed\";\n notifyPluginDiagnostics();\n return existing;\n }\n const plugin = shallowReactive<InternalPlugin>({\n source,\n metadata: source.metadata,\n directory: source.directory,\n revision: source.revision,\n state: \"failed\",\n requiredServices: [],\n missingServices: [],\n error\n });\n plugins.push(plugin);\n notifyPluginDiagnostics();\n return plugin;\n}\n\nasync function install(\n source: PluginSource,\n cacheKey?: string,\n configOverride?: unknown,\n prepared?: PreparedPlugin\n) {\n const existing = plugins.find((plugin) => plugin.metadata.id === source.metadata.id);\n if (existing) return existing;\n\n const unavailableDependencies = (source.metadata.frontendInject || []).filter(\n (id) => plugins.find((plugin) => plugin.metadata.id === id)?.state !== \"active\"\n );\n if (unavailableDependencies.length) {\n if (prepared && \"module\" in prepared) prepared.removeStyles?.();\n return recordGraphFailure(\n source,\n new Error(\n `Frontend plugin dependencies are not active: ${unavailableDependencies.join(\", \")}`\n )\n );\n }\n\n const plugin = shallowReactive<InternalPlugin>({\n source,\n metadata: source.metadata,\n directory: source.directory,\n revision: source.revision,\n state: \"loading\",\n requiredServices: [],\n missingServices: []\n });\n plugins.push(plugin);\n notifyPluginDiagnostics();\n try {\n const resources = prepared ?? (await preparePlugin(source, cacheKey));\n if (\"error\" in resources) throw resources.error;\n plugin.removeStyles = resources.removeStyles;\n const { module } = resources;\n plugin.requiredServices = requiredServices(module);\n {\n // An `async apply()` is awaited here, so a plugin is fully applied before\n // the next one activates and before the app is mounted. Resource loading\n // happens in parallel before this dependency-ordered activation phase.\n //\n // cordis catches a synchronous throw from `apply()` and cancels the scope\n // itself, so the wrapper keeps a copy of it: without that, a plugin that\n // failed on its first line would still be reported as loaded.\n let applied: unknown;\n let thrown: unknown;\n // The manifest id is the plugin's name, so `ctx.name` — which is what\n // appears in its log lines — always matches `plugin.json`.\n plugin.fork = ctx.plugin(\n {\n ...module,\n name: source.metadata.id,\n apply: (...args) => {\n try {\n return (applied = module.apply(...args));\n } catch (error) {\n thrown = error;\n throw error;\n }\n }\n },\n configOverride === undefined\n ? (source.metadata as { config?: unknown }).config\n : configOverride\n );\n if (thrown) throw thrown;\n await applied;\n ctx.logger(\"plugin\").info(`Panel frontend plugin loaded: ${source.metadata.id}`);\n }\n } catch (error: any) {\n // Failure is atomic: whatever the plugin managed to register before it threw\n // goes with its scope, so a half-loaded plugin never stays behind.\n plugin.error = error instanceof Error ? error : new Error(String(error));\n plugin.fork?.dispose();\n plugin.fork = undefined;\n plugin.removeStyles?.();\n ctx\n .logger(\"plugin\")\n .error(`Panel frontend plugin failed to load: ${source.metadata.id}`, error);\n }\n notifyPluginDiagnostics();\n return plugin;\n}\n\nfunction isCurrentRoute(plugin: InternalPlugin) {\n const vue = ctx.get(\"vue\");\n const routes = ctx.get(\"routes\");\n if (!vue || !routes) return false;\n return vue.router.currentRoute.value.matched.some(\n (record) => routes.ownerOf(record.path) === plugin.metadata.id\n );\n}\n\nasync function unloadPluginInternal(id: string) {\n if (ESSENTIAL_PLUGIN_IDS.has(id)) {\n throw new Error(`The essential frontend plugin \"${id}\" cannot be unloaded.`);\n }\n const plugin = plugins.find((candidate) => candidate.metadata.id === id);\n if (!plugin) return false;\n plugin.state = \"unloading\";\n notifyPluginDiagnostics();\n // Leave the plugin's page before its routes go, or the router lands on\n // nothing.\n const vue = ctx.get(\"vue\");\n if (vue && isCurrentRoute(plugin)) await vue.router.replace(\"/404\");\n plugin.fork?.dispose();\n try {\n await settle();\n } catch (error) {\n plugin.error = error instanceof Error ? error : new Error(String(error));\n throw error;\n }\n plugin.removeStyles?.();\n removePluginStyles(plugin.source);\n const index = plugins.indexOf(plugin);\n if (index >= 0) plugins.splice(index, 1);\n notifyPluginDiagnostics();\n ctx.logger(\"plugin\").info(`Panel frontend plugin unloaded: ${id}`);\n return true;\n}\n\nasync function loadPluginInternal(id: string) {\n let source = sources.get(id);\n if (!source && !import.meta.env.DEV) {\n await refreshPluginsInternal();\n source = sources.get(id);\n }\n if (!source) throw new Error(`Panel frontend plugin not found: ${id}`);\n return install(source);\n}\n\nasync function reloadPluginInternal(id: string) {\n if (ESSENTIAL_PLUGIN_IDS.has(id)) {\n throw new Error(`The essential frontend plugin \"${id}\" cannot be reloaded.`);\n }\n await unloadPluginInternal(id);\n if (!import.meta.env.DEV) {\n const discovered = await discoverSources();\n sources.clear();\n discovered.forEach((source) => sources.set(source.metadata.id, source));\n }\n const source = sources.get(id);\n if (!source) throw new Error(`Panel frontend plugin not found: ${id}`);\n // The server revision is the cache identity. Reloading unchanged code still\n // retries activation without manufacturing an unbounded timestamp URL.\n return install(source, source.revision || String(source.metadata.version || \"reload\"));\n}\n\n/** Re-reads what is installed and loads or unloads to match. */\nasync function refreshPluginsInternal(discovered?: PluginSource[]) {\n discovered ??= await discoverSources();\n const next = new Map(discovered.map((source) => [source.metadata.id, source]));\n sources.clear();\n next.forEach((source, id) => sources.set(id, source));\n for (const plugin of [...plugins].reverse()) {\n if (ESSENTIAL_PLUGIN_IDS.has(plugin.metadata.id)) continue;\n if (!next.has(plugin.metadata.id)) await unloadPluginInternal(plugin.metadata.id);\n }\n const graph = resolveSourceGraph(discovered);\n for (const [id, issue] of graph.issues) {\n const source = next.get(id);\n if (!source) continue;\n const current = plugins.find((plugin) => plugin.metadata.id === id);\n if (current && !ESSENTIAL_PLUGIN_IDS.has(id)) await unloadPluginInternal(id);\n recordGraphFailure(source, new Error(issue.message));\n }\n const pending: PluginSource[] = [];\n for (const source of graph.ordered) {\n const current = plugins.find((plugin) => plugin.metadata.id === source.metadata.id);\n if (current) current.restartRequired = Boolean(source.metadata.restartRequired);\n const changed =\n current &&\n (source.revision !== current.source.revision ||\n JSON.stringify(source.metadata) !== JSON.stringify(current.metadata) ||\n Boolean(source.metadata.restartRequired) !==\n Boolean(current.source.metadata.restartRequired));\n if (current && (changed || source.metadata.restartRequired)) {\n if (ESSENTIAL_PLUGIN_IDS.has(source.metadata.id) || source.metadata.restartRequired) {\n current.restartRequired = Boolean(source.metadata.restartRequired);\n current.reloadRequired = Boolean(changed && ESSENTIAL_PLUGIN_IDS.has(source.metadata.id));\n continue;\n }\n await unloadPluginInternal(source.metadata.id);\n }\n if (!plugins.some((plugin) => plugin.metadata.id === source.metadata.id)) pending.push(source);\n }\n const prepared = await Promise.all(pending.map((source) => preparePlugin(source)));\n for (const [index, source] of pending.entries()) {\n await install(source, undefined, undefined, prepared[index]);\n }\n await settle();\n notifyPluginDiagnostics();\n return discovered.map((source) => source.metadata) as readonly PanelFrontendPluginMetadata[];\n}\n\n/** Discover once, prefetch assets, then activate foundations before the remaining batch. */\nexport async function bootstrapPanelFrontendPlugins() {\n const discovered = await discoverSources();\n sources.clear();\n discovered.forEach((source) => sources.set(source.metadata.id, source));\n const removePreloads = preloadPluginAssets(discovered);\n try {\n for (const id of ESSENTIAL_PLUGIN_IDS) {\n const source = sources.get(id);\n if (!source) throw new Error(`Panel frontend foundation plugin not found: ${id}`);\n const plugin = await install(source);\n if (plugin.error) throw plugin.error;\n if (!plugin.fork || !ctx.get(FOUNDATION_SERVICES[id])) {\n throw new Error(`Panel frontend foundation plugin failed to initialize: ${id}`);\n }\n }\n await refreshPluginsInternal(discovered);\n window.dispatchEvent(new CustomEvent(\"elementspanel:plugins-changed\"));\n } finally {\n removePreloads();\n }\n}\n\nexport function getLoadedPlugins(): readonly LoadedPanelFrontendPlugin[] {\n return plugins;\n}\n\nexport function getPluginDiagnostics(): readonly PanelFrontendPluginDiagnostic[] {\n return plugins.map((plugin) => {\n const error = pluginError(plugin);\n return {\n id: plugin.metadata.id,\n state: plugin.state,\n required: Boolean(plugin.metadata.frontendRequired),\n revision: plugin.revision,\n requiredServices: [...plugin.requiredServices],\n missingServices: [...plugin.missingServices],\n ...(error ? { error: error.message } : {})\n };\n });\n}\n\nexport function auditFrontendPlugins() {\n notifyPluginDiagnostics();\n const failures = getPluginDiagnostics().filter(\n (plugin) => plugin.required && plugin.state !== \"active\"\n );\n if (!failures.length) return;\n throw new Error(\n `Required frontend plugins are not active: ${failures\n .map((plugin) => `${plugin.id} (${plugin.state}${plugin.error ? `: ${plugin.error}` : \"\"})`)\n .join(\", \")}`\n );\n}\n\n/** Serialize UI actions and server notifications against the same browser state. */\nexport const unloadPlugin = (id: string) => change(() => unloadPluginInternal(id));\nexport const loadPlugin = (id: string) => change(() => loadPluginInternal(id));\nexport const reloadPlugin = (id: string) => change(() => reloadPluginInternal(id));\nexport const refreshPlugins = () =>\n change(async () => {\n const result = await refreshPluginsInternal();\n window.dispatchEvent(new CustomEvent(\"elementspanel:plugins-changed\"));\n return result;\n });\n\n/** Reconnect receives the complete current generation; no event history is needed. */\nexport function watchPluginChanges(): () => void {\n if (import.meta.env.DEV || typeof EventSource === \"undefined\") return () => {};\n const events = new EventSource(new URL(\"plugins/events\", document.baseURI).href);\n let revision = \"\";\n let stopped = false;\n let retry: ReturnType<typeof setTimeout> | undefined;\n const synchronize = () => {\n if (stopped) return;\n void refreshPlugins().catch((error) => {\n ctx.logger(\"plugin\").error(\"Failed to synchronize plugins\", error);\n retry = setTimeout(synchronize, 2000);\n });\n };\n events.onmessage = (event) => {\n let next: string;\n try {\n next = JSON.parse(event.data).revision;\n } catch {\n return;\n }\n if (typeof next !== \"string\" || next === revision || stopped) return;\n revision = next;\n if (retry) clearTimeout(retry);\n synchronize();\n };\n return () => {\n stopped = true;\n if (retry) clearTimeout(retry);\n events.close();\n };\n}\n","import { ctx } from \"./context\";\nimport {\n bootstrapPanelFrontendPlugins,\n auditFrontendPlugins,\n getPluginDiagnostics,\n getLoadedPlugins,\n loadPlugin,\n refreshPlugins,\n reloadPlugin,\n unloadPlugin,\n watchPluginChanges\n} from \"./loader\";\n\ndeclare global {\n interface Window {\n ElementsPanelPlugins?: {\n load: typeof loadPlugin;\n unload: typeof unloadPlugin;\n reload: typeof reloadPlugin;\n refresh: typeof refreshPlugins;\n loaded: typeof getLoadedPlugins;\n diagnostics: typeof getPluginDiagnostics;\n audit: typeof auditFrontendPlugins;\n };\n }\n}\n\nexport async function setupPanelFrontendPlugins() {\n ctx.provide(\"plugins\", undefined, true);\n ctx.set(\"plugins\", {\n get loaded() {\n return getLoadedPlugins();\n },\n get diagnostics() {\n return getPluginDiagnostics();\n },\n load: loadPlugin,\n unload: unloadPlugin,\n reload: reloadPlugin,\n refresh: refreshPlugins,\n audit: auditFrontendPlugins\n });\n\n await bootstrapPanelFrontendPlugins();\n auditFrontendPlugins();\n\n window.ElementsPanelPlugins = {\n load: loadPlugin,\n unload: unloadPlugin,\n reload: reloadPlugin,\n refresh: refreshPlugins,\n loaded: getLoadedPlugins,\n diagnostics: getPluginDiagnostics,\n audit: auditFrontendPlugins\n };\n await ctx.parallel(\"plugins/loaded\");\n await ctx.start();\n ctx.effect(watchPluginChanges);\n}\n","import { ctx } from \"./plugin/context\";\nimport { setupPanelFrontendPlugins } from \"./plugin/install\";\n\nsetupPanelFrontendPlugins().catch(async (error) => {\n console.error(\"Plugin startup failed:\", error);\n const startup = ctx.get(\"startup\");\n if (startup) startup.showError(error);\n else {\n const host = window as Window & { setAppLoadingError?: (message: string) => void };\n host.setAppLoadingError?.(error instanceof Error ? error.message : String(error));\n }\n await ctx.stop();\n});\n"],"file":"assets/index-76b0df52.js"}
@@ -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