@mnaoumov/obsidian-dev-toolkit 2.1.0 → 3.1.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.
Files changed (131) hide show
  1. package/README.md +6 -2
  2. package/bin/archive-demo-vault.mjs +8 -0
  3. package/bin/generate-coverage-badge.mjs +8 -0
  4. package/bundlers/esbuild-impl/feature-options/package.json +6 -0
  5. package/bundlers/obsidian-cli-reload/package.json +6 -0
  6. package/bundlers/obsidian-plugin-build/package.json +6 -0
  7. package/bundlers/obsidian-plugin-features/package.json +6 -0
  8. package/bundlers/obsidian-plugin-transforms/package.json +6 -0
  9. package/bundlers/obsidian-plugin-webpack-loader/package.json +6 -0
  10. package/bundlers/obsidian-plugins-folder-deployment/package.json +6 -0
  11. package/bundlers/parcel/package.json +6 -0
  12. package/bundlers/rollup/package.json +6 -0
  13. package/bundlers/rollup-compatible/package.json +6 -0
  14. package/bundlers/rollup-compatible-features/package.json +6 -0
  15. package/bundlers/vite/package.json +6 -0
  16. package/bundlers/webpack/package.json +6 -0
  17. package/dist/demo-vault-helper/main.js +6 -442
  18. package/dist/integration-test-plugin/main.js +918 -4912
  19. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +3 -188
  20. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +2 -18
  21. package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.cjs +173 -0
  22. package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.d.cts +60 -0
  23. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +4 -1
  24. package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +1 -0
  25. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +30 -82
  26. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +7 -24
  27. package/dist/lib/cjs/bundlers/index.cjs +39 -3
  28. package/dist/lib/cjs/bundlers/index.d.cts +12 -0
  29. package/dist/lib/cjs/bundlers/obsidian-cli-reload.cjs +182 -0
  30. package/dist/lib/cjs/bundlers/obsidian-cli-reload.d.cts +37 -0
  31. package/dist/lib/cjs/bundlers/obsidian-plugin-build.cjs +278 -0
  32. package/dist/lib/cjs/bundlers/obsidian-plugin-build.d.cts +217 -0
  33. package/dist/lib/cjs/bundlers/obsidian-plugin-features.cjs +242 -0
  34. package/dist/lib/cjs/bundlers/obsidian-plugin-features.d.cts +186 -0
  35. package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.cjs +306 -0
  36. package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.d.cts +231 -0
  37. package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.cjs +182 -0
  38. package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.d.cts +47 -0
  39. package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.cjs +320 -0
  40. package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.d.cts +44 -0
  41. package/dist/lib/cjs/bundlers/parcel.cjs +462 -0
  42. package/dist/lib/cjs/bundlers/parcel.d.cts +128 -0
  43. package/dist/lib/cjs/bundlers/rollup-compatible-features.cjs +181 -0
  44. package/dist/lib/cjs/bundlers/rollup-compatible-features.d.cts +128 -0
  45. package/dist/lib/cjs/bundlers/rollup-compatible.cjs +138 -0
  46. package/dist/lib/cjs/bundlers/rollup-compatible.d.cts +84 -0
  47. package/dist/lib/cjs/bundlers/rollup.cjs +218 -0
  48. package/dist/lib/cjs/bundlers/rollup.d.cts +99 -0
  49. package/dist/lib/cjs/bundlers/vite.cjs +229 -0
  50. package/dist/lib/cjs/bundlers/vite.d.cts +105 -0
  51. package/dist/lib/cjs/bundlers/webpack.cjs +354 -0
  52. package/dist/lib/cjs/bundlers/webpack.d.cts +133 -0
  53. package/dist/lib/cjs/demo-vault-cli.cjs +131 -0
  54. package/dist/lib/cjs/demo-vault-cli.d.cts +15 -0
  55. package/dist/lib/cjs/index.cjs +4 -1
  56. package/dist/lib/cjs/index.d.cts +1 -0
  57. package/dist/lib/cjs/test-runners/coverage-badge-cli.cjs +160 -0
  58. package/dist/lib/cjs/test-runners/coverage-badge-cli.d.cts +25 -0
  59. package/dist/lib/cjs/test-runners/coverage-badge.cjs +279 -0
  60. package/dist/lib/cjs/test-runners/coverage-badge.d.cts +143 -0
  61. package/dist/lib/cjs/test-runners/e2e-runner-support.cjs +170 -0
  62. package/dist/lib/cjs/test-runners/e2e-runner-support.d.cts +36 -0
  63. package/dist/lib/cjs/test-runners/index.cjs +18 -3
  64. package/dist/lib/cjs/test-runners/index.d.cts +5 -0
  65. package/dist/lib/cjs/test-runners/obsidian-test-runner.cjs +147 -0
  66. package/dist/lib/cjs/test-runners/obsidian-test-runner.d.cts +42 -0
  67. package/dist/lib/cjs/test-runners/wdio-obsidian.cjs +205 -0
  68. package/dist/lib/cjs/test-runners/wdio-obsidian.d.cts +199 -0
  69. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +2 -18
  70. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +3 -192
  71. package/dist/lib/esm/bundlers/esbuild-impl/feature-options.d.mts +60 -0
  72. package/dist/lib/esm/bundlers/esbuild-impl/feature-options.mjs +82 -0
  73. package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +1 -0
  74. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +3 -1
  75. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +7 -24
  76. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +41 -87
  77. package/dist/lib/esm/bundlers/index.d.mts +12 -0
  78. package/dist/lib/esm/bundlers/index.mjs +26 -2
  79. package/dist/lib/esm/bundlers/obsidian-cli-reload.d.mts +37 -0
  80. package/dist/lib/esm/bundlers/obsidian-cli-reload.mjs +83 -0
  81. package/dist/lib/esm/bundlers/obsidian-plugin-build.d.mts +217 -0
  82. package/dist/lib/esm/bundlers/obsidian-plugin-build.mjs +166 -0
  83. package/dist/lib/esm/bundlers/obsidian-plugin-features.d.mts +186 -0
  84. package/dist/lib/esm/bundlers/obsidian-plugin-features.mjs +126 -0
  85. package/dist/lib/esm/bundlers/obsidian-plugin-transforms.d.mts +231 -0
  86. package/dist/lib/esm/bundlers/obsidian-plugin-transforms.mjs +194 -0
  87. package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.d.mts +47 -0
  88. package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.mjs +89 -0
  89. package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.d.mts +44 -0
  90. package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.mjs +228 -0
  91. package/dist/lib/esm/bundlers/parcel.d.mts +128 -0
  92. package/dist/lib/esm/bundlers/parcel.mjs +361 -0
  93. package/dist/lib/esm/bundlers/rollup-compatible-features.d.mts +128 -0
  94. package/dist/lib/esm/bundlers/rollup-compatible-features.mjs +93 -0
  95. package/dist/lib/esm/bundlers/rollup-compatible.d.mts +84 -0
  96. package/dist/lib/esm/bundlers/rollup-compatible.mjs +43 -0
  97. package/dist/lib/esm/bundlers/rollup.d.mts +99 -0
  98. package/dist/lib/esm/bundlers/rollup.mjs +130 -0
  99. package/dist/lib/esm/bundlers/vite.d.mts +105 -0
  100. package/dist/lib/esm/bundlers/vite.mjs +144 -0
  101. package/dist/lib/esm/bundlers/webpack.d.mts +133 -0
  102. package/dist/lib/esm/bundlers/webpack.mjs +259 -0
  103. package/dist/lib/esm/demo-vault-cli.d.mts +15 -0
  104. package/dist/lib/esm/demo-vault-cli.mjs +23 -0
  105. package/dist/lib/esm/index.d.mts +1 -0
  106. package/dist/lib/esm/index.mjs +3 -1
  107. package/dist/lib/esm/test-runners/coverage-badge-cli.d.mts +25 -0
  108. package/dist/lib/esm/test-runners/coverage-badge-cli.mjs +51 -0
  109. package/dist/lib/esm/test-runners/coverage-badge.d.mts +143 -0
  110. package/dist/lib/esm/test-runners/coverage-badge.mjs +181 -0
  111. package/dist/lib/esm/test-runners/e2e-runner-support.d.mts +36 -0
  112. package/dist/lib/esm/test-runners/e2e-runner-support.mjs +61 -0
  113. package/dist/lib/esm/test-runners/index.d.mts +5 -0
  114. package/dist/lib/esm/test-runners/index.mjs +12 -2
  115. package/dist/lib/esm/test-runners/obsidian-test-runner.d.mts +42 -0
  116. package/dist/lib/esm/test-runners/obsidian-test-runner.mjs +52 -0
  117. package/dist/lib/esm/test-runners/wdio-obsidian.d.mts +199 -0
  118. package/dist/lib/esm/test-runners/wdio-obsidian.mjs +110 -0
  119. package/package.json +104 -5
  120. package/test-runners/coverage-badge/package.json +6 -0
  121. package/test-runners/coverage-badge-cli/package.json +6 -0
  122. package/test-runners/e2e-runner-support/package.json +6 -0
  123. package/test-runners/obsidian-test-runner/package.json +6 -0
  124. package/test-runners/wdio-obsidian/package.json +6 -0
  125. package/tsconfig/preact.json +7 -0
  126. package/tsconfig/react.json +7 -0
  127. package/tsconfig/solid.json +7 -0
  128. package/tsconfig/svelte.json +7 -0
  129. package/tsconfig/vue.json +7 -0
  130. package/types/styles.d.ts +32 -0
  131. package/types/wasm.d.ts +11 -0
@@ -0,0 +1,361 @@
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
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import { CliTaskResult } from "@mnaoumov/typescript-dev-toolkit/cli-utils";
34
+ import { npmRunOptional } from "@mnaoumov/typescript-dev-toolkit/npm-run";
35
+ import { invokeAsyncSafely } from "@mnaoumov/typescript-lib/async";
36
+ import {
37
+ extname,
38
+ join,
39
+ relative,
40
+ toPosixPath
41
+ } from "@mnaoumov/typescript-lib/path";
42
+ import { existsSync } from "node:fs";
43
+ import {
44
+ mkdir,
45
+ readFile,
46
+ writeFile
47
+ } from "node:fs/promises";
48
+ import { ObsidianPluginRepoPaths } from "../obsidian-plugin-repo-paths.mjs";
49
+ import {
50
+ BuildMode,
51
+ cleanObsidianPluginDistFolder,
52
+ completeObsidianPluginDistFolder,
53
+ getObsidianPluginBanner,
54
+ OBSIDIAN_PLUGIN_EXTERNALS,
55
+ resolveFromRoot,
56
+ resolveObsidianPluginBuildContext
57
+ } from "./obsidian-plugin-build.mjs";
58
+ import {
59
+ getFrameworkDefines,
60
+ getJsxImportSource,
61
+ isPostcssNeeded
62
+ } from "./obsidian-plugin-features.mjs";
63
+ import { deployToObsidianPluginsFolder } from "./obsidian-plugins-folder-deployment.mjs";
64
+ const PARCEL_CACHE_FOLDER = ".parcel-cache";
65
+ const GENERATED_PARCEL_CONFIG_FOLDER = `${PARCEL_CACHE_FOLDER}/obsidian-dev-toolkit`;
66
+ const PARCELRC = ".parcelrc";
67
+ const RESOLVER_FILE_NAME = "obsidian-plugin-resolver.cjs";
68
+ const NAMER_FILE_NAME = "obsidian-plugin-namer.cjs";
69
+ const INLINE_IMPORTS_FILE_NAME = "obsidian-plugin-inline-imports.cjs";
70
+ const OPTIMIZER_FILE_NAME = "obsidian-plugin-optimizer.cjs";
71
+ const FEATURES_FILE_NAME = "obsidian-plugin-features.cjs";
72
+ const JSON_INDENT = 2;
73
+ async function build(options) {
74
+ const result = await buildObsidianPluginWithParcel({ ...options, mode: BuildMode.Production });
75
+ result.throwOnFailure();
76
+ }
77
+ async function buildObsidianPluginWithParcel(params) {
78
+ await npmRunOptional("build:compile");
79
+ const buildContext = await resolveObsidianPluginBuildContext(params);
80
+ await cleanObsidianPluginDistFolder(buildContext.distFolder);
81
+ await completeObsidianPluginDistFolder(buildContext);
82
+ const configFolder = resolveFromRoot(GENERATED_PARCEL_CONFIG_FOLDER);
83
+ const consumerParcelrcPath = resolveFromRoot(PARCELRC);
84
+ await mkdir(configFolder, { recursive: true });
85
+ const configFiles = getParcelConfigFiles({
86
+ consumerParcelrcPath: existsSync(consumerParcelrcPath) ? toPosixPath(relative(configFolder, consumerParcelrcPath)) : void 0,
87
+ features: params
88
+ });
89
+ for (const [fileName, contents] of Object.entries(configFiles)) {
90
+ const filePath = join(configFolder, fileName);
91
+ if (!existsSync(filePath) || await readFile(filePath, "utf-8") !== contents) {
92
+ await writeFile(filePath, contents, "utf-8");
93
+ }
94
+ }
95
+ const { Parcel } = await import("@parcel/core");
96
+ const parcelOptions = getParcelOptions({ buildContext, cacheFolder: resolveFromRoot(PARCEL_CACHE_FOLDER), configPath: join(configFolder, PARCELRC) });
97
+ const bundler = new Parcel(params.customizeParcelOptions?.(parcelOptions) ?? parcelOptions);
98
+ if (buildContext.isProductionBuild) {
99
+ try {
100
+ const { buildTime, bundleGraph } = await bundler.run();
101
+ console.warn(`Built ${String(bundleGraph.getBundles().length)} bundle(s) with parcel in ${String(buildTime)} ms.`);
102
+ return CliTaskResult.Success();
103
+ } catch (error) {
104
+ console.error(formatParcelError(error));
105
+ return CliTaskResult.Failure();
106
+ }
107
+ }
108
+ await bundler.watch((error, event) => {
109
+ if (error) {
110
+ console.error(formatParcelError(error));
111
+ return;
112
+ }
113
+ handleWatchEvent(event, buildContext);
114
+ });
115
+ return CliTaskResult.DoNotExit();
116
+ }
117
+ async function dev(options) {
118
+ return await buildObsidianPluginWithParcel({ ...options, mode: BuildMode.Development });
119
+ }
120
+ function getParcelConfigFiles(params) {
121
+ const { consumerParcelrcPath, features = {} } = params;
122
+ const featureTransformer = `./${FEATURES_FILE_NAME}`;
123
+ const transformers = {};
124
+ if (features.framework === "svelte") {
125
+ transformers["*.svelte"] = [featureTransformer];
126
+ transformers["*.svelte.{js,ts}"] = [featureTransformer, `./${INLINE_IMPORTS_FILE_NAME}`, "..."];
127
+ }
128
+ if (features.framework === "solid" || getJsxImportSource(features.framework) !== void 0) {
129
+ transformers["*.{jsx,tsx}"] = [featureTransformer];
130
+ }
131
+ if (features.wasm) {
132
+ transformers["*.wasm"] = [featureTransformer];
133
+ }
134
+ if (isPostcssNeeded(features.styles)) {
135
+ transformers["*.{css,pcss}"] = [featureTransformer, "@parcel/transformer-css"];
136
+ }
137
+ const defines = getFrameworkDefines({ framework: features.framework, isProductionBuild: true });
138
+ transformers["*.{js,mjs,cjs,jsx,ts,mts,cts,tsx}"] = [
139
+ ...Object.keys(defines).length > 0 ? [featureTransformer] : [],
140
+ `./${INLINE_IMPORTS_FILE_NAME}`,
141
+ "..."
142
+ ];
143
+ const parcelrc = {
144
+ extends: consumerParcelrcPath ?? "@parcel/config-default",
145
+ namers: [`./${NAMER_FILE_NAME}`, "..."],
146
+ optimizers: {
147
+ "*.js": ["...", `./${OPTIMIZER_FILE_NAME}`]
148
+ },
149
+ resolvers: [`./${RESOLVER_FILE_NAME}`, "..."],
150
+ transformers
151
+ };
152
+ return {
153
+ [FEATURES_FILE_NAME]: `/*
154
+ * Generated by @mnaoumov/obsidian-dev-toolkit. Runs the toolkit's shared transforms for the build features, loaded
155
+ * from the toolkit itself, so parcel compiles each feature the way every other bundler adapter does.
156
+ */
157
+ const { Transformer } = require('@parcel/plugin');
158
+
159
+ const FEATURES_MODULE_URL = ${JSON.stringify(getSiblingModuleUrl("obsidian-plugin-features"))};
160
+ const TRANSFORMS_MODULE_URL = ${JSON.stringify(getSiblingModuleUrl("obsidian-plugin-transforms"))};
161
+ const FRAMEWORK = ${JSON.stringify(features.framework ?? null)};
162
+ const STYLES = ${JSON.stringify(features.styles ?? {})};
163
+
164
+ module.exports = new Transformer({
165
+ async transform({ asset, options }) {
166
+ const { getFeatureFileKind, getFrameworkDefines, getJsxImportSource, replaceDefines } = await import(FEATURES_MODULE_URL);
167
+ const transforms = await import(TRANSFORMS_MODULE_URL);
168
+ const filePath = asset.filePath;
169
+ const isProductionBuild = options.mode === 'production';
170
+ const defines = getFrameworkDefines({ framework: FRAMEWORK ?? undefined, isProductionBuild });
171
+ switch (getFeatureFileKind(filePath)) {
172
+ case 'jsx': {
173
+ const code = await asset.getCode();
174
+ const jsxImportSource = getJsxImportSource(FRAMEWORK ?? undefined);
175
+ const result = FRAMEWORK === 'solid'
176
+ ? await transforms.transformSolid({ code, filePath, isProductionBuild })
177
+ : await transforms.transformJsx({ code, filePath, isProductionBuild, jsxImportSource });
178
+ asset.setCode(replaceDefines(result.code, defines));
179
+ asset.type = 'js';
180
+ break;
181
+ }
182
+ case 'stylesheet': {
183
+ const result = await transforms.transformCss({ filePath, isCssModuleScoped: false, isProductionBuild, source: await asset.getCode(), styles: STYLES });
184
+ asset.setCode(result.css);
185
+ for (const dependency of result.dependencies) {
186
+ asset.invalidateOnFileChange(dependency);
187
+ }
188
+ break;
189
+ }
190
+ case 'svelte': {
191
+ const result = await transforms.transformSvelte({ code: await asset.getCode(), filePath, isProductionBuild });
192
+ asset.setCode(replaceDefines(result.code, defines));
193
+ asset.type = 'js';
194
+ break;
195
+ }
196
+ case 'wasm':
197
+ asset.setCode(transforms.getWasmModuleCode(await asset.getBuffer()));
198
+ asset.type = 'js';
199
+ break;
200
+ default: {
201
+ // A framework's runtime reads process.env.NODE_ENV, which parcel leaves alone in an electron-renderer library.
202
+ const code = await asset.getCode();
203
+ const replaced = replaceDefines(code, defines);
204
+ if (replaced !== code) {
205
+ asset.setCode(replaced);
206
+ }
207
+ break;
208
+ }
209
+ }
210
+ return [asset];
211
+ }
212
+ });
213
+ `,
214
+ // `String.raw`, so the regular expression below reaches the file with its backslashes intact.
215
+ [INLINE_IMPORTS_FILE_NAME]: String.raw`/*
216
+ * Generated by @mnaoumov/obsidian-dev-toolkit. Keeps every dynamic import() inside main.js.
217
+ *
218
+ * Obsidian loads a plugin's main.js and nothing beside it, and parcel makes every import() a bundle of its
219
+ * own with no option to inline one. This rewrites import("<literal>") into a require() inside an async
220
+ * arrow, before parcel's own JavaScript transformer runs: the module still evaluates only when that code
221
+ * runs, and the promise still rejects when evaluation throws. Only a plain string specifier is rewritten,
222
+ * since a computed one cannot be bundled by any bundler.
223
+ */
224
+ const { Transformer } = require('@parcel/plugin');
225
+
226
+ const DYNAMIC_IMPORT = /\bimport\(\s*(["'])([^"'\x60\n\\]+)\1\s*\)/gu;
227
+
228
+ module.exports = new Transformer({
229
+ async transform({ asset }) {
230
+ const source = await asset.getCode();
231
+ if (source.includes('import(')) {
232
+ asset.setCode(source.replace(DYNAMIC_IMPORT, (_match, quote, specifier) => '(async () => require(' + quote + specifier + quote + '))()'));
233
+ }
234
+ return [asset];
235
+ }
236
+ });
237
+ `,
238
+ [NAMER_FILE_NAME]: `/* Generated by @mnaoumov/obsidian-dev-toolkit. Obsidian loads a plugin's stylesheet from styles.css and nothing else. */
239
+ const { Namer } = require('@parcel/plugin');
240
+
241
+ module.exports = new Namer({
242
+ name({ bundle }) {
243
+ return bundle.type === 'css' ? '${ObsidianPluginRepoPaths.StylesCss}' : null;
244
+ }
245
+ });
246
+ `,
247
+ [OPTIMIZER_FILE_NAME]: `/*
248
+ * Generated by @mnaoumov/obsidian-dev-toolkit. Runs after parcel's own optimizers, on the JavaScript bundle.
249
+ *
250
+ * Obsidian evaluates main.js as the body of function (require, module, exports), with a module object that
251
+ * has no require of its own, and parcel's runtime reaches every external module through module.require.
252
+ * Without the first line below, the very first require('obsidian') throws "Cannot find module". The banner
253
+ * goes in here too, after minification, which would otherwise strip it as an ordinary comment.
254
+ */
255
+ const { Optimizer } = require('@parcel/plugin');
256
+
257
+ const PREAMBLE = ${JSON.stringify(`${getObsidianPluginBanner("parcel")}if (typeof module === 'object' && typeof module.require !== 'function') { module.require = require; }
258
+ `)};
259
+ const PREAMBLE_LINE_COUNT = ${String(getObsidianPluginBanner("parcel").split("\n").length)};
260
+
261
+ async function readContents(contents) {
262
+ if (typeof contents === 'string') {
263
+ return contents;
264
+ }
265
+ if (Buffer.isBuffer(contents)) {
266
+ return contents.toString('utf-8');
267
+ }
268
+ const chunks = [];
269
+ for await (const chunk of contents) {
270
+ chunks.push(Buffer.from(chunk));
271
+ }
272
+ return Buffer.concat(chunks).toString('utf-8');
273
+ }
274
+
275
+ module.exports = new Optimizer({
276
+ async optimize({ contents, map }) {
277
+ const code = await readContents(contents);
278
+ if (map) {
279
+ map.offsetLines(1, PREAMBLE_LINE_COUNT);
280
+ }
281
+ return { contents: PREAMBLE + code, map };
282
+ }
283
+ });
284
+ `,
285
+ [PARCELRC]: `${JSON.stringify(parcelrc, null, JSON_INDENT)}
286
+ `,
287
+ [RESOLVER_FILE_NAME]: `/* Generated by @mnaoumov/obsidian-dev-toolkit. Leaves the modules Obsidian supplies at runtime to require(). */
288
+ const { Resolver } = require('@parcel/plugin');
289
+
290
+ const EXTERNALS = new Set(${JSON.stringify(OBSIDIAN_PLUGIN_EXTERNALS)});
291
+
292
+ function getPackageName(specifier) {
293
+ const segments = specifier.split('/');
294
+ return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : segments[0];
295
+ }
296
+
297
+ module.exports = new Resolver({
298
+ resolve({ specifier }) {
299
+ const isExternal = specifier.startsWith('node:') || EXTERNALS.has(specifier) || EXTERNALS.has(getPackageName(specifier));
300
+ return isExternal ? { isExcluded: true } : null;
301
+ }
302
+ });
303
+ `
304
+ };
305
+ }
306
+ function getParcelOptions(params) {
307
+ const { buildContext, cacheFolder, configPath } = params;
308
+ const target = {
309
+ context: "electron-renderer",
310
+ // eslint-disable-next-line unicorn/name-replacements -- `distDir` is the name parcel's API reads.
311
+ distDir: buildContext.distFolder,
312
+ includeNodeModules: true,
313
+ isLibrary: true,
314
+ optimize: buildContext.isProductionBuild,
315
+ outputFormat: "commonjs",
316
+ sourceMap: !buildContext.isProductionBuild && { inline: true }
317
+ };
318
+ return {
319
+ // eslint-disable-next-line unicorn/name-replacements -- `cacheDir` is the name parcel's API reads.
320
+ cacheDir: cacheFolder,
321
+ config: configPath,
322
+ defaultTargetOptions: {
323
+ // eslint-disable-next-line unicorn/name-replacements -- `distDir` is the name parcel's API reads.
324
+ distDir: buildContext.distFolder,
325
+ shouldOptimize: buildContext.isProductionBuild,
326
+ sourceMaps: !buildContext.isProductionBuild
327
+ },
328
+ entries: buildContext.entryPoint,
329
+ mode: buildContext.isProductionBuild ? "production" : "development",
330
+ targets: { obsidianPlugin: target }
331
+ };
332
+ }
333
+ function formatParcelError(error) {
334
+ const diagnostics = error?.diagnostics;
335
+ if (diagnostics && diagnostics.length > 0) {
336
+ return diagnostics.map((diagnostic) => diagnostic.message).join("\n");
337
+ }
338
+ return error instanceof Error ? error.stack ?? error.message : String(error);
339
+ }
340
+ function getSiblingModuleUrl(baseName) {
341
+ return new URL(`${baseName}${extname(new URL(import.meta.url).pathname)}`, import.meta.url).href;
342
+ }
343
+ function handleWatchEvent(event, buildContext) {
344
+ if (event?.type === "buildFailure") {
345
+ console.error(event.diagnostics.map((diagnostic) => diagnostic.message).join("\n"));
346
+ return;
347
+ }
348
+ if (event?.type !== "buildSuccess") {
349
+ return;
350
+ }
351
+ console.warn(`Rebuilt with parcel in ${String(event.buildTime)} ms.`);
352
+ invokeAsyncSafely(() => deployToObsidianPluginsFolder(buildContext));
353
+ }
354
+ export {
355
+ build,
356
+ buildObsidianPluginWithParcel,
357
+ dev,
358
+ getParcelConfigFiles,
359
+ getParcelOptions
360
+ };
361
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9wYXJjZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEJ1aWxkcyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCBwYXJjZWw6IGBidWlsZCgpYCBhbmQgYGRldigpYCwgdGhlIHNhbWUgdHdvIGVudHJ5IHBvaW50cyB0aGUgZXNidWlsZFxuICogYnVpbGRlciBoYXMsIHByb2R1Y2luZyB0aGUgc2FtZSBgbWFpbi5qc2AgKyBgc3R5bGVzLmNzc2AgKyBgbWFuaWZlc3QuanNvbmAgbGF5b3V0LlxuICpcbiAqIFBhcmNlbCB0YWtlcyBubyBgZXh0ZXJuYWxgIGxpc3QgYW5kIG5vIG91dHB1dCBmaWxlIG5hbWUsIG9ubHkgcGx1Z2lucyBuYW1lZCBpbiBhIGAucGFyY2VscmNgLiBTbyB0aGVcbiAqIGJ1aWxkIHdyaXRlcyBhIGAucGFyY2VscmNgIG9mIGl0cyBvd24gaW50byBgLnBhcmNlbC1jYWNoZWAsIGJlc2lkZSBhIHJlc29sdmVyIHRoYXQgbGVhdmVzXG4gKiBPYnNpZGlhbidzIG1vZHVsZXMgZXh0ZXJuYWwsIGEgbmFtZXIgdGhhdCBuYW1lcyB0aGUgc3R5bGVzaGVldCBgc3R5bGVzLmNzc2AgYW5kIGEgdHJhbnNmb3JtZXIgdGhhdCBrZWVwc1xuICogZHluYW1pYyBpbXBvcnRzIGluc2lkZSBgbWFpbi5qc2AsIGFuZCBleHRlbmRzIHRoZVxuICogY29uc3VtZXIncyBvd24gYC5wYXJjZWxyY2Agd2hlbiB0aGVyZSBpcyBvbmUgKG9yIGBAcGFyY2VsL2NvbmZpZy1kZWZhdWx0YCB3aGVuIHRoZXJlIGlzIG5vbmUpLCBzbyBldmVyeVxuICogdHJhbnNmb3JtZXIgdGhlIGNvbnN1bWVyIGNvbmZpZ3VyZWQgc3RpbGwgYXBwbGllcy5cbiAqXG4gKiBgQHBhcmNlbC9jb3JlYCwgYEBwYXJjZWwvcGx1Z2luYCBhbmQgYEBwYXJjZWwvY29uZmlnLWRlZmF1bHRgIGFyZSBvcHRpb25hbCBwZWVyIGRlcGVuZGVuY2llcywgbG9hZGVkXG4gKiBvbmx5IHdoZW4gYSBwYXJjZWwgYnVpbGQgcnVucywgc28gYSBwbHVnaW4gYnVpbHQgd2l0aCBlc2J1aWxkIGluc3RhbGxzIG5vdGhpbmcgZXh0cmEuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZEV2ZW50LFxuICBJbml0aWFsUGFyY2VsT3B0aW9ucyxcbiAgVGFyZ2V0RGVzY3JpcHRvclxufSBmcm9tICdAcGFyY2VsL3R5cGVzJztcblxuaW1wb3J0IHsgQ2xpVGFza1Jlc3VsdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2NsaS11dGlscyc7XG5pbXBvcnQgeyBucG1SdW5PcHRpb25hbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L25wbS1ydW4nO1xuaW1wb3J0IHsgaW52b2tlQXN5bmNTYWZlbHkgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMnO1xuaW1wb3J0IHtcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmUsXG4gIHRvUG9zaXhQYXRoXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0LFxuICBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcblxuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuLi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBCdWlsZE1vZGUsXG4gIGNsZWFuT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBjb21wbGV0ZU9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcixcbiAgZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIsXG4gIE9CU0lESUFOX1BMVUdJTl9FWFRFUk5BTFMsXG4gIHJlc29sdmVGcm9tUm9vdCxcbiAgcmVzb2x2ZU9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0XG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB7XG4gIGdldEZyYW1ld29ya0RlZmluZXMsXG4gIGdldEpzeEltcG9ydFNvdXJjZSxcbiAgaXNQb3N0Y3NzTmVlZGVkXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB7IGRlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW5zLWZvbGRlci1kZXBsb3ltZW50LnRzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsUGFyYW1zIGV4dGVuZHMgQnVpbGRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgYnVpbGQgbW9kZSwgZWl0aGVyIGBEZXZlbG9wbWVudGAgb3IgYFByb2R1Y3Rpb25gLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZTogQnVpbGRNb2RlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBidWlsZH0gYW5kIHtAbGluayBkZXZ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyBleHRlbmRzIE9ic2lkaWFuUGx1Z2luRGVwbG95bWVudE9wdGlvbnMsIE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnMge1xuICAvKipcbiAgICogQ3VzdG9taXplcyB0aGUgb3B0aW9ucyBoYW5kZWQgdG8gcGFyY2VsJ3MgYFBhcmNlbGAgY2xhc3MuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21pemVQYXJjZWxPcHRpb25zPzogKG9wdGlvbnM6IEluaXRpYWxQYXJjZWxPcHRpb25zKSA9PiBJbml0aWFsUGFyY2VsT3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0UGFyY2VsQ29uZmlnRmlsZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFBhcmNlbENvbmZpZ0ZpbGVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb25zdW1lcidzIG93biBgLnBhcmNlbHJjYCwgcmVsYXRpdmUgdG8gdGhlIGdlbmVyYXRlZCBjb25maWd1cmF0aW9uJ3MgZm9sZGVyLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwcm9qZWN0XG4gICAqIGhhcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uc3VtZXJQYXJjZWxyY1BhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGJ1aWxkIGZlYXR1cmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZXM/OiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRQYXJjZWxPcHRpb25zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRQYXJjZWxPcHRpb25zUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBidWlsZCBjb250ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb250ZXh0OiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dDtcblxuICAvKipcbiAgICogUGFyY2VsJ3MgY2FjaGUgZm9sZGVyLiBOYW1lZCBleHBsaWNpdGx5IGJlY2F1c2UgcGFyY2VsIG90aGVyd2lzZSB0YWtlcyB0aGUgZm9sZGVyIG9mIHRoZSBuZWFyZXN0XG4gICAqIGxvY2tmaWxlIGZvciB0aGUgcHJvamVjdCByb290LCB3aGljaCBpbiBhIHdvcmtzcGFjZSBpcyBub3QgdGhlIHBsdWdpbidzLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGVGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGdlbmVyYXRlZCBgLnBhcmNlbHJjYC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ1BhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZmlsZXMgb2YgdGhlIGdlbmVyYXRlZCBwYXJjZWwgY29uZmlndXJhdGlvbiwgYnkgZmlsZSBuYW1lLlxuICovXG5leHBvcnQgdHlwZSBQYXJjZWxDb25maWdGaWxlcyA9IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG4vLyBJbnNpZGUgcGFyY2VsJ3Mgb3duIGNhY2hlIGZvbGRlcjogcGFyY2VsIHJlZnVzZXMgcmVsYXRpdmUgcGx1Z2lucyBpbiBhIGNvbmZpZyB1bmRlciBgbm9kZV9tb2R1bGVzYCAoaXRcbi8vIHRha2VzIHN1Y2ggYSBjb25maWcgZm9yIGEgcHVibGlzaGVkIHBhY2thZ2UpLCBhbmQgaXQgbmV2ZXIgd2F0Y2hlcyBpdHMgY2FjaGUgZm9sZGVyLCBzbyByZWdlbmVyYXRpbmdcbi8vIHRoZXNlIGZpbGVzIG9uIGV2ZXJ5IGJ1aWxkIGNhbm5vdCB0cmlnZ2VyIGEgcmVidWlsZC5cbmNvbnN0IFBBUkNFTF9DQUNIRV9GT0xERVIgPSAnLnBhcmNlbC1jYWNoZSc7XG5jb25zdCBHRU5FUkFURURfUEFSQ0VMX0NPTkZJR19GT0xERVIgPSBgJHtQQVJDRUxfQ0FDSEVfRk9MREVSfS9vYnNpZGlhbi1kZXYtdG9vbGtpdGA7XG5jb25zdCBQQVJDRUxSQyA9ICcucGFyY2VscmMnO1xuXG4vKipcbiAqIE9uZSBkaWFnbm9zdGljIG9mIGEge0BsaW5rIFBhcmNlbEVycm9yTGlrZX0uXG4gKi9cbmludGVyZmFjZSBQYXJjZWxFcnJvckRpYWdub3N0aWMge1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCBwYXJjZWwgdGhyb3dzIHdoZW4gYSBidWlsZCBmYWlsczogYW4gZXJyb3IgY2FycnlpbmcgaXRzIGRpYWdub3N0aWNzLlxuICovXG5pbnRlcmZhY2UgUGFyY2VsRXJyb3JMaWtlIHtcbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3M/OiByZWFkb25seSBQYXJjZWxFcnJvckRpYWdub3N0aWNbXTtcbn1cbmNvbnN0IFJFU09MVkVSX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1wbHVnaW4tcmVzb2x2ZXIuY2pzJztcbmNvbnN0IE5BTUVSX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1wbHVnaW4tbmFtZXIuY2pzJztcbmNvbnN0IElOTElORV9JTVBPUlRTX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1wbHVnaW4taW5saW5lLWltcG9ydHMuY2pzJztcbmNvbnN0IE9QVElNSVpFUl9GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLW9wdGltaXplci5janMnO1xuY29uc3QgRkVBVFVSRVNfRklMRV9OQU1FID0gJ29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy5janMnO1xuY29uc3QgSlNPTl9JTkRFTlQgPSAyO1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gUnVucyBhIHJlYWwgcGFyY2VsIGJ1aWxkOyBleGVyY2lzZWQgYnkgdGhlIGJ1bmRsZXIgaW50ZWdyYXRpb24gdGVzdC4gKi9cbi8qKlxuICogQnVpbGRzIHRoZSBPYnNpZGlhbiBwbHVnaW4gaW4gcHJvZHVjdGlvbiBtb2RlIHVzaW5nIHBhcmNlbC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGJ1aWxkIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJ1aWxkIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGQob3B0aW9ucz86IEJ1aWxkT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbCh7IC4uLm9wdGlvbnMsIG1vZGU6IEJ1aWxkTW9kZS5Qcm9kdWN0aW9uIH0pO1xuICByZXN1bHQudGhyb3dPbkZhaWx1cmUoKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIE9ic2lkaWFuIHBsdWdpbiB3aXRoIHBhcmNlbCwgb25jZSBmb3IgYSBwcm9kdWN0aW9uIGJ1aWxkLCBvciB3YXRjaGluZyBmb3IgYSBkZXZlbG9wbWVudCBvbmUuXG4gKlxuICogUnVucyB0aGUgcHJvamVjdCdzIGBidWlsZDpjb21waWxlYCBzY3JpcHQgZmlyc3Qgd2hlbiBpdCBoYXMgb25lLCBhcyB0aGUgZXNidWlsZCBidWlsZGVyIGRvZXMsIHNpbmNlXG4gKiBwYXJjZWwgc3RyaXBzIFR5cGVTY3JpcHQgdHlwZXMgd2l0aG91dCBjaGVja2luZyB0aGVtLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgQ2xpVGFza1Jlc3VsdH0gaW5kaWNhdGluZyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBidWlsZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsKHBhcmFtczogQnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWxQYXJhbXMpOiBQcm9taXNlPENsaVRhc2tSZXN1bHQ+IHtcbiAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2J1aWxkOmNvbXBpbGUnKTtcbiAgY29uc3QgYnVpbGRDb250ZXh0ID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0KHBhcmFtcyk7XG4gIGF3YWl0IGNsZWFuT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyKGJ1aWxkQ29udGV4dC5kaXN0Rm9sZGVyKTtcbiAgYXdhaXQgY29tcGxldGVPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIoYnVpbGRDb250ZXh0KTtcblxuICBjb25zdCBjb25maWdGb2xkZXIgPSByZXNvbHZlRnJvbVJvb3QoR0VORVJBVEVEX1BBUkNFTF9DT05GSUdfRk9MREVSKTtcbiAgY29uc3QgY29uc3VtZXJQYXJjZWxyY1BhdGggPSByZXNvbHZlRnJvbVJvb3QoUEFSQ0VMUkMpO1xuICBhd2FpdCBta2Rpcihjb25maWdGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBjb25maWdGaWxlcyA9IGdldFBhcmNlbENvbmZpZ0ZpbGVzKHtcbiAgICBjb25zdW1lclBhcmNlbHJjUGF0aDogZXhpc3RzU3luYyhjb25zdW1lclBhcmNlbHJjUGF0aCkgPyB0b1Bvc2l4UGF0aChyZWxhdGl2ZShjb25maWdGb2xkZXIsIGNvbnN1bWVyUGFyY2VscmNQYXRoKSkgOiB1bmRlZmluZWQsXG4gICAgZmVhdHVyZXM6IHBhcmFtc1xuICB9KTtcbiAgZm9yIChjb25zdCBbZmlsZU5hbWUsIGNvbnRlbnRzXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdGaWxlcykpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oY29uZmlnRm9sZGVyLCBmaWxlTmFtZSk7XG4gICAgLy8gUmV3cml0dGVuIG9ubHkgd2hlbiBpdCBjaGFuZ2VkOiBwYXJjZWwgaW52YWxpZGF0ZXMgaXRzIGNhY2hlIG9uIGEgY29uZmlnIGZpbGUncyBtb2RpZmljYXRpb24gdGltZS5cbiAgICBpZiAoIWV4aXN0c1N5bmMoZmlsZVBhdGgpIHx8IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKSAhPT0gY29udGVudHMpIHtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgY29udGVudHMsICd1dGYtOCcpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHsgUGFyY2VsIH0gPSBhd2FpdCBpbXBvcnQoJ0BwYXJjZWwvY29yZScpO1xuICBjb25zdCBwYXJjZWxPcHRpb25zID0gZ2V0UGFyY2VsT3B0aW9ucyh7IGJ1aWxkQ29udGV4dCwgY2FjaGVGb2xkZXI6IHJlc29sdmVGcm9tUm9vdChQQVJDRUxfQ0FDSEVfRk9MREVSKSwgY29uZmlnUGF0aDogam9pbihjb25maWdGb2xkZXIsIFBBUkNFTFJDKSB9KTtcbiAgY29uc3QgYnVuZGxlciA9IG5ldyBQYXJjZWwocGFyYW1zLmN1c3RvbWl6ZVBhcmNlbE9wdGlvbnM/LihwYXJjZWxPcHRpb25zKSA/PyBwYXJjZWxPcHRpb25zKTtcblxuICBpZiAoYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgYnVpbGRUaW1lLCBidW5kbGVHcmFwaCB9ID0gYXdhaXQgYnVuZGxlci5ydW4oKTtcbiAgICAgIGNvbnNvbGUud2FybihgQnVpbHQgJHtTdHJpbmcoYnVuZGxlR3JhcGguZ2V0QnVuZGxlcygpLmxlbmd0aCl9IGJ1bmRsZShzKSB3aXRoIHBhcmNlbCBpbiAke1N0cmluZyhidWlsZFRpbWUpfSBtcy5gKTtcbiAgICAgIHJldHVybiBDbGlUYXNrUmVzdWx0LlN1Y2Nlc3MoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXRQYXJjZWxFcnJvcihlcnJvcikpO1xuICAgICAgcmV0dXJuIENsaVRhc2tSZXN1bHQuRmFpbHVyZSgpO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IGJ1bmRsZXIud2F0Y2goKGVycm9yLCBldmVudCkgPT4ge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXRQYXJjZWxFcnJvcihlcnJvcikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBoYW5kbGVXYXRjaEV2ZW50KGV2ZW50LCBidWlsZENvbnRleHQpO1xuICB9KTtcbiAgcmV0dXJuIENsaVRhc2tSZXN1bHQuRG9Ob3RFeGl0KCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBPYnNpZGlhbiBwbHVnaW4gaW4gZGV2ZWxvcG1lbnQgbW9kZSB1c2luZyBwYXJjZWwsIHdhdGNoaW5nIGZvciBjaGFuZ2VzIGFuZCBkZXBsb3lpbmcgZXZlcnlcbiAqIHN1Y2Nlc3NmdWwgcmVidWlsZCBpbnRvIHRoZSB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGJ1aWxkIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEge0BsaW5rIENsaVRhc2tSZXN1bHR9IGluZGljYXRpbmcgdGhlIGJ1aWxkIHJlc3VsdC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBJbnRlbnRpb25hbGx5IHNoYXJlcyBCdWlsZE9wdGlvbnMgd2l0aCBidWlsZCgpLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRldihvcHRpb25zPzogQnVpbGRPcHRpb25zKTogUHJvbWlzZTxDbGlUYXNrUmVzdWx0PiB7XG4gIHJldHVybiBhd2FpdCBidWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbCh7IC4uLm9wdGlvbnMsIG1vZGU6IEJ1aWxkTW9kZS5EZXZlbG9wbWVudCB9KTtcbn1cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBmaWxlcyBvZiB0aGUgcGFyY2VsIGNvbmZpZ3VyYXRpb24gdGhlIGJ1aWxkIHJ1bnMgd2l0aC5cbiAqXG4gKiBUaGUgYnVpbGQgZmVhdHVyZXMgYWRkIHBpcGVsaW5lcyB0aGF0IHJ1biB0aGUgdG9vbGtpdCdzIHNoYXJlZCB0cmFuc2Zvcm1zLCB0aHJvdWdoIG9uZSBnZW5lcmF0ZWQgdHJhbnNmb3JtZXIgdGhhdFxuICogbG9hZHMgdGhlbSBmcm9tIHRoZSB0b29sa2l0OiBTb2xpZCdzIGAuanN4YCAvIGAudHN4YCwgU3ZlbHRlJ3MgYC5zdmVsdGVgIC8gYC5zdmVsdGUudHNgIC8gYC5zdmVsdGUuanNgLCBgLndhc21gLFxuICogYW5kIHdpdGggYHN0eWxlcy5wb3N0Y3NzYCBvciBgc3R5bGVzLnRhaWx3aW5kYCBldmVyeSBzdHlsZXNoZWV0LCBpbiBwbGFjZSBvZiBwYXJjZWwncyBvd24gUG9zdENTUyBzdGVwLiBSZWFjdCBhbmRcbiAqIFByZWFjdCBKU1ggaXMgY29tcGlsZWQgaGVyZSB0b28sIHNpbmNlIHBhcmNlbCByZWFkcyB0aGUgSlNYIHJ1bnRpbWUgZnJvbSBhIHRzY29uZmlnIHdpdGhvdXQgZm9sbG93aW5nIGl0cyBgZXh0ZW5kc2AsXG4gKiBhbmQgd2l0aCBhbnkgZnJhbWV3b3JrIGV2ZXJ5IHNjcmlwdCBoYXMgdGhlIGZyYW1ld29yaydzIGNvbXBpbGUtdGltZSBjb25zdGFudHMgcmVwbGFjZWQuIFBhcmNlbCBjb21waWxlcyBWdWUgd2l0aFxuICogYEBwYXJjZWwvdHJhbnNmb3JtZXItdnVlYCBhbmQgc2NvcGVzIGAqLm1vZHVsZS5jc3NgIGl0c2VsZiwgc28gdGhvc2UgbmVlZCBubyBwaXBlbGluZSBoZXJlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEdldFBhcmNlbENvbmZpZ0ZpbGVzUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBmaWxlcywgYnkgZmlsZSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyY2VsQ29uZmlnRmlsZXMocGFyYW1zOiBHZXRQYXJjZWxDb25maWdGaWxlc1BhcmFtcyk6IFBhcmNlbENvbmZpZ0ZpbGVzIHtcbiAgY29uc3QgeyBjb25zdW1lclBhcmNlbHJjUGF0aCwgZmVhdHVyZXMgPSB7fSB9ID0gcGFyYW1zO1xuICBjb25zdCBmZWF0dXJlVHJhbnNmb3JtZXIgPSBgLi8ke0ZFQVRVUkVTX0ZJTEVfTkFNRX1gO1xuICBjb25zdCB0cmFuc2Zvcm1lcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICBpZiAoZmVhdHVyZXMuZnJhbWV3b3JrID09PSAnc3ZlbHRlJykge1xuICAgIHRyYW5zZm9ybWVyc1snKi5zdmVsdGUnXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXJdO1xuICAgIHRyYW5zZm9ybWVyc1snKi5zdmVsdGUue2pzLHRzfSddID0gW2ZlYXR1cmVUcmFuc2Zvcm1lciwgYC4vJHtJTkxJTkVfSU1QT1JUU19GSUxFX05BTUV9YCwgJy4uLiddO1xuICB9XG4gIGlmIChmZWF0dXJlcy5mcmFtZXdvcmsgPT09ICdzb2xpZCcgfHwgZ2V0SnN4SW1wb3J0U291cmNlKGZlYXR1cmVzLmZyYW1ld29yaykgIT09IHVuZGVmaW5lZCkge1xuICAgIHRyYW5zZm9ybWVyc1snKi57anN4LHRzeH0nXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXJdO1xuICB9XG4gIGlmIChmZWF0dXJlcy53YXNtKSB7XG4gICAgdHJhbnNmb3JtZXJzWycqLndhc20nXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXJdO1xuICB9XG4gIGlmIChpc1Bvc3Rjc3NOZWVkZWQoZmVhdHVyZXMuc3R5bGVzKSkge1xuICAgIHRyYW5zZm9ybWVyc1snKi57Y3NzLHBjc3N9J10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyLCAnQHBhcmNlbC90cmFuc2Zvcm1lci1jc3MnXTtcbiAgfVxuICBjb25zdCBkZWZpbmVzID0gZ2V0RnJhbWV3b3JrRGVmaW5lcyh7IGZyYW1ld29yazogZmVhdHVyZXMuZnJhbWV3b3JrLCBpc1Byb2R1Y3Rpb25CdWlsZDogdHJ1ZSB9KTtcbiAgdHJhbnNmb3JtZXJzWycqLntqcyxtanMsY2pzLGpzeCx0cyxtdHMsY3RzLHRzeH0nXSA9IFtcbiAgICAuLi5PYmplY3Qua2V5cyhkZWZpbmVzKS5sZW5ndGggPiAwID8gW2ZlYXR1cmVUcmFuc2Zvcm1lcl0gOiBbXSxcbiAgICBgLi8ke0lOTElORV9JTVBPUlRTX0ZJTEVfTkFNRX1gLFxuICAgICcuLi4nXG4gIF07XG5cbiAgY29uc3QgcGFyY2VscmMgPSB7XG4gICAgZXh0ZW5kczogY29uc3VtZXJQYXJjZWxyY1BhdGggPz8gJ0BwYXJjZWwvY29uZmlnLWRlZmF1bHQnLFxuICAgIG5hbWVyczogW2AuLyR7TkFNRVJfRklMRV9OQU1FfWAsICcuLi4nXSxcbiAgICBvcHRpbWl6ZXJzOiB7XG4gICAgICAnKi5qcyc6IFsnLi4uJywgYC4vJHtPUFRJTUlaRVJfRklMRV9OQU1FfWBdXG4gICAgfSxcbiAgICByZXNvbHZlcnM6IFtgLi8ke1JFU09MVkVSX0ZJTEVfTkFNRX1gLCAnLi4uJ10sXG4gICAgdHJhbnNmb3JtZXJzXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBbRkVBVFVSRVNfRklMRV9OQU1FXTogYC8qXG4gKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBSdW5zIHRoZSB0b29sa2l0J3Mgc2hhcmVkIHRyYW5zZm9ybXMgZm9yIHRoZSBidWlsZCBmZWF0dXJlcywgbG9hZGVkXG4gKiBmcm9tIHRoZSB0b29sa2l0IGl0c2VsZiwgc28gcGFyY2VsIGNvbXBpbGVzIGVhY2ggZmVhdHVyZSB0aGUgd2F5IGV2ZXJ5IG90aGVyIGJ1bmRsZXIgYWRhcHRlciBkb2VzLlxuICovXG5jb25zdCB7IFRyYW5zZm9ybWVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuXG5jb25zdCBGRUFUVVJFU19NT0RVTEVfVVJMID0gJHtKU09OLnN0cmluZ2lmeShnZXRTaWJsaW5nTW9kdWxlVXJsKCdvYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMnKSl9O1xuY29uc3QgVFJBTlNGT1JNU19NT0RVTEVfVVJMID0gJHtKU09OLnN0cmluZ2lmeShnZXRTaWJsaW5nTW9kdWxlVXJsKCdvYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3JtcycpKX07XG5jb25zdCBGUkFNRVdPUksgPSAke0pTT04uc3RyaW5naWZ5KGZlYXR1cmVzLmZyYW1ld29yayA/PyBudWxsKX07XG5jb25zdCBTVFlMRVMgPSAke0pTT04uc3RyaW5naWZ5KGZlYXR1cmVzLnN0eWxlcyA/PyB7fSl9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUcmFuc2Zvcm1lcih7XG4gIGFzeW5jIHRyYW5zZm9ybSh7IGFzc2V0LCBvcHRpb25zIH0pIHtcbiAgICBjb25zdCB7IGdldEZlYXR1cmVGaWxlS2luZCwgZ2V0RnJhbWV3b3JrRGVmaW5lcywgZ2V0SnN4SW1wb3J0U291cmNlLCByZXBsYWNlRGVmaW5lcyB9ID0gYXdhaXQgaW1wb3J0KEZFQVRVUkVTX01PRFVMRV9VUkwpO1xuICAgIGNvbnN0IHRyYW5zZm9ybXMgPSBhd2FpdCBpbXBvcnQoVFJBTlNGT1JNU19NT0RVTEVfVVJMKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGFzc2V0LmZpbGVQYXRoO1xuICAgIGNvbnN0IGlzUHJvZHVjdGlvbkJ1aWxkID0gb3B0aW9ucy5tb2RlID09PSAncHJvZHVjdGlvbic7XG4gICAgY29uc3QgZGVmaW5lcyA9IGdldEZyYW1ld29ya0RlZmluZXMoeyBmcmFtZXdvcms6IEZSQU1FV09SSyA/PyB1bmRlZmluZWQsIGlzUHJvZHVjdGlvbkJ1aWxkIH0pO1xuICAgIHN3aXRjaCAoZ2V0RmVhdHVyZUZpbGVLaW5kKGZpbGVQYXRoKSkge1xuICAgICAgY2FzZSAnanN4Jzoge1xuICAgICAgICBjb25zdCBjb2RlID0gYXdhaXQgYXNzZXQuZ2V0Q29kZSgpO1xuICAgICAgICBjb25zdCBqc3hJbXBvcnRTb3VyY2UgPSBnZXRKc3hJbXBvcnRTb3VyY2UoRlJBTUVXT1JLID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEZSQU1FV09SSyA9PT0gJ3NvbGlkJ1xuICAgICAgICAgID8gYXdhaXQgdHJhbnNmb3Jtcy50cmFuc2Zvcm1Tb2xpZCh7IGNvZGUsIGZpbGVQYXRoLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KVxuICAgICAgICAgIDogYXdhaXQgdHJhbnNmb3Jtcy50cmFuc2Zvcm1Kc3goeyBjb2RlLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQsIGpzeEltcG9ydFNvdXJjZSB9KTtcbiAgICAgICAgYXNzZXQuc2V0Q29kZShyZXBsYWNlRGVmaW5lcyhyZXN1bHQuY29kZSwgZGVmaW5lcykpO1xuICAgICAgICBhc3NldC50eXBlID0gJ2pzJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHlsZXNoZWV0Jzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm1zLnRyYW5zZm9ybUNzcyh7IGZpbGVQYXRoLCBpc0Nzc01vZHVsZVNjb3BlZDogZmFsc2UsIGlzUHJvZHVjdGlvbkJ1aWxkLCBzb3VyY2U6IGF3YWl0IGFzc2V0LmdldENvZGUoKSwgc3R5bGVzOiBTVFlMRVMgfSk7XG4gICAgICAgIGFzc2V0LnNldENvZGUocmVzdWx0LmNzcyk7XG4gICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiByZXN1bHQuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgYXNzZXQuaW52YWxpZGF0ZU9uRmlsZUNoYW5nZShkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N2ZWx0ZSc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3Jtcy50cmFuc2Zvcm1TdmVsdGUoeyBjb2RlOiBhd2FpdCBhc3NldC5nZXRDb2RlKCksIGZpbGVQYXRoLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KTtcbiAgICAgICAgYXNzZXQuc2V0Q29kZShyZXBsYWNlRGVmaW5lcyhyZXN1bHQuY29kZSwgZGVmaW5lcykpO1xuICAgICAgICBhc3NldC50eXBlID0gJ2pzJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd3YXNtJzpcbiAgICAgICAgYXNzZXQuc2V0Q29kZSh0cmFuc2Zvcm1zLmdldFdhc21Nb2R1bGVDb2RlKGF3YWl0IGFzc2V0LmdldEJ1ZmZlcigpKSk7XG4gICAgICAgIGFzc2V0LnR5cGUgPSAnanMnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gQSBmcmFtZXdvcmsncyBydW50aW1lIHJlYWRzIHByb2Nlc3MuZW52Lk5PREVfRU5WLCB3aGljaCBwYXJjZWwgbGVhdmVzIGFsb25lIGluIGFuIGVsZWN0cm9uLXJlbmRlcmVyIGxpYnJhcnkuXG4gICAgICAgIGNvbnN0IGNvZGUgPSBhd2FpdCBhc3NldC5nZXRDb2RlKCk7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VkID0gcmVwbGFjZURlZmluZXMoY29kZSwgZGVmaW5lcyk7XG4gICAgICAgIGlmIChyZXBsYWNlZCAhPT0gY29kZSkge1xuICAgICAgICAgIGFzc2V0LnNldENvZGUocmVwbGFjZWQpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2Fzc2V0XTtcbiAgfVxufSk7XG5gLFxuICAgIC8vIGBTdHJpbmcucmF3YCwgc28gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBiZWxvdyByZWFjaGVzIHRoZSBmaWxlIHdpdGggaXRzIGJhY2tzbGFzaGVzIGludGFjdC5cbiAgICBbSU5MSU5FX0lNUE9SVFNfRklMRV9OQU1FXTogU3RyaW5nLnJhd2AvKlxuICogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gS2VlcHMgZXZlcnkgZHluYW1pYyBpbXBvcnQoKSBpbnNpZGUgbWFpbi5qcy5cbiAqXG4gKiBPYnNpZGlhbiBsb2FkcyBhIHBsdWdpbidzIG1haW4uanMgYW5kIG5vdGhpbmcgYmVzaWRlIGl0LCBhbmQgcGFyY2VsIG1ha2VzIGV2ZXJ5IGltcG9ydCgpIGEgYnVuZGxlIG9mIGl0c1xuICogb3duIHdpdGggbm8gb3B0aW9uIHRvIGlubGluZSBvbmUuIFRoaXMgcmV3cml0ZXMgaW1wb3J0KCc8bGl0ZXJhbD4nKSBpbnRvIGEgcmVxdWlyZSgpIGluc2lkZSBhbiBhc3luY1xuICogYXJyb3csIGJlZm9yZSBwYXJjZWwncyBvd24gSmF2YVNjcmlwdCB0cmFuc2Zvcm1lciBydW5zOiB0aGUgbW9kdWxlIHN0aWxsIGV2YWx1YXRlcyBvbmx5IHdoZW4gdGhhdCBjb2RlXG4gKiBydW5zLCBhbmQgdGhlIHByb21pc2Ugc3RpbGwgcmVqZWN0cyB3aGVuIGV2YWx1YXRpb24gdGhyb3dzLiBPbmx5IGEgcGxhaW4gc3RyaW5nIHNwZWNpZmllciBpcyByZXdyaXR0ZW4sXG4gKiBzaW5jZSBhIGNvbXB1dGVkIG9uZSBjYW5ub3QgYmUgYnVuZGxlZCBieSBhbnkgYnVuZGxlci5cbiAqL1xuY29uc3QgeyBUcmFuc2Zvcm1lciB9ID0gcmVxdWlyZSgnQHBhcmNlbC9wbHVnaW4nKTtcblxuY29uc3QgRFlOQU1JQ19JTVBPUlQgPSAvXFxiaW1wb3J0XFwoXFxzKihbXCInXSkoW15cIidcXHg2MFxcblxcXFxdKylcXDFcXHMqXFwpL2d1O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUcmFuc2Zvcm1lcih7XG4gIGFzeW5jIHRyYW5zZm9ybSh7IGFzc2V0IH0pIHtcbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBhc3NldC5nZXRDb2RlKCk7XG4gICAgaWYgKHNvdXJjZS5pbmNsdWRlcygnaW1wb3J0KCcpKSB7XG4gICAgICBhc3NldC5zZXRDb2RlKHNvdXJjZS5yZXBsYWNlKERZTkFNSUNfSU1QT1JULCAoX21hdGNoLCBxdW90ZSwgc3BlY2lmaWVyKSA9PiAnKGFzeW5jICgpID0+IHJlcXVpcmUoJyArIHF1b3RlICsgc3BlY2lmaWVyICsgcXVvdGUgKyAnKSkoKScpKTtcbiAgICB9XG4gICAgcmV0dXJuIFthc3NldF07XG4gIH1cbn0pO1xuYCxcbiAgICBbTkFNRVJfRklMRV9OQU1FXTogYC8qIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIE9ic2lkaWFuIGxvYWRzIGEgcGx1Z2luJ3Mgc3R5bGVzaGVldCBmcm9tIHN0eWxlcy5jc3MgYW5kIG5vdGhpbmcgZWxzZS4gKi9cbmNvbnN0IHsgTmFtZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IE5hbWVyKHtcbiAgbmFtZSh7IGJ1bmRsZSB9KSB7XG4gICAgcmV0dXJuIGJ1bmRsZS50eXBlID09PSAnY3NzJyA/ICcke09ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlN0eWxlc0Nzc30nIDogbnVsbDtcbiAgfVxufSk7XG5gLFxuICAgIFtPUFRJTUlaRVJfRklMRV9OQU1FXTogYC8qXG4gKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBSdW5zIGFmdGVyIHBhcmNlbCdzIG93biBvcHRpbWl6ZXJzLCBvbiB0aGUgSmF2YVNjcmlwdCBidW5kbGUuXG4gKlxuICogT2JzaWRpYW4gZXZhbHVhdGVzIG1haW4uanMgYXMgdGhlIGJvZHkgb2YgZnVuY3Rpb24gKHJlcXVpcmUsIG1vZHVsZSwgZXhwb3J0cyksIHdpdGggYSBtb2R1bGUgb2JqZWN0IHRoYXRcbiAqIGhhcyBubyByZXF1aXJlIG9mIGl0cyBvd24sIGFuZCBwYXJjZWwncyBydW50aW1lIHJlYWNoZXMgZXZlcnkgZXh0ZXJuYWwgbW9kdWxlIHRocm91Z2ggbW9kdWxlLnJlcXVpcmUuXG4gKiBXaXRob3V0IHRoZSBmaXJzdCBsaW5lIGJlbG93LCB0aGUgdmVyeSBmaXJzdCByZXF1aXJlKCdvYnNpZGlhbicpIHRocm93cyBcIkNhbm5vdCBmaW5kIG1vZHVsZVwiLiBUaGUgYmFubmVyXG4gKiBnb2VzIGluIGhlcmUgdG9vLCBhZnRlciBtaW5pZmljYXRpb24sIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBzdHJpcCBpdCBhcyBhbiBvcmRpbmFyeSBjb21tZW50LlxuICovXG5jb25zdCB7IE9wdGltaXplciB9ID0gcmVxdWlyZSgnQHBhcmNlbC9wbHVnaW4nKTtcblxuY29uc3QgUFJFQU1CTEUgPSAke0pTT04uc3RyaW5naWZ5KGAke2dldE9ic2lkaWFuUGx1Z2luQmFubmVyKCdwYXJjZWwnKX1pZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZS5yZXF1aXJlICE9PSAnZnVuY3Rpb24nKSB7IG1vZHVsZS5yZXF1aXJlID0gcmVxdWlyZTsgfVxcbmApfTtcbmNvbnN0IFBSRUFNQkxFX0xJTkVfQ09VTlQgPSAke1N0cmluZyhnZXRPYnNpZGlhblBsdWdpbkJhbm5lcigncGFyY2VsJykuc3BsaXQoJ1xcbicpLmxlbmd0aCl9O1xuXG5hc3luYyBmdW5jdGlvbiByZWFkQ29udGVudHMoY29udGVudHMpIHtcbiAgaWYgKHR5cGVvZiBjb250ZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gY29udGVudHM7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250ZW50cykpIHtcbiAgICByZXR1cm4gY29udGVudHMudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIH1cbiAgY29uc3QgY2h1bmtzID0gW107XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgY29udGVudHMpIHtcbiAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpO1xuICB9XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoJ3V0Zi04Jyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IE9wdGltaXplcih7XG4gIGFzeW5jIG9wdGltaXplKHsgY29udGVudHMsIG1hcCB9KSB7XG4gICAgY29uc3QgY29kZSA9IGF3YWl0IHJlYWRDb250ZW50cyhjb250ZW50cyk7XG4gICAgaWYgKG1hcCkge1xuICAgICAgbWFwLm9mZnNldExpbmVzKDEsIFBSRUFNQkxFX0xJTkVfQ09VTlQpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50czogUFJFQU1CTEUgKyBjb2RlLCBtYXAgfTtcbiAgfVxufSk7XG5gLFxuICAgIFtQQVJDRUxSQ106IGAke0pTT04uc3RyaW5naWZ5KHBhcmNlbHJjLCBudWxsLCBKU09OX0lOREVOVCl9XFxuYCxcbiAgICBbUkVTT0xWRVJfRklMRV9OQU1FXTogYC8qIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIExlYXZlcyB0aGUgbW9kdWxlcyBPYnNpZGlhbiBzdXBwbGllcyBhdCBydW50aW1lIHRvIHJlcXVpcmUoKS4gKi9cbmNvbnN0IHsgUmVzb2x2ZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IEVYVEVSTkFMUyA9IG5ldyBTZXQoJHtKU09OLnN0cmluZ2lmeShPQlNJRElBTl9QTFVHSU5fRVhURVJOQUxTKX0pO1xuXG5mdW5jdGlvbiBnZXRQYWNrYWdlTmFtZShzcGVjaWZpZXIpIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBzcGVjaWZpZXIuc3BsaXQoJy8nKTtcbiAgcmV0dXJuIHNwZWNpZmllci5zdGFydHNXaXRoKCdAJykgPyBzZWdtZW50cy5zbGljZSgwLCAyKS5qb2luKCcvJykgOiBzZWdtZW50c1swXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgUmVzb2x2ZXIoe1xuICByZXNvbHZlKHsgc3BlY2lmaWVyIH0pIHtcbiAgICBjb25zdCBpc0V4dGVybmFsID0gc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ25vZGU6JykgfHwgRVhURVJOQUxTLmhhcyhzcGVjaWZpZXIpIHx8IEVYVEVSTkFMUy5oYXMoZ2V0UGFja2FnZU5hbWUoc3BlY2lmaWVyKSk7XG4gICAgcmV0dXJuIGlzRXh0ZXJuYWwgPyB7IGlzRXhjbHVkZWQ6IHRydWUgfSA6IG51bGw7XG4gIH1cbn0pO1xuYFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgb3B0aW9ucyBoYW5kZWQgdG8gcGFyY2VsJ3MgYFBhcmNlbGAgY2xhc3MuXG4gKlxuICogVGhlIG9uZSB0YXJnZXQgaXMgYGVsZWN0cm9uLXJlbmRlcmVyYCwgd2hlcmUgT2JzaWRpYW4gcnVucyBhIHBsdWdpbiwgYW5kIENvbW1vbkpTLiBQYXJjZWwgY291bnRzIHRoYXRcbiAqIGNvbnRleHQgYXMgYm90aCBhIGJyb3dzZXIgYW5kIGEgbm9kZSBvbmUsIGFuZCBlYWNoIGhhbGYgbWF0dGVyczogbm9kZSBrZWVwcyB0aGUgYnVpbHRpbnMgZXh0ZXJuYWwsIGFuZFxuICogYnJvd3NlciByZXNvbHZlcyB0aGUgYGJyb3dzZXJgIGV4cG9ydCBjb25kaXRpb24uIGBpbmNsdWRlTm9kZU1vZHVsZXNgIGJ1bmRsZXMgdGhlIGRlcGVuZGVuY2llcywgd2hpY2ggYVxuICogbm9kZS1mbGF2b3VyZWQgY29udGV4dCB3b3VsZCBvdGhlcndpc2UgbGVhdmUgYXMgYHJlcXVpcmUoKWAgY2FsbHMgbm90aGluZyBpbnN0YWxscyBiZXNpZGUgYSBwbHVnaW4sIGFuZFxuICogYGlzTGlicmFyeWAga2VlcHMgdGhlIGVudHJ5J3MgZGVmYXVsdCBleHBvcnQsIHdoaWNoIGlzIGhvdyBPYnNpZGlhbiBmaW5kcyB0aGUgcGx1Z2luIGNsYXNzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEdldFBhcmNlbE9wdGlvbnNQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHBhcmNlbCBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyY2VsT3B0aW9ucyhwYXJhbXM6IEdldFBhcmNlbE9wdGlvbnNQYXJhbXMpOiBJbml0aWFsUGFyY2VsT3B0aW9ucyB7XG4gIGNvbnN0IHsgYnVpbGRDb250ZXh0LCBjYWNoZUZvbGRlciwgY29uZmlnUGF0aCB9ID0gcGFyYW1zO1xuICBjb25zdCB0YXJnZXQ6IFRhcmdldERlc2NyaXB0b3IgPSB7XG4gICAgY29udGV4dDogJ2VsZWN0cm9uLXJlbmRlcmVyJyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgZGlzdERpcmAgaXMgdGhlIG5hbWUgcGFyY2VsJ3MgQVBJIHJlYWRzLlxuICAgIGRpc3REaXI6IGJ1aWxkQ29udGV4dC5kaXN0Rm9sZGVyLFxuICAgIGluY2x1ZGVOb2RlTW9kdWxlczogdHJ1ZSxcbiAgICBpc0xpYnJhcnk6IHRydWUsXG4gICAgb3B0aW1pemU6IGJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCxcbiAgICBvdXRwdXRGb3JtYXQ6ICdjb21tb25qcycsXG4gICAgc291cmNlTWFwOiAhYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkICYmIHsgaW5saW5lOiB0cnVlIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBjYWNoZURpcmAgaXMgdGhlIG5hbWUgcGFyY2VsJ3MgQVBJIHJlYWRzLlxuICAgIGNhY2hlRGlyOiBjYWNoZUZvbGRlcixcbiAgICBjb25maWc6IGNvbmZpZ1BhdGgsXG4gICAgZGVmYXVsdFRhcmdldE9wdGlvbnM6IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBkaXN0RGlyYCBpcyB0aGUgbmFtZSBwYXJjZWwncyBBUEkgcmVhZHMuXG4gICAgICBkaXN0RGlyOiBidWlsZENvbnRleHQuZGlzdEZvbGRlcixcbiAgICAgIHNob3VsZE9wdGltaXplOiBidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgICBzb3VyY2VNYXBzOiAhYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkXG4gICAgfSxcbiAgICBlbnRyaWVzOiBidWlsZENvbnRleHQuZW50cnlQb2ludCxcbiAgICBtb2RlOiBidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQgPyAncHJvZHVjdGlvbicgOiAnZGV2ZWxvcG1lbnQnLFxuICAgIHRhcmdldHM6IHsgb2JzaWRpYW5QbHVnaW46IHRhcmdldCB9XG4gIH07XG59XG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gUGFydCBvZiB0aGUgcGFyY2VsIGJ1aWxkIGFib3ZlLiAqL1xuZnVuY3Rpb24gZm9ybWF0UGFyY2VsRXJyb3IoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBkaWFnbm9zdGljcyA9IChlcnJvciBhcyBQYXJjZWxFcnJvckxpa2UgfCB1bmRlZmluZWQpPy5kaWFnbm9zdGljcztcbiAgaWYgKGRpYWdub3N0aWNzICYmIGRpYWdub3N0aWNzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZGlhZ25vc3RpY3MubWFwKChkaWFnbm9zdGljKSA9PiBkaWFnbm9zdGljLm1lc3NhZ2UpLmpvaW4oJ1xcbicpO1xuICB9XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgPz8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBVUkwgb2YgYSBtb2R1bGUgb2YgdGhpcyBmb2xkZXIsIGluIHRoZSBzYW1lIGZvcm0gYXMgdGhpcyBvbmUgKGAudHNgIGZyb20gc291cmNlLCBgLm1qc2Agb3IgYC5janNgIG9uY2VcbiAqIGJ1aWx0KSwgd2hpY2ggdGhlIGdlbmVyYXRlZCB0cmFuc2Zvcm1lciBpbXBvcnRzLlxuICpcbiAqIEBwYXJhbSBiYXNlTmFtZSAtIFRoZSBtb2R1bGUncyBmaWxlIG5hbWUgd2l0aG91dCBpdHMgZXh0ZW5zaW9uLlxuICogQHJldHVybnMgVGhlIG1vZHVsZSdzIGBmaWxlOmAgVVJMLlxuICovXG5mdW5jdGlvbiBnZXRTaWJsaW5nTW9kdWxlVXJsKGJhc2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmV3IFVSTChgJHtiYXNlTmFtZX0ke2V4dG5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKX1gLCBpbXBvcnQubWV0YS51cmwpLmhyZWY7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVdhdGNoRXZlbnQoZXZlbnQ6IEJ1aWxkRXZlbnQgfCB1bmRlZmluZWQsIGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQpOiB2b2lkIHtcbiAgaWYgKGV2ZW50Py50eXBlID09PSAnYnVpbGRGYWlsdXJlJykge1xuICAgIGNvbnNvbGUuZXJyb3IoZXZlbnQuZGlhZ25vc3RpY3MubWFwKChkaWFnbm9zdGljKSA9PiBkaWFnbm9zdGljLm1lc3NhZ2UpLmpvaW4oJ1xcbicpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGV2ZW50Py50eXBlICE9PSAnYnVpbGRTdWNjZXNzJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnNvbGUud2FybihgUmVidWlsdCB3aXRoIHBhcmNlbCBpbiAke1N0cmluZyhldmVudC5idWlsZFRpbWUpfSBtcy5gKTtcbiAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIoYnVpbGRDb250ZXh0KSk7XG59XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQSxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBUVAsU0FBUywrQkFBK0I7QUFDeEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMscUNBQXFDO0FBbUU5QyxNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGlDQUFpQyxHQUFHLG1CQUFtQjtBQUM3RCxNQUFNLFdBQVc7QUFlakIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSwyQkFBMkI7QUFDakMsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxjQUFjO0FBU3BCLGVBQXNCLE1BQU0sU0FBdUM7QUFDakUsUUFBTSxTQUFTLE1BQU0sOEJBQThCLEVBQUUsR0FBRyxTQUFTLE1BQU0sVUFBVSxXQUFXLENBQUM7QUFDN0YsU0FBTyxlQUFlO0FBQ3hCO0FBV0EsZUFBc0IsOEJBQThCLFFBQXFFO0FBQ3ZILFFBQU0sZUFBZSxlQUFlO0FBQ3BDLFFBQU0sZUFBZSxNQUFNLGtD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
@@ -0,0 +1,128 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The build features of the rollup and vite adapters: one plugin, typed by the shape both bundlers accept, that runs
6
+ * the shared transforms (Solid, Svelte, stylesheets, WebAssembly) and replaces the framework's compile-time constants,
7
+ * plus the `unplugin-vue` plugin for Vue.
8
+ */
9
+ import type { ObsidianPluginFeatureOptions } from './obsidian-plugin-features.mjs';
10
+ import type { SourceMapLike } from './obsidian-plugin-transforms.mjs';
11
+ /**
12
+ * Parameters for {@link createRollupCompatibleFeaturePlugin}.
13
+ */
14
+ export interface CreateRollupCompatibleFeaturePluginParams {
15
+ /**
16
+ * The build features.
17
+ */
18
+ readonly features: ObsidianPluginFeatureOptions;
19
+ /**
20
+ * Tells whether the build is a production one. Called from the hooks, after the adapter resolved its build mode.
21
+ */
22
+ readonly isProductionBuild: () => boolean;
23
+ /**
24
+ * Whether this plugin compiles stylesheets. Vite compiles them itself.
25
+ */
26
+ readonly shouldCompileStylesheets: boolean;
27
+ /**
28
+ * Whether this plugin replaces the framework's compile-time constants in the code. Vite does it through its own
29
+ * `define`.
30
+ */
31
+ readonly shouldReplaceDefines: boolean;
32
+ }
33
+ /**
34
+ * Parameters for {@link createUnpluginVuePlugin}.
35
+ */
36
+ export interface CreateUnpluginVuePluginParams {
37
+ /**
38
+ * The bundler, which names the `unplugin-vue` entry.
39
+ */
40
+ readonly bundler: 'rollup' | 'vite';
41
+ /**
42
+ * The build features.
43
+ */
44
+ readonly features: ObsidianPluginFeatureOptions;
45
+ }
46
+ /**
47
+ * The part of a rollup or rolldown plugin context the feature plugin uses.
48
+ */
49
+ export interface FeaturePluginContext {
50
+ /**
51
+ * Adds a file to watch in a watch build.
52
+ *
53
+ * @param id - The file's path.
54
+ */
55
+ addWatchFile: (id: string) => void;
56
+ /**
57
+ * Emits an asset into the bundle.
58
+ *
59
+ * @param emittedFile - The asset to emit.
60
+ * @returns The reference id of the emitted file.
61
+ */
62
+ emitFile: (emittedFile: EmittedAsset) => string;
63
+ }
64
+ /**
65
+ * The plugin {@link createRollupCompatibleFeaturePlugin} creates, in the shape rollup and vite both accept.
66
+ */
67
+ export interface RollupCompatibleFeaturePlugin {
68
+ /**
69
+ * Loads a `.wasm` module as its bytes.
70
+ */
71
+ readonly load: FeaturePluginHook<(this: FeaturePluginContext, id: string) => Promise<null | string>>;
72
+ /**
73
+ * The plugin's name.
74
+ */
75
+ readonly name: string;
76
+ /**
77
+ * Compiles a module the features transform, then replaces the compile-time constants.
78
+ */
79
+ readonly transform: FeaturePluginHook<(this: FeaturePluginContext, code: string, id: string) => Promise<null | TransformResultLike>>;
80
+ }
81
+ /**
82
+ * The asset the feature plugin emits for a stylesheet.
83
+ */
84
+ interface EmittedAsset {
85
+ readonly name: string;
86
+ readonly source: string;
87
+ readonly type: 'asset';
88
+ }
89
+ /**
90
+ * A plugin hook with its order.
91
+ *
92
+ * @typeParam Handler - The hook's handler.
93
+ */
94
+ interface FeaturePluginHook<Handler> {
95
+ readonly handler: Handler;
96
+ readonly order: 'pre';
97
+ }
98
+ /**
99
+ * A transform hook's result.
100
+ */
101
+ interface TransformResultLike {
102
+ readonly code: string;
103
+ readonly map?: SourceMapLike | undefined;
104
+ }
105
+ /**
106
+ * Creates the plugin that runs the shared transforms in a rollup or vite build.
107
+ *
108
+ * - `framework: 'solid'` compiles `.jsx` / `.tsx` with `babel-preset-solid`, before the project's TypeScript plugin.
109
+ * - `framework: 'svelte'` compiles `.svelte` components and `.svelte.ts` / `.svelte.js` modules.
110
+ * - `styles`, where {@link CreateRollupCompatibleFeaturePluginParams.shouldCompileStylesheets} says so, runs every
111
+ * stylesheet through PostCSS, Tailwind and CSS-module scoping and emits it as an asset, which ends up in
112
+ * `styles.css`.
113
+ * - `wasm` loads a `.wasm` module as its bytes.
114
+ * - A framework's compile-time constants are replaced where
115
+ * {@link CreateRollupCompatibleFeaturePluginParams.shouldReplaceDefines} says so.
116
+ *
117
+ * @param params - The {@link CreateRollupCompatibleFeaturePluginParams}.
118
+ * @returns The plugin.
119
+ */
120
+ export declare function createRollupCompatibleFeaturePlugin(params: CreateRollupCompatibleFeaturePluginParams): RollupCompatibleFeaturePlugin;
121
+ /**
122
+ * Creates the `unplugin-vue` plugin of one bundler when the framework is Vue.
123
+ *
124
+ * @param params - The {@link CreateUnpluginVuePluginParams}.
125
+ * @returns A {@link Promise} that resolves to the plugin, or `null` when the framework is not Vue.
126
+ */
127
+ export declare function createUnpluginVuePlugin(params: CreateUnpluginVuePluginParams): Promise<unknown>;
128
+ export {};