obsidian-dev-utils 96.6.0 → 98.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/LICENSE +1 -1
- package/dist/integration-test-plugin/main.js +1762 -4197
- package/dist/lib/cjs/__merged.cjs +17 -9
- package/dist/lib/cjs/__merged.d.cts +3 -1
- package/dist/lib/cjs/desktop-zip-extractor.cjs +276 -0
- package/dist/lib/cjs/desktop-zip-extractor.d.cts +94 -0
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +38 -38
- package/dist/lib/cjs/obsidian/demo-vault-naming.cjs +167 -0
- package/dist/lib/cjs/obsidian/demo-vault-naming.d.cts +54 -0
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +20 -21
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +21 -16
- package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +9 -9
- package/dist/lib/cjs/obsidian/desktop-trusted-input.d.cts +23 -4
- package/dist/lib/cjs/obsidian/index.cjs +10 -1
- package/dist/lib/cjs/obsidian/index.d.cts +3 -0
- package/dist/lib/cjs/obsidian/mobile-trusted-input.cjs +195 -0
- package/dist/lib/cjs/obsidian/mobile-trusted-input.d.cts +93 -0
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -1
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +4 -0
- package/dist/lib/cjs/obsidian/resource-lock.cjs +122 -122
- package/dist/lib/cjs/obsidian/trusted-input.cjs +206 -0
- package/dist/lib/cjs/obsidian/trusted-input.d.cts +126 -0
- package/dist/lib/cjs/script-utils/build.cjs +30 -6
- package/dist/lib/cjs/script-utils/build.d.cts +5 -0
- package/dist/lib/cjs/script-utils/demo-vault.cjs +26 -6
- package/dist/lib/cjs/script-utils/demo-vault.d.cts +12 -8
- package/dist/lib/cjs/script-utils/exec.cjs +1 -1
- package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -2
- package/dist/lib/cjs/script-utils/index.cjs +4 -1
- package/dist/lib/cjs/script-utils/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/cspell.cjs +3 -3
- package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +39 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +16 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +5 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.cjs +254 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.d.cts +54 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.cjs +217 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.d.cts +141 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.cjs +214 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.d.cts +32 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.cjs +215 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.d.cts +30 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.cjs +318 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.d.cts +45 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +9 -1
- package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -2
- package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +4 -4
- package/dist/lib/cjs/script-utils/npm-run.cjs +4 -3
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +10 -1
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +37 -1
- package/dist/lib/cjs/script-utils/package-manager.cjs +287 -0
- package/dist/lib/cjs/script-utils/package-manager.d.cts +77 -0
- package/dist/lib/cjs/script-utils/version.cjs +21 -9
- package/dist/lib/esm/__merged.d.mts +3 -1
- package/dist/lib/esm/__merged.mjs +18 -10
- package/dist/lib/esm/desktop-zip-extractor.d.mts +94 -0
- package/dist/lib/esm/desktop-zip-extractor.mjs +174 -0
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +38 -38
- package/dist/lib/esm/obsidian/demo-vault-naming.d.mts +54 -0
- package/dist/lib/esm/obsidian/demo-vault-naming.mjs +61 -0
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +21 -16
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +23 -11
- package/dist/lib/esm/obsidian/desktop-trusted-input.d.mts +23 -4
- package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +9 -9
- package/dist/lib/esm/obsidian/index.d.mts +3 -0
- package/dist/lib/esm/obsidian/index.mjs +7 -1
- package/dist/lib/esm/obsidian/mobile-trusted-input.d.mts +93 -0
- package/dist/lib/esm/obsidian/mobile-trusted-input.mjs +84 -0
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +4 -0
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -1
- package/dist/lib/esm/obsidian/resource-lock.mjs +122 -122
- package/dist/lib/esm/obsidian/trusted-input.d.mts +126 -0
- package/dist/lib/esm/obsidian/trusted-input.mjs +85 -0
- package/dist/lib/esm/script-utils/build.d.mts +5 -0
- package/dist/lib/esm/script-utils/build.mjs +30 -6
- package/dist/lib/esm/script-utils/demo-vault.d.mts +12 -8
- package/dist/lib/esm/script-utils/demo-vault.mjs +29 -6
- package/dist/lib/esm/script-utils/exec.mjs +1 -1
- package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -2
- package/dist/lib/esm/script-utils/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/index.mjs +3 -1
- package/dist/lib/esm/script-utils/linters/cspell.mjs +3 -3
- package/dist/lib/esm/script-utils/linters/eslint-config.mjs +39 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +5 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +11 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.d.mts +54 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.mjs +148 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.d.mts +141 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.mjs +92 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.d.mts +32 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.mjs +111 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.d.mts +30 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.mjs +112 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.d.mts +45 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.mjs +217 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +9 -1
- package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -2
- package/dist/lib/esm/script-utils/linters/markdownlint.mjs +4 -4
- package/dist/lib/esm/script-utils/npm-run.mjs +4 -3
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +37 -1
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +10 -1
- package/dist/lib/esm/script-utils/package-manager.d.mts +77 -0
- package/dist/lib/esm/script-utils/package-manager.mjs +173 -0
- package/dist/lib/esm/script-utils/version.mjs +21 -9
- package/obsidian/demo-vault-naming/package.json +6 -0
- package/obsidian/mobile-trusted-input/package.json +6 -0
- package/obsidian/trusted-input/package.json +6 -0
- package/package.json +19 -17
- package/script-utils/linters/eslint-rules/manifest-description/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-helpers/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-id/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-name/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-schema/package.json +6 -0
- package/script-utils/package-manager/package.json +6 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function () {
|
|
7
|
+
function ensureBrowserProcess() {
|
|
8
|
+
const browserProcess = {
|
|
9
|
+
browser: true,
|
|
10
|
+
cwd() {
|
|
11
|
+
return '/';
|
|
12
|
+
},
|
|
13
|
+
env: {},
|
|
14
|
+
platform: 'android'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
|
|
18
|
+
const existingProcess = globalThis.process;
|
|
19
|
+
|
|
20
|
+
if (!existingProcess) {
|
|
21
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
22
|
+
globalThis.process = browserProcess;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (existingProcess.versions?.node) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const existingProcessRecord = existingProcess;
|
|
31
|
+
|
|
32
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
33
|
+
existingProcessRecord[key] ??= value;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
existingProcessRecord['browser'] = true;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function keepName($unknown) {
|
|
40
|
+
return $unknown;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
(function initCjs() {
|
|
44
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
45
|
+
const globalThisRecord = globalThis;
|
|
46
|
+
globalThisRecord['__name'] ??= keepName;
|
|
47
|
+
const originalRequire = require;
|
|
48
|
+
if (originalRequire && !originalRequire.__isPatched) {
|
|
49
|
+
// eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
|
|
50
|
+
require = Object.assign(
|
|
51
|
+
(id) => requirePatched(id),
|
|
52
|
+
originalRequire,
|
|
53
|
+
{
|
|
54
|
+
__isPatched: true
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
globalThisRecord['__extractDefault'] ??= extractDefault;
|
|
60
|
+
|
|
61
|
+
ensureBrowserProcess();
|
|
62
|
+
|
|
63
|
+
function extractDefault(module) {
|
|
64
|
+
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
68
|
+
'@codemirror/autocomplete',
|
|
69
|
+
'@codemirror/collab',
|
|
70
|
+
'@codemirror/commands',
|
|
71
|
+
'@codemirror/language',
|
|
72
|
+
'@codemirror/lint',
|
|
73
|
+
'@codemirror/search',
|
|
74
|
+
'@codemirror/state',
|
|
75
|
+
'@codemirror/text',
|
|
76
|
+
'@codemirror/view',
|
|
77
|
+
'@lezer/common',
|
|
78
|
+
'@lezer/highlight',
|
|
79
|
+
'@lezer/lr',
|
|
80
|
+
'obsidian']
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
84
|
+
'@codemirror/closebrackets',
|
|
85
|
+
'@codemirror/comment',
|
|
86
|
+
'@codemirror/fold',
|
|
87
|
+
'@codemirror/gutter',
|
|
88
|
+
'@codemirror/highlight',
|
|
89
|
+
'@codemirror/history',
|
|
90
|
+
'@codemirror/matchbrackets',
|
|
91
|
+
'@codemirror/panel',
|
|
92
|
+
'@codemirror/rangeset',
|
|
93
|
+
'@codemirror/rectangular-selection',
|
|
94
|
+
'@codemirror/stream-parser',
|
|
95
|
+
'@codemirror/tooltip']
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
function requirePatched(id) {
|
|
99
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
100
|
+
return originalRequire?.(id);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
104
|
+
if (globalThis.app.isMobile) {
|
|
105
|
+
if (id === 'process' || id === 'node:process') {
|
|
106
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
107
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
108
|
+
|
|
109
|
+
return process;
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
const module = originalRequire?.(id);
|
|
113
|
+
if (module) {
|
|
114
|
+
return extractDefault(module);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
119
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
120
|
+
return {};
|
|
121
|
+
}
|
|
122
|
+
})();
|
|
123
|
+
})();
|
|
124
|
+
|
|
125
|
+
"use strict";
|
|
126
|
+
var __defProp = Object.defineProperty;
|
|
127
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
128
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
129
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
130
|
+
var __export = (target, all) => {
|
|
131
|
+
for (var name in all)
|
|
132
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
133
|
+
};
|
|
134
|
+
var __copyProps = (to, from, except, desc) => {
|
|
135
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
136
|
+
for (let key of __getOwnPropNames(from))
|
|
137
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
138
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
139
|
+
}
|
|
140
|
+
return to;
|
|
141
|
+
};
|
|
142
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
143
|
+
var desktop_zip_extractor_exports = {};
|
|
144
|
+
__export(desktop_zip_extractor_exports, {
|
|
145
|
+
extractZipArchive: () => extractZipArchive
|
|
146
|
+
});
|
|
147
|
+
module.exports = __toCommonJS(desktop_zip_extractor_exports);
|
|
148
|
+
var import_node_zlib = require('node:zlib');
|
|
149
|
+
var import_path = require('./path.cjs');
|
|
150
|
+
const END_OF_CENTRAL_DIRECTORY_SIGNATURE = 101010256;
|
|
151
|
+
const CENTRAL_DIRECTORY_HEADER_SIGNATURE = 33639248;
|
|
152
|
+
const LOCAL_FILE_HEADER_SIGNATURE = 67324752;
|
|
153
|
+
const END_OF_CENTRAL_DIRECTORY_SIZE = 22;
|
|
154
|
+
const MAX_ARCHIVE_COMMENT_LENGTH = 65535;
|
|
155
|
+
const SATURATED_UINT_16 = 65535;
|
|
156
|
+
const SATURATED_UINT_32 = 4294967295;
|
|
157
|
+
const ARCHIVE_ENTRY_COUNT_OFFSET = 10;
|
|
158
|
+
const CENTRAL_DIRECTORY_START_OFFSET = 16;
|
|
159
|
+
const CENTRAL_DIRECTORY_FLAGS_OFFSET = 8;
|
|
160
|
+
const CENTRAL_DIRECTORY_COMPRESSION_METHOD_OFFSET = 10;
|
|
161
|
+
const CENTRAL_DIRECTORY_COMPRESSED_SIZE_OFFSET = 20;
|
|
162
|
+
const CENTRAL_DIRECTORY_NAME_LENGTH_OFFSET = 28;
|
|
163
|
+
const CENTRAL_DIRECTORY_EXTRA_LENGTH_OFFSET = 30;
|
|
164
|
+
const CENTRAL_DIRECTORY_COMMENT_LENGTH_OFFSET = 32;
|
|
165
|
+
const CENTRAL_DIRECTORY_LOCAL_HEADER_OFFSET_OFFSET = 42;
|
|
166
|
+
const CENTRAL_DIRECTORY_HEADER_SIZE = 46;
|
|
167
|
+
const LOCAL_HEADER_NAME_LENGTH_OFFSET = 26;
|
|
168
|
+
const LOCAL_HEADER_EXTRA_LENGTH_OFFSET = 28;
|
|
169
|
+
const LOCAL_HEADER_SIZE = 30;
|
|
170
|
+
const COMPRESSION_METHOD_STORED = 0;
|
|
171
|
+
const COMPRESSION_METHOD_DEFLATED = 8;
|
|
172
|
+
const ENCRYPTED_FLAG_DIVISOR = 2;
|
|
173
|
+
const ENTRY_NAME_SEPARATOR = "/";
|
|
174
|
+
const WINDOWS_DRIVE_PREFIX_REG_EXP = /^[A-Za-z]:/;
|
|
175
|
+
function extractZipArchive(params) {
|
|
176
|
+
const {
|
|
177
|
+
archive,
|
|
178
|
+
fileSystem,
|
|
179
|
+
targetDirectory
|
|
180
|
+
} = params;
|
|
181
|
+
fileSystem.mkdirSync(targetDirectory, { recursive: true });
|
|
182
|
+
for (const entry of readCentralDirectory(archive)) {
|
|
183
|
+
assertSafeEntryName(entry.name);
|
|
184
|
+
if (entry.name.endsWith(ENTRY_NAME_SEPARATOR)) {
|
|
185
|
+
fileSystem.mkdirSync((0, import_path.join)(targetDirectory, entry.name.slice(0, -1)), { recursive: true });
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const entryPath = (0, import_path.join)(targetDirectory, entry.name);
|
|
189
|
+
fileSystem.mkdirSync((0, import_path.dirname)(entryPath), { recursive: true });
|
|
190
|
+
fileSystem.writeFileSync(entryPath, readEntryData(archive, entry));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function assertSafeEntryName(entryName) {
|
|
194
|
+
if (entryName.startsWith(ENTRY_NAME_SEPARATOR)) {
|
|
195
|
+
throw new Error(`Refusing to extract the absolute archive entry '${entryName}'.`);
|
|
196
|
+
}
|
|
197
|
+
if (WINDOWS_DRIVE_PREFIX_REG_EXP.test(entryName)) {
|
|
198
|
+
throw new Error(`Refusing to extract the drive-qualified archive entry '${entryName}'.`);
|
|
199
|
+
}
|
|
200
|
+
if (entryName.includes("\\")) {
|
|
201
|
+
throw new Error(`Refusing to extract the archive entry '${entryName}', which uses a backslash separator.`);
|
|
202
|
+
}
|
|
203
|
+
if (entryName.split(ENTRY_NAME_SEPARATOR).includes("..")) {
|
|
204
|
+
throw new Error(`Refusing to extract the archive entry '${entryName}', which points outside the target directory.`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
function findEndOfCentralDirectoryOffset(archive) {
|
|
208
|
+
const lastPossibleOffset = archive.length - END_OF_CENTRAL_DIRECTORY_SIZE;
|
|
209
|
+
const firstPossibleOffset = Math.max(0, lastPossibleOffset - MAX_ARCHIVE_COMMENT_LENGTH);
|
|
210
|
+
for (let offset = lastPossibleOffset; offset >= firstPossibleOffset; offset--) {
|
|
211
|
+
if (archive.readUInt32LE(offset) === END_OF_CENTRAL_DIRECTORY_SIGNATURE) {
|
|
212
|
+
return offset;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
throw new Error("The archive is not a ZIP file: its end-of-central-directory record is missing.");
|
|
216
|
+
}
|
|
217
|
+
function readCentralDirectory(archive) {
|
|
218
|
+
const endOfCentralDirectoryOffset = findEndOfCentralDirectoryOffset(archive);
|
|
219
|
+
const entryCount = archive.readUInt16LE(endOfCentralDirectoryOffset + ARCHIVE_ENTRY_COUNT_OFFSET);
|
|
220
|
+
let entryOffset = archive.readUInt32LE(endOfCentralDirectoryOffset + CENTRAL_DIRECTORY_START_OFFSET);
|
|
221
|
+
if (entryCount === SATURATED_UINT_16 || entryOffset === SATURATED_UINT_32) {
|
|
222
|
+
throw new Error("ZIP64 archives are not supported.");
|
|
223
|
+
}
|
|
224
|
+
const entries = [];
|
|
225
|
+
for (let entryIndex = 0; entryIndex < entryCount; entryIndex++) {
|
|
226
|
+
if (archive.readUInt32LE(entryOffset) !== CENTRAL_DIRECTORY_HEADER_SIGNATURE) {
|
|
227
|
+
throw new Error(`The archive's central directory is corrupt at entry ${String(entryIndex)}.`);
|
|
228
|
+
}
|
|
229
|
+
const flags = archive.readUInt16LE(entryOffset + CENTRAL_DIRECTORY_FLAGS_OFFSET);
|
|
230
|
+
if (flags % ENCRYPTED_FLAG_DIVISOR === 1) {
|
|
231
|
+
throw new Error("Encrypted ZIP archives are not supported.");
|
|
232
|
+
}
|
|
233
|
+
const compressedSize = archive.readUInt32LE(entryOffset + CENTRAL_DIRECTORY_COMPRESSED_SIZE_OFFSET);
|
|
234
|
+
const localHeaderOffset = archive.readUInt32LE(entryOffset + CENTRAL_DIRECTORY_LOCAL_HEADER_OFFSET_OFFSET);
|
|
235
|
+
if (compressedSize === SATURATED_UINT_32 || localHeaderOffset === SATURATED_UINT_32) {
|
|
236
|
+
throw new Error("ZIP64 archives are not supported.");
|
|
237
|
+
}
|
|
238
|
+
const nameLength = archive.readUInt16LE(entryOffset + CENTRAL_DIRECTORY_NAME_LENGTH_OFFSET);
|
|
239
|
+
const nameOffset = entryOffset + CENTRAL_DIRECTORY_HEADER_SIZE;
|
|
240
|
+
entries.push({
|
|
241
|
+
compressedSize,
|
|
242
|
+
compressionMethod: archive.readUInt16LE(entryOffset + CENTRAL_DIRECTORY_COMPRESSION_METHOD_OFFSET),
|
|
243
|
+
localHeaderOffset,
|
|
244
|
+
name: archive.toString("utf-8", nameOffset, nameOffset + nameLength)
|
|
245
|
+
});
|
|
246
|
+
entryOffset = nameOffset + nameLength + archive.readUInt16LE(entryOffset + CENTRAL_DIRECTORY_EXTRA_LENGTH_OFFSET) + archive.readUInt16LE(entryOffset + CENTRAL_DIRECTORY_COMMENT_LENGTH_OFFSET);
|
|
247
|
+
}
|
|
248
|
+
return entries;
|
|
249
|
+
}
|
|
250
|
+
function readEntryData(archive, entry) {
|
|
251
|
+
if (archive.readUInt32LE(entry.localHeaderOffset) !== LOCAL_FILE_HEADER_SIGNATURE) {
|
|
252
|
+
throw new Error(`The archive entry '${entry.name}' has a corrupt local header.`);
|
|
253
|
+
}
|
|
254
|
+
const dataOffset = entry.localHeaderOffset + LOCAL_HEADER_SIZE + archive.readUInt16LE(entry.localHeaderOffset + LOCAL_HEADER_NAME_LENGTH_OFFSET) + archive.readUInt16LE(entry.localHeaderOffset + LOCAL_HEADER_EXTRA_LENGTH_OFFSET);
|
|
255
|
+
const dataEnd = dataOffset + entry.compressedSize;
|
|
256
|
+
if (dataEnd > archive.length) {
|
|
257
|
+
throw new Error(`The archive is truncated: entry '${entry.name}' runs past its end.`);
|
|
258
|
+
}
|
|
259
|
+
const compressedData = archive.subarray(dataOffset, dataEnd);
|
|
260
|
+
switch (entry.compressionMethod) {
|
|
261
|
+
case COMPRESSION_METHOD_DEFLATED: {
|
|
262
|
+
return (0, import_node_zlib.inflateRawSync)(compressedData);
|
|
263
|
+
}
|
|
264
|
+
case COMPRESSION_METHOD_STORED: {
|
|
265
|
+
return compressedData;
|
|
266
|
+
}
|
|
267
|
+
default: {
|
|
268
|
+
throw new Error(`The archive entry '${entry.name}' uses unsupported compression method ${String(entry.compressionMethod)}.`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
273
|
+
0 && (module.exports = {
|
|
274
|
+
extractZipArchive
|
|
275
|
+
});
|
|
276
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Rlc2t0b3AtemlwLWV4dHJhY3Rvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEV4dHJhY3RzIGEgWklQIGFyY2hpdmUgdG8gZGlzayB1c2luZyBvbmx5IE5vZGUncyBgemxpYmAgXHUyMDE0IHdpdGggbm8gdGhpcmQtcGFydHkgdW56aXAgZGVwZW5kZW5jeS5cbiAqXG4gKiBJdCBleGlzdHMgZm9yIG9uZSBtZWFzdXJlZCByZWFzb24uIFRoZSBkZXBlbmRlbmN5IGl0IHJlcGxhY2VkIG9uIHRoaXMgcGF0aCwgYGFkbS16aXBgLCBidW5kbGVkXG4gKiByb3VnaGx5IDM0IEtCIG9mIG1pbmlmaWVkIEphdmFTY3JpcHQgaW50byBFVkVSWSBPYnNpZGlhbiBwbHVnaW4gYnVpbHQgd2l0aCB0aGlzIGxpYnJhcnk6IGEgcGx1Z2luXG4gKiBzaGlwcyBhIHNpbmdsZSBDSlMgYG1haW4uanNgLCBlc2J1aWxkIGhhcyBubyBjb2RlIHNwbGl0dGluZyB0byBwdXQgYSBkZXBlbmRlbmN5IGJlaGluZCwgYW5kIGFcbiAqIGBhd2FpdCBpbXBvcnQoKWAgb25seSBkZWZlcnMgZXZhbHVhdGlvbiBcdTIwMTQgdGhlIG1vZHVsZSBib2R5IGlzIGlubGluZWQgZWl0aGVyIHdheS4gYG5vZGU6emxpYmAgaXNcbiAqIGFscmVhZHkgYW4gZXNidWlsZCBleHRlcm5hbCwgc28gdGhlIHNhbWUgd29yayBub3cgY29zdHMgYSBwbHVnaW4gYnVuZGxlIG5vdGhpbmcgYXQgYWxsLiBBcmNoaXZlc1xuICogYXJlIHN0aWxsIFdSSVRURU4gd2l0aCBgYWRtLXppcGAgYXQgcmVsZWFzZSB0aW1lIChgc2NyaXB0LXV0aWxzL2RlbW8tdmF1bHQudHNgKSwgd2hpY2ggaXMgTm9kZS1zaWRlXG4gKiB0b29saW5nIGFuZCBuZXZlciByZWFjaGVzIGEgcGx1Z2luIGJ1bmRsZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbmFycm93OiBpdCByZWFkcyBleGFjdGx5IHdoYXQgdGhhdCB3cml0ZXIgcHJvZHVjZXMgXHUyMDE0IHN0b3JlZCBhbmQgZGVmbGF0ZWQgZW50cmllcyBpbiBhblxuICogdW5lbmNyeXB0ZWQgYXJjaGl2ZSBiZWxvdyB0aGUgNCBHQiAvIDY1NTM1LWVudHJ5IFpJUDY0IHRocmVzaG9sZCBcdTIwMTQgYW5kIHJhaXNlcyBhIG5hbWVkIGVycm9yIGZvclxuICogYW55dGhpbmcgZWxzZSByYXRoZXIgdGhhbiBndWVzc2luZyBhdCBpdC4gU2l6ZXMgYW5kIG9mZnNldHMgYXJlIHRha2VuIGZyb20gdGhlIGNlbnRyYWwgZGlyZWN0b3J5LFxuICogd2hpY2ggaXMgYXV0aG9yaXRhdGl2ZSBldmVuIGZvciBhcmNoaXZlcyB3cml0dGVuIHdpdGggZGF0YSBkZXNjcmlwdG9ycy5cbiAqXG4gKiBUaGUgYG5vZGU6YCBpbXBvcnRzIGJlbG93IGFyZSBzYWZlIHRvIG1lcmVseSBFVkFMVUFURSBvbiBtb2JpbGUgXHUyMDE0IGByZXF1aXJlYCBoYW5kcyBiYWNrIGB1bmRlZmluZWRgXG4gKiB0aGVyZSBhbmQgbm90aGluZyByZWFkcyBpdCBhdCBsb2FkIHRpbWUgXHUyMDE0IHNvIHRoaXMgbW9kdWxlIGNhbiBzaXQgaW4gdGhlIGdlbmVyYXRlZCBiYXJyZWxzIHdpdGhvdXRcbiAqIGJyZWFraW5nIHRoZSBsaWJyYXJ5J3MgbG9hZCBvbiBBbmRyb2lkLiBPbmx5IHRoZSBjYWxscyBhcmUgZGVza3RvcC1vbmx5LlxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC14L25vLW5vZGVqcy1tb2R1bGVzIC0tIERlc2t0b3Atb25seSBleHRyYWN0aW9uOyB0aGUgb25seSBjYWxsZXIgaXMgZ2F0ZWQgYnkgYFBsYXRmb3JtLmlzRGVza3RvcEFwcGAsIHNvIHRoZXNlIE5vZGUgQVBJcyBhcmUgbmV2ZXIgcmVhY2hlZCBvbiBtb2JpbGUuICovXG5pbXBvcnQgdHlwZSB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJztcblxuaW1wb3J0IHsgaW5mbGF0ZVJhd1N5bmMgfSBmcm9tICdub2RlOnpsaWInO1xuLyogZXNsaW50LWVuYWJsZSBpbXBvcnQteC9uby1ub2RlanMtbW9kdWxlcyAtLSBEZXNrdG9wLW9ubHkgZXh0cmFjdGlvbjsgdGhlIG9ubHkgY2FsbGVyIGlzIGdhdGVkIGJ5IGBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHBgLCBzbyB0aGVzZSBOb2RlIEFQSXMgYXJlIG5ldmVyIHJlYWNoZWQgb24gbW9iaWxlLiAqL1xuXG5pbXBvcnQge1xuICBkaXJuYW1lLFxuICBqb2luXG59IGZyb20gJy4vcGF0aC50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGV4dHJhY3RaaXBBcmNoaXZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0WmlwQXJjaGl2ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcmF3IFpJUCBhcmNoaXZlIGJ5dGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl2ZTogQnVmZmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZS1zeXN0ZW0gaW1wbGVtZW50YXRpb24gdGhlIGV4dHJhY3RlZCBlbnRyaWVzIGFyZSB3cml0dGVuIHdpdGguXG4gICAqXG4gICAqIEluamVjdGVkIHJhdGhlciB0aGFuIGltcG9ydGVkIHNvIHRoZSBjYWxsZXIgY2hvb3NlcyB3aGljaCBgZnNgIHdyaXRlcyB0aGUgZmlsZXMuIFRoZSBkZW1vLXZhdWx0XG4gICAqIG9wZW5lciBoYW5kcyBvdmVyIEVsZWN0cm9uJ3MgYG9yaWdpbmFsLWZzYCAoc2VlIHtAbGluayBaaXBFeHRyYWN0aW9uRmlsZVN5c3RlbX0pLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZVN5c3RlbTogWmlwRXh0cmFjdGlvbkZpbGVTeXN0ZW07XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgdG8gZXh0cmFjdCBpbnRvLiBDcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0RGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIGBub2RlOmZzYCBleHRyYWN0aW9uIG5lZWRzLlxuICpcbiAqIE9ubHkgdGhlIHR3byBXUklUSU5HIGNhbGxzIGFyZSByZXF1aXJlZCwgYW5kIHRoYXQgaXMgZGVsaWJlcmF0ZTogRWxlY3Ryb24ncyBhc2FyIGxheWVyIGludGVyY2VwdHNcbiAqIGBmc2AgUkVBRFMgKGFuZCBgZXhpc3RzU3luY2ApIG9uIGFueSBwYXRoIGNvbnRhaW5pbmcgYC5hc2FyYCwgd2hpY2ggYSBkZW1vIHZhdWx0IG1heSBsZWdpdGltYXRlbHlcbiAqIHNoaXAgYXMgYSBwbGFpbiBmaWxlLiBOZXZlciBwcm9iaW5nIHRoZSB0YXJnZXQgd2l0aCBhIHJlYWQga2VlcHMgdGhhdCBpbnRlcmNlcHRpb24gb3V0IG9mIHRoZVxuICogcGljdHVyZSBlbnRpcmVseSwgYW5kIGEgY2FsbGVyIHRoYXQgaGFuZHMgb3ZlciBFbGVjdHJvbidzIGBvcmlnaW5hbC1mc2AgaXMgc2FmZSBldmVuIGZyb20gdGhlXG4gKiB3cml0ZSBzaWRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFppcEV4dHJhY3Rpb25GaWxlU3lzdGVtIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBhbnkgbWlzc2luZyBwYXJlbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBkaXJlY3RvcnkgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgWmlwRXh0cmFjdGlvbk1rZGlyT3B0aW9uc30uXG4gICAqIEByZXR1cm5zIFRoZSBmaXJzdCBkaXJlY3RvcnkgY3JlYXRlZCwgaWYgYW55LlxuICAgKi9cbiAgbWtkaXJTeW5jKHBhdGg6IHN0cmluZywgb3B0aW9uczogWmlwRXh0cmFjdGlvbk1rZGlyT3B0aW9ucyk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV3JpdGVzIGEgZmlsZSwgb3ZlcndyaXRpbmcgaXQgaWYgaXQgZXhpc3RzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBmaWxlIHRvIHdyaXRlLlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBieXRlcyB0byB3cml0ZS5cbiAgICovXG4gIHdyaXRlRmlsZVN5bmMocGF0aDogc3RyaW5nLCBkYXRhOiBCdWZmZXIpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb25zIHtAbGluayBaaXBFeHRyYWN0aW9uRmlsZVN5c3RlbS5ta2RpclN5bmN9IGlzIGFsd2F5cyBjYWxsZWQgd2l0aC5cbiAqXG4gKiBFeHRyYWN0aW9uIG5ldmVyIHByb2JlcyBmb3IgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LCBzbyBldmVyeSBjYWxsIGhhcyB0byBjcmVhdGUgdGhlIG1pc3NpbmcgcGFyZW50c1xuICogaXRzZWxmIGFuZCB0b2xlcmF0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzIGFscmVhZHkgdGhlcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWmlwRXh0cmFjdGlvbk1rZGlyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbHdheXMgYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjdXJzaXZlOiB0cnVlO1xufVxuXG5pbnRlcmZhY2UgWmlwRW50cnkge1xuICByZWFkb25seSBjb21wcmVzc2VkU2l6ZTogbnVtYmVyO1xuICByZWFkb25seSBjb21wcmVzc2lvbk1ldGhvZDogbnVtYmVyO1xuICByZWFkb25seSBsb2NhbEhlYWRlck9mZnNldDogbnVtYmVyO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbmNvbnN0IEVORF9PRl9DRU5UUkFMX0RJUkVDVE9SWV9TSUdOQVRVUkUgPSAweDA2XzA1XzRCXzUwO1xuY29uc3QgQ0VOVFJBTF9ESVJFQ1RPUllfSEVBREVSX1NJR05BVFVSRSA9IDB4MDJfMDFfNEJfNTA7XG5jb25zdCBMT0NBTF9GSUxFX0hFQURFUl9TSUdOQVRVUkUgPSAweDA0XzAzXzRCXzUwO1xuXG5jb25zdCBFTkRfT0ZfQ0VOVFJBTF9ESVJFQ1RPUllfU0laRSA9IDIyO1xuY29uc3QgTUFYX0FSQ0hJVkVfQ09NTUVOVF9MRU5HVEggPSA2NV81MzU7XG5cbi8vIEEgY291bnQgb3Igb2Zmc2V0IHNhdHVyYXRlZCB0byBhbGwtb25lcyBtZWFucyB0aGUgcmVhbCB2YWx1ZSBsaXZlcyBpbiBhIFpJUDY0IHJlY29yZCB0aGlzIHJlYWRlclxuLy8gRG9lcyBub3QgaW1wbGVtZW50LCBzbyB0aGUgZmllbGQgbXVzdCBuZXZlciBiZSByZWFkIGF0IGZhY2UgdmFsdWUuXG5jb25zdCBTQVRVUkFURURfVUlOVF8xNiA9IDY1XzUzNTtcbmNvbnN0IFNBVFVSQVRFRF9VSU5UXzMyID0gNF8yOTRfOTY3XzI5NTtcblxuLy8gRmllbGQgb2Zmc2V0cyB3aXRoaW4gdGhlIGVuZC1vZi1jZW50cmFsLWRpcmVjdG9yeSByZWNvcmQuXG5jb25zdCBBUkNISVZFX0VOVFJZX0NPVU5UX09GRlNFVCA9IDEwO1xuY29uc3QgQ0VOVFJBTF9ESVJFQ1RPUllfU1RBUlRfT0ZGU0VUID0gMTY7XG5cbi8vIEZpZWxkIG9mZnNldHMgd2l0aGluIGEgY2VudHJhbC1kaXJlY3RvcnkgaGVhZGVyLlxuY29uc3QgQ0VOVFJBTF9ESVJFQ1RPUllfRkxBR1NfT0ZGU0VUID0gODtcbmNvbnN0IENFTlRSQUxfRElSRUNUT1JZX0NPTVBSRVNTSU9OX01FVEhPRF9PRkZTRVQgPSAxMDtcbmNvbnN0IENFTlRSQUxfRElSRUNUT1JZX0NPTVBSRVNTRURfU0laRV9PRkZTRVQgPSAyMDtcbmNvbnN0IENFTlRSQUxfRElSRUNUT1JZX05BTUVfTEVOR1RIX09GRlNFVCA9IDI4O1xuY29uc3QgQ0VOVFJBTF9ESVJFQ1RPUllfRVhUUkFfTEVOR1RIX09GRlNFVCA9IDMwO1xuY29uc3QgQ0VOVFJBTF9ESVJFQ1RPUllfQ09NTUVOVF9MRU5HVEhfT0ZGU0VUID0gMzI7XG5jb25zdCBDRU5UUkFMX0RJUkVDVE9SWV9MT0NBTF9IRUFERVJfT0ZGU0VUX09GRlNFVCA9IDQyO1xuY29uc3QgQ0VOVFJBTF9ESVJFQ1RPUllfSEVBREVSX1NJWkUgPSA0NjtcblxuLy8gRmllbGQgb2Zmc2V0cyB3aXRoaW4gYSBsb2NhbCBmaWxlIGhlYWRlci5cbmNvbnN0IExPQ0FMX0hFQURFUl9OQU1FX0xFTkdUSF9PRkZTRVQgPSAyNjtcbmNvbnN0IExPQ0FMX0hFQURFUl9FWFRSQV9MRU5HVEhfT0ZGU0VUID0gMjg7XG5jb25zdCBMT0NBTF9IRUFERVJfU0laRSA9IDMwO1xuXG5jb25zdCBDT01QUkVTU0lPTl9NRVRIT0RfU1RPUkVEID0gMDtcbmNvbnN0IENPTVBSRVNTSU9OX01FVEhPRF9ERUZMQVRFRCA9IDg7XG5cbi8vIEJpdCAwIG9mIHRoZSBnZW5lcmFsLXB1cnBvc2UgZmxhZ3MgbWFya3MgYW4gZW5jcnlwdGVkIGVudHJ5LCBhbmQgaXQgaXMgdGhlIGxvd2VzdCBiaXQgXHUyMDE0IHNvIHRoZVxuLy8gUmVtYWluZGVyIHRlc3RzIGl0IHdpdGhvdXQgcmVhY2hpbmcgZm9yIGEgYml0d2lzZSBvcGVyYXRvci5cbmNvbnN0IEVOQ1JZUFRFRF9GTEFHX0RJVklTT1IgPSAyO1xuXG5jb25zdCBFTlRSWV9OQU1FX1NFUEFSQVRPUiA9ICcvJztcbmNvbnN0IFdJTkRPV1NfRFJJVkVfUFJFRklYX1JFR19FWFAgPSAvXltBLVphLXpdOi87XG5cbi8qKlxuICogRXh0cmFjdHMgZXZlcnkgZW50cnkgb2YgYSBaSVAgYXJjaGl2ZSBpbnRvIGEgZGlyZWN0b3J5LlxuICpcbiAqIERpcmVjdG9yeSBlbnRyaWVzIGJlY29tZSBkaXJlY3RvcmllczsgYSBmaWxlIGVudHJ5J3MgcGFyZW50cyBhcmUgY3JlYXRlZCB3aGV0aGVyIG9yIG5vdCB0aGUgYXJjaGl2ZVxuICogZGVjbGFyZWQgdGhlbS4gQW4gZW50cnkgd2hvc2UgbmFtZSB3b3VsZCBlc2NhcGUge0BsaW5rIEV4dHJhY3RaaXBBcmNoaXZlUGFyYW1zLnRhcmdldERpcmVjdG9yeX0gaXNcbiAqIHJlZnVzZWQgcmF0aGVyIHRoYW4gd3JpdHRlbiAodGhlIFwiemlwIHNsaXBcIiB0cmF2ZXJzYWwpLCBhcyBpcyBhbiBlbmNyeXB0ZWQsIFpJUDY0LCBvclxuICogdW5rbm93bi1jb21wcmVzc2lvbiBhcmNoaXZlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEV4dHJhY3RaaXBBcmNoaXZlUGFyYW1zfS5cbiAqIEB0aHJvd3MgQW4ge0BsaW5rIEVycm9yfSBuYW1pbmcgdGhlIHJlYXNvbiB3aGVuIHRoZSBhcmNoaXZlIGNhbm5vdCBiZSByZWFkIGFzIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0WmlwQXJjaGl2ZShwYXJhbXM6IEV4dHJhY3RaaXBBcmNoaXZlUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBhcmNoaXZlLFxuICAgIGZpbGVTeXN0ZW0sXG4gICAgdGFyZ2V0RGlyZWN0b3J5XG4gIH0gPSBwYXJhbXM7XG5cbiAgZmlsZVN5c3RlbS5ta2RpclN5bmModGFyZ2V0RGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJlYWRDZW50cmFsRGlyZWN0b3J5KGFyY2hpdmUpKSB7XG4gICAgYXNzZXJ0U2FmZUVudHJ5TmFtZShlbnRyeS5uYW1lKTtcblxuICAgIGlmIChlbnRyeS5uYW1lLmVuZHNXaXRoKEVOVFJZX05BTUVfU0VQQVJBVE9SKSkge1xuICAgICAgLy8gTmFtZWQgd2l0aG91dCBpdHMgdHJhaWxpbmcgc2VwYXJhdG9yLCBzbyB0aGUgY3JlYXRlZCBwYXRoIHJlYWRzIHRoZSBzYW1lIGFzIGV2ZXJ5IG90aGVyIG9uZS5cbiAgICAgIGZpbGVTeXN0ZW0ubWtkaXJTeW5jKGpvaW4odGFyZ2V0RGlyZWN0b3J5LCBlbnRyeS5uYW1lLnNsaWNlKDAsIC0xKSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZW50cnlQYXRoID0gam9pbih0YXJnZXREaXJlY3RvcnksIGVudHJ5Lm5hbWUpO1xuICAgIGZpbGVTeXN0ZW0ubWtkaXJTeW5jKGRpcm5hbWUoZW50cnlQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZmlsZVN5c3RlbS53cml0ZUZpbGVTeW5jKGVudHJ5UGF0aCwgcmVhZEVudHJ5RGF0YShhcmNoaXZlLCBlbnRyeSkpO1xuICB9XG59XG5cbi8qKlxuICogUmVmdXNlcyBhbiBlbnRyeSBuYW1lIHRoYXQgd291bGQgcGxhY2UgdGhlIGV4dHJhY3RlZCBmaWxlIG91dHNpZGUgdGhlIHRhcmdldCBkaXJlY3RvcnkuXG4gKlxuICogQW4gYXJjaGl2ZSBpcyB1bnRydXN0ZWQgaW5wdXQgZXZlbiB3aGVuIHdlIHB1Ymxpc2hlZCBpdCBvdXJzZWx2ZXMsIGFuZCBldmVyeSBvbmUgb2YgdGhlc2Ugc2hhcGVzXG4gKiBlc2NhcGVzIHRoZSB0YXJnZXQ6IGFuIGFic29sdXRlIFBPU0lYIHBhdGgsIGEgV2luZG93cyBkcml2ZS1xdWFsaWZpZWQgcGF0aCwgYSBiYWNrc2xhc2ggKHdoaWNoIHRoZVxuICogWklQIHNwZWNpZmljYXRpb24gZm9yYmlkcyBhcyBhIHNlcGFyYXRvciwgc28gaXRzIG9ubHkgdXNlIGhlcmUgaXMgdG8gc211Z2dsZSBvbmUgcGFzdCBhXG4gKiBmb3J3YXJkLXNsYXNoIGNoZWNrKSwgYW5kIGEgYC4uYCBzZWdtZW50LlxuICpcbiAqIEBwYXJhbSBlbnRyeU5hbWUgLSBUaGUgZW50cnkgbmFtZSBhcyByZWNvcmRlZCBpbiB0aGUgYXJjaGl2ZS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0U2FmZUVudHJ5TmFtZShlbnRyeU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZW50cnlOYW1lLnN0YXJ0c1dpdGgoRU5UUllfTkFNRV9TRVBBUkFUT1IpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZWZ1c2luZyB0byBleHRyYWN0IHRoZSBhYnNvbHV0ZSBhcmNoaXZlIGVudHJ5ICcke2VudHJ5TmFtZX0nLmApO1xuICB9XG5cbiAgaWYgKFdJTkRPV1NfRFJJVkVfUFJFRklYX1JFR19FWFAudGVzdChlbnRyeU5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZWZ1c2luZyB0byBleHRyYWN0IHRoZSBkcml2ZS1xdWFsaWZpZWQgYXJjaGl2ZSBlbnRyeSAnJHtlbnRyeU5hbWV9Jy5gKTtcbiAgfVxuXG4gIGlmIChlbnRyeU5hbWUuaW5jbHVkZXMoJ1xcXFwnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVmdXNpbmcgdG8gZXh0cmFjdCB0aGUgYXJjaGl2ZSBlbnRyeSAnJHtlbnRyeU5hbWV9Jywgd2hpY2ggdXNlcyBhIGJhY2tzbGFzaCBzZXBhcmF0b3IuYCk7XG4gIH1cblxuICBpZiAoZW50cnlOYW1lLnNwbGl0KEVOVFJZX05BTUVfU0VQQVJBVE9SKS5pbmNsdWRlcygnLi4nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVmdXNpbmcgdG8gZXh0cmFjdCB0aGUgYXJjaGl2ZSBlbnRyeSAnJHtlbnRyeU5hbWV9Jywgd2hpY2ggcG9pbnRzIG91dHNpZGUgdGhlIHRhcmdldCBkaXJlY3RvcnkuYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBMb2NhdGVzIHRoZSBlbmQtb2YtY2VudHJhbC1kaXJlY3RvcnkgcmVjb3JkIGFuZCByZXR1cm5zIGl0cyBvZmZzZXQuXG4gKlxuICogVGhlIHJlY29yZCBzaXRzIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgYXJjaGl2ZSB1bmxlc3MgYSB0cmFpbGluZyBjb21tZW50IGZvbGxvd3MgaXQsIHNvIGl0IGlzIGZvdW5kXG4gKiBieSBzY2FubmluZyBiYWNrd2FyZHMgb3ZlciB0aGUgY29tbWVudCdzIG1heGltdW0gbGVuZ3RoIHJhdGhlciB0aGFuIGFzc3VtZWQgdG8gYmUgYXQgYSBmaXhlZCBwbGFjZS5cbiAqXG4gKiBAcGFyYW0gYXJjaGl2ZSAtIFRoZSByYXcgWklQIGFyY2hpdmUgYnl0ZXMuXG4gKiBAcmV0dXJucyBUaGUgcmVjb3JkJ3Mgb2Zmc2V0LlxuICovXG5mdW5jdGlvbiBmaW5kRW5kT2ZDZW50cmFsRGlyZWN0b3J5T2Zmc2V0KGFyY2hpdmU6IEJ1ZmZlcik6IG51bWJlciB7XG4gIGNvbnN0IGxhc3RQb3NzaWJsZU9mZnNldCA9IGFyY2hpdmUubGVuZ3RoIC0gRU5EX09GX0NFTlRSQUxfRElSRUNUT1JZX1NJWkU7XG4gIGNvbnN0IGZpcnN0UG9zc2libGVPZmZzZXQgPSBNYXRoLm1heCgwLCBsYXN0UG9zc2libGVPZmZzZXQgLSBNQVhfQVJDSElWRV9DT01NRU5UX0xFTkdUSCk7XG5cbiAgZm9yIChsZXQgb2Zmc2V0ID0gbGFzdFBvc3NpYmxlT2Zmc2V0OyBvZmZzZXQgPj0gZmlyc3RQb3NzaWJsZU9mZnNldDsgb2Zmc2V0LS0pIHtcbiAgICBpZiAoYXJjaGl2ZS5yZWFkVUludDMyTEUob2Zmc2V0KSA9PT0gRU5EX09GX0NFTlRSQUxfRElSRUNUT1JZX1NJR05BVFVSRSkge1xuICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBhcmNoaXZlIGlzIG5vdCBhIFpJUCBmaWxlOiBpdHMgZW5kLW9mLWNlbnRyYWwtZGlyZWN0b3J5IHJlY29yZCBpcyBtaXNzaW5nLicpO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjZW50cmFsIGRpcmVjdG9yeSwgd2hpY2ggaXMgdGhlIGFyY2hpdmUncyBhdXRob3JpdGF0aXZlIGluZGV4IG9mIGl0cyBlbnRyaWVzLlxuICpcbiAqIEBwYXJhbSBhcmNoaXZlIC0gVGhlIHJhdyBaSVAgYXJjaGl2ZSBieXRlcy5cbiAqIEByZXR1cm5zIE9uZSB7QGxpbmsgWmlwRW50cnl9IHBlciBlbnRyeSwgaW4gdGhlIG9yZGVyIHRoZSBhcmNoaXZlIGxpc3RzIHRoZW0uXG4gKi9cbmZ1bmN0aW9uIHJlYWRDZW50cmFsRGlyZWN0b3J5KGFyY2hpdmU6IEJ1ZmZlcik6IFppcEVudHJ5W10ge1xuICBjb25zdCBlbmRPZkNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgPSBmaW5kRW5kT2ZDZW50cmFsRGlyZWN0b3J5T2Zmc2V0KGFyY2hpdmUpO1xuICBjb25zdCBlbnRyeUNvdW50ID0gYXJjaGl2ZS5yZWFkVUludDE2TEUoZW5kT2ZDZW50cmFsRGlyZWN0b3J5T2Zmc2V0ICsgQVJDSElWRV9FTlRSWV9DT1VOVF9PRkZTRVQpO1xuICBsZXQgZW50cnlPZmZzZXQgPSBhcmNoaXZlLnJlYWRVSW50MzJMRShlbmRPZkNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgKyBDRU5UUkFMX0RJUkVDVE9SWV9TVEFSVF9PRkZTRVQpO1xuXG4gIGlmIChlbnRyeUNvdW50ID09PSBTQVRVUkFURURfVUlOVF8xNiB8fCBlbnRyeU9mZnNldCA9PT0gU0FUVVJBVEVEX1VJTlRfMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1pJUDY0IGFyY2hpdmVzIGFyZSBub3Qgc3VwcG9ydGVkLicpO1xuICB9XG5cbiAgY29uc3QgZW50cmllczogWmlwRW50cnlbXSA9IFtdO1xuICBmb3IgKGxldCBlbnRyeUluZGV4ID0gMDsgZW50cnlJbmRleCA8IGVudHJ5Q291bnQ7IGVudHJ5SW5kZXgrKykge1xuICAgIGlmIChhcmNoaXZlLnJlYWRVSW50MzJMRShlbnRyeU9mZnNldCkgIT09IENFTlRSQUxfRElSRUNUT1JZX0hFQURFUl9TSUdOQVRVUkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFyY2hpdmUncyBjZW50cmFsIGRpcmVjdG9yeSBpcyBjb3JydXB0IGF0IGVudHJ5ICR7U3RyaW5nKGVudHJ5SW5kZXgpfS5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBmbGFncyA9IGFyY2hpdmUucmVhZFVJbnQxNkxFKGVudHJ5T2Zmc2V0ICsgQ0VOVFJBTF9ESVJFQ1RPUllfRkxBR1NfT0ZGU0VUKTtcbiAgICBpZiAoZmxhZ3MgJSBFTkNSWVBURURfRkxBR19ESVZJU09SID09PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY3J5cHRlZCBaSVAgYXJjaGl2ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHJlc3NlZFNpemUgPSBhcmNoaXZlLnJlYWRVSW50MzJMRShlbnRyeU9mZnNldCArIENFTlRSQUxfRElSRUNUT1JZX0NPTVBSRVNTRURfU0laRV9PRkZTRVQpO1xuICAgIGNvbnN0IGxvY2FsSGVhZGVyT2Zmc2V0ID0gYXJjaGl2ZS5yZWFkVUludDMyTEUoZW50cnlPZmZzZXQgKyBDRU5UUkFMX0RJUkVDVE9SWV9MT0NBTF9IRUFERVJfT0ZGU0VUX09GRlNFVCk7XG4gICAgaWYgKGNvbXByZXNzZWRTaXplID09PSBTQVRVUkFURURfVUlOVF8zMiB8fCBsb2NhbEhlYWRlck9mZnNldCA9PT0gU0FUVVJBVEVEX1VJTlRfMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWklQNjQgYXJjaGl2ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZUxlbmd0aCA9IGFyY2hpdmUucmVhZFVJbnQxNkxFKGVudHJ5T2Zmc2V0ICsgQ0VOVFJBTF9ESVJFQ1RPUllfTkFNRV9MRU5HVEhfT0ZGU0VUKTtcbiAgICBjb25zdCBuYW1lT2Zmc2V0ID0gZW50cnlPZmZzZXQgKyBDRU5UUkFMX0RJUkVDVE9SWV9IRUFERVJfU0laRTtcbiAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgY29tcHJlc3NlZFNpemUsXG4gICAgICBjb21wcmVzc2lvbk1ldGhvZDogYXJjaGl2ZS5yZWFkVUludDE2TEUoZW50cnlPZmZzZXQgKyBDRU5UUkFMX0RJUkVDVE9SWV9DT01QUkVTU0lPTl9NRVRIT0RfT0ZGU0VUKSxcbiAgICAgIGxvY2FsSGVhZGVyT2Zmc2V0LFxuICAgICAgbmFtZTogYXJjaGl2ZS50b1N0cmluZygndXRmLTgnLCBuYW1lT2Zmc2V0LCBuYW1lT2Zmc2V0ICsgbmFtZUxlbmd0aClcbiAgICB9KTtcblxuICAgIGVudHJ5T2Zmc2V0ID0gbmFtZU9mZnNldFxuICAgICAgKyBuYW1lTGVuZ3RoXG4gICAgICArIGFyY2hpdmUucmVhZFVJbnQxNkxFKGVudHJ5T2Zmc2V0ICsgQ0VOVFJBTF9ESVJFQ1RPUllfRVhUUkFfTEVOR1RIX09GRlNFVClcbiAgICAgICsgYXJjaGl2ZS5yZWFkVUludDE2TEUoZW50cnlPZmZzZXQgKyBDRU5UUkFMX0RJUkVDVE9SWV9DT01NRU5UX0xFTkdUSF9PRkZTRVQpO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogUmVhZHMgYW5kIGRlY29tcHJlc3NlcyBvbmUgZW50cnkncyBieXRlcy5cbiAqXG4gKiBUaGUgZGF0YSdzIHN0YXJ0IGlzIGNvbXB1dGVkIGZyb20gdGhlIExPQ0FMIGhlYWRlciByYXRoZXIgdGhhbiB0aGUgY2VudHJhbCBvbmU6IHRoZSB0d28gY2FycnlcbiAqIGluZGVwZW5kZW50IG5hbWUgYW5kIGV4dHJhLWZpZWxkIGxlbmd0aHMsIGFuZCBvbmx5IHRoZSBsb2NhbCBwYWlyIGRlc2NyaWJlcyB3aGVyZSB0aGUgYnl0ZXNcbiAqIGFjdHVhbGx5IGJlZ2luLlxuICpcbiAqIEBwYXJhbSBhcmNoaXZlIC0gVGhlIHJhdyBaSVAgYXJjaGl2ZSBieXRlcy5cbiAqIEBwYXJhbSBlbnRyeSAtIFRoZSBlbnRyeSwgYXMgcmVhZCBmcm9tIHRoZSBjZW50cmFsIGRpcmVjdG9yeS5cbiAqIEByZXR1cm5zIFRoZSBlbnRyeSdzIHVuY29tcHJlc3NlZCBjb250ZW50LlxuICovXG5mdW5jdGlvbiByZWFkRW50cnlEYXRhKGFyY2hpdmU6IEJ1ZmZlciwgZW50cnk6IFppcEVudHJ5KTogQnVmZmVyIHtcbiAgaWYgKGFyY2hpdmUucmVhZFVJbnQzMkxFKGVudHJ5LmxvY2FsSGVhZGVyT2Zmc2V0KSAhPT0gTE9DQUxfRklMRV9IRUFERVJfU0lHTkFUVVJFKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYXJjaGl2ZSBlbnRyeSAnJHtlbnRyeS5uYW1lfScgaGFzIGEgY29ycnVwdCBsb2NhbCBoZWFkZXIuYCk7XG4gIH1cblxuICBjb25zdCBkYXRhT2Zmc2V0ID0gZW50cnkubG9jYWxIZWFkZXJPZmZzZXRcbiAgICArIExPQ0FMX0hFQURFUl9TSVpFXG4gICAgKyBhcmNoaXZlLnJlYWRVSW50MTZMRShlbnRyeS5sb2NhbEhlYWRlck9mZnNldCArIExPQ0FMX0hFQURFUl9OQU1FX0xFTkdUSF9PRkZTRVQpXG4gICAgKyBhcmNoaXZlLnJlYWRVSW50MTZMRShlbnRyeS5sb2NhbEhlYWRlck9mZnNldCArIExPQ0FMX0hFQURFUl9FWFRSQV9MRU5HVEhfT0ZGU0VUKTtcbiAgY29uc3QgZGF0YUVuZCA9IGRhdGFPZmZzZXQgKyBlbnRyeS5jb21wcmVzc2VkU2l6ZTtcbiAgaWYgKGRhdGFFbmQgPiBhcmNoaXZlLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFyY2hpdmUgaXMgdHJ1bmNhdGVkOiBlbnRyeSAnJHtlbnRyeS5uYW1lfScgcnVucyBwYXN0IGl0cyBlbmQuYCk7XG4gIH1cblxuICBjb25zdCBjb21wcmVzc2VkRGF0YSA9IGFyY2hpdmUuc3ViYXJyYXkoZGF0YU9mZnNldCwgZGF0YUVuZCk7XG4gIHN3aXRjaCAoZW50cnkuY29tcHJlc3Npb25NZXRob2QpIHtcbiAgICBjYXNlIENPTVBSRVNTSU9OX01FVEhPRF9ERUZMQVRFRDoge1xuICAgICAgcmV0dXJuIGluZmxhdGVSYXdTeW5jKGNvbXByZXNzZWREYXRhKTtcbiAgICB9XG4gICAgY2FzZSBDT01QUkVTU0lPTl9NRVRIT0RfU1RPUkVEOiB7XG4gICAgICByZXR1cm4gY29tcHJlc3NlZERhdGE7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFyY2hpdmUgZW50cnkgJyR7ZW50cnkubmFtZX0nIHVzZXMgdW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kICR7U3RyaW5nKGVudHJ5LmNvbXByZXNzaW9uTWV0aG9kKX0uYCk7XG4gICAgfVxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/// <reference path="./library.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Extracts a ZIP archive to disk using only Node's `zlib` — with no third-party unzip dependency.
|
|
6
|
+
*
|
|
7
|
+
* It exists for one measured reason. The dependency it replaced on this path, `adm-zip`, bundled
|
|
8
|
+
* roughly 34 KB of minified JavaScript into EVERY Obsidian plugin built with this library: a plugin
|
|
9
|
+
* ships a single CJS `main.js`, esbuild has no code splitting to put a dependency behind, and a
|
|
10
|
+
* `await import()` only defers evaluation — the module body is inlined either way. `node:zlib` is
|
|
11
|
+
* already an esbuild external, so the same work now costs a plugin bundle nothing at all. Archives
|
|
12
|
+
* are still WRITTEN with `adm-zip` at release time (`script-utils/demo-vault.ts`), which is Node-side
|
|
13
|
+
* tooling and never reaches a plugin bundle.
|
|
14
|
+
*
|
|
15
|
+
* Deliberately narrow: it reads exactly what that writer produces — stored and deflated entries in an
|
|
16
|
+
* unencrypted archive below the 4 GB / 65535-entry ZIP64 threshold — and raises a named error for
|
|
17
|
+
* anything else rather than guessing at it. Sizes and offsets are taken from the central directory,
|
|
18
|
+
* which is authoritative even for archives written with data descriptors.
|
|
19
|
+
*
|
|
20
|
+
* The `node:` imports below are safe to merely EVALUATE on mobile — `require` hands back `undefined`
|
|
21
|
+
* there and nothing reads it at load time — so this module can sit in the generated barrels without
|
|
22
|
+
* breaking the library's load on Android. Only the calls are desktop-only.
|
|
23
|
+
*/
|
|
24
|
+
import type { Buffer } from 'node:buffer' with { 'resolution-mode': 'import' };
|
|
25
|
+
/**
|
|
26
|
+
* Parameters for {@link extractZipArchive}.
|
|
27
|
+
*/
|
|
28
|
+
export interface ExtractZipArchiveParams {
|
|
29
|
+
/**
|
|
30
|
+
* The raw ZIP archive bytes.
|
|
31
|
+
*/
|
|
32
|
+
readonly archive: Buffer;
|
|
33
|
+
/**
|
|
34
|
+
* The file-system implementation the extracted entries are written with.
|
|
35
|
+
*
|
|
36
|
+
* Injected rather than imported so the caller chooses which `fs` writes the files. The demo-vault
|
|
37
|
+
* opener hands over Electron's `original-fs` (see {@link ZipExtractionFileSystem}).
|
|
38
|
+
*/
|
|
39
|
+
readonly fileSystem: ZipExtractionFileSystem;
|
|
40
|
+
/**
|
|
41
|
+
* The directory to extract into. Created if it does not exist.
|
|
42
|
+
*/
|
|
43
|
+
readonly targetDirectory: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The slice of `node:fs` extraction needs.
|
|
47
|
+
*
|
|
48
|
+
* Only the two WRITING calls are required, and that is deliberate: Electron's asar layer intercepts
|
|
49
|
+
* `fs` READS (and `existsSync`) on any path containing `.asar`, which a demo vault may legitimately
|
|
50
|
+
* ship as a plain file. Never probing the target with a read keeps that interception out of the
|
|
51
|
+
* picture entirely, and a caller that hands over Electron's `original-fs` is safe even from the
|
|
52
|
+
* write side.
|
|
53
|
+
*/
|
|
54
|
+
export interface ZipExtractionFileSystem {
|
|
55
|
+
/**
|
|
56
|
+
* Creates a directory, including any missing parents.
|
|
57
|
+
*
|
|
58
|
+
* @param path - The directory to create.
|
|
59
|
+
* @param options - The {@link ZipExtractionMkdirOptions}.
|
|
60
|
+
* @returns The first directory created, if any.
|
|
61
|
+
*/
|
|
62
|
+
mkdirSync(path: string, options: ZipExtractionMkdirOptions): string | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Writes a file, overwriting it if it exists.
|
|
65
|
+
*
|
|
66
|
+
* @param path - The file to write.
|
|
67
|
+
* @param data - The bytes to write.
|
|
68
|
+
*/
|
|
69
|
+
writeFileSync(path: string, data: Buffer): void;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The options {@link ZipExtractionFileSystem.mkdirSync} is always called with.
|
|
73
|
+
*
|
|
74
|
+
* Extraction never probes for an existing directory, so every call has to create the missing parents
|
|
75
|
+
* itself and tolerate a directory that is already there.
|
|
76
|
+
*/
|
|
77
|
+
export interface ZipExtractionMkdirOptions {
|
|
78
|
+
/**
|
|
79
|
+
* Always `true`.
|
|
80
|
+
*/
|
|
81
|
+
readonly recursive: true;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Extracts every entry of a ZIP archive into a directory.
|
|
85
|
+
*
|
|
86
|
+
* Directory entries become directories; a file entry's parents are created whether or not the archive
|
|
87
|
+
* declared them. An entry whose name would escape {@link ExtractZipArchiveParams.targetDirectory} is
|
|
88
|
+
* refused rather than written (the "zip slip" traversal), as is an encrypted, ZIP64, or
|
|
89
|
+
* unknown-compression archive.
|
|
90
|
+
*
|
|
91
|
+
* @param params - The {@link ExtractZipArchiveParams}.
|
|
92
|
+
* @throws An {@link Error} naming the reason when the archive cannot be read as written.
|
|
93
|
+
*/
|
|
94
|
+
export declare function extractZipArchive(params: ExtractZipArchiveParams): void;
|
|
@@ -146,7 +146,7 @@ __export(generated_during_build_exports, {
|
|
|
146
146
|
LIBRARY_VERSION: () => LIBRARY_VERSION
|
|
147
147
|
});
|
|
148
148
|
module.exports = __toCommonJS(generated_during_build_exports);
|
|
149
|
-
const LIBRARY_VERSION = "
|
|
149
|
+
const LIBRARY_VERSION = "98.0.0";
|
|
150
150
|
const LIBRARY_STYLES = ".obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component pre, .obsidian-dev-utils.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-dev-utils.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-dev-utils.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-dev-utils.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-dev-utils.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-dev-utils.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-dev-utils-lock-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--text-muted);\n}\n.obsidian-dev-utils-lock-indicator .svg-icon {\n width: var(--icon-s);\n height: var(--icon-s);\n}\n\n@keyframes obsidian-dev-utils-lock-indicator-flash {\n 40% {\n color: var(--text-error);\n transform: scale(1.4);\n }\n}\n.obsidian-dev-utils-lock-indicator-flash {\n animation: obsidian-dev-utils-lock-indicator-flash 0.35s ease-in-out;\n}\n\n.obsidian-dev-utils input[type=url] {\n height: var(--input-height);\n}\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=tel],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=url],\n.obsidian-dev-utils input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-dev-utils input[type=month]:hover,\n .obsidian-dev-utils input[type=tel]:hover,\n .obsidian-dev-utils input[type=time]:hover,\n .obsidian-dev-utils input[type=url]:hover,\n .obsidian-dev-utils input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus, .obsidian-dev-utils input[type=month]:focus-visible,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=tel]:focus-visible,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=time]:focus-visible,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=url]:focus-visible,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus,\n.obsidian-dev-utils input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-dev-utils input[type=month]::placeholder,\n.obsidian-dev-utils input[type=tel]::placeholder,\n.obsidian-dev-utils input[type=time]::placeholder,\n.obsidian-dev-utils input[type=url]::placeholder,\n.obsidian-dev-utils input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-dev-utils input[type=month], .is-rtl .obsidian-dev-utils input[type=month], .rtl .obsidian-dev-utils input[type=month],\n.mod-rtl .obsidian-dev-utils input[type=time],\n.is-rtl .obsidian-dev-utils input[type=time],\n.rtl .obsidian-dev-utils input[type=time],\n.mod-rtl .obsidian-dev-utils input[type=week],\n.is-rtl .obsidian-dev-utils input[type=week],\n.rtl .obsidian-dev-utils input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\n.obsidian-dev-utilsprogress.loop {\n min-width: 200px;\n}\n\n@keyframes obsidian-dev-utils-minimized-modal-bar-pulse {\n 0%, 100% {\n box-shadow: var(--shadow-s);\n }\n 50% {\n box-shadow: 0 0 0 2px var(--interactive-accent);\n }\n}\n@keyframes obsidian-dev-utils-minimized-modal-bar-attention {\n 0% {\n box-shadow: 0 0 0 0 var(--interactive-accent);\n }\n 40% {\n box-shadow: 0 0 0 4px var(--interactive-accent);\n }\n 100% {\n box-shadow: var(--shadow-s);\n }\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button {\n position: absolute;\n top: var(--size-4-2);\n right: calc(var(--size-4-2) + var(--size-4-9));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n.obsidian-dev-utils.minimized-modal-bar {\n position: fixed;\n right: var(--size-4-4);\n bottom: calc(var(--size-4-4) + var(--size-4-8));\n z-index: var(--layer-modal);\n display: flex;\n align-items: center;\n gap: var(--size-4-2);\n padding: var(--size-4-2) var(--size-4-3);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-m);\n background: var(--background-secondary);\n box-shadow: var(--shadow-s);\n cursor: pointer;\n animation: obsidian-dev-utils-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-dev-utils.minimized-modal-bar:hover {\n background-image: linear-gradient(var(--background-modifier-hover), var(--background-modifier-hover));\n}\n.obsidian-dev-utils.minimized-modal-bar.minimized-modal-bar-attention {\n animation: obsidian-dev-utils-minimized-modal-bar-attention 0.35s ease-out;\n}\n.obsidian-dev-utils.minimized-modal-bar .minimized-modal-bar-title {\n font-weight: var(--font-medium);\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button,\n.obsidian-dev-utils.minimized-modal-bar .cancel-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button:hover,\n.obsidian-dev-utils.minimized-modal-bar .cancel-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n\n.obsidian-dev-utils.modal-commands {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-2-2);\n padding: var(--size-4-2) var(--size-4-3);\n border-top: 1px solid var(--background-modifier-border);\n}\n.obsidian-dev-utils.modal-command {\n display: inline-flex;\n align-items: baseline;\n gap: var(--size-2-2);\n min-height: var(--size-4-8);\n padding: var(--size-2-1) var(--size-4-2);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-s);\n background-color: var(--background-secondary);\n color: var(--text-muted);\n font-size: var(--font-ui-smaller);\n white-space: nowrap;\n cursor: pointer;\n}\n.obsidian-dev-utils.modal-command:hover:not(:disabled) {\n background-color: var(--background-modifier-hover);\n color: var(--text-normal);\n}\n.obsidian-dev-utils.modal-command.is-active {\n border-color: var(--interactive-accent);\n background-color: var(--interactive-accent);\n color: var(--text-on-accent);\n}\n.obsidian-dev-utils.modal-command:disabled {\n opacity: 0.5;\n cursor: default;\n}\n.obsidian-dev-utils.modal-command-hotkey {\n color: var(--text-faint);\n font-size: var(--font-smallest);\n}\n.modal-command.is-active .obsidian-dev-utils.modal-command-hotkey {\n opacity: 0.7;\n color: var(--text-on-accent);\n}\n\n.obsidian-dev-utils.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-dev-utils .multiple-dropdown-component select,\n.obsidian-dev-utils .multiple-dropdown-component select:focus,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-dev-utils .multiple-dropdown-component select option:checked,\n.obsidian-dev-utils .multiple-dropdown-component select:focus option:checked,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown option:checked {\n background-color: #1967d2;\n color: #fff;\n}\n\n.obsidian-dev-utils.plugin-notice-name {\n color: var(--text-accent);\n display: inline-block;\n font-weight: var(--font-bold);\n margin-bottom: var(--size-4-2);\n}\n.obsidian-dev-utils.plugin-notice-content {\n padding-right: var(--size-4-5);\n position: relative;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.cancel-button {\n display: block;\n margin-top: var(--size-4-2);\n width: fit-content;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.plugin-notice-close-button {\n position: absolute;\n right: var(--size-4-3);\n top: var(--size-4-3);\n}\n.obsidian-dev-utils.plugin-notice-requires-explicit-close.notice {\n padding: 0;\n}\n.obsidian-dev-utils.plugin-notice-requires-explicit-close.notice .obsidian-dev-utils.plugin-notice-content {\n padding: var(--size-4-3) var(--size-4-4);\n}\n\n.obsidian-dev-utils.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-dev-utils.plugin-suggestion-banner {\n background-color: var(--background-secondary);\n border-left: var(--size-2-1) solid var(--text-accent);\n border-radius: var(--radius-s);\n display: flex;\n flex-direction: column;\n gap: var(--size-4-2);\n margin-bottom: var(--size-4-4);\n padding: var(--size-4-3) var(--size-4-4);\n}\n.obsidian-dev-utils.plugin-suggestion-banner button {\n width: fit-content;\n}\n\n.obsidian-dev-utils.popover {\n max-width: min(420px, 90vw);\n min-width: 320px;\n padding: var(--size-4-2) var(--size-4-3);\n position: absolute;\n z-index: var(--layer-menu);\n}\n.obsidian-dev-utils.popover .setting-item {\n align-items: center;\n border-top: none;\n gap: var(--size-4-2);\n padding: var(--size-2-1) 0;\n}\n.obsidian-dev-utils.popover .setting-item-info {\n margin-right: 0;\n}\n.obsidian-dev-utils.popover .setting-item-control {\n flex-grow: 1;\n justify-content: flex-end;\n}\n.obsidian-dev-utils.popover input[type=text] {\n width: 100%;\n}\n\n.obsidian-dev-utils.prompt-modal .text-box {\n width: 100%;\n}\n\nbody button:not(.clickable-icon) {\n color: var(--text-color);\n}\n\n.obsidian-dev-utils.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-dev-utils :invalid:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid:not(.untouched), .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid:not(.untouched), .obsidian-dev-utils input.metadata-input-text:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=date]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=email]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=number]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=password]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=search]:focus:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:active:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils input[type=text]:focus:invalid:not(.untouched),\n.obsidian-dev-utils textarea:active:invalid:not(.untouched),\n.obsidian-dev-utils textarea:focus-visible:invalid:not(.untouched),\n.obsidian-dev-utils textarea:focus:invalid:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-dev-utils.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-dev-utils.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/editor-lock.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/minimizable-modal.scss%22,%22../src/styles/modal-commands.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-notice.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/plugin-suggestion.scss%22,%22../src/styles/popover.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tldraw-button-color-workaround.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACvCN;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAMJ;EACE;IACE;IACA;;;AAIJ;EACE;;;ACvBA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;ACjDJ;EACE;;;ACFJ;EACE;IAEE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOA;EACE;;AAOF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACE;EACA;;;ACpGN;EACE;EACA;EACA;EACA;EACA;;AAMF;EACE;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAKF;EACE;EACA;EACA;;AAKF;EACE;EACA;;AAIJ;EACE;EACA;;AAGA;EACE;EACA;;;AC3DF;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACTN;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAOJ;EACE;;AAEA;EACE;;;AChCF;EACE;;;ACFJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;ACRJ;EAIE;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;AC9BF;EACE;;;ACON;EACE;;;ACTE;EACE;;;ACKJ;EAPA;;AAuBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAvBJ;;AA6BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-dev-utils%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20Lock%20indicators%20shown%20in%20the%20tab%20header%20and%20the%20status%20bar%20while%20a%20note%20is%20locked.%20These%20live%20in%5Cn//%20global%20Obsidian%20DOM%20(tab%20header%20/%20status%20bar),%20so%20they%20are%20styled%20with%20a%20global%20class%20rather%20than%5Cn//%20scoped%20under%20%60.obsidian-dev-utils%60.%5Cn.obsidian-dev-utils-lock-indicator%20%7B%5Cn%20%20display:%20inline-flex;%5Cn%20%20align-items:%20center;%5Cn%20%20color:%20var(--text-muted);%5Cn%5Cn%20%20.svg-icon%20%7B%5Cn%20%20%20%20width:%20var(--icon-s);%5Cn%20%20%20%20height:%20var(--icon-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn//%20Flashed%20on%20every%20lock%20indicator%20(tab%20header,%20view%20action,%20status%20bar)%20when%20the%20user%20attempts%20to%5Cn//%20type%20in%20a%20locked%20note,%20to%20make%20clear%20the%20note%20is%20read-only.%20Re-added%20per%20rejected%20keystroke.%5Cn@keyframes%20obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20color:%20var(--text-error);%5Cn%20%20%20%20transform:%20scale(1.4);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%20animation:%20obsidian-dev-utils-lock-indicator-flash%200.35s%20ease-in-out;%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&progress.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@keyframes%20obsidian-dev-utils-minimized-modal-bar-pulse%20%7B%5Cn%20%200%25,%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%5Cn%20%2050%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%202px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn@keyframes%20obsidian-dev-utils-minimized-modal-bar-attention%20%7B%5Cn%20%200%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%200%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%204px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20//%20The%20minimize%20button%20lives%20inside%20the%20modal%20container,%20left%20of%20Obsidian's%20close%20button.%5Cn%20%20&.minimizable-modal%20%7B%5Cn%20%20%20%20.minimize-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20right:%20calc(var(--size-4-2)%20+%20var(--size-4-9));%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20The%20minimized%20bar%20is%20appended%20to%20document.body.%20It%20floats%20at%20the%20bottom-right%20while%20minimized,%5Cn%20%20//%20and%20gently%20pulses%20an%20accent%20ring%20so%20the%20user%20does%20not%20forget%20about%20the%20minimized%20operation.%5Cn%20%20//%20It%20floats%20a%20status-bar's%20height%20above%20the%20bottom%20edge%20so%20it%20never%20covers%20the%20bottom-right%5Cn%20%20//%20status-bar%20items%20(e.g.%20the%20editor-lock%20unlock%20indicator,%20which%20lives%20in%20the%20same%20corner).%5Cn%20%20&.minimized-modal-bar%20%7B%5Cn%20%20%20%20position:%20fixed;%5Cn%20%20%20%20right:%20var(--size-4-4);%5Cn%20%20%20%20bottom:%20calc(var(--size-4-4)%20+%20var(--size-4-8));%5Cn%20%20%20%20z-index:%20var(--layer-modal);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20align-items:%20center;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-m);%5Cn%20%20%20%20background:%20var(--background-secondary);%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20//%20Layer%20the%20translucent%20hover%20tint%20over%20the%20opaque%20%60background%60%20(%60--background-secondary%60)%20via%5Cn%20%20%20%20//%20%60background-image%60%20instead%20of%20replacing%20the%20background-color.%20%60--background-modifier-hover%60%20is%5Cn%20%20%20%20//%20translucent,%20so%20setting%20it%20as%20%60background%60%20would%20let%20the%20editor%20content%20behind%20the%20floating%20bar%5Cn%20%20%20%20//%20bleed%20through%20and%20make%20the%20title%20unreadable.%20A%20gradient%20of%20the%20tint%20composited%20over%20the%20opaque%5Cn%20%20%20%20//%20base%20keeps%20the%20bar%20opaque%20while%20preserving%20the%20subtle%20hover%20highlight.%5Cn%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20background-image:%20linear-gradient(var(--background-modifier-hover),%20var(--background-modifier-hover));%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20one-shot,%20more%20pronounced%20flash%20played%20when%20the%20user%20attempts%20a%20blocked%20action%20(a%20keystroke,%5Cn%20%20%20%20//%20right-click,%20or%20opening%20another%20modal)%20while%20this%20modal%20is%20minimized,%20so%20the%20block%20is%20not%5Cn%20%20%20%20//%20silent.%20Its%20higher%20specificity%20overrides%20the%20gentle%20infinite%20idle%20pulse%20while%20it%20plays;%20the%5Cn%20%20%20%20//%20class%20is%20removed%20on%20%60animationend%60,%20restoring%20the%20idle%20pulse.%5Cn%20%20%20%20&.minimized-modal-bar-attention%20%7B%5Cn%20%20%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-attention%200.35s%20ease-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.minimized-modal-bar-title%20%7B%5Cn%20%20%20%20%20%20font-weight:%20var(--font-medium);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.restore-button,%5Cn%20%20%20%20.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20//%20The%20strip%20of%20commands%20along%20the%20bottom%20of%20a%20modal.%5Cn%20%20//%5Cn%20%20//%20In%20%60Instructions%60%20render%20mode%20it%20also%20carries%20Obsidian's%20own%20%60.prompt-instructions%60,%20so%20this%20rule%20only%5Cn%20%20//%20has%20to%20supply%20the%20separator%20and%20the%20wrapping%20that%20a%20self-created%20bar%20does%20not%20inherit;%20in%20%60Buttons%60%5Cn%20%20//%20mode%20it%20is%20the%20whole%20strip.%5Cn%20%20&.modal-commands%20%7B%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20flex-wrap:%20wrap;%5Cn%20%20%20%20gap:%20var(--size-2-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border-top:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%7D%5Cn%5Cn%20%20//%20One%20command%20button.%20Replaces%20the%20instruction%20bar%20rather%20than%20supplementing%20it:%20the%20bar%20can%20only%20ever%5Cn%20%20//%20say%20which%20key%20to%20press,%20and%20on%20a%20phone%20there%20is%20no%20modifier%20key%20to%20press,%20so%20every%20control%20it%20names%5Cn%20%20//%20is%20unreachable%20there.%5Cn%20%20&.modal-command%20%7B%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%20%20align-items:%20baseline;%5Cn%20%20%20%20gap:%20var(--size-2-2);%5Cn%5Cn%20%20%20%20//%20Comfortably%20tappable%20on%20a%20phone,%20where%20this%20strip%20is%20the%20only%20way%20in.%5Cn%20%20%20%20min-height:%20var(--size-4-8);%5Cn%20%20%20%20padding:%20var(--size-2-1)%20var(--size-4-2);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20background-color:%20var(--background-secondary);%5Cn%20%20%20%20color:%20var(--text-muted);%5Cn%20%20%20%20font-size:%20var(--font-ui-smaller);%5Cn%20%20%20%20white-space:%20nowrap;%5Cn%20%20%20%20cursor:%20pointer;%5Cn%5Cn%20%20%20%20&:hover:not(:disabled)%20%7B%5Cn%20%20%20%20%20%20background-color:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20toggle%20that%20is%20ON.%20An%20action%20never%20carries%20it%20%E2%80%94%20it%20does%20something%20and%20is%20done,%20so%20there%20is%20no%5Cn%20%20%20%20//%20state%20for%20it%20to%20show.%5Cn%20%20%20%20&.is-active%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--interactive-accent);%5Cn%20%20%20%20%20%20background-color:%20var(--interactive-accent);%5Cn%20%20%20%20%20%20color:%20var(--text-on-accent);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20Disabled%20rather%20than%20removed:%20a%20strip%20that%20lost%20buttons%20as%20modes%20change%20would%20reflow%20under%20the%5Cn%20%20%20%20//%20pointer,%20which%20on%20a%20phone%20means%20a%20mis-tap.%5Cn%20%20%20%20&:disabled%20%7B%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%20%20cursor:%20default;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.modal-command-hotkey%20%7B%5Cn%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20font-size:%20var(--font-smallest);%5Cn%5Cn%20%20%20%20//%20Faint%20against%20the%20surface%20is%20right;%20faint%20against%20the%20accent%20fill%20is%20invisible.%5Cn%20%20%20%20.modal-command.is-active%20&%20%7B%5Cn%20%20%20%20%20%20opacity:%200.7;%5Cn%20%20%20%20%20%20color:%20var(--text-on-accent);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20%231967d2;%5Cn%20%20%20%20%20%20%20%20color:%20%23fff;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-notice-name%20%7B%5Cn%20%20%20%20color:%20var(--text-accent);%5Cn%20%20%20%20display:%20inline-block;%5Cn%20%20%20%20font-weight:%20var(--font-bold);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-2);%5Cn%20%20%7D%5Cn%5Cn%20%20&.plugin-notice-content%20%7B%5Cn%20%20%20%20padding-right:%20var(--size-4-5);%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20The%20close%20button%20reuses%20Obsidian's%20%60modal-header-button%60%20+%20%60clickable-icon%60%20classes%20so%20it%20matches%5Cn%20%20%20%20//%20The%20native%20modal%20close%20button%20(box%20+%20hover);%20only%20its%20corner%20position%20is%20set%20here.%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-close-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20right:%20var(--size-4-3);%5Cn%20%20%20%20%20%20top:%20var(--size-4-3);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20Move%20the%20notice's%20own%20padding%20onto%20the%20content%20wrapper%20so%20the%20wrapper%20covers%20the%20whole%20clickable%5Cn%20%20//%20Area%20%E2%80%94%20otherwise%20a%20click%20landing%20on%20the%20notice's%20bare%20padding%20(outside%20the%20wrapper)%20would%20bypass%20the%5Cn%20%20//%20Stop-propagation%20guard%20and%20dismiss%20the%20hard-to-close%20notice.%5Cn%20%20&.plugin-notice-requires-explicit-close.notice%20%7B%5Cn%20%20%20%20padding:%200;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-content%20%7B%5Cn%20%20%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-suggestion-banner%20%7B%5Cn%20%20%20%20background-color:%20var(--background-secondary);%5Cn%20%20%20%20border-left:%20var(--size-2-1)%20solid%20var(--text-accent);%5Cn%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20flex-direction:%20column;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-4);%5Cn%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%5Cn%20%20%20%20button%20%7B%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20A%20popover%20is%20anchored%20at%20a%20point%20and%20appended%20to%20the%20document%20body,%20outside%20any%20plugin-scoped%5Cn//%20container,%20so%20it%20is%20positioned%20absolutely%20at%20the%20top%20level.%20It%20borrows%20Obsidian's%20%60.menu%60%20look,%5Cn//%20which%20already%20carries%20the%20popup%20background,%20border%20and%20shadow%20%E2%80%94%20only%20layout%20is%20set%20here.%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20&.popover%20%7B%5Cn%20%20%20%20//%20Deliberately%20not%20%60calc(100vw%20-%2016px)%60:%20the%20SCSS%20compiler%20strips%20the%20%60calc(%60%20wrapper%20inside%5Cn%20%20%20%20//%20%60min()%60,%20which%20yields%20invalid%20CSS.%20A%20viewport%20percentage%20keeps%20a%20narrow%20window's%20popover%20on%5Cn%20%20%20%20//%20screen.%5Cn%20%20%20%20max-width:%20min(420px,%2090vw);%5Cn%20%20%20%20min-width:%20320px;%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20z-index:%20var(--layer-menu);%5Cn%5Cn%20%20%20%20//%20Setting%20rows%20are%20built%20for%20a%20full-width%20settings%20tab;%20compact%20them%20for%20a%20popover.%5Cn%20%20%20%20.setting-item%20%7B%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20border-top:%20none;%5Cn%20%20%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20%20%20padding:%20var(--size-2-1)%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-info%20%7B%5Cn%20%20%20%20%20%20margin-right:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-control%20%7B%5Cn%20%20%20%20%20%20flex-grow:%201;%5Cn%20%20%20%20%20%20justify-content:%20flex-end;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20input%5Btype='text'%5D%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20The%20tldraw%20Obsidian%20plugin%20(tldraw/obsidian-plugin)%20ships%20an%20unscoped%20global%20rule%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20currentColor%20%7D%60%20that%20overrides%20Obsidian's%20own%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20var(--text-color)%20%7D%60%20app-wide.%20Obsidian%20sets%5Cn//%20%60--text-color%60%20contextually%20per%20button%20variant%20(%60--text-normal%60%20by%20default,%5Cn//%20%60--text-on-accent%60%20for%20%60.mod-cta%60,%20%60--text-error%60%20for%20%60.mod-warning%60),%20so%20tldraw's%5Cn//%20%60currentColor%60%20discards%20that%20and%20breaks%20button%20contrast%20outside%20tldraw%20%E2%80%94%20e.g.%5Cn//%20White-on-white%20action%20buttons%20inside%20a%20Notice.%20Re-assert%20Obsidian's%20own%20value%20with%20a%5Cn//%20%60body%60-prefixed%20selector%20(specificity%200,1,2)%20so%20it%20wins%20over%20tldraw's%20(0,1,1)%20while%5Cn//%20Staying%20correct%20for%20every%20button%20variant%20(it%20reuses%20the%20same%20contextual%20%60--text-color%60).%5Cn//%20Defensive%20workaround%20%E2%80%94%20remove%20once%20the%20upstream%20fix%20ships%20(tldraw/obsidian-plugin%23210).%5Cnbody%20button:not(.clickable-icon)%20%7B%5Cn%20%20color:%20var(--text-color);%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn//%20An%20input%20the%20user%20has%20not%20interacted%20with%20yet%20carries%20%60.untouched%60%20(set%20by%20%60PromptModal%60),%20so%20a%20modal%20that%5Cn//%20opens%20invalid%20by%20design%20does%20not%20greet%20the%20user%20in%20red.%20Both%20blocks%20below%20must%20be%20gated:%20the%20input%20is%5Cn//%20focused%20on%20open,%20so%20the%20focus%20block%20alone%20would%20keep%20painting%20it.%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20:invalid:not(.untouched)%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid:not(.untouched)%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
|
|
151
151
|
// Annotate the CommonJS export names for ESM import in node:
|
|
152
152
|
0 && (module.exports = {
|
package/dist/lib/cjs/index.cjs
CHANGED
|
@@ -162,6 +162,7 @@ __export(index_exports, {
|
|
|
162
162
|
codemirror: () => codemirror,
|
|
163
163
|
debug: () => debug,
|
|
164
164
|
"debug-controller": () => debug_controller,
|
|
165
|
+
"desktop-zip-extractor": () => desktop_zip_extractor,
|
|
165
166
|
disposable: () => disposable,
|
|
166
167
|
enum: () => enum2,
|
|
167
168
|
error: () => error,
|
|
@@ -196,6 +197,7 @@ var blob = __toESM(__extractDefault(require('./blob.cjs')), 1);
|
|
|
196
197
|
var codemirror = __toESM(__extractDefault(require('./codemirror/index.cjs')), 1);
|
|
197
198
|
var debug_controller = __toESM(__extractDefault(require('./debug-controller.cjs')), 1);
|
|
198
199
|
var debug = __toESM(__extractDefault(require('./debug.cjs')), 1);
|
|
200
|
+
var desktop_zip_extractor = __toESM(__extractDefault(require('./desktop-zip-extractor.cjs')), 1);
|
|
199
201
|
var disposable = __toESM(__extractDefault(require('./disposable.cjs')), 1);
|
|
200
202
|
var enum2 = __toESM(__extractDefault(require('./enum.cjs')), 1);
|
|
201
203
|
var error = __toESM(__extractDefault(require('./error.cjs')), 1);
|
|
@@ -230,6 +232,7 @@ var value_wrapper = __toESM(__extractDefault(require('./value-wrapper.cjs')), 1)
|
|
|
230
232
|
codemirror,
|
|
231
233
|
debug,
|
|
232
234
|
"debug-controller": null,
|
|
235
|
+
"desktop-zip-extractor": null,
|
|
233
236
|
disposable,
|
|
234
237
|
enum: null,
|
|
235
238
|
error,
|
|
@@ -253,4 +256,4 @@ var value_wrapper = __toESM(__extractDefault(require('./value-wrapper.cjs')), 1)
|
|
|
253
256
|
"value-provider": null,
|
|
254
257
|
"value-wrapper": null
|
|
255
258
|
});
|
|
256
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
259
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ19fbWVyZ2VkJyBmcm9tICcuL19fbWVyZ2VkLnRzJztcbmV4cG9ydCAqIGFzICdhYm9ydC1jb250cm9sbGVyJyBmcm9tICcuL2Fib3J0LWNvbnRyb2xsZXIudHMnO1xuZXhwb3J0ICogYXMgJ2FycmF5JyBmcm9tICcuL2FycmF5LnRzJztcbmV4cG9ydCAqIGFzICdhc3luYy1ldmVudHMnIGZyb20gJy4vYXN5bmMtZXZlbnRzLnRzJztcbmV4cG9ydCAqIGFzICdhc3luYycgZnJvbSAnLi9hc3luYy50cyc7XG5leHBvcnQgKiBhcyAnYmVlcGVyJyBmcm9tICcuL2JlZXBlci50cyc7XG5leHBvcnQgKiBhcyAnYmxvYicgZnJvbSAnLi9ibG9iLnRzJztcbmV4cG9ydCAqIGFzICdjb2RlbWlycm9yJyBmcm9tICcuL2NvZGVtaXJyb3IvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2RlYnVnLWNvbnRyb2xsZXInIGZyb20gJy4vZGVidWctY29udHJvbGxlci50cyc7XG5leHBvcnQgKiBhcyAnZGVidWcnIGZyb20gJy4vZGVidWcudHMnO1xuZXhwb3J0ICogYXMgJ2Rlc2t0b3AtemlwLWV4dHJhY3RvcicgZnJvbSAnLi9kZXNrdG9wLXppcC1leHRyYWN0b3IudHMnO1xuZXhwb3J0ICogYXMgJ2Rpc3Bvc2FibGUnIGZyb20gJy4vZGlzcG9zYWJsZS50cyc7XG5leHBvcnQgKiBhcyAnZW51bScgZnJvbSAnLi9lbnVtLnRzJztcbmV4cG9ydCAqIGFzICdlcnJvcicgZnJvbSAnLi9lcnJvci50cyc7XG5leHBvcnQgKiBhcyAnZnVuY3Rpb24nIGZyb20gJy4vZnVuY3Rpb24udHMnO1xuZXhwb3J0ICogYXMgJ2dlbmVyYXRlZC1kdXJpbmctYnVpbGQnIGZyb20gJy4vZ2VuZXJhdGVkLWR1cmluZy1idWlsZC50cyc7XG5leHBvcnQgKiBhcyAnaHRtbC1lbGVtZW50JyBmcm9tICcuL2h0bWwtZWxlbWVudC50cyc7XG5leHBvcnQgKiBhcyAnanBlZy1tZXRhZGF0YScgZnJvbSAnLi9qcGVnLW1ldGFkYXRhLnRzJztcbmV4cG9ydCAqIGFzICdsaWJyYXJ5JyBmcm9tICcuL2xpYnJhcnkudHMnO1xuZXhwb3J0ICogYXMgJ29iamVjdC11dGlscycgZnJvbSAnLi9vYmplY3QtdXRpbHMudHMnO1xuZXhwb3J0ICogYXMgJ29ic2lkaWFuJyBmcm9tICcuL29ic2lkaWFuL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdvYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUnIGZyb20gJy4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmV4cG9ydCAqIGFzICdwYXRoJyBmcm9tICcuL3BhdGgudHMnO1xuZXhwb3J0ICogYXMgJ3JlZy1leHAnIGZyb20gJy4vcmVnLWV4cC50cyc7XG5leHBvcnQgKiBhcyAnc3RyaWN0LXByb3h5JyBmcm9tICcuL3N0cmljdC1wcm94eS50cyc7XG5leHBvcnQgKiBhcyAnc3RyaW5nJyBmcm9tICcuL3N0cmluZy50cyc7XG5leHBvcnQgKiBhcyAndHJhbnNmb3JtZXJzJyBmcm9tICcuL3RyYW5zZm9ybWVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAndHdvLXdheS1tYXAnIGZyb20gJy4vdHdvLXdheS1tYXAudHMnO1xuZXhwb3J0ICogYXMgJ3R5cGUtZ3VhcmRzJyBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcbmV4cG9ydCAqIGFzICd0eXBlJyBmcm9tICcuL3R5cGUudHMnO1xuZXhwb3J0ICogYXMgJ3VybCcgZnJvbSAnLi91cmwudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbHVlLXByb3ZpZGVyJyBmcm9tICcuL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmV4cG9ydCAqIGFzICd2YWx1ZS13cmFwcGVyJyBmcm9tICcuL3ZhbHVlLXdyYXBwZXIudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQSw0QkFBQUE7QUFBQSxFQUFBO0FBQUE7QUFBQSx3QkFBQUM7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsNEJBQUFDO0FBQUEsRUFBQSwrQkFBQUM7QUFBQSxFQUFBO0FBQUEsY0FBQUM7QUFBQSxFQUFBO0FBQUEsa0JBQUFDO0FBQUEsRUFBQSxnQ0FBQUM7QUFBQSxFQUFBLHNCQUFBQztBQUFBLEVBQUEsdUJBQUFDO0FBQUEsRUFBQTtBQUFBLHdCQUFBQztBQUFBLEVBQUE7QUFBQSxvQ0FBQUM7QUFBQSxFQUFBO0FBQUEsbUJBQUFDO0FBQUEsRUFBQSxzQkFBQUM7QUFBQSxFQUFBO0FBQUE7QUFBQSx1QkFBQUM7QUFBQSxFQUFBO0FBQUEsdUJBQUFDO0FBQUEsRUFBQTtBQUFBLDBCQUFBQztBQUFBLEVBQUEsdUJBQUFDO0FBQUE7QUFBQTtBQUVBLGVBQTRCO0FBQzVCLElBQUFoQixtQkFBb0M7QUFDcEMsWUFBeUI7QUFDekIsSUFBQUMsZUFBZ0M7QUFDaEMsWUFBeUI7QUFDekIsYUFBMEI7QUFDMUIsV0FBd0I7QUFDeEIsaUJBQThCO0FBQzlCLElBQUFDLG1CQUFvQztBQUNwQyxZQUF5QjtBQUN6QixJQUFBQyx3QkFBeUM7QUFDekMsaUJBQThCO0FBQzlCLElBQUFDLFFBQXdCO0FBQ3hCLFlBQXlCO0FBQ3pCLElBQUFDLFlBQTRCO0FBQzVCLElBQUFDLHlCQUEwQztBQUMxQyxJQUFBQyxlQUFnQztBQUNoQyxJQUFBQyxnQkFBaUM7QUFDakMsY0FBMkI7QUFDM0IsSUFBQUMsZUFBZ0M7QUFDaEMsZUFBNEI7QUFDNUIsSUFBQUMsMkJBQTRDO0FBQzVDLFdBQXdCO0FBQ3hCLElBQUFDLFVBQTJCO0FBQzNCLElBQUFDLGVBQWdDO0FBQ2hDLGFBQTBCO0FBQzFCLG1CQUFnQztBQUNoQyxJQUFBQyxjQUErQjtBQUMvQixJQUFBQyxjQUErQjtBQUMvQixXQUF3QjtBQUN4QixVQUF1QjtBQUN2QixJQUFBQyxpQkFBa0M7QUFDbEMsSUFBQUMsZ0JBQWlDOyIsCiAgIm5hbWVzIjogWyJhYm9ydC1jb250cm9sbGVyIiwgImFzeW5jLWV2ZW50cyIsICJkZWJ1Zy1jb250cm9sbGVyIiwgImRlc2t0b3AtemlwLWV4dHJhY3RvciIsICJlbnVtIiwgImZ1bmN0aW9uIiwgImdlbmVyYXRlZC1kdXJpbmctYnVpbGQiLCAiaHRtbC1lbGVtZW50IiwgImpwZWctbWV0YWRhdGEiLCAib2JqZWN0LXV0aWxzIiwgIm9ic2lkaWFuLWRldi11dGlscy1zdGF0ZSIsICJyZWctZXhwIiwgInN0cmljdC1wcm94eSIsICJ0d28td2F5LW1hcCIsICJ0eXBlLWd1YXJkcyIsICJ2YWx1ZS1wcm92aWRlciIsICJ2YWx1ZS13cmFwcGVyIl0KfQo=
|
package/dist/lib/cjs/index.d.cts
CHANGED
|
@@ -9,6 +9,7 @@ export * as 'blob' from './blob.cjs';
|
|
|
9
9
|
export * as 'codemirror' from './codemirror/index.cjs';
|
|
10
10
|
export * as 'debug-controller' from './debug-controller.cjs';
|
|
11
11
|
export * as 'debug' from './debug.cjs';
|
|
12
|
+
export * as 'desktop-zip-extractor' from './desktop-zip-extractor.cjs';
|
|
12
13
|
export * as 'disposable' from './disposable.cjs';
|
|
13
14
|
export * as 'enum' from './enum.cjs';
|
|
14
15
|
export * as 'error' from './error.cjs';
|