@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,462 @@
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
+ (function patchObsidianRequire() {
33
+ const originalRequire = require;
34
+ if (!originalRequire || originalRequire.__isPatched) {
35
+ return;
36
+ }
37
+
38
+ require = Object.assign(
39
+ (id) => requirePatched(id),
40
+ originalRequire,
41
+ {
42
+ __isPatched: true
43
+ }
44
+ );
45
+
46
+ function extractDefault(module) {
47
+ return module && module.__esModule && 'default' in module ? module.default : module;
48
+ }
49
+
50
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
51
+ '@codemirror/autocomplete',
52
+ '@codemirror/collab',
53
+ '@codemirror/commands',
54
+ '@codemirror/language',
55
+ '@codemirror/lint',
56
+ '@codemirror/search',
57
+ '@codemirror/state',
58
+ '@codemirror/text',
59
+ '@codemirror/view',
60
+ '@lezer/common',
61
+ '@lezer/highlight',
62
+ '@lezer/lr',
63
+ 'obsidian']
64
+ );
65
+
66
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
67
+ '@codemirror/closebrackets',
68
+ '@codemirror/comment',
69
+ '@codemirror/fold',
70
+ '@codemirror/gutter',
71
+ '@codemirror/highlight',
72
+ '@codemirror/history',
73
+ '@codemirror/matchbrackets',
74
+ '@codemirror/panel',
75
+ '@codemirror/rangeset',
76
+ '@codemirror/rectangular-selection',
77
+ '@codemirror/stream-parser',
78
+ '@codemirror/tooltip']
79
+ );
80
+
81
+ function requirePatched(id) {
82
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
83
+ return originalRequire?.(id);
84
+ }
85
+
86
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
87
+ if (globalThis.app.isMobile) {
88
+ if (id === 'process' || id === 'node:process') {
89
+ // eslint-disable-next-line no-console -- Valid usage.
90
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
91
+
92
+ return process;
93
+ }
94
+ } else {
95
+ const module = originalRequire?.(id);
96
+ if (module) {
97
+ return extractDefault(module);
98
+ }
99
+ }
100
+
101
+ // eslint-disable-next-line no-console -- Valid usage.
102
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
103
+ return {};
104
+ }
105
+ })();
106
+
107
+ "use strict";
108
+ var __create = Object.create;
109
+ var __defProp = Object.defineProperty;
110
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
111
+ var __getOwnPropNames = Object.getOwnPropertyNames;
112
+ var __getProtoOf = Object.getPrototypeOf;
113
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
114
+ var __export = (target, all) => {
115
+ for (var name in all)
116
+ __defProp(target, name, { get: all[name], enumerable: true });
117
+ };
118
+ var __copyProps = (to, from, except, desc) => {
119
+ if (from && typeof from === "object" || typeof from === "function") {
120
+ for (let key of __getOwnPropNames(from))
121
+ if (!__hasOwnProp.call(to, key) && key !== except)
122
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
123
+ }
124
+ return to;
125
+ };
126
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
127
+ // If the importer is in node compatibility mode or this is not an ESM
128
+ // file that has been converted to a CommonJS file using a Babel-
129
+ // compatible transform (i.e. "__esModule" has not been set), then set
130
+ // "default" to the CommonJS "module.exports" for node compatibility.
131
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
132
+ mod
133
+ ));
134
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
135
+ var parcel_exports = {};
136
+ __export(parcel_exports, {
137
+ build: () => build,
138
+ buildObsidianPluginWithParcel: () => buildObsidianPluginWithParcel,
139
+ dev: () => dev,
140
+ getParcelConfigFiles: () => getParcelConfigFiles,
141
+ getParcelOptions: () => getParcelOptions
142
+ });
143
+ module.exports = __toCommonJS(parcel_exports);
144
+ var import_cli_utils = require('@mnaoumov/typescript-dev-toolkit/cli-utils');
145
+ var import_npm_run = require('@mnaoumov/typescript-dev-toolkit/npm-run');
146
+ var import_async = require('@mnaoumov/typescript-lib/async');
147
+ var import_path = require('@mnaoumov/typescript-lib/path');
148
+ var import_node_fs = require('node:fs');
149
+ var import_promises = require('node:fs/promises');
150
+ var import_obsidian_plugin_repo_paths = require('../obsidian-plugin-repo-paths.cjs');
151
+ var import_obsidian_plugin_build = require('./obsidian-plugin-build.cjs');
152
+ var import_obsidian_plugin_features = require('./obsidian-plugin-features.cjs');
153
+ var import_obsidian_plugins_folder_deployment = require('./obsidian-plugins-folder-deployment.cjs');
154
+ var __import_meta_url = globalThis["import.meta.url"] ?? (function getObsidianCjsImportMetaUrl() {
155
+ if (typeof __filename === "string") {
156
+ const localRequire = require;
157
+ const url = localRequire("node:url");
158
+ if (typeof url.pathToFileURL === "function") {
159
+ return url.pathToFileURL(__filename).href;
160
+ }
161
+ }
162
+ return typeof window === "undefined" ? "" : activeWindow.location.href;
163
+ })();
164
+ const PARCEL_CACHE_FOLDER = ".parcel-cache";
165
+ const GENERATED_PARCEL_CONFIG_FOLDER = `${PARCEL_CACHE_FOLDER}/obsidian-dev-toolkit`;
166
+ const PARCELRC = ".parcelrc";
167
+ const RESOLVER_FILE_NAME = "obsidian-plugin-resolver.cjs";
168
+ const NAMER_FILE_NAME = "obsidian-plugin-namer.cjs";
169
+ const INLINE_IMPORTS_FILE_NAME = "obsidian-plugin-inline-imports.cjs";
170
+ const OPTIMIZER_FILE_NAME = "obsidian-plugin-optimizer.cjs";
171
+ const FEATURES_FILE_NAME = "obsidian-plugin-features.cjs";
172
+ const JSON_INDENT = 2;
173
+ async function build(options) {
174
+ const result = await buildObsidianPluginWithParcel({ ...options, mode: import_obsidian_plugin_build.BuildMode.Production });
175
+ result.throwOnFailure();
176
+ }
177
+ async function buildObsidianPluginWithParcel(params) {
178
+ await (0, import_npm_run.npmRunOptional)("build:compile");
179
+ const buildContext = await (0, import_obsidian_plugin_build.resolveObsidianPluginBuildContext)(params);
180
+ await (0, import_obsidian_plugin_build.cleanObsidianPluginDistFolder)(buildContext.distFolder);
181
+ await (0, import_obsidian_plugin_build.completeObsidianPluginDistFolder)(buildContext);
182
+ const configFolder = (0, import_obsidian_plugin_build.resolveFromRoot)(GENERATED_PARCEL_CONFIG_FOLDER);
183
+ const consumerParcelrcPath = (0, import_obsidian_plugin_build.resolveFromRoot)(PARCELRC);
184
+ await (0, import_promises.mkdir)(configFolder, { recursive: true });
185
+ const configFiles = getParcelConfigFiles({
186
+ consumerParcelrcPath: (0, import_node_fs.existsSync)(consumerParcelrcPath) ? (0, import_path.toPosixPath)((0, import_path.relative)(configFolder, consumerParcelrcPath)) : void 0,
187
+ features: params
188
+ });
189
+ for (const [fileName, contents] of Object.entries(configFiles)) {
190
+ const filePath = (0, import_path.join)(configFolder, fileName);
191
+ if (!(0, import_node_fs.existsSync)(filePath) || await (0, import_promises.readFile)(filePath, "utf-8") !== contents) {
192
+ await (0, import_promises.writeFile)(filePath, contents, "utf-8");
193
+ }
194
+ }
195
+ const { Parcel } = await import("@parcel/core");
196
+ const parcelOptions = getParcelOptions({ buildContext, cacheFolder: (0, import_obsidian_plugin_build.resolveFromRoot)(PARCEL_CACHE_FOLDER), configPath: (0, import_path.join)(configFolder, PARCELRC) });
197
+ const bundler = new Parcel(params.customizeParcelOptions?.(parcelOptions) ?? parcelOptions);
198
+ if (buildContext.isProductionBuild) {
199
+ try {
200
+ const { buildTime, bundleGraph } = await bundler.run();
201
+ console.warn(`Built ${String(bundleGraph.getBundles().length)} bundle(s) with parcel in ${String(buildTime)} ms.`);
202
+ return import_cli_utils.CliTaskResult.Success();
203
+ } catch (error) {
204
+ console.error(formatParcelError(error));
205
+ return import_cli_utils.CliTaskResult.Failure();
206
+ }
207
+ }
208
+ await bundler.watch((error, event) => {
209
+ if (error) {
210
+ console.error(formatParcelError(error));
211
+ return;
212
+ }
213
+ handleWatchEvent(event, buildContext);
214
+ });
215
+ return import_cli_utils.CliTaskResult.DoNotExit();
216
+ }
217
+ async function dev(options) {
218
+ return await buildObsidianPluginWithParcel({ ...options, mode: import_obsidian_plugin_build.BuildMode.Development });
219
+ }
220
+ function getParcelConfigFiles(params) {
221
+ const { consumerParcelrcPath, features = {} } = params;
222
+ const featureTransformer = `./${FEATURES_FILE_NAME}`;
223
+ const transformers = {};
224
+ if (features.framework === "svelte") {
225
+ transformers["*.svelte"] = [featureTransformer];
226
+ transformers["*.svelte.{js,ts}"] = [featureTransformer, `./${INLINE_IMPORTS_FILE_NAME}`, "..."];
227
+ }
228
+ if (features.framework === "solid" || (0, import_obsidian_plugin_features.getJsxImportSource)(features.framework) !== void 0) {
229
+ transformers["*.{jsx,tsx}"] = [featureTransformer];
230
+ }
231
+ if (features.wasm) {
232
+ transformers["*.wasm"] = [featureTransformer];
233
+ }
234
+ if ((0, import_obsidian_plugin_features.isPostcssNeeded)(features.styles)) {
235
+ transformers["*.{css,pcss}"] = [featureTransformer, "@parcel/transformer-css"];
236
+ }
237
+ const defines = (0, import_obsidian_plugin_features.getFrameworkDefines)({ framework: features.framework, isProductionBuild: true });
238
+ transformers["*.{js,mjs,cjs,jsx,ts,mts,cts,tsx}"] = [
239
+ ...Object.keys(defines).length > 0 ? [featureTransformer] : [],
240
+ `./${INLINE_IMPORTS_FILE_NAME}`,
241
+ "..."
242
+ ];
243
+ const parcelrc = {
244
+ extends: consumerParcelrcPath ?? "@parcel/config-default",
245
+ namers: [`./${NAMER_FILE_NAME}`, "..."],
246
+ optimizers: {
247
+ "*.js": ["...", `./${OPTIMIZER_FILE_NAME}`]
248
+ },
249
+ resolvers: [`./${RESOLVER_FILE_NAME}`, "..."],
250
+ transformers
251
+ };
252
+ return {
253
+ [FEATURES_FILE_NAME]: `/*
254
+ * Generated by @mnaoumov/obsidian-dev-toolkit. Runs the toolkit's shared transforms for the build features, loaded
255
+ * from the toolkit itself, so parcel compiles each feature the way every other bundler adapter does.
256
+ */
257
+ const { Transformer } = require('@parcel/plugin');
258
+
259
+ const FEATURES_MODULE_URL = ${JSON.stringify(getSiblingModuleUrl("obsidian-plugin-features"))};
260
+ const TRANSFORMS_MODULE_URL = ${JSON.stringify(getSiblingModuleUrl("obsidian-plugin-transforms"))};
261
+ const FRAMEWORK = ${JSON.stringify(features.framework ?? null)};
262
+ const STYLES = ${JSON.stringify(features.styles ?? {})};
263
+
264
+ module.exports = new Transformer({
265
+ async transform({ asset, options }) {
266
+ const { getFeatureFileKind, getFrameworkDefines, getJsxImportSource, replaceDefines } = await import(FEATURES_MODULE_URL);
267
+ const transforms = await import(TRANSFORMS_MODULE_URL);
268
+ const filePath = asset.filePath;
269
+ const isProductionBuild = options.mode === 'production';
270
+ const defines = getFrameworkDefines({ framework: FRAMEWORK ?? undefined, isProductionBuild });
271
+ switch (getFeatureFileKind(filePath)) {
272
+ case 'jsx': {
273
+ const code = await asset.getCode();
274
+ const jsxImportSource = getJsxImportSource(FRAMEWORK ?? undefined);
275
+ const result = FRAMEWORK === 'solid'
276
+ ? await transforms.transformSolid({ code, filePath, isProductionBuild })
277
+ : await transforms.transformJsx({ code, filePath, isProductionBuild, jsxImportSource });
278
+ asset.setCode(replaceDefines(result.code, defines));
279
+ asset.type = 'js';
280
+ break;
281
+ }
282
+ case 'stylesheet': {
283
+ const result = await transforms.transformCss({ filePath, isCssModuleScoped: false, isProductionBuild, source: await asset.getCode(), styles: STYLES });
284
+ asset.setCode(result.css);
285
+ for (const dependency of result.dependencies) {
286
+ asset.invalidateOnFileChange(dependency);
287
+ }
288
+ break;
289
+ }
290
+ case 'svelte': {
291
+ const result = await transforms.transformSvelte({ code: await asset.getCode(), filePath, isProductionBuild });
292
+ asset.setCode(replaceDefines(result.code, defines));
293
+ asset.type = 'js';
294
+ break;
295
+ }
296
+ case 'wasm':
297
+ asset.setCode(transforms.getWasmModuleCode(await asset.getBuffer()));
298
+ asset.type = 'js';
299
+ break;
300
+ default: {
301
+ // A framework's runtime reads process.env.NODE_ENV, which parcel leaves alone in an electron-renderer library.
302
+ const code = await asset.getCode();
303
+ const replaced = replaceDefines(code, defines);
304
+ if (replaced !== code) {
305
+ asset.setCode(replaced);
306
+ }
307
+ break;
308
+ }
309
+ }
310
+ return [asset];
311
+ }
312
+ });
313
+ `,
314
+ // `String.raw`, so the regular expression below reaches the file with its backslashes intact.
315
+ [INLINE_IMPORTS_FILE_NAME]: String.raw`/*
316
+ * Generated by @mnaoumov/obsidian-dev-toolkit. Keeps every dynamic import() inside main.js.
317
+ *
318
+ * Obsidian loads a plugin's main.js and nothing beside it, and parcel makes every import() a bundle of its
319
+ * own with no option to inline one. This rewrites import("<literal>") into a require() inside an async
320
+ * arrow, before parcel's own JavaScript transformer runs: the module still evaluates only when that code
321
+ * runs, and the promise still rejects when evaluation throws. Only a plain string specifier is rewritten,
322
+ * since a computed one cannot be bundled by any bundler.
323
+ */
324
+ const { Transformer } = require('@parcel/plugin');
325
+
326
+ const DYNAMIC_IMPORT = /\bimport\(\s*(["'])([^"'\x60\n\\]+)\1\s*\)/gu;
327
+
328
+ module.exports = new Transformer({
329
+ async transform({ asset }) {
330
+ const source = await asset.getCode();
331
+ if (source.includes('import(')) {
332
+ asset.setCode(source.replace(DYNAMIC_IMPORT, (_match, quote, specifier) => '(async () => require(' + quote + specifier + quote + '))()'));
333
+ }
334
+ return [asset];
335
+ }
336
+ });
337
+ `,
338
+ [NAMER_FILE_NAME]: `/* Generated by @mnaoumov/obsidian-dev-toolkit. Obsidian loads a plugin's stylesheet from styles.css and nothing else. */
339
+ const { Namer } = require('@parcel/plugin');
340
+
341
+ module.exports = new Namer({
342
+ name({ bundle }) {
343
+ return bundle.type === 'css' ? '${import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.StylesCss}' : null;
344
+ }
345
+ });
346
+ `,
347
+ [OPTIMIZER_FILE_NAME]: `/*
348
+ * Generated by @mnaoumov/obsidian-dev-toolkit. Runs after parcel's own optimizers, on the JavaScript bundle.
349
+ *
350
+ * Obsidian evaluates main.js as the body of function (require, module, exports), with a module object that
351
+ * has no require of its own, and parcel's runtime reaches every external module through module.require.
352
+ * Without the first line below, the very first require('obsidian') throws "Cannot find module". The banner
353
+ * goes in here too, after minification, which would otherwise strip it as an ordinary comment.
354
+ */
355
+ const { Optimizer } = require('@parcel/plugin');
356
+
357
+ const PREAMBLE = ${JSON.stringify(`${(0, import_obsidian_plugin_build.getObsidianPluginBanner)("parcel")}if (typeof module === 'object' && typeof module.require !== 'function') { module.require = require; }
358
+ `)};
359
+ const PREAMBLE_LINE_COUNT = ${String((0, import_obsidian_plugin_build.getObsidianPluginBanner)("parcel").split("\n").length)};
360
+
361
+ async function readContents(contents) {
362
+ if (typeof contents === 'string') {
363
+ return contents;
364
+ }
365
+ if (Buffer.isBuffer(contents)) {
366
+ return contents.toString('utf-8');
367
+ }
368
+ const chunks = [];
369
+ for await (const chunk of contents) {
370
+ chunks.push(Buffer.from(chunk));
371
+ }
372
+ return Buffer.concat(chunks).toString('utf-8');
373
+ }
374
+
375
+ module.exports = new Optimizer({
376
+ async optimize({ contents, map }) {
377
+ const code = await readContents(contents);
378
+ if (map) {
379
+ map.offsetLines(1, PREAMBLE_LINE_COUNT);
380
+ }
381
+ return { contents: PREAMBLE + code, map };
382
+ }
383
+ });
384
+ `,
385
+ [PARCELRC]: `${JSON.stringify(parcelrc, null, JSON_INDENT)}
386
+ `,
387
+ [RESOLVER_FILE_NAME]: `/* Generated by @mnaoumov/obsidian-dev-toolkit. Leaves the modules Obsidian supplies at runtime to require(). */
388
+ const { Resolver } = require('@parcel/plugin');
389
+
390
+ const EXTERNALS = new Set(${JSON.stringify(import_obsidian_plugin_build.OBSIDIAN_PLUGIN_EXTERNALS)});
391
+
392
+ function getPackageName(specifier) {
393
+ const segments = specifier.split('/');
394
+ return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : segments[0];
395
+ }
396
+
397
+ module.exports = new Resolver({
398
+ resolve({ specifier }) {
399
+ const isExternal = specifier.startsWith('node:') || EXTERNALS.has(specifier) || EXTERNALS.has(getPackageName(specifier));
400
+ return isExternal ? { isExcluded: true } : null;
401
+ }
402
+ });
403
+ `
404
+ };
405
+ }
406
+ function getParcelOptions(params) {
407
+ const { buildContext, cacheFolder, configPath } = params;
408
+ const target = {
409
+ context: "electron-renderer",
410
+ // eslint-disable-next-line unicorn/name-replacements -- `distDir` is the name parcel's API reads.
411
+ distDir: buildContext.distFolder,
412
+ includeNodeModules: true,
413
+ isLibrary: true,
414
+ optimize: buildContext.isProductionBuild,
415
+ outputFormat: "commonjs",
416
+ sourceMap: !buildContext.isProductionBuild && { inline: true }
417
+ };
418
+ return {
419
+ // eslint-disable-next-line unicorn/name-replacements -- `cacheDir` is the name parcel's API reads.
420
+ cacheDir: cacheFolder,
421
+ config: configPath,
422
+ defaultTargetOptions: {
423
+ // eslint-disable-next-line unicorn/name-replacements -- `distDir` is the name parcel's API reads.
424
+ distDir: buildContext.distFolder,
425
+ shouldOptimize: buildContext.isProductionBuild,
426
+ sourceMaps: !buildContext.isProductionBuild
427
+ },
428
+ entries: buildContext.entryPoint,
429
+ mode: buildContext.isProductionBuild ? "production" : "development",
430
+ targets: { obsidianPlugin: target }
431
+ };
432
+ }
433
+ function formatParcelError(error) {
434
+ const diagnostics = error?.diagnostics;
435
+ if (diagnostics && diagnostics.length > 0) {
436
+ return diagnostics.map((diagnostic) => diagnostic.message).join("\n");
437
+ }
438
+ return error instanceof Error ? error.stack ?? error.message : String(error);
439
+ }
440
+ function getSiblingModuleUrl(baseName) {
441
+ return new URL(`${baseName}${(0, import_path.extname)(new URL(__import_meta_url).pathname)}`, __import_meta_url).href;
442
+ }
443
+ function handleWatchEvent(event, buildContext) {
444
+ if (event?.type === "buildFailure") {
445
+ console.error(event.diagnostics.map((diagnostic) => diagnostic.message).join("\n"));
446
+ return;
447
+ }
448
+ if (event?.type !== "buildSuccess") {
449
+ return;
450
+ }
451
+ console.warn(`Rebuilt with parcel in ${String(event.buildTime)} ms.`);
452
+ (0, import_async.invokeAsyncSafely)(() => (0, import_obsidian_plugins_folder_deployment.deployToObsidianPluginsFolder)(buildContext));
453
+ }
454
+ // Annotate the CommonJS export names for ESM import in node:
455
+ 0 && (module.exports = {
456
+ build,
457
+ buildObsidianPluginWithParcel,
458
+ dev,
459
+ getParcelConfigFiles,
460
+ getParcelOptions
461
+ });
462
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9wYXJjZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9faW1wb3J0X21ldGFfdXJsID0gZ2xvYmFsVGhpc1snaW1wb3J0Lm1ldGEudXJsJ10gPz8gKGZ1bmN0aW9uIGdldE9ic2lkaWFuQ2pzSW1wb3J0TWV0YVVybCgpIHtcbiAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGxvY2FsUmVxdWlyZSA9IHJlcXVpcmU7XG4gICAgY29uc3QgdXJsID0gbG9jYWxSZXF1aXJlKCdub2RlOnVybCcpO1xuICAgIGlmICh0eXBlb2YgdXJsLnBhdGhUb0ZpbGVVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB1cmwucGF0aFRvRmlsZVVSTChfX2ZpbGVuYW1lKS5ocmVmO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgZW52aXJvbm1lbnQgaXMgdW5rbm93blxuICByZXR1cm4gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6IGFjdGl2ZVdpbmRvdy5sb2NhdGlvbi5ocmVmO1xufSkoKTtcbi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYW4gT2JzaWRpYW4gcGx1Z2luIHdpdGggcGFyY2VsOiBgYnVpbGQoKWAgYW5kIGBkZXYoKWAsIHRoZSBzYW1lIHR3byBlbnRyeSBwb2ludHMgdGhlIGVzYnVpbGRcbiAqIGJ1aWxkZXIgaGFzLCBwcm9kdWNpbmcgdGhlIHNhbWUgYG1haW4uanNgICsgYHN0eWxlcy5jc3NgICsgYG1hbmlmZXN0Lmpzb25gIGxheW91dC5cbiAqXG4gKiBQYXJjZWwgdGFrZXMgbm8gYGV4dGVybmFsYCBsaXN0IGFuZCBubyBvdXRwdXQgZmlsZSBuYW1lLCBvbmx5IHBsdWdpbnMgbmFtZWQgaW4gYSBgLnBhcmNlbHJjYC4gU28gdGhlXG4gKiBidWlsZCB3cml0ZXMgYSBgLnBhcmNlbHJjYCBvZiBpdHMgb3duIGludG8gYC5wYXJjZWwtY2FjaGVgLCBiZXNpZGUgYSByZXNvbHZlciB0aGF0IGxlYXZlc1xuICogT2JzaWRpYW4ncyBtb2R1bGVzIGV4dGVybmFsLCBhIG5hbWVyIHRoYXQgbmFtZXMgdGhlIHN0eWxlc2hlZXQgYHN0eWxlcy5jc3NgIGFuZCBhIHRyYW5zZm9ybWVyIHRoYXQga2VlcHNcbiAqIGR5bmFtaWMgaW1wb3J0cyBpbnNpZGUgYG1haW4uanNgLCBhbmQgZXh0ZW5kcyB0aGVcbiAqIGNvbnN1bWVyJ3Mgb3duIGAucGFyY2VscmNgIHdoZW4gdGhlcmUgaXMgb25lIChvciBgQHBhcmNlbC9jb25maWctZGVmYXVsdGAgd2hlbiB0aGVyZSBpcyBub25lKSwgc28gZXZlcnlcbiAqIHRyYW5zZm9ybWVyIHRoZSBjb25zdW1lciBjb25maWd1cmVkIHN0aWxsIGFwcGxpZXMuXG4gKlxuICogYEBwYXJjZWwvY29yZWAsIGBAcGFyY2VsL3BsdWdpbmAgYW5kIGBAcGFyY2VsL2NvbmZpZy1kZWZhdWx0YCBhcmUgb3B0aW9uYWwgcGVlciBkZXBlbmRlbmNpZXMsIGxvYWRlZFxuICogb25seSB3aGVuIGEgcGFyY2VsIGJ1aWxkIHJ1bnMsIHNvIGEgcGx1Z2luIGJ1aWx0IHdpdGggZXNidWlsZCBpbnN0YWxscyBub3RoaW5nIGV4dHJhLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQnVpbGRFdmVudCxcbiAgSW5pdGlhbFBhcmNlbE9wdGlvbnMsXG4gIFRhcmdldERlc2NyaXB0b3Jcbn0gZnJvbSAnQHBhcmNlbC90eXBlcyc7XG5cbmltcG9ydCB7IENsaVRhc2tSZXN1bHQgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9jbGktdXRpbHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9ucG0tcnVuJztcbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlLFxuICB0b1Bvc2l4UGF0aFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBta2RpcixcbiAgcmVhZEZpbGUsXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCxcbiAgT2JzaWRpYW5QbHVnaW5EZXBsb3ltZW50T3B0aW9uc1xufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZC50cyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy50cyc7XG5cbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgQnVpbGRNb2RlLFxuICBjbGVhbk9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcixcbiAgY29tcGxldGVPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIsXG4gIGdldE9ic2lkaWFuUGx1Z2luQmFubmVyLFxuICBPQlNJRElBTl9QTFVHSU5fRVhURVJOQUxTLFxuICByZXNvbHZlRnJvbVJvb3QsXG4gIHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZC50cyc7XG5pbXBvcnQge1xuICBnZXRGcmFtZXdvcmtEZWZpbmVzLFxuICBnZXRKc3hJbXBvcnRTb3VyY2UsXG4gIGlzUG9zdGNzc05lZWRlZFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy50cyc7XG5pbXBvcnQgeyBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlciB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXItZGVwbG95bWVudC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbFBhcmFtcyBleHRlbmRzIEJ1aWxkT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGJ1aWxkIG1vZGUsIGVpdGhlciBgRGV2ZWxvcG1lbnRgIG9yIGBQcm9kdWN0aW9uYC5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU6IEJ1aWxkTW9kZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGR9IGFuZCB7QGxpbmsgZGV2fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9wdGlvbnMgZXh0ZW5kcyBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zLCBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIEN1c3RvbWl6ZXMgdGhlIG9wdGlvbnMgaGFuZGVkIHRvIHBhcmNlbCdzIGBQYXJjZWxgIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9taXplUGFyY2VsT3B0aW9ucz86IChvcHRpb25zOiBJbml0aWFsUGFyY2VsT3B0aW9ucykgPT4gSW5pdGlhbFBhcmNlbE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldFBhcmNlbENvbmZpZ0ZpbGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRQYXJjZWxDb25maWdGaWxlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uc3VtZXIncyBvd24gYC5wYXJjZWxyY2AsIHJlbGF0aXZlIHRvIHRoZSBnZW5lcmF0ZWQgY29uZmlndXJhdGlvbidzIGZvbGRlciwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcHJvamVjdFxuICAgKiBoYXMgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnN1bWVyUGFyY2VscmNQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzPzogT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0UGFyY2VsT3B0aW9uc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UGFyY2VsT3B0aW9uc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFBhcmNlbCdzIGNhY2hlIGZvbGRlci4gTmFtZWQgZXhwbGljaXRseSBiZWNhdXNlIHBhcmNlbCBvdGhlcndpc2UgdGFrZXMgdGhlIGZvbGRlciBvZiB0aGUgbmVhcmVzdFxuICAgKiBsb2NrZmlsZSBmb3IgdGhlIHByb2plY3Qgcm9vdCwgd2hpY2ggaW4gYSB3b3Jrc3BhY2UgaXMgbm90IHRoZSBwbHVnaW4ncy5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlRm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBnZW5lcmF0ZWQgYC5wYXJjZWxyY2AuXG4gICAqL1xuICByZWFkb25seSBjb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGZpbGVzIG9mIHRoZSBnZW5lcmF0ZWQgcGFyY2VsIGNvbmZpZ3VyYXRpb24sIGJ5IGZpbGUgbmFtZS5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyY2VsQ29uZmlnRmlsZXMgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuLy8gSW5zaWRlIHBhcmNlbCdzIG93biBjYWNoZSBmb2xkZXI6IHBhcmNlbCByZWZ1c2VzIHJlbGF0aXZlIHBsdWdpbnMgaW4gYSBjb25maWcgdW5kZXIgYG5vZGVfbW9kdWxlc2AgKGl0XG4vLyB0YWtlcyBzdWNoIGEgY29uZmlnIGZvciBhIHB1Ymxpc2hlZCBwYWNrYWdlKSwgYW5kIGl0IG5ldmVyIHdhdGNoZXMgaXRzIGNhY2hlIGZvbGRlciwgc28gcmVnZW5lcmF0aW5nXG4vLyB0aGVzZSBmaWxlcyBvbiBldmVyeSBidWlsZCBjYW5ub3QgdHJpZ2dlciBhIHJlYnVpbGQuXG5jb25zdCBQQVJDRUxfQ0FDSEVfRk9MREVSID0gJy5wYXJjZWwtY2FjaGUnO1xuY29uc3QgR0VORVJBVEVEX1BBUkNFTF9DT05GSUdfRk9MREVSID0gYCR7UEFSQ0VMX0NBQ0hFX0ZPTERFUn0vb2JzaWRpYW4tZGV2LXRvb2xraXRgO1xuY29uc3QgUEFSQ0VMUkMgPSAnLnBhcmNlbHJjJztcblxuLyoqXG4gKiBPbmUgZGlhZ25vc3RpYyBvZiBhIHtAbGluayBQYXJjZWxFcnJvckxpa2V9LlxuICovXG5pbnRlcmZhY2UgUGFyY2VsRXJyb3JEaWFnbm9zdGljIHtcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgcGFyY2VsIHRocm93cyB3aGVuIGEgYnVpbGQgZmFpbHM6IGFuIGVycm9yIGNhcnJ5aW5nIGl0cyBkaWFnbm9zdGljcy5cbiAqL1xuaW50ZXJmYWNlIFBhcmNlbEVycm9yTGlrZSB7XG4gIHJlYWRvbmx5IGRpYWdub3N0aWNzPzogcmVhZG9ubHkgUGFyY2VsRXJyb3JEaWFnbm9zdGljW107XG59XG5jb25zdCBSRVNPTFZFUl9GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLXJlc29sdmVyLmNqcyc7XG5jb25zdCBOQU1FUl9GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLW5hbWVyLmNqcyc7XG5jb25zdCBJTkxJTkVfSU1QT1JUU19GSUxFX05BTUUgPSAnb2JzaWRpYW4tcGx1Z2luLWlubGluZS1pbXBvcnRzLmNqcyc7XG5jb25zdCBPUFRJTUlaRVJfRklMRV9OQU1FID0gJ29ic2lkaWFuLXBsdWdpbi1vcHRpbWl6ZXIuY2pzJztcbmNvbnN0IEZFQVRVUkVTX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMuY2pzJztcbmNvbnN0IEpTT05fSU5ERU5UID0gMjtcblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIFJ1bnMgYSByZWFsIHBhcmNlbCBidWlsZDsgZXhlcmNpc2VkIGJ5IHRoZSBidW5kbGVyIGludGVncmF0aW9uIHRlc3QuICovXG4vKipcbiAqIEJ1aWxkcyB0aGUgT2JzaWRpYW4gcGx1Z2luIGluIHByb2R1Y3Rpb24gbW9kZSB1c2luZyBwYXJjZWwuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBidWlsZCBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKG9wdGlvbnM/OiBCdWlsZE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWwoeyAuLi5vcHRpb25zLCBtb2RlOiBCdWlsZE1vZGUuUHJvZHVjdGlvbiB9KTtcbiAgcmVzdWx0LnRocm93T25GYWlsdXJlKCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBPYnNpZGlhbiBwbHVnaW4gd2l0aCBwYXJjZWwsIG9uY2UgZm9yIGEgcHJvZHVjdGlvbiBidWlsZCwgb3Igd2F0Y2hpbmcgZm9yIGEgZGV2ZWxvcG1lbnQgb25lLlxuICpcbiAqIFJ1bnMgdGhlIHByb2plY3QncyBgYnVpbGQ6Y29tcGlsZWAgc2NyaXB0IGZpcnN0IHdoZW4gaXQgaGFzIG9uZSwgYXMgdGhlIGVzYnVpbGQgYnVpbGRlciBkb2VzLCBzaW5jZVxuICogcGFyY2VsIHN0cmlwcyBUeXBlU2NyaXB0IHR5cGVzIHdpdGhvdXQgY2hlY2tpbmcgdGhlbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBCdWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbFBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEge0BsaW5rIENsaVRhc2tSZXN1bHR9IGluZGljYXRpbmcgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgYnVpbGQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE9ic2lkaWFuUGx1Z2luV2l0aFBhcmNlbChwYXJhbXM6IEJ1aWxkT2JzaWRpYW5QbHVnaW5XaXRoUGFyY2VsUGFyYW1zKTogUHJvbWlzZTxDbGlUYXNrUmVzdWx0PiB7XG4gIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCdidWlsZDpjb21waWxlJyk7XG4gIGNvbnN0IGJ1aWxkQ29udGV4dCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dChwYXJhbXMpO1xuICBhd2FpdCBjbGVhbk9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihidWlsZENvbnRleHQuZGlzdEZvbGRlcik7XG4gIGF3YWl0IGNvbXBsZXRlT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyKGJ1aWxkQ29udGV4dCk7XG5cbiAgY29uc3QgY29uZmlnRm9sZGVyID0gcmVzb2x2ZUZyb21Sb290KEdFTkVSQVRFRF9QQVJDRUxfQ09ORklHX0ZPTERFUik7XG4gIGNvbnN0IGNvbnN1bWVyUGFyY2VscmNQYXRoID0gcmVzb2x2ZUZyb21Sb290KFBBUkNFTFJDKTtcbiAgYXdhaXQgbWtkaXIoY29uZmlnRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgY29uZmlnRmlsZXMgPSBnZXRQYXJjZWxDb25maWdGaWxlcyh7XG4gICAgY29uc3VtZXJQYXJjZWxyY1BhdGg6IGV4aXN0c1N5bmMoY29uc3VtZXJQYXJjZWxyY1BhdGgpID8gdG9Qb3NpeFBhdGgocmVsYXRpdmUoY29uZmlnRm9sZGVyLCBjb25zdW1lclBhcmNlbHJjUGF0aCkpIDogdW5kZWZpbmVkLFxuICAgIGZlYXR1cmVzOiBwYXJhbXNcbiAgfSk7XG4gIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBjb250ZW50c10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnRmlsZXMpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKGNvbmZpZ0ZvbGRlciwgZmlsZU5hbWUpO1xuICAgIC8vIFJld3JpdHRlbiBvbmx5IHdoZW4gaXQgY2hhbmdlZDogcGFyY2VsIGludmFsaWRhdGVzIGl0cyBjYWNoZSBvbiBhIGNvbmZpZyBmaWxlJ3MgbW9kaWZpY2F0aW9uIHRpbWUuXG4gICAgaWYgKCFleGlzdHNTeW5jKGZpbGVQYXRoKSB8fCBhd2FpdCByZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04JykgIT09IGNvbnRlbnRzKSB7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnRzLCAndXRmLTgnKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB7IFBhcmNlbCB9ID0gYXdhaXQgaW1wb3J0KCdAcGFyY2VsL2NvcmUnKTtcbiAgY29uc3QgcGFyY2VsT3B0aW9ucyA9IGdldFBhcmNlbE9wdGlvbnMoeyBidWlsZENvbnRleHQsIGNhY2hlRm9sZGVyOiByZXNvbHZlRnJvbVJvb3QoUEFSQ0VMX0NBQ0hFX0ZPTERFUiksIGNvbmZpZ1BhdGg6IGpvaW4oY29uZmlnRm9sZGVyLCBQQVJDRUxSQykgfSk7XG4gIGNvbnN0IGJ1bmRsZXIgPSBuZXcgUGFyY2VsKHBhcmFtcy5jdXN0b21pemVQYXJjZWxPcHRpb25zPy4ocGFyY2VsT3B0aW9ucykgPz8gcGFyY2VsT3B0aW9ucyk7XG5cbiAgaWYgKGJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGJ1aWxkVGltZSwgYnVuZGxlR3JhcGggfSA9IGF3YWl0IGJ1bmRsZXIucnVuKCk7XG4gICAgICBjb25zb2xlLndhcm4oYEJ1aWx0ICR7U3RyaW5nKGJ1bmRsZUdyYXBoLmdldEJ1bmRsZXMoKS5sZW5ndGgpfSBidW5kbGUocykgd2l0aCBwYXJjZWwgaW4gJHtTdHJpbmcoYnVpbGRUaW1lKX0gbXMuYCk7XG4gICAgICByZXR1cm4gQ2xpVGFza1Jlc3VsdC5TdWNjZXNzKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0UGFyY2VsRXJyb3IoZXJyb3IpKTtcbiAgICAgIHJldHVybiBDbGlUYXNrUmVzdWx0LkZhaWx1cmUoKTtcbiAgICB9XG4gIH1cblxuICBhd2FpdCBidW5kbGVyLndhdGNoKChlcnJvciwgZXZlbnQpID0+IHtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0UGFyY2VsRXJyb3IoZXJyb3IpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaGFuZGxlV2F0Y2hFdmVudChldmVudCwgYnVpbGRDb250ZXh0KTtcbiAgfSk7XG4gIHJldHVybiBDbGlUYXNrUmVzdWx0LkRvTm90RXhpdCgpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgT2JzaWRpYW4gcGx1Z2luIGluIGRldmVsb3BtZW50IG1vZGUgdXNpbmcgcGFyY2VsLCB3YXRjaGluZyBmb3IgY2hhbmdlcyBhbmQgZGVwbG95aW5nIGV2ZXJ5XG4gKiBzdWNjZXNzZnVsIHJlYnVpbGQgaW50byB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBDbGlUYXNrUmVzdWx0fSBpbmRpY2F0aW5nIHRoZSBidWlsZCByZXN1bHQuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2ggLS0gSW50ZW50aW9uYWxseSBzaGFyZXMgQnVpbGRPcHRpb25zIHdpdGggYnVpbGQoKS5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXYob3B0aW9ucz86IEJ1aWxkT3B0aW9ucyk6IFByb21pc2U8Q2xpVGFza1Jlc3VsdD4ge1xuICByZXR1cm4gYXdhaXQgYnVpbGRPYnNpZGlhblBsdWdpbldpdGhQYXJjZWwoeyAuLi5vcHRpb25zLCBtb2RlOiBCdWlsZE1vZGUuRGV2ZWxvcG1lbnQgfSk7XG59XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgZmlsZXMgb2YgdGhlIHBhcmNlbCBjb25maWd1cmF0aW9uIHRoZSBidWlsZCBydW5zIHdpdGguXG4gKlxuICogVGhlIGJ1aWxkIGZlYXR1cmVzIGFkZCBwaXBlbGluZXMgdGhhdCBydW4gdGhlIHRvb2xraXQncyBzaGFyZWQgdHJhbnNmb3JtcywgdGhyb3VnaCBvbmUgZ2VuZXJhdGVkIHRyYW5zZm9ybWVyIHRoYXRcbiAqIGxvYWRzIHRoZW0gZnJvbSB0aGUgdG9vbGtpdDogU29saWQncyBgLmpzeGAgLyBgLnRzeGAsIFN2ZWx0ZSdzIGAuc3ZlbHRlYCAvIGAuc3ZlbHRlLnRzYCAvIGAuc3ZlbHRlLmpzYCwgYC53YXNtYCxcbiAqIGFuZCB3aXRoIGBzdHlsZXMucG9zdGNzc2Agb3IgYHN0eWxlcy50YWlsd2luZGAgZXZlcnkgc3R5bGVzaGVldCwgaW4gcGxhY2Ugb2YgcGFyY2VsJ3Mgb3duIFBvc3RDU1Mgc3RlcC4gUmVhY3QgYW5kXG4gKiBQcmVhY3QgSlNYIGlzIGNvbXBpbGVkIGhlcmUgdG9vLCBzaW5jZSBwYXJjZWwgcmVhZHMgdGhlIEpTWCBydW50aW1lIGZyb20gYSB0c2NvbmZpZyB3aXRob3V0IGZvbGxvd2luZyBpdHMgYGV4dGVuZHNgLFxuICogYW5kIHdpdGggYW55IGZyYW1ld29yayBldmVyeSBzY3JpcHQgaGFzIHRoZSBmcmFtZXdvcmsncyBjb21waWxlLXRpbWUgY29uc3RhbnRzIHJlcGxhY2VkLiBQYXJjZWwgY29tcGlsZXMgVnVlIHdpdGhcbiAqIGBAcGFyY2VsL3RyYW5zZm9ybWVyLXZ1ZWAgYW5kIHNjb3BlcyBgKi5tb2R1bGUuY3NzYCBpdHNlbGYsIHNvIHRob3NlIG5lZWQgbm8gcGlwZWxpbmUgaGVyZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBHZXRQYXJjZWxDb25maWdGaWxlc1BhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgZmlsZXMsIGJ5IGZpbGUgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmNlbENvbmZpZ0ZpbGVzKHBhcmFtczogR2V0UGFyY2VsQ29uZmlnRmlsZXNQYXJhbXMpOiBQYXJjZWxDb25maWdGaWxlcyB7XG4gIGNvbnN0IHsgY29uc3VtZXJQYXJjZWxyY1BhdGgsIGZlYXR1cmVzID0ge30gfSA9IHBhcmFtcztcbiAgY29uc3QgZmVhdHVyZVRyYW5zZm9ybWVyID0gYC4vJHtGRUFUVVJFU19GSUxFX05BTUV9YDtcbiAgY29uc3QgdHJhbnNmb3JtZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgaWYgKGZlYXR1cmVzLmZyYW1ld29yayA9PT0gJ3N2ZWx0ZScpIHtcbiAgICB0cmFuc2Zvcm1lcnNbJyouc3ZlbHRlJ10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyXTtcbiAgICB0cmFuc2Zvcm1lcnNbJyouc3ZlbHRlLntqcyx0c30nXSA9IFtmZWF0dXJlVHJhbnNmb3JtZXIsIGAuLyR7SU5MSU5FX0lNUE9SVFNfRklMRV9OQU1FfWAsICcuLi4nXTtcbiAgfVxuICBpZiAoZmVhdHVyZXMuZnJhbWV3b3JrID09PSAnc29saWQnIHx8IGdldEpzeEltcG9ydFNvdXJjZShmZWF0dXJlcy5mcmFtZXdvcmspICE9PSB1bmRlZmluZWQpIHtcbiAgICB0cmFuc2Zvcm1lcnNbJyoue2pzeCx0c3h9J10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyXTtcbiAgfVxuICBpZiAoZmVhdHVyZXMud2FzbSkge1xuICAgIHRyYW5zZm9ybWVyc1snKi53YXNtJ10gPSBbZmVhdHVyZVRyYW5zZm9ybWVyXTtcbiAgfVxuICBpZiAoaXNQb3N0Y3NzTmVlZGVkKGZlYXR1cmVzLnN0eWxlcykpIHtcbiAgICB0cmFuc2Zvcm1lcnNbJyoue2NzcyxwY3NzfSddID0gW2ZlYXR1cmVUcmFuc2Zvcm1lciwgJ0BwYXJjZWwvdHJhbnNmb3JtZXItY3NzJ107XG4gIH1cbiAgY29uc3QgZGVmaW5lcyA9IGdldEZyYW1ld29ya0RlZmluZXMoeyBmcmFtZXdvcms6IGZlYXR1cmVzLmZyYW1ld29yaywgaXNQcm9kdWN0aW9uQnVpbGQ6IHRydWUgfSk7XG4gIHRyYW5zZm9ybWVyc1snKi57anMsbWpzLGNqcyxqc3gsdHMsbXRzLGN0cyx0c3h9J10gPSBbXG4gICAgLi4uT2JqZWN0LmtleXMoZGVmaW5lcykubGVuZ3RoID4gMCA/IFtmZWF0dXJlVHJhbnNmb3JtZXJdIDogW10sXG4gICAgYC4vJHtJTkxJTkVfSU1QT1JUU19GSUxFX05BTUV9YCxcbiAgICAnLi4uJ1xuICBdO1xuXG4gIGNvbnN0IHBhcmNlbHJjID0ge1xuICAgIGV4dGVuZHM6IGNvbnN1bWVyUGFyY2VscmNQYXRoID8/ICdAcGFyY2VsL2NvbmZpZy1kZWZhdWx0JyxcbiAgICBuYW1lcnM6IFtgLi8ke05BTUVSX0ZJTEVfTkFNRX1gLCAnLi4uJ10sXG4gICAgb3B0aW1pemVyczoge1xuICAgICAgJyouanMnOiBbJy4uLicsIGAuLyR7T1BUSU1JWkVSX0ZJTEVfTkFNRX1gXVxuICAgIH0sXG4gICAgcmVzb2x2ZXJzOiBbYC4vJHtSRVNPTFZFUl9GSUxFX05BTUV9YCwgJy4uLiddLFxuICAgIHRyYW5zZm9ybWVyc1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgW0ZFQVRVUkVTX0ZJTEVfTkFNRV06IGAvKlxuICogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gUnVucyB0aGUgdG9vbGtpdCdzIHNoYXJlZCB0cmFuc2Zvcm1zIGZvciB0aGUgYnVpbGQgZmVhdHVyZXMsIGxvYWRlZFxuICogZnJvbSB0aGUgdG9vbGtpdCBpdHNlbGYsIHNvIHBhcmNlbCBjb21waWxlcyBlYWNoIGZlYXR1cmUgdGhlIHdheSBldmVyeSBvdGhlciBidW5kbGVyIGFkYXB0ZXIgZG9lcy5cbiAqL1xuY29uc3QgeyBUcmFuc2Zvcm1lciB9ID0gcmVxdWlyZSgnQHBhcmNlbC9wbHVnaW4nKTtcblxuY29uc3QgRkVBVFVSRVNfTU9EVUxFX1VSTCA9ICR7SlNPTi5zdHJpbmdpZnkoZ2V0U2libGluZ01vZHVsZVVybCgnb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzJykpfTtcbmNvbnN0IFRSQU5TRk9STVNfTU9EVUxFX1VSTCA9ICR7SlNPTi5zdHJpbmdpZnkoZ2V0U2libGluZ01vZHVsZVVybCgnb2JzaWRpYW4tcGx1Z2luLXRyYW5zZm9ybXMnKSl9O1xuY29uc3QgRlJBTUVXT1JLID0gJHtKU09OLnN0cmluZ2lmeShmZWF0dXJlcy5mcmFtZXdvcmsgPz8gbnVsbCl9O1xuY29uc3QgU1RZTEVTID0gJHtKU09OLnN0cmluZ2lmeShmZWF0dXJlcy5zdHlsZXMgPz8ge30pfTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHJhbnNmb3JtZXIoe1xuICBhc3luYyB0cmFuc2Zvcm0oeyBhc3NldCwgb3B0aW9ucyB9KSB7XG4gICAgY29uc3QgeyBnZXRGZWF0dXJlRmlsZUtpbmQsIGdldEZyYW1ld29ya0RlZmluZXMsIGdldEpzeEltcG9ydFNvdXJjZSwgcmVwbGFjZURlZmluZXMgfSA9IGF3YWl0IGltcG9ydChGRUFUVVJFU19NT0RVTEVfVVJMKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1zID0gYXdhaXQgaW1wb3J0KFRSQU5TRk9STVNfTU9EVUxFX1VSTCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBhc3NldC5maWxlUGF0aDtcbiAgICBjb25zdCBpc1Byb2R1Y3Rpb25CdWlsZCA9IG9wdGlvbnMubW9kZSA9PT0gJ3Byb2R1Y3Rpb24nO1xuICAgIGNvbnN0IGRlZmluZXMgPSBnZXRGcmFtZXdvcmtEZWZpbmVzKHsgZnJhbWV3b3JrOiBGUkFNRVdPUksgPz8gdW5kZWZpbmVkLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KTtcbiAgICBzd2l0Y2ggKGdldEZlYXR1cmVGaWxlS2luZChmaWxlUGF0aCkpIHtcbiAgICAgIGNhc2UgJ2pzeCc6IHtcbiAgICAgICAgY29uc3QgY29kZSA9IGF3YWl0IGFzc2V0LmdldENvZGUoKTtcbiAgICAgICAgY29uc3QganN4SW1wb3J0U291cmNlID0gZ2V0SnN4SW1wb3J0U291cmNlKEZSQU1FV09SSyA/PyB1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBGUkFNRVdPUksgPT09ICdzb2xpZCdcbiAgICAgICAgICA/IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtU29saWQoeyBjb2RlLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQgfSlcbiAgICAgICAgICA6IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtSnN4KHsgY29kZSwgZmlsZVBhdGgsIGlzUHJvZHVjdGlvbkJ1aWxkLCBqc3hJbXBvcnRTb3VyY2UgfSk7XG4gICAgICAgIGFzc2V0LnNldENvZGUocmVwbGFjZURlZmluZXMocmVzdWx0LmNvZGUsIGRlZmluZXMpKTtcbiAgICAgICAgYXNzZXQudHlwZSA9ICdqcyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3R5bGVzaGVldCc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3Jtcy50cmFuc2Zvcm1Dc3MoeyBmaWxlUGF0aCwgaXNDc3NNb2R1bGVTY29wZWQ6IGZhbHNlLCBpc1Byb2R1Y3Rpb25CdWlsZCwgc291cmNlOiBhd2FpdCBhc3NldC5nZXRDb2RlKCksIHN0eWxlczogU1RZTEVTIH0pO1xuICAgICAgICBhc3NldC5zZXRDb2RlKHJlc3VsdC5jc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgcmVzdWx0LmRlcGVuZGVuY2llcykge1xuICAgICAgICAgIGFzc2V0LmludmFsaWRhdGVPbkZpbGVDaGFuZ2UoZGVwZW5kZW5jeSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdmVsdGUnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybXMudHJhbnNmb3JtU3ZlbHRlKHsgY29kZTogYXdhaXQgYXNzZXQuZ2V0Q29kZSgpLCBmaWxlUGF0aCwgaXNQcm9kdWN0aW9uQnVpbGQgfSk7XG4gICAgICAgIGFzc2V0LnNldENvZGUocmVwbGFjZURlZmluZXMocmVzdWx0LmNvZGUsIGRlZmluZXMpKTtcbiAgICAgICAgYXNzZXQudHlwZSA9ICdqcyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnd2FzbSc6XG4gICAgICAgIGFzc2V0LnNldENvZGUodHJhbnNmb3Jtcy5nZXRXYXNtTW9kdWxlQ29kZShhd2FpdCBhc3NldC5nZXRCdWZmZXIoKSkpO1xuICAgICAgICBhc3NldC50eXBlID0gJ2pzJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIEEgZnJhbWV3b3JrJ3MgcnVudGltZSByZWFkcyBwcm9jZXNzLmVudi5OT0RFX0VOViwgd2hpY2ggcGFyY2VsIGxlYXZlcyBhbG9uZSBpbiBhbiBlbGVjdHJvbi1yZW5kZXJlciBsaWJyYXJ5LlxuICAgICAgICBjb25zdCBjb2RlID0gYXdhaXQgYXNzZXQuZ2V0Q29kZSgpO1xuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHJlcGxhY2VEZWZpbmVzKGNvZGUsIGRlZmluZXMpO1xuICAgICAgICBpZiAocmVwbGFjZWQgIT09IGNvZGUpIHtcbiAgICAgICAgICBhc3NldC5zZXRDb2RlKHJlcGxhY2VkKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFthc3NldF07XG4gIH1cbn0pO1xuYCxcbiAgICAvLyBgU3RyaW5nLnJhd2AsIHNvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYmVsb3cgcmVhY2hlcyB0aGUgZmlsZSB3aXRoIGl0cyBiYWNrc2xhc2hlcyBpbnRhY3QuXG4gICAgW0lOTElORV9JTVBPUlRTX0ZJTEVfTkFNRV06IFN0cmluZy5yYXdgLypcbiAqIEdlbmVyYXRlZCBieSBAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQuIEtlZXBzIGV2ZXJ5IGR5bmFtaWMgaW1wb3J0KCkgaW5zaWRlIG1haW4uanMuXG4gKlxuICogT2JzaWRpYW4gbG9hZHMgYSBwbHVnaW4ncyBtYWluLmpzIGFuZCBub3RoaW5nIGJlc2lkZSBpdCwgYW5kIHBhcmNlbCBtYWtlcyBldmVyeSBpbXBvcnQoKSBhIGJ1bmRsZSBvZiBpdHNcbiAqIG93biB3aXRoIG5vIG9wdGlvbiB0byBpbmxpbmUgb25lLiBUaGlzIHJld3JpdGVzIGltcG9ydCgnPGxpdGVyYWw+JykgaW50byBhIHJlcXVpcmUoKSBpbnNpZGUgYW4gYXN5bmNcbiAqIGFycm93LCBiZWZvcmUgcGFyY2VsJ3Mgb3duIEphdmFTY3JpcHQgdHJhbnNmb3JtZXIgcnVuczogdGhlIG1vZHVsZSBzdGlsbCBldmFsdWF0ZXMgb25seSB3aGVuIHRoYXQgY29kZVxuICogcnVucywgYW5kIHRoZSBwcm9taXNlIHN0aWxsIHJlamVjdHMgd2hlbiBldmFsdWF0aW9uIHRocm93cy4gT25seSBhIHBsYWluIHN0cmluZyBzcGVjaWZpZXIgaXMgcmV3cml0dGVuLFxuICogc2luY2UgYSBjb21wdXRlZCBvbmUgY2Fubm90IGJlIGJ1bmRsZWQgYnkgYW55IGJ1bmRsZXIuXG4gKi9cbmNvbnN0IHsgVHJhbnNmb3JtZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IERZTkFNSUNfSU1QT1JUID0gL1xcYmltcG9ydFxcKFxccyooW1wiJ10pKFteXCInXFx4NjBcXG5cXFxcXSspXFwxXFxzKlxcKS9ndTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHJhbnNmb3JtZXIoe1xuICBhc3luYyB0cmFuc2Zvcm0oeyBhc3NldCB9KSB7XG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgYXNzZXQuZ2V0Q29kZSgpO1xuICAgIGlmIChzb3VyY2UuaW5jbHVkZXMoJ2ltcG9ydCgnKSkge1xuICAgICAgYXNzZXQuc2V0Q29kZShzb3VyY2UucmVwbGFjZShEWU5BTUlDX0lNUE9SVCwgKF9tYXRjaCwgcXVvdGUsIHNwZWNpZmllcikgPT4gJyhhc3luYyAoKSA9PiByZXF1aXJlKCcgKyBxdW90ZSArIHNwZWNpZmllciArIHF1b3RlICsgJykpKCknKSk7XG4gICAgfVxuICAgIHJldHVybiBbYXNzZXRdO1xuICB9XG59KTtcbmAsXG4gICAgW05BTUVSX0ZJTEVfTkFNRV06IGAvKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBPYnNpZGlhbiBsb2FkcyBhIHBsdWdpbidzIHN0eWxlc2hlZXQgZnJvbSBzdHlsZXMuY3NzIGFuZCBub3RoaW5nIGVsc2UuICovXG5jb25zdCB7IE5hbWVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBOYW1lcih7XG4gIG5hbWUoeyBidW5kbGUgfSkge1xuICAgIHJldHVybiBidW5kbGUudHlwZSA9PT0gJ2NzcycgPyAnJHtPYnNpZGlhblBsdWdpblJlcG9QYXRocy5TdHlsZXNDc3N9JyA6IG51bGw7XG4gIH1cbn0pO1xuYCxcbiAgICBbT1BUSU1JWkVSX0ZJTEVfTkFNRV06IGAvKlxuICogR2VuZXJhdGVkIGJ5IEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdC4gUnVucyBhZnRlciBwYXJjZWwncyBvd24gb3B0aW1pemVycywgb24gdGhlIEphdmFTY3JpcHQgYnVuZGxlLlxuICpcbiAqIE9ic2lkaWFuIGV2YWx1YXRlcyBtYWluLmpzIGFzIHRoZSBib2R5IG9mIGZ1bmN0aW9uIChyZXF1aXJlLCBtb2R1bGUsIGV4cG9ydHMpLCB3aXRoIGEgbW9kdWxlIG9iamVjdCB0aGF0XG4gKiBoYXMgbm8gcmVxdWlyZSBvZiBpdHMgb3duLCBhbmQgcGFyY2VsJ3MgcnVudGltZSByZWFjaGVzIGV2ZXJ5IGV4dGVybmFsIG1vZHVsZSB0aHJvdWdoIG1vZHVsZS5yZXF1aXJlLlxuICogV2l0aG91dCB0aGUgZmlyc3QgbGluZSBiZWxvdywgdGhlIHZlcnkgZmlyc3QgcmVxdWlyZSgnb2JzaWRpYW4nKSB0aHJvd3MgXCJDYW5ub3QgZmluZCBtb2R1bGVcIi4gVGhlIGJhbm5lclxuICogZ29lcyBpbiBoZXJlIHRvbywgYWZ0ZXIgbWluaWZpY2F0aW9uLCB3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3RyaXAgaXQgYXMgYW4gb3JkaW5hcnkgY29tbWVudC5cbiAqL1xuY29uc3QgeyBPcHRpbWl6ZXIgfSA9IHJlcXVpcmUoJ0BwYXJjZWwvcGx1Z2luJyk7XG5cbmNvbnN0IFBSRUFNQkxFID0gJHtKU09OLnN0cmluZ2lmeShgJHtnZXRPYnNpZGlhblBsdWdpbkJhbm5lcigncGFyY2VsJyl9aWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUucmVxdWlyZSAhPT0gJ2Z1bmN0aW9uJykgeyBtb2R1bGUucmVxdWlyZSA9IHJlcXVpcmU7IH1cXG5gKX07XG5jb25zdCBQUkVBTUJMRV9MSU5FX0NPVU5UID0gJHtTdHJpbmcoZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIoJ3BhcmNlbCcpLnNwbGl0KCdcXG4nKS5sZW5ndGgpfTtcblxuYXN5bmMgZnVuY3Rpb24gcmVhZENvbnRlbnRzKGNvbnRlbnRzKSB7XG4gIGlmICh0eXBlb2YgY29udGVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGNvbnRlbnRzO1xuICB9XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY29udGVudHMpKSB7XG4gICAgcmV0dXJuIGNvbnRlbnRzLnRvU3RyaW5nKCd1dGYtOCcpO1xuICB9XG4gIGNvbnN0IGNodW5rcyA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGNvbnRlbnRzKSB7XG4gICAgY2h1bmtzLnB1c2goQnVmZmVyLmZyb20oY2h1bmspKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKCd1dGYtOCcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBPcHRpbWl6ZXIoe1xuICBhc3luYyBvcHRpbWl6ZSh7IGNvbnRlbnRzLCBtYXAgfSkge1xuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCByZWFkQ29udGVudHMoY29udGVudHMpO1xuICAgIGlmIChtYXApIHtcbiAgICAgIG1hcC5vZmZzZXRMaW5lcygxLCBQUkVBTUJMRV9MSU5FX0NPVU5UKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudHM6IFBSRUFNQkxFICsgY29kZSwgbWFwIH07XG4gIH1cbn0pO1xuYCxcbiAgICBbUEFSQ0VMUkNdOiBgJHtKU09OLnN0cmluZ2lmeShwYXJjZWxyYywgbnVsbCwgSlNPTl9JTkRFTlQpfVxcbmAsXG4gICAgW1JFU09MVkVSX0ZJTEVfTkFNRV06IGAvKiBHZW5lcmF0ZWQgYnkgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0LiBMZWF2ZXMgdGhlIG1vZHVsZXMgT2JzaWRpYW4gc3VwcGxpZXMgYXQgcnVudGltZSB0byByZXF1aXJlKCkuICovXG5jb25zdCB7IFJlc29sdmVyIH0gPSByZXF1aXJlKCdAcGFyY2VsL3BsdWdpbicpO1xuXG5jb25zdCBFWFRFUk5BTFMgPSBuZXcgU2V0KCR7SlNPTi5zdHJpbmdpZnkoT0JTSURJQU5fUExVR0lOX0VYVEVSTkFMUyl9KTtcblxuZnVuY3Rpb24gZ2V0UGFja2FnZU5hbWUoc3BlY2lmaWVyKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gc3BlY2lmaWVyLnNwbGl0KCcvJyk7XG4gIHJldHVybiBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnQCcpID8gc2VnbWVudHMuc2xpY2UoMCwgMikuam9pbignLycpIDogc2VnbWVudHNbMF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFJlc29sdmVyKHtcbiAgcmVzb2x2ZSh7IHNwZWNpZmllciB9KSB7XG4gICAgY29uc3QgaXNFeHRlcm5hbCA9IHNwZWNpZmllci5zdGFydHNXaXRoKCdub2RlOicpIHx8IEVYVEVSTkFMUy5oYXMoc3BlY2lmaWVyKSB8fCBFWFRFUk5BTFMuaGFzKGdldFBhY2thZ2VOYW1lKHNwZWNpZmllcikpO1xuICAgIHJldHVybiBpc0V4dGVybmFsID8geyBpc0V4Y2x1ZGVkOiB0cnVlIH0gOiBudWxsO1xuICB9XG59KTtcbmBcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIG9wdGlvbnMgaGFuZGVkIHRvIHBhcmNlbCdzIGBQYXJjZWxgIGNsYXNzLlxuICpcbiAqIFRoZSBvbmUgdGFyZ2V0IGlzIGBlbGVjdHJvbi1yZW5kZXJlcmAsIHdoZXJlIE9ic2lkaWFuIHJ1bnMgYSBwbHVnaW4sIGFuZCBDb21tb25KUy4gUGFyY2VsIGNvdW50cyB0aGF0XG4gKiBjb250ZXh0IGFzIGJvdGggYSBicm93c2VyIGFuZCBhIG5vZGUgb25lLCBhbmQgZWFjaCBoYWxmIG1hdHRlcnM6IG5vZGUga2VlcHMgdGhlIGJ1aWx0aW5zIGV4dGVybmFsLCBhbmRcbiAqIGJyb3dzZXIgcmVzb2x2ZXMgdGhlIGBicm93c2VyYCBleHBvcnQgY29uZGl0aW9uLiBgaW5jbHVkZU5vZGVNb2R1bGVzYCBidW5kbGVzIHRoZSBkZXBlbmRlbmNpZXMsIHdoaWNoIGFcbiAqIG5vZGUtZmxhdm91cmVkIGNvbnRleHQgd291bGQgb3RoZXJ3aXNlIGxlYXZlIGFzIGByZXF1aXJlKClgIGNhbGxzIG5vdGhpbmcgaW5zdGFsbHMgYmVzaWRlIGEgcGx1Z2luLCBhbmRcbiAqIGBpc0xpYnJhcnlgIGtlZXBzIHRoZSBlbnRyeSdzIGRlZmF1bHQgZXhwb3J0LCB3aGljaCBpcyBob3cgT2JzaWRpYW4gZmluZHMgdGhlIHBsdWdpbiBjbGFzcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBHZXRQYXJjZWxPcHRpb25zUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwYXJjZWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmNlbE9wdGlvbnMocGFyYW1zOiBHZXRQYXJjZWxPcHRpb25zUGFyYW1zKTogSW5pdGlhbFBhcmNlbE9wdGlvbnMge1xuICBjb25zdCB7IGJ1aWxkQ29udGV4dCwgY2FjaGVGb2xkZXIsIGNvbmZpZ1BhdGggfSA9IHBhcmFtcztcbiAgY29uc3QgdGFyZ2V0OiBUYXJnZXREZXNjcmlwdG9yID0ge1xuICAgIGNvbnRleHQ6ICdlbGVjdHJvbi1yZW5kZXJlcicsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGRpc3REaXJgIGlzIHRoZSBuYW1lIHBhcmNlbCdzIEFQSSByZWFkcy5cbiAgICBkaXN0RGlyOiBidWlsZENvbnRleHQuZGlzdEZvbGRlcixcbiAgICBpbmNsdWRlTm9kZU1vZHVsZXM6IHRydWUsXG4gICAgaXNMaWJyYXJ5OiB0cnVlLFxuICAgIG9wdGltaXplOiBidWlsZENvbnRleHQuaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgb3V0cHV0Rm9ybWF0OiAnY29tbW9uanMnLFxuICAgIHNvdXJjZU1hcDogIWJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCAmJiB7IGlubGluZTogdHJ1ZSB9XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgY2FjaGVEaXJgIGlzIHRoZSBuYW1lIHBhcmNlbCdzIEFQSSByZWFkcy5cbiAgICBjYWNoZURpcjogY2FjaGVGb2xkZXIsXG4gICAgY29uZmlnOiBjb25maWdQYXRoLFxuICAgIGRlZmF1bHRUYXJnZXRPcHRpb25zOiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgZGlzdERpcmAgaXMgdGhlIG5hbWUgcGFyY2VsJ3MgQVBJIHJlYWRzLlxuICAgICAgZGlzdERpcjogYnVpbGRDb250ZXh0LmRpc3RGb2xkZXIsXG4gICAgICBzaG91bGRPcHRpbWl6ZTogYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgICAgc291cmNlTWFwczogIWJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZFxuICAgIH0sXG4gICAgZW50cmllczogYnVpbGRDb250ZXh0LmVudHJ5UG9pbnQsXG4gICAgbW9kZTogYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkID8gJ3Byb2R1Y3Rpb24nIDogJ2RldmVsb3BtZW50JyxcbiAgICB0YXJnZXRzOiB7IG9ic2lkaWFuUGx1Z2luOiB0YXJnZXQgfVxuICB9O1xufVxuLyogdjggaWdub3JlIHN0YXJ0IC0tIFBhcnQgb2YgdGhlIHBhcmNlbCBidWlsZCBhYm92ZS4gKi9cbmZ1bmN0aW9uIGZvcm1hdFBhcmNlbEVycm9yKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgY29uc3QgZGlhZ25vc3RpY3MgPSAoZXJyb3IgYXMgUGFyY2VsRXJyb3JMaWtlIHwgdW5kZWZpbmVkKT8uZGlhZ25vc3RpY3M7XG4gIGlmIChkaWFnbm9zdGljcyAmJiBkaWFnbm9zdGljcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGRpYWdub3N0aWNzLm1hcCgoZGlhZ25vc3RpYykgPT4gZGlhZ25vc3RpYy5tZXNzYWdlKS5qb2luKCdcXG4nKTtcbiAgfVxuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrID8/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgVVJMIG9mIGEgbW9kdWxlIG9mIHRoaXMgZm9sZGVyLCBpbiB0aGUgc2FtZSBmb3JtIGFzIHRoaXMgb25lIChgLnRzYCBmcm9tIHNvdXJjZSwgYC5tanNgIG9yIGAuY2pzYCBvbmNlXG4gKiBidWlsdCksIHdoaWNoIHRoZSBnZW5lcmF0ZWQgdHJhbnNmb3JtZXIgaW1wb3J0cy5cbiAqXG4gKiBAcGFyYW0gYmFzZU5hbWUgLSBUaGUgbW9kdWxlJ3MgZmlsZSBuYW1lIHdpdGhvdXQgaXRzIGV4dGVuc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBtb2R1bGUncyBgZmlsZTpgIFVSTC5cbiAqL1xuZnVuY3Rpb24gZ2V0U2libGluZ01vZHVsZVVybChiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5ldyBVUkwoYCR7YmFzZU5hbWV9JHtleHRuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSl9YCwgaW1wb3J0Lm1ldGEudXJsKS5ocmVmO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVXYXRjaEV2ZW50KGV2ZW50OiBCdWlsZEV2ZW50IHwgdW5kZWZpbmVkLCBidWlsZENvbnRleHQ6IE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0KTogdm9pZCB7XG4gIGlmIChldmVudD8udHlwZSA9PT0gJ2J1aWxkRmFpbHVyZScpIHtcbiAgICBjb25zb2xlLmVycm9yKGV2ZW50LmRpYWdub3N0aWNzLm1hcCgoZGlhZ25vc3RpYykgPT4gZGlhZ25vc3RpYy5tZXNzYWdlKS5qb2luKCdcXG4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChldmVudD8udHlwZSAhPT0gJ2J1aWxkU3VjY2VzcycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zb2xlLndhcm4oYFJlYnVpbHQgd2l0aCBwYXJjZWwgaW4gJHtTdHJpbmcoZXZlbnQuYnVpbGRUaW1lKX0gbXMuYCk7XG4gIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IGRlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyKGJ1aWxkQ29udGV4dCkpO1xufVxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtQ0EsdUJBQThCO0FBQzlCLHFCQUErQjtBQUMvQixtQkFBa0M7QUFDbEMsa0JBS087QUFDUCxx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
@@ -0,0 +1,128 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Builds an Obsidian plugin with parcel: `build()` and `dev()`, the same two entry points the esbuild
6
+ * builder has, producing the same `main.js` + `styles.css` + `manifest.json` layout.
7
+ *
8
+ * Parcel takes no `external` list and no output file name, only plugins named in a `.parcelrc`. So the
9
+ * build writes a `.parcelrc` of its own into `.parcel-cache`, beside a resolver that leaves
10
+ * Obsidian's modules external, a namer that names the stylesheet `styles.css` and a transformer that keeps
11
+ * dynamic imports inside `main.js`, and extends the
12
+ * consumer's own `.parcelrc` when there is one (or `@parcel/config-default` when there is none), so every
13
+ * transformer the consumer configured still applies.
14
+ *
15
+ * `@parcel/core`, `@parcel/plugin` and `@parcel/config-default` are optional peer dependencies, loaded
16
+ * only when a parcel build runs, so a plugin built with esbuild installs nothing extra.
17
+ */
18
+ import type { InitialParcelOptions } from '@parcel/types' with { 'resolution-mode': 'import' };
19
+ import { CliTaskResult } from '@mnaoumov/typescript-dev-toolkit/cli-utils';
20
+ import type { ObsidianPluginBuildContext, ObsidianPluginDeploymentOptions } from './obsidian-plugin-build.cjs';
21
+ import type { ObsidianPluginFeatureOptions } from './obsidian-plugin-features.cjs';
22
+ import { BuildMode } from './obsidian-plugin-build.cjs';
23
+ /**
24
+ * Options for {@link buildObsidianPluginWithParcel}.
25
+ */
26
+ export interface BuildObsidianPluginWithParcelParams extends BuildOptions {
27
+ /**
28
+ * A build mode, either `Development` or `Production`.
29
+ */
30
+ readonly mode: BuildMode;
31
+ }
32
+ /**
33
+ * Options for {@link build} and {@link dev}.
34
+ */
35
+ export interface BuildOptions extends ObsidianPluginDeploymentOptions, ObsidianPluginFeatureOptions {
36
+ /**
37
+ * Customizes the options handed to parcel's `Parcel` class.
38
+ */
39
+ readonly customizeParcelOptions?: (options: InitialParcelOptions) => InitialParcelOptions;
40
+ }
41
+ /**
42
+ * Parameters for {@link getParcelConfigFiles}.
43
+ */
44
+ export interface GetParcelConfigFilesParams {
45
+ /**
46
+ * The consumer's own `.parcelrc`, relative to the generated configuration's folder, or `undefined` when the project
47
+ * has none.
48
+ */
49
+ readonly consumerParcelrcPath: string | undefined;
50
+ /**
51
+ * The build features.
52
+ */
53
+ readonly features?: ObsidianPluginFeatureOptions;
54
+ }
55
+ /**
56
+ * Parameters for {@link getParcelOptions}.
57
+ */
58
+ export interface GetParcelOptionsParams {
59
+ /**
60
+ * The build context.
61
+ */
62
+ readonly buildContext: ObsidianPluginBuildContext;
63
+ /**
64
+ * Parcel's cache folder. Named explicitly because parcel otherwise takes the folder of the nearest
65
+ * lockfile for the project root, which in a workspace is not the plugin's.
66
+ */
67
+ readonly cacheFolder: string;
68
+ /**
69
+ * The generated `.parcelrc`.
70
+ */
71
+ readonly configPath: string;
72
+ }
73
+ /**
74
+ * The files of the generated parcel configuration, by file name.
75
+ */
76
+ export type ParcelConfigFiles = Readonly<Record<string, string>>;
77
+ /**
78
+ * Builds the Obsidian plugin in production mode using parcel.
79
+ *
80
+ * @param options - Optional build options.
81
+ * @returns A {@link Promise} that resolves when the build is complete.
82
+ */
83
+ export declare function build(options?: BuildOptions): Promise<void>;
84
+ /**
85
+ * Builds the Obsidian plugin with parcel, once for a production build, or watching for a development one.
86
+ *
87
+ * Runs the project's `build:compile` script first when it has one, as the esbuild builder does, since
88
+ * parcel strips TypeScript types without checking them.
89
+ *
90
+ * @param params - The {@link BuildObsidianPluginWithParcelParams}.
91
+ * @returns A {@link Promise} that resolves to a {@link CliTaskResult} indicating the success or failure of the build.
92
+ */
93
+ export declare function buildObsidianPluginWithParcel(params: BuildObsidianPluginWithParcelParams): Promise<CliTaskResult>;
94
+ /**
95
+ * Builds the Obsidian plugin in development mode using parcel, watching for changes and deploying every
96
+ * successful rebuild into the vault.
97
+ *
98
+ * @param options - Optional build options.
99
+ * @returns A {@link Promise} that resolves to a {@link CliTaskResult} indicating the build result.
100
+ */
101
+ export declare function dev(options?: BuildOptions): Promise<CliTaskResult>;
102
+ /**
103
+ * Generates the files of the parcel configuration the build runs with.
104
+ *
105
+ * The build features add pipelines that run the toolkit's shared transforms, through one generated transformer that
106
+ * loads them from the toolkit: Solid's `.jsx` / `.tsx`, Svelte's `.svelte` / `.svelte.ts` / `.svelte.js`, `.wasm`,
107
+ * and with `styles.postcss` or `styles.tailwind` every stylesheet, in place of parcel's own PostCSS step. React and
108
+ * Preact JSX is compiled here too, since parcel reads the JSX runtime from a tsconfig without following its `extends`,
109
+ * and with any framework every script has the framework's compile-time constants replaced. Parcel compiles Vue with
110
+ * `@parcel/transformer-vue` and scopes `*.module.css` itself, so those need no pipeline here.
111
+ *
112
+ * @param params - The {@link GetParcelConfigFilesParams}.
113
+ * @returns The files, by file name.
114
+ */
115
+ export declare function getParcelConfigFiles(params: GetParcelConfigFilesParams): ParcelConfigFiles;
116
+ /**
117
+ * Builds the options handed to parcel's `Parcel` class.
118
+ *
119
+ * The one target is `electron-renderer`, where Obsidian runs a plugin, and CommonJS. Parcel counts that
120
+ * context as both a browser and a node one, and each half matters: node keeps the builtins external, and
121
+ * browser resolves the `browser` export condition. `includeNodeModules` bundles the dependencies, which a
122
+ * node-flavoured context would otherwise leave as `require()` calls nothing installs beside a plugin, and
123
+ * `isLibrary` keeps the entry's default export, which is how Obsidian finds the plugin class.
124
+ *
125
+ * @param params - The {@link GetParcelOptionsParams}.
126
+ * @returns The parcel options.
127
+ */
128
+ export declare function getParcelOptions(params: GetParcelOptionsParams): InitialParcelOptions;