@elementspanel/epanel-plugin-config 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/daemon/backend/index.cjs +595 -87
- package/daemon/plugin.json +1 -4
- package/package.json +13 -1
- package/panel/backend/index.cjs +619 -92
- package/panel/frontend/assets/{style-0-_panel-plugin-build-entry_config-4aa69b22.css → style-0-_panel-plugin-build-entry_config-6c3cbd56.css} +1 -1
- package/panel/frontend/panel-plugin-config-1f7cc416.js +1 -0
- package/panel/plugin.json +2 -11
- package/panel/frontend/panel-plugin-config-cb428381.js +0 -1
package/panel/backend/index.cjs
CHANGED
|
@@ -109,7 +109,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
109
109
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
110
110
|
};
|
|
111
111
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
112
|
-
exports.StorageSubsystem = exports.MCServerStatus = exports.InstanceStreamListener = exports.GlobalVariable = exports.normalizeDockerPlatform = exports.normalizeDockerOS = exports.normalizeDockerArchitecture = exports.removeTrail = exports.uninstallNpmPlugin = exports.npmPluginRoots = exports.listNpmPlugins = exports.installNpmPlugin = exports.currentProjectRoot = exports.currentPackageRoot = exports.sortPlugins = exports.resolvePluginEntry = exports.readPluginManifest = exports.createFrontendPluginMetadata = exports.discoverPluginsFromRoots = exports.discoverPlugins = exports.arrayUnique = exports.toText = exports.toNumber = exports.toBoolean = exports.supposeValue = exports.isEmpty = exports.configureEntityParams = exports.systemInfo = exports.QueryWrapper = exports.QueryMapWrapper = exports.MySqlSource = exports.LocalFileSource = exports.killProcess = exports.ProcessWrapper = void 0;
|
|
112
|
+
exports.StorageSubsystem = exports.MCServerStatus = exports.InstanceStreamListener = exports.GlobalVariable = exports.normalizeDockerPlatform = exports.normalizeDockerOS = exports.normalizeDockerArchitecture = exports.removeTrail = exports.uninstallNpmPlugin = exports.isEssentialNpmPlugin = exports.npmPluginOperationPending = exports.npmPluginRoots = exports.listNpmPlugins = exports.installNpmPlugin = exports.currentProjectRoot = exports.currentPackageRoot = exports.sortPlugins = exports.resolvePluginEntry = exports.readPluginManifest = exports.createFrontendPluginMetadata = exports.discoverPluginsFromRoots = exports.discoverPlugins = exports.arrayUnique = exports.toText = exports.toNumber = exports.toBoolean = exports.supposeValue = exports.isEmpty = exports.configureEntityParams = exports.systemInfo = exports.QueryWrapper = exports.QueryMapWrapper = exports.MySqlSource = exports.LocalFileSource = exports.killProcess = exports.ProcessWrapper = void 0;
|
|
113
113
|
const global_variable_1 = __importDefault(__webpack_require__("../common/src/global_variable.ts"));
|
|
114
114
|
exports.GlobalVariable = global_variable_1.default;
|
|
115
115
|
const instance_stream_1 = __importDefault(__webpack_require__("../common/src/instance_stream.ts"));
|
|
@@ -141,6 +141,8 @@ __exportStar(__webpack_require__("../common/src/plugin_contract.ts"), exports);
|
|
|
141
141
|
__exportStar(__webpack_require__("../common/src/plugin_overrides.ts"), exports);
|
|
142
142
|
__exportStar(__webpack_require__("../common/src/plugin_lifecycle.ts"), exports);
|
|
143
143
|
__exportStar(__webpack_require__("../common/src/plugin_revision.ts"), exports);
|
|
144
|
+
__exportStar(__webpack_require__("../common/src/plugin_modules.ts"), exports);
|
|
145
|
+
__exportStar(__webpack_require__("../common/src/plugin_watch.ts"), exports);
|
|
144
146
|
__exportStar(__webpack_require__("../common/src/runtime_paths.ts"), exports);
|
|
145
147
|
var plugin_manifest_1 = __webpack_require__("../common/src/plugin_manifest.ts");
|
|
146
148
|
Object.defineProperty(exports, "discoverPlugins", ({ enumerable: true, get: function () { return plugin_manifest_1.discoverPlugins; } }));
|
|
@@ -155,6 +157,8 @@ Object.defineProperty(exports, "currentProjectRoot", ({ enumerable: true, get: f
|
|
|
155
157
|
Object.defineProperty(exports, "installNpmPlugin", ({ enumerable: true, get: function () { return plugin_npm_1.installNpmPlugin; } }));
|
|
156
158
|
Object.defineProperty(exports, "listNpmPlugins", ({ enumerable: true, get: function () { return plugin_npm_1.listNpmPlugins; } }));
|
|
157
159
|
Object.defineProperty(exports, "npmPluginRoots", ({ enumerable: true, get: function () { return plugin_npm_1.npmPluginRoots; } }));
|
|
160
|
+
Object.defineProperty(exports, "npmPluginOperationPending", ({ enumerable: true, get: function () { return plugin_npm_1.npmPluginOperationPending; } }));
|
|
161
|
+
Object.defineProperty(exports, "isEssentialNpmPlugin", ({ enumerable: true, get: function () { return plugin_npm_1.isEssentialNpmPlugin; } }));
|
|
158
162
|
Object.defineProperty(exports, "uninstallNpmPlugin", ({ enumerable: true, get: function () { return plugin_npm_1.uninstallNpmPlugin; } }));
|
|
159
163
|
var string_utils_1 = __webpack_require__("../common/src/string_utils.ts");
|
|
160
164
|
Object.defineProperty(exports, "removeTrail", ({ enumerable: true, get: function () { return string_utils_1.removeTrail; } }));
|
|
@@ -623,7 +627,45 @@ function createFrontendPluginMetadata(manifest, extras = {}) {
|
|
|
623
627
|
};
|
|
624
628
|
}
|
|
625
629
|
const MANIFEST_FILES = ["plugin.json", "manifest.json", "package.json"];
|
|
626
|
-
|
|
630
|
+
const ENTRY_FIELDS = ["backend", "frontend", "panel", "daemon", "main", "entry", "ui"];
|
|
631
|
+
function objectValue(value) {
|
|
632
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
633
|
+
? value
|
|
634
|
+
: {};
|
|
635
|
+
}
|
|
636
|
+
/**
|
|
637
|
+
* Source plugins keep package.json beside plugin.json. Published npm plugins
|
|
638
|
+
* keep it at the package root, with runtime metadata under elementspanel.<side>.
|
|
639
|
+
* Stop at the first package boundary so a host's metadata cannot reach a plugin.
|
|
640
|
+
*/
|
|
641
|
+
function readPackageMetadata(directory, id) {
|
|
642
|
+
const pluginDirectory = node_path_1.default.resolve(directory);
|
|
643
|
+
let current = pluginDirectory;
|
|
644
|
+
while (true) {
|
|
645
|
+
const filename = node_path_1.default.join(current, "package.json");
|
|
646
|
+
if (node_fs_1.default.existsSync(filename)) {
|
|
647
|
+
const { elementspanel, ...metadata } = objectValue(JSON.parse(node_fs_1.default.readFileSync(filename, "utf8")));
|
|
648
|
+
const { id: packageId, panel, daemon, ...shared } = objectValue(elementspanel);
|
|
649
|
+
const definition = [panel, daemon]
|
|
650
|
+
.map(objectValue)
|
|
651
|
+
.find((side) => typeof side.directory === "string" &&
|
|
652
|
+
node_path_1.default.resolve(current, side.directory) === pluginDirectory);
|
|
653
|
+
if (current !== pluginDirectory && (packageId !== id || !definition))
|
|
654
|
+
return {};
|
|
655
|
+
const { directory: _directory, folder: _folder, ...sideMetadata } = definition !== null && definition !== void 0 ? definition : {};
|
|
656
|
+
const result = { ...metadata, ...shared, ...sideMetadata };
|
|
657
|
+
// npm's main/entry fields do not define a side's execution entry.
|
|
658
|
+
for (const field of ["dual", ...ENTRY_FIELDS])
|
|
659
|
+
delete result[field];
|
|
660
|
+
return result;
|
|
661
|
+
}
|
|
662
|
+
const parent = node_path_1.default.dirname(current);
|
|
663
|
+
if (parent === current)
|
|
664
|
+
return {};
|
|
665
|
+
current = parent;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
/** Merges package metadata with a plugin's identity and entries. Legacy manifests still load. */
|
|
627
669
|
function readPluginManifest(directory, onWarning, fallbackId = node_path_1.default.basename(directory)) {
|
|
628
670
|
for (const file of MANIFEST_FILES) {
|
|
629
671
|
const filePath = node_path_1.default.join(directory, file);
|
|
@@ -636,7 +678,18 @@ function readPluginManifest(directory, onWarning, fallbackId = node_path_1.defau
|
|
|
636
678
|
const id = typeof value.id === "string" ? value.id : fallbackId;
|
|
637
679
|
if (!id.trim())
|
|
638
680
|
return null;
|
|
639
|
-
|
|
681
|
+
const manifest = {
|
|
682
|
+
...value,
|
|
683
|
+
...readPackageMetadata(directory, id.trim()),
|
|
684
|
+
id: id.trim()
|
|
685
|
+
};
|
|
686
|
+
// Identity and execution paths always belong to plugin.json. Package
|
|
687
|
+
// metadata wins for descriptions, priority, configuration and dependencies.
|
|
688
|
+
for (const field of ["version", "dual", ...ENTRY_FIELDS]) {
|
|
689
|
+
if (value[field] !== undefined)
|
|
690
|
+
manifest[field] = value[field];
|
|
691
|
+
}
|
|
692
|
+
return manifest;
|
|
640
693
|
}
|
|
641
694
|
catch (error) {
|
|
642
695
|
onWarning === null || onWarning === void 0 ? void 0 : onWarning(`Failed to read plugin manifest: ${filePath}`, error);
|
|
@@ -738,6 +791,13 @@ function discoverPluginsFromRoots(roots, options) {
|
|
|
738
791
|
discovered.push({
|
|
739
792
|
...plugin,
|
|
740
793
|
manifest,
|
|
794
|
+
...(root.packageRoot
|
|
795
|
+
? {
|
|
796
|
+
packageRoot: root.packageRoot,
|
|
797
|
+
packageName: root.packageName,
|
|
798
|
+
npmSource: root.npmSource
|
|
799
|
+
}
|
|
800
|
+
: {}),
|
|
741
801
|
...(root.folder ? { folder: root.folder } : {})
|
|
742
802
|
});
|
|
743
803
|
}
|
|
@@ -751,6 +811,178 @@ function sortPlugins(plugins) {
|
|
|
751
811
|
}
|
|
752
812
|
|
|
753
813
|
|
|
814
|
+
/***/ },
|
|
815
|
+
|
|
816
|
+
/***/ "../common/src/plugin_modules.ts"
|
|
817
|
+
(__unused_webpack_module, exports, __webpack_require__) {
|
|
818
|
+
|
|
819
|
+
|
|
820
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
821
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
822
|
+
};
|
|
823
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
824
|
+
exports.pluginBackendRevision = pluginBackendRevision;
|
|
825
|
+
exports.forgetPluginModules = forgetPluginModules;
|
|
826
|
+
exports.loadPluginModule = loadPluginModule;
|
|
827
|
+
const node_fs_1 = __importDefault(__webpack_require__("node:fs"));
|
|
828
|
+
const node_path_1 = __importDefault(__webpack_require__("node:path"));
|
|
829
|
+
const node_url_1 = __webpack_require__("node:url");
|
|
830
|
+
const node_crypto_1 = __webpack_require__("node:crypto");
|
|
831
|
+
const node_module_1 = __webpack_require__("node:module");
|
|
832
|
+
const plugin_revision_1 = __webpack_require__("../common/src/plugin_revision.ts");
|
|
833
|
+
const REVISION = "epanelPluginRevision";
|
|
834
|
+
const graphs = new Map();
|
|
835
|
+
const previousRoots = new Map();
|
|
836
|
+
let hooksInstalled = false;
|
|
837
|
+
const sharedModules = new Set([
|
|
838
|
+
"cordis",
|
|
839
|
+
"@cordisjs/core",
|
|
840
|
+
"@cordisjs/logger",
|
|
841
|
+
"@cordisjs/timer",
|
|
842
|
+
"@cordisjs/schema",
|
|
843
|
+
"cosmokit",
|
|
844
|
+
"schemastery",
|
|
845
|
+
"reggol"
|
|
846
|
+
]);
|
|
847
|
+
function dependencyRoots(directory) {
|
|
848
|
+
const visited = new Set([directory]);
|
|
849
|
+
const walk = (root) => {
|
|
850
|
+
const filename = node_path_1.default.join(root, "package.json");
|
|
851
|
+
if (!node_fs_1.default.existsSync(filename))
|
|
852
|
+
return;
|
|
853
|
+
const metadata = JSON.parse(node_fs_1.default.readFileSync(filename, "utf8"));
|
|
854
|
+
const localRequire = (0, node_module_1.createRequire)(filename);
|
|
855
|
+
for (const name of Object.keys({
|
|
856
|
+
...metadata.dependencies,
|
|
857
|
+
...metadata.optionalDependencies
|
|
858
|
+
})) {
|
|
859
|
+
if (sharedModules.has(name))
|
|
860
|
+
continue;
|
|
861
|
+
const target = (localRequire.resolve.paths(name) || [])
|
|
862
|
+
.map((directory) => node_path_1.default.join(directory, name, "package.json"))
|
|
863
|
+
.find((candidate) => node_fs_1.default.existsSync(candidate));
|
|
864
|
+
if (!target)
|
|
865
|
+
continue;
|
|
866
|
+
const dependency = node_fs_1.default.realpathSync(node_path_1.default.dirname(target));
|
|
867
|
+
if (visited.has(dependency))
|
|
868
|
+
continue;
|
|
869
|
+
visited.add(dependency);
|
|
870
|
+
walk(dependency);
|
|
871
|
+
}
|
|
872
|
+
};
|
|
873
|
+
walk(directory);
|
|
874
|
+
visited.delete(directory);
|
|
875
|
+
return [...visited];
|
|
876
|
+
}
|
|
877
|
+
/** Include transitive dependency versions so npm updates replace the affected graph. */
|
|
878
|
+
function pluginBackendRevision(entry, directory) {
|
|
879
|
+
const hash = (0, node_crypto_1.createHash)("sha256").update((0, plugin_revision_1.pluginDirectoryRevision)(node_path_1.default.dirname(entry)));
|
|
880
|
+
for (const root of [directory, ...dependencyRoots(directory)]) {
|
|
881
|
+
const filename = node_path_1.default.join(root, "package.json");
|
|
882
|
+
if (node_fs_1.default.existsSync(filename))
|
|
883
|
+
hash.update(root).update(node_fs_1.default.readFileSync(filename));
|
|
884
|
+
}
|
|
885
|
+
return hash.digest("hex").slice(0, 24);
|
|
886
|
+
}
|
|
887
|
+
function within(root, filename) {
|
|
888
|
+
const relative = node_path_1.default.relative(root, filename);
|
|
889
|
+
return (relative === "" ||
|
|
890
|
+
(!relative.startsWith(`..${node_path_1.default.sep}`) && relative !== ".." && !node_path_1.default.isAbsolute(relative)));
|
|
891
|
+
}
|
|
892
|
+
/** Clear the plugin's complete CJS graph, keeping shared host modules intact. */
|
|
893
|
+
function forgetPluginModules(directory) {
|
|
894
|
+
const runtimeRequire = eval("require");
|
|
895
|
+
const owned = [directory, ...(previousRoots.get(directory) || []), ...dependencyRoots(directory)];
|
|
896
|
+
previousRoots.delete(directory);
|
|
897
|
+
const belongs = (filename) => {
|
|
898
|
+
const parts = filename.split(`${node_path_1.default.sep}node_modules${node_path_1.default.sep}`);
|
|
899
|
+
if (parts.slice(1).some((part) => {
|
|
900
|
+
const name = part.startsWith("@")
|
|
901
|
+
? part.split(node_path_1.default.sep).slice(0, 2).join("/")
|
|
902
|
+
: part.split(node_path_1.default.sep)[0];
|
|
903
|
+
return sharedModules.has(name);
|
|
904
|
+
}))
|
|
905
|
+
return false;
|
|
906
|
+
return owned.some((root) => within(root, filename));
|
|
907
|
+
};
|
|
908
|
+
for (const filename of Object.keys(runtimeRequire.cache)) {
|
|
909
|
+
if (belongs(filename))
|
|
910
|
+
delete runtimeRequire.cache[filename];
|
|
911
|
+
}
|
|
912
|
+
for (const mod of Object.values(runtimeRequire.cache)) {
|
|
913
|
+
if (mod)
|
|
914
|
+
mod.children = mod.children.filter((child) => !belongs(child.filename));
|
|
915
|
+
}
|
|
916
|
+
// npm can move a dependency or change its main entry. Node's CJS resolver
|
|
917
|
+
// retains those paths separately from require.cache.
|
|
918
|
+
const pathCache = runtimeRequire("node:module")._pathCache;
|
|
919
|
+
for (const [key, filename] of Object.entries(pathCache)) {
|
|
920
|
+
if (belongs(filename) || owned.some((root) => key.includes(root)))
|
|
921
|
+
delete pathCache[key];
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
function isEsm(entry) {
|
|
925
|
+
if (entry.endsWith(".mjs"))
|
|
926
|
+
return true;
|
|
927
|
+
if (entry.endsWith(".cjs"))
|
|
928
|
+
return false;
|
|
929
|
+
let directory = node_path_1.default.dirname(entry);
|
|
930
|
+
while (true) {
|
|
931
|
+
const filename = node_path_1.default.join(directory, "package.json");
|
|
932
|
+
if (node_fs_1.default.existsSync(filename))
|
|
933
|
+
return JSON.parse(node_fs_1.default.readFileSync(filename, "utf8")).type === "module";
|
|
934
|
+
const parent = node_path_1.default.dirname(directory);
|
|
935
|
+
if (parent === directory)
|
|
936
|
+
return false;
|
|
937
|
+
directory = parent;
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
/** Give an ESM entry and its local imports the same immutable revision URL. */
|
|
941
|
+
async function loadPluginModule(entry, directory, revision) {
|
|
942
|
+
const runtimeRequire = eval("require");
|
|
943
|
+
previousRoots.set(directory, dependencyRoots(directory));
|
|
944
|
+
if (!isEsm(entry)) {
|
|
945
|
+
try {
|
|
946
|
+
return runtimeRequire(entry);
|
|
947
|
+
}
|
|
948
|
+
catch (error) {
|
|
949
|
+
if ((error === null || error === void 0 ? void 0 : error.code) !== "ERR_REQUIRE_ESM")
|
|
950
|
+
throw error;
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
graphs.set(revision, [directory, ...dependencyRoots(directory)]);
|
|
954
|
+
if (!hooksInstalled) {
|
|
955
|
+
const { registerHooks } = runtimeRequire("node:module");
|
|
956
|
+
if (typeof registerHooks !== "function")
|
|
957
|
+
throw new Error("ESM plugin updates require Node.js 22.15 or newer.");
|
|
958
|
+
registerHooks({
|
|
959
|
+
resolve(specifier, context, nextResolve) {
|
|
960
|
+
var _a;
|
|
961
|
+
const resolved = nextResolve(specifier, context);
|
|
962
|
+
if (!((_a = context.parentURL) === null || _a === void 0 ? void 0 : _a.startsWith("file:")) || !resolved.url.startsWith("file:"))
|
|
963
|
+
return resolved;
|
|
964
|
+
const parent = new URL(context.parentURL);
|
|
965
|
+
const parentRevision = parent.searchParams.get(REVISION);
|
|
966
|
+
if (!parentRevision)
|
|
967
|
+
return resolved;
|
|
968
|
+
const roots = graphs.get(parentRevision);
|
|
969
|
+
if (!(roots === null || roots === void 0 ? void 0 : roots.some((root) => within(root, (0, node_url_1.fileURLToPath)(parent)))) ||
|
|
970
|
+
!roots.some((root) => within(root, (0, node_url_1.fileURLToPath)(resolved.url))))
|
|
971
|
+
return resolved;
|
|
972
|
+
const url = new URL(resolved.url);
|
|
973
|
+
url.searchParams.set(REVISION, parentRevision);
|
|
974
|
+
return { ...resolved, url: url.href };
|
|
975
|
+
}
|
|
976
|
+
});
|
|
977
|
+
hooksInstalled = true;
|
|
978
|
+
}
|
|
979
|
+
const url = (0, node_url_1.pathToFileURL)(entry);
|
|
980
|
+
url.searchParams.set(REVISION, revision);
|
|
981
|
+
const dynamicImport = new Function("specifier", "return import(specifier)");
|
|
982
|
+
return dynamicImport(url.href);
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
|
|
754
986
|
/***/ },
|
|
755
987
|
|
|
756
988
|
/***/ "../common/src/plugin_npm.ts"
|
|
@@ -760,20 +992,25 @@ function sortPlugins(plugins) {
|
|
|
760
992
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
761
993
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
762
994
|
};
|
|
995
|
+
var _a;
|
|
763
996
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
764
997
|
exports.currentPackageRoot = currentPackageRoot;
|
|
765
998
|
exports.currentProjectRoot = currentProjectRoot;
|
|
766
999
|
exports.npmPluginRoots = npmPluginRoots;
|
|
767
1000
|
exports.listNpmPlugins = listNpmPlugins;
|
|
1001
|
+
exports.npmPluginOperationPending = npmPluginOperationPending;
|
|
1002
|
+
exports.isEssentialNpmPlugin = isEssentialNpmPlugin;
|
|
768
1003
|
exports.installNpmPlugin = installNpmPlugin;
|
|
769
1004
|
exports.uninstallNpmPlugin = uninstallNpmPlugin;
|
|
770
1005
|
const child_process_1 = __webpack_require__("child_process");
|
|
771
1006
|
const fs_extra_1 = __importDefault(__webpack_require__("fs-extra"));
|
|
772
1007
|
const path_1 = __importDefault(__webpack_require__("path"));
|
|
773
1008
|
const module_1 = __webpack_require__("module");
|
|
1009
|
+
const plugin_manifest_1 = __webpack_require__("../common/src/plugin_manifest.ts");
|
|
1010
|
+
const plugin_contract_1 = __webpack_require__("../common/src/plugin_contract.ts");
|
|
774
1011
|
const PLUGIN_ID = /^[a-z][a-z0-9_-]{1,63}$/;
|
|
775
1012
|
const PACKAGE_NAME = /^(?:@[a-z0-9_.-]+\/)?epanel-plugin-[a-z0-9_.-]+$/;
|
|
776
|
-
const VERSION = /^[
|
|
1013
|
+
const VERSION = /^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,63}$/;
|
|
777
1014
|
function readJson(filename) {
|
|
778
1015
|
try {
|
|
779
1016
|
const parsed = JSON.parse(fs_extra_1.default.readFileSync(filename, "utf8"));
|
|
@@ -843,8 +1080,20 @@ function pluginRecord(pluginId, name, source, packageRoot, directory, folder, ve
|
|
|
843
1080
|
return { pluginId, name, version, sides: [], directory, folder, packageRoot, source };
|
|
844
1081
|
}
|
|
845
1082
|
function readPackageEntry(packageRoot, name) {
|
|
846
|
-
|
|
847
|
-
|
|
1083
|
+
// Read package boundaries directly: Node caches require.resolve() paths even
|
|
1084
|
+
// after npm moves an installation between nested and hoisted node_modules.
|
|
1085
|
+
let manifestPath;
|
|
1086
|
+
for (const root of [packageRoot, currentProjectRoot(packageRoot)]) {
|
|
1087
|
+
const localRequire = (0, module_1.createRequire)(path_1.default.join(root, "package.json"));
|
|
1088
|
+
manifestPath = (localRequire.resolve.paths(name) || [])
|
|
1089
|
+
.map((directory) => path_1.default.join(directory, name, "package.json"))
|
|
1090
|
+
.find((filename) => fs_extra_1.default.existsSync(filename));
|
|
1091
|
+
if (manifestPath)
|
|
1092
|
+
break;
|
|
1093
|
+
}
|
|
1094
|
+
if (!manifestPath)
|
|
1095
|
+
throw new Error(`Missing npm plugin package: ${name}.`);
|
|
1096
|
+
manifestPath = fs_extra_1.default.realpathSync(manifestPath);
|
|
848
1097
|
const metadata = readJson(manifestPath);
|
|
849
1098
|
if (!metadata)
|
|
850
1099
|
throw new Error(`Missing package metadata for ${name}.`);
|
|
@@ -858,7 +1107,10 @@ function sideDirectory(packageRoot, metadata, side) {
|
|
|
858
1107
|
return undefined;
|
|
859
1108
|
const target = path_1.default.resolve(packageRoot, directory);
|
|
860
1109
|
const relative = path_1.default.relative(packageRoot, target);
|
|
861
|
-
if (relative === "" ||
|
|
1110
|
+
if (relative === "" ||
|
|
1111
|
+
relative === ".." ||
|
|
1112
|
+
relative.startsWith(`..${path_1.default.sep}`) ||
|
|
1113
|
+
path_1.default.isAbsolute(relative))
|
|
862
1114
|
return undefined;
|
|
863
1115
|
return target;
|
|
864
1116
|
}
|
|
@@ -876,7 +1128,7 @@ function recordFromPackage(pluginId, name, source, packageRoot, metadata, side)
|
|
|
876
1128
|
return undefined;
|
|
877
1129
|
const directory = sideDirectory(packageRoot, metadata, target);
|
|
878
1130
|
const folder = stringValue((_a = objectValue(elements[target])) === null || _a === void 0 ? void 0 : _a.folder);
|
|
879
|
-
if (!directory || !folder)
|
|
1131
|
+
if (!directory || !PLUGIN_ID.test(folder))
|
|
880
1132
|
return undefined;
|
|
881
1133
|
return {
|
|
882
1134
|
...pluginRecord(pluginId, name, source, packageRoot, directory, folder, version),
|
|
@@ -892,14 +1144,29 @@ function recordFromPackage(pluginId, name, source, packageRoot, metadata, side)
|
|
|
892
1144
|
* is what lets a two-sided project share one dependency list between sides.
|
|
893
1145
|
*/
|
|
894
1146
|
function listNpmPlugins(side, options = {}) {
|
|
895
|
-
var _a;
|
|
1147
|
+
var _a, _b;
|
|
896
1148
|
const { packageRoot, projectRoot } = npmPluginRoots(options);
|
|
897
1149
|
const host = readJson(path_1.default.join(packageRoot, "package.json"));
|
|
898
1150
|
if (!host)
|
|
899
1151
|
throw new Error(`Missing runtime package metadata: ${packageRoot}`);
|
|
900
|
-
const project = path_1.default.resolve(projectRoot) === path_1.default.resolve(packageRoot)
|
|
1152
|
+
const project = path_1.default.resolve(projectRoot) === path_1.default.resolve(packageRoot)
|
|
1153
|
+
? null
|
|
1154
|
+
: readProjectManifest(projectRoot);
|
|
901
1155
|
const hostMappings = mappingsOf(host);
|
|
902
|
-
const projectMappings = mappingsOf(project);
|
|
1156
|
+
const projectMappings = { ...mappingsOf(project) };
|
|
1157
|
+
for (const name of Object.keys(dependenciesOf(project))) {
|
|
1158
|
+
if (!PACKAGE_NAME.test(name) || Object.values(projectMappings).includes(name))
|
|
1159
|
+
continue;
|
|
1160
|
+
try {
|
|
1161
|
+
const entry = readPackageEntry(projectRoot, name);
|
|
1162
|
+
const id = stringValue((_a = objectValue(entry.metadata.elementspanel)) === null || _a === void 0 ? void 0 : _a.id);
|
|
1163
|
+
if (PLUGIN_ID.test(id) && projectMappings[id] === undefined)
|
|
1164
|
+
projectMappings[id] = name;
|
|
1165
|
+
}
|
|
1166
|
+
catch (_c) {
|
|
1167
|
+
/* npm may still be writing the package. */
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
903
1170
|
const mappings = new Map();
|
|
904
1171
|
for (const [pluginId, name] of Object.entries(projectMappings)) {
|
|
905
1172
|
if (!PLUGIN_ID.test(pluginId) || typeof name !== "string" || !PACKAGE_NAME.test(name))
|
|
@@ -909,6 +1176,8 @@ function listNpmPlugins(side, options = {}) {
|
|
|
909
1176
|
for (const [pluginId, name] of Object.entries(hostMappings)) {
|
|
910
1177
|
if (!PLUGIN_ID.test(pluginId) || typeof name !== "string" || !PACKAGE_NAME.test(name))
|
|
911
1178
|
continue;
|
|
1179
|
+
if (dependenciesOf(host)[name] === undefined)
|
|
1180
|
+
continue;
|
|
912
1181
|
mappings.set(pluginId, { name, source: "bundled" });
|
|
913
1182
|
}
|
|
914
1183
|
const hostDependencies = dependenciesOf(host);
|
|
@@ -916,7 +1185,7 @@ function listNpmPlugins(side, options = {}) {
|
|
|
916
1185
|
const folders = new Set();
|
|
917
1186
|
const records = [];
|
|
918
1187
|
for (const [pluginId, mapping] of mappings) {
|
|
919
|
-
const declared = (
|
|
1188
|
+
const declared = (_b = hostDependencies[mapping.name]) !== null && _b !== void 0 ? _b : projectDependencies[mapping.name];
|
|
920
1189
|
if (declared === undefined) {
|
|
921
1190
|
if (options.skipInvalid)
|
|
922
1191
|
continue;
|
|
@@ -924,7 +1193,7 @@ function listNpmPlugins(side, options = {}) {
|
|
|
924
1193
|
}
|
|
925
1194
|
let entry;
|
|
926
1195
|
try {
|
|
927
|
-
entry = readPackageEntry(packageRoot, mapping.name);
|
|
1196
|
+
entry = readPackageEntry(mapping.source === "project" ? projectRoot : packageRoot, mapping.name);
|
|
928
1197
|
}
|
|
929
1198
|
catch (error) {
|
|
930
1199
|
if (options.skipInvalid)
|
|
@@ -957,7 +1226,12 @@ function runNpm(args, cwd) {
|
|
|
957
1226
|
: process.platform === "win32"
|
|
958
1227
|
? {
|
|
959
1228
|
command: process.env.ComSpec || "cmd.exe",
|
|
960
|
-
args: [
|
|
1229
|
+
args: [
|
|
1230
|
+
"/d",
|
|
1231
|
+
"/s",
|
|
1232
|
+
"/c",
|
|
1233
|
+
`npm ${args.map((item) => `"${item.replace(/"/g, '""')}"`).join(" ")}`
|
|
1234
|
+
],
|
|
961
1235
|
shell: false
|
|
962
1236
|
}
|
|
963
1237
|
: { command: "npm", args, shell: false };
|
|
@@ -976,10 +1250,10 @@ function runNpm(args, cwd) {
|
|
|
976
1250
|
};
|
|
977
1251
|
(_a = child.stdout) === null || _a === void 0 ? void 0 : _a.on("data", append);
|
|
978
1252
|
(_b = child.stderr) === null || _b === void 0 ? void 0 : _b.on("data", append);
|
|
1253
|
+
const action = args.find((argument) => argument === "install" || argument === "uninstall") || "operation";
|
|
979
1254
|
const timer = setTimeout(() => {
|
|
980
|
-
var _a;
|
|
981
1255
|
child.kill("SIGKILL");
|
|
982
|
-
reject(new Error(`npm ${
|
|
1256
|
+
reject(new Error(`npm ${action} timed out.`));
|
|
983
1257
|
}, 10 * 60 * 1000);
|
|
984
1258
|
(_c = timer.unref) === null || _c === void 0 ? void 0 : _c.call(timer);
|
|
985
1259
|
child.once("error", (error) => {
|
|
@@ -987,20 +1261,74 @@ function runNpm(args, cwd) {
|
|
|
987
1261
|
reject(error);
|
|
988
1262
|
});
|
|
989
1263
|
child.once("close", (code) => {
|
|
990
|
-
var _a;
|
|
991
1264
|
clearTimeout(timer);
|
|
992
1265
|
if (code === 0)
|
|
993
1266
|
return resolve(output);
|
|
994
|
-
reject(new Error(`npm ${
|
|
1267
|
+
reject(new Error(`npm ${action} failed (${code}): ${output.trim()}`));
|
|
995
1268
|
});
|
|
996
1269
|
});
|
|
997
1270
|
}
|
|
998
|
-
const
|
|
1271
|
+
const operationsKey = Symbol.for("elementspanel.npm.operations");
|
|
1272
|
+
const shared = globalThis;
|
|
1273
|
+
const operations = ((_a = shared[operationsKey]) !== null && _a !== void 0 ? _a : (shared[operationsKey] = new Map()));
|
|
1274
|
+
const LOCK_NAME = ".elementspanel-npm.lock";
|
|
1275
|
+
async function acquireProjectLock(projectRoot) {
|
|
1276
|
+
var _a, _b;
|
|
1277
|
+
await fs_extra_1.default.ensureDir(projectRoot);
|
|
1278
|
+
const directory = path_1.default.join(projectRoot, LOCK_NAME);
|
|
1279
|
+
const deadline = Date.now() + 11 * 60 * 1000;
|
|
1280
|
+
while (true) {
|
|
1281
|
+
try {
|
|
1282
|
+
await fs_extra_1.default.mkdir(directory);
|
|
1283
|
+
await fs_extra_1.default.writeJson(path_1.default.join(directory, "owner.json"), { pid: process.pid });
|
|
1284
|
+
return () => fs_extra_1.default.remove(directory);
|
|
1285
|
+
}
|
|
1286
|
+
catch (error) {
|
|
1287
|
+
if (error.code !== "EEXIST")
|
|
1288
|
+
throw error;
|
|
1289
|
+
try {
|
|
1290
|
+
const owner = await fs_extra_1.default.readJson(path_1.default.join(directory, "owner.json"));
|
|
1291
|
+
try {
|
|
1292
|
+
process.kill(owner.pid, 0);
|
|
1293
|
+
}
|
|
1294
|
+
catch (failure) {
|
|
1295
|
+
if (failure.code === "ESRCH") {
|
|
1296
|
+
await fs_extra_1.default.remove(directory);
|
|
1297
|
+
continue;
|
|
1298
|
+
}
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
catch (_c) {
|
|
1302
|
+
if (Date.now() - ((_b = (_a = (await fs_extra_1.default.stat(directory).catch(() => null))) === null || _a === void 0 ? void 0 : _a.mtimeMs) !== null && _b !== void 0 ? _b : Date.now()) >
|
|
1303
|
+
60000) {
|
|
1304
|
+
await fs_extra_1.default.remove(directory);
|
|
1305
|
+
continue;
|
|
1306
|
+
}
|
|
1307
|
+
}
|
|
1308
|
+
if (Date.now() > deadline)
|
|
1309
|
+
throw new Error("Another npm plugin operation is still running.");
|
|
1310
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
function npmPluginOperationPending() {
|
|
1315
|
+
const { packageRoot, projectRoot } = npmPluginRoots();
|
|
1316
|
+
return (operations.size > 0 ||
|
|
1317
|
+
[packageRoot, projectRoot].some((root) => fs_extra_1.default.existsSync(path_1.default.join(root, LOCK_NAME))));
|
|
1318
|
+
}
|
|
999
1319
|
function withProjectLock(projectRoot, operation) {
|
|
1000
1320
|
var _a;
|
|
1001
1321
|
const key = process.platform === "win32" ? projectRoot.toLowerCase() : projectRoot;
|
|
1002
1322
|
const previous = (_a = operations.get(key)) !== null && _a !== void 0 ? _a : Promise.resolve();
|
|
1003
|
-
const result = previous.then(
|
|
1323
|
+
const result = previous.then(async () => {
|
|
1324
|
+
const release = await acquireProjectLock(projectRoot);
|
|
1325
|
+
try {
|
|
1326
|
+
return await operation();
|
|
1327
|
+
}
|
|
1328
|
+
finally {
|
|
1329
|
+
await release();
|
|
1330
|
+
}
|
|
1331
|
+
});
|
|
1004
1332
|
const settled = result.then(() => { }, () => { });
|
|
1005
1333
|
operations.set(key, settled);
|
|
1006
1334
|
return result.finally(() => {
|
|
@@ -1008,85 +1336,174 @@ function withProjectLock(projectRoot, operation) {
|
|
|
1008
1336
|
operations.delete(key);
|
|
1009
1337
|
});
|
|
1010
1338
|
}
|
|
1011
|
-
/**
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
*/
|
|
1339
|
+
/** Core services keep the connection and management interface available. */
|
|
1340
|
+
function isEssentialNpmPlugin(pluginId) {
|
|
1341
|
+
return ["i18n", "storage", "runtime", "server", "console", "config"].includes(pluginId);
|
|
1342
|
+
}
|
|
1343
|
+
/** npm changes dependencies and lockfiles; only append our plugin mapping afterwards. */
|
|
1017
1344
|
async function installNpmPlugin(options) {
|
|
1018
|
-
const { name,
|
|
1019
|
-
|
|
1020
|
-
throw new Error(`Invalid plugin id: ${pluginId}`);
|
|
1345
|
+
const { name, side } = options;
|
|
1346
|
+
const version = options.version || "latest";
|
|
1021
1347
|
if (!PACKAGE_NAME.test(name))
|
|
1022
1348
|
throw new Error(`Invalid npm plugin package: ${name}`);
|
|
1349
|
+
if (options.pluginId && !PLUGIN_ID.test(options.pluginId))
|
|
1350
|
+
throw new Error(`Invalid plugin id: ${options.pluginId}`);
|
|
1023
1351
|
if (!VERSION.test(version))
|
|
1024
1352
|
throw new Error(`Invalid plugin version: ${version}`);
|
|
1025
1353
|
const { packageRoot, projectRoot } = npmPluginRoots(options);
|
|
1026
1354
|
return withProjectLock(projectRoot, async () => {
|
|
1027
|
-
var _a;
|
|
1355
|
+
var _a, _b;
|
|
1028
1356
|
const host = readJson(path_1.default.join(packageRoot, "package.json"));
|
|
1029
1357
|
if (!host)
|
|
1030
1358
|
throw new Error(`Missing runtime package metadata: ${packageRoot}`);
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1359
|
+
const hostId = (_a = Object.entries(mappingsOf(host)).find(([, value]) => value === name && dependenciesOf(host)[name] !== undefined)) === null || _a === void 0 ? void 0 : _a[0];
|
|
1360
|
+
const targetRoot = hostId ? packageRoot : projectRoot;
|
|
1361
|
+
if (hostId && isEssentialNpmPlugin(hostId))
|
|
1362
|
+
throw new Error(`The essential plugin "${hostId}" cannot be replaced while running.`);
|
|
1363
|
+
if (options.pluginId &&
|
|
1364
|
+
mappingsOf(host)[options.pluginId] &&
|
|
1365
|
+
dependenciesOf(host)[String(mappingsOf(host)[options.pluginId])] !== undefined &&
|
|
1366
|
+
mappingsOf(host)[options.pluginId] !== name)
|
|
1367
|
+
throw new Error(`BUNDLED:${options.pluginId}`);
|
|
1368
|
+
const original = readProjectManifest(targetRoot);
|
|
1369
|
+
const previous = dependenciesOf(original)[name];
|
|
1370
|
+
let previousVersion = previous;
|
|
1371
|
+
if (previous) {
|
|
1372
|
+
try {
|
|
1373
|
+
previousVersion = readPackageEntry(targetRoot, name).metadata.version || previous;
|
|
1374
|
+
}
|
|
1375
|
+
catch (_c) {
|
|
1376
|
+
/* Keep the declared spec if the previous package is incomplete. */
|
|
1377
|
+
}
|
|
1378
|
+
}
|
|
1379
|
+
const backups = new Map();
|
|
1380
|
+
for (const filename of ["package.json", "package-lock.json", "npm-shrinkwrap.json"]) {
|
|
1381
|
+
const target = path_1.default.join(targetRoot, filename);
|
|
1382
|
+
backups.set(target, fs_extra_1.default.existsSync(target) ? fs_extra_1.default.readFileSync(target) : null);
|
|
1383
|
+
}
|
|
1039
1384
|
try {
|
|
1040
|
-
|
|
1385
|
+
await runNpm([
|
|
1386
|
+
"--prefix",
|
|
1387
|
+
targetRoot,
|
|
1388
|
+
"install",
|
|
1389
|
+
`${name}@${version}`,
|
|
1390
|
+
"--save",
|
|
1391
|
+
"--save-exact",
|
|
1392
|
+
"--no-fund",
|
|
1393
|
+
"--no-audit",
|
|
1394
|
+
"--ignore-scripts"
|
|
1395
|
+
], targetRoot);
|
|
1396
|
+
const entry = readPackageEntry(targetRoot, name);
|
|
1397
|
+
const pluginId = options.pluginId || stringValue((_b = objectValue(entry.metadata.elementspanel)) === null || _b === void 0 ? void 0 : _b.id);
|
|
1398
|
+
if (!PLUGIN_ID.test(pluginId))
|
|
1399
|
+
throw new Error(`Invalid plugin id in ${name}.`);
|
|
1400
|
+
if (mappingsOf(host)[pluginId] &&
|
|
1401
|
+
dependenciesOf(host)[String(mappingsOf(host)[pluginId])] !== undefined &&
|
|
1402
|
+
mappingsOf(host)[pluginId] !== name)
|
|
1403
|
+
throw new Error(`Plugin id ${pluginId} belongs to a bundled dependency.`);
|
|
1404
|
+
if (hostId && pluginId !== hostId)
|
|
1405
|
+
throw new Error(`The package ${name} changed its plugin id from ${hostId} to ${pluginId}.`);
|
|
1406
|
+
const mapped = mappingsOf(readProjectManifest(targetRoot))[pluginId];
|
|
1407
|
+
if (mapped !== undefined && mapped !== name)
|
|
1408
|
+
throw new Error(`Plugin id ${pluginId} is already installed as ${String(mapped)}.`);
|
|
1409
|
+
const record = recordFromPackage(pluginId, name, hostId ? "bundled" : "project", entry.root, entry.metadata, side);
|
|
1410
|
+
if (!record)
|
|
1411
|
+
throw new Error(`The package ${name} does not provide a ${side} plugin named ${pluginId}.`);
|
|
1412
|
+
if (/^[0-9]/.test(version) && record.version !== version)
|
|
1413
|
+
throw new Error(`The installed package ${name} is ${record.version}, expected ${version}.`);
|
|
1414
|
+
if (!process.env.EPANEL_PACKAGE_ROOT &&
|
|
1415
|
+
(0, plugin_manifest_1.discoverPlugins)(path_1.default.join(packageRoot, "plugins"), {
|
|
1416
|
+
entryFields: [],
|
|
1417
|
+
includeDisabled: true
|
|
1418
|
+
}).some((plugin) => plugin.manifest.id === pluginId))
|
|
1419
|
+
throw new Error(`Source plugin ${pluginId} cannot be replaced with an npm dependency.`);
|
|
1420
|
+
const manifest = (0, plugin_manifest_1.readPluginManifest)(record.directory);
|
|
1421
|
+
if (!manifest || manifest.id !== pluginId || manifest.version !== record.version)
|
|
1422
|
+
throw new Error(`The plugin manifest in ${name} does not match its package.`);
|
|
1423
|
+
(0, plugin_contract_1.validatePluginCompatibility)(manifest.elements);
|
|
1424
|
+
for (const field of ["backend", "frontend", "panel", "daemon", "main", "entry", "ui"]) {
|
|
1425
|
+
if (typeof manifest[field] === "string" &&
|
|
1426
|
+
!(0, plugin_manifest_1.resolvePluginEntry)(record.directory, manifest, { entryFields: [field] }))
|
|
1427
|
+
throw new Error(`Invalid ${field} entry in ${name}.`);
|
|
1428
|
+
}
|
|
1429
|
+
const others = listNpmPlugins(side, { packageRoot, projectRoot, skipInvalid: true });
|
|
1430
|
+
if (others.some((plugin) => plugin.pluginId === pluginId && plugin.name !== name))
|
|
1431
|
+
throw new Error(`Plugin id ${pluginId} is already provided by another dependency.`);
|
|
1432
|
+
const collision = others.find((plugin) => plugin.pluginId !== pluginId && plugin.folder === record.folder);
|
|
1433
|
+
if (collision)
|
|
1434
|
+
throw new Error(`Plugin asset directory ${record.folder} is already used by ${collision.name}.`);
|
|
1435
|
+
const updated = readProjectManifest(targetRoot);
|
|
1436
|
+
updated.dependencies = { ...dependenciesOf(updated), [name]: record.version };
|
|
1437
|
+
updated.elementspanel = {
|
|
1438
|
+
...objectValue(updated.elementspanel),
|
|
1439
|
+
plugins: { ...mappingsOf(updated), [pluginId]: name }
|
|
1440
|
+
};
|
|
1441
|
+
writeProjectManifest(targetRoot, updated);
|
|
1442
|
+
return record;
|
|
1041
1443
|
}
|
|
1042
1444
|
catch (error) {
|
|
1043
|
-
|
|
1445
|
+
try {
|
|
1446
|
+
await runNpm(previous
|
|
1447
|
+
? [
|
|
1448
|
+
"--prefix",
|
|
1449
|
+
targetRoot,
|
|
1450
|
+
"install",
|
|
1451
|
+
`${name}@${String(previousVersion)}`,
|
|
1452
|
+
"--save",
|
|
1453
|
+
"--no-fund",
|
|
1454
|
+
"--no-audit",
|
|
1455
|
+
"--ignore-scripts"
|
|
1456
|
+
]
|
|
1457
|
+
: [
|
|
1458
|
+
"--prefix",
|
|
1459
|
+
targetRoot,
|
|
1460
|
+
"uninstall",
|
|
1461
|
+
name,
|
|
1462
|
+
"--no-fund",
|
|
1463
|
+
"--no-audit",
|
|
1464
|
+
"--ignore-scripts"
|
|
1465
|
+
], targetRoot);
|
|
1466
|
+
}
|
|
1467
|
+
catch (rollback) {
|
|
1468
|
+
throw new Error(`${String(error)}; npm rollback failed: ${String(rollback)}`);
|
|
1469
|
+
}
|
|
1470
|
+
finally {
|
|
1471
|
+
for (const [filename, content] of backups) {
|
|
1472
|
+
if (content === null)
|
|
1473
|
+
await fs_extra_1.default.remove(filename);
|
|
1474
|
+
else
|
|
1475
|
+
await fs_extra_1.default.writeFile(filename, content);
|
|
1476
|
+
}
|
|
1477
|
+
}
|
|
1044
1478
|
throw error;
|
|
1045
1479
|
}
|
|
1046
|
-
const record = recordFromPackage(pluginId, name, "project", entry.root, entry.metadata, side);
|
|
1047
|
-
if (!record) {
|
|
1048
|
-
await runNpm(["uninstall", name, "--no-fund", "--no-audit", "--ignore-scripts"], projectRoot).catch(() => { });
|
|
1049
|
-
throw new Error(`The package ${name} does not provide a ${side} plugin named ${pluginId}.`);
|
|
1050
|
-
}
|
|
1051
|
-
if (record.version !== version) {
|
|
1052
|
-
await runNpm(["uninstall", name, "--no-fund", "--no-audit", "--ignore-scripts"], projectRoot).catch(() => { });
|
|
1053
|
-
throw new Error(`The installed package ${name} is ${record.version}, expected ${version}.`);
|
|
1054
|
-
}
|
|
1055
|
-
const manifest = readProjectManifest(projectRoot);
|
|
1056
|
-
const dependencies = { ...dependenciesOf(manifest), [name]: version };
|
|
1057
|
-
const elementspanel = { ...((_a = objectValue(manifest.elementspanel)) !== null && _a !== void 0 ? _a : {}) };
|
|
1058
|
-
const plugins = { ...mappingsOf(manifest), [pluginId]: name };
|
|
1059
|
-
manifest.dependencies = dependencies;
|
|
1060
|
-
manifest.elementspanel = { ...elementspanel, plugins };
|
|
1061
|
-
writeProjectManifest(projectRoot, manifest);
|
|
1062
|
-
return record;
|
|
1063
1480
|
});
|
|
1064
1481
|
}
|
|
1065
|
-
/**
|
|
1482
|
+
/** Remove the dependency from the manifest that owns it, preserving user configuration. */
|
|
1066
1483
|
async function uninstallNpmPlugin(pluginId, options = {}) {
|
|
1067
1484
|
if (!PLUGIN_ID.test(pluginId))
|
|
1068
1485
|
throw new Error(`Invalid plugin id: ${pluginId}`);
|
|
1486
|
+
if (isEssentialNpmPlugin(pluginId))
|
|
1487
|
+
throw new Error(`The essential plugin "${pluginId}" cannot be uninstalled.`);
|
|
1069
1488
|
const { packageRoot, projectRoot } = npmPluginRoots(options);
|
|
1070
1489
|
return withProjectLock(projectRoot, async () => {
|
|
1071
|
-
var _a;
|
|
1490
|
+
var _a, _b;
|
|
1072
1491
|
const host = readJson(path_1.default.join(packageRoot, "package.json"));
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1492
|
+
const bundledName = mappingsOf(host)[pluginId];
|
|
1493
|
+
const targetRoot = typeof bundledName === "string" && dependenciesOf(host)[bundledName] !== undefined
|
|
1494
|
+
? packageRoot
|
|
1495
|
+
: projectRoot;
|
|
1496
|
+
const manifest = readProjectManifest(targetRoot);
|
|
1497
|
+
const name = (_a = mappingsOf(manifest)[pluginId]) !== null && _a !== void 0 ? _a : (_b = listNpmPlugins(undefined, { packageRoot, projectRoot, skipInvalid: true }).find((item) => item.pluginId === pluginId)) === null || _b === void 0 ? void 0 : _b.name;
|
|
1077
1498
|
if (typeof name !== "string" || !PACKAGE_NAME.test(name))
|
|
1078
1499
|
return null;
|
|
1079
1500
|
const record = listNpmPlugins(undefined, { packageRoot, projectRoot, skipInvalid: true }).find((item) => item.pluginId === pluginId);
|
|
1080
|
-
await runNpm(["uninstall", name, "--no-fund", "--no-audit", "--ignore-scripts"],
|
|
1081
|
-
const
|
|
1501
|
+
await runNpm(["--prefix", targetRoot, "uninstall", name, "--no-fund", "--no-audit", "--ignore-scripts"], targetRoot);
|
|
1502
|
+
const updated = readProjectManifest(targetRoot);
|
|
1503
|
+
const plugins = { ...mappingsOf(updated) };
|
|
1082
1504
|
delete plugins[pluginId];
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
elementspanel.plugins = plugins;
|
|
1086
|
-
else
|
|
1087
|
-
delete elementspanel.plugins;
|
|
1088
|
-
manifest.elementspanel = elementspanel;
|
|
1089
|
-
writeProjectManifest(projectRoot, manifest);
|
|
1505
|
+
updated.elementspanel = { ...objectValue(updated.elementspanel), plugins };
|
|
1506
|
+
writeProjectManifest(targetRoot, updated);
|
|
1090
1507
|
return record !== null && record !== void 0 ? record : null;
|
|
1091
1508
|
});
|
|
1092
1509
|
}
|
|
@@ -1235,6 +1652,82 @@ function pluginDirectoryRevision(directory) {
|
|
|
1235
1652
|
}
|
|
1236
1653
|
|
|
1237
1654
|
|
|
1655
|
+
/***/ },
|
|
1656
|
+
|
|
1657
|
+
/***/ "../common/src/plugin_watch.ts"
|
|
1658
|
+
(__unused_webpack_module, exports, __webpack_require__) {
|
|
1659
|
+
|
|
1660
|
+
|
|
1661
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
1662
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
1663
|
+
};
|
|
1664
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
1665
|
+
exports.watchNpmPlugins = watchNpmPlugins;
|
|
1666
|
+
const node_fs_1 = __importDefault(__webpack_require__("node:fs"));
|
|
1667
|
+
const node_path_1 = __importDefault(__webpack_require__("node:path"));
|
|
1668
|
+
const plugin_npm_1 = __webpack_require__("../common/src/plugin_npm.ts");
|
|
1669
|
+
/** Poll package boundaries, allowing npm to finish replacing files before reconciliation. */
|
|
1670
|
+
function watchNpmPlugins(ctx, side, reload, changed) {
|
|
1671
|
+
const stamp = () => {
|
|
1672
|
+
const { packageRoot, projectRoot } = (0, plugin_npm_1.npmPluginRoots)();
|
|
1673
|
+
if (!node_fs_1.default.existsSync(node_path_1.default.join(packageRoot, "package.json")))
|
|
1674
|
+
return "";
|
|
1675
|
+
const files = [];
|
|
1676
|
+
for (const root of [packageRoot, projectRoot])
|
|
1677
|
+
for (const name of [
|
|
1678
|
+
"package.json",
|
|
1679
|
+
"package-lock.json",
|
|
1680
|
+
"npm-shrinkwrap.json",
|
|
1681
|
+
"node_modules/.package-lock.json"
|
|
1682
|
+
])
|
|
1683
|
+
files.push(node_path_1.default.join(root, name));
|
|
1684
|
+
for (const plugin of (0, plugin_npm_1.listNpmPlugins)(side, { skipInvalid: true }))
|
|
1685
|
+
files.push(node_path_1.default.join(plugin.packageRoot, "package.json"), node_path_1.default.join(plugin.directory, "plugin.json"));
|
|
1686
|
+
return JSON.stringify(files.map((filename) => {
|
|
1687
|
+
try {
|
|
1688
|
+
const stat = node_fs_1.default.statSync(filename);
|
|
1689
|
+
return [filename, stat.size, stat.mtimeMs, stat.ctimeMs];
|
|
1690
|
+
}
|
|
1691
|
+
catch (_a) {
|
|
1692
|
+
return [filename, null];
|
|
1693
|
+
}
|
|
1694
|
+
}));
|
|
1695
|
+
};
|
|
1696
|
+
let applied = stamp();
|
|
1697
|
+
let candidate = applied;
|
|
1698
|
+
let busy = false;
|
|
1699
|
+
ctx.setInterval(() => {
|
|
1700
|
+
if (busy || (0, plugin_npm_1.npmPluginOperationPending)())
|
|
1701
|
+
return;
|
|
1702
|
+
try {
|
|
1703
|
+
const next = stamp();
|
|
1704
|
+
if (next === applied) {
|
|
1705
|
+
candidate = next;
|
|
1706
|
+
return;
|
|
1707
|
+
}
|
|
1708
|
+
if (next !== candidate) {
|
|
1709
|
+
candidate = next;
|
|
1710
|
+
return;
|
|
1711
|
+
}
|
|
1712
|
+
busy = true;
|
|
1713
|
+
void reload()
|
|
1714
|
+
.then(() => {
|
|
1715
|
+
applied = next;
|
|
1716
|
+
candidate = next;
|
|
1717
|
+
changed === null || changed === void 0 ? void 0 : changed();
|
|
1718
|
+
})
|
|
1719
|
+
.catch((error) => ctx.logger.warn("Failed to synchronize npm plugins", error))
|
|
1720
|
+
.finally(() => {
|
|
1721
|
+
busy = false;
|
|
1722
|
+
});
|
|
1723
|
+
}
|
|
1724
|
+
catch (error) {
|
|
1725
|
+
ctx.logger.warn("Failed to inspect npm plugins", error);
|
|
1726
|
+
}
|
|
1727
|
+
}, 2000);
|
|
1728
|
+
}
|
|
1729
|
+
|
|
1730
|
+
|
|
1238
1731
|
/***/ },
|
|
1239
1732
|
|
|
1240
1733
|
/***/ "../common/src/process_tools.ts"
|
|
@@ -1547,6 +2040,9 @@ function npmPluginRoots(side) {
|
|
|
1547
2040
|
const { resolveNpmPlugins } = runtimeRequire(resolver);
|
|
1548
2041
|
return resolveNpmPlugins(packagePath(), side, { skipInvalid: true }).map((record) => ({
|
|
1549
2042
|
directory: record.directory,
|
|
2043
|
+
packageRoot: record.packageRoot,
|
|
2044
|
+
packageName: record.name,
|
|
2045
|
+
npmSource: record.source,
|
|
1550
2046
|
...(record.folder ? { folder: record.folder } : {}),
|
|
1551
2047
|
// Built-in packages are part of the runtime's default configuration. A
|
|
1552
2048
|
// project dependency is installed but remains dormant until the user
|
|
@@ -2115,6 +2611,13 @@ module.exports = require("node:fs");
|
|
|
2115
2611
|
|
|
2116
2612
|
/***/ },
|
|
2117
2613
|
|
|
2614
|
+
/***/ "node:module"
|
|
2615
|
+
(module) {
|
|
2616
|
+
|
|
2617
|
+
module.exports = require("node:module");
|
|
2618
|
+
|
|
2619
|
+
/***/ },
|
|
2620
|
+
|
|
2118
2621
|
/***/ "node:os"
|
|
2119
2622
|
(module) {
|
|
2120
2623
|
|
|
@@ -2129,6 +2632,13 @@ module.exports = require("node:path");
|
|
|
2129
2632
|
|
|
2130
2633
|
/***/ },
|
|
2131
2634
|
|
|
2635
|
+
/***/ "node:url"
|
|
2636
|
+
(module) {
|
|
2637
|
+
|
|
2638
|
+
module.exports = require("node:url");
|
|
2639
|
+
|
|
2640
|
+
/***/ },
|
|
2641
|
+
|
|
2132
2642
|
/***/ "os"
|
|
2133
2643
|
(module) {
|
|
2134
2644
|
|
|
@@ -2153,84 +2663,84 @@ module.exports = require("process");
|
|
|
2153
2663
|
/***/ "./plugins/config/src/i18n/de_DE.json"
|
|
2154
2664
|
(module) {
|
|
2155
2665
|
|
|
2156
|
-
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Möchtest du das entsprechende Plugin auch auf den folgenden Knoten deaktivieren? Wähle die gewünschten Knoten aus.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Möchtest du das entsprechende Plugin auch von den folgenden Knoten entfernen? Wähle die gewünschten Knoten aus.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Die Plugins auf diesen Knoten konnten nicht geprüft werden: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"Die Plugin-Aktion wurde auf diesen Knoten nicht abgeschlossen: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Plugin-Konfiguration","TXT_CODE_PLUGIN_CANCEL":"Abbrechen","TXT_CODE_PLUGIN_DELETE":"Entfernen","TXT_CODE_PLUGIN_DELETE_CONFIRM":"Die
|
|
2666
|
+
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Möchtest du das entsprechende Plugin auch auf den folgenden Knoten deaktivieren? Wähle die gewünschten Knoten aus.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Möchtest du das entsprechende Plugin auch von den folgenden Knoten entfernen? Wähle die gewünschten Knoten aus.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Die Plugins auf diesen Knoten konnten nicht geprüft werden: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"Die Plugin-Aktion wurde auf diesen Knoten nicht abgeschlossen: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Plugin-Konfiguration","TXT_CODE_PLUGIN_CANCEL":"Abbrechen","TXT_CODE_PLUGIN_DELETE":"Entfernen","TXT_CODE_PLUGIN_DELETE_CONFIRM":"Die npm-Abhängigkeit wird deinstalliert. Gespeicherte Einstellungen bleiben erhalten.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"{name} entfernen?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Kernplugins und Quellcode-Plugins können hier nicht deinstalliert werden.","TXT_CODE_PLUGIN_DELETED":"Plugin entfernt","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Einstellungen speichern","TXT_CODE_PLUGIN_SAVE_REMINDER":"Denke daran, deine Einstellungen zu speichern!","TXT_CODE_PLUGIN_DISABLE":"Deaktivieren","TXT_CODE_PLUGIN_DISABLED":"Plugin deaktiviert","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Alles, was dieses Plugin bereitstellt, wird sofort entfernt.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"{name} deaktivieren?","TXT_CODE_PLUGIN_ENABLE":"Aktivieren","TXT_CODE_PLUGIN_ENABLED":"Plugin aktiviert","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Der Webserver kann nicht über das Panel deaktiviert werden, das er selbst bereitstellt. Setze stattdessen plugins.server.enabled auf false in seiner data/plugin-overrides.json.","TXT_CODE_PLUGIN_IS_DISABLED":"Dieses Plugin ist deaktiviert. Seine Seiten, Routen und API sind erst nach dem Aktivieren wieder verfügbar.","TXT_CODE_PLUGIN_LOAD_FAILED":"Dieses Plugin konnte nicht geladen werden","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Die Plugins dieses Knotens konnten nicht aufgelistet werden.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Dieser Knoten existiert nicht.","TXT_CODE_PLUGIN_NODE_OFFLINE":"nicht verbunden","TXT_CODE_PLUGIN_NODE_SELECT":"Knoten auswählen","TXT_CODE_PLUGIN_NO_CONFIG":"Dieses Plugin hat keine konfigurierbaren Optionen.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Nicht zugeordnet","TXT_CODE_PLUGIN_GROUP_ADD":"Gruppe hinzufügen","TXT_CODE_PLUGIN_GROUP_EDIT":"Plugin-Gruppe bearbeiten","TXT_CODE_PLUGIN_GROUP_RENAME":"Gruppe umbenennen","TXT_CODE_PLUGIN_GROUP_DELETE":"Gruppe löschen","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Gruppe {name} löschen?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Die Gruppe und ihre Plugin-Zuordnungen werden entfernt. Die Plugins selbst werden nicht gelöscht.","TXT_CODE_PLUGIN_GROUP_NAME":"Gruppenname","TXT_CODE_PLUGIN_SCOPE_NODE":"Knoten","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panel","TXT_CODE_PLUGIN_SELF_DISABLE":"Die Plugin-Verwaltung kann sich nicht selbst deaktivieren. Setze stattdessen plugins.config.enabled auf false in ihrer data/plugin-overrides.json.","TXT_CODE_PLUGIN_STATE_PENDING":"Wartet auf Abhängigkeiten","TXT_CODE_PLUGIN_STATE_DISABLED":"Deaktiviert","TXT_CODE_PLUGIN_STATE_LOADING":"Wird geladen","TXT_CODE_PLUGIN_STATE_ACTIVE":"Aktiv","TXT_CODE_PLUGIN_STATE_UNLOADING":"Wird entladen","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Starten Sie den Dienst neu, um die Änderung anzuwenden.","TXT_CODE_PLUGIN_SAVED_PENDING":"Gespeichert; wartet auf Plugin-Abhängigkeiten.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Browser-Plugin fehlgeschlagen","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Laden Sie die Seite neu, um die aktualisierte Browser-Laufzeit zu laden.","TXT_CODE_PLUGIN_NPM_INSTALL":"Plugin installieren / aktualisieren","TXT_CODE_PLUGIN_NPM_PACKAGE":"npm-Paketname","TXT_CODE_PLUGIN_NPM_VERSION":"Version oder Tag (Standard: latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"Plugin installiert und synchronisiert"}');
|
|
2157
2667
|
|
|
2158
2668
|
/***/ },
|
|
2159
2669
|
|
|
2160
2670
|
/***/ "./plugins/config/src/i18n/en_US.json"
|
|
2161
2671
|
(module) {
|
|
2162
2672
|
|
|
2163
|
-
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Also disable the matching plugin on the following nodes? Select the nodes to include.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Also remove the matching plugin from the following nodes? Select the nodes to include.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Could not check the plugins on these nodes: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"The plugin action did not complete on these nodes: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Plugin Configuration","TXT_CODE_PLUGIN_CANCEL":"Cancel","TXT_CODE_PLUGIN_DELETE":"Remove","TXT_CODE_PLUGIN_DELETE_CONFIRM":"The
|
|
2673
|
+
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Also disable the matching plugin on the following nodes? Select the nodes to include.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Also remove the matching plugin from the following nodes? Select the nodes to include.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Could not check the plugins on these nodes: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"The plugin action did not complete on these nodes: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Plugin Configuration","TXT_CODE_PLUGIN_CANCEL":"Cancel","TXT_CODE_PLUGIN_DELETE":"Remove","TXT_CODE_PLUGIN_DELETE_CONFIRM":"The npm dependency will be uninstalled. Saved configuration is kept.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"Remove {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Core plugins and development source plugins cannot be uninstalled here.","TXT_CODE_PLUGIN_DELETED":"Plugin removed","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Save settings","TXT_CODE_PLUGIN_SAVE_REMINDER":"Remember to save your settings!","TXT_CODE_PLUGIN_DISABLE":"Disable","TXT_CODE_PLUGIN_DISABLED":"Plugin disabled","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Everything this plugin provides is removed at once.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"Disable {name}?","TXT_CODE_PLUGIN_ENABLE":"Enable","TXT_CODE_PLUGIN_ENABLED":"Plugin enabled","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"The web server cannot be disabled from the panel it serves. Set plugins.server.enabled to false in its data/plugin-overrides.json instead.","TXT_CODE_PLUGIN_IS_DISABLED":"This plugin is disabled. Its pages, routes and API are unavailable until it is enabled again.","TXT_CODE_PLUGIN_LOAD_FAILED":"This plugin failed to load","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"This node\'s plugins could not be listed.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"That node does not exist.","TXT_CODE_PLUGIN_NODE_OFFLINE":"not connected","TXT_CODE_PLUGIN_NODE_SELECT":"Select a node","TXT_CODE_PLUGIN_NO_CONFIG":"This plugin has no configurable options.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Unassigned","TXT_CODE_PLUGIN_GROUP_ADD":"Add group","TXT_CODE_PLUGIN_GROUP_EDIT":"Edit plugin group","TXT_CODE_PLUGIN_GROUP_RENAME":"Rename group","TXT_CODE_PLUGIN_GROUP_DELETE":"Delete group","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Delete group {name}?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"The group and its plugin assignments will be removed. The plugins themselves will not be deleted.","TXT_CODE_PLUGIN_GROUP_NAME":"Group name","TXT_CODE_PLUGIN_SCOPE_NODE":"Nodes","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panel","TXT_CODE_PLUGIN_SELF_DISABLE":"The plugin manager cannot disable itself. Set plugins.config.enabled to false in its data/plugin-overrides.json instead.","TXT_CODE_PLUGIN_STATE_PENDING":"Waiting for dependencies","TXT_CODE_PLUGIN_STATE_DISABLED":"Disabled","TXT_CODE_PLUGIN_STATE_LOADING":"Loading","TXT_CODE_PLUGIN_STATE_ACTIVE":"Running","TXT_CODE_PLUGIN_STATE_UNLOADING":"Unloading","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Restart the service to apply this change.","TXT_CODE_PLUGIN_SAVED_PENDING":"Saved; waiting for plugin dependencies.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Browser plugin failed","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Refresh the page to load the updated browser runtime.","TXT_CODE_PLUGIN_NPM_INSTALL":"Install / update plugin","TXT_CODE_PLUGIN_NPM_PACKAGE":"npm package name","TXT_CODE_PLUGIN_NPM_VERSION":"Version or tag (latest by default)","TXT_CODE_PLUGIN_NPM_INSTALLED":"Plugin installed and synchronized"}');
|
|
2164
2674
|
|
|
2165
2675
|
/***/ },
|
|
2166
2676
|
|
|
2167
2677
|
/***/ "./plugins/config/src/i18n/es_ES.json"
|
|
2168
2678
|
(module) {
|
|
2169
2679
|
|
|
2170
|
-
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"¿Quieres desactivar también el complemento correspondiente en los siguientes nodos? Selecciona los nodos que quieras incluir.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"¿Quieres eliminar también el complemento correspondiente de los siguientes nodos? Selecciona los nodos que quieras incluir.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"No se pudieron comprobar los complementos de estos nodos: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"La operación del complemento no se completó en estos nodos: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Configuracion de plugins","TXT_CODE_PLUGIN_CANCEL":"Cancelar","TXT_CODE_PLUGIN_DELETE":"Eliminar","TXT_CODE_PLUGIN_DELETE_CONFIRM":"
|
|
2680
|
+
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"¿Quieres desactivar también el complemento correspondiente en los siguientes nodos? Selecciona los nodos que quieras incluir.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"¿Quieres eliminar también el complemento correspondiente de los siguientes nodos? Selecciona los nodos que quieras incluir.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"No se pudieron comprobar los complementos de estos nodos: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"La operación del complemento no se completó en estos nodos: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Configuracion de plugins","TXT_CODE_PLUGIN_CANCEL":"Cancelar","TXT_CODE_PLUGIN_DELETE":"Eliminar","TXT_CODE_PLUGIN_DELETE_CONFIRM":"Se desinstalará la dependencia npm. Se conservará la configuración guardada.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"¿Eliminar {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Los complementos principales y de código fuente no se pueden desinstalar aquí.","TXT_CODE_PLUGIN_DELETED":"Complemento eliminado","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Guardar configuración","TXT_CODE_PLUGIN_SAVE_REMINDER":"¡Recuerda guardar la configuración!","TXT_CODE_PLUGIN_DISABLE":"Desactivar","TXT_CODE_PLUGIN_DISABLED":"Complemento desactivado","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Todo lo que aporta este complemento se elimina de inmediato.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"¿Desactivar {name}?","TXT_CODE_PLUGIN_ENABLE":"Activar","TXT_CODE_PLUGIN_ENABLED":"Complemento activado","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"El servidor web no puede desactivarse desde el panel que él mismo sirve. Establece plugins.server.enabled en false en su data/plugin-overrides.json.","TXT_CODE_PLUGIN_IS_DISABLED":"Este complemento está desactivado. Sus páginas, rutas y API no están disponibles hasta que se vuelva a activar.","TXT_CODE_PLUGIN_LOAD_FAILED":"No se pudo cargar este complemento","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"No se pudieron listar los complementos de este nodo.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Ese nodo no existe.","TXT_CODE_PLUGIN_NODE_OFFLINE":"sin conexión","TXT_CODE_PLUGIN_NODE_SELECT":"Seleccionar un nodo","TXT_CODE_PLUGIN_NO_CONFIG":"Este plugin no tiene opciones configurables.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Sin asignar","TXT_CODE_PLUGIN_GROUP_ADD":"Añadir grupo","TXT_CODE_PLUGIN_GROUP_EDIT":"Editar grupo de plugins","TXT_CODE_PLUGIN_GROUP_RENAME":"Cambiar nombre del grupo","TXT_CODE_PLUGIN_GROUP_DELETE":"Eliminar grupo","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"¿Eliminar el grupo {name}?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Se eliminarán el grupo y sus asignaciones de plugins. Los plugins no se eliminarán.","TXT_CODE_PLUGIN_GROUP_NAME":"Nombre del grupo","TXT_CODE_PLUGIN_SCOPE_NODE":"Nodos","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panel","TXT_CODE_PLUGIN_SELF_DISABLE":"El gestor de complementos no puede desactivarse a sí mismo. Establece plugins.config.enabled en false en su data/plugin-overrides.json.","TXT_CODE_PLUGIN_STATE_PENDING":"Esperando dependencias","TXT_CODE_PLUGIN_STATE_DISABLED":"Desactivado","TXT_CODE_PLUGIN_STATE_LOADING":"Cargando","TXT_CODE_PLUGIN_STATE_ACTIVE":"En ejecución","TXT_CODE_PLUGIN_STATE_UNLOADING":"Descargando","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Reinicia el servicio para aplicar el cambio.","TXT_CODE_PLUGIN_SAVED_PENDING":"Guardado; esperando dependencias del complemento.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Error del complemento del navegador","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Recarga la página para cargar el entorno actualizado del navegador.","TXT_CODE_PLUGIN_NPM_INSTALL":"Instalar / actualizar complemento","TXT_CODE_PLUGIN_NPM_PACKAGE":"Nombre del paquete npm","TXT_CODE_PLUGIN_NPM_VERSION":"Versión o etiqueta (latest por defecto)","TXT_CODE_PLUGIN_NPM_INSTALLED":"Complemento instalado y sincronizado"}');
|
|
2171
2681
|
|
|
2172
2682
|
/***/ },
|
|
2173
2683
|
|
|
2174
2684
|
/***/ "./plugins/config/src/i18n/fr_FR.json"
|
|
2175
2685
|
(module) {
|
|
2176
2686
|
|
|
2177
|
-
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Voulez-vous aussi désactiver le plugin correspondant sur les nœuds suivants ? Sélectionnez les nœuds à inclure.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Voulez-vous aussi supprimer le plugin correspondant des nœuds suivants ? Sélectionnez les nœuds à inclure.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Impossible de vérifier les plugins sur ces nœuds : {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"L’opération sur le plugin n’a pas abouti sur ces nœuds : {nodes}","TXT_CODE_PLUGIN_CONFIG":"Configuration des plugins","TXT_CODE_PLUGIN_CANCEL":"Annuler","TXT_CODE_PLUGIN_DELETE":"Supprimer","TXT_CODE_PLUGIN_DELETE_CONFIRM":"
|
|
2687
|
+
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Voulez-vous aussi désactiver le plugin correspondant sur les nœuds suivants ? Sélectionnez les nœuds à inclure.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Voulez-vous aussi supprimer le plugin correspondant des nœuds suivants ? Sélectionnez les nœuds à inclure.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Impossible de vérifier les plugins sur ces nœuds : {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"L’opération sur le plugin n’a pas abouti sur ces nœuds : {nodes}","TXT_CODE_PLUGIN_CONFIG":"Configuration des plugins","TXT_CODE_PLUGIN_CANCEL":"Annuler","TXT_CODE_PLUGIN_DELETE":"Supprimer","TXT_CODE_PLUGIN_DELETE_CONFIRM":"La dépendance npm sera désinstallée. La configuration enregistrée sera conservée.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"Supprimer {name} ?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Les plugins essentiels et ceux du code source ne peuvent pas être désinstallés ici.","TXT_CODE_PLUGIN_DELETED":"Plugin supprimé","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Enregistrer la configuration","TXT_CODE_PLUGIN_SAVE_REMINDER":"Pensez à enregistrer la configuration !","TXT_CODE_PLUGIN_DISABLE":"Désactiver","TXT_CODE_PLUGIN_DISABLED":"Extension désactivée","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Tout ce que cette extension fournit est retiré immédiatement.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"Désactiver {name} ?","TXT_CODE_PLUGIN_ENABLE":"Activer","TXT_CODE_PLUGIN_ENABLED":"Extension activée","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Le serveur web ne peut pas être désactivé depuis le panneau qu il sert lui-même. Définissez plutôt plugins.server.enabled à false dans son data/plugin-overrides.json.","TXT_CODE_PLUGIN_IS_DISABLED":"Cette extension est désactivée. Ses pages, routes et API ne sont pas disponibles avant sa réactivation.","TXT_CODE_PLUGIN_LOAD_FAILED":"Le chargement de cette extension a échoué","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Impossible de lister les extensions de ce nœud.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Ce nœud n existe pas.","TXT_CODE_PLUGIN_NODE_OFFLINE":"non connecté","TXT_CODE_PLUGIN_NODE_SELECT":"Sélectionner un nœud","TXT_CODE_PLUGIN_NO_CONFIG":"Ce plugin ne comporte aucune option configurable.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Non attribués","TXT_CODE_PLUGIN_GROUP_ADD":"Ajouter un groupe","TXT_CODE_PLUGIN_GROUP_EDIT":"Modifier le groupe de plugins","TXT_CODE_PLUGIN_GROUP_RENAME":"Renommer le groupe","TXT_CODE_PLUGIN_GROUP_DELETE":"Supprimer le groupe","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Supprimer le groupe {name} ?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Le groupe et ses affectations de plugins seront supprimés. Les plugins eux-mêmes ne seront pas supprimés.","TXT_CODE_PLUGIN_GROUP_NAME":"Nom du groupe","TXT_CODE_PLUGIN_SCOPE_NODE":"Nœuds","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panneau","TXT_CODE_PLUGIN_SELF_DISABLE":"Le gestionnaire d extensions ne peut pas se désactiver lui-même. Définissez plutôt plugins.config.enabled à false dans son data/plugin-overrides.json.","TXT_CODE_PLUGIN_STATE_PENDING":"En attente des dépendances","TXT_CODE_PLUGIN_STATE_DISABLED":"Désactivé","TXT_CODE_PLUGIN_STATE_LOADING":"Chargement","TXT_CODE_PLUGIN_STATE_ACTIVE":"Actif","TXT_CODE_PLUGIN_STATE_UNLOADING":"Déchargement","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Redémarrez le service pour appliquer cette modification.","TXT_CODE_PLUGIN_SAVED_PENDING":"Enregistré ; en attente des dépendances du plugin.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Échec du plugin du navigateur","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Actualisez la page pour charger le nouvel environnement du navigateur.","TXT_CODE_PLUGIN_NPM_INSTALL":"Installer / mettre à jour le plugin","TXT_CODE_PLUGIN_NPM_PACKAGE":"Nom du paquet npm","TXT_CODE_PLUGIN_NPM_VERSION":"Version ou étiquette (latest par défaut)","TXT_CODE_PLUGIN_NPM_INSTALLED":"Plugin installé et synchronisé"}');
|
|
2178
2688
|
|
|
2179
2689
|
/***/ },
|
|
2180
2690
|
|
|
2181
2691
|
/***/ "./plugins/config/src/i18n/ja_JP.json"
|
|
2182
2692
|
(module) {
|
|
2183
2693
|
|
|
2184
|
-
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"以下のノードにある同じプラグインも無効にしますか?対象のノードを選択してください。","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"以下のノードにある同じプラグインも削除しますか?対象のノードを選択してください。","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"以下のノードのプラグインを確認できませんでした:{nodes}。","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"以下のノードでプラグインの操作が完了しませんでした:{nodes}","TXT_CODE_PLUGIN_CONFIG":"プラグイン設定","TXT_CODE_PLUGIN_CANCEL":"キャンセル","TXT_CODE_PLUGIN_DELETE":"削除","TXT_CODE_PLUGIN_DELETE_CONFIRM":"
|
|
2694
|
+
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"以下のノードにある同じプラグインも無効にしますか?対象のノードを選択してください。","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"以下のノードにある同じプラグインも削除しますか?対象のノードを選択してください。","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"以下のノードのプラグインを確認できませんでした:{nodes}。","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"以下のノードでプラグインの操作が完了しませんでした:{nodes}","TXT_CODE_PLUGIN_CONFIG":"プラグイン設定","TXT_CODE_PLUGIN_CANCEL":"キャンセル","TXT_CODE_PLUGIN_DELETE":"削除","TXT_CODE_PLUGIN_DELETE_CONFIRM":"npm 依存パッケージをアンインストールします。保存済みの設定は保持されます。","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"{name} を削除しますか?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"コアプラグインと開発用ソースプラグインはここではアンインストールできません。","TXT_CODE_PLUGIN_DELETED":"プラグインを削除しました","TXT_CODE_PLUGIN_SAVE_SETTINGS":"設定を保存","TXT_CODE_PLUGIN_SAVE_REMINDER":"設定の保存をお忘れなく!","TXT_CODE_PLUGIN_DISABLE":"無効化","TXT_CODE_PLUGIN_DISABLED":"プラグインを無効にしました","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"このプラグインが提供するすべての要素が即座に削除されます。","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"{name} を無効にしますか?","TXT_CODE_PLUGIN_ENABLE":"有効化","TXT_CODE_PLUGIN_ENABLED":"プラグインを有効にしました","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Web サーバーは、それ自身が配信しているパネルからは無効にできません。data/plugin-overrides.json で plugins.server.enabled を false に設定してください。","TXT_CODE_PLUGIN_IS_DISABLED":"このプラグインは無効です。再度有効にするまで、ページ・ルート・API は利用できません。","TXT_CODE_PLUGIN_LOAD_FAILED":"このプラグインの読み込みに失敗しました","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"このノードのプラグイン一覧を取得できませんでした。","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"そのノードは存在しません。","TXT_CODE_PLUGIN_NODE_OFFLINE":"未接続","TXT_CODE_PLUGIN_NODE_SELECT":"ノードを選択","TXT_CODE_PLUGIN_NO_CONFIG":"このプラグインには設定可能な項目がありません。","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"未分類","TXT_CODE_PLUGIN_GROUP_ADD":"グループを追加","TXT_CODE_PLUGIN_GROUP_EDIT":"プラグイン グループを編集","TXT_CODE_PLUGIN_GROUP_RENAME":"グループ名を変更","TXT_CODE_PLUGIN_GROUP_DELETE":"グループを削除","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"グループ「{name}」を削除しますか?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"グループとプラグインの割り当てを削除します。プラグイン自体は削除されません。","TXT_CODE_PLUGIN_GROUP_NAME":"グループ名","TXT_CODE_PLUGIN_SCOPE_NODE":"ノード","TXT_CODE_PLUGIN_SCOPE_PANEL":"パネル","TXT_CODE_PLUGIN_SELF_DISABLE":"プラグイン管理自身は無効にできません。data/plugin-overrides.json で plugins.config.enabled を false に設定してください。","TXT_CODE_PLUGIN_STATE_PENDING":"依存関係を待機中","TXT_CODE_PLUGIN_STATE_DISABLED":"無効","TXT_CODE_PLUGIN_STATE_LOADING":"読み込み中","TXT_CODE_PLUGIN_STATE_ACTIVE":"実行中","TXT_CODE_PLUGIN_STATE_UNLOADING":"アンロード中","TXT_CODE_PLUGIN_RESTART_REQUIRED":"変更を適用するにはサービスを再起動してください。","TXT_CODE_PLUGIN_SAVED_PENDING":"保存しました。プラグインの依存関係を待機しています。","TXT_CODE_PLUGIN_FRONTEND_FAILED":"ブラウザープラグインの読み込みに失敗しました","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"更新されたブラウザーランタイムを読み込むにはページを再読み込みしてください。","TXT_CODE_PLUGIN_NPM_INSTALL":"プラグインのインストール / 更新","TXT_CODE_PLUGIN_NPM_PACKAGE":"npm パッケージ名","TXT_CODE_PLUGIN_NPM_VERSION":"バージョンまたはタグ(既定: latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"プラグインをインストールして同期しました"}');
|
|
2185
2695
|
|
|
2186
2696
|
/***/ },
|
|
2187
2697
|
|
|
2188
2698
|
/***/ "./plugins/config/src/i18n/ko_KR.json"
|
|
2189
2699
|
(module) {
|
|
2190
2700
|
|
|
2191
|
-
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"다음 노드의 동일한 플러그인도 비활성화할까요? 함께 처리할 노드를 선택하세요.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"다음 노드의 동일한 플러그인도 삭제할까요? 함께 처리할 노드를 선택하세요.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"다음 노드의 플러그인을 확인할 수 없습니다: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"다음 노드에서 플러그인 작업이 완료되지 않았습니다: {nodes}","TXT_CODE_PLUGIN_CONFIG":"플러그인 설정","TXT_CODE_PLUGIN_CANCEL":"취소","TXT_CODE_PLUGIN_DELETE":"삭제","TXT_CODE_PLUGIN_DELETE_CONFIRM":"
|
|
2701
|
+
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"다음 노드의 동일한 플러그인도 비활성화할까요? 함께 처리할 노드를 선택하세요.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"다음 노드의 동일한 플러그인도 삭제할까요? 함께 처리할 노드를 선택하세요.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"다음 노드의 플러그인을 확인할 수 없습니다: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"다음 노드에서 플러그인 작업이 완료되지 않았습니다: {nodes}","TXT_CODE_PLUGIN_CONFIG":"플러그인 설정","TXT_CODE_PLUGIN_CANCEL":"취소","TXT_CODE_PLUGIN_DELETE":"삭제","TXT_CODE_PLUGIN_DELETE_CONFIRM":"npm 의존성을 제거합니다. 저장된 설정은 유지됩니다.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"{name} 플러그인을 삭제할까요?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"핵심 플러그인과 개발용 소스 플러그인은 여기서 제거할 수 없습니다.","TXT_CODE_PLUGIN_DELETED":"플러그인을 삭제했습니다","TXT_CODE_PLUGIN_SAVE_SETTINGS":"설정 저장","TXT_CODE_PLUGIN_SAVE_REMINDER":"설정을 저장하는 것을 잊지 마세요!","TXT_CODE_PLUGIN_DISABLE":"비활성화","TXT_CODE_PLUGIN_DISABLED":"플러그인을 비활성화했습니다","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"이 플러그인이 제공하는 모든 구성 요소가 즉시 제거됩니다.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"{name}을(를) 비활성화할까요?","TXT_CODE_PLUGIN_ENABLE":"활성화","TXT_CODE_PLUGIN_ENABLED":"플러그인을 활성화했습니다","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"웹 서버는 자신이 제공하는 패널에서 비활성화할 수 없습니다. data/plugin-overrides.json에서 plugins.server.enabled 를 false 로 설정하세요.","TXT_CODE_PLUGIN_IS_DISABLED":"이 플러그인은 비활성화되어 있습니다. 다시 활성화할 때까지 페이지, 경로, API를 사용할 수 없습니다.","TXT_CODE_PLUGIN_LOAD_FAILED":"이 플러그인을 불러오지 못했습니다","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"이 노드의 플러그인 목록을 가져올 수 없습니다.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"해당 노드가 존재하지 않습니다.","TXT_CODE_PLUGIN_NODE_OFFLINE":"연결되지 않음","TXT_CODE_PLUGIN_NODE_SELECT":"노드 선택","TXT_CODE_PLUGIN_NO_CONFIG":"이 플러그인에는 구성 가능한 옵션이 없습니다.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"미분류","TXT_CODE_PLUGIN_GROUP_ADD":"그룹 추가","TXT_CODE_PLUGIN_GROUP_EDIT":"플러그인 그룹 편집","TXT_CODE_PLUGIN_GROUP_RENAME":"그룹 이름 변경","TXT_CODE_PLUGIN_GROUP_DELETE":"그룹 삭제","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"{name} 그룹을 삭제하시겠습니까?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"그룹과 플러그인 할당이 삭제됩니다. 플러그인 자체는 삭제되지 않습니다.","TXT_CODE_PLUGIN_GROUP_NAME":"그룹 이름","TXT_CODE_PLUGIN_SCOPE_NODE":"노드","TXT_CODE_PLUGIN_SCOPE_PANEL":"패널","TXT_CODE_PLUGIN_SELF_DISABLE":"플러그인 관리자는 자신을 비활성화할 수 없습니다. data/plugin-overrides.json에서 plugins.config.enabled 를 false 로 설정하세요.","TXT_CODE_PLUGIN_STATE_PENDING":"종속성 대기 중","TXT_CODE_PLUGIN_STATE_DISABLED":"비활성","TXT_CODE_PLUGIN_STATE_LOADING":"로드 중","TXT_CODE_PLUGIN_STATE_ACTIVE":"실행 중","TXT_CODE_PLUGIN_STATE_UNLOADING":"언로드 중","TXT_CODE_PLUGIN_RESTART_REQUIRED":"변경 사항을 적용하려면 서비스를 다시 시작하세요.","TXT_CODE_PLUGIN_SAVED_PENDING":"저장되었습니다. 플러그인 종속성을 기다리는 중입니다.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"브라우저 플러그인 로드 실패","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"업데이트된 브라우저 런타임을 로드하려면 페이지를 새로 고치세요.","TXT_CODE_PLUGIN_NPM_INSTALL":"플러그인 설치 / 업데이트","TXT_CODE_PLUGIN_NPM_PACKAGE":"npm 패키지 이름","TXT_CODE_PLUGIN_NPM_VERSION":"버전 또는 태그 (기본값: latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"플러그인이 설치되고 동기화되었습니다"}');
|
|
2192
2702
|
|
|
2193
2703
|
/***/ },
|
|
2194
2704
|
|
|
2195
2705
|
/***/ "./plugins/config/src/i18n/pt_BR.json"
|
|
2196
2706
|
(module) {
|
|
2197
2707
|
|
|
2198
|
-
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Desativar também o plugin correspondente nos seguintes nós? Selecione os nós que deseja incluir.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Remover também o plugin correspondente dos seguintes nós? Selecione os nós que deseja incluir.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Não foi possível verificar os plugins nestes nós: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"A operação do plugin não foi concluída nestes nós: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Configuracao de plugins","TXT_CODE_PLUGIN_CANCEL":"Cancelar","TXT_CODE_PLUGIN_DELETE":"Remover","TXT_CODE_PLUGIN_DELETE_CONFIRM":"
|
|
2708
|
+
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Desativar também o plugin correspondente nos seguintes nós? Selecione os nós que deseja incluir.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Remover também o plugin correspondente dos seguintes nós? Selecione os nós que deseja incluir.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Não foi possível verificar os plugins nestes nós: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"A operação do plugin não foi concluída nestes nós: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Configuracao de plugins","TXT_CODE_PLUGIN_CANCEL":"Cancelar","TXT_CODE_PLUGIN_DELETE":"Remover","TXT_CODE_PLUGIN_DELETE_CONFIRM":"A dependência npm será desinstalada. As configurações salvas serão mantidas.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"Remover {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Plugins essenciais e de código-fonte não podem ser desinstalados aqui.","TXT_CODE_PLUGIN_DELETED":"Plugin removido","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Salvar configurações","TXT_CODE_PLUGIN_SAVE_REMINDER":"Lembre-se de salvar as configurações!","TXT_CODE_PLUGIN_DISABLE":"Desativar","TXT_CODE_PLUGIN_DISABLED":"Plugin desativado","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Tudo o que este plugin fornece é removido de imediato.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"Desativar {name}?","TXT_CODE_PLUGIN_ENABLE":"Ativar","TXT_CODE_PLUGIN_ENABLED":"Plugin ativado","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"O servidor web não pode ser desativado pelo painel que ele mesmo serve. Defina plugins.server.enabled como false no data/plugin-overrides.json dele.","TXT_CODE_PLUGIN_IS_DISABLED":"Este plugin está desativado. Suas páginas, rotas e API ficam indisponíveis até ser ativado novamente.","TXT_CODE_PLUGIN_LOAD_FAILED":"Falha ao carregar este plugin","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Não foi possível listar os plugins deste nó.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Esse nó não existe.","TXT_CODE_PLUGIN_NODE_OFFLINE":"não conectado","TXT_CODE_PLUGIN_NODE_SELECT":"Selecionar um nó","TXT_CODE_PLUGIN_NO_CONFIG":"Este plugin nao possui opcoes configuraveis.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Não atribuídos","TXT_CODE_PLUGIN_GROUP_ADD":"Adicionar grupo","TXT_CODE_PLUGIN_GROUP_EDIT":"Editar grupo de plugins","TXT_CODE_PLUGIN_GROUP_RENAME":"Renomear grupo","TXT_CODE_PLUGIN_GROUP_DELETE":"Excluir grupo","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Excluir o grupo {name}?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"O grupo e suas associações de plugins serão removidos. Os plugins não serão excluídos.","TXT_CODE_PLUGIN_GROUP_NAME":"Nome do grupo","TXT_CODE_PLUGIN_SCOPE_NODE":"Nós","TXT_CODE_PLUGIN_SCOPE_PANEL":"Painel","TXT_CODE_PLUGIN_SELF_DISABLE":"O gerenciador de plugins não pode desativar a si mesmo. Defina plugins.config.enabled como false no data/plugin-overrides.json dele.","TXT_CODE_PLUGIN_STATE_PENDING":"Aguardando dependências","TXT_CODE_PLUGIN_STATE_DISABLED":"Desativado","TXT_CODE_PLUGIN_STATE_LOADING":"Carregando","TXT_CODE_PLUGIN_STATE_ACTIVE":"Em execução","TXT_CODE_PLUGIN_STATE_UNLOADING":"Descarregando","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Reinicie o serviço para aplicar a alteração.","TXT_CODE_PLUGIN_SAVED_PENDING":"Salvo; aguardando dependências do plugin.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Falha no plugin do navegador","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Atualize a página para carregar o novo ambiente do navegador.","TXT_CODE_PLUGIN_NPM_INSTALL":"Instalar / atualizar plugin","TXT_CODE_PLUGIN_NPM_PACKAGE":"Nome do pacote npm","TXT_CODE_PLUGIN_NPM_VERSION":"Versão ou tag (latest por padrão)","TXT_CODE_PLUGIN_NPM_INSTALLED":"Plugin instalado e sincronizado"}');
|
|
2199
2709
|
|
|
2200
2710
|
/***/ },
|
|
2201
2711
|
|
|
2202
2712
|
/***/ "./plugins/config/src/i18n/ru_RU.json"
|
|
2203
2713
|
(module) {
|
|
2204
2714
|
|
|
2205
|
-
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Отключить соответствующий плагин также на следующих узлах? Выберите нужные узлы.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Удалить соответствующий плагин также со следующих узлов? Выберите нужные узлы.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Не удалось проверить плагины на этих узлах: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"Операция с плагином не завершена на этих узлах: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Настройка плагинов","TXT_CODE_PLUGIN_CANCEL":"Отмена","TXT_CODE_PLUGIN_DELETE":"Удалить","TXT_CODE_PLUGIN_DELETE_CONFIRM":"
|
|
2715
|
+
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Отключить соответствующий плагин также на следующих узлах? Выберите нужные узлы.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Удалить соответствующий плагин также со следующих узлов? Выберите нужные узлы.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Не удалось проверить плагины на этих узлах: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"Операция с плагином не завершена на этих узлах: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Настройка плагинов","TXT_CODE_PLUGIN_CANCEL":"Отмена","TXT_CODE_PLUGIN_DELETE":"Удалить","TXT_CODE_PLUGIN_DELETE_CONFIRM":"Зависимость npm будет удалена. Сохранённые настройки останутся.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"Удалить {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Основные плагины и плагины из исходного кода нельзя удалить здесь.","TXT_CODE_PLUGIN_DELETED":"Плагин удалён","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Сохранить настройки","TXT_CODE_PLUGIN_SAVE_REMINDER":"Не забудьте сохранить настройки!","TXT_CODE_PLUGIN_DISABLE":"Отключить","TXT_CODE_PLUGIN_DISABLED":"Плагин отключён","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Всё, что предоставляет этот плагин, будет удалено сразу.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"Отключить {name}?","TXT_CODE_PLUGIN_ENABLE":"Включить","TXT_CODE_PLUGIN_ENABLED":"Плагин включён","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Веб-сервер нельзя отключить из панели, которую он сам и обслуживает. Укажите plugins.server.enabled: false в его data/plugin-overrides.json.","TXT_CODE_PLUGIN_IS_DISABLED":"Этот плагин отключён. Его страницы, маршруты и API недоступны, пока он не будет включён снова.","TXT_CODE_PLUGIN_LOAD_FAILED":"Не удалось загрузить этот плагин","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Не удалось получить список плагинов этого узла.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Такого узла не существует.","TXT_CODE_PLUGIN_NODE_OFFLINE":"не подключён","TXT_CODE_PLUGIN_NODE_SELECT":"Выберите узел","TXT_CODE_PLUGIN_NO_CONFIG":"У этого плагина нет настраиваемых параметров.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Без группы","TXT_CODE_PLUGIN_GROUP_ADD":"Добавить группу","TXT_CODE_PLUGIN_GROUP_EDIT":"Редактировать группу плагинов","TXT_CODE_PLUGIN_GROUP_RENAME":"Переименовать группу","TXT_CODE_PLUGIN_GROUP_DELETE":"Удалить группу","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Удалить группу {name}?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Группа и привязанные к ней плагины будут удалены из списка. Сами плагины удалены не будут.","TXT_CODE_PLUGIN_GROUP_NAME":"Название группы","TXT_CODE_PLUGIN_SCOPE_NODE":"Узлы","TXT_CODE_PLUGIN_SCOPE_PANEL":"Панель","TXT_CODE_PLUGIN_SELF_DISABLE":"Менеджер плагинов не может отключить сам себя. Укажите plugins.config.enabled: false в его data/plugin-overrides.json.","TXT_CODE_PLUGIN_STATE_PENDING":"Ожидание зависимостей","TXT_CODE_PLUGIN_STATE_DISABLED":"Отключён","TXT_CODE_PLUGIN_STATE_LOADING":"Загрузка","TXT_CODE_PLUGIN_STATE_ACTIVE":"Работает","TXT_CODE_PLUGIN_STATE_UNLOADING":"Выгрузка","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Перезапустите службу, чтобы применить изменение.","TXT_CODE_PLUGIN_SAVED_PENDING":"Сохранено; ожидание зависимостей плагина.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Ошибка плагина браузера","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Обновите страницу для загрузки новой среды браузера.","TXT_CODE_PLUGIN_NPM_INSTALL":"Установить / обновить плагин","TXT_CODE_PLUGIN_NPM_PACKAGE":"Имя пакета npm","TXT_CODE_PLUGIN_NPM_VERSION":"Версия или тег (по умолчанию latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"Плагин установлен и синхронизирован"}');
|
|
2206
2716
|
|
|
2207
2717
|
/***/ },
|
|
2208
2718
|
|
|
2209
2719
|
/***/ "./plugins/config/src/i18n/th_TH.json"
|
|
2210
2720
|
(module) {
|
|
2211
2721
|
|
|
2212
|
-
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"ต้องการปิดใช้งานปลั๊กอินเดียวกันบนโหนดต่อไปนี้ด้วยหรือไม่? เลือกโหนดที่ต้องการดำเนินการด้วย","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"ต้องการลบปลั๊กอินเดียวกันออกจากโหนดต่อไปนี้ด้วยหรือไม่? เลือกโหนดที่ต้องการดำเนินการด้วย","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"ไม่สามารถตรวจสอบปลั๊กอินบนโหนดเหล่านี้ได้: {nodes}","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"การดำเนินการกับปลั๊กอินบนโหนดเหล่านี้ไม่สำเร็จ: {nodes}","TXT_CODE_PLUGIN_CONFIG":"การกำหนดค่าปลั๊กอิน","TXT_CODE_PLUGIN_CANCEL":"ยกเลิก","TXT_CODE_PLUGIN_DELETE":"ลบ","TXT_CODE_PLUGIN_DELETE_CONFIRM":"
|
|
2722
|
+
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"ต้องการปิดใช้งานปลั๊กอินเดียวกันบนโหนดต่อไปนี้ด้วยหรือไม่? เลือกโหนดที่ต้องการดำเนินการด้วย","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"ต้องการลบปลั๊กอินเดียวกันออกจากโหนดต่อไปนี้ด้วยหรือไม่? เลือกโหนดที่ต้องการดำเนินการด้วย","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"ไม่สามารถตรวจสอบปลั๊กอินบนโหนดเหล่านี้ได้: {nodes}","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"การดำเนินการกับปลั๊กอินบนโหนดเหล่านี้ไม่สำเร็จ: {nodes}","TXT_CODE_PLUGIN_CONFIG":"การกำหนดค่าปลั๊กอิน","TXT_CODE_PLUGIN_CANCEL":"ยกเลิก","TXT_CODE_PLUGIN_DELETE":"ลบ","TXT_CODE_PLUGIN_DELETE_CONFIRM":"จะถอนการติดตั้งแพ็กเกจ npm โดยเก็บการตั้งค่าที่บันทึกไว้","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"ลบ {name} หรือไม่?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"ไม่สามารถถอนการติดตั้งปลั๊กอินหลักและปลั๊กอินซอร์สโค้ดที่นี่ได้","TXT_CODE_PLUGIN_DELETED":"ลบปลั๊กอินแล้ว","TXT_CODE_PLUGIN_SAVE_SETTINGS":"บันทึกการตั้งค่า","TXT_CODE_PLUGIN_SAVE_REMINDER":"อย่าลืมบันทึกการตั้งค่า!","TXT_CODE_PLUGIN_DISABLE":"ปิดใช้งาน","TXT_CODE_PLUGIN_DISABLED":"ปิดใช้งานปลั๊กอินแล้ว","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"ทุกอย่างที่ปลั๊กอินนี้ให้มาจะถูกลบออกทันที","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"ปิดใช้งาน {name} หรือไม่?","TXT_CODE_PLUGIN_ENABLE":"เปิดใช้งาน","TXT_CODE_PLUGIN_ENABLED":"เปิดใช้งานปลั๊กอินแล้ว","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"ไม่สามารถปิดใช้งานเว็บเซิร์ฟเวอร์จากแผงควบคุมที่ตัวมันเองให้บริการอยู่ กรุณาตั้ง plugins.server.enabled เป็น false ใน data/plugin-overrides.json ของมันแทน","TXT_CODE_PLUGIN_IS_DISABLED":"ปลั๊กอินนี้ถูกปิดใช้งาน หน้า เส้นทาง และ API จะใช้ไม่ได้จนกว่าจะเปิดใช้งานอีกครั้ง","TXT_CODE_PLUGIN_LOAD_FAILED":"โหลดปลั๊กอินนี้ไม่สำเร็จ","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"ไม่สามารถแสดงรายการปลั๊กอินของโหนดนี้ได้","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"ไม่มีโหนดนี้","TXT_CODE_PLUGIN_NODE_OFFLINE":"ไม่ได้เชื่อมต่อ","TXT_CODE_PLUGIN_NODE_SELECT":"เลือกโหนด","TXT_CODE_PLUGIN_NO_CONFIG":"ปลั๊กอินนี้ไม่มีตัวเลือกที่กำหนดค่าได้","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"ยังไม่ได้จัดกลุ่ม","TXT_CODE_PLUGIN_GROUP_ADD":"เพิ่มกลุ่ม","TXT_CODE_PLUGIN_GROUP_EDIT":"แก้ไขกลุ่มปลั๊กอิน","TXT_CODE_PLUGIN_GROUP_RENAME":"เปลี่ยนชื่อกลุ่ม","TXT_CODE_PLUGIN_GROUP_DELETE":"ลบกลุ่ม","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"ลบกลุ่ม {name} หรือไม่","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"กลุ่มและการกำหนดปลั๊กอินจะถูกลบ ปลั๊กอินจะไม่ถูกลบ","TXT_CODE_PLUGIN_GROUP_NAME":"ชื่อกลุ่ม","TXT_CODE_PLUGIN_SCOPE_NODE":"โหนด","TXT_CODE_PLUGIN_SCOPE_PANEL":"แผงควบคุม","TXT_CODE_PLUGIN_SELF_DISABLE":"ตัวจัดการปลั๊กอินปิดใช้งานตัวเองไม่ได้ กรุณาตั้ง plugins.config.enabled เป็น false ใน data/plugin-overrides.json ของมันแทน","TXT_CODE_PLUGIN_STATE_PENDING":"กำลังรอส่วนที่ต้องพึ่งพา","TXT_CODE_PLUGIN_STATE_DISABLED":"ปิดใช้งาน","TXT_CODE_PLUGIN_STATE_LOADING":"กำลังโหลด","TXT_CODE_PLUGIN_STATE_ACTIVE":"กำลังทำงาน","TXT_CODE_PLUGIN_STATE_UNLOADING":"กำลังยกเลิกการโหลด","TXT_CODE_PLUGIN_RESTART_REQUIRED":"รีสตาร์ทบริการเพื่อใช้การเปลี่ยนแปลงนี้","TXT_CODE_PLUGIN_SAVED_PENDING":"บันทึกแล้ว กำลังรอส่วนที่ปลั๊กอินต้องพึ่งพา","TXT_CODE_PLUGIN_FRONTEND_FAILED":"ปลั๊กอินเบราว์เซอร์ล้มเหลว","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"รีเฟรชหน้าเพื่อโหลดรันไทม์เบราว์เซอร์ที่อัปเดต","TXT_CODE_PLUGIN_NPM_INSTALL":"ติดตั้ง / อัปเดตปลั๊กอิน","TXT_CODE_PLUGIN_NPM_PACKAGE":"ชื่อแพ็กเกจ npm","TXT_CODE_PLUGIN_NPM_VERSION":"เวอร์ชันหรือแท็ก (ค่าเริ่มต้น latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"ติดตั้งและซิงค์ปลั๊กอินแล้ว"}');
|
|
2213
2723
|
|
|
2214
2724
|
/***/ },
|
|
2215
2725
|
|
|
2216
2726
|
/***/ "./plugins/config/src/i18n/tr_TR.json"
|
|
2217
2727
|
(module) {
|
|
2218
2728
|
|
|
2219
|
-
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Aşağıdaki düğümlerdeki aynı eklenti de devre dışı bırakılsın mı? Dahil edilecek düğümleri seçin.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Aşağıdaki düğümlerdeki aynı eklenti de kaldırılsın mı? Dahil edilecek düğümleri seçin.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Bu düğümlerdeki eklentiler kontrol edilemedi: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"Bu düğümlerde eklenti işlemi tamamlanamadı: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Eklenti Yapilandirmasi","TXT_CODE_PLUGIN_CANCEL":"Iptal","TXT_CODE_PLUGIN_DELETE":"Kaldır","TXT_CODE_PLUGIN_DELETE_CONFIRM":"
|
|
2729
|
+
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Aşağıdaki düğümlerdeki aynı eklenti de devre dışı bırakılsın mı? Dahil edilecek düğümleri seçin.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Aşağıdaki düğümlerdeki aynı eklenti de kaldırılsın mı? Dahil edilecek düğümleri seçin.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Bu düğümlerdeki eklentiler kontrol edilemedi: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"Bu düğümlerde eklenti işlemi tamamlanamadı: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Eklenti Yapilandirmasi","TXT_CODE_PLUGIN_CANCEL":"Iptal","TXT_CODE_PLUGIN_DELETE":"Kaldır","TXT_CODE_PLUGIN_DELETE_CONFIRM":"npm bağımlılığı kaldırılacak. Kaydedilen ayarlar korunacak.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"{name} kaldırılsın mı?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Temel eklentiler ve kaynak kod eklentileri buradan kaldırılamaz.","TXT_CODE_PLUGIN_DELETED":"Eklenti kaldırıldı","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Ayarları kaydet","TXT_CODE_PLUGIN_SAVE_REMINDER":"Ayarları kaydetmeyi unutmayın!","TXT_CODE_PLUGIN_DISABLE":"Devre dışı bırak","TXT_CODE_PLUGIN_DISABLED":"Eklenti devre dışı bırakıldı","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Bu eklentinin sağladığı her şey hemen kaldırılır.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"{name} devre dışı bırakılsın mı?","TXT_CODE_PLUGIN_ENABLE":"Etkinleştir","TXT_CODE_PLUGIN_ENABLED":"Eklenti etkinleştirildi","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Web sunucusu, kendisinin sunduğu panel üzerinden devre dışı bırakılamaz. Bunun yerine data/plugin-overrides.json dosyasında plugins.server.enabled değerini false yapın.","TXT_CODE_PLUGIN_IS_DISABLED":"Bu eklenti devre dışı. Yeniden etkinleştirilene kadar sayfaları, yolları ve API si kullanılamaz.","TXT_CODE_PLUGIN_LOAD_FAILED":"Bu eklenti yüklenemedi","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Bu düğümün eklentileri listelenemedi.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Böyle bir düğüm yok.","TXT_CODE_PLUGIN_NODE_OFFLINE":"bağlı değil","TXT_CODE_PLUGIN_NODE_SELECT":"Bir düğüm seçin","TXT_CODE_PLUGIN_NO_CONFIG":"Bu eklentinin yapilandirilabilir secenegi yok.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Atanmamış","TXT_CODE_PLUGIN_GROUP_ADD":"Grup ekle","TXT_CODE_PLUGIN_GROUP_EDIT":"Eklenti grubunu düzenle","TXT_CODE_PLUGIN_GROUP_RENAME":"Grubu yeniden adlandır","TXT_CODE_PLUGIN_GROUP_DELETE":"Grubu sil","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"{name} grubu silinsin mi?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Grup ve eklenti atamaları kaldırılacak. Eklentilerin kendisi silinmeyecek.","TXT_CODE_PLUGIN_GROUP_NAME":"Grup adı","TXT_CODE_PLUGIN_SCOPE_NODE":"Düğümler","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panel","TXT_CODE_PLUGIN_SELF_DISABLE":"Eklenti yöneticisi kendisini devre dışı bırakamaz. Bunun yerine data/plugin-overrides.json dosyasında plugins.config.enabled değerini false yapın.","TXT_CODE_PLUGIN_STATE_PENDING":"Bağımlılıklar bekleniyor","TXT_CODE_PLUGIN_STATE_DISABLED":"Devre dışı","TXT_CODE_PLUGIN_STATE_LOADING":"Yükleniyor","TXT_CODE_PLUGIN_STATE_ACTIVE":"Çalışıyor","TXT_CODE_PLUGIN_STATE_UNLOADING":"Kaldırılıyor","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Değişikliği uygulamak için hizmeti yeniden başlatın.","TXT_CODE_PLUGIN_SAVED_PENDING":"Kaydedildi; eklenti bağımlılıkları bekleniyor.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Tarayıcı eklentisi başarısız oldu","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Güncellenen tarayıcı çalışma zamanını yüklemek için sayfayı yenileyin.","TXT_CODE_PLUGIN_NPM_INSTALL":"Eklenti yükle / güncelle","TXT_CODE_PLUGIN_NPM_PACKAGE":"npm paket adı","TXT_CODE_PLUGIN_NPM_VERSION":"Sürüm veya etiket (varsayılan: latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"Eklenti yüklendi ve eşitlendi"}');
|
|
2220
2730
|
|
|
2221
2731
|
/***/ },
|
|
2222
2732
|
|
|
2223
2733
|
/***/ "./plugins/config/src/i18n/zh_CN.json"
|
|
2224
2734
|
(module) {
|
|
2225
2735
|
|
|
2226
|
-
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"是否同时禁用以下节点上的对应插件?请勾选需要同步操作的节点。","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"是否同时删除以下节点上的对应插件?请勾选需要同步操作的节点。","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"无法检查以下节点的插件:{nodes}。","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"以下节点上的插件操作未完成:{nodes}","TXT_CODE_PLUGIN_CONFIG":"插件配置","TXT_CODE_PLUGIN_CANCEL":"取消","TXT_CODE_PLUGIN_DELETE":"删除插件","TXT_CODE_PLUGIN_DELETE_CONFIRM":"
|
|
2736
|
+
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"是否同时禁用以下节点上的对应插件?请勾选需要同步操作的节点。","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"是否同时删除以下节点上的对应插件?请勾选需要同步操作的节点。","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"无法检查以下节点的插件:{nodes}。","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"以下节点上的插件操作未完成:{nodes}","TXT_CODE_PLUGIN_CONFIG":"插件配置","TXT_CODE_PLUGIN_CANCEL":"取消","TXT_CODE_PLUGIN_DELETE":"删除插件","TXT_CODE_PLUGIN_DELETE_CONFIRM":"将卸载此插件的 npm 依赖,保留已保存的配置。","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"确定删除 {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"核心插件和开发环境的源码插件无法在此卸载。","TXT_CODE_PLUGIN_DELETED":"插件已删除","TXT_CODE_PLUGIN_SAVE_SETTINGS":"保存配置","TXT_CODE_PLUGIN_SAVE_REMINDER":"记得保存配置!","TXT_CODE_PLUGIN_DISABLE":"禁用","TXT_CODE_PLUGIN_DISABLED":"插件已禁用","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"该插件提供的所有组件都会被立即移除。","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"确定禁用 {name}?","TXT_CODE_PLUGIN_ENABLE":"启用","TXT_CODE_PLUGIN_ENABLED":"插件已启用","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Web 服务器无法从它自己提供的页面上禁用,请改为在其 data/plugin-overrides.json 中把 plugins.server.enabled 设为 false。","TXT_CODE_PLUGIN_IS_DISABLED":"此插件已禁用,重新启用前其页面、路由与接口均不可用。","TXT_CODE_PLUGIN_LOAD_FAILED":"此插件加载失败","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"无法读取该节点的插件列表。","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"该节点不存在。","TXT_CODE_PLUGIN_NODE_OFFLINE":"未连接","TXT_CODE_PLUGIN_NODE_SELECT":"选择节点","TXT_CODE_PLUGIN_NO_CONFIG":"此插件没有可配置项","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"未分组","TXT_CODE_PLUGIN_GROUP_ADD":"添加分组","TXT_CODE_PLUGIN_GROUP_EDIT":"编辑插件分组","TXT_CODE_PLUGIN_GROUP_RENAME":"重命名分组","TXT_CODE_PLUGIN_GROUP_DELETE":"删除分组","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"删除分组“{name}”?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"将删除该分组及其插件归属,插件本身不会被删除。","TXT_CODE_PLUGIN_GROUP_NAME":"分组名称","TXT_CODE_PLUGIN_SCOPE_NODE":"节点","TXT_CODE_PLUGIN_SCOPE_PANEL":"面板","TXT_CODE_PLUGIN_SELF_DISABLE":"插件管理自身无法被禁用,请改为在其 data/plugin-overrides.json 中把 plugins.config.enabled 设为 false。","TXT_CODE_PLUGIN_STATE_PENDING":"等待依赖","TXT_CODE_PLUGIN_STATE_DISABLED":"已禁用","TXT_CODE_PLUGIN_STATE_LOADING":"加载中","TXT_CODE_PLUGIN_STATE_ACTIVE":"运行中","TXT_CODE_PLUGIN_STATE_UNLOADING":"卸载中","TXT_CODE_PLUGIN_RESTART_REQUIRED":"需要重启服务才能应用此更改。","TXT_CODE_PLUGIN_SAVED_PENDING":"已保存,正在等待插件依赖。","TXT_CODE_PLUGIN_FRONTEND_FAILED":"浏览器插件加载失败","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"需要刷新页面才能加载更新后的浏览器运行时。","TXT_CODE_PLUGIN_NPM_INSTALL":"安装 / 更新插件","TXT_CODE_PLUGIN_NPM_PACKAGE":"npm 包名","TXT_CODE_PLUGIN_NPM_VERSION":"版本号或标签(默认 latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"插件已安装并同步"}');
|
|
2227
2737
|
|
|
2228
2738
|
/***/ },
|
|
2229
2739
|
|
|
2230
2740
|
/***/ "./plugins/config/src/i18n/zh_TW.json"
|
|
2231
2741
|
(module) {
|
|
2232
2742
|
|
|
2233
|
-
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"是否同時停用以下節點上的對應外掛?請勾選需要同步操作的節點。","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"是否同時刪除以下節點上的對應外掛?請勾選需要同步操作的節點。","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"無法檢查以下節點的外掛:{nodes}。","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"以下節點上的外掛操作未完成:{nodes}","TXT_CODE_PLUGIN_CONFIG":"插件設定","TXT_CODE_PLUGIN_CANCEL":"取消","TXT_CODE_PLUGIN_DELETE":"刪除外掛","TXT_CODE_PLUGIN_DELETE_CONFIRM":"
|
|
2743
|
+
module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"是否同時停用以下節點上的對應外掛?請勾選需要同步操作的節點。","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"是否同時刪除以下節點上的對應外掛?請勾選需要同步操作的節點。","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"無法檢查以下節點的外掛:{nodes}。","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"以下節點上的外掛操作未完成:{nodes}","TXT_CODE_PLUGIN_CONFIG":"插件設定","TXT_CODE_PLUGIN_CANCEL":"取消","TXT_CODE_PLUGIN_DELETE":"刪除外掛","TXT_CODE_PLUGIN_DELETE_CONFIRM":"將解除安裝此外掛的 npm 相依套件,保留已儲存的設定。","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"確定刪除 {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"核心外掛與開發環境的原始碼外掛無法在此解除安裝。","TXT_CODE_PLUGIN_DELETED":"外掛已刪除","TXT_CODE_PLUGIN_SAVE_SETTINGS":"儲存設定","TXT_CODE_PLUGIN_SAVE_REMINDER":"記得儲存設定!","TXT_CODE_PLUGIN_DISABLE":"停用","TXT_CODE_PLUGIN_DISABLED":"外掛已停用","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"該外掛提供的所有元件都會被立即移除。","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"確定停用 {name}?","TXT_CODE_PLUGIN_ENABLE":"啟用","TXT_CODE_PLUGIN_ENABLED":"外掛已啟用","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Web 伺服器無法從它自己提供的頁面上停用,請改為在其 data/plugin-overrides.json 中把 plugins.server.enabled 設為 false。","TXT_CODE_PLUGIN_IS_DISABLED":"此外掛已停用,重新啟用前其頁面、路由與介面皆不可用。","TXT_CODE_PLUGIN_LOAD_FAILED":"此外掛載入失敗","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"無法讀取該節點的外掛清單。","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"該節點不存在。","TXT_CODE_PLUGIN_NODE_OFFLINE":"未連線","TXT_CODE_PLUGIN_NODE_SELECT":"選擇節點","TXT_CODE_PLUGIN_NO_CONFIG":"此插件沒有可設定項目","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"未分組","TXT_CODE_PLUGIN_GROUP_ADD":"新增分組","TXT_CODE_PLUGIN_GROUP_EDIT":"編輯外掛分組","TXT_CODE_PLUGIN_GROUP_RENAME":"重新命名分組","TXT_CODE_PLUGIN_GROUP_DELETE":"刪除分組","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"刪除分組「{name}」?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"將刪除該分組及其插件歸屬,插件本身不會被刪除。","TXT_CODE_PLUGIN_GROUP_NAME":"分組名稱","TXT_CODE_PLUGIN_SCOPE_NODE":"節點","TXT_CODE_PLUGIN_SCOPE_PANEL":"面板","TXT_CODE_PLUGIN_SELF_DISABLE":"外掛管理本身無法被停用,請改為在其 data/plugin-overrides.json 中把 plugins.config.enabled 設為 false。","TXT_CODE_PLUGIN_STATE_PENDING":"等待依賴","TXT_CODE_PLUGIN_STATE_DISABLED":"已停用","TXT_CODE_PLUGIN_STATE_LOADING":"載入中","TXT_CODE_PLUGIN_STATE_ACTIVE":"執行中","TXT_CODE_PLUGIN_STATE_UNLOADING":"卸載中","TXT_CODE_PLUGIN_RESTART_REQUIRED":"需要重新啟動服務才能套用此變更。","TXT_CODE_PLUGIN_SAVED_PENDING":"已儲存,正在等待外掛依賴。","TXT_CODE_PLUGIN_FRONTEND_FAILED":"瀏覽器外掛載入失敗","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"需要重新整理頁面才能載入更新後的瀏覽器執行階段。","TXT_CODE_PLUGIN_NPM_INSTALL":"安裝 / 更新外掛","TXT_CODE_PLUGIN_NPM_PACKAGE":"npm 套件名稱","TXT_CODE_PLUGIN_NPM_VERSION":"版本或標籤(預設 latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"外掛已安裝並同步"}');
|
|
2234
2744
|
|
|
2235
2745
|
/***/ }
|
|
2236
2746
|
|
|
@@ -2397,7 +2907,9 @@ function apply(ctx) {
|
|
|
2397
2907
|
const groupsStorageId = (requestCtx) => String(ctx.identity.of(requestCtx).uuid || "anonymous");
|
|
2398
2908
|
router.get("/groups", requireAdmin, async (requestCtx) => {
|
|
2399
2909
|
var _a;
|
|
2400
|
-
const stored = (await ctx.storage
|
|
2910
|
+
const stored = (await ctx.storage
|
|
2911
|
+
.getStorage()
|
|
2912
|
+
.load(PLUGIN_GROUPS_CATEGORY, StoredPluginGroups, groupsStorageId(requestCtx)));
|
|
2401
2913
|
requestCtx.body = (_a = stored === null || stored === void 0 ? void 0 : stored.groups) !== null && _a !== void 0 ? _a : [];
|
|
2402
2914
|
});
|
|
2403
2915
|
router.put("/groups", requireAdmin, async (requestCtx) => {
|
|
@@ -2423,6 +2935,14 @@ function apply(ctx) {
|
|
|
2423
2935
|
await ctx.plugins.remove(String(requestCtx.request.query.id));
|
|
2424
2936
|
requestCtx.body = { removed: true };
|
|
2425
2937
|
});
|
|
2938
|
+
router.post("/npm/install", requireAdmin, ctx.middleware.validator({ body: { name: String } }), async (requestCtx) => {
|
|
2939
|
+
var _a;
|
|
2940
|
+
const payload = requestCtx.request.body;
|
|
2941
|
+
requestCtx.body = await ctx.plugins.install({
|
|
2942
|
+
name: payload.name.trim(),
|
|
2943
|
+
version: ((_a = payload.version) === null || _a === void 0 ? void 0 : _a.trim()) || undefined
|
|
2944
|
+
});
|
|
2945
|
+
});
|
|
2426
2946
|
// The node half. `remote` is resolved here rather than injected at the top, so
|
|
2427
2947
|
// removing `plugins/node` takes the node routes away and leaves the rest of the
|
|
2428
2948
|
// page working.
|
|
@@ -2463,22 +2983,29 @@ function apply(ctx) {
|
|
|
2463
2983
|
// switch off is the daemon's own business, and its refusal arrives as a
|
|
2464
2984
|
// protocol error that the response protocol turns into this envelope.
|
|
2465
2985
|
const record = await new RemoteRequest(node).request("plugin/enabled", { id, enabled });
|
|
2466
|
-
//
|
|
2467
|
-
//
|
|
2468
|
-
// or just gone — is invisible to the connection we are holding. The node
|
|
2469
|
-
// is reconnected here, which is the only thing that makes the change
|
|
2470
|
-
// actually reachable; the daemon has already answered by now.
|
|
2986
|
+
// Older daemons bind routes per socket; reconnect after their reply
|
|
2987
|
+
// so newly enabled handlers remain available there too.
|
|
2471
2988
|
node.refreshReconnect();
|
|
2472
2989
|
requestCtx.body = record;
|
|
2473
2990
|
});
|
|
2474
2991
|
nodeRouter.delete("/", requireAdmin, ctx.middleware.validator({ query: { daemonId: String, id: String } }), async (requestCtx) => {
|
|
2475
2992
|
const node = nodeOf(requestCtx);
|
|
2476
2993
|
// Removing unloads the plugin's scope before the files go, which can
|
|
2477
|
-
// outlast the default request window
|
|
2478
|
-
await new RemoteRequest(node).request("plugin/remove", { id: String(requestCtx.request.query.id) },
|
|
2994
|
+
// outlast the default request window.
|
|
2995
|
+
await new RemoteRequest(node).request("plugin/remove", { id: String(requestCtx.request.query.id) }, 10 * 60 * 1000);
|
|
2479
2996
|
node.refreshReconnect();
|
|
2480
2997
|
requestCtx.body = { removed: true };
|
|
2481
2998
|
});
|
|
2999
|
+
nodeRouter.post("/npm/install", requireAdmin, ctx.middleware.validator({ query: { daemonId: String }, body: { name: String } }), async (requestCtx) => {
|
|
3000
|
+
var _a;
|
|
3001
|
+
const node = nodeOf(requestCtx);
|
|
3002
|
+
const payload = requestCtx.request.body;
|
|
3003
|
+
requestCtx.body = await new RemoteRequest(node).request("plugin/npm/install", {
|
|
3004
|
+
name: payload.name.trim(),
|
|
3005
|
+
version: ((_a = payload.version) === null || _a === void 0 ? void 0 : _a.trim()) || undefined
|
|
3006
|
+
}, 10 * 60 * 1000);
|
|
3007
|
+
node.refreshReconnect();
|
|
3008
|
+
});
|
|
2482
3009
|
// A daemon plugin's configuration, described by the plugin itself and
|
|
2483
3010
|
// rendered by the same generic form. Nothing about the form lives here.
|
|
2484
3011
|
nodeRouter.get("/settings", requireAdmin, ctx.middleware.validator({ query: { daemonId: String, id: String } }), async (requestCtx) => {
|