@mnaoumov/obsidian-dev-toolkit 2.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +5 -1
  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/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +3 -188
  18. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +2 -18
  19. package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.cjs +173 -0
  20. package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.d.cts +60 -0
  21. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +4 -1
  22. package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +1 -0
  23. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +30 -82
  24. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +7 -24
  25. package/dist/lib/cjs/bundlers/index.cjs +39 -3
  26. package/dist/lib/cjs/bundlers/index.d.cts +12 -0
  27. package/dist/lib/cjs/bundlers/obsidian-cli-reload.cjs +182 -0
  28. package/dist/lib/cjs/bundlers/obsidian-cli-reload.d.cts +37 -0
  29. package/dist/lib/cjs/bundlers/obsidian-plugin-build.cjs +278 -0
  30. package/dist/lib/cjs/bundlers/obsidian-plugin-build.d.cts +217 -0
  31. package/dist/lib/cjs/bundlers/obsidian-plugin-features.cjs +242 -0
  32. package/dist/lib/cjs/bundlers/obsidian-plugin-features.d.cts +186 -0
  33. package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.cjs +306 -0
  34. package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.d.cts +231 -0
  35. package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.cjs +182 -0
  36. package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.d.cts +47 -0
  37. package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.cjs +320 -0
  38. package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.d.cts +44 -0
  39. package/dist/lib/cjs/bundlers/parcel.cjs +462 -0
  40. package/dist/lib/cjs/bundlers/parcel.d.cts +128 -0
  41. package/dist/lib/cjs/bundlers/rollup-compatible-features.cjs +181 -0
  42. package/dist/lib/cjs/bundlers/rollup-compatible-features.d.cts +128 -0
  43. package/dist/lib/cjs/bundlers/rollup-compatible.cjs +138 -0
  44. package/dist/lib/cjs/bundlers/rollup-compatible.d.cts +84 -0
  45. package/dist/lib/cjs/bundlers/rollup.cjs +218 -0
  46. package/dist/lib/cjs/bundlers/rollup.d.cts +99 -0
  47. package/dist/lib/cjs/bundlers/vite.cjs +229 -0
  48. package/dist/lib/cjs/bundlers/vite.d.cts +105 -0
  49. package/dist/lib/cjs/bundlers/webpack.cjs +354 -0
  50. package/dist/lib/cjs/bundlers/webpack.d.cts +133 -0
  51. package/dist/lib/cjs/demo-vault-cli.cjs +131 -0
  52. package/dist/lib/cjs/demo-vault-cli.d.cts +15 -0
  53. package/dist/lib/cjs/index.cjs +4 -1
  54. package/dist/lib/cjs/index.d.cts +1 -0
  55. package/dist/lib/cjs/test-runners/coverage-badge-cli.cjs +160 -0
  56. package/dist/lib/cjs/test-runners/coverage-badge-cli.d.cts +25 -0
  57. package/dist/lib/cjs/test-runners/coverage-badge.cjs +279 -0
  58. package/dist/lib/cjs/test-runners/coverage-badge.d.cts +143 -0
  59. package/dist/lib/cjs/test-runners/e2e-runner-support.cjs +170 -0
  60. package/dist/lib/cjs/test-runners/e2e-runner-support.d.cts +36 -0
  61. package/dist/lib/cjs/test-runners/index.cjs +18 -3
  62. package/dist/lib/cjs/test-runners/index.d.cts +5 -0
  63. package/dist/lib/cjs/test-runners/obsidian-test-runner.cjs +147 -0
  64. package/dist/lib/cjs/test-runners/obsidian-test-runner.d.cts +42 -0
  65. package/dist/lib/cjs/test-runners/wdio-obsidian.cjs +205 -0
  66. package/dist/lib/cjs/test-runners/wdio-obsidian.d.cts +199 -0
  67. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +2 -18
  68. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +3 -192
  69. package/dist/lib/esm/bundlers/esbuild-impl/feature-options.d.mts +60 -0
  70. package/dist/lib/esm/bundlers/esbuild-impl/feature-options.mjs +82 -0
  71. package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +1 -0
  72. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +3 -1
  73. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +7 -24
  74. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +41 -87
  75. package/dist/lib/esm/bundlers/index.d.mts +12 -0
  76. package/dist/lib/esm/bundlers/index.mjs +26 -2
  77. package/dist/lib/esm/bundlers/obsidian-cli-reload.d.mts +37 -0
  78. package/dist/lib/esm/bundlers/obsidian-cli-reload.mjs +83 -0
  79. package/dist/lib/esm/bundlers/obsidian-plugin-build.d.mts +217 -0
  80. package/dist/lib/esm/bundlers/obsidian-plugin-build.mjs +166 -0
  81. package/dist/lib/esm/bundlers/obsidian-plugin-features.d.mts +186 -0
  82. package/dist/lib/esm/bundlers/obsidian-plugin-features.mjs +126 -0
  83. package/dist/lib/esm/bundlers/obsidian-plugin-transforms.d.mts +231 -0
  84. package/dist/lib/esm/bundlers/obsidian-plugin-transforms.mjs +194 -0
  85. package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.d.mts +47 -0
  86. package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.mjs +89 -0
  87. package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.d.mts +44 -0
  88. package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.mjs +228 -0
  89. package/dist/lib/esm/bundlers/parcel.d.mts +128 -0
  90. package/dist/lib/esm/bundlers/parcel.mjs +361 -0
  91. package/dist/lib/esm/bundlers/rollup-compatible-features.d.mts +128 -0
  92. package/dist/lib/esm/bundlers/rollup-compatible-features.mjs +93 -0
  93. package/dist/lib/esm/bundlers/rollup-compatible.d.mts +84 -0
  94. package/dist/lib/esm/bundlers/rollup-compatible.mjs +43 -0
  95. package/dist/lib/esm/bundlers/rollup.d.mts +99 -0
  96. package/dist/lib/esm/bundlers/rollup.mjs +130 -0
  97. package/dist/lib/esm/bundlers/vite.d.mts +105 -0
  98. package/dist/lib/esm/bundlers/vite.mjs +144 -0
  99. package/dist/lib/esm/bundlers/webpack.d.mts +133 -0
  100. package/dist/lib/esm/bundlers/webpack.mjs +259 -0
  101. package/dist/lib/esm/demo-vault-cli.d.mts +15 -0
  102. package/dist/lib/esm/demo-vault-cli.mjs +23 -0
  103. package/dist/lib/esm/index.d.mts +1 -0
  104. package/dist/lib/esm/index.mjs +3 -1
  105. package/dist/lib/esm/test-runners/coverage-badge-cli.d.mts +25 -0
  106. package/dist/lib/esm/test-runners/coverage-badge-cli.mjs +51 -0
  107. package/dist/lib/esm/test-runners/coverage-badge.d.mts +143 -0
  108. package/dist/lib/esm/test-runners/coverage-badge.mjs +181 -0
  109. package/dist/lib/esm/test-runners/e2e-runner-support.d.mts +36 -0
  110. package/dist/lib/esm/test-runners/e2e-runner-support.mjs +61 -0
  111. package/dist/lib/esm/test-runners/index.d.mts +5 -0
  112. package/dist/lib/esm/test-runners/index.mjs +12 -2
  113. package/dist/lib/esm/test-runners/obsidian-test-runner.d.mts +42 -0
  114. package/dist/lib/esm/test-runners/obsidian-test-runner.mjs +52 -0
  115. package/dist/lib/esm/test-runners/wdio-obsidian.d.mts +199 -0
  116. package/dist/lib/esm/test-runners/wdio-obsidian.mjs +110 -0
  117. package/package.json +102 -4
  118. package/test-runners/coverage-badge/package.json +6 -0
  119. package/test-runners/coverage-badge-cli/package.json +6 -0
  120. package/test-runners/e2e-runner-support/package.json +6 -0
  121. package/test-runners/obsidian-test-runner/package.json +6 -0
  122. package/test-runners/wdio-obsidian/package.json +6 -0
  123. package/tsconfig/preact.json +7 -0
  124. package/tsconfig/react.json +7 -0
  125. package/tsconfig/solid.json +7 -0
  126. package/tsconfig/svelte.json +7 -0
  127. package/tsconfig/vue.json +7 -0
  128. package/types/styles.d.ts +32 -0
  129. package/types/wasm.d.ts +11 -0
@@ -0,0 +1,47 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /// <reference types="node" />
3
+ /**
4
+ * @file
5
+ *
6
+ * The webpack loader the webpack adapter adds for the build features: it runs one of the shared transforms (Solid,
7
+ * Svelte, a stylesheet's PostCSS and Tailwind, a WebAssembly module's bytes) on the module it is given. The adapter
8
+ * names it by path in the rules it adds, so a project never names it.
9
+ *
10
+ * Erasable TypeScript only (no enums, no parameter properties), so webpack can load it straight from source when the
11
+ * toolkit runs from source.
12
+ */
13
+ import type { LoaderContext } from 'webpack';
14
+ import type { FeatureFileKind, ObsidianPluginStylesOptions } from './obsidian-plugin-features.mjs';
15
+ /**
16
+ * Which transform the loader runs: one of the shared transforms, or `typescript`, which strips the types of a Vue
17
+ * component's `<script lang="ts">` block after `unplugin-vue` extracted it.
18
+ */
19
+ export type ObsidianPluginWebpackLoaderKind = 'typescript' | FeatureFileKind;
20
+ /**
21
+ * The options the webpack adapter gives the loader.
22
+ */
23
+ export interface ObsidianPluginWebpackLoaderOptions {
24
+ /**
25
+ * Whether this is a production build.
26
+ */
27
+ readonly isProductionBuild: boolean;
28
+ /**
29
+ * Which transform the loader runs.
30
+ */
31
+ readonly kind: ObsidianPluginWebpackLoaderKind;
32
+ /**
33
+ * The stylesheet options, for a `stylesheet` loader.
34
+ */
35
+ readonly styles?: ObsidianPluginStylesOptions;
36
+ }
37
+ /**
38
+ * Tells webpack to hand the loader the module's bytes, which a WebAssembly module needs.
39
+ */
40
+ export declare const raw = true;
41
+ /**
42
+ * Runs the shared transform the loader's options name on one module.
43
+ *
44
+ * @param this - The webpack loader context.
45
+ * @param source - The module's bytes.
46
+ */
47
+ export default function obsidianPluginWebpackLoader(this: LoaderContext<ObsidianPluginWebpackLoaderOptions>, source: Buffer): void;
@@ -0,0 +1,89 @@
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 { invokeAsyncSafely } from "@mnaoumov/typescript-lib/async";
34
+ import { transform as esbuildTransform } from "esbuild";
35
+ import {
36
+ getWasmModuleCode,
37
+ transformCss,
38
+ transformSolid,
39
+ transformSvelte
40
+ } from "./obsidian-plugin-transforms.mjs";
41
+ const raw = true;
42
+ function obsidianPluginWebpackLoader(source) {
43
+ const callback = this.async();
44
+ invokeAsyncSafely(async () => {
45
+ let result;
46
+ try {
47
+ result = await transformModule(this, source);
48
+ } catch (error) {
49
+ callback(error);
50
+ return;
51
+ }
52
+ callback(null, result.code, result.map && JSON.stringify(result.map));
53
+ });
54
+ }
55
+ async function transformModule(context, source) {
56
+ const { isProductionBuild, kind, styles } = context.getOptions();
57
+ const filePath = context.resourcePath;
58
+ const code = source.toString("utf-8");
59
+ switch (kind) {
60
+ case "jsx": {
61
+ return await transformSolid({ code, filePath, isProductionBuild });
62
+ }
63
+ case "stylesheet": {
64
+ const result = await transformCss({ filePath, isCssModuleScoped: false, isProductionBuild, source: code, styles: styles ?? {} });
65
+ for (const dependency of result.dependencies) {
66
+ context.addDependency(dependency);
67
+ }
68
+ return { code: result.css };
69
+ }
70
+ case "svelte": {
71
+ return await transformSvelte({ code, filePath, isProductionBuild });
72
+ }
73
+ case "typescript": {
74
+ const result = await esbuildTransform(code, { loader: "ts", sourcefile: filePath, sourcemap: "external" });
75
+ return { code: result.code, map: JSON.parse(result.map) };
76
+ }
77
+ case "wasm": {
78
+ return { code: getWasmModuleCode(source) };
79
+ }
80
+ default: {
81
+ throw new Error(`Unknown loader kind: ${String(kind)}`);
82
+ }
83
+ }
84
+ }
85
+ export {
86
+ obsidianPluginWebpackLoader as default,
87
+ raw
88
+ };
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9vYnNpZGlhbi1wbHVnaW4td2VicGFjay1sb2FkZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSB3ZWJwYWNrIGxvYWRlciB0aGUgd2VicGFjayBhZGFwdGVyIGFkZHMgZm9yIHRoZSBidWlsZCBmZWF0dXJlczogaXQgcnVucyBvbmUgb2YgdGhlIHNoYXJlZCB0cmFuc2Zvcm1zIChTb2xpZCxcbiAqIFN2ZWx0ZSwgYSBzdHlsZXNoZWV0J3MgUG9zdENTUyBhbmQgVGFpbHdpbmQsIGEgV2ViQXNzZW1ibHkgbW9kdWxlJ3MgYnl0ZXMpIG9uIHRoZSBtb2R1bGUgaXQgaXMgZ2l2ZW4uIFRoZSBhZGFwdGVyXG4gKiBuYW1lcyBpdCBieSBwYXRoIGluIHRoZSBydWxlcyBpdCBhZGRzLCBzbyBhIHByb2plY3QgbmV2ZXIgbmFtZXMgaXQuXG4gKlxuICogRXJhc2FibGUgVHlwZVNjcmlwdCBvbmx5IChubyBlbnVtcywgbm8gcGFyYW1ldGVyIHByb3BlcnRpZXMpLCBzbyB3ZWJwYWNrIGNhbiBsb2FkIGl0IHN0cmFpZ2h0IGZyb20gc291cmNlIHdoZW4gdGhlXG4gKiB0b29sa2l0IHJ1bnMgZnJvbSBzb3VyY2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBMb2FkZXJDb250ZXh0IH0gZnJvbSAnd2VicGFjayc7XG5cbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IHRyYW5zZm9ybSBhcyBlc2J1aWxkVHJhbnNmb3JtIH0gZnJvbSAnZXNidWlsZCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgRmVhdHVyZUZpbGVLaW5kLFxuICBPYnNpZGlhblBsdWdpblN0eWxlc09wdGlvbnNcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTb3VyY2VNYXBMaWtlIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5cbmltcG9ydCB7XG4gIGdldFdhc21Nb2R1bGVDb2RlLFxuICB0cmFuc2Zvcm1Dc3MsXG4gIHRyYW5zZm9ybVNvbGlkLFxuICB0cmFuc2Zvcm1TdmVsdGVcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5cbi8qKlxuICogV2hpY2ggdHJhbnNmb3JtIHRoZSBsb2FkZXIgcnVuczogb25lIG9mIHRoZSBzaGFyZWQgdHJhbnNmb3Jtcywgb3IgYHR5cGVzY3JpcHRgLCB3aGljaCBzdHJpcHMgdGhlIHR5cGVzIG9mIGEgVnVlXG4gKiBjb21wb25lbnQncyBgPHNjcmlwdCBsYW5nPVwidHNcIj5gIGJsb2NrIGFmdGVyIGB1bnBsdWdpbi12dWVgIGV4dHJhY3RlZCBpdC5cbiAqL1xuZXhwb3J0IHR5cGUgT2JzaWRpYW5QbHVnaW5XZWJwYWNrTG9hZGVyS2luZCA9ICd0eXBlc2NyaXB0JyB8IEZlYXR1cmVGaWxlS2luZDtcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyB0aGUgd2VicGFjayBhZGFwdGVyIGdpdmVzIHRoZSBsb2FkZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5QbHVnaW5XZWJwYWNrTG9hZGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcm9kdWN0aW9uQnVpbGQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoaWNoIHRyYW5zZm9ybSB0aGUgbG9hZGVyIHJ1bnMuXG4gICAqL1xuICByZWFkb25seSBraW5kOiBPYnNpZGlhblBsdWdpbldlYnBhY2tMb2FkZXJLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgc3R5bGVzaGVldCBvcHRpb25zLCBmb3IgYSBgc3R5bGVzaGVldGAgbG9hZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3R5bGVzPzogT2JzaWRpYW5QbHVnaW5TdHlsZXNPcHRpb25zO1xufVxuXG5pbnRlcmZhY2UgTG9hZGVyUmVzdWx0IHtcbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICByZWFkb25seSBtYXA/OiBTb3VyY2VNYXBMaWtlIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRlbGxzIHdlYnBhY2sgdG8gaGFuZCB0aGUgbG9hZGVyIHRoZSBtb2R1bGUncyBieXRlcywgd2hpY2ggYSBXZWJBc3NlbWJseSBtb2R1bGUgbmVlZHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtYm9vbGVhbi1uYW1lIC0tIGByYXdgIGlzIHRoZSBuYW1lIHdlYnBhY2sgcmVhZHMuXG5leHBvcnQgY29uc3QgcmF3ID0gdHJ1ZTtcblxuLyoqXG4gKiBSdW5zIHRoZSBzaGFyZWQgdHJhbnNmb3JtIHRoZSBsb2FkZXIncyBvcHRpb25zIG5hbWUgb24gb25lIG1vZHVsZS5cbiAqXG4gKiBAcGFyYW0gdGhpcyAtIFRoZSB3ZWJwYWNrIGxvYWRlciBjb250ZXh0LlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBtb2R1bGUncyBieXRlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLWRlZmF1bHQtZXhwb3J0IC0tIFdlYnBhY2sgdGFrZXMgYSBsb2FkZXIgZnJvbSBpdHMgbW9kdWxlJ3MgZGVmYXVsdCBleHBvcnQuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvYnNpZGlhblBsdWdpbldlYnBhY2tMb2FkZXIodGhpczogTG9hZGVyQ29udGV4dDxPYnNpZGlhblBsdWdpbldlYnBhY2tMb2FkZXJPcHRpb25zPiwgc291cmNlOiBCdWZmZXIpOiB2b2lkIHtcbiAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmFzeW5jKCk7XG4gIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICBsZXQgcmVzdWx0OiBMb2FkZXJSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybU1vZHVsZSh0aGlzLCBzb3VyY2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYWxsYmFjayhlcnJvciBhcyBFcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdC5jb2RlLCByZXN1bHQubWFwICYmIEpTT04uc3RyaW5naWZ5KHJlc3VsdC5tYXApKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybU1vZHVsZShjb250ZXh0OiBMb2FkZXJDb250ZXh0PE9ic2lkaWFuUGx1Z2luV2VicGFja0xvYWRlck9wdGlvbnM+LCBzb3VyY2U6IEJ1ZmZlcik6IFByb21pc2U8TG9hZGVyUmVzdWx0PiB7XG4gIGNvbnN0IHsgaXNQcm9kdWN0aW9uQnVpbGQsIGtpbmQsIHN0eWxlcyB9ID0gY29udGV4dC5nZXRPcHRpb25zKCk7XG4gIGNvbnN0IGZpbGVQYXRoID0gY29udGV4dC5yZXNvdXJjZVBhdGg7XG4gIGNvbnN0IGNvZGUgPSBzb3VyY2UudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ2pzeCc6IHtcbiAgICAgIHJldHVybiBhd2FpdCB0cmFuc2Zvcm1Tb2xpZCh7IGNvZGUsIGZpbGVQYXRoLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KTtcbiAgICB9XG4gICAgY2FzZSAnc3R5bGVzaGVldCc6IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybUNzcyh7IGZpbGVQYXRoLCBpc0Nzc01vZHVsZVNjb3BlZDogZmFsc2UsIGlzUHJvZHVjdGlvbkJ1aWxkLCBzb3VyY2U6IGNvZGUsIHN0eWxlczogc3R5bGVzID8/IHt9IH0pO1xuICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHJlc3VsdC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgY29udGV4dC5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY29kZTogcmVzdWx0LmNzcyB9O1xuICAgIH1cbiAgICBjYXNlICdzdmVsdGUnOiB7XG4gICAgICByZXR1cm4gYXdhaXQgdHJhbnNmb3JtU3ZlbHRlKHsgY29kZSwgZmlsZVBhdGgsIGlzUHJvZHVjdGlvbkJ1aWxkIH0pO1xuICAgIH1cbiAgICBjYXNlICd0eXBlc2NyaXB0Jzoge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXNidWlsZFRyYW5zZm9ybShjb2RlLCB7IGxvYWRlcjogJ3RzJywgc291cmNlZmlsZTogZmlsZVBhdGgsIHNvdXJjZW1hcDogJ2V4dGVybmFsJyB9KTtcbiAgICAgIHJldHVybiB7IGNvZGU6IHJlc3VsdC5jb2RlLCBtYXA6IEpTT04ucGFyc2UocmVzdWx0Lm1hcCkgYXMgU291cmNlTWFwTGlrZSB9O1xuICAgIH1cbiAgICBjYXNlICd3YXNtJzoge1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0V2FzbU1vZHVsZUNvZGUoc291cmNlKSB9O1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbG9hZGVyIGtpbmQ6ICR7U3RyaW5nKGtpbmQpfWApO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWFBLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsYUFBYSx3QkFBd0I7QUFROUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXFDQSxNQUFNLE1BQU07QUFTSixTQUFSLDRCQUFzRyxRQUFzQjtBQUNqSSxRQUFNLFdBQVcsS0FBSyxNQUFNO0FBQzVCLG9CQUFrQixZQUFZO0FBQzVCLFFBQUk7QUFDSixRQUFJO0FBQ0YsZUFBUyxNQUFNLGdCQUFnQixNQUFNLE1BQU07QUFBQSxJQUM3QyxTQUFTLE9BQU87QUFDZCxlQUFTLEtBQWM7QUFDdkI7QUFBQSxJQUNGO0FBQ0EsYUFBUyxNQUFNLE9BQU8sTUFBTSxPQUFPLE9BQU8sS0FBSyxVQUFVLE9BQU8sR0FBRyxDQUFDO0FBQUEsRUFDdEUsQ0FBQztBQUNIO0FBRUEsZUFBZSxnQkFBZ0IsU0FBNEQsUUFBdUM7QUFDaEksUUFBTSxFQUFFLG1CQUFtQixNQUFNLE9BQU8sSUFBSSxRQUFRLFdBQVc7QUFDL0QsUUFBTSxXQUFXLFFBQVE7QUFDekIsUUFBTSxPQUFPLE9BQU8sU0FBUyxPQUFPO0FBQ3BDLFVBQVEsTUFBTTtBQUFBLElBQ1osS0FBSyxPQUFPO0FBQ1YsYUFBTyxNQUFNLGVBQWUsRUFBRSxNQUFNLFVBQVUsa0JBQWtCLENBQUM7QUFBQSxJQUNuRTtBQUFBLElBQ0EsS0FBSyxjQUFjO0FBQ2pCLFlBQU0sU0FBUyxNQUFNLGFBQWEsRUFBRSxVQUFVLG1CQUFtQixPQUFPLG1CQUFtQixRQUFRLE1BQU0sUUFBUSxVQUFVLENBQUMsRUFBRSxDQUFDO0FBQy9ILGlCQUFXLGNBQWMsT0FBTyxjQUFjO0FBQzVDLGdCQUFRLGNBQWMsVUFBVTtBQUFBLE1BQ2xDO0FBQ0EsYUFBTyxFQUFFLE1BQU0sT0FBTyxJQUFJO0FBQUEsSUFDNUI7QUFBQSxJQUNBLEtBQUssVUFBVTtBQUNiLGFBQU8sTUFBTSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsa0JBQWtCLENBQUM7QUFBQSxJQUNwRTtBQUFBLElBQ0EsS0FBSyxjQUFjO0FBQ2pCLFlBQU0sU0FBUyxNQUFNLGlCQUFpQixNQUFNLEVBQUUsUUFBUSxNQUFNLFlBQVksVUFBVSxXQUFXLFdBQVcsQ0FBQztBQUN6RyxhQUFPLEVBQUUsTUFBTSxPQUFPLE1BQU0sS0FBSyxLQUFLLE1BQU0sT0FBTyxHQUFHLEVBQW1CO0FBQUEsSUFDM0U7QUFBQSxJQUNBLEtBQUssUUFBUTtBQUNYLGFBQU8sRUFBRSxNQUFNLGtCQUFrQixNQUFNLEVBQUU7QUFBQSxJQUMzQztBQUFBLElBQ0EsU0FBUztBQUNQLFlBQU0sSUFBSSxNQUFNLHdCQUF3QixPQUFPLElBQUksQ0FBQyxFQUFFO0FBQUEsSUFDeEQ7QUFBQSxFQUNGO0FBQ0Y7IiwibmFtZXMiOltdfQ==
@@ -0,0 +1,44 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Deploys a development build into the vault: copies the output folder into `<vault>/.obsidian/plugins`,
6
+ * then reloads it the way the build's `reload` option says. By default that installs and enables HotReload
7
+ * and the plugin in an Obsidian instance `npm run dev` owns; `'obsidian-cli'` reloads it in the Obsidian the
8
+ * developer has open instead (`obsidian-cli-reload.ts`). Every bundler adapter calls it once each rebuild has
9
+ * written its output, so the latest build is always the one running.
10
+ */
11
+ import type { ObsidianPluginReload } from './obsidian-plugin-build.mjs';
12
+ /**
13
+ * Parameters for {@link deployToObsidianPluginsFolder}.
14
+ */
15
+ export interface DeployToObsidianPluginsFolderParams {
16
+ /**
17
+ * The folder where the built files are located.
18
+ */
19
+ readonly distFolder: string;
20
+ /**
21
+ * A boolean indicating whether the build is a production build.
22
+ */
23
+ readonly isProductionBuild: boolean;
24
+ /**
25
+ * The folder of the Obsidian configuration. If not provided, the plugin will not copy files.
26
+ */
27
+ readonly obsidianConfigFolder: string;
28
+ /**
29
+ * The name of the Obsidian plugin.
30
+ */
31
+ readonly pluginName: string;
32
+ /**
33
+ * How the deployed build is reloaded in Obsidian. Defaults to `'hot-reload-plugin'`.
34
+ */
35
+ readonly reload?: ObsidianPluginReload;
36
+ }
37
+ /**
38
+ * Copies a development build into the vault's plugins folder and reloads it there, as the `reload` option
39
+ * says. Does nothing for a production build, or when no Obsidian config folder is configured.
40
+ *
41
+ * @param params - The {@link DeployToObsidianPluginsFolderParams}.
42
+ * @returns A {@link Promise} that resolves once the plugin is deployed.
43
+ */
44
+ export declare function deployToObsidianPluginsFolder(params: DeployToObsidianPluginsFolderParams): Promise<void>;
@@ -0,0 +1,228 @@
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 {
34
+ invokeAsyncSafely,
35
+ sleep
36
+ } from "@mnaoumov/typescript-lib/async";
37
+ import { getLibDebugger } from "@mnaoumov/typescript-lib/debug";
38
+ import {
39
+ basename,
40
+ dirname,
41
+ join,
42
+ toPosixPath
43
+ } from "@mnaoumov/typescript-lib/path";
44
+ import {
45
+ cp,
46
+ mkdir,
47
+ readFile
48
+ } from "node:fs/promises";
49
+ import process from "node:process";
50
+ import {
51
+ createTransportFromOptions,
52
+ DesktopCdpTransport,
53
+ evalInObsidian
54
+ } from "obsidian-integration-testing";
55
+ import { reloadPluginWithObsidianCli } from "./obsidian-cli-reload.mjs";
56
+ const moduleState = {
57
+ devInstanceTransportPromise: void 0,
58
+ isDevInstanceCleanupRegistered: false,
59
+ isDevInstanceDisposed: false
60
+ };
61
+ const DEV_INSTANCE_PROBE_INTERVAL_IN_MILLISECONDS = 2e3;
62
+ const DEV_INSTANCE_CLOSED_PROBE_COUNT = 3;
63
+ async function deployToObsidianPluginsFolder(params) {
64
+ const {
65
+ distFolder,
66
+ isProductionBuild,
67
+ pluginName
68
+ } = params;
69
+ if (isProductionBuild) {
70
+ return;
71
+ }
72
+ if (!params.obsidianConfigFolder) {
73
+ getLibDebugger("deployToObsidianPluginsFolder")(
74
+ "No Obsidian config folder configured. `OBSIDIAN_CONFIG_FOLDER` environment variable is not set in system or in `.env` file. The compiled plugin will not be copied into Obsidian plugins folder."
75
+ );
76
+ return;
77
+ }
78
+ const obsidianConfigFolder = toPosixPath(params.obsidianConfigFolder);
79
+ const pluginFolder = join(obsidianConfigFolder, "plugins", pluginName);
80
+ await mkdir(pluginFolder, { recursive: true });
81
+ await cp(distFolder, pluginFolder, { recursive: true });
82
+ switch (params.reload ?? "hot-reload-plugin") {
83
+ case false: {
84
+ break;
85
+ }
86
+ case "hot-reload-plugin": {
87
+ await installAndEnableHotReload({
88
+ obsidianConfigFolder,
89
+ pluginName
90
+ });
91
+ break;
92
+ }
93
+ case "obsidian-cli": {
94
+ await reloadPluginWithObsidianCli({
95
+ pluginId: await readPluginId(pluginFolder, pluginName),
96
+ vaultName: basename(dirname(obsidianConfigFolder))
97
+ });
98
+ break;
99
+ }
100
+ default: {
101
+ throw new Error(`Unknown reload option: ${String(params.reload)}`);
102
+ }
103
+ }
104
+ }
105
+ async function getOrLaunchDevInstance(vaultPath) {
106
+ moduleState.devInstanceTransportPromise ??= launchDevInstance(vaultPath);
107
+ try {
108
+ return await moduleState.devInstanceTransportPromise;
109
+ } catch (error) {
110
+ moduleState.devInstanceTransportPromise = void 0;
111
+ throw error;
112
+ }
113
+ }
114
+ async function installAndEnableHotReload(params) {
115
+ const {
116
+ obsidianConfigFolder,
117
+ pluginName
118
+ } = params;
119
+ const vaultPath = dirname(obsidianConfigFolder);
120
+ const transport = await getOrLaunchDevInstance(vaultPath);
121
+ await evalInObsidian({
122
+ // eslint-disable-next-line no-shadow -- No actual shadowing as the function is executed externally.
123
+ async callback({ app, obsidianModule, pluginName: pluginName2 }) {
124
+ const HOT_RELOAD_PLUGIN_ID = "hot-reload";
125
+ const COMMUNITY_PLUGINS_REGISTRY_URL = "https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json";
126
+ const { requestUrl } = obsidianModule;
127
+ await app.plugins.setEnable(true);
128
+ if (!Object.hasOwn(app.plugins.manifests, HOT_RELOAD_PLUGIN_ID)) {
129
+ const registryResponse = await requestUrl(COMMUNITY_PLUGINS_REGISTRY_URL);
130
+ const registryEntries = registryResponse.json;
131
+ const entry = registryEntries.find((candidate) => candidate.id === HOT_RELOAD_PLUGIN_ID);
132
+ if (!entry) {
133
+ throw new Error(`Plugin '${HOT_RELOAD_PLUGIN_ID}' was not found in the Obsidian community plugins registry.`);
134
+ }
135
+ const latestReleaseResponse = await requestUrl(`https://api.github.com/repos/${entry.repo}/releases/latest`);
136
+ const latestRelease = latestReleaseResponse.json;
137
+ const version = latestRelease.tag_name;
138
+ const manifestResponse = await requestUrl(`https://github.com/${entry.repo}/releases/download/${version}/manifest.json`);
139
+ const manifest = manifestResponse.json;
140
+ await app.plugins.installPlugin(entry.repo, version, manifest);
141
+ }
142
+ if (!Object.hasOwn(app.plugins.plugins, HOT_RELOAD_PLUGIN_ID)) {
143
+ await app.plugins.enablePluginAndSave(HOT_RELOAD_PLUGIN_ID);
144
+ }
145
+ await app.plugins.enablePluginAndSave(pluginName2);
146
+ },
147
+ input: { pluginName },
148
+ shouldSkipPreflightChecks: true,
149
+ transport,
150
+ vaultPath
151
+ });
152
+ }
153
+ async function isDevInstanceRunning(cdpUrl) {
154
+ try {
155
+ const response = await fetch(`${cdpUrl}/json`);
156
+ const targets = await response.json();
157
+ return targets.some((target) => target.type === "page");
158
+ } catch {
159
+ return false;
160
+ }
161
+ }
162
+ async function launchDevInstance(vaultPath) {
163
+ const transport = await createTransportFromOptions();
164
+ try {
165
+ await transport.registerVault(vaultPath);
166
+ } catch (error) {
167
+ transport.disposeSync?.();
168
+ throw error;
169
+ }
170
+ registerDevInstanceCleanup(transport);
171
+ watchDevInstanceAndStopOnClose(transport);
172
+ return transport;
173
+ }
174
+ async function readPluginId(pluginFolder, fallbackId) {
175
+ try {
176
+ const manifest = JSON.parse(await readFile(join(pluginFolder, "manifest.json"), "utf-8"));
177
+ return manifest.id ?? fallbackId;
178
+ } catch {
179
+ return fallbackId;
180
+ }
181
+ }
182
+ function registerDevInstanceCleanup(transport) {
183
+ if (moduleState.isDevInstanceCleanupRegistered) {
184
+ return;
185
+ }
186
+ moduleState.isDevInstanceCleanupRegistered = true;
187
+ process.on("exit", disposeDevInstance);
188
+ for (const signal of ["SIGHUP", "SIGINT", "SIGTERM"]) {
189
+ process.once(signal, () => {
190
+ disposeDevInstance();
191
+ process.exit();
192
+ });
193
+ }
194
+ function disposeDevInstance() {
195
+ if (moduleState.isDevInstanceDisposed) {
196
+ return;
197
+ }
198
+ moduleState.isDevInstanceDisposed = true;
199
+ transport.disposeSync?.();
200
+ }
201
+ }
202
+ function watchDevInstanceAndStopOnClose(transport) {
203
+ if (!(transport instanceof DesktopCdpTransport)) {
204
+ return;
205
+ }
206
+ const endpoint = transport.getOwnedInstanceEndpoint();
207
+ if (!endpoint) {
208
+ return;
209
+ }
210
+ const cdpUrl = `http://${endpoint.host}:${String(endpoint.port)}`;
211
+ invokeAsyncSafely(stopWhenDevInstanceCloses);
212
+ async function stopWhenDevInstanceCloses() {
213
+ let consecutiveFailedProbeCount = 0;
214
+ while (consecutiveFailedProbeCount < DEV_INSTANCE_CLOSED_PROBE_COUNT) {
215
+ await sleep({ milliseconds: DEV_INSTANCE_PROBE_INTERVAL_IN_MILLISECONDS });
216
+ if (moduleState.isDevInstanceDisposed) {
217
+ return;
218
+ }
219
+ consecutiveFailedProbeCount = await isDevInstanceRunning(cdpUrl) ? 0 : consecutiveFailedProbeCount + 1;
220
+ }
221
+ console.warn("The Obsidian instance owned by `npm run dev` was closed. Stopping the development build.");
222
+ process.exit();
223
+ }
224
+ }
225
+ export {
226
+ deployToObsidianPluginsFolder
227
+ };
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9vYnNpZGlhbi1wbHVnaW5zLWZvbGRlci1kZXBsb3ltZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEZXBsb3lzIGEgZGV2ZWxvcG1lbnQgYnVpbGQgaW50byB0aGUgdmF1bHQ6IGNvcGllcyB0aGUgb3V0cHV0IGZvbGRlciBpbnRvIGA8dmF1bHQ+Ly5vYnNpZGlhbi9wbHVnaW5zYCxcbiAqIHRoZW4gcmVsb2FkcyBpdCB0aGUgd2F5IHRoZSBidWlsZCdzIGByZWxvYWRgIG9wdGlvbiBzYXlzLiBCeSBkZWZhdWx0IHRoYXQgaW5zdGFsbHMgYW5kIGVuYWJsZXMgSG90UmVsb2FkXG4gKiBhbmQgdGhlIHBsdWdpbiBpbiBhbiBPYnNpZGlhbiBpbnN0YW5jZSBgbnBtIHJ1biBkZXZgIG93bnM7IGAnb2JzaWRpYW4tY2xpJ2AgcmVsb2FkcyBpdCBpbiB0aGUgT2JzaWRpYW4gdGhlXG4gKiBkZXZlbG9wZXIgaGFzIG9wZW4gaW5zdGVhZCAoYG9ic2lkaWFuLWNsaS1yZWxvYWQudHNgKS4gRXZlcnkgYnVuZGxlciBhZGFwdGVyIGNhbGxzIGl0IG9uY2UgZWFjaCByZWJ1aWxkIGhhc1xuICogd3JpdHRlbiBpdHMgb3V0cHV0LCBzbyB0aGUgbGF0ZXN0IGJ1aWxkIGlzIGFsd2F5cyB0aGUgb25lIHJ1bm5pbmcuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIENvcGllcyBidWlsZCBvdXRwdXQgaW50byBhIHZhdWx0IGFuZCBkcml2ZXMgYSBsaXZlIE9ic2lkaWFuIG92ZXIgQ0RQLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnO1xuXG5pbXBvcnQge1xuICBpbnZva2VBc3luY1NhZmVseSxcbiAgc2xlZXBcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBqb2luLFxuICB0b1Bvc2l4UGF0aFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zLFxuICBEZXNrdG9wQ2RwVHJhbnNwb3J0LFxuICBldmFsSW5PYnNpZGlhblxufSBmcm9tICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpblJlbG9hZCB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcblxuaW1wb3J0IHsgcmVsb2FkUGx1Z2luV2l0aE9ic2lkaWFuQ2xpIH0gZnJvbSAnLi9vYnNpZGlhbi1jbGktcmVsb2FkLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgd2hlcmUgdGhlIGJ1aWx0IGZpbGVzIGFyZSBsb2NhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBidWlsZCBpcyBhIHByb2R1Y3Rpb24gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBpc1Byb2R1Y3Rpb25CdWlsZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGZvbGRlciBvZiB0aGUgT2JzaWRpYW4gY29uZmlndXJhdGlvbi4gSWYgbm90IHByb3ZpZGVkLCB0aGUgcGx1Z2luIHdpbGwgbm90IGNvcHkgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkNvbmZpZ0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgT2JzaWRpYW4gcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGRlcGxveWVkIGJ1aWxkIGlzIHJlbG9hZGVkIGluIE9ic2lkaWFuLiBEZWZhdWx0cyB0byBgJ2hvdC1yZWxvYWQtcGx1Z2luJ2AuXG4gICAqL1xuICByZWFkb25seSByZWxvYWQ/OiBPYnNpZGlhblBsdWdpblJlbG9hZDtcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGEgQ0RQIHRhcmdldCBkZXNjcmlwdG9yIHJlYWQgZnJvbSB0aGUgb3duZWQgaW5zdGFuY2UncyBgL2pzb25gIGVuZHBvaW50LlxuICovXG5pbnRlcmZhY2UgQ2RwVGFyZ2V0IHtcbiAgLyoqXG4gICAqIFRoZSBraW5kIG9mIHRoZSB0YXJnZXQsIGUuZy4gYHBhZ2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGVudHJ5IGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkgKGBjb21tdW5pdHktcGx1Z2lucy5qc29uYCkuXG4gKi9cbmludGVyZmFjZSBDb21tdW5pdHlQbHVnaW5SZWdpc3RyeUVudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG93bmVyL25hbWVgIEdpdEh1YiByZXBvc2l0b3J5IHRoZSBwbHVnaW4gaXMgcHVibGlzaGVkIGZyb20uXG4gICAqL1xuICByZWFkb25seSByZXBvOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBhIEdpdEh1YiByZWxlYXNlIHdlIHJlYWQuXG4gKi9cbmludGVyZmFjZSBHaXRIdWJSZWxlYXNlIHtcbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIHRhZywgYSBiYXJlIHZlcnNpb24gc3VjaCBhcyBgMS4yLjNgLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFnX25hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW5zdGFsbEFuZEVuYWJsZUhvdFJlbG9hZH0uXG4gKi9cbmludGVyZmFjZSBJbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXIgb2YgdGhlIE9ic2lkaWFuIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkNvbmZpZ0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYnVpbHQgT2JzaWRpYW4gcGx1Z2luIHRvIGVuYWJsZSBvbmNlIEhvdFJlbG9hZCBpcyBpbiBwbGFjZS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuLy8gVGhlIGBucG0gcnVuIGRldmAtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2U6IGxhdW5jaGVkIG9uIHRoZSBmaXJzdCByZWJ1aWxkIGFuZCByZXVzZWQgYWNyb3NzIHJlYnVpbGRzLlxuLy8gSXRzIGxpZmV0aW1lIGlzIHRpZWQgdG8gdGhlIGBucG0gcnVuIGRldmAgcHJvY2VzcyBpbiBCT1RIIGRpcmVjdGlvbnMuXG4vLyBUaGUgaW5zdGFuY2UgaXMgY2xvc2VkIHdoZW4gdGhlIHByb2Nlc3MgdGVybWluYXRlcyAoc2VlIGByZWdpc3RlckRldkluc3RhbmNlQ2xlYW51cGApLlxuLy8gVGhlIHByb2Nlc3Mgc3RvcHMgd2hlbiB0aGUgaW5zdGFuY2UgaXMgY2xvc2VkIChzZWUgYHdhdGNoRGV2SW5zdGFuY2VBbmRTdG9wT25DbG9zZWApLlxuLyoqXG5Nb2R1bGUtbGV2ZWwgbXV0YWJsZSBzdGF0ZSwgaGVsZCBpbiBvbmUgb2JqZWN0IHNvIGVhY2ggbXV0YXRpb24gbmFtZXMgaXQgZXhwbGljaXRseS5cbiAqL1xuaW50ZXJmYWNlIE1vZHVsZVN0YXRlIHtcbiAgZGV2SW5zdGFuY2VUcmFuc3BvcnRQcm9taXNlOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB8IHVuZGVmaW5lZDtcbiAgaXNEZXZJbnN0YW5jZUNsZWFudXBSZWdpc3RlcmVkOiBib29sZWFuO1xuICBpc0Rldkluc3RhbmNlRGlzcG9zZWQ6IGJvb2xlYW47XG59XG5cbmNvbnN0IG1vZHVsZVN0YXRlOiBNb2R1bGVTdGF0ZSA9IHtcbiAgZGV2SW5zdGFuY2VUcmFuc3BvcnRQcm9taXNlOiB1bmRlZmluZWQsXG4gIGlzRGV2SW5zdGFuY2VDbGVhbnVwUmVnaXN0ZXJlZDogZmFsc2UsXG4gIGlzRGV2SW5zdGFuY2VEaXNwb3NlZDogZmFsc2Vcbn07XG5cbi8qKlxuICogSG93IG9mdGVuIHRoZSBvd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBpcyBwcm9iZWQgdG8gZGV0ZWN0IHRoYXQgaXQgd2FzIGNsb3NlZC5cbiAqL1xuY29uc3QgREVWX0lOU1RBTkNFX1BST0JFX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5cbi8qKlxuICogSG93IG1hbnkgY29uc2VjdXRpdmUgZmFpbGVkIHByb2JlcyBhcmUgdG9sZXJhdGVkIGJlZm9yZSB0aGUgb3duZWQgaW5zdGFuY2UgaXMgY29uc2lkZXJlZCBjbG9zZWQuIEFcbiAqIHNpbmdsZSBmYWlsdXJlIGNhbiBiZSBhIHRyYW5zaWVudCBoaWNjdXAgKGEgYnVzeSByZW5kZXJlciwgYSBtb21lbnRhcmlseSByZWZ1c2VkIGNvbm5lY3Rpb24pLCBzbyB0aGVcbiAqIGRldmVsb3BtZW50IGJ1aWxkIGlzIG9ubHkgc3RvcHBlZCBvbmNlIHRoZSBlbmRwb2ludCBzdGF5cyB1bnJlYWNoYWJsZS5cbiAqL1xuY29uc3QgREVWX0lOU1RBTkNFX0NMT1NFRF9QUk9CRV9DT1VOVCA9IDM7XG4vKipcbiAqIENvcGllcyBhIGRldmVsb3BtZW50IGJ1aWxkIGludG8gdGhlIHZhdWx0J3MgcGx1Z2lucyBmb2xkZXIgYW5kIHJlbG9hZHMgaXQgdGhlcmUsIGFzIHRoZSBgcmVsb2FkYCBvcHRpb25cbiAqIHNheXMuIERvZXMgbm90aGluZyBmb3IgYSBwcm9kdWN0aW9uIGJ1aWxkLCBvciB3aGVuIG5vIE9ic2lkaWFuIGNvbmZpZyBmb2xkZXIgaXMgY29uZmlndXJlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBEZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlclBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHBsdWdpbiBpcyBkZXBsb3llZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyKHBhcmFtczogRGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXJQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGRpc3RGb2xkZXIsXG4gICAgaXNQcm9kdWN0aW9uQnVpbGQsXG4gICAgcGx1Z2luTmFtZVxuICB9ID0gcGFyYW1zO1xuXG4gIGlmIChpc1Byb2R1Y3Rpb25CdWlsZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghcGFyYW1zLm9ic2lkaWFuQ29uZmlnRm9sZGVyKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ2RlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyJykoXG4gICAgICAnTm8gT2JzaWRpYW4gY29uZmlnIGZvbGRlciBjb25maWd1cmVkLiBgT0JTSURJQU5fQ09ORklHX0ZPTERFUmAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCBpbiBzeXN0ZW0gb3IgaW4gYC5lbnZgIGZpbGUuIFRoZSBjb21waWxlZCBwbHVnaW4gd2lsbCBub3QgYmUgY29waWVkIGludG8gT2JzaWRpYW4gcGx1Z2lucyBmb2xkZXIuJ1xuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb2JzaWRpYW5Db25maWdGb2xkZXIgPSB0b1Bvc2l4UGF0aChwYXJhbXMub2JzaWRpYW5Db25maWdGb2xkZXIpO1xuXG4gIGNvbnN0IHBsdWdpbkZvbGRlciA9IGpvaW4ob2JzaWRpYW5Db25maWdGb2xkZXIsICdwbHVnaW5zJywgcGx1Z2luTmFtZSk7XG4gIGF3YWl0IG1rZGlyKHBsdWdpbkZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGNwKGRpc3RGb2xkZXIsIHBsdWdpbkZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgc3dpdGNoIChwYXJhbXMucmVsb2FkID8/ICdob3QtcmVsb2FkLXBsdWdpbicpIHtcbiAgICBjYXNlIGZhbHNlOiB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnaG90LXJlbG9hZC1wbHVnaW4nOiB7XG4gICAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkKHtcbiAgICAgICAgb2JzaWRpYW5Db25maWdGb2xkZXIsXG4gICAgICAgIHBsdWdpbk5hbWVcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ29ic2lkaWFuLWNsaSc6IHtcbiAgICAgIGF3YWl0IHJlbG9hZFBsdWdpbldpdGhPYnNpZGlhbkNsaSh7XG4gICAgICAgIHBsdWdpbklkOiBhd2FpdCByZWFkUGx1Z2luSWQocGx1Z2luRm9sZGVyLCBwbHVnaW5OYW1lKSxcbiAgICAgICAgdmF1bHROYW1lOiBiYXNlbmFtZShkaXJuYW1lKG9ic2lkaWFuQ29uZmlnRm9sZGVyKSlcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByZWxvYWQgb3B0aW9uOiAke1N0cmluZyhwYXJhbXMucmVsb2FkKX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBgbnBtIHJ1biBkZXZgLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gdmF1bHQsIGxhdW5jaGluZyBpdCBvbiBmaXJzdCB1c2UgYW5kXG4gKiByZXVzaW5nIGl0IG9uIHN1YnNlcXVlbnQgcmVidWlsZHMuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIgdG8gb3Blbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgb3duZWQge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0fS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T3JMYXVuY2hEZXZJbnN0YW5jZSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgbW9kdWxlU3RhdGUuZGV2SW5zdGFuY2VUcmFuc3BvcnRQcm9taXNlID8/PSBsYXVuY2hEZXZJbnN0YW5jZSh2YXVsdFBhdGgpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBtb2R1bGVTdGF0ZS5kZXZJbnN0YW5jZVRyYW5zcG9ydFByb21pc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQ2xlYXIgdGhlIGNhY2hlIHNvIGEgbGF0ZXIgcmVidWlsZCByZXRyaWVzIHRoZSBsYXVuY2guXG4gICAgbW9kdWxlU3RhdGUuZGV2SW5zdGFuY2VUcmFuc3BvcnRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogSW5zdGFsbHMgdGhlIEhvdFJlbG9hZCBwbHVnaW4gZnJvbSB0aGUgb2ZmaWNpYWwgY29tbXVuaXR5IHN0b3JlIChpZiBub3QgYWxyZWFkeSBpbnN0YWxsZWQpLCBsb2FkcyBpdFxuICogKGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcpLCBhbmQgZW5hYmxlcyB0aGUgZnJlc2hseS1idWlsdCBwbHVnaW4g4oCUIGFsbCB0aHJvdWdoIHRoZSBgbnBtIHJ1biBkZXZgLW93bmVkXG4gKiBPYnNpZGlhbiBpbnN0YW5jZSwgc28gSG90UmVsb2FkIHRoZW4gYXV0by1yZWZyZXNoZXMgdGhlIGRlcGxveWVkIHBsdWdpbiBvbiBldmVyeSByZWJ1aWxkLlxuICpcbiAqIFRoZSBpbnN0YWxsIGdvZXMgdGhyb3VnaCBPYnNpZGlhbidzIG93biBgaW5zdGFsbFBsdWdpbmAgKHRoZSBjb21tdW5pdHktc3RvcmUgbWVjaGFuaXNtKSwgYW5kIGV2ZXJ5IHN0ZXBcbiAqIHJ1bnMgYWdhaW5zdCB0aGUgb3duZWQgaW5zdGFuY2Ugb3ZlciBDRFA7IGFueSBmYWlsdXJlIHN1cmZhY2VzICh0aGUgZGV2IGJ1aWxkIHJlcG9ydHMgaXQpIHJhdGhlciB0aGFuXG4gKiBiZWluZyBzaWxlbnRseSBzd2FsbG93ZWQuXG4gKlxuICogVGhlIGZpcnN0IHN0ZXAgaXMgbGVhdmluZyByZXN0cmljdGVkIG1vZGUgZm9yIHJlYWwsIHdoaWNoIHRoZSBvd25lZCBpbnN0YW5jZSBoYXMgb25seSBmYWtlZCBzbyBmYXIg4oCUXG4gKiB3aXRob3V0IGl0IFwiZW5hYmxlZFwiIGFuZCBcImxvYWRlZFwiIGNvbWUgYXBhcnQgYW5kIG5vbmUgb2YgdGhlIHZhdWx0J3MgcGx1Z2lucywgSG90UmVsb2FkIGluY2x1ZGVkLCBhcmVcbiAqIHJ1bm5pbmcuIFNlZSB0aGUgY29tbWVudCBvbiB0aGUgYHNldEVuYWJsZWAgY2FsbC5cbiAqXG4gKiBUaGUgaW5zdGFsbC1pZi1taXNzaW5nIC8gZW5hYmxlLWlmLWRpc2FibGVkIGxvZ2ljIGJlbG93IGludGVudGlvbmFsbHkgbWlycm9ycyB0aGUgcHVibGljXG4gKiBgaW5zdGFsbENvbW11bml0eVBsdWdpbmAgLyBgZW5hYmxlQ29tbXVuaXR5UGx1Z2luYCBoZWxwZXJzIGluIGBzcmMvb2JzaWRpYW4vY29tbXVuaXR5LXBsdWdpbnMudHNgLiBJdFxuICogY2Fubm90IGltcG9ydCBhbmQgY2FsbCB0aGVtOiB0aGUgYGZuYCBpcyBzZXJpYWxpemVkIChgdG9TdHJpbmcoKWApIGFuZCBleGVjdXRlZCBpbiB0aGUgcmVuZGVyZXIsIGFuZFxuICogdGhpcyBidWlsZC1vd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBpcyBiYXJlIOKAlCBpdCBoYXMgbm8gZGV2LXV0aWxzIGBsaWJgIHByb3ZpZGVyIHdpcmVkICh0aGF0IHJlc29sdmVyIGlzXG4gKiByZWdpc3RlcmVkIG9ubHkgaW4gdGhlIGludGVncmF0aW9uLXRlc3Qgc2V0dXAsIHdob3NlIGZpeHR1cmUgcHVibGlzaGVzIHRoZSBtZXJnZWQgc3VyZmFjZSBvbiBgd2luZG93YCksXG4gKiBzbyB0aGUgY2xvc3VyZSBoYXMgbm8gYWNjZXNzIHRvIHRoZSBsaWJyYXJ5IHN1cmZhY2UgYW5kIG11c3QgaW5saW5lIHRoZSBlcXVpdmFsZW50IHN0ZXBzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEluc3RhbGxBbmRFbmFibGVIb3RSZWxvYWRQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIEhvdFJlbG9hZCBhbmQgdGhlIGJ1aWx0IHBsdWdpbiBhcmUgaW5zdGFsbGVkIGFuZCBlbmFibGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsQW5kRW5hYmxlSG90UmVsb2FkKHBhcmFtczogSW5zdGFsbEFuZEVuYWJsZUhvdFJlbG9hZFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgb2JzaWRpYW5Db25maWdGb2xkZXIsXG4gICAgcGx1Z2luTmFtZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCB2YXVsdFBhdGggPSBkaXJuYW1lKG9ic2lkaWFuQ29uZmlnRm9sZGVyKTtcbiAgY29uc3QgdHJhbnNwb3J0ID0gYXdhaXQgZ2V0T3JMYXVuY2hEZXZJbnN0YW5jZSh2YXVsdFBhdGgpO1xuICBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSBObyBhY3R1YWwgc2hhZG93aW5nIGFzIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZCBleHRlcm5hbGx5LlxuICAgIGFzeW5jIGNhbGxiYWNrKHsgYXBwLCBvYnNpZGlhbk1vZHVsZSwgcGx1Z2luTmFtZSB9KSB7XG4gICAgICBjb25zdCBIT1RfUkVMT0FEX1BMVUdJTl9JRCA9ICdob3QtcmVsb2FkJztcbiAgICAgIGNvbnN0IENPTU1VTklUWV9QTFVHSU5TX1JFR0lTVFJZX1VSTCA9ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9IRUFEL2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuICAgICAgY29uc3QgeyByZXF1ZXN0VXJsIH0gPSBvYnNpZGlhbk1vZHVsZTtcblxuICAgICAgLypcbiAgICAgICAqIEdlbnVpbmVseSBsZWF2ZSByZXN0cmljdGVkIG1vZGUgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nIGVsc2UuIFRoZSBvd25lZCBpbnN0YW5jZSBib290cyB3aXRoIGFcbiAgICAgICAqIGZyZXNoIHVzZXItZGF0YSBkaXIsIHNvIE9ic2lkaWFuIHN0YXJ0cyByZXN0cmljdGVkIGFuZCBgUGx1Z2lucy5pbml0aWFsaXplKClgIHJldHVybnMgYmVmb3JlXG4gICAgICAgKiBsb2FkaW5nIGEgc2luZ2xlIHBsdWdpbi4gVGhlIGhhcm5lc3MgdGhlbiBjbG9zZXMgdGhlIHRydXN0IG1vZGFsIGFuZCB3cml0ZXMgdGhlXG4gICAgICAgKiBgZW5hYmxlLXBsdWdpbi08YXBwSWQ+YCBsb2NhbFN0b3JhZ2UgZmxhZyBkaXJlY3RseSDigJQgZGVsaWJlcmF0ZWx5LCB0byBhdm9pZCBhIHN5bmNocm9ub3VzIGxvYWQg4oCUXG4gICAgICAgKiB3aGljaCBsZWF2ZXMgYGlzRW5hYmxlZCgpYCByZXBvcnRpbmcgYHRydWVgIG92ZXIgYSB2YXVsdCB3aGVyZSBub3RoaW5nIGlzIGFjdHVhbGx5IHJ1bm5pbmcuIEV2ZXJ5XG4gICAgICAgKiBgZW5hYmxlZFBsdWdpbnNgIHJlYWRpbmcgYmVsb3cgKGFuZCBpbiB0aGUgbWlycm9yZWQgYGNvbW11bml0eS1wbHVnaW5zLnRzYCBoZWxwZXJzKSB3b3VsZCBiZVxuICAgICAgICogYW5zd2VyaW5nIGFib3V0IHRoZSB2YXVsdCdzIGNvbmZpZyBmaWxlIHJhdGhlciB0aGFuIHRoaXMgaW5zdGFuY2UuXG4gICAgICAgKlxuICAgICAgICogYHNldEVuYWJsZSh0cnVlKWAgaXMgd2hhdCBPYnNpZGlhbidzIG93biBcIkV4aXQgcmVzdHJpY3RlZCBtb2RlXCIgYnV0dG9uIGNhbGxzOiBpdCByZS1hc3NlcnRzIHRoZVxuICAgICAgICogZmxhZyBhbmQgbG9hZHMgZXZlcnl0aGluZyBpbiBgZW5hYmxlZFBsdWdpbnNgLiBVbmNvbmRpdGlvbmFsIG9uIHB1cnBvc2Ug4oCUIHRoZSBmbGFnIGlzIGFscmVhZHlcbiAgICAgICAqIGB0cnVlYCwgc28gYW4gYGlzRW5hYmxlZCgpYCBndWFyZCB3b3VsZCBza2lwIHRoZSBsb2FkIHRoYXQgaXMgdGhlIHdob2xlIHBvaW50LiBJZGVtcG90ZW50IGFuZFxuICAgICAgICogZWZmZWN0aXZlbHkgZnJlZSBvbmNlIHdhcm0gKGBsb2FkUGx1Z2luYCByZXR1cm5zIHRoZSBsaXZlIGluc3RhbmNlKSwgc28gcmUtcnVubmluZyBpdCBvbiBldmVyeVxuICAgICAgICogcmVidWlsZCBjb3N0cyBub3RoaW5nLlxuICAgICAgICovXG4gICAgICBhd2FpdCBhcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG5cbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihhcHAucGx1Z2lucy5tYW5pZmVzdHMsIEhPVF9SRUxPQURfUExVR0lOX0lEKSkge1xuICAgICAgICBjb25zdCByZWdpc3RyeVJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFVybChDT01NVU5JVFlfUExVR0lOU19SRUdJU1RSWV9VUkwpO1xuICAgICAgICBjb25zdCByZWdpc3RyeUVudHJpZXMgPSByZWdpc3RyeVJlc3BvbnNlLmpzb24gYXMgQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnlFbnRyeVtdO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHJlZ2lzdHJ5RW50cmllcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gSE9UX1JFTE9BRF9QTFVHSU5fSUQpO1xuICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gJyR7SE9UX1JFTE9BRF9QTFVHSU5fSUR9JyB3YXMgbm90IGZvdW5kIGluIHRoZSBPYnNpZGlhbiBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhdGVzdFJlbGVhc2VSZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtlbnRyeS5yZXBvfS9yZWxlYXNlcy9sYXRlc3RgKTtcbiAgICAgICAgY29uc3QgbGF0ZXN0UmVsZWFzZSA9IGxhdGVzdFJlbGVhc2VSZXNwb25zZS5qc29uIGFzIEdpdEh1YlJlbGVhc2U7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSBsYXRlc3RSZWxlYXNlLnRhZ19uYW1lO1xuICAgICAgICBjb25zdCBtYW5pZmVzdFJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFVybChgaHR0cHM6Ly9naXRodWIuY29tLyR7ZW50cnkucmVwb30vcmVsZWFzZXMvZG93bmxvYWQvJHt2ZXJzaW9ufS9tYW5pZmVzdC5qc29uYCk7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gbWFuaWZlc3RSZXNwb25zZS5qc29uIGFzIFBsdWdpbk1hbmlmZXN0O1xuICAgICAgICBhd2FpdCBhcHAucGx1Z2lucy5pbnN0YWxsUGx1Z2luKGVudHJ5LnJlcG8sIHZlcnNpb24sIG1hbmlmZXN0KTtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqIEFzayB3aGV0aGVyIEhvdFJlbG9hZCBpcyBSVU5OSU5HLCBub3Qgd2hldGhlciB0aGUgdmF1bHQgY29uZmlnIGxpc3RzIGl0IGFzIGVuYWJsZWQuIEFmdGVyIHRoZVxuICAgICAgICogYHNldEVuYWJsZWAgYWJvdmUgdGhlIHR3byBub3JtYWxseSBhZ3JlZSwgYnV0IGEgSG90UmVsb2FkIHRoYXQgaXMgbGlzdGVkIGFuZCBmYWlsZWQgdG8gbG9hZCB3b3VsZFxuICAgICAgICogcGFzcyBhbiBgZW5hYmxlZFBsdWdpbnNgIGNoZWNrIHdoaWxlIGxlYXZpbmcgdGhlIGRldiBidWlsZCB3aXRob3V0IGF1dG8tcmVmcmVzaC5cbiAgICAgICAqL1xuICAgICAgaWYgKCFPYmplY3QuaGFzT3duKGFwcC5wbHVnaW5zLnBsdWdpbnMsIEhPVF9SRUxPQURfUExVR0lOX0lEKSkge1xuICAgICAgICBhd2FpdCBhcHAucGx1Z2lucy5lbmFibGVQbHVnaW5BbmRTYXZlKEhPVF9SRUxPQURfUExVR0lOX0lEKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYXBwLnBsdWdpbnMuZW5hYmxlUGx1Z2luQW5kU2F2ZShwbHVnaW5OYW1lKTtcbiAgICB9LFxuICAgIGlucHV0OiB7IHBsdWdpbk5hbWUgfSxcbiAgICBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzOiB0cnVlLFxuICAgIHRyYW5zcG9ydCxcbiAgICB2YXVsdFBhdGhcbiAgfSk7XG59XG5cbi8qKlxuICogUHJvYmVzIHRoZSBvd25lZCBPYnNpZGlhbiBpbnN0YW5jZSdzIENEUCBlbmRwb2ludCB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBzdGlsbCBydW5uaW5nLlxuICpcbiAqIEEgY2xvc2VkIGluc3RhbmNlIHN0b3BzIHNlcnZpbmcgQ0RQIGFsdG9nZXRoZXIsIHNvIGFuIHVucmVhY2hhYmxlIGVuZHBvaW50IOKAlCBvciBvbmUgbGVmdCB3aXRoIG5vIHBhZ2VcbiAqIHRhcmdldHMgd2hpbGUgdGhlIGFwcCB0ZWFycyBpdHNlbGYgZG93biDigJQgbWVhbnMgdGhlIGluc3RhbmNlIGlzIGdvbmUuXG4gKlxuICogQHBhcmFtIGNkcFVybCAtIFRoZSBiYXNlIENEUCBVUkwgb2YgdGhlIG93bmVkIGluc3RhbmNlLCBlLmcuIGBodHRwOi8vbG9jYWxob3N0OjUxODg4YC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byBgdHJ1ZWAgd2hpbGUgdGhlIGluc3RhbmNlIGlzIHN0aWxsIHNlcnZpbmcgYSBwYWdlIHRhcmdldC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNEZXZJbnN0YW5jZVJ1bm5pbmcoY2RwVXJsOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIFdlIHJ1biB0aGlzIG91dHNpZGUgb2YgT2JzaWRpYW4sIHNvIHdlIGRvbid0IGhhdmUgYHJlcXVlc3RVcmwoKWAuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtjZHBVcmx9L2pzb25gKTtcbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIENkcFRhcmdldFtdO1xuICAgIHJldHVybiB0YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LnR5cGUgPT09ICdwYWdlJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIExhdW5jaGVzIGEgZnJlc2ggb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgKGlzb2xhdGVkIHVzZXItZGF0YSBkaXIpIGFuZCBvcGVucyB0aGUgZ2l2ZW4gdmF1bHQuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIgdG8gb3Blbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgbGF1bmNoZWQge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0fS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGF1bmNoRGV2SW5zdGFuY2UodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHRyYW5zcG9ydCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdHJhbnNwb3J0LnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0cmFuc3BvcnQuZGlzcG9zZVN5bmM/LigpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIHJlZ2lzdGVyRGV2SW5zdGFuY2VDbGVhbnVwKHRyYW5zcG9ydCk7XG4gIHdhdGNoRGV2SW5zdGFuY2VBbmRTdG9wT25DbG9zZSh0cmFuc3BvcnQpO1xuICByZXR1cm4gdHJhbnNwb3J0O1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBwbHVnaW4gaWQgZnJvbSB0aGUgZGVwbG95ZWQgYG1hbmlmZXN0Lmpzb25gLCB3aGljaCBpcyB3aGF0IE9ic2lkaWFuIGFuZCBpdHMgQ0xJIGtub3cgdGhlIHBsdWdpbiBieS5cbiAqXG4gKiBAcGFyYW0gcGx1Z2luRm9sZGVyIC0gVGhlIGRlcGxveWVkIHBsdWdpbiBmb2xkZXIuXG4gKiBAcGFyYW0gZmFsbGJhY2tJZCAtIFRoZSBpZCB0byB1c2Ugd2hlbiB0aGUgZm9sZGVyIGhhcyBubyByZWFkYWJsZSBtYW5pZmVzdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgcGx1Z2luIGlkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkUGx1Z2luSWQocGx1Z2luRm9sZGVyOiBzdHJpbmcsIGZhbGxiYWNrSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGpvaW4ocGx1Z2luRm9sZGVyLCAnbWFuaWZlc3QuanNvbicpLCAndXRmLTgnKSkgYXMgUGFydGlhbDxQbHVnaW5NYW5pZmVzdD47XG4gICAgcmV0dXJuIG1hbmlmZXN0LmlkID8/IGZhbGxiYWNrSWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxsYmFja0lkO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHByb2Nlc3MtZXhpdCBhbmQgc2lnbmFsIGhhbmRsZXJzIChvbmNlKSB0aGF0IHN5bmNocm9ub3VzbHkgY2xvc2UgdGhlIG93bmVkIE9ic2lkaWFuXG4gKiBpbnN0YW5jZSB3aGVuIHRoZSBgbnBtIHJ1biBkZXZgIHByb2Nlc3MgdGVybWluYXRlcy5cbiAqXG4gKiBUaGVzZSBoYW5kbGVycyBjb3ZlciBhbiBvcmRlcmx5IHNodXRkb3duLiBBIGBTSUdLSUxMYCAob3IgYSBUYXNrIE1hbmFnZXIgLyBJREUgc3RvcCkgcnVucyBubyBoYW5kbGVyXG4gKiBhdCBhbGwsIGFuZCBubyBvcGVyYXRpbmcgc3lzdGVtIGtpbGxzIHRoZSBpbnN0YW5jZSBqdXN0IGZvciBiZWluZyBvdXIgY2hpbGQg4oCUIHNvIHRoYXQgY2FzZSBpcyBjYXVnaHRcbiAqIGZyb20gdGhlIG90aGVyIHNpZGUsIGJ5IHRoZSBoYXJuZXNzJ3MgcGFyZW50LWxpdmVuZXNzIHdhdGNoZG9nOiB0aGUgaW5zdGFuY2UncyByZW5kZXJlciBob2xkcyBhIHNvY2tldFxuICogYmFjayB0byB0aGlzIHByb2Nlc3MgYW5kIGRlc3Ryb3lzIGl0cyB3aW5kb3cgd2hlbiB0aGUga2VybmVsIGNsb3NlcyBpdC4gU2VlIGBwYXJlbnQtbGl2ZW5lc3MudHNgIGluXG4gKiBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2AuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSBvd25lZCB0cmFuc3BvcnQgdG8gZGlzcG9zZSBvbiBzaHV0ZG93bi5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXAodHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCk6IHZvaWQge1xuICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZUNsZWFudXBSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG1vZHVsZVN0YXRlLmlzRGV2SW5zdGFuY2VDbGVhbnVwUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgLy8gYGV4aXRgIGNvdmVycyBhbnkgYHByb2Nlc3MuZXhpdCgpYCwgYnV0IGEgZGVmYXVsdCBDdHJsK0MgdGVybWluYXRlcyBXSVRIT1VUIGZpcmluZyBgZXhpdGAsIHNvIHRoZSBzaWduYWwgaGFuZGxlcnMgZ3VhcmFudGVlIHRoZSBvd25lZCBPYnNpZGlhbiBpcyBraWxsZWQgb24gc2h1dGRvd24uXG4gIHByb2Nlc3Mub24oJ2V4aXQnLCBkaXNwb3NlRGV2SW5zdGFuY2UpO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTSddIGFzIGNvbnN0KSB7XG4gICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgZGlzcG9zZURldkluc3RhbmNlKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc3Bvc2VEZXZJbnN0YW5jZSgpOiB2b2lkIHtcbiAgICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZURpc3Bvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1vZHVsZVN0YXRlLmlzRGV2SW5zdGFuY2VEaXNwb3NlZCA9IHRydWU7XG4gICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgfVxufVxuXG4vKipcbiAqIFdhdGNoZXMgdGhlIGBucG0gcnVuIGRldmAtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgYW5kIHN0b3BzIHRoZSBkZXZlbG9wbWVudCBidWlsZCBvbmNlIHRoZSBpbnN0YW5jZSBpc1xuICogY2xvc2VkLlxuICpcbiAqIFRoaXMgaXMgdGhlIG1pcnJvciBpbWFnZSBvZiB7QGxpbmsgcmVnaXN0ZXJEZXZJbnN0YW5jZUNsZWFudXB9OiB0aGF0IG9uZSBjbG9zZXMgdGhlIGluc3RhbmNlIHdoZW4gdGhlXG4gKiBgbnBtIHJ1biBkZXZgIHByb2Nlc3MgdGVybWluYXRlcywgdGhpcyBvbmUgdGVybWluYXRlcyB0aGUgcHJvY2VzcyB3aGVuIHRoZSB1c2VyIGNsb3NlcyB0aGUgaW5zdGFuY2UsIHNvXG4gKiB0aGUgdHdvIG5ldmVyIG91dGxpdmUgZWFjaCBvdGhlci4gQSBidWlsZCB3YXRjaGluZyBhbiBPYnNpZGlhbiB0aGF0IGlzIG5vIGxvbmdlciBydW5uaW5nIGhhcyBub3RoaW5nXG4gKiBsZWZ0IHRvIGRlcGxveSB0by5cbiAqXG4gKiBPbmx5IGEgaGFybmVzcy1vd25lZCBpbnN0YW5jZSBpcyB3YXRjaGVkLiBXaGVuIHRoZSB0cmFuc3BvcnQgYXR0YWNoZXMgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuXG4gKiAodGhlIHVzZXIncyBvd24pLCB0aGF0IGluc3RhbmNlIGlzIG5vdCBvdXJzIHRvIGJlIHRpZWQgdG8gYW5kIGNsb3NpbmcgaXQgbGVhdmVzIHRoZSBidWlsZCBydW5uaW5nLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnQgLSBUaGUgb3duZWQgdHJhbnNwb3J0IHdob3NlIGluc3RhbmNlIHRvIHdhdGNoLlxuICovXG5mdW5jdGlvbiB3YXRjaERldkluc3RhbmNlQW5kU3RvcE9uQ2xvc2UodHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCk6IHZvaWQge1xuICBpZiAoISh0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGVuZHBvaW50ID0gdHJhbnNwb3J0LmdldE93bmVkSW5zdGFuY2VFbmRwb2ludCgpO1xuICBpZiAoIWVuZHBvaW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2RwVXJsID0gYGh0dHA6Ly8ke2VuZHBvaW50Lmhvc3R9OiR7U3RyaW5nKGVuZHBvaW50LnBvcnQpfWA7XG4gIGludm9rZUFzeW5jU2FmZWx5KHN0b3BXaGVuRGV2SW5zdGFuY2VDbG9zZXMpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHN0b3BXaGVuRGV2SW5zdGFuY2VDbG9zZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGNvbnNlY3V0aXZlRmFpbGVkUHJvYmVDb3VudCA9IDA7XG4gICAgd2hpbGUgKGNvbnNlY3V0aXZlRmFpbGVkUHJvYmVDb3VudCA8IERFVl9JTlNUQU5DRV9DTE9TRURfUFJPQkVfQ09VTlQpIHtcbiAgICAgIGF3YWl0IHNsZWVwKHsgbWlsbGlzZWNvbmRzOiBERVZfSU5TVEFOQ0VfUFJPQkVfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTIH0pO1xuXG4gICAgICAvLyBUaGUgcHJvY2VzcyBpcyBhbHJlYWR5IHNodXR0aW5nIGRvd24gYW5kIGtpbGxlZCB0aGUgaW5zdGFuY2UgaXRzZWxmOyB0aGUgcHJvYmVzIHdvdWxkIGp1c3QgcmFjZSB0aGUgdGVhcmRvd24uXG4gICAgICBpZiAobW9kdWxlU3RhdGUuaXNEZXZJbnN0YW5jZURpc3Bvc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc2VjdXRpdmVGYWlsZWRQcm9iZUNvdW50ID0gYXdhaXQgaXNEZXZJbnN0YW5jZVJ1bm5pbmcoY2RwVXJsKSA/IDAgOiBjb25zZWN1dGl2ZUZhaWxlZFByb2JlQ291bnQgKyAxO1xuICAgIH1cblxuICAgIGNvbnNvbGUud2FybignVGhlIE9ic2lkaWFuIGluc3RhbmNlIG93bmVkIGJ5IGBucG0gcnVuIGRldmAgd2FzIGNsb3NlZC4gU3RvcHBpbmcgdGhlIGRldmVsb3BtZW50IGJ1aWxkLicpO1xuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHNCQUFzQjtBQUMvQjtBQUFBLEVB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
@@ -0,0 +1,128 @@
1
+ /// <reference path="../library-references.d.mts" />
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';
19
+ import { CliTaskResult } from '@mnaoumov/typescript-dev-toolkit/cli-utils';
20
+ import type { ObsidianPluginBuildContext, ObsidianPluginDeploymentOptions } from './obsidian-plugin-build.mjs';
21
+ import type { ObsidianPluginFeatureOptions } from './obsidian-plugin-features.mjs';
22
+ import { BuildMode } from './obsidian-plugin-build.mjs';
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;