obsidian-dev-utils 74.0.0 → 74.2.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 (76) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +1 -0
  3. package/dist/dev/main.js +225 -135
  4. package/dist/lib/cjs/async.cjs +37 -5
  5. package/dist/lib/cjs/async.d.cts +21 -0
  6. package/dist/lib/cjs/function.cjs +9 -1
  7. package/dist/lib/cjs/function.d.cts +10 -0
  8. package/dist/lib/cjs/library.cjs +1 -1
  9. package/dist/lib/cjs/object-utils.cjs +1 -1
  10. package/dist/lib/cjs/object-utils.d.cts +3 -2
  11. package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +26 -4
  12. package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +95 -14
  13. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +118 -99
  14. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +0 -1
  15. package/dist/lib/cjs/obsidian/constructors/getDomEventsHandlersConstructor.cjs +21 -17
  16. package/dist/lib/cjs/obsidian/dataview.cjs +1 -1
  17. package/dist/lib/cjs/obsidian/dataview.d.cts +4 -3
  18. package/dist/lib/cjs/obsidian/file-change.cjs +1 -1
  19. package/dist/lib/cjs/obsidian/file-change.d.cts +9 -18
  20. package/dist/lib/cjs/obsidian/markdown.cjs +24 -15
  21. package/dist/lib/cjs/script-utils/fs.cjs +1 -1
  22. package/dist/lib/cjs/script-utils/fs.d.cts +16 -12
  23. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +2 -1
  24. package/dist/lib/cjs/script-utils/linters/eslint-no-restricted-syntax.cjs +5 -21
  25. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +4 -1
  26. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +1 -0
  27. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +315 -0
  28. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.d.cts +35 -0
  29. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +3 -1
  30. package/dist/lib/cjs/setup/async-operation-tracking-jest-setup.cjs +115 -0
  31. package/dist/lib/cjs/setup/async-operation-tracking-jest-setup.d.cts +12 -0
  32. package/dist/lib/cjs/setup/async-operation-tracking-setup.cjs +140 -0
  33. package/dist/lib/cjs/setup/async-operation-tracking-setup.d.cts +47 -0
  34. package/dist/lib/cjs/setup/async-operation-tracking-vitest-setup.cjs +115 -0
  35. package/dist/lib/cjs/setup/async-operation-tracking-vitest-setup.d.cts +10 -0
  36. package/dist/lib/cjs/strict-proxy.cjs +1 -1
  37. package/dist/lib/cjs/strict-proxy.d.cts +4 -2
  38. package/dist/lib/esm/async.d.mts +21 -0
  39. package/dist/lib/esm/async.mjs +33 -4
  40. package/dist/lib/esm/function.d.mts +10 -0
  41. package/dist/lib/esm/function.mjs +8 -1
  42. package/dist/lib/esm/library.mjs +1 -1
  43. package/dist/lib/esm/object-utils.d.mts +3 -2
  44. package/dist/lib/esm/object-utils.mjs +1 -1
  45. package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +95 -14
  46. package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +26 -4
  47. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +0 -1
  48. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +118 -99
  49. package/dist/lib/esm/obsidian/constructors/getDomEventsHandlersConstructor.mjs +21 -17
  50. package/dist/lib/esm/obsidian/dataview.d.mts +4 -3
  51. package/dist/lib/esm/obsidian/dataview.mjs +1 -1
  52. package/dist/lib/esm/obsidian/file-change.d.mts +9 -18
  53. package/dist/lib/esm/obsidian/file-change.mjs +1 -1
  54. package/dist/lib/esm/obsidian/markdown.mjs +24 -15
  55. package/dist/lib/esm/script-utils/fs.d.mts +16 -12
  56. package/dist/lib/esm/script-utils/fs.mjs +1 -1
  57. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +2 -1
  58. package/dist/lib/esm/script-utils/linters/eslint-no-restricted-syntax.mjs +5 -21
  59. package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +1 -0
  60. package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +3 -1
  61. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.d.mts +35 -0
  62. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +206 -0
  63. package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +3 -1
  64. package/dist/lib/esm/setup/async-operation-tracking-jest-setup.d.mts +12 -0
  65. package/dist/lib/esm/setup/async-operation-tracking-jest-setup.mjs +33 -0
  66. package/dist/lib/esm/setup/async-operation-tracking-setup.d.mts +47 -0
  67. package/dist/lib/esm/setup/async-operation-tracking-setup.mjs +35 -0
  68. package/dist/lib/esm/setup/async-operation-tracking-vitest-setup.d.mts +10 -0
  69. package/dist/lib/esm/setup/async-operation-tracking-vitest-setup.mjs +33 -0
  70. package/dist/lib/esm/strict-proxy.d.mts +4 -2
  71. package/dist/lib/esm/strict-proxy.mjs +1 -1
  72. package/package.json +17 -6
  73. package/script-utils/linters/eslint-rules/no-unused-params-members/package.json +6 -0
  74. package/setup/async-operation-tracking-jest-setup/package.json +6 -0
  75. package/setup/async-operation-tracking-setup/package.json +6 -0
  76. package/setup/async-operation-tracking-vitest-setup/package.json +6 -0
@@ -0,0 +1,206 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function initEsm() {
7
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ if (globalThis.process) {
9
+ return;
10
+ }
11
+
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return '/';
16
+ },
17
+ env: {},
18
+ platform: 'android'
19
+ };
20
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
21
+ globalThis.process = browserProcess;
22
+ })();
23
+
24
+ import { ensureNonNullable } from "../../../type-guards.mjs";
25
+ const PARAMS_OPTIONS_SUFFIX_PATTERN = /(?:Params|Options)$/;
26
+ const MESSAGE_ID = "unusedParamsMember";
27
+ const noUnusedParamsMembers = {
28
+ create(context) {
29
+ const interfaceKeyNodes = /* @__PURE__ */ new Map();
30
+ const usageByInterface = /* @__PURE__ */ new Map();
31
+ return {
32
+ ":function"(node) {
33
+ for (const param of record(node)["params"]) {
34
+ const info = getParamInfo(param);
35
+ if (!info) {
36
+ continue;
37
+ }
38
+ const usage = getOrCreateUsage(info.typeName);
39
+ if (info.binding.type === "pattern") {
40
+ collectPatternMembers(info.binding.pattern, usage);
41
+ } else {
42
+ collectReferenceMembers(context.sourceCode.getScope(node), info.binding.name, usage);
43
+ }
44
+ }
45
+ },
46
+ "Program:exit"() {
47
+ for (const [typeName, keyNodes] of interfaceKeyNodes) {
48
+ const usage = usageByInterface.get(typeName);
49
+ if (!usage || usage.usesAll) {
50
+ continue;
51
+ }
52
+ for (const [memberName, keyNode] of keyNodes) {
53
+ if (!usage.used.has(memberName)) {
54
+ context.report({
55
+ data: {
56
+ interfaceName: typeName,
57
+ member: memberName
58
+ },
59
+ messageId: MESSAGE_ID,
60
+ node: keyNode
61
+ });
62
+ }
63
+ }
64
+ }
65
+ },
66
+ TSInterfaceDeclaration(node) {
67
+ const name = getInterfaceName(node);
68
+ if (!PARAMS_OPTIONS_SUFFIX_PATTERN.test(name)) {
69
+ return;
70
+ }
71
+ interfaceKeyNodes.set(name, getInterfaceMembers(node));
72
+ }
73
+ };
74
+ function getOrCreateUsage(typeName) {
75
+ let usage = usageByInterface.get(typeName);
76
+ if (!usage) {
77
+ usage = { used: /* @__PURE__ */ new Set(), usesAll: false };
78
+ usageByInterface.set(typeName, usage);
79
+ }
80
+ return usage;
81
+ }
82
+ },
83
+ meta: {
84
+ docs: {
85
+ description: "Flag `*Params`/`*Options` interface members never accessed by the function that receives them"
86
+ },
87
+ messages: {
88
+ [MESSAGE_ID]: 'Member "{{ member }}" of "{{ interfaceName }}" is never accessed by the function that receives it. Remove it (the compiler will catch it if it is still needed elsewhere).'
89
+ },
90
+ schema: [],
91
+ type: "suggestion"
92
+ }
93
+ };
94
+ function classifyReference(reference, usage) {
95
+ const parent = record(reference)["parent"];
96
+ if (parent.type === "MemberExpression" && record(parent)["object"] === reference) {
97
+ collectMemberAccess(parent, usage);
98
+ return;
99
+ }
100
+ if (parent.type === "VariableDeclarator" && record(parent)["init"] === reference && record(parent)["id"].type === "ObjectPattern") {
101
+ collectPatternMembers(record(parent)["id"], usage);
102
+ return;
103
+ }
104
+ usage.usesAll = true;
105
+ }
106
+ function collectMemberAccess(node, usage) {
107
+ const computed = record(node)["computed"] === true;
108
+ const property = record(node)["property"];
109
+ if (property.type === "Identifier") {
110
+ if (!computed) {
111
+ usage.used.add(record(property)["name"]);
112
+ }
113
+ return;
114
+ }
115
+ if (property.type === "Literal") {
116
+ const value = record(property)["value"];
117
+ if (typeof value === "string") {
118
+ usage.used.add(value);
119
+ }
120
+ }
121
+ }
122
+ function collectPatternMembers(pattern, usage) {
123
+ for (const property of record(pattern)["properties"]) {
124
+ if (property.type !== "Property") {
125
+ usage.usesAll = true;
126
+ continue;
127
+ }
128
+ if (record(property)["computed"] === true) {
129
+ continue;
130
+ }
131
+ const key = record(property)["key"];
132
+ if (key.type === "Identifier") {
133
+ usage.used.add(record(key)["name"]);
134
+ }
135
+ }
136
+ }
137
+ function collectReferenceMembers(scope, paramName, usage) {
138
+ const variable = ensureNonNullable(scope.set.get(paramName));
139
+ for (const reference of variable.references) {
140
+ classifyReference(reference.identifier, usage);
141
+ }
142
+ }
143
+ function getInterfaceMembers(node) {
144
+ const members = /* @__PURE__ */ new Map();
145
+ const interfaceBody = record(node)["body"];
146
+ for (const signature of record(interfaceBody)["body"]) {
147
+ if (nodeType(signature) !== "TSPropertySignature" && nodeType(signature) !== "TSMethodSignature") {
148
+ continue;
149
+ }
150
+ if (record(signature)["computed"] === true) {
151
+ continue;
152
+ }
153
+ const key = record(signature)["key"];
154
+ if (key.type === "Identifier") {
155
+ members.set(record(key)["name"], key);
156
+ }
157
+ }
158
+ return members;
159
+ }
160
+ function getInterfaceName(node) {
161
+ const id = record(node)["id"];
162
+ return record(id)["name"];
163
+ }
164
+ function getParamInfo(param) {
165
+ const actualParam = nodeType(param) === "TSParameterProperty" ? record(param)["parameter"] : param;
166
+ const typeName = getTypeReferenceName(actualParam);
167
+ if (!typeName || !PARAMS_OPTIONS_SUFFIX_PATTERN.test(typeName)) {
168
+ return void 0;
169
+ }
170
+ if (actualParam.type === "Identifier") {
171
+ return { binding: { name: record(actualParam)["name"], type: "identifier" }, typeName };
172
+ }
173
+ if (actualParam.type === "ObjectPattern") {
174
+ return { binding: { pattern: actualParam, type: "pattern" }, typeName };
175
+ }
176
+ return void 0;
177
+ }
178
+ function getTypeReferenceName(param) {
179
+ const annotation = record(param)["typeAnnotation"];
180
+ if (!isNode(annotation)) {
181
+ return void 0;
182
+ }
183
+ const typeNode = record(annotation)["typeAnnotation"];
184
+ if (nodeType(typeNode) !== "TSTypeReference") {
185
+ return void 0;
186
+ }
187
+ const typeName = record(typeNode)["typeName"];
188
+ if (typeName.type !== "Identifier") {
189
+ return void 0;
190
+ }
191
+ return record(typeName)["name"];
192
+ }
193
+ function isNode(value) {
194
+ return typeof value === "object" && value !== null && typeof value.type === "string";
195
+ }
196
+ function nodeType(node) {
197
+ return record(node)["type"];
198
+ }
199
+ function record(node) {
200
+ return node;
201
+ }
202
+ export {
203
+ MESSAGE_ID,
204
+ noUnusedParamsMembers
205
+ };
206
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9uby11bnVzZWQtcGFyYW1zLW1lbWJlcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFU0xpbnQgcnVsZTogbm8tdW51c2VkLXBhcmFtcy1tZW1iZXJzXG4gKlxuICogRmxhZ3MgbWVtYmVycyBvZiBhIGAqUGFyYW1zYCAvIGAqT3B0aW9uc2AgcGFyYW1ldGVyLWJhZyBpbnRlcmZhY2UgdGhhdCBhcmVcbiAqIG5ldmVyIGFjY2Vzc2VkIHdpdGhpbiB0aGUgZnVuY3Rpb24vbWV0aG9kL2NvbnN0cnVjdG9yIHRoYXQgcmVjZWl2ZXMgdGhlXG4gKiBpbnRlcmZhY2UgYXMgYSBwYXJhbWV0ZXIuXG4gKlxuICogRGV0ZWN0aW9uIGlzIHBlci1mdW5jdGlvbiwgdXNpbmcgc2NvcGUgYW5hbHlzaXMgdG8gZmluZCB0aGUgcmVhbCByZWZlcmVuY2VzXG4gKiB0byB0aGUgcGFyYW1ldGVyIChub3QgdW5yZWxhdGVkIHNhbWUtbmFtZWQgaWRlbnRpZmllcnMpLiBBIG1lbWJlciBjb3VudHMgYXNcbiAqIHVzZWQgd2hlbiBpdCBpcyByZWZlcmVuY2VkIGJ5IG5hbWUgXHUyMDE0IGBwYXJhbXMubWVtYmVyYCwgYHBhcmFtc1snbWVtYmVyJ11gLCBvclxuICogYGNvbnN0IHsgbWVtYmVyIH0gPSBwYXJhbXNgIChwbHVzIGEgZGVzdHJ1Y3R1cmVkIHNpZ25hdHVyZVxuICogYGZuKHsgbWVtYmVyIH06IEZvb1BhcmFtcylgKS5cbiAqXG4gKiBDcnVjaWFsbHksIGlmIHRoZSBvYmplY3QgZXZlciBFU0NBUEVTIHdob2xlIFx1MjAxNCBzcHJlYWQgKGB7IC4uLnBhcmFtcyB9YCksIHJlc3RcbiAqIChgY29uc3QgeyAuLi5yZXN0IH0gPSBwYXJhbXNgKSwgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IChgZihwYXJhbXMpYCksIHJldHVybmVkLFxuICogb3Igc3RvcmVkIChgdGhpcy5wYXJhbXMgPSBwYXJhbXNgKSBcdTIwMTQgZXZlcnkgbWVtYmVyIGlzIHRyZWF0ZWQgYXMgdXNlZCBhbmRcbiAqIG5vdGhpbmcgaXMgcmVwb3J0ZWQgZm9yIHRoYXQgaW50ZXJmYWNlLiBTdWNoIGFuIGVzY2FwZSBlaXRoZXIgcmVhZHMgZXZlcnlcbiAqIG1lbWJlciAoc3ByZWFkL3Jlc3QpIG9yIGhhbmRzIHRoZSBvYmplY3QgdG8gY29kZSB0aGlzIHJ1bGUgY2Fubm90IHNlZSwgc29cbiAqIG1lbWJlciBkZWFkbmVzcyBjYW5ub3QgYmUgZGVjaWRlZCBsb2NhbGx5LlxuICpcbiAqIEEgbWVtYmVyIGlzIHRoZXJlZm9yZSBmbGFnZ2VkIG9ubHkgd2hlbiBpdCBpcyBuZXZlciByZWZlcmVuY2VkIGJ5IG5hbWUgQU5EXG4gKiB0aGUgb2JqZWN0IG5ldmVyIGVzY2FwZXMgXHUyMDE0IGkuZS4gdGhlIFwiYSBgcGFyYW1zLnhgIHVzYWdlIHdhcyBkZWxldGVkIGJ1dCBgeGBcbiAqIHdhcyBsZWZ0IG9uIHRoZSBpbnRlcmZhY2VcIiBjYXNlLiBBIG1lbWJlciB0aGF0IGlzIGFjdHVhbGx5IHN0aWxsIG5lZWRlZCAocmVhZFxuICogdmlhIGFuIGVzY2FwZSkgaXMgbmV2ZXIgd3JvbmdseSBmbGFnZ2VkOyBhIG1lbWJlciB0aGF0IGlzIGVzY2FwZWQgYnV0IGRlYWRcbiAqIGRvd25zdHJlYW0gaXMgYSB0b2xlcmF0ZWQgZmFsc2UgbmVnYXRpdmUgKGl0cyBkZWFkbmVzcyBpcyBub3QgbG9jYWwpLlxuICpcbiAqIE9ubHkgaW50ZXJmYWNlcyBkZWNsYXJlZCBpbiB0aGUgc2FtZSBmaWxlIGFyZSBjaGVja2VkOyBhbiBpbXBvcnRlZCBwYXJhbWV0ZXJcbiAqIHR5cGUgaXMgc2tpcHBlZC4gT25seSBpZGVudGlmaWVyLW5hbWVkIG1lbWJlcnMgYXJlIHRyYWNrZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBSdWxlLFxuICBTY29wZVxufSBmcm9tICdlc2xpbnQnO1xuXG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4uLy4uLy4uL3R5cGUtZ3VhcmRzLnRzJztcblxuY29uc3QgUEFSQU1TX09QVElPTlNfU1VGRklYX1BBVFRFUk4gPSAvKD86UGFyYW1zfE9wdGlvbnMpJC87XG5cbmV4cG9ydCBjb25zdCBNRVNTQUdFX0lEID0gJ3VudXNlZFBhcmFtc01lbWJlcic7XG5cbmludGVyZmFjZSBJZGVudGlmaWVyQmluZGluZyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogJ2lkZW50aWZpZXInO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJmYWNlVXNhZ2Uge1xuICByZWFkb25seSB1c2VkOiBTZXQ8c3RyaW5nPjtcbiAgdXNlc0FsbDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE1heWJlVHlwZWROb2RlIHtcbiAgdHlwZT86IHVua25vd247XG59XG5cbnR5cGUgUGFyYW1CaW5kaW5nID0gSWRlbnRpZmllckJpbmRpbmcgfCBQYXR0ZXJuQmluZGluZztcblxuaW50ZXJmYWNlIFBhcmFtSW5mbyB7XG4gIHJlYWRvbmx5IGJpbmRpbmc6IFBhcmFtQmluZGluZztcbiAgcmVhZG9ubHkgdHlwZU5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBhdHRlcm5CaW5kaW5nIHtcbiAgcGF0dGVybjogUnVsZS5Ob2RlO1xuICB0eXBlOiAncGF0dGVybic7XG59XG5cbmV4cG9ydCBjb25zdCBub1VudXNlZFBhcmFtc01lbWJlcnM6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCBpbnRlcmZhY2VLZXlOb2RlcyA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBSdWxlLk5vZGU+PigpO1xuICAgIGNvbnN0IHVzYWdlQnlJbnRlcmZhY2UgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJmYWNlVXNhZ2U+KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgJzpmdW5jdGlvbicobm9kZTogUnVsZS5Ob2RlKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcmVjb3JkKG5vZGUpWydwYXJhbXMnXSBhcyBSdWxlLk5vZGVbXSkge1xuICAgICAgICAgIGNvbnN0IGluZm8gPSBnZXRQYXJhbUluZm8ocGFyYW0pO1xuICAgICAgICAgIGlmICghaW5mbykge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdXNhZ2UgPSBnZXRPckNyZWF0ZVVzYWdlKGluZm8udHlwZU5hbWUpO1xuICAgICAgICAgIGlmIChpbmZvLmJpbmRpbmcudHlwZSA9PT0gJ3BhdHRlcm4nKSB7XG4gICAgICAgICAgICBjb2xsZWN0UGF0dGVybk1lbWJlcnMoaW5mby5iaW5kaW5nLnBhdHRlcm4sIHVzYWdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sbGVjdFJlZmVyZW5jZU1lbWJlcnMoY29udGV4dC5zb3VyY2VDb2RlLmdldFNjb3BlKG5vZGUpLCBpbmZvLmJpbmRpbmcubmFtZSwgdXNhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICdQcm9ncmFtOmV4aXQnKCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFt0eXBlTmFtZSwga2V5Tm9kZXNdIG9mIGludGVyZmFjZUtleU5vZGVzKSB7XG4gICAgICAgICAgY29uc3QgdXNhZ2UgPSB1c2FnZUJ5SW50ZXJmYWNlLmdldCh0eXBlTmFtZSk7XG4gICAgICAgICAgaWYgKCF1c2FnZSB8fCB1c2FnZS51c2VzQWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IFttZW1iZXJOYW1lLCBrZXlOb2RlXSBvZiBrZXlOb2Rlcykge1xuICAgICAgICAgICAgaWYgKCF1c2FnZS51c2VkLmhhcyhtZW1iZXJOYW1lKSkge1xuICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZTogdHlwZU5hbWUsXG4gICAgICAgICAgICAgICAgICBtZW1iZXI6IG1lbWJlck5hbWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogTUVTU0FHRV9JRCxcbiAgICAgICAgICAgICAgICBub2RlOiBrZXlOb2RlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFRTSW50ZXJmYWNlRGVjbGFyYXRpb24obm9kZTogUnVsZS5Ob2RlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBnZXRJbnRlcmZhY2VOYW1lKG5vZGUpO1xuICAgICAgICBpZiAoIVBBUkFNU19PUFRJT05TX1NVRkZJWF9QQVRURVJOLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaW50ZXJmYWNlS2V5Tm9kZXMuc2V0KG5hbWUsIGdldEludGVyZmFjZU1lbWJlcnMobm9kZSkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZXRPckNyZWF0ZVVzYWdlKHR5cGVOYW1lOiBzdHJpbmcpOiBJbnRlcmZhY2VVc2FnZSB7XG4gICAgICBsZXQgdXNhZ2UgPSB1c2FnZUJ5SW50ZXJmYWNlLmdldCh0eXBlTmFtZSk7XG4gICAgICBpZiAoIXVzYWdlKSB7XG4gICAgICAgIHVzYWdlID0geyB1c2VkOiBuZXcgU2V0PHN0cmluZz4oKSwgdXNlc0FsbDogZmFsc2UgfTtcbiAgICAgICAgdXNhZ2VCeUludGVyZmFjZS5zZXQodHlwZU5hbWUsIHVzYWdlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1c2FnZTtcbiAgICB9XG4gIH0sXG4gIG1ldGE6IHtcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0ZsYWcgYCpQYXJhbXNgL2AqT3B0aW9uc2AgaW50ZXJmYWNlIG1lbWJlcnMgbmV2ZXIgYWNjZXNzZWQgYnkgdGhlIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdGhlbSdcbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBbTUVTU0FHRV9JRF06ICdNZW1iZXIgXCJ7eyBtZW1iZXIgfX1cIiBvZiBcInt7IGludGVyZmFjZU5hbWUgfX1cIiBpcyBuZXZlciBhY2Nlc3NlZCBieSB0aGUgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBpdC4gUmVtb3ZlIGl0ICh0aGUgY29tcGlsZXIgd2lsbCBjYXRjaCBpdCBpZiBpdCBpcyBzdGlsbCBuZWVkZWQgZWxzZXdoZXJlKS4nXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICAgIHR5cGU6ICdzdWdnZXN0aW9uJ1xuICB9XG59O1xuXG5mdW5jdGlvbiBjbGFzc2lmeVJlZmVyZW5jZShyZWZlcmVuY2U6IG9iamVjdCwgdXNhZ2U6IEludGVyZmFjZVVzYWdlKTogdm9pZCB7XG4gIGNvbnN0IHBhcmVudCA9IHJlY29yZChyZWZlcmVuY2UpWydwYXJlbnQnXSBhcyBSdWxlLk5vZGU7XG4gIGlmIChwYXJlbnQudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nICYmIHJlY29yZChwYXJlbnQpWydvYmplY3QnXSA9PT0gcmVmZXJlbmNlKSB7XG4gICAgY29sbGVjdE1lbWJlckFjY2VzcyhwYXJlbnQsIHVzYWdlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocGFyZW50LnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0b3InICYmIHJlY29yZChwYXJlbnQpWydpbml0J10gPT09IHJlZmVyZW5jZSAmJiAocmVjb3JkKHBhcmVudClbJ2lkJ10gYXMgUnVsZS5Ob2RlKS50eXBlID09PSAnT2JqZWN0UGF0dGVybicpIHtcbiAgICBjb2xsZWN0UGF0dGVybk1lbWJlcnMocmVjb3JkKHBhcmVudClbJ2lkJ10gYXMgUnVsZS5Ob2RlLCB1c2FnZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVGhlIG9iamVjdCBlc2NhcGVzIHdob2xlIChwYXNzZWQgYXMgYW4gYXJndW1lbnQsIHJldHVybmVkLCBzdG9yZWQsIHNwcmVhZCwgLi4uKTogZXZlcnkgbWVtYmVyIG1heSBiZSByZWFkIGVsc2V3aGVyZS5cbiAgdXNhZ2UudXNlc0FsbCA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RNZW1iZXJBY2Nlc3Mobm9kZTogUnVsZS5Ob2RlLCB1c2FnZTogSW50ZXJmYWNlVXNhZ2UpOiB2b2lkIHtcbiAgY29uc3QgY29tcHV0ZWQgPSByZWNvcmQobm9kZSlbJ2NvbXB1dGVkJ10gPT09IHRydWU7XG4gIGNvbnN0IHByb3BlcnR5ID0gcmVjb3JkKG5vZGUpWydwcm9wZXJ0eSddIGFzIFJ1bGUuTm9kZTtcbiAgaWYgKHByb3BlcnR5LnR5cGUgPT09ICdJZGVudGlmaWVyJykge1xuICAgIGlmICghY29tcHV0ZWQpIHtcbiAgICAgIHVzYWdlLnVzZWQuYWRkKHJlY29yZChwcm9wZXJ0eSlbJ25hbWUnXSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocHJvcGVydHkudHlwZSA9PT0gJ0xpdGVyYWwnKSB7XG4gICAgY29uc3QgdmFsdWUgPSByZWNvcmQocHJvcGVydHkpWyd2YWx1ZSddO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB1c2FnZS51c2VkLmFkZCh2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RQYXR0ZXJuTWVtYmVycyhwYXR0ZXJuOiBSdWxlLk5vZGUsIHVzYWdlOiBJbnRlcmZhY2VVc2FnZSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHJlY29yZChwYXR0ZXJuKVsncHJvcGVydGllcyddIGFzIFJ1bGUuTm9kZVtdKSB7XG4gICAgaWYgKHByb3BlcnR5LnR5cGUgIT09ICdQcm9wZXJ0eScpIHtcbiAgICAgIC8vIGBjb25zdCB7IC4uLnJlc3QgfSA9IHBhcmFtc2AgcmVhZHMgZXZlcnkgcmVtYWluaW5nIG1lbWJlci5cbiAgICAgIHVzYWdlLnVzZXNBbGwgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChyZWNvcmQocHJvcGVydHkpWydjb21wdXRlZCddID09PSB0cnVlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gcmVjb3JkKHByb3BlcnR5KVsna2V5J10gYXMgUnVsZS5Ob2RlO1xuICAgIGlmIChrZXkudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICB1c2FnZS51c2VkLmFkZChyZWNvcmQoa2V5KVsnbmFtZSddIGFzIHN0cmluZyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RSZWZlcmVuY2VNZW1iZXJzKHNjb3BlOiBTY29wZS5TY29wZSwgcGFyYW1OYW1lOiBzdHJpbmcsIHVzYWdlOiBJbnRlcmZhY2VVc2FnZSk6IHZvaWQge1xuICBjb25zdCB2YXJpYWJsZSA9IGVuc3VyZU5vbk51bGxhYmxlKHNjb3BlLnNldC5nZXQocGFyYW1OYW1lKSk7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHZhcmlhYmxlLnJlZmVyZW5jZXMpIHtcbiAgICBjbGFzc2lmeVJlZmVyZW5jZShyZWZlcmVuY2UuaWRlbnRpZmllciwgdXNhZ2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEludGVyZmFjZU1lbWJlcnMobm9kZTogUnVsZS5Ob2RlKTogTWFwPHN0cmluZywgUnVsZS5Ob2RlPiB7XG4gIGNvbnN0IG1lbWJlcnMgPSBuZXcgTWFwPHN0cmluZywgUnVsZS5Ob2RlPigpO1xuICBjb25zdCBpbnRlcmZhY2VCb2R5ID0gcmVjb3JkKG5vZGUpWydib2R5J10gYXMgUnVsZS5Ob2RlO1xuICBmb3IgKGNvbnN0IHNpZ25hdHVyZSBvZiByZWNvcmQoaW50ZXJmYWNlQm9keSlbJ2JvZHknXSBhcyBSdWxlLk5vZGVbXSkge1xuICAgIGlmIChub2RlVHlwZShzaWduYXR1cmUpICE9PSAnVFNQcm9wZXJ0eVNpZ25hdHVyZScgJiYgbm9kZVR5cGUoc2lnbmF0dXJlKSAhPT0gJ1RTTWV0aG9kU2lnbmF0dXJlJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChyZWNvcmQoc2lnbmF0dXJlKVsnY29tcHV0ZWQnXSA9PT0gdHJ1ZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHJlY29yZChzaWduYXR1cmUpWydrZXknXSBhcyBSdWxlLk5vZGU7XG4gICAgaWYgKGtleS50eXBlID09PSAnSWRlbnRpZmllcicpIHtcbiAgICAgIG1lbWJlcnMuc2V0KHJlY29yZChrZXkpWyduYW1lJ10gYXMgc3RyaW5nLCBrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWVtYmVycztcbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJmYWNlTmFtZShub2RlOiBSdWxlLk5vZGUpOiBzdHJpbmcge1xuICBjb25zdCBpZCA9IHJlY29yZChub2RlKVsnaWQnXSBhcyBSdWxlLk5vZGU7XG4gIHJldHVybiByZWNvcmQoaWQpWyduYW1lJ10gYXMgc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJhbUluZm8ocGFyYW06IFJ1bGUuTm9kZSk6IFBhcmFtSW5mbyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjdHVhbFBhcmFtID0gbm9kZVR5cGUocGFyYW0pID09PSAnVFNQYXJhbWV0ZXJQcm9wZXJ0eScgPyByZWNvcmQocGFyYW0pWydwYXJhbWV0ZXInXSBhcyBSdWxlLk5vZGUgOiBwYXJhbTtcblxuICBjb25zdCB0eXBlTmFtZSA9IGdldFR5cGVSZWZlcmVuY2VOYW1lKGFjdHVhbFBhcmFtKTtcbiAgaWYgKCF0eXBlTmFtZSB8fCAhUEFSQU1TX09QVElPTlNfU1VGRklYX1BBVFRFUk4udGVzdCh0eXBlTmFtZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKGFjdHVhbFBhcmFtLnR5cGUgPT09ICdJZGVudGlmaWVyJykge1xuICAgIHJldHVybiB7IGJpbmRpbmc6IHsgbmFtZTogcmVjb3JkKGFjdHVhbFBhcmFtKVsnbmFtZSddIGFzIHN0cmluZywgdHlwZTogJ2lkZW50aWZpZXInIH0sIHR5cGVOYW1lIH07XG4gIH1cblxuICBpZiAoYWN0dWFsUGFyYW0udHlwZSA9PT0gJ09iamVjdFBhdHRlcm4nKSB7XG4gICAgcmV0dXJuIHsgYmluZGluZzogeyBwYXR0ZXJuOiBhY3R1YWxQYXJhbSwgdHlwZTogJ3BhdHRlcm4nIH0sIHR5cGVOYW1lIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRUeXBlUmVmZXJlbmNlTmFtZShwYXJhbTogUnVsZS5Ob2RlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYW5ub3RhdGlvbiA9IHJlY29yZChwYXJhbSlbJ3R5cGVBbm5vdGF0aW9uJ107XG4gIGlmICghaXNOb2RlKGFubm90YXRpb24pKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHR5cGVOb2RlID0gcmVjb3JkKGFubm90YXRpb24pWyd0eXBlQW5ub3RhdGlvbiddIGFzIFJ1bGUuTm9kZTtcbiAgaWYgKG5vZGVUeXBlKHR5cGVOb2RlKSAhPT0gJ1RTVHlwZVJlZmVyZW5jZScpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgdHlwZU5hbWUgPSByZWNvcmQodHlwZU5vZGUpWyd0eXBlTmFtZSddIGFzIFJ1bGUuTm9kZTtcbiAgaWYgKHR5cGVOYW1lLnR5cGUgIT09ICdJZGVudGlmaWVyJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHJlY29yZCh0eXBlTmFtZSlbJ25hbWUnXSBhcyBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlzTm9kZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJ1bGUuTm9kZSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiAodmFsdWUgYXMgTWF5YmVUeXBlZE5vZGUpLnR5cGUgPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBub2RlVHlwZShub2RlOiBSdWxlLk5vZGUpOiBzdHJpbmcge1xuICByZXR1cm4gcmVjb3JkKG5vZGUpWyd0eXBlJ10gYXMgc3RyaW5nO1xufVxuXG5mdW5jdGlvbiByZWNvcmQobm9kZTogb2JqZWN0KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gbm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUNBLFNBQVMseUJBQXlCO0FBRWxDLE1BQU0sZ0NBQWdDO0FBRS9CLE1BQU0sYUFBYTtBQTRCbkIsTUFBTSx3QkFBeUM7QUFBQSxFQUNwRCxPQUFPLFNBQVM7QUFDZCxVQUFNLG9CQUFvQixvQkFBSSxJQUFvQztBQUNsRSxVQUFNLG1CQUFtQixvQkFBSSxJQUE0QjtBQUV6RCxXQUFPO0FBQUEsTUFDTCxZQUFZLE1BQXVCO0FBQ2pDLG1CQUFXLFNBQVMsT0FBTyxJQUFJLEVBQUUsUUFBUSxHQUFrQjtBQUN6RCxnQkFBTSxPQUFPLGFBQWEsS0FBSztBQUMvQixjQUFJLENBQUMsTUFBTTtBQUNUO0FBQUEsVUFDRjtBQUVBLGdCQUFNLFFBQVEsaUJBQWlCLEtBQUssUUFBUTtBQUM1QyxjQUFJLEtBQUssUUFBUSxTQUFTLFdBQVc7QUFDbkMsa0NBQXNCLEtBQUssUUFBUSxTQUFTLEtBQUs7QUFBQSxVQUNuRCxPQUFPO0FBQ0wsb0NBQXdCLFFBQVEsV0FBVyxTQUFTLElBQUksR0FBRyxLQUFLLFFBQVEsTUFBTSxLQUFLO0FBQUEsVUFDckY7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLE1BQ0EsaUJBQXVCO0FBQ3JCLG1CQUFXLENBQUMsVUFBVSxRQUFRLEtBQUssbUJBQW1CO0FBQ3BELGdCQUFNLFFBQVEsaUJBQWlCLElBQUksUUFBUTtBQUMzQyxjQUFJLENBQUMsU0FBUyxNQUFNLFNBQVM7QUFDM0I7QUFBQSxVQUNGO0FBRUEscUJBQVcsQ0FBQyxZQUFZLE9BQU8sS0FBSyxV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
@@ -22,6 +22,7 @@ if you want to view the source, please visit the github repository of this plugi
22
22
  })();
23
23
 
24
24
  import { noAsyncCallbackToUnsafeReturn } from "./no-async-callback-to-unsafe-return.mjs";
25
+ import { noUnusedParamsMembers } from "./no-unused-params-members.mjs";
25
26
  import { noUsedUnderscoreVariables } from "./no-used-underscore-variables.mjs";
26
27
  import { paramsOptionsNameMatch } from "./params-options-name-match.mjs";
27
28
  import { preferNoopAsync } from "./prefer-noop-async.mjs";
@@ -32,6 +33,7 @@ import { requireSuperCall } from "./require-super-call.mjs";
32
33
  const obsidianDevUtilsPlugin = {
33
34
  rules: {
34
35
  "no-async-callback-to-unsafe-return": noAsyncCallbackToUnsafeReturn,
36
+ "no-unused-params-members": noUnusedParamsMembers,
35
37
  "no-used-underscore-variables": noUsedUnderscoreVariables,
36
38
  "params-options-name-match": paramsOptionsNameMatch,
37
39
  "prefer-noop-async": preferNoopAsync,
@@ -44,4 +46,4 @@ const obsidianDevUtilsPlugin = {
44
46
  export {
45
47
  obsidianDevUtilsPlugin
46
48
  };
47
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9vYnNpZGlhbi1kZXYtdXRpbHMtcGx1Z2luLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRVNMaW50IHBsdWdpbiBmb3IgT2JzaWRpYW4gZGV2ZWxvcG1lbnQgdXRpbGl0aWVzLlxuICovXG5pbXBvcnQgdHlwZSB7IEVTTGludCB9IGZyb20gJ2VzbGludCc7XG5cbmltcG9ydCB7IG5vQXN5bmNDYWxsYmFja1RvVW5zYWZlUmV0dXJuIH0gZnJvbSAnLi9uby1hc3luYy1jYWxsYmFjay10by11bnNhZmUtcmV0dXJuLnRzJztcbmltcG9ydCB7IG5vVXNlZFVuZGVyc2NvcmVWYXJpYWJsZXMgfSBmcm9tICcuL25vLXVzZWQtdW5kZXJzY29yZS12YXJpYWJsZXMudHMnO1xuaW1wb3J0IHsgcGFyYW1zT3B0aW9uc05hbWVNYXRjaCB9IGZyb20gJy4vcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaC50cyc7XG5pbXBvcnQgeyBwcmVmZXJOb29wQXN5bmMgfSBmcm9tICcuL3ByZWZlci1ub29wLWFzeW5jLnRzJztcbmltcG9ydCB7IHJlYWRvbmx5UGFyYW1zT3B0aW9uc1Jlc3VsdE1lbWJlcnMgfSBmcm9tICcuL3JlYWRvbmx5LXBhcmFtcy1vcHRpb25zLXJlc3VsdC1tZW1iZXJzLnRzJztcbmltcG9ydCB7IHJlcXVpcmVDb21wb25lbnRTdWZmaXggfSBmcm9tICcuL3JlcXVpcmUtY29tcG9uZW50LXN1ZmZpeC50cyc7XG5pbXBvcnQgeyByZXF1aXJlTWV0aG9kVGVtcGxhdGUgfSBmcm9tICcuL3JlcXVpcmUtbWV0aG9kLXRlbXBsYXRlLnRzJztcbmltcG9ydCB7IHJlcXVpcmVTdXBlckNhbGwgfSBmcm9tICcuL3JlcXVpcmUtc3VwZXItY2FsbC50cyc7XG5cbmV4cG9ydCBjb25zdCBvYnNpZGlhbkRldlV0aWxzUGx1Z2luOiBFU0xpbnQuUGx1Z2luID0ge1xuICBydWxlczoge1xuICAgICduby1hc3luYy1jYWxsYmFjay10by11bnNhZmUtcmV0dXJuJzogbm9Bc3luY0NhbGxiYWNrVG9VbnNhZmVSZXR1cm4sXG4gICAgJ25vLXVzZWQtdW5kZXJzY29yZS12YXJpYWJsZXMnOiBub1VzZWRVbmRlcnNjb3JlVmFyaWFibGVzLFxuICAgICdwYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoJzogcGFyYW1zT3B0aW9uc05hbWVNYXRjaCxcbiAgICAncHJlZmVyLW5vb3AtYXN5bmMnOiBwcmVmZXJOb29wQXN5bmMsXG4gICAgJ3JlYWRvbmx5LXBhcmFtcy1vcHRpb25zLXJlc3VsdC1tZW1iZXJzJzogcmVhZG9ubHlQYXJhbXNPcHRpb25zUmVzdWx0TWVtYmVycyxcbiAgICAncmVxdWlyZS1jb21wb25lbnQtc3VmZml4JzogcmVxdWlyZUNvbXBvbmVudFN1ZmZpeCxcbiAgICAncmVxdWlyZS1tZXRob2QtdGVtcGxhdGUnOiByZXF1aXJlTWV0aG9kVGVtcGxhdGUsXG4gICAgJ3JlcXVpcmUtc3VwZXItY2FsbCc6IHJlcXVpcmVTdXBlckNhbGxcbiAgfVxufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT0EsU0FBUyxxQ0FBcUM7QUFDOUMsU0FBUyxpQ0FBaUM7QUFDMUMsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUywwQ0FBMEM7QUFDbkQsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyx3QkFBd0I7QUFFMUIsTUFBTSx5QkFBd0M7QUFBQSxFQUNuRCxPQUFPO0FBQUEsSUFDTCxzQ0FBc0M7QUFBQSxJQUN0QyxnQ0FBZ0M7QUFBQSxJQUNoQyw2QkFBNkI7QUFBQSxJQUM3QixxQkFBcUI7QUFBQSxJQUNyQiwwQ0FBMEM7QUFBQSxJQUMxQyw0QkFBNEI7QUFBQSxJQUM1QiwyQkFBMkI7QUFBQSxJQUMzQixzQkFBc0I7QUFBQSxFQUN4QjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
49
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9vYnNpZGlhbi1kZXYtdXRpbHMtcGx1Z2luLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRVNMaW50IHBsdWdpbiBmb3IgT2JzaWRpYW4gZGV2ZWxvcG1lbnQgdXRpbGl0aWVzLlxuICovXG5pbXBvcnQgdHlwZSB7IEVTTGludCB9IGZyb20gJ2VzbGludCc7XG5cbmltcG9ydCB7IG5vQXN5bmNDYWxsYmFja1RvVW5zYWZlUmV0dXJuIH0gZnJvbSAnLi9uby1hc3luYy1jYWxsYmFjay10by11bnNhZmUtcmV0dXJuLnRzJztcbmltcG9ydCB7IG5vVW51c2VkUGFyYW1zTWVtYmVycyB9IGZyb20gJy4vbm8tdW51c2VkLXBhcmFtcy1tZW1iZXJzLnRzJztcbmltcG9ydCB7IG5vVXNlZFVuZGVyc2NvcmVWYXJpYWJsZXMgfSBmcm9tICcuL25vLXVzZWQtdW5kZXJzY29yZS12YXJpYWJsZXMudHMnO1xuaW1wb3J0IHsgcGFyYW1zT3B0aW9uc05hbWVNYXRjaCB9IGZyb20gJy4vcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaC50cyc7XG5pbXBvcnQgeyBwcmVmZXJOb29wQXN5bmMgfSBmcm9tICcuL3ByZWZlci1ub29wLWFzeW5jLnRzJztcbmltcG9ydCB7IHJlYWRvbmx5UGFyYW1zT3B0aW9uc1Jlc3VsdE1lbWJlcnMgfSBmcm9tICcuL3JlYWRvbmx5LXBhcmFtcy1vcHRpb25zLXJlc3VsdC1tZW1iZXJzLnRzJztcbmltcG9ydCB7IHJlcXVpcmVDb21wb25lbnRTdWZmaXggfSBmcm9tICcuL3JlcXVpcmUtY29tcG9uZW50LXN1ZmZpeC50cyc7XG5pbXBvcnQgeyByZXF1aXJlTWV0aG9kVGVtcGxhdGUgfSBmcm9tICcuL3JlcXVpcmUtbWV0aG9kLXRlbXBsYXRlLnRzJztcbmltcG9ydCB7IHJlcXVpcmVTdXBlckNhbGwgfSBmcm9tICcuL3JlcXVpcmUtc3VwZXItY2FsbC50cyc7XG5cbmV4cG9ydCBjb25zdCBvYnNpZGlhbkRldlV0aWxzUGx1Z2luOiBFU0xpbnQuUGx1Z2luID0ge1xuICBydWxlczoge1xuICAgICduby1hc3luYy1jYWxsYmFjay10by11bnNhZmUtcmV0dXJuJzogbm9Bc3luY0NhbGxiYWNrVG9VbnNhZmVSZXR1cm4sXG4gICAgJ25vLXVudXNlZC1wYXJhbXMtbWVtYmVycyc6IG5vVW51c2VkUGFyYW1zTWVtYmVycyxcbiAgICAnbm8tdXNlZC11bmRlcnNjb3JlLXZhcmlhYmxlcyc6IG5vVXNlZFVuZGVyc2NvcmVWYXJpYWJsZXMsXG4gICAgJ3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2gnOiBwYXJhbXNPcHRpb25zTmFtZU1hdGNoLFxuICAgICdwcmVmZXItbm9vcC1hc3luYyc6IHByZWZlck5vb3BBc3luYyxcbiAgICAncmVhZG9ubHktcGFyYW1zLW9wdGlvbnMtcmVzdWx0LW1lbWJlcnMnOiByZWFkb25seVBhcmFtc09wdGlvbnNSZXN1bHRNZW1iZXJzLFxuICAgICdyZXF1aXJlLWNvbXBvbmVudC1zdWZmaXgnOiByZXF1aXJlQ29tcG9uZW50U3VmZml4LFxuICAgICdyZXF1aXJlLW1ldGhvZC10ZW1wbGF0ZSc6IHJlcXVpcmVNZXRob2RUZW1wbGF0ZSxcbiAgICAncmVxdWlyZS1zdXBlci1jYWxsJzogcmVxdWlyZVN1cGVyQ2FsbFxuICB9XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPQSxTQUFTLHFDQUFxQztBQUM5QyxTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLGlDQUFpQztBQUMxQyxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLDBDQUEwQztBQUNuRCxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLHdCQUF3QjtBQUUxQixNQUFNLHlCQUF3QztBQUFBLEVBQ25ELE9BQU87QUFBQSxJQUNMLHNDQUFzQztBQUFBLElBQ3RDLDRCQUE0QjtBQUFBLElBQzVCLGdDQUFnQztBQUFBLElBQ2hDLDZCQUE2QjtBQUFBLElBQzdCLHFCQUFxQjtBQUFBLElBQ3JCLDBDQUEwQztBQUFBLElBQzFDLDRCQUE0QjtBQUFBLElBQzVCLDJCQUEyQjtBQUFBLElBQzNCLHNCQUFzQjtBQUFBLEVBQ3hCO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,12 @@
1
+ /// <reference path="../library.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Jest setup file that enables async-operation tracking for the duration of each test.
6
+ *
7
+ * Add it to your Jest config's `setupFilesAfterEach` (or import it from another setup file). It enables
8
+ * tracking before each test and disables it afterwards, so tests can `await waitForAllAsyncOperations()`.
9
+ *
10
+ * This is a per-test setup file, not a Jest `globalSetup` module, so it has no default export.
11
+ */
12
+ export {};
@@ -0,0 +1,33 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function initEsm() {
7
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ if (globalThis.process) {
9
+ return;
10
+ }
11
+
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return '/';
16
+ },
17
+ env: {},
18
+ platform: 'android'
19
+ };
20
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
21
+ globalThis.process = browserProcess;
22
+ })();
23
+
24
+ import {
25
+ afterEach,
26
+ beforeEach
27
+ } from "@jest/globals";
28
+ import { setupAsyncOperationTracking } from "./async-operation-tracking-setup.mjs";
29
+ setupAsyncOperationTracking({
30
+ afterEach,
31
+ beforeEach
32
+ });
33
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NldHVwL2FzeW5jLW9wZXJhdGlvbi10cmFja2luZy1qZXN0LXNldHVwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSmVzdCBzZXR1cCBmaWxlIHRoYXQgZW5hYmxlcyBhc3luYy1vcGVyYXRpb24gdHJhY2tpbmcgZm9yIHRoZSBkdXJhdGlvbiBvZiBlYWNoIHRlc3QuXG4gKlxuICogQWRkIGl0IHRvIHlvdXIgSmVzdCBjb25maWcncyBgc2V0dXBGaWxlc0FmdGVyRWFjaGAgKG9yIGltcG9ydCBpdCBmcm9tIGFub3RoZXIgc2V0dXAgZmlsZSkuIEl0IGVuYWJsZXNcbiAqIHRyYWNraW5nIGJlZm9yZSBlYWNoIHRlc3QgYW5kIGRpc2FibGVzIGl0IGFmdGVyd2FyZHMsIHNvIHRlc3RzIGNhbiBgYXdhaXQgd2FpdEZvckFsbEFzeW5jT3BlcmF0aW9ucygpYC5cbiAqXG4gKiBUaGlzIGlzIGEgcGVyLXRlc3Qgc2V0dXAgZmlsZSwgbm90IGEgSmVzdCBgZ2xvYmFsU2V0dXBgIG1vZHVsZSwgc28gaXQgaGFzIG5vIGRlZmF1bHQgZXhwb3J0LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBUaGluIEplc3Qgc2V0dXAtZmlsZSBnbHVlOyBzZXR1cEFzeW5jT3BlcmF0aW9uVHJhY2tpbmcgaXMgdW5pdC10ZXN0ZWQgc2VwYXJhdGVseS4gKi9cbmltcG9ydCB7XG4gIGFmdGVyRWFjaCxcbiAgYmVmb3JlRWFjaFxufSBmcm9tICdAamVzdC9nbG9iYWxzJztcblxuaW1wb3J0IHsgc2V0dXBBc3luY09wZXJhdGlvblRyYWNraW5nIH0gZnJvbSAnLi9hc3luYy1vcGVyYXRpb24tdHJhY2tpbmctc2V0dXAudHMnO1xuXG5zZXR1cEFzeW5jT3BlcmF0aW9uVHJhY2tpbmcoe1xuICBhZnRlckVhY2gsXG4gIGJlZm9yZUVhY2hcbn0pO1xuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLG1DQUFtQztBQUU1Qyw0QkFBNEI7QUFBQSxFQUMxQjtBQUFBLEVBQ0E7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,47 @@
1
+ /// <reference path="../library.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Framework-agnostic test-setup endpoint for async-operation tracking.
6
+ *
7
+ * Wires {@link enableAsyncOperationTracking} / {@link disableAsyncOperationTracking} into a test
8
+ * framework's `beforeEach` / `afterEach` lifecycle hooks. Each test gets a fresh tracking session:
9
+ * tracking is enabled before the test runs and disabled (clearing any tracked operations) after it
10
+ * finishes, so a test can `await waitForAllAsyncOperations()` without leaking module-global state into
11
+ * the next test.
12
+ *
13
+ * This module has no import-time side effects and no dependency on any specific test framework. The
14
+ * thin Vitest/Jest setup files (`async-operation-tracking-vitest-setup.ts` /
15
+ * `async-operation-tracking-jest-setup.ts`) call {@link setupAsyncOperationTracking} with the hooks
16
+ * imported from their respective frameworks.
17
+ */
18
+ /**
19
+ * A test-framework lifecycle hook registrar, such as `beforeEach` or `afterEach`.
20
+ *
21
+ * @param fn - The callback to register with the hook.
22
+ */
23
+ export type HookRegistrar = (fn: () => void) => void;
24
+ /**
25
+ * Parameters for {@link setupAsyncOperationTracking}.
26
+ */
27
+ export interface SetupAsyncOperationTrackingParams {
28
+ /**
29
+ * The test framework's `afterEach` hook registrar. Used to disable async-operation tracking after
30
+ * each test.
31
+ */
32
+ readonly afterEach: HookRegistrar;
33
+ /**
34
+ * The test framework's `beforeEach` hook registrar. Used to enable async-operation tracking before
35
+ * each test.
36
+ */
37
+ readonly beforeEach: HookRegistrar;
38
+ }
39
+ /**
40
+ * Registers async-operation tracking with a test framework's lifecycle hooks.
41
+ *
42
+ * Enables tracking before each test (via the supplied `beforeEach`) and disables it after each test
43
+ * (via the supplied `afterEach`), so every test runs with a fresh tracking session.
44
+ *
45
+ * @param params - The lifecycle hook registrars to wire tracking into.
46
+ */
47
+ export declare function setupAsyncOperationTracking(params: SetupAsyncOperationTrackingParams): void;
@@ -0,0 +1,35 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function initEsm() {
7
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ if (globalThis.process) {
9
+ return;
10
+ }
11
+
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return '/';
16
+ },
17
+ env: {},
18
+ platform: 'android'
19
+ };
20
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
21
+ globalThis.process = browserProcess;
22
+ })();
23
+
24
+ import {
25
+ disableAsyncOperationTracking,
26
+ enableAsyncOperationTracking
27
+ } from "../async.mjs";
28
+ function setupAsyncOperationTracking(params) {
29
+ params.beforeEach(enableAsyncOperationTracking);
30
+ params.afterEach(disableAsyncOperationTracking);
31
+ }
32
+ export {
33
+ setupAsyncOperationTracking
34
+ };
35
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NldHVwL2FzeW5jLW9wZXJhdGlvbi10cmFja2luZy1zZXR1cC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEZyYW1ld29yay1hZ25vc3RpYyB0ZXN0LXNldHVwIGVuZHBvaW50IGZvciBhc3luYy1vcGVyYXRpb24gdHJhY2tpbmcuXG4gKlxuICogV2lyZXMge0BsaW5rIGVuYWJsZUFzeW5jT3BlcmF0aW9uVHJhY2tpbmd9IC8ge0BsaW5rIGRpc2FibGVBc3luY09wZXJhdGlvblRyYWNraW5nfSBpbnRvIGEgdGVzdFxuICogZnJhbWV3b3JrJ3MgYGJlZm9yZUVhY2hgIC8gYGFmdGVyRWFjaGAgbGlmZWN5Y2xlIGhvb2tzLiBFYWNoIHRlc3QgZ2V0cyBhIGZyZXNoIHRyYWNraW5nIHNlc3Npb246XG4gKiB0cmFja2luZyBpcyBlbmFibGVkIGJlZm9yZSB0aGUgdGVzdCBydW5zIGFuZCBkaXNhYmxlZCAoY2xlYXJpbmcgYW55IHRyYWNrZWQgb3BlcmF0aW9ucykgYWZ0ZXIgaXRcbiAqIGZpbmlzaGVzLCBzbyBhIHRlc3QgY2FuIGBhd2FpdCB3YWl0Rm9yQWxsQXN5bmNPcGVyYXRpb25zKClgIHdpdGhvdXQgbGVha2luZyBtb2R1bGUtZ2xvYmFsIHN0YXRlIGludG9cbiAqIHRoZSBuZXh0IHRlc3QuXG4gKlxuICogVGhpcyBtb2R1bGUgaGFzIG5vIGltcG9ydC10aW1lIHNpZGUgZWZmZWN0cyBhbmQgbm8gZGVwZW5kZW5jeSBvbiBhbnkgc3BlY2lmaWMgdGVzdCBmcmFtZXdvcmsuIFRoZVxuICogdGhpbiBWaXRlc3QvSmVzdCBzZXR1cCBmaWxlcyAoYGFzeW5jLW9wZXJhdGlvbi10cmFja2luZy12aXRlc3Qtc2V0dXAudHNgIC9cbiAqIGBhc3luYy1vcGVyYXRpb24tdHJhY2tpbmctamVzdC1zZXR1cC50c2ApIGNhbGwge0BsaW5rIHNldHVwQXN5bmNPcGVyYXRpb25UcmFja2luZ30gd2l0aCB0aGUgaG9va3NcbiAqIGltcG9ydGVkIGZyb20gdGhlaXIgcmVzcGVjdGl2ZSBmcmFtZXdvcmtzLlxuICovXG5cbmltcG9ydCB7XG4gIGRpc2FibGVBc3luY09wZXJhdGlvblRyYWNraW5nLFxuICBlbmFibGVBc3luY09wZXJhdGlvblRyYWNraW5nXG59IGZyb20gJy4uL2FzeW5jLnRzJztcblxuLyoqXG4gKiBBIHRlc3QtZnJhbWV3b3JrIGxpZmVjeWNsZSBob29rIHJlZ2lzdHJhciwgc3VjaCBhcyBgYmVmb3JlRWFjaGAgb3IgYGFmdGVyRWFjaGAuXG4gKlxuICogQHBhcmFtIGZuIC0gVGhlIGNhbGxiYWNrIHRvIHJlZ2lzdGVyIHdpdGggdGhlIGhvb2suXG4gKi9cbmV4cG9ydCB0eXBlIEhvb2tSZWdpc3RyYXIgPSAoZm46ICgpID0+IHZvaWQpID0+IHZvaWQ7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNldHVwQXN5bmNPcGVyYXRpb25UcmFja2luZ30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dXBBc3luY09wZXJhdGlvblRyYWNraW5nUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB0ZXN0IGZyYW1ld29yaydzIGBhZnRlckVhY2hgIGhvb2sgcmVnaXN0cmFyLiBVc2VkIHRvIGRpc2FibGUgYXN5bmMtb3BlcmF0aW9uIHRyYWNraW5nIGFmdGVyXG4gICAqIGVhY2ggdGVzdC5cbiAgICovXG4gIHJlYWRvbmx5IGFmdGVyRWFjaDogSG9va1JlZ2lzdHJhcjtcblxuICAvKipcbiAgICogVGhlIHRlc3QgZnJhbWV3b3JrJ3MgYGJlZm9yZUVhY2hgIGhvb2sgcmVnaXN0cmFyLiBVc2VkIHRvIGVuYWJsZSBhc3luYy1vcGVyYXRpb24gdHJhY2tpbmcgYmVmb3JlXG4gICAqIGVhY2ggdGVzdC5cbiAgICovXG4gIHJlYWRvbmx5IGJlZm9yZUVhY2g6IEhvb2tSZWdpc3RyYXI7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGFzeW5jLW9wZXJhdGlvbiB0cmFja2luZyB3aXRoIGEgdGVzdCBmcmFtZXdvcmsncyBsaWZlY3ljbGUgaG9va3MuXG4gKlxuICogRW5hYmxlcyB0cmFja2luZyBiZWZvcmUgZWFjaCB0ZXN0ICh2aWEgdGhlIHN1cHBsaWVkIGBiZWZvcmVFYWNoYCkgYW5kIGRpc2FibGVzIGl0IGFmdGVyIGVhY2ggdGVzdFxuICogKHZpYSB0aGUgc3VwcGxpZWQgYGFmdGVyRWFjaGApLCBzbyBldmVyeSB0ZXN0IHJ1bnMgd2l0aCBhIGZyZXNoIHRyYWNraW5nIHNlc3Npb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBsaWZlY3ljbGUgaG9vayByZWdpc3RyYXJzIHRvIHdpcmUgdHJhY2tpbmcgaW50by5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwQXN5bmNPcGVyYXRpb25UcmFja2luZyhwYXJhbXM6IFNldHVwQXN5bmNPcGVyYXRpb25UcmFja2luZ1BhcmFtcyk6IHZvaWQge1xuICBwYXJhbXMuYmVmb3JlRWFjaChlbmFibGVBc3luY09wZXJhdGlvblRyYWNraW5nKTtcbiAgcGFyYW1zLmFmdGVyRWFjaChkaXNhYmxlQXN5bmNPcGVyYXRpb25UcmFja2luZyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWtDQSxTQUFTLDRCQUE0QixRQUFpRDtBQUMzRixTQUFPLFdBQVcsNEJBQTRCO0FBQzlDLFNBQU8sVUFBVSw2QkFBNkI7QUFDaEQ7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,10 @@
1
+ /// <reference path="../library.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Vitest setup file that enables async-operation tracking for the duration of each test.
6
+ *
7
+ * Add it to your Vitest config's `setupFiles` (or import it from another setup file). It enables
8
+ * tracking before each test and disables it afterwards, so tests can `await waitForAllAsyncOperations()`.
9
+ */
10
+ export {};
@@ -0,0 +1,33 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function initEsm() {
7
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ if (globalThis.process) {
9
+ return;
10
+ }
11
+
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return '/';
16
+ },
17
+ env: {},
18
+ platform: 'android'
19
+ };
20
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
21
+ globalThis.process = browserProcess;
22
+ })();
23
+
24
+ import {
25
+ afterEach,
26
+ beforeEach
27
+ } from "vitest";
28
+ import { setupAsyncOperationTracking } from "./async-operation-tracking-setup.mjs";
29
+ setupAsyncOperationTracking({
30
+ afterEach,
31
+ beforeEach
32
+ });
33
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NldHVwL2FzeW5jLW9wZXJhdGlvbi10cmFja2luZy12aXRlc3Qtc2V0dXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWaXRlc3Qgc2V0dXAgZmlsZSB0aGF0IGVuYWJsZXMgYXN5bmMtb3BlcmF0aW9uIHRyYWNraW5nIGZvciB0aGUgZHVyYXRpb24gb2YgZWFjaCB0ZXN0LlxuICpcbiAqIEFkZCBpdCB0byB5b3VyIFZpdGVzdCBjb25maWcncyBgc2V0dXBGaWxlc2AgKG9yIGltcG9ydCBpdCBmcm9tIGFub3RoZXIgc2V0dXAgZmlsZSkuIEl0IGVuYWJsZXNcbiAqIHRyYWNraW5nIGJlZm9yZSBlYWNoIHRlc3QgYW5kIGRpc2FibGVzIGl0IGFmdGVyd2FyZHMsIHNvIHRlc3RzIGNhbiBgYXdhaXQgd2FpdEZvckFsbEFzeW5jT3BlcmF0aW9ucygpYC5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gVGhpbiBWaXRlc3Qgc2V0dXAtZmlsZSBnbHVlOyBzZXR1cEFzeW5jT3BlcmF0aW9uVHJhY2tpbmcgaXMgdW5pdC10ZXN0ZWQgc2VwYXJhdGVseS4gKi9cbmltcG9ydCB7XG4gIGFmdGVyRWFjaCxcbiAgYmVmb3JlRWFjaFxufSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQgeyBzZXR1cEFzeW5jT3BlcmF0aW9uVHJhY2tpbmcgfSBmcm9tICcuL2FzeW5jLW9wZXJhdGlvbi10cmFja2luZy1zZXR1cC50cyc7XG5cbnNldHVwQXN5bmNPcGVyYXRpb25UcmFja2luZyh7XG4gIGFmdGVyRWFjaCxcbiAgYmVmb3JlRWFjaFxufSk7XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsbUNBQW1DO0FBRTVDLDRCQUE0QjtBQUFBLEVBQzFCO0FBQUEsRUFDQTtBQUNGLENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -19,9 +19,10 @@ import type { GenericFunction } from './function.mjs';
19
19
  *
20
20
  * @typeParam T - The target type to create a partial version of.
21
21
  */
22
- export type StrictProxyPartial<T> = T extends GenericFunction ? T : T extends readonly unknown[] ? T : T extends object ? {
22
+ export type StrictProxyPartial<T> = T extends GenericFunction ? T : T extends readonly unknown[] ? T : T extends object ? StrictProxyPartialObject<T> : T;
23
+ type StrictProxyPartialObject<T> = {
23
24
  [K in keyof T]?: StrictProxyPartial<T[K]> | T[K];
24
- } : T;
25
+ };
25
26
  /**
26
27
  * Bypasses strict proxy to access the underlying object.
27
28
  *
@@ -48,3 +49,4 @@ export declare function bypassStrictProxy<T>(obj: T): T;
48
49
  * @returns A proxy typed as `T` that throws on unmocked property access.
49
50
  */
50
51
  export declare function strictProxy<T>(partial: StrictProxyPartial<T>): T;
52
+ export {};
@@ -86,4 +86,4 @@ export {
86
86
  bypassStrictProxy,
87
87
  strictProxy
88
88
  };
89
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3N0cmljdC1wcm94eS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFN0cmljdGx5LXR5cGVkIG1vY2sgb2JqZWN0IGZhY3RvcnkgdmlhIGBQcm94eWAuIFRocm93cyBhIGRlc2NyaXB0aXZlIGVycm9yXG4gKiB3aGVuIGFueSB1bm1vY2tlZCBwcm9wZXJ0eSBpcyBhY2Nlc3NlZCwgcHJldmVudGluZyBzaWxlbnQgYHVuZGVmaW5lZGAgcmV0dXJucy5cbiAqXG4gKiBUaGUgcHJveHkgaW1wbGVtZW50YXRpb24gbWlycm9ycyB0aGUgZGVzaWduIG9mXG4gKiBgb2JzaWRpYW4tdGVzdC1tb2Nrcy9zcmMvaW50ZXJuYWwvc3RyaWN0LXByb3h5LnRzYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNGdW5jdGlvbiB9IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuXG4vKipcbiAqIEEgcmVjdXJzaXZlIHBhcnRpYWwgdHlwZSBjb21wYXRpYmxlIHdpdGggYGV4YWN0T3B0aW9uYWxQcm9wZXJ0eVR5cGVzYC5cbiAqXG4gKiBVbmxpa2UgYFBhcnRpYWxEZWVwYCBmcm9tIHR5cGUtZmVzdCwgdGhpcyB0eXBlIGFsbG93cyBmdWxsIGBUYCB2YWx1ZXMgYXQgYW55XG4gKiBuZXN0aW5nIGxldmVsIHZpYSB0aGUgYHwgVFtLXWAgdW5pb24uIFRoaXMgaXMgZXNzZW50aWFsIGZvciBjb21wb3NpbmcgbmVzdGVkXG4gKiBgc3RyaWN0UHJveHlgIGNhbGxzIFx1MjAxNCBhbiBpbm5lciBgc3RyaWN0UHJveHk8TWV0YWRhdGFDYWNoZT4oey4uLn0pYCByZXR1cm5zXG4gKiBgTWV0YWRhdGFDYWNoZWAsIHdoaWNoIG11c3QgYmUgYXNzaWduYWJsZSB0byB0aGUgb3V0ZXIgcGFydGlhbCB0eXBlLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0YXJnZXQgdHlwZSB0byBjcmVhdGUgYSBwYXJ0aWFsIHZlcnNpb24gb2YuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdFByb3h5UGFydGlhbDxUPiA9IFQgZXh0ZW5kcyBHZW5lcmljRnVuY3Rpb24gPyBUXG4gIDogVCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSA/IFRcbiAgOiBUIGV4dGVuZHMgb2JqZWN0ID8geyBbSyBpbiBrZXlvZiBUXT86IFN0cmljdFByb3h5UGFydGlhbDxUW0tdPiB8IFRbS10gfVxuICA6IFQ7XG5cbmNvbnN0IFNUUklDVF9QUk9YWV9UQVJHRVRfU1lNQk9MID0gU3ltYm9sLmZvcignc3RyaWN0UHJveHlUYXJnZXQnKTtcblxuY29uc3QgUEFTU1RIUk9VR0hfUFJPUFMgPSBuZXcgU2V0PHN0cmluZyB8IHN5bWJvbD4oW1xuICAnX2lzTW9ja0Z1bmN0aW9uJyxcbiAgJyQkdHlwZW9mJyxcbiAgJ2FzeW1tZXRyaWNNYXRjaCcsXG4gICdub2RlVHlwZScsXG4gIFN5bWJvbC5pdGVyYXRvcixcbiAgU3ltYm9sLnRvUHJpbWl0aXZlLFxuICBTeW1ib2wudG9TdHJpbmdUYWcsXG4gICd0YWdOYW1lJyxcbiAgJ3RoZW4nLFxuICAndG9KU09OJ1xuXSk7XG5cbi8qKlxuICogQnlwYXNzZXMgc3RyaWN0IHByb3h5IHRvIGFjY2VzcyB0aGUgdW5kZXJseWluZyBvYmplY3QuXG4gKlxuICogSWYgdGhlIG9iamVjdCBpcyB3cmFwcGVkIGluIGEgc3RyaWN0IHByb3h5LCByZXR1cm5zIHRoZSB1bndyYXBwZWQgdGFyZ2V0LlxuICogT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBvYmplY3QgYXMtaXMuIFRoaXMgYWxsb3dzIHNhZmVseSBhY2Nlc3NpbmdcbiAqIG9wdGlvbmFsIHByb3BlcnRpZXMgd2l0aG91dCB0cmlnZ2VyaW5nIHRoZSBwcm94eSdzIGVycm9yIG9uIG1pc3NpbmcgcHJvcHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIG9iamVjdCB0eXBlLlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gYnlwYXNzLlxuICogQHJldHVybnMgVGhlIHVud3JhcHBlZCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXBhc3NTdHJpY3RQcm94eTxUPihvYmo6IFQpOiBUIHtcbiAgaWYgKCFpc09iamVjdExpa2Uob2JqKSkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgaWYgKCEoU1RSSUNUX1BST1hZX1RBUkdFVF9TWU1CT0wgaW4gb2JqKSkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgcmV0dXJuIG9ialtTVFJJQ1RfUFJPWFlfVEFSR0VUX1NZTUJPTF0gYXMgVDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RyaWN0bHktdHlwZWQgbW9jayBvYmplY3QgZnJvbSBhIHBhcnRpYWwgaW1wbGVtZW50YXRpb24uXG4gKiBVc2VzIGEgYFByb3h5YCB0aGF0IHRocm93cyBhIGRlc2NyaXB0aXZlIGVycm9yIHdoZW4gYW55IHVubW9ja2VkXG4gKiBwcm9wZXJ0eSBpcyBhY2Nlc3NlZCwgcHJldmVudGluZyBzaWxlbnQgYHVuZGVmaW5lZGAgcmV0dXJucy5cbiAqXG4gKiAtIElkZW1wb3RlbnQ6IGRvdWJsZS13cmFwcGluZyBpcyBhIG5vLW9wLlxuICogLSBQYXNzdGhyb3VnaCBmb3Igd2VsbC1rbm93biBwcm9wcyAoYHRoZW5gLCBgdG9KU09OYCwgYFN5bWJvbC5pdGVyYXRvcmAsIGV0Yy4pLlxuICogLSBSZWN1cnNpdmUgcHJveHlpbmcgb2YgbmVzdGVkIHBsYWluIG9iamVjdHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHRhcmdldCB0eXBlIHRvIG1vY2suXG4gKiBAcGFyYW0gcGFydGlhbCAtIEEgcGFydGlhbCBvYmplY3QgY29udGFpbmluZyBvbmx5IHRoZSBtb2NrZWQgbWVtYmVycy5cbiAqIEByZXR1cm5zIEEgcHJveHkgdHlwZWQgYXMgYFRgIHRoYXQgdGhyb3dzIG9uIHVubW9ja2VkIHByb3BlcnR5IGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmljdFByb3h5PFQ+KHBhcnRpYWw6IFN0cmljdFByb3h5UGFydGlhbDxUPik6IFQge1xuICByZXR1cm4gd3JhcFByb3h5PFQ+KHBhcnRpYWwpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGFuIG9iamVjdC1saWtlIHZhbHVlIChub3QgbnVsbCkuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgb2JqZWN0LWxpa2UuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IChub3QgYSBjbGFzcyBpbnN0YW5jZSwgYXJyYXksIG51bGwsIGV0Yy4pLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBPYmplY3QucHJvdG90eXBlO1xufVxuXG4vKipcbiAqIFdyYXBzIGEgdmFsdWUgaW4gYSBzdHJpY3QgcHJveHkuIElkZW1wb3RlbnQgXHUyMDE0IGRvdWJsZS13cmFwcGluZyBpcyBhIG5vLW9wLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0YXJnZXQgdHlwZSBmb3IgdGhlIHByb3h5LlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHdyYXAuXG4gKiBAcmV0dXJucyBUaGUgcHJveGllZCB2YWx1ZSB0eXBlZCBhcyBgVGAuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFQgcHJvdmlkZXMgcmV0dXJuIHR5cGUgaW5mZXJlbmNlIGF0IGNhbGwgc2l0ZXMuXG5mdW5jdGlvbiB3cmFwUHJveHk8VD4odmFsdWU6IHVua25vd24pOiBUIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlIGFzIFQ7XG4gIH1cblxuICBpZiAoU1RSSUNUX1BST1hZX1RBUkdFVF9TWU1CT0wgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgVDtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsdWUsIFNUUklDVF9QUk9YWV9UQVJHRVRfU1lNQk9MLCB7IHZhbHVlIH0pO1xuXG4gIGNvbnN0IHByb3hpZWRDaGlsZHJlbiA9IG5ldyBNYXA8c3RyaW5nIHwgc3ltYm9sPigpO1xuXG4gIHJldHVybiBuZXcgUHJveHkodmFsdWUsIHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik6IHVua25vd24ge1xuICAgICAgaWYgKHByb3AgaW4gdGFyZ2V0KSB7XG4gICAgICAgIGlmIChwcm94aWVkQ2hpbGRyZW4uaGFzKHByb3ApKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3hpZWRDaGlsZHJlbi5nZXQocHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWw6IHVua25vd24gPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHdyYXBQcm94eTx1bmtub3duPih2YWwpO1xuICAgICAgICAgIHByb3hpZWRDaGlsZHJlbi5zZXQocHJvcCwgcmVzdWx0KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcgfHwgUEFTU1RIUk9VR0hfUFJPUFMuaGFzKHByb3ApKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbm1vY2tlZCBwcm9wZXJ0eSBcIiR7cHJvcH1cIiB3YXMgYWNjZXNzZWQgb24gbW9jayBvYmplY3RgKTtcbiAgICB9XG4gIH0pIGFzIFQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJCQSxNQUFNLDZCQUE2Qix1QkFBTyxJQUFJLG1CQUFtQjtBQUVqRSxNQUFNLG9CQUFvQixvQkFBSSxJQUFxQjtBQUFBLEVBQ2pEO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsQ0FBQztBQWFNLFNBQVMsa0JBQXFCLEtBQVc7QUFDOUMsTUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHO0FBQ3RCLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxFQUFFLDhCQUE4QixNQUFNO0FBQ3hDLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxJQUFJLDBCQUEwQjtBQUN2QztBQWVPLFNBQVMsWUFBZSxTQUFtQztBQUNoRSxTQUFPLFVBQWEsT0FBTztBQUM3QjtBQVFBLFNBQVMsYUFBYSxPQUFpQztBQUNyRCxTQUFPLFVBQVUsUUFBUSxPQUFPLFVBQVU7QUFDNUM7QUFRQSxTQUFTLGNBQWMsT0FBa0Q7QUFDdkUsU0FBTyxhQUFhLEtBQUssS0FBSyxPQUFPLGVBQWUsS0FBSyxNQUFNLE9BQU87QUFDeEU7QUFVQSxTQUFTLFVBQWEsT0FBbUI7QUFDdkMsTUFBSSxDQUFDLGFBQWEsS0FBSyxHQUFHO0FBQ3hCLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSw4QkFBOEIsT0FBTztBQUN2QyxXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8sZUFBZSxPQUFPLDRCQUE0QixFQUFFLE1BQU0sQ0FBQztBQUVsRSxRQUFNLGtCQUFrQixvQkFBSSxJQUFxQjtBQUVqRCxTQUFPLElBQUksTUFBTSxPQUFPO0FBQUEsSUFDdEIsSUFBSSxRQUFRLE1BQU0sVUFBbUI7QUFDbkMsVUFBSSxRQUFRLFFBQVE7QUFDbEIsWUFBSSxnQkFBZ0IsSUFBSSxJQUFJLEdBQUc7QUFDN0IsaUJBQU8sZ0JBQWdCLElBQUksSUFBSTtBQUFBLFFBQ2pDO0FBRUEsY0FBTSxNQUFlLFFBQVEsSUFBSSxRQUFRLE1BQU0sUUFBUTtBQUN2RCxZQUFJLGNBQWMsR0FBRyxHQUFHO0FBQ3RCLGdCQUFNLFNBQVMsVUFBbUIsR0FBRztBQUNyQywwQkFBZ0IsSUFBSSxNQUFNLE1BQU07QUFDaEMsaUJBQU87QUFBQSxRQUNUO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFFQSxVQUFJLE9BQU8sU0FBUyxZQUFZLGtCQUFrQixJQUFJLElBQUksR0FBRztBQUMzRCxlQUFPLFFBQVEsSUFBSSxRQUFRLE1BQU0sUUFBUTtBQUFBLE1BQzNDO0FBRUEsWUFBTSxJQUFJLE1BQU0sc0JBQXNCLElBQUksK0JBQStCO0FBQUEsSUFDM0U7QUFBQSxFQUNGLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFtdCn0K
89
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3N0cmljdC1wcm94eS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFN0cmljdGx5LXR5cGVkIG1vY2sgb2JqZWN0IGZhY3RvcnkgdmlhIGBQcm94eWAuIFRocm93cyBhIGRlc2NyaXB0aXZlIGVycm9yXG4gKiB3aGVuIGFueSB1bm1vY2tlZCBwcm9wZXJ0eSBpcyBhY2Nlc3NlZCwgcHJldmVudGluZyBzaWxlbnQgYHVuZGVmaW5lZGAgcmV0dXJucy5cbiAqXG4gKiBUaGUgcHJveHkgaW1wbGVtZW50YXRpb24gbWlycm9ycyB0aGUgZGVzaWduIG9mXG4gKiBgb2JzaWRpYW4tdGVzdC1tb2Nrcy9zcmMvaW50ZXJuYWwvc3RyaWN0LXByb3h5LnRzYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNGdW5jdGlvbiB9IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuXG4vKipcbiAqIEEgcmVjdXJzaXZlIHBhcnRpYWwgdHlwZSBjb21wYXRpYmxlIHdpdGggYGV4YWN0T3B0aW9uYWxQcm9wZXJ0eVR5cGVzYC5cbiAqXG4gKiBVbmxpa2UgYFBhcnRpYWxEZWVwYCBmcm9tIHR5cGUtZmVzdCwgdGhpcyB0eXBlIGFsbG93cyBmdWxsIGBUYCB2YWx1ZXMgYXQgYW55XG4gKiBuZXN0aW5nIGxldmVsIHZpYSB0aGUgYHwgVFtLXWAgdW5pb24uIFRoaXMgaXMgZXNzZW50aWFsIGZvciBjb21wb3NpbmcgbmVzdGVkXG4gKiBgc3RyaWN0UHJveHlgIGNhbGxzIFx1MjAxNCBhbiBpbm5lciBgc3RyaWN0UHJveHk8TWV0YWRhdGFDYWNoZT4oey4uLn0pYCByZXR1cm5zXG4gKiBgTWV0YWRhdGFDYWNoZWAsIHdoaWNoIG11c3QgYmUgYXNzaWduYWJsZSB0byB0aGUgb3V0ZXIgcGFydGlhbCB0eXBlLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0YXJnZXQgdHlwZSB0byBjcmVhdGUgYSBwYXJ0aWFsIHZlcnNpb24gb2YuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdFByb3h5UGFydGlhbDxUPiA9IFQgZXh0ZW5kcyBHZW5lcmljRnVuY3Rpb24gPyBUXG4gIDogVCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSA/IFRcbiAgOiBUIGV4dGVuZHMgb2JqZWN0ID8gU3RyaWN0UHJveHlQYXJ0aWFsT2JqZWN0PFQ+XG4gIDogVDtcblxudHlwZSBTdHJpY3RQcm94eVBhcnRpYWxPYmplY3Q8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdPzogU3RyaWN0UHJveHlQYXJ0aWFsPFRbS10+IHwgVFtLXTtcbn07XG5cbmNvbnN0IFNUUklDVF9QUk9YWV9UQVJHRVRfU1lNQk9MID0gU3ltYm9sLmZvcignc3RyaWN0UHJveHlUYXJnZXQnKTtcblxuY29uc3QgUEFTU1RIUk9VR0hfUFJPUFMgPSBuZXcgU2V0PHN0cmluZyB8IHN5bWJvbD4oW1xuICAnX2lzTW9ja0Z1bmN0aW9uJyxcbiAgJyQkdHlwZW9mJyxcbiAgJ2FzeW1tZXRyaWNNYXRjaCcsXG4gICdub2RlVHlwZScsXG4gIFN5bWJvbC5pdGVyYXRvcixcbiAgU3ltYm9sLnRvUHJpbWl0aXZlLFxuICBTeW1ib2wudG9TdHJpbmdUYWcsXG4gICd0YWdOYW1lJyxcbiAgJ3RoZW4nLFxuICAndG9KU09OJ1xuXSk7XG5cbi8qKlxuICogQnlwYXNzZXMgc3RyaWN0IHByb3h5IHRvIGFjY2VzcyB0aGUgdW5kZXJseWluZyBvYmplY3QuXG4gKlxuICogSWYgdGhlIG9iamVjdCBpcyB3cmFwcGVkIGluIGEgc3RyaWN0IHByb3h5LCByZXR1cm5zIHRoZSB1bndyYXBwZWQgdGFyZ2V0LlxuICogT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBvYmplY3QgYXMtaXMuIFRoaXMgYWxsb3dzIHNhZmVseSBhY2Nlc3NpbmdcbiAqIG9wdGlvbmFsIHByb3BlcnRpZXMgd2l0aG91dCB0cmlnZ2VyaW5nIHRoZSBwcm94eSdzIGVycm9yIG9uIG1pc3NpbmcgcHJvcHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIG9iamVjdCB0eXBlLlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gYnlwYXNzLlxuICogQHJldHVybnMgVGhlIHVud3JhcHBlZCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXBhc3NTdHJpY3RQcm94eTxUPihvYmo6IFQpOiBUIHtcbiAgaWYgKCFpc09iamVjdExpa2Uob2JqKSkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgaWYgKCEoU1RSSUNUX1BST1hZX1RBUkdFVF9TWU1CT0wgaW4gb2JqKSkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgcmV0dXJuIG9ialtTVFJJQ1RfUFJPWFlfVEFSR0VUX1NZTUJPTF0gYXMgVDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RyaWN0bHktdHlwZWQgbW9jayBvYmplY3QgZnJvbSBhIHBhcnRpYWwgaW1wbGVtZW50YXRpb24uXG4gKiBVc2VzIGEgYFByb3h5YCB0aGF0IHRocm93cyBhIGRlc2NyaXB0aXZlIGVycm9yIHdoZW4gYW55IHVubW9ja2VkXG4gKiBwcm9wZXJ0eSBpcyBhY2Nlc3NlZCwgcHJldmVudGluZyBzaWxlbnQgYHVuZGVmaW5lZGAgcmV0dXJucy5cbiAqXG4gKiAtIElkZW1wb3RlbnQ6IGRvdWJsZS13cmFwcGluZyBpcyBhIG5vLW9wLlxuICogLSBQYXNzdGhyb3VnaCBmb3Igd2VsbC1rbm93biBwcm9wcyAoYHRoZW5gLCBgdG9KU09OYCwgYFN5bWJvbC5pdGVyYXRvcmAsIGV0Yy4pLlxuICogLSBSZWN1cnNpdmUgcHJveHlpbmcgb2YgbmVzdGVkIHBsYWluIG9iamVjdHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHRhcmdldCB0eXBlIHRvIG1vY2suXG4gKiBAcGFyYW0gcGFydGlhbCAtIEEgcGFydGlhbCBvYmplY3QgY29udGFpbmluZyBvbmx5IHRoZSBtb2NrZWQgbWVtYmVycy5cbiAqIEByZXR1cm5zIEEgcHJveHkgdHlwZWQgYXMgYFRgIHRoYXQgdGhyb3dzIG9uIHVubW9ja2VkIHByb3BlcnR5IGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmljdFByb3h5PFQ+KHBhcnRpYWw6IFN0cmljdFByb3h5UGFydGlhbDxUPik6IFQge1xuICByZXR1cm4gd3JhcFByb3h5PFQ+KHBhcnRpYWwpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGFuIG9iamVjdC1saWtlIHZhbHVlIChub3QgbnVsbCkuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgb2JqZWN0LWxpa2UuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IChub3QgYSBjbGFzcyBpbnN0YW5jZSwgYXJyYXksIG51bGwsIGV0Yy4pLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBPYmplY3QucHJvdG90eXBlO1xufVxuXG4vKipcbiAqIFdyYXBzIGEgdmFsdWUgaW4gYSBzdHJpY3QgcHJveHkuIElkZW1wb3RlbnQgXHUyMDE0IGRvdWJsZS13cmFwcGluZyBpcyBhIG5vLW9wLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0YXJnZXQgdHlwZSBmb3IgdGhlIHByb3h5LlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHdyYXAuXG4gKiBAcmV0dXJucyBUaGUgcHJveGllZCB2YWx1ZSB0eXBlZCBhcyBgVGAuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFQgcHJvdmlkZXMgcmV0dXJuIHR5cGUgaW5mZXJlbmNlIGF0IGNhbGwgc2l0ZXMuXG5mdW5jdGlvbiB3cmFwUHJveHk8VD4odmFsdWU6IHVua25vd24pOiBUIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlIGFzIFQ7XG4gIH1cblxuICBpZiAoU1RSSUNUX1BST1hZX1RBUkdFVF9TWU1CT0wgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgVDtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsdWUsIFNUUklDVF9QUk9YWV9UQVJHRVRfU1lNQk9MLCB7IHZhbHVlIH0pO1xuXG4gIGNvbnN0IHByb3hpZWRDaGlsZHJlbiA9IG5ldyBNYXA8c3RyaW5nIHwgc3ltYm9sPigpO1xuXG4gIHJldHVybiBuZXcgUHJveHkodmFsdWUsIHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik6IHVua25vd24ge1xuICAgICAgaWYgKHByb3AgaW4gdGFyZ2V0KSB7XG4gICAgICAgIGlmIChwcm94aWVkQ2hpbGRyZW4uaGFzKHByb3ApKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3hpZWRDaGlsZHJlbi5nZXQocHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWw6IHVua25vd24gPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHdyYXBQcm94eTx1bmtub3duPih2YWwpO1xuICAgICAgICAgIHByb3hpZWRDaGlsZHJlbi5zZXQocHJvcCwgcmVzdWx0KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcgfHwgUEFTU1RIUk9VR0hfUFJPUFMuaGFzKHByb3ApKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbm1vY2tlZCBwcm9wZXJ0eSBcIiR7cHJvcH1cIiB3YXMgYWNjZXNzZWQgb24gbW9jayBvYmplY3RgKTtcbiAgICB9XG4gIH0pIGFzIFQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStCQSxNQUFNLDZCQUE2Qix1QkFBTyxJQUFJLG1CQUFtQjtBQUVqRSxNQUFNLG9CQUFvQixvQkFBSSxJQUFxQjtBQUFBLEVBQ2pEO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsQ0FBQztBQWFNLFNBQVMsa0JBQXFCLEtBQVc7QUFDOUMsTUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHO0FBQ3RCLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxFQUFFLDhCQUE4QixNQUFNO0FBQ3hDLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxJQUFJLDBCQUEwQjtBQUN2QztBQWVPLFNBQVMsWUFBZSxTQUFtQztBQUNoRSxTQUFPLFVBQWEsT0FBTztBQUM3QjtBQVFBLFNBQVMsYUFBYSxPQUFpQztBQUNyRCxTQUFPLFVBQVUsUUFBUSxPQUFPLFVBQVU7QUFDNUM7QUFRQSxTQUFTLGNBQWMsT0FBa0Q7QUFDdkUsU0FBTyxhQUFhLEtBQUssS0FBSyxPQUFPLGVBQWUsS0FBSyxNQUFNLE9BQU87QUFDeEU7QUFVQSxTQUFTLFVBQWEsT0FBbUI7QUFDdkMsTUFBSSxDQUFDLGFBQWEsS0FBSyxHQUFHO0FBQ3hCLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSw4QkFBOEIsT0FBTztBQUN2QyxXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8sZUFBZSxPQUFPLDRCQUE0QixFQUFFLE1BQU0sQ0FBQztBQUVsRSxRQUFNLGtCQUFrQixvQkFBSSxJQUFxQjtBQUVqRCxTQUFPLElBQUksTUFBTSxPQUFPO0FBQUEsSUFDdEIsSUFBSSxRQUFRLE1BQU0sVUFBbUI7QUFDbkMsVUFBSSxRQUFRLFFBQVE7QUFDbEIsWUFBSSxnQkFBZ0IsSUFBSSxJQUFJLEdBQUc7QUFDN0IsaUJBQU8sZ0JBQWdCLElBQUksSUFBSTtBQUFBLFFBQ2pDO0FBRUEsY0FBTSxNQUFlLFFBQVEsSUFBSSxRQUFRLE1BQU0sUUFBUTtBQUN2RCxZQUFJLGNBQWMsR0FBRyxHQUFHO0FBQ3RCLGdCQUFNLFNBQVMsVUFBbUIsR0FBRztBQUNyQywwQkFBZ0IsSUFBSSxNQUFNLE1BQU07QUFDaEMsaUJBQU87QUFBQSxRQUNUO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFFQSxVQUFJLE9BQU8sU0FBUyxZQUFZLGtCQUFrQixJQUFJLElBQUksR0FBRztBQUMzRCxlQUFPLFFBQVEsSUFBSSxRQUFRLE1BQU0sUUFBUTtBQUFBLE1BQzNDO0FBRUEsWUFBTSxJQUFJLE1BQU0sc0JBQXNCLElBQUksK0JBQStCO0FBQUEsSUFDM0U7QUFBQSxFQUNGLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFtdCn0K
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "74.0.0",
3
+ "version": "74.2.0",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development.",
5
5
  "keywords": [
6
6
  "obsidian"
@@ -577,6 +577,16 @@
577
577
  "default": "./dist/lib/cjs/script-utils/test-runners/*.cjs"
578
578
  }
579
579
  },
580
+ "./setup/*": {
581
+ "import": {
582
+ "types": "./dist/lib/esm/setup/*.d.mts",
583
+ "default": "./dist/lib/esm/setup/*.mjs"
584
+ },
585
+ "require": {
586
+ "types": "./dist/lib/cjs/setup/*.d.cts",
587
+ "default": "./dist/lib/cjs/setup/*.cjs"
588
+ }
589
+ },
580
590
  "./transformers": {
581
591
  "import": {
582
592
  "types": "./dist/lib/esm/transformers/index.d.mts",
@@ -662,8 +672,8 @@
662
672
  "@types/babel__core": "^7.20.5",
663
673
  "@types/doctrine": "^0.0.9",
664
674
  "@types/eslint": "^9.6.1",
665
- "@types/luxon": "^3.7.1",
666
- "@types/node": "^25.9.3",
675
+ "@types/luxon": "^3.7.2",
676
+ "@types/node": "^26.0.0",
667
677
  "@types/parsimmon": "^1.10.9",
668
678
  "@types/path-browserify": "^1.0.3",
669
679
  "@types/picomatch": "^4.0.3",
@@ -685,7 +695,7 @@
685
695
  "eslint": "^10.5.0",
686
696
  "eslint-import-resolver-typescript": "^4.4.5",
687
697
  "eslint-plugin-import-x": "^4.16.2",
688
- "eslint-plugin-jsdoc": "^63.0.5",
698
+ "eslint-plugin-jsdoc": "^63.0.6",
689
699
  "eslint-plugin-no-unsanitized": "^4.1.5",
690
700
  "eslint-plugin-obsidianmd": "^0.3.0",
691
701
  "eslint-plugin-perfectionist": "^5.9.1",
@@ -710,7 +720,7 @@
710
720
  "remark-parse": "^11.0.0",
711
721
  "remark-wiki-link": "^2.0.1",
712
722
  "sass": "^1.101.0",
713
- "semver": "^7.8.4",
723
+ "semver": "^7.8.5",
714
724
  "shell-quote": "^1.8.4",
715
725
  "svelte-check": "^4.6.0",
716
726
  "svelte-preprocess": "^6.0.5",
@@ -723,6 +733,7 @@
723
733
  "@commitlint/cli": "^21.0.2",
724
734
  "@commitlint/config-conventional": "^21.0.2",
725
735
  "@commitlint/types": "^21.0.1",
736
+ "@jest/globals": "^30.4.1",
726
737
  "@total-typescript/ts-reset": "^0.6.1",
727
738
  "@typescript-eslint/rule-tester": "^8.61.1",
728
739
  "@vitest/coverage-v8": "^4.1.9",
@@ -735,7 +746,7 @@
735
746
  "jsdom": "^29.1.1",
736
747
  "moment": "^2.30.1",
737
748
  "nano-staged": "^1.0.2",
738
- "obsidian-integration-testing": "^4.2.4",
749
+ "obsidian-integration-testing": "^4.2.6",
739
750
  "obsidian-test-mocks": "^3.1.1",
740
751
  "ts-declaration-location": "^1.0.7",
741
752
  "vitest": "^4.1.9",
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../../../dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs",
3
+ "module": "../../../../dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs",
4
+ "type": "module",
5
+ "types": "../../../../dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.d.cts"
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/lib/cjs/setup/async-operation-tracking-jest-setup.cjs",
3
+ "module": "../../dist/lib/esm/setup/async-operation-tracking-jest-setup.mjs",
4
+ "type": "module",
5
+ "types": "../../dist/lib/cjs/setup/async-operation-tracking-jest-setup.d.cts"
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/lib/cjs/setup/async-operation-tracking-setup.cjs",
3
+ "module": "../../dist/lib/esm/setup/async-operation-tracking-setup.mjs",
4
+ "type": "module",
5
+ "types": "../../dist/lib/cjs/setup/async-operation-tracking-setup.d.cts"
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/lib/cjs/setup/async-operation-tracking-vitest-setup.cjs",
3
+ "module": "../../dist/lib/esm/setup/async-operation-tracking-vitest-setup.mjs",
4
+ "type": "module",
5
+ "types": "../../dist/lib/cjs/setup/async-operation-tracking-vitest-setup.d.cts"
6
+ }