@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,105 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Builds an Obsidian plugin with vite: a vite plugin that turns `vite build` into a library build of
6
+ * `src/main.ts` with the same `main.js` + `styles.css` + `manifest.json` layout the esbuild builder
7
+ * produces, deploys a `vite build --watch` build into the vault, and fills in only the options the
8
+ * consumer's own `vite.config` leaves unset.
9
+ *
10
+ * `vite` is an optional peer dependency and this module only imports its types, so a plugin built with
11
+ * esbuild installs nothing extra.
12
+ */
13
+ import type { ConfigEnv, PluginOption, UserConfig } from 'vite' with { 'resolution-mode': 'import' };
14
+ import type { ObsidianPluginBuildContext, ObsidianPluginDeploymentOptions } from './obsidian-plugin-build.cjs';
15
+ import type { ObsidianPluginFeatureOptions } from './obsidian-plugin-features.cjs';
16
+ import type { PostcssConfig } from './obsidian-plugin-transforms.cjs';
17
+ import { BuildMode } from './obsidian-plugin-build.cjs';
18
+ /**
19
+ * Parameters for {@link getViteFeatureConfig}.
20
+ */
21
+ export interface GetViteFeatureConfigParams {
22
+ /**
23
+ * The build features.
24
+ */
25
+ readonly features: ObsidianPluginFeatureOptions;
26
+ /**
27
+ * Whether this is a production build.
28
+ */
29
+ readonly isProductionBuild: boolean;
30
+ /**
31
+ * The PostCSS plugins of the `styles` option, or `undefined` when it needs none.
32
+ */
33
+ readonly postcssConfig: PostcssConfig | undefined;
34
+ /**
35
+ * The consumer's vite config.
36
+ */
37
+ readonly userConfig: UserConfig;
38
+ }
39
+ /**
40
+ * Options for {@link obsidianPluginVite}.
41
+ */
42
+ export interface ObsidianPluginViteOptions extends ObsidianPluginDeploymentOptions, ObsidianPluginFeatureOptions {
43
+ /**
44
+ * The build mode. Defaults to {@link BuildMode.Development} for `vite build --watch` (or
45
+ * `--mode development`) and {@link BuildMode.Production} otherwise.
46
+ */
47
+ readonly mode?: BuildMode;
48
+ }
49
+ /**
50
+ * Decides the build mode of a vite build from the consumer's config: development for a watch build or for
51
+ * `--mode development`, production otherwise.
52
+ *
53
+ * @param userConfig - The consumer's vite config.
54
+ * @param env - The vite config environment.
55
+ * @returns The build mode.
56
+ */
57
+ export declare function getViteBuildMode(userConfig: UserConfig, env: Pick<ConfigEnv, 'mode'>): BuildMode;
58
+ /**
59
+ * Builds the part of the vite config the plugin contributes: only the options the consumer left unset.
60
+ *
61
+ * @param userConfig - The consumer's vite config.
62
+ * @param buildContext - The build context.
63
+ * @returns The config vite merges into the consumer's.
64
+ */
65
+ export declare function getViteConfigDefaults(userConfig: UserConfig, buildContext: ObsidianPluginBuildContext): UserConfig;
66
+ /**
67
+ * Builds the part of the vite config the build features contribute, each only where the consumer's config left it
68
+ * unset: the framework's compile-time constants (`define`), the automatic JSX runtime for React and Preact
69
+ * (`oxc.jsx`), and the PostCSS plugins of the `styles` option (`css.postcss`).
70
+ *
71
+ * @param params - The {@link GetViteFeatureConfigParams}.
72
+ * @returns The config vite merges into the consumer's.
73
+ */
74
+ export declare function getViteFeatureConfig(params: GetViteFeatureConfigParams): UserConfig;
75
+ /**
76
+ * Creates a vite plugin that builds an Obsidian plugin.
77
+ *
78
+ * What it does, each only when the consumer's config has not said otherwise:
79
+ *
80
+ * - `build.lib` builds `src/main.ts` as one CommonJS `main.js`, with its CSS in `styles.css`.
81
+ * - `build.outDir` is `dist/build` (`dist/dev` in development).
82
+ * - `build.minify` is on in production only, and `build.sourcemap` is inline in development only.
83
+ * - Every asset is inlined, because an Obsidian release ships `main.js` and `styles.css` and nothing else.
84
+ * - Dynamic imports are inlined into `main.js`, and the generated-file banner heads it.
85
+ *
86
+ * And always: Obsidian's own modules (`obsidian`, `electron`, CodeMirror, Lezer) and the Node builtins are
87
+ * external beside the consumer's own `external`, the output folder is emptied once before the first write
88
+ * (`build.emptyOutDir` is turned off, since this plugin does it), every emitted CSS file ends up in
89
+ * `styles.css`, `manifest.json` (and in development `.hotreload`) is copied beside it, and a development
90
+ * build is deployed into the vault named by `OBSIDIAN_CONFIG_FOLDER`.
91
+ *
92
+ * The build features ({@link ObsidianPluginFeatureOptions}):
93
+ *
94
+ * - `framework: 'react' | 'preact'` sets `oxc.jsx` to the automatic runtime (unless set).
95
+ * - `framework: 'solid' | 'svelte'` compiles the components with the toolkit's shared transforms, and `'vue'` adds
96
+ * `unplugin-vue`.
97
+ * - Any framework defines `process.env.NODE_ENV` (and Vue's feature flags), which a library build leaves alone.
98
+ * - `styles.postcss` and `styles.tailwind` set `css.postcss` (unless set); vite scopes `*.module.css` itself, so
99
+ * `styles.cssModules` changes nothing here.
100
+ * - `wasm` imports a `.wasm` module as its bytes.
101
+ *
102
+ * @param options - The {@link ObsidianPluginViteOptions}.
103
+ * @returns The vite plugins, which vite takes as one entry of its `plugins`.
104
+ */
105
+ export declare function obsidianPluginVite(options?: ObsidianPluginViteOptions): PluginOption[];
@@ -0,0 +1,354 @@
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 __defProp = Object.defineProperty;
109
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
110
+ var __getOwnPropNames = Object.getOwnPropertyNames;
111
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
112
+ var __export = (target, all) => {
113
+ for (var name in all)
114
+ __defProp(target, name, { get: all[name], enumerable: true });
115
+ };
116
+ var __copyProps = (to, from, except, desc) => {
117
+ if (from && typeof from === "object" || typeof from === "function") {
118
+ for (let key of __getOwnPropNames(from))
119
+ if (!__hasOwnProp.call(to, key) && key !== except)
120
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
121
+ }
122
+ return to;
123
+ };
124
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
125
+ var webpack_exports = {};
126
+ __export(webpack_exports, {
127
+ ObsidianPluginWebpackPlugin: () => ObsidianPluginWebpackPlugin,
128
+ getWebpackBuildMode: () => getWebpackBuildMode,
129
+ getWebpackFeatureRules: () => getWebpackFeatureRules,
130
+ obsidianPluginWebpackExternals: () => obsidianPluginWebpackExternals
131
+ });
132
+ module.exports = __toCommonJS(webpack_exports);
133
+ var import_object_utils = require('@mnaoumov/typescript-lib/object-utils');
134
+ var import_path = require('@mnaoumov/typescript-lib/path');
135
+ var import_node_url = require('node:url');
136
+ var import_obsidian_plugin_repo_paths = require('../obsidian-plugin-repo-paths.cjs');
137
+ var import_obsidian_plugin_build = require('./obsidian-plugin-build.cjs');
138
+ var import_obsidian_plugin_features = require('./obsidian-plugin-features.cjs');
139
+ var import_obsidian_plugins_folder_deployment = require('./obsidian-plugins-folder-deployment.cjs');
140
+ var __import_meta_url = globalThis["import.meta.url"] ?? (function getObsidianCjsImportMetaUrl() {
141
+ if (typeof __filename === "string") {
142
+ const localRequire = require;
143
+ const url = localRequire("node:url");
144
+ if (typeof url.pathToFileURL === "function") {
145
+ return url.pathToFileURL(__filename).href;
146
+ }
147
+ }
148
+ return typeof window === "undefined" ? "" : activeWindow.location.href;
149
+ })();
150
+ const PLUGIN_NAME = "ObsidianPluginWebpackPlugin";
151
+ const MINI_CSS_EXTRACT_PLUGIN = "mini-css-extract-plugin";
152
+ class ObsidianPluginWebpackPlugin {
153
+ /**
154
+ * Creates the plugin.
155
+ *
156
+ * @param options - The {@link ObsidianPluginWebpackPluginOptions}.
157
+ */
158
+ constructor(options = {}) {
159
+ this.options = options;
160
+ }
161
+ options;
162
+ /* v8 ignore start -- Webpack hooks; exercised by the bundler integration test against a real webpack build. */
163
+ /**
164
+ * Applies the plugin to a webpack compiler.
165
+ *
166
+ * @param compiler - The webpack compiler.
167
+ */
168
+ apply(compiler) {
169
+ const mode = this.options.mode ?? getWebpackBuildMode(compiler.options);
170
+ applyWebpackOptionDefaults(compiler.options, mode);
171
+ applyWebpackFeatures(compiler, this.options, mode === import_obsidian_plugin_build.BuildMode.Production);
172
+ new compiler.webpack.BannerPlugin({
173
+ banner: (0, import_obsidian_plugin_build.getObsidianPluginBanner)("webpack"),
174
+ raw: true,
175
+ stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_REPORT,
176
+ test: /\.js$/u
177
+ }).apply(compiler);
178
+ const buildContextPromise = (0, import_obsidian_plugin_build.resolveObsidianPluginBuildContext)({
179
+ ...this.options,
180
+ ...compiler.options.output.path !== void 0 && { distFolder: compiler.options.output.path },
181
+ mode
182
+ });
183
+ let isDistFolderCleaned = false;
184
+ async function prepare() {
185
+ const buildContext = await buildContextPromise;
186
+ if (isDistFolderCleaned) {
187
+ return;
188
+ }
189
+ isDistFolderCleaned = true;
190
+ await (0, import_obsidian_plugin_build.cleanObsidianPluginDistFolder)(buildContext.distFolder);
191
+ }
192
+ compiler.hooks.beforeRun.tapPromise(PLUGIN_NAME, prepare);
193
+ compiler.hooks.watchRun.tapPromise(PLUGIN_NAME, prepare);
194
+ compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
195
+ compilation.hooks.processAssets.tap(
196
+ { name: PLUGIN_NAME, stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE },
197
+ () => {
198
+ renameWebpackCssAssets(compilation, compiler);
199
+ inlineExtractedLicenses(compilation, compiler);
200
+ }
201
+ );
202
+ });
203
+ compiler.hooks.afterEmit.tapPromise(PLUGIN_NAME, async (compilation) => {
204
+ if (compilation.getStats().hasErrors()) {
205
+ return;
206
+ }
207
+ const buildContext = await buildContextPromise;
208
+ await (0, import_obsidian_plugin_build.completeObsidianPluginDistFolder)(buildContext);
209
+ await (0, import_obsidian_plugins_folder_deployment.deployToObsidianPluginsFolder)(buildContext);
210
+ });
211
+ }
212
+ /* v8 ignore stop */
213
+ }
214
+ function getWebpackBuildMode(options) {
215
+ return options.watch || options.mode === "development" ? import_obsidian_plugin_build.BuildMode.Development : import_obsidian_plugin_build.BuildMode.Production;
216
+ }
217
+ function getWebpackFeatureRules(params) {
218
+ const { cssLoaderPath, features, isProductionBuild, loaderPath, miniCssExtractLoaderPath } = params;
219
+ const rules = [];
220
+ function featureLoader(kind, styles) {
221
+ const options = { isProductionBuild, kind, ...styles && { styles } };
222
+ return [{ loader: loaderPath, options }];
223
+ }
224
+ switch (features.framework) {
225
+ case "solid": {
226
+ rules.push({ enforce: "pre", test: /\.[jt]sx$/iu, use: featureLoader("jsx") });
227
+ break;
228
+ }
229
+ case "svelte": {
230
+ rules.push(
231
+ { test: /\.svelte$/iu, use: featureLoader("svelte") },
232
+ { enforce: "pre", test: /\.svelte\.[cm]?[jt]s$/iu, use: featureLoader("svelte") }
233
+ );
234
+ break;
235
+ }
236
+ case "vue": {
237
+ rules.push({ enforce: "post", test: /\.vue(?:\?|%3F).*lang\.ts$/iu, use: featureLoader("typescript") });
238
+ break;
239
+ }
240
+ default: {
241
+ break;
242
+ }
243
+ }
244
+ if (features.wasm) {
245
+ rules.push({ test: /\.wasm$/iu, type: "javascript/auto", use: featureLoader("wasm") });
246
+ }
247
+ if (features.styles) {
248
+ rules.push({
249
+ test: /\.p?css$/iu,
250
+ use: [
251
+ miniCssExtractLoaderPath,
252
+ {
253
+ loader: cssLoaderPath,
254
+ options: {
255
+ importLoaders: 1,
256
+ modules: features.styles.cssModules ? { auto: true, namedExport: false } : false
257
+ }
258
+ },
259
+ ...(0, import_obsidian_plugin_features.isPostcssNeeded)(features.styles) ? featureLoader("stylesheet", features.styles) : []
260
+ ]
261
+ });
262
+ }
263
+ return rules;
264
+ }
265
+ function obsidianPluginWebpackExternals(data, callback) {
266
+ if (data.request !== void 0 && (0, import_obsidian_plugin_build.isObsidianPluginExternal)(data.request)) {
267
+ callback(null, `commonjs2 ${data.request}`);
268
+ return;
269
+ }
270
+ callback();
271
+ }
272
+ function applyWebpackFeatures(compiler, features, isProductionBuild) {
273
+ let miniCssExtractLoaderPath = "";
274
+ let cssLoaderPath = "";
275
+ if (features.styles) {
276
+ const stylesFeature = "styles";
277
+ cssLoaderPath = (0, import_obsidian_plugin_features.resolveOptionalPeer)({ feature: stylesFeature, packageName: "css-loader" });
278
+ const MiniCssExtractPlugin = (0, import_object_utils.extractDefaultExportInterop)(
279
+ (0, import_obsidian_plugin_features.requireOptionalPeer)({ feature: stylesFeature, packageName: MINI_CSS_EXTRACT_PLUGIN })
280
+ );
281
+ miniCssExtractLoaderPath = MiniCssExtractPlugin.loader;
282
+ const hasMiniCssExtractPlugin = compiler.options.plugins.some((plugin) => plugin.constructor.name === "MiniCssExtractPlugin");
283
+ if (!hasMiniCssExtractPlugin) {
284
+ new MiniCssExtractPlugin().apply(compiler);
285
+ }
286
+ }
287
+ const loaderPath = (0, import_node_url.fileURLToPath)(new URL(`obsidian-plugin-webpack-loader${(0, import_path.extname)((0, import_node_url.fileURLToPath)(__import_meta_url))}`, __import_meta_url));
288
+ compiler.options.module.rules.push(...getWebpackFeatureRules({ cssLoaderPath, features, isProductionBuild, loaderPath, miniCssExtractLoaderPath }));
289
+ if (features.framework !== "vue") {
290
+ return;
291
+ }
292
+ const unpluginVue = (0, import_object_utils.extractDefaultExportInterop)(
293
+ (0, import_obsidian_plugin_features.requireOptionalPeer)({ feature: "framework: 'vue'", packageName: "unplugin-vue", specifier: "unplugin-vue/webpack" })
294
+ );
295
+ unpluginVue().apply(compiler);
296
+ const { "process.env.NODE_ENV": _nodeEnv, ...vueFlags } = (0, import_obsidian_plugin_features.getFrameworkDefines)({ framework: features.framework, isProductionBuild });
297
+ new compiler.webpack.DefinePlugin(vueFlags).apply(compiler);
298
+ }
299
+ function applyWebpackOptionDefaults(options, mode) {
300
+ const isProductionBuild = mode === import_obsidian_plugin_build.BuildMode.Production;
301
+ options.mode ??= isProductionBuild ? "production" : "development";
302
+ options.target ??= "node";
303
+ options.devtool ??= !isProductionBuild && "inline-source-map";
304
+ if (typeof options.entry === "object" && Object.keys(options.entry).length === 1 && options.entry["main"]?.import === void 0) {
305
+ options.entry = { main: { import: [(0, import_obsidian_plugin_build.getObsidianPluginEntryPoint)()] } };
306
+ }
307
+ options.output.path ??= (0, import_obsidian_plugin_build.getObsidianPluginDistFolder)(mode);
308
+ options.output.filename ??= import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.MainJs;
309
+ options.output.library ??= { type: "commonjs2" };
310
+ options.output.asyncChunks ??= false;
311
+ options.resolve.conditionNames ??= ["browser", "webpack", isProductionBuild ? "production" : "development", "module", "import", "require"];
312
+ const userExternals = options.externals;
313
+ options.externals = [obsidianPluginWebpackExternals, ...Array.isArray(userExternals) ? userExternals : [userExternals]];
314
+ }
315
+ function inlineExtractedLicenses(compilation, compiler) {
316
+ const LICENSE_SUFFIX = ".LICENSE.txt";
317
+ for (const licenseAsset of compilation.getAssets()) {
318
+ if (!licenseAsset.name.endsWith(LICENSE_SUFFIX)) {
319
+ continue;
320
+ }
321
+ const sourceFileName = licenseAsset.name.slice(0, -LICENSE_SUFFIX.length);
322
+ const sourceAsset = compilation.getAsset(sourceFileName);
323
+ if (!sourceAsset) {
324
+ continue;
325
+ }
326
+ const licenseFileName = licenseAsset.name.split("/").at(-1) ?? licenseAsset.name;
327
+ const reference = `/*! For license information please see ${licenseFileName} */`;
328
+ const source = sourceAsset.source.source().toString();
329
+ const licenses = licenseAsset.source.source().toString().trimEnd();
330
+ const updatedSource = source.includes(reference) ? source.replace(reference, () => licenses) : `${licenses}
331
+ ${source}`;
332
+ compilation.updateAsset(sourceFileName, new compiler.webpack.sources.RawSource(updatedSource));
333
+ compilation.deleteAsset(licenseAsset.name);
334
+ }
335
+ }
336
+ function renameWebpackCssAssets(compilation, compiler) {
337
+ const cssAssets = compilation.getAssets().filter((asset) => (0, import_obsidian_plugin_build.isCssFileName)(asset.name)).map((asset) => ({ fileName: asset.name, source: asset.source.source().toString() }));
338
+ const { fileNamesToRemove, stylesCss } = (0, import_obsidian_plugin_build.mergeCssAssets)(cssAssets);
339
+ if (stylesCss === void 0) {
340
+ return;
341
+ }
342
+ for (const fileName of fileNamesToRemove) {
343
+ compilation.deleteAsset(fileName);
344
+ }
345
+ compilation.emitAsset(import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.StylesCss, new compiler.webpack.sources.RawSource(stylesCss));
346
+ }
347
+ // Annotate the CommonJS export names for ESM import in node:
348
+ 0 && (module.exports = {
349
+ ObsidianPluginWebpackPlugin,
350
+ getWebpackBuildMode,
351
+ getWebpackFeatureRules,
352
+ obsidianPluginWebpackExternals
353
+ });
354
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy93ZWJwYWNrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2ltcG9ydF9tZXRhX3VybCA9IGdsb2JhbFRoaXNbJ2ltcG9ydC5tZXRhLnVybCddID8/IChmdW5jdGlvbiBnZXRPYnNpZGlhbkNqc0ltcG9ydE1ldGFVcmwoKSB7XG4gIGlmICh0eXBlb2YgX19maWxlbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBsb2NhbFJlcXVpcmUgPSByZXF1aXJlO1xuICAgIGNvbnN0IHVybCA9IGxvY2FsUmVxdWlyZSgnbm9kZTp1cmwnKTtcbiAgICBpZiAodHlwZW9mIHVybC5wYXRoVG9GaWxlVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdXJsLnBhdGhUb0ZpbGVVUkwoX19maWxlbmFtZSkuaHJlZjtcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGVudmlyb25tZW50IGlzIHVua25vd25cbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gJycgOiBhY3RpdmVXaW5kb3cubG9jYXRpb24uaHJlZjtcbn0pKCk7XG4vKipcbiAqIEBmaWxlXG4gKlxuICogQnVpbGRzIGFuIE9ic2lkaWFuIHBsdWdpbiB3aXRoIHdlYnBhY2s6IGEgd2VicGFjayBwbHVnaW4gdGhhdCBnaXZlcyBhIGJ1aWxkIHRoZSBzYW1lIGBtYWluLmpzYCArXG4gKiBgc3R5bGVzLmNzc2AgKyBgbWFuaWZlc3QuanNvbmAgbGF5b3V0IHRoZSBlc2J1aWxkIGJ1aWxkZXIgcHJvZHVjZXMsIGRlcGxveXMgYSB3YXRjaCBidWlsZCBpbnRvIHRoZSB2YXVsdCxcbiAqIGFuZCBmaWxscyBpbiBvbmx5IHRoZSBvcHRpb25zIHRoZSBjb25zdW1lcidzIG93biBgd2VicGFjay5jb25maWdgIGxlYXZlcyB1bnNldC5cbiAqXG4gKiBgd2VicGFja2AgaXMgYW4gb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5LiBUaGlzIG1vZHVsZSBvbmx5IGltcG9ydHMgaXRzIHR5cGVzIGFuZCByZWFjaGVzIHdlYnBhY2snc1xuICogY2xhc3NlcyB0aHJvdWdoIGBjb21waWxlci53ZWJwYWNrYCwgc28gYSBwbHVnaW4gYnVpbHQgd2l0aCBlc2J1aWxkIGluc3RhbGxzIG5vdGhpbmcgZXh0cmEuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDb21waWxhdGlvbixcbiAgQ29tcGlsZXIsXG4gIFJ1bGVTZXRSdWxlLFxuICBSdWxlU2V0VXNlSXRlbSxcbiAgV2VicGFja09wdGlvbnNOb3JtYWxpemVkLFxuICBXZWJwYWNrUGx1Z2luSW5zdGFuY2Vcbn0gZnJvbSAnd2VicGFjayc7XG5cbmltcG9ydCB7IGV4dHJhY3REZWZhdWx0RXhwb3J0SW50ZXJvcCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHsgZXh0bmFtZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5QbHVnaW5EZXBsb3ltZW50T3B0aW9ucyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucyxcbiAgT2JzaWRpYW5QbHVnaW5TdHlsZXNPcHRpb25zXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5QbHVnaW5XZWJwYWNrTG9hZGVyT3B0aW9ucyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLXdlYnBhY2stbG9hZGVyLnRzJztcblxuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuLi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBCdWlsZE1vZGUsXG4gIGNsZWFuT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBjb21wbGV0ZU9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcixcbiAgZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIsXG4gIGdldE9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcixcbiAgZ2V0T2JzaWRpYW5QbHVnaW5FbnRyeVBvaW50LFxuICBpc0Nzc0ZpbGVOYW1lLFxuICBpc09ic2lkaWFuUGx1Z2luRXh0ZXJuYWwsXG4gIG1lcmdlQ3NzQXNzZXRzLFxuICByZXNvbHZlT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHRcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tYnVpbGQudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RnJhbWV3b3JrRGVmaW5lcyxcbiAgaXNQb3N0Y3NzTmVlZGVkLFxuICByZXF1aXJlT3B0aW9uYWxQZWVyLFxuICByZXNvbHZlT3B0aW9uYWxQZWVyXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB7IGRlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW5zLWZvbGRlci1kZXBsb3ltZW50LnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0V2VicGFja0ZlYXR1cmVSdWxlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0V2VicGFja0ZlYXR1cmVSdWxlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiBgY3NzLWxvYWRlcmAsIGZvciB0aGUgc3R5bGVzaGVldCBydWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgY3NzTG9hZGVyUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgZmVhdHVyZXMuXG4gICAqL1xuICByZWFkb25seSBmZWF0dXJlczogT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucztcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGlzIGEgcHJvZHVjdGlvbiBidWlsZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzUHJvZHVjdGlvbkJ1aWxkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgdG9vbGtpdCdzIG93biBsb2FkZXIuXG4gICAqL1xuICByZWFkb25seSBsb2FkZXJQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIGBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbmAncyBsb2FkZXIsIGZvciB0aGUgc3R5bGVzaGVldCBydWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgbWluaUNzc0V4dHJhY3RMb2FkZXJQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIE9ic2lkaWFuUGx1Z2luV2VicGFja1BsdWdpbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5QbHVnaW5XZWJwYWNrUGx1Z2luT3B0aW9ucyBleHRlbmRzIE9ic2lkaWFuUGx1Z2luRGVwbG95bWVudE9wdGlvbnMsIE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGJ1aWxkIG1vZGUuIERlZmF1bHRzIHRvIHtAbGluayBCdWlsZE1vZGUuRGV2ZWxvcG1lbnR9IHdoZW4gd2VicGFjayB3YXRjaGVzIChgd2VicGFjayAtLXdhdGNoYCkgb3JcbiAgICogaXRzIGBtb2RlYCBpcyBgZGV2ZWxvcG1lbnRgLCBhbmQge0BsaW5rIEJ1aWxkTW9kZS5Qcm9kdWN0aW9ufSBvdGhlcndpc2UuXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogQnVpbGRNb2RlO1xufVxuXG4vKipcbiAqIFRoZSBjYWxsYmFjayB3ZWJwYWNrJ3MgZnVuY3Rpb24gZm9ybSBvZiBgZXh0ZXJuYWxzYCB0YWtlcy5cbiAqL1xudHlwZSBFeHRlcm5hbHNDYWxsYmFjayA9IChlcnJvcj86IEVycm9yIHwgbnVsbCwgcmVzdWx0Pzogc3RyaW5nKSA9PiB2b2lkO1xuXG4vKipcbiAqIFRoZSBhcmd1bWVudCB3ZWJwYWNrJ3MgZnVuY3Rpb24gZm9ybSBvZiBgZXh0ZXJuYWxzYCByZWNlaXZlcy5cbiAqL1xuaW50ZXJmYWNlIEV4dGVybmFsc0RhdGEge1xuICByZWFkb25seSByZXF1ZXN0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5gIGNsYXNzLlxuICovXG5pbnRlcmZhY2UgTWluaUNzc0V4dHJhY3RQbHVnaW5DbGFzcyB7XG4gIHJlYWRvbmx5IGxvYWRlcjogc3RyaW5nO1xuICBuZXcgKCk6IFdlYnBhY2tQbHVnaW5JbnN0YW5jZTtcbn1cblxuLyoqXG4gKiBUaGUgcGFydCBvZiBgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5gIHRoZSBhZGFwdGVyIHVzZXMuXG4gKi9cbmludGVyZmFjZSBNaW5pQ3NzRXh0cmFjdFBsdWdpbk1vZHVsZSB7XG4gIHJlYWRvbmx5IGRlZmF1bHQ6IE1pbmlDc3NFeHRyYWN0UGx1Z2luQ2xhc3M7XG59XG5cbi8qKlxuICogVGhlIHBhcnQgb2YgYHVucGx1Z2luLXZ1ZS93ZWJwYWNrYCB0aGUgYWRhcHRlciB1c2VzLlxuICovXG5pbnRlcmZhY2UgVW5wbHVnaW5WdWVXZWJwYWNrTW9kdWxlIHtcbiAgcmVhZG9ubHkgZGVmYXVsdDogKCkgPT4gV2VicGFja1BsdWdpbkluc3RhbmNlO1xufVxuXG5jb25zdCBQTFVHSU5fTkFNRSA9ICdPYnNpZGlhblBsdWdpbldlYnBhY2tQbHVnaW4nO1xuY29uc3QgTUlOSV9DU1NfRVhUUkFDVF9QTFVHSU4gPSAnbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4nO1xuXG4vKipcbiAqIEEgd2VicGFjayBwbHVnaW4gdGhhdCBidWlsZHMgYW4gT2JzaWRpYW4gcGx1Z2luLlxuICpcbiAqIFdoYXQgaXQgZG9lcywgZWFjaCBvbmx5IHdoZW4gdGhlIGNvbnN1bWVyJ3MgY29uZmlnIGhhcyBub3Qgc2FpZCBvdGhlcndpc2U6XG4gKlxuICogLSBgZW50cnlgIGlzIGBzcmMvbWFpbi50c2AsIGFuZCBgbW9kZWAgZm9sbG93cyB0aGUgYnVpbGQgbW9kZS5cbiAqIC0gVGhlIG91dHB1dCBpcyBvbmUgQ29tbW9uSlMgKGBjb21tb25qczJgKSBgbWFpbi5qc2AgaW4gYGRpc3QvYnVpbGRgIChgZGlzdC9kZXZgIGluIGRldmVsb3BtZW50KSwgd2l0aCBub1xuICogICBhc3luYyBjaHVua3MsIHNvIGEgZHluYW1pYyBpbXBvcnQgY2Fubm90IGJlY29tZSBhIHNpYmxpbmcgZmlsZS5cbiAqIC0gYHRhcmdldGAgaXMgYG5vZGVgLCB3aGljaCBpcyB3aGF0IE9ic2lkaWFuJ3MgcmVuZGVyZXIgcnVucywgc28gTm9kZSBidWlsdGlucyByZXNvbHZlLCB3aGlsZSB0aGUgZXhwb3J0XG4gKiAgIGNvbmRpdGlvbnMgYXJlIHRoZSBicm93c2VyJ3MgKGBicm93c2VyYCwgYHdlYnBhY2tgLCB0aGUgbW9kZSwgYG1vZHVsZWAsIGBpbXBvcnRgLCBgcmVxdWlyZWAsIGFuZCBuZXZlciBgbm9kZWApLFxuICogICBzbyBwYWNrYWdlcyBoYW5kIG92ZXIgdGhlaXIgYnJvd3NlciBidWlsZHMsIGFzIG9uIG1vYmlsZSB0aGV5IG11c3QuXG4gKiAtIGBkZXZ0b29sYCBpcyBhbiBpbmxpbmUgc291cmNlIG1hcCBpbiBkZXZlbG9wbWVudCBvbmx5LlxuICpcbiAqIEFuZCBhbHdheXM6IE9ic2lkaWFuJ3Mgb3duIG1vZHVsZXMgKGBvYnNpZGlhbmAsIGBlbGVjdHJvbmAsIENvZGVNaXJyb3IsIExlemVyKSBhbmQgdGhlIE5vZGUgYnVpbHRpbnMgYXJlXG4gKiBleHRlcm5hbCBiZXNpZGUgdGhlIGNvbnN1bWVyJ3Mgb3duIGBleHRlcm5hbHNgLCB0aGUgZ2VuZXJhdGVkLWZpbGUgYmFubmVyIGhlYWRzIGBtYWluLmpzYCwgbGljZW5zZVxuICogY29tbWVudHMgYSBtaW5pbWl6ZXIgZXh0cmFjdGVkIGludG8gYG1haW4uanMuTElDRU5TRS50eHRgICh3aGljaCBubyBPYnNpZGlhbiByZWxlYXNlIHNoaXBzKSBhcmUgcHV0IGJhY2tcbiAqIGludG8gYG1haW4uanNgLCB0aGUgb3V0cHV0IGZvbGRlciBpcyBlbXB0aWVkIGJlZm9yZSB0aGUgZmlyc3QgYnVpbGQsIGV2ZXJ5IGVtaXR0ZWQgQ1NTIGZpbGUgZW5kcyB1cCBpblxuICogYHN0eWxlcy5jc3NgLCBgbWFuaWZlc3QuanNvbmAgKGFuZCBpbiBkZXZlbG9wbWVudCBgLmhvdHJlbG9hZGApIGlzIGNvcGllZCBiZXNpZGUgaXQsIGFuZCBhIGRldmVsb3BtZW50XG4gKiBidWlsZCBpcyBkZXBsb3llZCBpbnRvIHRoZSB2YXVsdCBuYW1lZCBieSBgT0JTSURJQU5fQ09ORklHX0ZPTERFUmAuXG4gKlxuICogVHlwZVNjcmlwdCBzdGF5cyB0aGUgY29uc3VtZXIncyBjaG9pY2Ugb2YgbG9hZGVyLCBhcyBpdCB3b3VsZCBiZSB3aXRob3V0IHRoaXMgcGx1Z2luLiBUaGUgYnVpbGQgZmVhdHVyZXNcbiAqICh7QGxpbmsgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9uc30pIGFyZSB0aGUgcGx1Z2luJ3M6XG4gKlxuICogLSBgZnJhbWV3b3JrOiAncmVhY3QnIHwgJ3ByZWFjdCdgIG5lZWRzIG5vdGhpbmcgaGVyZTogdGhlIFR5cGVTY3JpcHQgbG9hZGVyIHJlYWRzIHRoZSBhdXRvbWF0aWMgSlNYIHJ1bnRpbWUgZnJvbSB0aGVcbiAqICAgdG9vbGtpdCdzIHRzY29uZmlnIHByZXNldCwgYW5kIHdlYnBhY2sncyBgbW9kZWAgZGVmaW5lcyBgcHJvY2Vzcy5lbnYuTk9ERV9FTlZgLlxuICogLSBgZnJhbWV3b3JrOiAnc29saWQnIHwgJ3N2ZWx0ZSdgIGFkZHMgcnVsZXMgdGhhdCBjb21waWxlIHRoZSBjb21wb25lbnRzIHdpdGggdGhlIHRvb2xraXQncyBzaGFyZWQgdHJhbnNmb3JtcywgYW5kXG4gKiAgIGAndnVlJ2AgYXBwbGllcyBgdW5wbHVnaW4tdnVlYCBhbmQgZGVmaW5lcyBWdWUncyBmZWF0dXJlIGZsYWdzLlxuICogLSBgc3R5bGVzYCBhZGRzIHRoZSBvbmUgcnVsZSBldmVyeSBzdHlsZXNoZWV0IGdvZXMgdGhyb3VnaCAoUG9zdENTUyBhbmQgVGFpbHdpbmQsIHRoZW4gYGNzcy1sb2FkZXJgLCBzY29waW5nXG4gKiAgIGAqLm1vZHVsZS5jc3NgIG9ubHkgd2l0aCBgY3NzTW9kdWxlc2AsIHRoZW4gYG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luYCksIGFuZCBhcHBsaWVzIGBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbmBcbiAqICAgdW5sZXNzIHRoZSBjb25maWcgYWxyZWFkeSBkb2VzOyBsZWF2ZSB5b3VyIG93biBgLmNzc2AgcnVsZSBvdXQuIGBzdHlsZXM6IHt9YCBjb21waWxlcyBwbGFpbiBDU1MuXG4gKiAtIGB3YXNtYCBpbXBvcnRzIGEgYC53YXNtYCBtb2R1bGUgYXMgaXRzIGJ5dGVzLlxuICovXG5leHBvcnQgY2xhc3MgT2JzaWRpYW5QbHVnaW5XZWJwYWNrUGx1Z2luIGltcGxlbWVudHMgV2VicGFja1BsdWdpbkluc3RhbmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHBsdWdpbi5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIE9ic2lkaWFuUGx1Z2luV2VicGFja1BsdWdpbk9wdGlvbnN9LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogT2JzaWRpYW5QbHVnaW5XZWJwYWNrUGx1Z2luT3B0aW9ucyA9IHt9KSB7fVxuXG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBXZWJwYWNrIGhvb2tzOyBleGVyY2lzZWQgYnkgdGhlIGJ1bmRsZXIgaW50ZWdyYXRpb24gdGVzdCBhZ2FpbnN0IGEgcmVhbCB3ZWJwYWNrIGJ1aWxkLiAqL1xuICAvKipcbiAgICogQXBwbGllcyB0aGUgcGx1Z2luIHRvIGEgd2VicGFjayBjb21waWxlci5cbiAgICpcbiAgICogQHBhcmFtIGNvbXBpbGVyIC0gVGhlIHdlYnBhY2sgY29tcGlsZXIuXG4gICAqL1xuICBwdWJsaWMgYXBwbHkoY29tcGlsZXI6IENvbXBpbGVyKTogdm9pZCB7XG4gICAgY29uc3QgbW9kZSA9IHRoaXMub3B0aW9ucy5tb2RlID8/IGdldFdlYnBhY2tCdWlsZE1vZGUoY29tcGlsZXIub3B0aW9ucyk7XG4gICAgYXBwbHlXZWJwYWNrT3B0aW9uRGVmYXVsdHMoY29tcGlsZXIub3B0aW9ucywgbW9kZSk7XG4gICAgYXBwbHlXZWJwYWNrRmVhdHVyZXMoY29tcGlsZXIsIHRoaXMub3B0aW9ucywgbW9kZSA9PT0gQnVpbGRNb2RlLlByb2R1Y3Rpb24pO1xuICAgIC8vIEFkZGVkIGF0IHRoZSByZXBvcnQgc3RhZ2UsIGFmdGVyIG1pbmlmaWNhdGlvbiwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHN0cmlwIGl0IGFzIGFuIG9yZGluYXJ5IGNvbW1lbnQuXG4gICAgbmV3IGNvbXBpbGVyLndlYnBhY2suQmFubmVyUGx1Z2luKHtcbiAgICAgIGJhbm5lcjogZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIoJ3dlYnBhY2snKSxcbiAgICAgIHJhdzogdHJ1ZSxcbiAgICAgIHN0YWdlOiBjb21waWxlci53ZWJwYWNrLkNvbXBpbGF0aW9uLlBST0NFU1NfQVNTRVRTX1NUQUdFX1JFUE9SVCxcbiAgICAgIHRlc3Q6IC9cXC5qcyQvdVxuICAgIH0pLmFwcGx5KGNvbXBpbGVyKTtcblxuICAgIGNvbnN0IGJ1aWxkQ29udGV4dFByb21pc2UgPSByZXNvbHZlT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQoe1xuICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgLi4uKGNvbXBpbGVyLm9wdGlvbnMub3V0cHV0LnBhdGggIT09IHVuZGVmaW5lZCAmJiB7IGRpc3RGb2xkZXI6IGNvbXBpbGVyLm9wdGlvbnMub3V0cHV0LnBhdGggfSksXG4gICAgICBtb2RlXG4gICAgfSk7XG4gICAgbGV0IGlzRGlzdEZvbGRlckNsZWFuZWQgPSBmYWxzZTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIHByZXBhcmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBidWlsZENvbnRleHQgPSBhd2FpdCBidWlsZENvbnRleHRQcm9taXNlO1xuICAgICAgaWYgKGlzRGlzdEZvbGRlckNsZWFuZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaXNEaXN0Rm9sZGVyQ2xlYW5lZCA9IHRydWU7XG4gICAgICBhd2FpdCBjbGVhbk9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihidWlsZENvbnRleHQuZGlzdEZvbGRlcik7XG4gICAgfVxuICAgIGNvbXBpbGVyLmhvb2tzLmJlZm9yZVJ1bi50YXBQcm9taXNlKFBMVUdJTl9OQU1FLCBwcmVwYXJlKTtcbiAgICBjb21waWxlci5ob29rcy53YXRjaFJ1bi50YXBQcm9taXNlKFBMVUdJTl9OQU1FLCBwcmVwYXJlKTtcblxuICAgIGNvbXBpbGVyLmhvb2tzLnRoaXNDb21waWxhdGlvbi50YXAoUExVR0lOX05BTUUsIChjb21waWxhdGlvbikgPT4ge1xuICAgICAgY29tcGlsYXRpb24uaG9va3MucHJvY2Vzc0Fzc2V0cy50YXAoXG4gICAgICAgIHsgbmFtZTogUExVR0lOX05BTUUsIHN0YWdlOiBjb21waWxlci53ZWJwYWNrLkNvbXBpbGF0aW9uLlBST0NFU1NfQVNTRVRTX1NUQUdFX1NVTU1BUklaRSB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgcmVuYW1lV2VicGFja0Nzc0Fzc2V0cyhjb21waWxhdGlvbiwgY29tcGlsZXIpO1xuICAgICAgICAgIGlubGluZUV4dHJhY3RlZExpY2Vuc2VzKGNvbXBpbGF0aW9uLCBjb21waWxlcik7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb21waWxlci5ob29rcy5hZnRlckVtaXQudGFwUHJvbWlzZShQTFVHSU5fTkFNRSwgYXN5bmMgKGNvbXBpbGF0aW9uKSA9PiB7XG4gICAgICBpZiAoY29tcGlsYXRpb24uZ2V0U3RhdHMoKS5oYXNFcnJvcnMoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBidWlsZENvbnRleHQgPSBhd2FpdCBidWlsZENvbnRleHRQcm9taXNlO1xuICAgICAgYXdhaXQgY29tcGxldGVPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIoYnVpbGRDb250ZXh0KTtcbiAgICAgIGF3YWl0IGRlcGxveVRvT2JzaWRpYW5QbHVnaW5zRm9sZGVyKGJ1aWxkQ29udGV4dCk7XG4gICAgfSk7XG4gIH1cbiAgLyogdjggaWdub3JlIHN0b3AgKi9cbn1cblxuLyoqXG4gKiBEZWNpZGVzIHRoZSBidWlsZCBtb2RlIG9mIGEgd2VicGFjayBidWlsZCBmcm9tIHRoZSBjb25zdW1lcidzIGNvbmZpZzogZGV2ZWxvcG1lbnQgd2hlbiB3ZWJwYWNrIHdhdGNoZXNcbiAqIG9yIGl0cyBgbW9kZWAgaXMgYGRldmVsb3BtZW50YCwgcHJvZHVjdGlvbiBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgbm9ybWFsaXplZCB3ZWJwYWNrIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgYnVpbGQgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYnBhY2tCdWlsZE1vZGUob3B0aW9uczogUGljazxXZWJwYWNrT3B0aW9uc05vcm1hbGl6ZWQsICdtb2RlJyB8ICd3YXRjaCc+KTogQnVpbGRNb2RlIHtcbiAgcmV0dXJuIG9wdGlvbnMud2F0Y2ggfHwgb3B0aW9ucy5tb2RlID09PSAnZGV2ZWxvcG1lbnQnID8gQnVpbGRNb2RlLkRldmVsb3BtZW50IDogQnVpbGRNb2RlLlByb2R1Y3Rpb247XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBtb2R1bGUgcnVsZXMgdGhlIGJ1aWxkIGZlYXR1cmVzIGFkZCwgZWFjaCBydW5uaW5nIHRoZSB0b29sa2l0J3Mgb3duIGxvYWRlcjogU29saWQncyBKU1ggYmVmb3JlIHRoZVxuICogcHJvamVjdCdzIFR5cGVTY3JpcHQgbG9hZGVyLCBTdmVsdGUgY29tcG9uZW50cyBhbmQgbW9kdWxlcywgYC53YXNtYCBtb2R1bGVzIGFzIEphdmFTY3JpcHQsIGFuZCB3aXRoIGBzdHlsZXNgIHRoZVxuICogc3R5bGVzaGVldCBydWxlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEdldFdlYnBhY2tGZWF0dXJlUnVsZXNQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHJ1bGVzLCBlbXB0eSB3aGVuIG5vIGZlYXR1cmUgbmVlZHMgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2VicGFja0ZlYXR1cmVSdWxlcyhwYXJhbXM6IEdldFdlYnBhY2tGZWF0dXJlUnVsZXNQYXJhbXMpOiBSdWxlU2V0UnVsZVtdIHtcbiAgY29uc3QgeyBjc3NMb2FkZXJQYXRoLCBmZWF0dXJlcywgaXNQcm9kdWN0aW9uQnVpbGQsIGxvYWRlclBhdGgsIG1pbmlDc3NFeHRyYWN0TG9hZGVyUGF0aCB9ID0gcGFyYW1zO1xuICBjb25zdCBydWxlczogUnVsZVNldFJ1bGVbXSA9IFtdO1xuXG4gIGZ1bmN0aW9uIGZlYXR1cmVMb2FkZXIoa2luZDogT2JzaWRpYW5QbHVnaW5XZWJwYWNrTG9hZGVyT3B0aW9uc1sna2luZCddLCBzdHlsZXM/OiBPYnNpZGlhblBsdWdpblN0eWxlc09wdGlvbnMpOiBSdWxlU2V0VXNlSXRlbVtdIHtcbiAgICBjb25zdCBvcHRpb25zOiBPYnNpZGlhblBsdWdpbldlYnBhY2tMb2FkZXJPcHRpb25zID0geyBpc1Byb2R1Y3Rpb25CdWlsZCwga2luZCwgLi4uKHN0eWxlcyAmJiB7IHN0eWxlcyB9KSB9O1xuICAgIHJldHVybiBbeyBsb2FkZXI6IGxvYWRlclBhdGgsIG9wdGlvbnMgfV07XG4gIH1cblxuICBzd2l0Y2ggKGZlYXR1cmVzLmZyYW1ld29yaykge1xuICAgIGNhc2UgJ3NvbGlkJzoge1xuICAgICAgcnVsZXMucHVzaCh7IGVuZm9yY2U6ICdwcmUnLCB0ZXN0OiAvXFwuW2p0XXN4JC9pdSwgdXNlOiBmZWF0dXJlTG9hZGVyKCdqc3gnKSB9KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdzdmVsdGUnOiB7XG4gICAgICBydWxlcy5wdXNoKFxuICAgICAgICB7IHRlc3Q6IC9cXC5zdmVsdGUkL2l1LCB1c2U6IGZlYXR1cmVMb2FkZXIoJ3N2ZWx0ZScpIH0sXG4gICAgICAgIHsgZW5mb3JjZTogJ3ByZScsIHRlc3Q6IC9cXC5zdmVsdGVcXC5bY21dP1tqdF1zJC9pdSwgdXNlOiBmZWF0dXJlTG9hZGVyKCdzdmVsdGUnKSB9XG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Z1ZSc6IHtcbiAgICAgIC8vIGB1bnBsdWdpbi12dWVgIGhhbmRzIGEgYDxzY3JpcHQgbGFuZz1cInRzXCI+YCBibG9jayBvbiBhcyBhIG1vZHVsZSBvZiBpdHMgb3duIGFmdGVyIHRoZSBwcm9qZWN0J3MgVHlwZVNjcmlwdFxuICAgICAgLy8gTG9hZGVyIHJhbiwgc28gYSBwb3N0IGxvYWRlciBzdHJpcHMgaXRzIHR5cGVzLiBJdHMgaWQgbmFtZXMgdGhlIGNvbXBvbmVudCBhbmQgdGhlIGJsb2NrJ3MgbGFuZ3VhZ2UuXG4gICAgICBydWxlcy5wdXNoKHsgZW5mb3JjZTogJ3Bvc3QnLCB0ZXN0OiAvXFwudnVlKD86XFw/fCUzRikuKmxhbmdcXC50cyQvaXUsIHVzZTogZmVhdHVyZUxvYWRlcigndHlwZXNjcmlwdCcpIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoZmVhdHVyZXMud2FzbSkge1xuICAgIHJ1bGVzLnB1c2goeyB0ZXN0OiAvXFwud2FzbSQvaXUsIHR5cGU6ICdqYXZhc2NyaXB0L2F1dG8nLCB1c2U6IGZlYXR1cmVMb2FkZXIoJ3dhc20nKSB9KTtcbiAgfVxuICBpZiAoZmVhdHVyZXMuc3R5bGVzKSB7XG4gICAgcnVsZXMucHVzaCh7XG4gICAgICB0ZXN0OiAvXFwucD9jc3MkL2l1LFxuICAgICAgdXNlOiBbXG4gICAgICAgIG1pbmlDc3NFeHRyYWN0TG9hZGVyUGF0aCxcbiAgICAgICAge1xuICAgICAgICAgIGxvYWRlcjogY3NzTG9hZGVyUGF0aCxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBpbXBvcnRMb2FkZXJzOiAxLFxuICAgICAgICAgICAgbW9kdWxlczogZmVhdHVyZXMuc3R5bGVzLmNzc01vZHVsZXMgPyB7IGF1dG86IHRydWUsIG5hbWVkRXhwb3J0OiBmYWxzZSB9IDogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC4uLmlzUG9zdGNzc05lZWRlZChmZWF0dXJlcy5zdHlsZXMpID8gZmVhdHVyZUxvYWRlcignc3R5bGVzaGVldCcsIGZlYXR1cmVzLnN0eWxlcykgOiBbXVxuICAgICAgXVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBydWxlcztcbn1cblxuLyoqXG4gKiBUZWxscyB3ZWJwYWNrJ3MgZnVuY3Rpb24gZm9ybSBvZiBgZXh0ZXJuYWxzYCB0byBsZWF2ZSBPYnNpZGlhbidzIG1vZHVsZXMgYW5kIHRoZSBOb2RlIGJ1aWx0aW5zIHRvXG4gKiBgcmVxdWlyZSgpYC5cbiAqXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSByZXF1ZXN0IHdlYnBhY2sgaXMgcmVzb2x2aW5nLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGFuc3dlciB0aHJvdWdoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzaWRpYW5QbHVnaW5XZWJwYWNrRXh0ZXJuYWxzKGRhdGE6IEV4dGVybmFsc0RhdGEsIGNhbGxiYWNrOiBFeHRlcm5hbHNDYWxsYmFjayk6IHZvaWQge1xuICBpZiAoZGF0YS5yZXF1ZXN0ICE9PSB1bmRlZmluZWQgJiYgaXNPYnNpZGlhblBsdWdpbkV4dGVybmFsKGRhdGEucmVxdWVzdCkpIHtcbiAgICBjYWxsYmFjayhudWxsLCBgY29tbW9uanMyICR7ZGF0YS5yZXF1ZXN0fWApO1xuICAgIHJldHVybjtcbiAgfVxuICBjYWxsYmFjaygpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gUGFydCBvZiB0aGUgd2VicGFjayBob29rcyBhYm92ZS4gKi9cbi8qKlxuICogQXBwbGllcyB0aGUgYnVpbGQgZmVhdHVyZXMgdG8gYSBjb21waWxlcjogdGhlIHJ1bGVzIG9mIHtAbGluayBnZXRXZWJwYWNrRmVhdHVyZVJ1bGVzfSwgYG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luYFxuICogZm9yIGBzdHlsZXNgIHVubGVzcyB0aGUgY29uZmlnIGFscmVhZHkgYXBwbGllcyBpdCwgYW5kIGB1bnBsdWdpbi12dWVgIHdpdGggVnVlJ3MgZmVhdHVyZSBmbGFncyBmb3IgVnVlLlxuICpcbiAqIEBwYXJhbSBjb21waWxlciAtIFRoZSB3ZWJwYWNrIGNvbXBpbGVyLlxuICogQHBhcmFtIGZlYXR1cmVzIC0gVGhlIGJ1aWxkIGZlYXR1cmVzLlxuICogQHBhcmFtIGlzUHJvZHVjdGlvbkJ1aWxkIC0gV2hldGhlciB0aGlzIGlzIGEgcHJvZHVjdGlvbiBidWlsZC5cbiAqL1xuZnVuY3Rpb24gYXBwbHlXZWJwYWNrRmVhdHVyZXMoY29tcGlsZXI6IENvbXBpbGVyLCBmZWF0dXJlczogT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucywgaXNQcm9kdWN0aW9uQnVpbGQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgbGV0IG1pbmlDc3NFeHRyYWN0TG9hZGVyUGF0aCA9ICcnO1xuICBsZXQgY3NzTG9hZGVyUGF0aCA9ICcnO1xuICBpZiAoZmVhdHVyZXMuc3R5bGVzKSB7XG4gICAgY29uc3Qgc3R5bGVzRmVhdHVyZSA9ICdzdHlsZXMnO1xuICAgIGNzc0xvYWRlclBhdGggPSByZXNvbHZlT3B0aW9uYWxQZWVyKHsgZmVhdHVyZTogc3R5bGVzRmVhdHVyZSwgcGFja2FnZU5hbWU6ICdjc3MtbG9hZGVyJyB9KTtcbiAgICBjb25zdCBNaW5pQ3NzRXh0cmFjdFBsdWdpbiA9IGV4dHJhY3REZWZhdWx0RXhwb3J0SW50ZXJvcChcbiAgICAgIHJlcXVpcmVPcHRpb25hbFBlZXIoeyBmZWF0dXJlOiBzdHlsZXNGZWF0dXJlLCBwYWNrYWdlTmFtZTogTUlOSV9DU1NfRVhUUkFDVF9QTFVHSU4gfSkgYXMgTWluaUNzc0V4dHJhY3RQbHVnaW5Nb2R1bGVcbiAgICApO1xuICAgIG1pbmlDc3NFeHRyYWN0TG9hZGVyUGF0aCA9IE1pbmlDc3NFeHRyYWN0UGx1Z2luLmxvYWRlcjtcbiAgICBjb25zdCBoYXNNaW5pQ3NzRXh0cmFjdFBsdWdpbiA9IGNvbXBpbGVyLm9wdGlvbnMucGx1Z2lucy5zb21lKChwbHVnaW4pID0+IHBsdWdpbi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWluaUNzc0V4dHJhY3RQbHVnaW4nKTtcbiAgICBpZiAoIWhhc01pbmlDc3NFeHRyYWN0UGx1Z2luKSB7XG4gICAgICBuZXcgTWluaUNzc0V4dHJhY3RQbHVnaW4oKS5hcHBseShjb21waWxlcik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbG9hZGVyUGF0aCA9IGZpbGVVUkxUb1BhdGgobmV3IFVSTChgb2JzaWRpYW4tcGx1Z2luLXdlYnBhY2stbG9hZGVyJHtleHRuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSl9YCwgaW1wb3J0Lm1ldGEudXJsKSk7XG4gIGNvbXBpbGVyLm9wdGlvbnMubW9kdWxlLnJ1bGVzLnB1c2goLi4uZ2V0V2VicGFja0ZlYXR1cmVSdWxlcyh7IGNzc0xvYWRlclBhdGgsIGZlYXR1cmVzLCBpc1Byb2R1Y3Rpb25CdWlsZCwgbG9hZGVyUGF0aCwgbWluaUNzc0V4dHJhY3RMb2FkZXJQYXRoIH0pKTtcblxuICBpZiAoZmVhdHVyZXMuZnJhbWV3b3JrICE9PSAndnVlJykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB1bnBsdWdpblZ1ZSA9IGV4dHJhY3REZWZhdWx0RXhwb3J0SW50ZXJvcChcbiAgICByZXF1aXJlT3B0aW9uYWxQZWVyKHsgZmVhdHVyZTogJ2ZyYW1ld29yazogXFwndnVlXFwnJywgcGFja2FnZU5hbWU6ICd1bnBsdWdpbi12dWUnLCBzcGVjaWZpZXI6ICd1bnBsdWdpbi12dWUvd2VicGFjaycgfSkgYXMgVW5wbHVnaW5WdWVXZWJwYWNrTW9kdWxlXG4gICk7XG4gIHVucGx1Z2luVnVlKCkuYXBwbHkoY29tcGlsZXIpO1xuICAvLyBgcHJvY2Vzcy5lbnYuTk9ERV9FTlZgIGlzIGxlZnQgb3V0OiB3ZWJwYWNrJ3MgYG1vZGVgIGRlZmluZXMgaXQsIGFuZCBhIHNlY29uZCBkZWZpbml0aW9uIGNvbmZsaWN0cy5cbiAgY29uc3QgeyAncHJvY2Vzcy5lbnYuTk9ERV9FTlYnOiBfbm9kZUVudiwgLi4udnVlRmxhZ3MgfSA9IGdldEZyYW1ld29ya0RlZmluZXMoeyBmcmFtZXdvcms6IGZlYXR1cmVzLmZyYW1ld29yaywgaXNQcm9kdWN0aW9uQnVpbGQgfSk7XG4gIG5ldyBjb21waWxlci53ZWJwYWNrLkRlZmluZVBsdWdpbih2dWVGbGFncykuYXBwbHkoY29tcGlsZXIpO1xufVxuXG4vKipcbiAqIEZpbGxzIGluIHRoZSBub3JtYWxpemVkIHdlYnBhY2sgb3B0aW9ucyB0aGUgY29uc3VtZXIgbGVmdCB1bnNldC5cbiAqXG4gKiBSdW5zIHdoaWxlIHRoZSBwbHVnaW4gaXMgYXBwbGllZCwgd2hpY2ggd2VicGFjayBkb2VzIGFmdGVyIG5vcm1hbGl6aW5nIHRoZSBjb25zdW1lcidzIGNvbmZpZyBhbmQgYmVmb3JlXG4gKiBhcHBseWluZyBpdHMgb3duIGRlZmF1bHRzLCBzbyBhbiB1bnNldCBvcHRpb24gc3RpbGwgcmVhZHMgYHVuZGVmaW5lZGAgaGVyZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBub3JtYWxpemVkIHdlYnBhY2sgb3B0aW9ucywgY2hhbmdlZCBpbiBwbGFjZS5cbiAqIEBwYXJhbSBtb2RlIC0gVGhlIGJ1aWxkIG1vZGUuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5V2VicGFja09wdGlvbkRlZmF1bHRzKG9wdGlvbnM6IFdlYnBhY2tPcHRpb25zTm9ybWFsaXplZCwgbW9kZTogQnVpbGRNb2RlKTogdm9pZCB7XG4gIGNvbnN0IGlzUHJvZHVjdGlvbkJ1aWxkID0gbW9kZSA9PT0gQnVpbGRNb2RlLlByb2R1Y3Rpb247XG4gIG9wdGlvbnMubW9kZSA/Pz0gaXNQcm9kdWN0aW9uQnVpbGQgPyAncHJvZHVjdGlvbicgOiAnZGV2ZWxvcG1lbnQnO1xuICBvcHRpb25zLnRhcmdldCA/Pz0gJ25vZGUnO1xuICBvcHRpb25zLmRldnRvb2wgPz89ICFpc1Byb2R1Y3Rpb25CdWlsZCAmJiAnaW5saW5lLXNvdXJjZS1tYXAnO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5lbnRyeSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5lbnRyeSkubGVuZ3RoID09PSAxICYmIG9wdGlvbnMuZW50cnlbJ21haW4nXT8uaW1wb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICBvcHRpb25zLmVudHJ5ID0geyBtYWluOiB7IGltcG9ydDogW2dldE9ic2lkaWFuUGx1Z2luRW50cnlQb2ludCgpXSB9IH07XG4gIH1cblxuICBvcHRpb25zLm91dHB1dC5wYXRoID8/PSBnZXRPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIobW9kZSk7XG4gIG9wdGlvbnMub3V0cHV0LmZpbGVuYW1lID8/PSBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYWluSnM7XG4gIG9wdGlvbnMub3V0cHV0LmxpYnJhcnkgPz89IHsgdHlwZTogJ2NvbW1vbmpzMicgfTtcbiAgb3B0aW9ucy5vdXRwdXQuYXN5bmNDaHVua3MgPz89IGZhbHNlO1xuXG4gIC8vIExpc3RlZCBpbiBmdWxsIHJhdGhlciB0aGFuIHdpdGggYCcuLi4nYCwgd2hpY2ggd291bGQgYnJpbmcgaW4gdGhlIGBub2RlYCBjb25kaXRpb24gb2YgYHRhcmdldDogJ25vZGUnYDogZXhwb3J0XG4gIC8vIE1hcHMgYXJlIG1hdGNoZWQgaW4gdGhlIHBhY2thZ2UncyBrZXkgb3JkZXIsIG5vdCB0aGlzIG9uZSdzLCBzbyBhIHBhY2thZ2UgbGlzdGluZyBgbm9kZWAgYmVmb3JlIGBicm93c2VyYCAoVnVlLFxuICAvLyBgZmZsYXRlYCkgd291bGQgaGFuZCBvdmVyIGl0cyBOb2RlIGJ1aWxkLCB3aGljaCBkb2VzIG5vdCBsb2FkIG9uIG1vYmlsZS5cbiAgb3B0aW9ucy5yZXNvbHZlLmNvbmRpdGlvbk5hbWVzID8/PSBbJ2Jyb3dzZXInLCAnd2VicGFjaycsIGlzUHJvZHVjdGlvbkJ1aWxkID8gJ3Byb2R1Y3Rpb24nIDogJ2RldmVsb3BtZW50JywgJ21vZHVsZScsICdpbXBvcnQnLCAncmVxdWlyZSddO1xuXG4gIGNvbnN0IHVzZXJFeHRlcm5hbHMgPSBvcHRpb25zLmV4dGVybmFscztcbiAgb3B0aW9ucy5leHRlcm5hbHMgPSBbb2JzaWRpYW5QbHVnaW5XZWJwYWNrRXh0ZXJuYWxzLCAuLi4oQXJyYXkuaXNBcnJheSh1c2VyRXh0ZXJuYWxzKSA/IHVzZXJFeHRlcm5hbHMgOiBbdXNlckV4dGVybmFsc10pXTtcbn1cblxuLyoqXG4gKiBQdXRzIGxpY2Vuc2UgY29tbWVudHMgYSBtaW5pbWl6ZXIgZXh0cmFjdGVkIGludG8gYSBgPGZpbGU+LkxJQ0VOU0UudHh0YCBiYWNrIGludG8gdGhlIGZpbGUgdGhleSBjYW1lIGZyb20uXG4gKlxuICogV2VicGFjaydzIGRlZmF1bHQgbWluaW1pemVyIG1vdmVzIGV2ZXJ5IGJ1bmRsZWQgZGVwZW5kZW5jeSdzIGxpY2Vuc2UgY29tbWVudCBpbnRvIGFcbiAqIGBtYWluLmpzLkxJQ0VOU0UudHh0YCBiZXNpZGUgYG1haW4uanNgLCB3aGljaCBubyBPYnNpZGlhbiByZWxlYXNlIHNoaXBzLCBzbyB0aGUgaW5zdGFsbGVkIHBsdWdpbiB3b3VsZFxuICogY2FycnkgY29kZSB3aXRob3V0IHRoZSBub3RpY2VzIGl0IGlzIGxpY2Vuc2VkIHVuZGVyLiBEb25lIGFmdGVyIG1pbmlmaWNhdGlvbiByYXRoZXIgdGhhbiBieSByZXBsYWNpbmdcbiAqIHRoZSBtaW5pbWl6ZXIsIHNvIGl0IGhvbGRzIHdoaWNoZXZlciBtaW5pbWl6ZXIgdGhlIGNvbnN1bWVyIG9yIHdlYnBhY2sgcGlja2VkLlxuICpcbiAqIEBwYXJhbSBjb21waWxhdGlvbiAtIFRoZSBjb21waWxhdGlvbi5cbiAqIEBwYXJhbSBjb21waWxlciAtIFRoZSBjb21waWxlciwgZm9yIHdlYnBhY2sncyBgc291cmNlc2AgY2xhc3Nlcy5cbiAqL1xuZnVuY3Rpb24gaW5saW5lRXh0cmFjdGVkTGljZW5zZXMoY29tcGlsYXRpb246IENvbXBpbGF0aW9uLCBjb21waWxlcjogQ29tcGlsZXIpOiB2b2lkIHtcbiAgY29uc3QgTElDRU5TRV9TVUZGSVggPSAnLkxJQ0VOU0UudHh0JztcbiAgZm9yIChjb25zdCBsaWNlbnNlQXNzZXQgb2YgY29tcGlsYXRpb24uZ2V0QXNzZXRzKCkpIHtcbiAgICBpZiAoIWxpY2Vuc2VBc3NldC5uYW1lLmVuZHNXaXRoKExJQ0VOU0VfU1VGRklYKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZUZpbGVOYW1lID0gbGljZW5zZUFzc2V0Lm5hbWUuc2xpY2UoMCwgLUxJQ0VOU0VfU1VGRklYLmxlbmd0aCk7XG4gICAgY29uc3Qgc291cmNlQXNzZXQgPSBjb21waWxhdGlvbi5nZXRBc3NldChzb3VyY2VGaWxlTmFtZSk7XG4gICAgaWYgKCFzb3VyY2VBc3NldCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGxpY2Vuc2VGaWxlTmFtZSA9IGxpY2Vuc2VBc3NldC5uYW1lLnNwbGl0KCcvJykuYXQoLTEpID8/IGxpY2Vuc2VBc3NldC5uYW1lO1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IGAvKiEgRm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSAke2xpY2Vuc2VGaWxlTmFtZX0gKi9gO1xuICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUFzc2V0LnNvdXJjZS5zb3VyY2UoKS50b1N0cmluZygpO1xuICAgIGNvbnN0IGxpY2Vuc2VzID0gbGljZW5zZUFzc2V0LnNvdXJjZS5zb3VyY2UoKS50b1N0cmluZygpLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1cGRhdGVkU291cmNlID0gc291cmNlLmluY2x1ZGVzKHJlZmVyZW5jZSkgPyBzb3VyY2UucmVwbGFjZShyZWZlcmVuY2UsICgpID0+IGxpY2Vuc2VzKSA6IGAke2xpY2Vuc2VzfVxcbiR7c291cmNlfWA7XG4gICAgY29tcGlsYXRpb24udXBkYXRlQXNzZXQoc291cmNlRmlsZU5hbWUsIG5ldyBjb21waWxlci53ZWJwYWNrLnNvdXJjZXMuUmF3U291cmNlKHVwZGF0ZWRTb3VyY2UpKTtcbiAgICBjb21waWxhdGlvbi5kZWxldGVBc3NldChsaWNlbnNlQXNzZXQubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNb3ZlcyBldmVyeSBDU1MgYXNzZXQgb2YgYSBjb21waWxhdGlvbiBpbnRvIGBzdHlsZXMuY3NzYC5cbiAqXG4gKiBAcGFyYW0gY29tcGlsYXRpb24gLSBUaGUgY29tcGlsYXRpb24uXG4gKiBAcGFyYW0gY29tcGlsZXIgLSBUaGUgY29tcGlsZXIsIGZvciB3ZWJwYWNrJ3MgYHNvdXJjZXNgIGNsYXNzZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbmFtZVdlYnBhY2tDc3NBc3NldHMoY29tcGlsYXRpb246IENvbXBpbGF0aW9uLCBjb21waWxlcjogQ29tcGlsZXIpOiB2b2lkIHtcbiAgY29uc3QgY3NzQXNzZXRzID0gY29tcGlsYXRpb24uZ2V0QXNzZXRzKClcbiAgICAuZmlsdGVyKChhc3NldCkgPT4gaXNDc3NGaWxlTmFtZShhc3NldC5uYW1lKSlcbiAgICAubWFwKChhc3NldCkgPT4gKHsgZmlsZU5hbWU6IGFzc2V0Lm5hbWUsIHNvdXJjZTogYXNzZXQuc291cmNlLnNvdXJjZSgpLnRvU3RyaW5nKCkgfSkpO1xuICBjb25zdCB7IGZpbGVOYW1lc1RvUmVtb3ZlLCBzdHlsZXNDc3MgfSA9IG1lcmdlQ3NzQXNzZXRzKGNzc0Fzc2V0cyk7XG4gIGlmIChzdHlsZXNDc3MgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lc1RvUmVtb3ZlKSB7XG4gICAgY29tcGlsYXRpb24uZGVsZXRlQXNzZXQoZmlsZU5hbWUpO1xuICB9XG4gIGNvbXBpbGF0aW9uLmVtaXRBc3NldChPYnNpZGlhblBsdWdpblJlcG9QYXRocy5TdHlsZXNDc3MsIG5ldyBjb21waWxlci53ZWJwYWNrLnNvdXJjZXMuUmF3U291cmNlKHN0eWxlc0NzcykpO1xufVxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQ0EsMEJBQTRDO0FBQzVDLGtCQUF3QjtBQUN4QixzQkFBOEI7QUFTOUIsd0NBQXdDO0FBQ3hDLG1DQVdPO0FBQ1Asc0NBS087QUFDUCxnREFBOEM7QUE5RDlDLElBQUksb0JBQW9CLFdBQVcsaUJBQWlCLE1BQU0sU0FBUyw4QkFBOEI7QUFDL0YsTUFBSSxPQUFPLGVBQWUsVUFBVTtBQUNsQyxVQUFNLGVBQWU7QUFDckIsVUFBTSxNQUFNLGFBQWEsVUFBVTtBQUNuQyxRQUFJLE9BQU8sSUFBSSxrQkFBa0IsWUFBWTtBQUMzQyxhQUFPLElBQUksY0FBYyxVQUFVLEVBQUU7QUFBQSxJQUN2QztBQUFBLEVBQ0Y7QUFHQSxTQUFPLE9BQU8sV0FBVyxjQUFjLEtBQUssYUFBYSxTQUFTO0FBQ3BFLEdBQUc7QUFnSUgsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sMEJBQTBCO0FBa0N6QixNQUFNLDRCQUE2RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1qRSxZQUE2QixVQUE4QyxDQUFDLEdBQUc7QUFBbEQ7QUFBQSxFQUFtRDtBQUFBLEVBQW5EO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRN0IsTUFBTSxVQUEwQjtBQUNyQyxVQUFNLE9BQU8sS0FBSyxRQUFRLFFBQVEsb0JBQW9CLFNBQVMsT0FBTztBQUN0RSwrQkFBMkIsU0FBUyxTQUFTLElBQUk7QUFDakQseUJBQXFCLFVBQVUsS0FBSyxTQUFT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
@@ -0,0 +1,133 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Builds an Obsidian plugin with webpack: a webpack plugin that gives a build the same `main.js` +
6
+ * `styles.css` + `manifest.json` layout the esbuild builder produces, deploys a watch build into the vault,
7
+ * and fills in only the options the consumer's own `webpack.config` leaves unset.
8
+ *
9
+ * `webpack` is an optional peer dependency. This module only imports its types and reaches webpack's
10
+ * classes through `compiler.webpack`, so a plugin built with esbuild installs nothing extra.
11
+ */
12
+ import type { Compiler, RuleSetRule, WebpackOptionsNormalized, WebpackPluginInstance } from 'webpack' with { 'resolution-mode': 'import' };
13
+ import type { ObsidianPluginDeploymentOptions } from './obsidian-plugin-build.cjs';
14
+ import type { ObsidianPluginFeatureOptions } from './obsidian-plugin-features.cjs';
15
+ import { BuildMode } from './obsidian-plugin-build.cjs';
16
+ /**
17
+ * Parameters for {@link getWebpackFeatureRules}.
18
+ */
19
+ export interface GetWebpackFeatureRulesParams {
20
+ /**
21
+ * The path of `css-loader`, for the stylesheet rule.
22
+ */
23
+ readonly cssLoaderPath: string;
24
+ /**
25
+ * The build features.
26
+ */
27
+ readonly features: ObsidianPluginFeatureOptions;
28
+ /**
29
+ * Whether this is a production build.
30
+ */
31
+ readonly isProductionBuild: boolean;
32
+ /**
33
+ * The path of the toolkit's own loader.
34
+ */
35
+ readonly loaderPath: string;
36
+ /**
37
+ * The path of `mini-css-extract-plugin`'s loader, for the stylesheet rule.
38
+ */
39
+ readonly miniCssExtractLoaderPath: string;
40
+ }
41
+ /**
42
+ * Options for {@link ObsidianPluginWebpackPlugin}.
43
+ */
44
+ export interface ObsidianPluginWebpackPluginOptions extends ObsidianPluginDeploymentOptions, ObsidianPluginFeatureOptions {
45
+ /**
46
+ * The build mode. Defaults to {@link BuildMode.Development} when webpack watches (`webpack --watch`) or
47
+ * its `mode` is `development`, and {@link BuildMode.Production} otherwise.
48
+ */
49
+ readonly mode?: BuildMode;
50
+ }
51
+ /**
52
+ * The callback webpack's function form of `externals` takes.
53
+ */
54
+ type ExternalsCallback = (error?: Error | null, result?: string) => void;
55
+ /**
56
+ * The argument webpack's function form of `externals` receives.
57
+ */
58
+ interface ExternalsData {
59
+ readonly request?: string;
60
+ }
61
+ /**
62
+ * A webpack plugin that builds an Obsidian plugin.
63
+ *
64
+ * What it does, each only when the consumer's config has not said otherwise:
65
+ *
66
+ * - `entry` is `src/main.ts`, and `mode` follows the build mode.
67
+ * - The output is one CommonJS (`commonjs2`) `main.js` in `dist/build` (`dist/dev` in development), with no
68
+ * async chunks, so a dynamic import cannot become a sibling file.
69
+ * - `target` is `node`, which is what Obsidian's renderer runs, so Node builtins resolve, while the export
70
+ * conditions are the browser's (`browser`, `webpack`, the mode, `module`, `import`, `require`, and never `node`),
71
+ * so packages hand over their browser builds, as on mobile they must.
72
+ * - `devtool` is an inline source map in development only.
73
+ *
74
+ * And always: Obsidian's own modules (`obsidian`, `electron`, CodeMirror, Lezer) and the Node builtins are
75
+ * external beside the consumer's own `externals`, the generated-file banner heads `main.js`, license
76
+ * comments a minimizer extracted into `main.js.LICENSE.txt` (which no Obsidian release ships) are put back
77
+ * into `main.js`, the output folder is emptied before the first build, every emitted CSS file ends up in
78
+ * `styles.css`, `manifest.json` (and in development `.hotreload`) is copied beside it, and a development
79
+ * build is deployed into the vault named by `OBSIDIAN_CONFIG_FOLDER`.
80
+ *
81
+ * TypeScript stays the consumer's choice of loader, as it would be without this plugin. The build features
82
+ * ({@link ObsidianPluginFeatureOptions}) are the plugin's:
83
+ *
84
+ * - `framework: 'react' | 'preact'` needs nothing here: the TypeScript loader reads the automatic JSX runtime from the
85
+ * toolkit's tsconfig preset, and webpack's `mode` defines `process.env.NODE_ENV`.
86
+ * - `framework: 'solid' | 'svelte'` adds rules that compile the components with the toolkit's shared transforms, and
87
+ * `'vue'` applies `unplugin-vue` and defines Vue's feature flags.
88
+ * - `styles` adds the one rule every stylesheet goes through (PostCSS and Tailwind, then `css-loader`, scoping
89
+ * `*.module.css` only with `cssModules`, then `mini-css-extract-plugin`), and applies `mini-css-extract-plugin`
90
+ * unless the config already does; leave your own `.css` rule out. `styles: {}` compiles plain CSS.
91
+ * - `wasm` imports a `.wasm` module as its bytes.
92
+ */
93
+ export declare class ObsidianPluginWebpackPlugin implements WebpackPluginInstance {
94
+ private readonly options;
95
+ /**
96
+ * Creates the plugin.
97
+ *
98
+ * @param options - The {@link ObsidianPluginWebpackPluginOptions}.
99
+ */
100
+ constructor(options?: ObsidianPluginWebpackPluginOptions);
101
+ /**
102
+ * Applies the plugin to a webpack compiler.
103
+ *
104
+ * @param compiler - The webpack compiler.
105
+ */
106
+ apply(compiler: Compiler): void;
107
+ }
108
+ /**
109
+ * Decides the build mode of a webpack build from the consumer's config: development when webpack watches
110
+ * or its `mode` is `development`, production otherwise.
111
+ *
112
+ * @param options - The normalized webpack options.
113
+ * @returns The build mode.
114
+ */
115
+ export declare function getWebpackBuildMode(options: Pick<WebpackOptionsNormalized, 'mode' | 'watch'>): BuildMode;
116
+ /**
117
+ * Builds the module rules the build features add, each running the toolkit's own loader: Solid's JSX before the
118
+ * project's TypeScript loader, Svelte components and modules, `.wasm` modules as JavaScript, and with `styles` the
119
+ * stylesheet rule.
120
+ *
121
+ * @param params - The {@link GetWebpackFeatureRulesParams}.
122
+ * @returns The rules, empty when no feature needs one.
123
+ */
124
+ export declare function getWebpackFeatureRules(params: GetWebpackFeatureRulesParams): RuleSetRule[];
125
+ /**
126
+ * Tells webpack's function form of `externals` to leave Obsidian's modules and the Node builtins to
127
+ * `require()`.
128
+ *
129
+ * @param data - The request webpack is resolving.
130
+ * @param callback - The callback to answer through.
131
+ */
132
+ export declare function obsidianPluginWebpackExternals(data: ExternalsData, callback: ExternalsCallback): void;
133
+ export {};