obsidian-dev-utils 97.0.0 → 98.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 (113) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +1 -1
  3. package/dist/integration-test-plugin/main.js +624 -483
  4. package/dist/lib/cjs/__merged.cjs +14 -9
  5. package/dist/lib/cjs/__merged.d.cts +2 -1
  6. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  7. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +38 -38
  8. package/dist/lib/cjs/obsidian/demo-vault-naming.cjs +167 -0
  9. package/dist/lib/cjs/obsidian/demo-vault-naming.d.cts +54 -0
  10. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +11 -5
  11. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +10 -8
  12. package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +9 -9
  13. package/dist/lib/cjs/obsidian/desktop-trusted-input.d.cts +23 -4
  14. package/dist/lib/cjs/obsidian/index.cjs +10 -1
  15. package/dist/lib/cjs/obsidian/index.d.cts +3 -0
  16. package/dist/lib/cjs/obsidian/mobile-trusted-input.cjs +195 -0
  17. package/dist/lib/cjs/obsidian/mobile-trusted-input.d.cts +93 -0
  18. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -1
  19. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +4 -0
  20. package/dist/lib/cjs/obsidian/resource-lock.cjs +122 -122
  21. package/dist/lib/cjs/obsidian/trusted-input.cjs +206 -0
  22. package/dist/lib/cjs/obsidian/trusted-input.d.cts +126 -0
  23. package/dist/lib/cjs/script-utils/build.cjs +30 -6
  24. package/dist/lib/cjs/script-utils/build.d.cts +5 -0
  25. package/dist/lib/cjs/script-utils/demo-vault.cjs +26 -6
  26. package/dist/lib/cjs/script-utils/demo-vault.d.cts +12 -8
  27. package/dist/lib/cjs/script-utils/exec.cjs +1 -1
  28. package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -2
  29. package/dist/lib/cjs/script-utils/index.cjs +4 -1
  30. package/dist/lib/cjs/script-utils/index.d.cts +1 -0
  31. package/dist/lib/cjs/script-utils/linters/cspell.cjs +3 -3
  32. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +39 -1
  33. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +16 -1
  34. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +5 -0
  35. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.cjs +254 -0
  36. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.d.cts +54 -0
  37. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.cjs +217 -0
  38. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.d.cts +141 -0
  39. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.cjs +214 -0
  40. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.d.cts +32 -0
  41. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.cjs +215 -0
  42. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.d.cts +30 -0
  43. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.cjs +318 -0
  44. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.d.cts +45 -0
  45. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +9 -1
  46. package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -2
  47. package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +4 -4
  48. package/dist/lib/cjs/script-utils/npm-run.cjs +4 -3
  49. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +10 -1
  50. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +37 -1
  51. package/dist/lib/cjs/script-utils/package-manager.cjs +287 -0
  52. package/dist/lib/cjs/script-utils/package-manager.d.cts +77 -0
  53. package/dist/lib/cjs/script-utils/version.cjs +21 -9
  54. package/dist/lib/esm/__merged.d.mts +2 -1
  55. package/dist/lib/esm/__merged.mjs +16 -10
  56. package/dist/lib/esm/generated-during-build.mjs +1 -1
  57. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +38 -38
  58. package/dist/lib/esm/obsidian/demo-vault-naming.d.mts +54 -0
  59. package/dist/lib/esm/obsidian/demo-vault-naming.mjs +61 -0
  60. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +10 -8
  61. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +14 -5
  62. package/dist/lib/esm/obsidian/desktop-trusted-input.d.mts +23 -4
  63. package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +9 -9
  64. package/dist/lib/esm/obsidian/index.d.mts +3 -0
  65. package/dist/lib/esm/obsidian/index.mjs +7 -1
  66. package/dist/lib/esm/obsidian/mobile-trusted-input.d.mts +93 -0
  67. package/dist/lib/esm/obsidian/mobile-trusted-input.mjs +84 -0
  68. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +4 -0
  69. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -1
  70. package/dist/lib/esm/obsidian/resource-lock.mjs +122 -122
  71. package/dist/lib/esm/obsidian/trusted-input.d.mts +126 -0
  72. package/dist/lib/esm/obsidian/trusted-input.mjs +85 -0
  73. package/dist/lib/esm/script-utils/build.d.mts +5 -0
  74. package/dist/lib/esm/script-utils/build.mjs +30 -6
  75. package/dist/lib/esm/script-utils/demo-vault.d.mts +12 -8
  76. package/dist/lib/esm/script-utils/demo-vault.mjs +29 -6
  77. package/dist/lib/esm/script-utils/exec.mjs +1 -1
  78. package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -2
  79. package/dist/lib/esm/script-utils/index.d.mts +1 -0
  80. package/dist/lib/esm/script-utils/index.mjs +3 -1
  81. package/dist/lib/esm/script-utils/linters/cspell.mjs +3 -3
  82. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +39 -1
  83. package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +5 -0
  84. package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +11 -1
  85. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.d.mts +54 -0
  86. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.mjs +148 -0
  87. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.d.mts +141 -0
  88. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.mjs +92 -0
  89. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.d.mts +32 -0
  90. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.mjs +111 -0
  91. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.d.mts +30 -0
  92. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.mjs +112 -0
  93. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.d.mts +45 -0
  94. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.mjs +217 -0
  95. package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +9 -1
  96. package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -2
  97. package/dist/lib/esm/script-utils/linters/markdownlint.mjs +4 -4
  98. package/dist/lib/esm/script-utils/npm-run.mjs +4 -3
  99. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +37 -1
  100. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +10 -1
  101. package/dist/lib/esm/script-utils/package-manager.d.mts +77 -0
  102. package/dist/lib/esm/script-utils/package-manager.mjs +173 -0
  103. package/dist/lib/esm/script-utils/version.mjs +21 -9
  104. package/obsidian/demo-vault-naming/package.json +6 -0
  105. package/obsidian/mobile-trusted-input/package.json +6 -0
  106. package/obsidian/trusted-input/package.json +6 -0
  107. package/package.json +19 -17
  108. package/script-utils/linters/eslint-rules/manifest-description/package.json +6 -0
  109. package/script-utils/linters/eslint-rules/manifest-helpers/package.json +6 -0
  110. package/script-utils/linters/eslint-rules/manifest-id/package.json +6 -0
  111. package/script-utils/linters/eslint-rules/manifest-name/package.json +6 -0
  112. package/script-utils/linters/eslint-rules/manifest-schema/package.json +6 -0
  113. package/script-utils/package-manager/package.json +6 -0
@@ -0,0 +1,141 @@
1
+ /// <reference path="../../../library.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Shared helpers for the `manifest.json` ESLint rules.
6
+ *
7
+ * The manifest is linted through `@eslint/json`'s `json/json` language, whose AST is Momoa
8
+ * (`Document` -> `Object` -> `Member`) rather than ESTree, so these rules visit `Document` instead of
9
+ * `Program`. That difference is exactly why `obsidianmd/validate-manifest` can never fire: it registers a
10
+ * `Program` visitor and expects an ESTree `ObjectExpression`, which no shipped JSON parser produces.
11
+ *
12
+ * The Momoa node shapes are declared structurally here rather than imported from `@humanwhocodes/momoa`,
13
+ * which is only a transitive dependency of `@eslint/json`. A type-only import would leak into the
14
+ * published declarations and force every consumer to resolve a package it never installed.
15
+ */
16
+ import type { ESLint, Rule } from 'eslint' with { 'resolution-mode': 'import' };
17
+ /**
18
+ * The Momoa node type of a JSON boolean value.
19
+ */
20
+ export declare const JSON_NODE_TYPE_BOOLEAN = "Boolean";
21
+ /**
22
+ * The Momoa node type of a JSON object value.
23
+ */
24
+ export declare const JSON_NODE_TYPE_OBJECT = "Object";
25
+ /**
26
+ * The Momoa node type of a JSON string value.
27
+ */
28
+ export declare const JSON_NODE_TYPE_STRING = "String";
29
+ /**
30
+ * `@eslint/json`, typed as the plugin type a flat config and `RuleTester` are written against.
31
+ *
32
+ * The package's rule definitions are generic over its own JSON language, which `@types/eslint`'s
33
+ * `ESLint.Plugin` - written against ESTree rules - cannot express, so the two are nominally incompatible
34
+ * while being exactly compatible at runtime. Registering it is what makes `language: 'json/json'`
35
+ * resolvable, so there is no way to avoid the bridge.
36
+ */
37
+ export declare const jsonPlugin: ESLint.Plugin;
38
+ /**
39
+ * The `version` a plugin repo carries before its first release, when `minAppVersion` is legitimately absent.
40
+ */
41
+ export declare const UNRELEASED_VERSION = "0.0.0";
42
+ /**
43
+ * The root node of a parsed JSON document.
44
+ */
45
+ export interface JsonDocumentNode extends JsonNode {
46
+ /**
47
+ * The document's single top-level value.
48
+ */
49
+ readonly body: JsonNode;
50
+ }
51
+ /**
52
+ * A JSON literal - a string, number, boolean or null.
53
+ */
54
+ export interface JsonLiteralNode extends JsonNode {
55
+ /**
56
+ * The literal's parsed value.
57
+ */
58
+ readonly value: boolean | null | number | string;
59
+ }
60
+ /**
61
+ * A single `"key": value` pair of a JSON object.
62
+ */
63
+ export interface JsonMemberNode extends JsonNode {
64
+ /**
65
+ * The member's key.
66
+ */
67
+ readonly name: JsonLiteralNode;
68
+ /**
69
+ * The member's value.
70
+ */
71
+ readonly value: JsonNode;
72
+ }
73
+ /**
74
+ * Any node of the Momoa JSON AST.
75
+ */
76
+ export interface JsonNode {
77
+ /**
78
+ * The node type, e.g. `Document`, `Object`, `Member`, `String`.
79
+ */
80
+ readonly type: string;
81
+ }
82
+ /**
83
+ * A JSON object value.
84
+ */
85
+ export interface JsonObjectNode extends JsonNode {
86
+ /**
87
+ * The object's members, in source order, including any duplicate keys.
88
+ */
89
+ readonly members: readonly JsonMemberNode[];
90
+ }
91
+ /**
92
+ * Finds a top-level member of the manifest by key.
93
+ *
94
+ * @param manifestObject - The manifest's root object node.
95
+ * @param key - The key to look for.
96
+ * @returns The first member with that key, or `null` when the manifest has none.
97
+ */
98
+ export declare function findManifestMember(manifestObject: JsonObjectNode, key: string): JsonMemberNode | null;
99
+ /**
100
+ * Reads the manifest's root object out of the visited `Document` node.
101
+ *
102
+ * @param node - The `Document` node handed to the rule's visitor.
103
+ * @returns The root object node, or `null` when the document's top-level value is not an object.
104
+ */
105
+ export declare function getManifestObject(node: unknown): JsonObjectNode | null;
106
+ /**
107
+ * Reads the value of a top-level string member of the manifest.
108
+ *
109
+ * @param manifestObject - The manifest's root object node.
110
+ * @param key - The key to look for.
111
+ * @returns The member's value, or `null` when it is absent or not a string.
112
+ */
113
+ export declare function getManifestStringValue(manifestObject: JsonObjectNode, key: string): null | string;
114
+ /**
115
+ * Reads a member's key.
116
+ *
117
+ * Under the `json/json` language a member's name is always a string node - identifier keys exist only in
118
+ * JSON5 - so this never has to account for a missing key.
119
+ *
120
+ * @param member - The member to read.
121
+ * @returns The member's key.
122
+ */
123
+ export declare function getMemberKey(member: JsonMemberNode): string;
124
+ /**
125
+ * Reads the value of a Momoa string node.
126
+ *
127
+ * @param node - The node to read.
128
+ * @returns The string value, or `null` when the node is not a string.
129
+ */
130
+ export declare function getStringValue(node: JsonNode): null | string;
131
+ /**
132
+ * Bridges a Momoa node to the node type `context.report()` is typed against.
133
+ *
134
+ * The two are structurally incompatible - ESLint's rule types describe ESTree - but the `json/json`
135
+ * language's source code adapter resolves a Momoa node's position at report time, so they are compatible
136
+ * at runtime. This mirrors the bridge `rule-tester-helper.ts` makes over the same kind of type-level gap.
137
+ *
138
+ * @param node - The Momoa node to report on.
139
+ * @returns The same node, typed for `context.report()`.
140
+ */
141
+ export declare function toReportNode(node: unknown): Rule.Node;
@@ -0,0 +1,214 @@
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 () {
7
+ function ensureBrowserProcess() {
8
+ const browserProcess = {
9
+ browser: true,
10
+ cwd() {
11
+ return '/';
12
+ },
13
+ env: {},
14
+ platform: 'android'
15
+ };
16
+
17
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
18
+ const existingProcess = globalThis.process;
19
+
20
+ if (!existingProcess) {
21
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+
26
+ if (existingProcess.versions?.node) {
27
+ return;
28
+ }
29
+
30
+ const existingProcessRecord = existingProcess;
31
+
32
+ for (const [key, value] of Object.entries(browserProcess)) {
33
+ existingProcessRecord[key] ??= value;
34
+ }
35
+
36
+ existingProcessRecord['browser'] = true;
37
+ }
38
+
39
+ function keepName($unknown) {
40
+ return $unknown;
41
+ }
42
+
43
+ (function initCjs() {
44
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
45
+ const globalThisRecord = globalThis;
46
+ globalThisRecord['__name'] ??= keepName;
47
+ const originalRequire = require;
48
+ if (originalRequire && !originalRequire.__isPatched) {
49
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
50
+ require = Object.assign(
51
+ (id) => requirePatched(id),
52
+ originalRequire,
53
+ {
54
+ __isPatched: true
55
+ }
56
+ );
57
+ }
58
+
59
+ globalThisRecord['__extractDefault'] ??= extractDefault;
60
+
61
+ ensureBrowserProcess();
62
+
63
+ function extractDefault(module) {
64
+ return module && module.__esModule && 'default' in module ? module.default : module;
65
+ }
66
+
67
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
68
+ '@codemirror/autocomplete',
69
+ '@codemirror/collab',
70
+ '@codemirror/commands',
71
+ '@codemirror/language',
72
+ '@codemirror/lint',
73
+ '@codemirror/search',
74
+ '@codemirror/state',
75
+ '@codemirror/text',
76
+ '@codemirror/view',
77
+ '@lezer/common',
78
+ '@lezer/highlight',
79
+ '@lezer/lr',
80
+ 'obsidian']
81
+ );
82
+
83
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
84
+ '@codemirror/closebrackets',
85
+ '@codemirror/comment',
86
+ '@codemirror/fold',
87
+ '@codemirror/gutter',
88
+ '@codemirror/highlight',
89
+ '@codemirror/history',
90
+ '@codemirror/matchbrackets',
91
+ '@codemirror/panel',
92
+ '@codemirror/rangeset',
93
+ '@codemirror/rectangular-selection',
94
+ '@codemirror/stream-parser',
95
+ '@codemirror/tooltip']
96
+ );
97
+
98
+ function requirePatched(id) {
99
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
100
+ return originalRequire?.(id);
101
+ }
102
+
103
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
104
+ if (globalThis.app.isMobile) {
105
+ if (id === 'process' || id === 'node:process') {
106
+ // eslint-disable-next-line no-console -- Valid usage.
107
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
108
+
109
+ return process;
110
+ }
111
+ } else {
112
+ const module = originalRequire?.(id);
113
+ if (module) {
114
+ return extractDefault(module);
115
+ }
116
+ }
117
+
118
+ // eslint-disable-next-line no-console -- Valid usage.
119
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
120
+ return {};
121
+ }
122
+ })();
123
+ })();
124
+
125
+ "use strict";
126
+ var __defProp = Object.defineProperty;
127
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
128
+ var __getOwnPropNames = Object.getOwnPropertyNames;
129
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
130
+ var __export = (target, all) => {
131
+ for (var name in all)
132
+ __defProp(target, name, { get: all[name], enumerable: true });
133
+ };
134
+ var __copyProps = (to, from, except, desc) => {
135
+ if (from && typeof from === "object" || typeof from === "function") {
136
+ for (let key of __getOwnPropNames(from))
137
+ if (!__hasOwnProp.call(to, key) && key !== except)
138
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
139
+ }
140
+ return to;
141
+ };
142
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
143
+ var manifest_id_exports = {};
144
+ __export(manifest_id_exports, {
145
+ MESSAGE_ID_CONTAINS_OBSIDIAN: () => MESSAGE_ID_CONTAINS_OBSIDIAN,
146
+ MESSAGE_ID_ENDS_WITH_PLUGIN: () => MESSAGE_ID_ENDS_WITH_PLUGIN,
147
+ MESSAGE_ID_INVALID_CHARACTERS: () => MESSAGE_ID_INVALID_CHARACTERS,
148
+ manifestId: () => manifestId
149
+ });
150
+ module.exports = __toCommonJS(manifest_id_exports);
151
+ var import_manifest_helpers = require('./manifest-helpers.cjs');
152
+ const MESSAGE_ID_CONTAINS_OBSIDIAN = "idContainsObsidian";
153
+ const MESSAGE_ID_ENDS_WITH_PLUGIN = "idEndsWithPlugin";
154
+ const MESSAGE_ID_INVALID_CHARACTERS = "idInvalidCharacters";
155
+ const ALLOWED_ID_CHARACTERS = /^[a-z0-9-]+$/;
156
+ const manifestId = {
157
+ create(context) {
158
+ return {
159
+ Document(node) {
160
+ const manifestObject = (0, import_manifest_helpers.getManifestObject)(node);
161
+ if (!manifestObject) {
162
+ return;
163
+ }
164
+ const member = (0, import_manifest_helpers.findManifestMember)(manifestObject, "id");
165
+ if (!member) {
166
+ return;
167
+ }
168
+ const id = (0, import_manifest_helpers.getStringValue)(member.value);
169
+ if (id === null) {
170
+ return;
171
+ }
172
+ const reportNode = (0, import_manifest_helpers.toReportNode)(member.value);
173
+ if (!ALLOWED_ID_CHARACTERS.test(id)) {
174
+ context.report({
175
+ messageId: MESSAGE_ID_INVALID_CHARACTERS,
176
+ node: reportNode
177
+ });
178
+ }
179
+ if (id.toLowerCase().includes("obsidian")) {
180
+ context.report({
181
+ messageId: MESSAGE_ID_CONTAINS_OBSIDIAN,
182
+ node: reportNode
183
+ });
184
+ }
185
+ if (id.toLowerCase().endsWith("plugin")) {
186
+ context.report({
187
+ messageId: MESSAGE_ID_ENDS_WITH_PLUGIN,
188
+ node: reportNode
189
+ });
190
+ }
191
+ }
192
+ };
193
+ },
194
+ meta: {
195
+ docs: {
196
+ description: "Enforce the Community directory's constraints on a plugin's `manifest.json` `id`"
197
+ },
198
+ messages: {
199
+ [MESSAGE_ID_CONTAINS_OBSIDIAN]: "The `id` must not contain `obsidian`. It is implied by the context of the plugin directory.",
200
+ [MESSAGE_ID_ENDS_WITH_PLUGIN]: "The `id` must not end with `plugin`.",
201
+ [MESSAGE_ID_INVALID_CHARACTERS]: "The `id` must contain only lowercase letters, digits and hyphens."
202
+ },
203
+ schema: [],
204
+ type: "problem"
205
+ }
206
+ };
207
+ // Annotate the CommonJS export names for ESM import in node:
208
+ 0 && (module.exports = {
209
+ MESSAGE_ID_CONTAINS_OBSIDIAN,
210
+ MESSAGE_ID_ENDS_WITH_PLUGIN,
211
+ MESSAGE_ID_INVALID_CHARACTERS,
212
+ manifestId
213
+ });
214
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9tYW5pZmVzdC1pZC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEVTTGludCBydWxlOiBtYW5pZmVzdC1pZFxuICpcbiAqIEVuZm9yY2VzIHRoZSBDb21tdW5pdHkgZGlyZWN0b3J5J3MgY29uc3RyYWludHMgb24gYSBwbHVnaW4ncyBgbWFuaWZlc3QuanNvbmAgYGlkYDogbG93ZXJjYXNlIGxldHRlcnMsXG4gKiBkaWdpdHMgYW5kIGh5cGhlbnMgb25seTsgbmV2ZXIgY29udGFpbmluZyBgb2JzaWRpYW5gOyBuZXZlciBlbmRpbmcgd2l0aCBgcGx1Z2luYC5cbiAqXG4gKiBBIHB1Ymxpc2hlZCBpZCBjYW4gbmV2ZXIgYmUgY2hhbmdlZCwgc28gYSB2aW9sYXRpb24gaW4gYW4gYWxyZWFkeS1saXN0ZWQgcGx1Z2luIGlzIHBlcm1hbmVudCBhbmQgdGhlXG4gKiBvbmx5IHJlbWVkeSBpcyB0dXJuaW5nIHRoaXMgcnVsZSBvZmYgZm9yIHRoYXQgcmVwbyB3aXRoIHRoZSByZWFzb24gd3JpdHRlbiBiZXNpZGUgaXQuXG4gKlxuICogUnVucyBvbiB0aGUgYEBlc2xpbnQvanNvbmAgYGpzb24vanNvbmAgbGFuZ3VhZ2U7IHNlZSBgbWFuaWZlc3QtaGVscGVycy50c2AgZm9yIHdoeSB0aGUgQVNUIGlzIE1vbW9hXG4gKiByYXRoZXIgdGhhbiBFU1RyZWUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSdWxlIH0gZnJvbSAnZXNsaW50JztcblxuaW1wb3J0IHtcbiAgZmluZE1hbmlmZXN0TWVtYmVyLFxuICBnZXRNYW5pZmVzdE9iamVjdCxcbiAgZ2V0U3RyaW5nVmFsdWUsXG4gIHRvUmVwb3J0Tm9kZVxufSBmcm9tICcuL21hbmlmZXN0LWhlbHBlcnMudHMnO1xuXG4vKipcbk1lc3NhZ2UgSUQgcmVwb3J0ZWQgd2hlbiB0aGUgaWQgY29udGFpbnMgYG9ic2lkaWFuYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSURfQ09OVEFJTlNfT0JTSURJQU4gPSAnaWRDb250YWluc09ic2lkaWFuJztcblxuLyoqXG5NZXNzYWdlIElEIHJlcG9ydGVkIHdoZW4gdGhlIGlkIGVuZHMgd2l0aCBgcGx1Z2luYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSURfRU5EU19XSVRIX1BMVUdJTiA9ICdpZEVuZHNXaXRoUGx1Z2luJztcblxuLyoqXG5NZXNzYWdlIElEIHJlcG9ydGVkIHdoZW4gdGhlIGlkIGhvbGRzIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBsb3dlcmNhc2UgbGV0dGVycywgZGlnaXRzIGFuZCBoeXBoZW5zLlxuICovXG5leHBvcnQgY29uc3QgTUVTU0FHRV9JRF9JTlZBTElEX0NIQVJBQ1RFUlMgPSAnaWRJbnZhbGlkQ2hhcmFjdGVycyc7XG5cbi8qKlxuVGhlIG9ubHkgY2hhcmFjdGVycyBhIHBsdWdpbiBpZCBtYXkgaG9sZC5cbiAqL1xuY29uc3QgQUxMT1dFRF9JRF9DSEFSQUNURVJTID0gL15bYS16MC05LV0rJC87XG5cbi8qKlxuICogRVNMaW50IHJ1bGUgZW5mb3JjaW5nIHRoZSBDb21tdW5pdHkgZGlyZWN0b3J5J3MgY29uc3RyYWludHMgb24gYSBwbHVnaW4ncyBgbWFuaWZlc3QuanNvbmAgYGlkYC5cbiAqL1xuZXhwb3J0IGNvbnN0IG1hbmlmZXN0SWQ6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgRG9jdW1lbnQobm9kZTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBjb25zdCBtYW5pZmVzdE9iamVjdCA9IGdldE1hbmlmZXN0T2JqZWN0KG5vZGUpO1xuXG4gICAgICAgIGlmICghbWFuaWZlc3RPYmplY3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZW1iZXIgPSBmaW5kTWFuaWZlc3RNZW1iZXIobWFuaWZlc3RPYmplY3QsICdpZCcpO1xuXG4gICAgICAgIGlmICghbWVtYmVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWQgPSBnZXRTdHJpbmdWYWx1ZShtZW1iZXIudmFsdWUpO1xuXG4gICAgICAgIGlmIChpZCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlcG9ydE5vZGUgPSB0b1JlcG9ydE5vZGUobWVtYmVyLnZhbHVlKTtcblxuICAgICAgICBpZiAoIUFMTE9XRURfSURfQ0hBUkFDVEVSUy50ZXN0KGlkKSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogTUVTU0FHRV9JRF9JTlZBTElEX0NIQVJBQ1RFUlMsXG4gICAgICAgICAgICBub2RlOiByZXBvcnROb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnb2JzaWRpYW4nKSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogTUVTU0FHRV9JRF9DT05UQUlOU19PQlNJRElBTixcbiAgICAgICAgICAgIG5vZGU6IHJlcG9ydE5vZGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCdwbHVnaW4nKSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogTUVTU0FHRV9JRF9FTkRTX1dJVEhfUExVR0lOLFxuICAgICAgICAgICAgbm9kZTogcmVwb3J0Tm9kZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRW5mb3JjZSB0aGUgQ29tbXVuaXR5IGRpcmVjdG9yeVxcJ3MgY29uc3RyYWludHMgb24gYSBwbHVnaW5cXCdzIGBtYW5pZmVzdC5qc29uYCBgaWRgJ1xuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtNRVNTQUdFX0lEX0NPTlRBSU5TX09CU0lESUFOXTogJ1RoZSBgaWRgIG11c3Qgbm90IGNvbnRhaW4gYG9ic2lkaWFuYC4gSXQgaXMgaW1wbGllZCBieSB0aGUgY29udGV4dCBvZiB0aGUgcGx1Z2luIGRpcmVjdG9yeS4nLFxuICAgICAgW01FU1NBR0VfSURfRU5EU19XSVRIX1BMVUdJTl06ICdUaGUgYGlkYCBtdXN0IG5vdCBlbmQgd2l0aCBgcGx1Z2luYC4nLFxuICAgICAgW01FU1NBR0VfSURfSU5WQUxJRF9DSEFSQUNURVJTXTogJ1RoZSBgaWRgIG11c3QgY29udGFpbiBvbmx5IGxvd2VyY2FzZSBsZXR0ZXJzLCBkaWdpdHMgYW5kIGh5cGhlbnMuJ1xuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgICB0eXBlOiAncHJvYmxlbSdcbiAgfVxufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBaUJBLDhCQUtPO0FBS0EsTUFBTSwrQkFBK0I7QUFLckMsTUFBTSw4QkFBOEI7QUFLcEMsTUFBTSxnQ0FBZ0M7QUFLN0MsTUFBTSx3QkFBd0I7QUFLdkIsTUFBTSxhQUE4QjtBQUFBLEVBQ3pDLE9BQU8sU0FBUztBQUNkLFdBQU87QUFBQSxNQUNMLFNBQVMsTUFBcUI7QUFDNUIsY0FBTSxxQkFBaUIsMkNBQWtCLElBQUk7QUFFN0MsWUFBSSxDQUFDLGdCQUFnQjtBQUNuQjtBQUFBLFFBQ0Y7QUFFQSxjQUFNLGFBQVMsNENBQW1CLGdCQUFnQixJQUFJO0FBRXRELFlBQUksQ0FBQyxRQUFRO0FBQ1g7QUFBQSxRQUNGO0FBRUEsY0FBTSxTQUFLLHdDQUFlLE9BQU8sS0FBSztBQUV0QyxZQUFJLE9BQU8sTUFBTTtBQUNmO0FBQUEsUUFDRjtBQUVBLGNBQU0saUJBQWEsc0NBQWEsT0FBTyxLQUFLO0FBRTVDLFlBQUksQ0FBQyxzQkFBc0IsS0FBSyxFQUFFLEdBQUc7QUFDbkMsa0JBQVEsT0FBTztBQUFBLFlBQ2IsV0FBVztBQUFBLFlBQ1gsTUFBTTtBQUFBLFVBQ1IsQ0FBQztBQUFBLFFBQ0g7QUFFQSxZQUFJLEdBQUcsWUFBWSxFQUFFLFNBQVMsVUFBVSxHQUFHO0FBQ3pDLGtCQUFRLE9BQU87QUFBQSxZQUNiLFdBQVc7QUFBQSxZQUNYLE1BQU07QUFBQSxVQUNSLENBQUM7QUFBQSxRQUNIO0FBRUEsWUFBSSxHQUFHLFlBQVksRUFBRSxTQUFTLFFBQVEsR0FBRztBQUN2QyxrQkFBUSxPQUFPO0FBQUEsWUFDYixXQUFXO0FBQUEsWUFDWCxNQUFNO0FBQUEsVUFDUixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBQ0EsTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLENBQUMsNEJBQTRCLEdBQUc7QUFBQSxNQUNoQyxDQUFDLDJCQUEyQixHQUFHO0FBQUEsTUFDL0IsQ0FBQyw2QkFBNkIsR0FBRztBQUFBLElBQ25DO0FBQUEsSUFDQSxRQUFRLENBQUM7QUFBQSxJQUNULE1BQU07QUFBQSxFQUNSO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,32 @@
1
+ /// <reference path="../../../library.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * ESLint rule: manifest-id
6
+ *
7
+ * Enforces the Community directory's constraints on a plugin's `manifest.json` `id`: lowercase letters,
8
+ * digits and hyphens only; never containing `obsidian`; never ending with `plugin`.
9
+ *
10
+ * A published id can never be changed, so a violation in an already-listed plugin is permanent and the
11
+ * only remedy is turning this rule off for that repo with the reason written beside it.
12
+ *
13
+ * Runs on the `@eslint/json` `json/json` language; see `manifest-helpers.ts` for why the AST is Momoa
14
+ * rather than ESTree.
15
+ */
16
+ import type { Rule } from 'eslint' with { 'resolution-mode': 'import' };
17
+ /**
18
+ Message ID reported when the id contains `obsidian`.
19
+ */
20
+ export declare const MESSAGE_ID_CONTAINS_OBSIDIAN = "idContainsObsidian";
21
+ /**
22
+ Message ID reported when the id ends with `plugin`.
23
+ */
24
+ export declare const MESSAGE_ID_ENDS_WITH_PLUGIN = "idEndsWithPlugin";
25
+ /**
26
+ Message ID reported when the id holds characters other than lowercase letters, digits and hyphens.
27
+ */
28
+ export declare const MESSAGE_ID_INVALID_CHARACTERS = "idInvalidCharacters";
29
+ /**
30
+ * ESLint rule enforcing the Community directory's constraints on a plugin's `manifest.json` `id`.
31
+ */
32
+ export declare const manifestId: Rule.RuleModule;
@@ -0,0 +1,215 @@
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 () {
7
+ function ensureBrowserProcess() {
8
+ const browserProcess = {
9
+ browser: true,
10
+ cwd() {
11
+ return '/';
12
+ },
13
+ env: {},
14
+ platform: 'android'
15
+ };
16
+
17
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
18
+ const existingProcess = globalThis.process;
19
+
20
+ if (!existingProcess) {
21
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+
26
+ if (existingProcess.versions?.node) {
27
+ return;
28
+ }
29
+
30
+ const existingProcessRecord = existingProcess;
31
+
32
+ for (const [key, value] of Object.entries(browserProcess)) {
33
+ existingProcessRecord[key] ??= value;
34
+ }
35
+
36
+ existingProcessRecord['browser'] = true;
37
+ }
38
+
39
+ function keepName($unknown) {
40
+ return $unknown;
41
+ }
42
+
43
+ (function initCjs() {
44
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
45
+ const globalThisRecord = globalThis;
46
+ globalThisRecord['__name'] ??= keepName;
47
+ const originalRequire = require;
48
+ if (originalRequire && !originalRequire.__isPatched) {
49
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
50
+ require = Object.assign(
51
+ (id) => requirePatched(id),
52
+ originalRequire,
53
+ {
54
+ __isPatched: true
55
+ }
56
+ );
57
+ }
58
+
59
+ globalThisRecord['__extractDefault'] ??= extractDefault;
60
+
61
+ ensureBrowserProcess();
62
+
63
+ function extractDefault(module) {
64
+ return module && module.__esModule && 'default' in module ? module.default : module;
65
+ }
66
+
67
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
68
+ '@codemirror/autocomplete',
69
+ '@codemirror/collab',
70
+ '@codemirror/commands',
71
+ '@codemirror/language',
72
+ '@codemirror/lint',
73
+ '@codemirror/search',
74
+ '@codemirror/state',
75
+ '@codemirror/text',
76
+ '@codemirror/view',
77
+ '@lezer/common',
78
+ '@lezer/highlight',
79
+ '@lezer/lr',
80
+ 'obsidian']
81
+ );
82
+
83
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
84
+ '@codemirror/closebrackets',
85
+ '@codemirror/comment',
86
+ '@codemirror/fold',
87
+ '@codemirror/gutter',
88
+ '@codemirror/highlight',
89
+ '@codemirror/history',
90
+ '@codemirror/matchbrackets',
91
+ '@codemirror/panel',
92
+ '@codemirror/rangeset',
93
+ '@codemirror/rectangular-selection',
94
+ '@codemirror/stream-parser',
95
+ '@codemirror/tooltip']
96
+ );
97
+
98
+ function requirePatched(id) {
99
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
100
+ return originalRequire?.(id);
101
+ }
102
+
103
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
104
+ if (globalThis.app.isMobile) {
105
+ if (id === 'process' || id === 'node:process') {
106
+ // eslint-disable-next-line no-console -- Valid usage.
107
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
108
+
109
+ return process;
110
+ }
111
+ } else {
112
+ const module = originalRequire?.(id);
113
+ if (module) {
114
+ return extractDefault(module);
115
+ }
116
+ }
117
+
118
+ // eslint-disable-next-line no-console -- Valid usage.
119
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
120
+ return {};
121
+ }
122
+ })();
123
+ })();
124
+
125
+ "use strict";
126
+ var __defProp = Object.defineProperty;
127
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
128
+ var __getOwnPropNames = Object.getOwnPropertyNames;
129
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
130
+ var __export = (target, all) => {
131
+ for (var name in all)
132
+ __defProp(target, name, { get: all[name], enumerable: true });
133
+ };
134
+ var __copyProps = (to, from, except, desc) => {
135
+ if (from && typeof from === "object" || typeof from === "function") {
136
+ for (let key of __getOwnPropNames(from))
137
+ if (!__hasOwnProp.call(to, key) && key !== except)
138
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
139
+ }
140
+ return to;
141
+ };
142
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
143
+ var manifest_name_exports = {};
144
+ __export(manifest_name_exports, {
145
+ MESSAGE_ID_CONTAINS_OBSIDIAN: () => MESSAGE_ID_CONTAINS_OBSIDIAN,
146
+ MESSAGE_ID_CONTAINS_PLUGIN: () => MESSAGE_ID_CONTAINS_PLUGIN,
147
+ MESSAGE_ID_INVALID_CHARACTERS: () => MESSAGE_ID_INVALID_CHARACTERS,
148
+ manifestName: () => manifestName
149
+ });
150
+ module.exports = __toCommonJS(manifest_name_exports);
151
+ var import_manifest_helpers = require('./manifest-helpers.cjs');
152
+ const MESSAGE_ID_CONTAINS_OBSIDIAN = "nameContainsObsidian";
153
+ const MESSAGE_ID_CONTAINS_PLUGIN = "nameContainsPlugin";
154
+ const MESSAGE_ID_INVALID_CHARACTERS = "nameInvalidCharacters";
155
+ const ALLOWED_NAME_CHARACTERS = /^[A-Za-z0-9 \-+()]+$/;
156
+ const OBSIDIAN_VARIANTS = /obsi|sidian/i;
157
+ const manifestName = {
158
+ create(context) {
159
+ return {
160
+ Document(node) {
161
+ const manifestObject = (0, import_manifest_helpers.getManifestObject)(node);
162
+ if (!manifestObject) {
163
+ return;
164
+ }
165
+ const member = (0, import_manifest_helpers.findManifestMember)(manifestObject, "name");
166
+ if (!member) {
167
+ return;
168
+ }
169
+ const name = (0, import_manifest_helpers.getStringValue)(member.value);
170
+ if (name === null) {
171
+ return;
172
+ }
173
+ const reportNode = (0, import_manifest_helpers.toReportNode)(member.value);
174
+ if (OBSIDIAN_VARIANTS.test(name)) {
175
+ context.report({
176
+ messageId: MESSAGE_ID_CONTAINS_OBSIDIAN,
177
+ node: reportNode
178
+ });
179
+ }
180
+ if (name.toLowerCase().includes("plugin")) {
181
+ context.report({
182
+ messageId: MESSAGE_ID_CONTAINS_PLUGIN,
183
+ node: reportNode
184
+ });
185
+ }
186
+ if (!ALLOWED_NAME_CHARACTERS.test(name)) {
187
+ context.report({
188
+ messageId: MESSAGE_ID_INVALID_CHARACTERS,
189
+ node: reportNode
190
+ });
191
+ }
192
+ }
193
+ };
194
+ },
195
+ meta: {
196
+ docs: {
197
+ description: "Enforce the Community directory's constraints on a plugin's `manifest.json` `name`"
198
+ },
199
+ messages: {
200
+ [MESSAGE_ID_CONTAINS_OBSIDIAN]: "The `name` must not contain `Obsidian` or a variant of it. It is implied by the context of the plugin directory.",
201
+ [MESSAGE_ID_CONTAINS_PLUGIN]: "The `name` must not contain `Plugin`.",
202
+ [MESSAGE_ID_INVALID_CHARACTERS]: "The `name` must use Basic Latin only, with hyphens, plus signs and parentheses the only permitted punctuation."
203
+ },
204
+ schema: [],
205
+ type: "problem"
206
+ }
207
+ };
208
+ // Annotate the CommonJS export names for ESM import in node:
209
+ 0 && (module.exports = {
210
+ MESSAGE_ID_CONTAINS_OBSIDIAN,
211
+ MESSAGE_ID_CONTAINS_PLUGIN,
212
+ MESSAGE_ID_INVALID_CHARACTERS,
213
+ manifestName
214
+ });
215
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9tYW5pZmVzdC1uYW1lLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRVNMaW50IHJ1bGU6IG1hbmlmZXN0LW5hbWVcbiAqXG4gKiBFbmZvcmNlcyB0aGUgQ29tbXVuaXR5IGRpcmVjdG9yeSdzIGNvbnN0cmFpbnRzIG9uIGEgcGx1Z2luJ3MgYG1hbmlmZXN0Lmpzb25gIGBuYW1lYDogbm8gYE9ic2lkaWFuYCBvclxuICogaXRzIHZhcmlhbnRzLCBubyBgUGx1Z2luYCwgYW5kIEJhc2ljIExhdGluIG9ubHkgd2l0aCBoeXBoZW5zLCBwbHVzIHNpZ25zIGFuZCBwYXJlbnRoZXNlcyB0aGUgc29sZVxuICogcGVybWl0dGVkIHB1bmN0dWF0aW9uLlxuICpcbiAqIFJ1bnMgb24gdGhlIGBAZXNsaW50L2pzb25gIGBqc29uL2pzb25gIGxhbmd1YWdlOyBzZWUgYG1hbmlmZXN0LWhlbHBlcnMudHNgIGZvciB3aHkgdGhlIEFTVCBpcyBNb21vYVxuICogcmF0aGVyIHRoYW4gRVNUcmVlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gJ2VzbGludCc7XG5cbmltcG9ydCB7XG4gIGZpbmRNYW5pZmVzdE1lbWJlcixcbiAgZ2V0TWFuaWZlc3RPYmplY3QsXG4gIGdldFN0cmluZ1ZhbHVlLFxuICB0b1JlcG9ydE5vZGVcbn0gZnJvbSAnLi9tYW5pZmVzdC1oZWxwZXJzLnRzJztcblxuLyoqXG5NZXNzYWdlIElEIHJlcG9ydGVkIHdoZW4gdGhlIG5hbWUgY29udGFpbnMgYE9ic2lkaWFuYCBvciBvbmUgb2YgaXRzIHZhcmlhbnRzLlxuICovXG5leHBvcnQgY29uc3QgTUVTU0FHRV9JRF9DT05UQUlOU19PQlNJRElBTiA9ICduYW1lQ29udGFpbnNPYnNpZGlhbic7XG5cbi8qKlxuTWVzc2FnZSBJRCByZXBvcnRlZCB3aGVuIHRoZSBuYW1lIGNvbnRhaW5zIGBQbHVnaW5gLlxuICovXG5leHBvcnQgY29uc3QgTUVTU0FHRV9JRF9DT05UQUlOU19QTFVHSU4gPSAnbmFtZUNvbnRhaW5zUGx1Z2luJztcblxuLyoqXG5NZXNzYWdlIElEIHJlcG9ydGVkIHdoZW4gdGhlIG5hbWUgaG9sZHMgYSBjaGFyYWN0ZXIgb3V0c2lkZSBCYXNpYyBMYXRpbiwgb3IgcHVuY3R1YXRpb24gdGhlIGRpcmVjdG9yeSByZWplY3RzLlxuICovXG5leHBvcnQgY29uc3QgTUVTU0FHRV9JRF9JTlZBTElEX0NIQVJBQ1RFUlMgPSAnbmFtZUludmFsaWRDaGFyYWN0ZXJzJztcblxuLyoqXG5UaGUgb25seSBjaGFyYWN0ZXJzIGEgcGx1Z2luIG5hbWUgbWF5IGhvbGQ6IEJhc2ljIExhdGluIGxldHRlcnMgYW5kIGRpZ2l0cywgc3BhY2VzLCBhbmQgdGhlIHRocmVlXG5wZXJtaXR0ZWQgcHVuY3R1YXRpb24gbWFya3MuXG4gKi9cbmNvbnN0IEFMTE9XRURfTkFNRV9DSEFSQUNURVJTID0gL15bQS1aYS16MC05IFxcLSsoKV0rJC87XG5cbi8qKlxuYE9ic2lkaWFuYCBhbmQgdGhlIHR3byB2YXJpYW50cyB0aGUgZGlyZWN0b3J5IGFsc28gcmVqZWN0cy5cbiAqL1xuY29uc3QgT0JTSURJQU5fVkFSSUFOVFMgPSAvb2JzaXxzaWRpYW4vaTtcblxuLyoqXG4gKiBFU0xpbnQgcnVsZSBlbmZvcmNpbmcgdGhlIENvbW11bml0eSBkaXJlY3RvcnkncyBjb25zdHJhaW50cyBvbiBhIHBsdWdpbidzIGBtYW5pZmVzdC5qc29uYCBgbmFtZWAuXG4gKi9cbmV4cG9ydCBjb25zdCBtYW5pZmVzdE5hbWU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgRG9jdW1lbnQobm9kZTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBjb25zdCBtYW5pZmVzdE9iamVjdCA9IGdldE1hbmlmZXN0T2JqZWN0KG5vZGUpO1xuXG4gICAgICAgIGlmICghbWFuaWZlc3RPYmplY3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZW1iZXIgPSBmaW5kTWFuaWZlc3RNZW1iZXIobWFuaWZlc3RPYmplY3QsICduYW1lJyk7XG5cbiAgICAgICAgaWYgKCFtZW1iZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuYW1lID0gZ2V0U3RyaW5nVmFsdWUobWVtYmVyLnZhbHVlKTtcblxuICAgICAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlcG9ydE5vZGUgPSB0b1JlcG9ydE5vZGUobWVtYmVyLnZhbHVlKTtcblxuICAgICAgICBpZiAoT0JTSURJQU5fVkFSSUFOVFMudGVzdChuYW1lKSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogTUVTU0FHRV9JRF9DT05UQUlOU19PQlNJRElBTixcbiAgICAgICAgICAgIG5vZGU6IHJlcG9ydE5vZGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3BsdWdpbicpKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbWVzc2FnZUlkOiBNRVNTQUdFX0lEX0NPTlRBSU5TX1BMVUdJTixcbiAgICAgICAgICAgIG5vZGU6IHJlcG9ydE5vZGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghQUxMT1dFRF9OQU1FX0NIQVJBQ1RFUlMudGVzdChuYW1lKSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogTUVTU0FHRV9JRF9JTlZBTElEX0NIQVJBQ1RFUlMsXG4gICAgICAgICAgICBub2RlOiByZXBvcnROb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBtZXRhOiB7XG4gICAgZG9jczoge1xuICAgICAgZGVzY3JpcHRpb246ICdFbmZvcmNlIHRoZSBDb21tdW5pdHkgZGlyZWN0b3J5XFwncyBjb25zdHJhaW50cyBvbiBhIHBsdWdpblxcJ3MgYG1hbmlmZXN0Lmpzb25gIGBuYW1lYCdcbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBbTUVTU0FHRV9JRF9DT05UQUlOU19PQlNJRElBTl06ICdUaGUgYG5hbWVgIG11c3Qgbm90IGNvbnRhaW4gYE9ic2lkaWFuYCBvciBhIHZhcmlhbnQgb2YgaXQuIEl0IGlzIGltcGxpZWQgYnkgdGhlIGNvbnRleHQgb2YgdGhlIHBsdWdpbiBkaXJlY3RvcnkuJyxcbiAgICAgIFtNRVNTQUdFX0lEX0NPTlRBSU5TX1BMVUdJTl06ICdUaGUgYG5hbWVgIG11c3Qgbm90IGNvbnRhaW4gYFBsdWdpbmAuJyxcbiAgICAgIFtNRVNTQUdFX0lEX0lOVkFMSURfQ0hBUkFDVEVSU106ICdUaGUgYG5hbWVgIG11c3QgdXNlIEJhc2ljIExhdGluIG9ubHksIHdpdGggaHlwaGVucywgcGx1cyBzaWducyBhbmQgcGFyZW50aGVzZXMgdGhlIG9ubHkgcGVybWl0dGVkIHB1bmN0dWF0aW9uLidcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gICAgdHlwZTogJ3Byb2JsZW0nXG4gIH1cbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVBLDhCQUtPO0FBS0EsTUFBTSwrQkFBK0I7QUFLckMsTUFBTSw2QkFBNkI7QUFLbkMsTUFBTSxnQ0FBZ0M7QUFNN0MsTUFBTSwwQkFBMEI7QUFLaEMsTUFBTSxvQkFBb0I7QUFLbkIsTUFBTSxlQUFnQztBQUFBLEVBQzNDLE9BQU8sU0FBUztBQUNkLFdBQU87QUFBQSxNQUNMLFNBQVMsTUFBcUI7QUFDNUIsY0FBTSxxQkFBaUIsMkNBQWtCLElBQUk7QUFFN0MsWUFBSSxDQUFDLGdCQUFnQjtBQUNuQjtBQUFBLFFBQ0Y7QUFFQSxjQUFNLGFBQVMsNENBQW1CLGdCQUFnQixNQUFNO0FBRXhELFlBQUksQ0FBQyxRQUFRO0FBQ1g7QUFBQSxRQUNGO0FBRUEsY0FBTSxXQUFPLHdDQUFlLE9BQU8sS0FBSztBQUV4QyxZQUFJLFNBQVMsTUFBTTtBQUNqQjtBQUFBLFFBQ0Y7QUFFQSxjQUFNLGlCQUFhLHNDQUFhLE9BQU8sS0FBSztBQUU1QyxZQUFJLGtCQUFrQixLQUFLLElBQUksR0FBRztBQUNoQyxrQkFBUSxPQUFPO0FBQUEsWUFDYixXQUFXO0FBQUEsWUFDWCxNQUFNO0FBQUEsVUFDUixDQUFDO0FBQUEsUUFDSDtBQUVBLFlBQUksS0FBSyxZQUFZLEVBQUUsU0FBUyxRQUFRLEdBQUc7QUFDekMsa0JBQVEsT0FBTztBQUFBLFlBQ2IsV0FBVztBQUFBLFlBQ1gsTUFBTTtBQUFBLFVBQ1IsQ0FBQztBQUFBLFFBQ0g7QUFFQSxZQUFJLENBQUMsd0JBQXdCLEtBQUssSUFBSSxHQUFHO0FBQ3ZDLGtCQUFRLE9BQU87QUFBQSxZQUNiLFdBQVc7QUFBQSxZQUNYLE1BQU07QUFBQSxVQUNSLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsTUFDSixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsQ0FBQyw0QkFBNEIsR0FBRztBQUFBLE1BQ2hDLENBQUMsMEJBQTBCLEdBQUc7QUFBQSxNQUM5QixDQUFDLDZCQUE2QixHQUFHO0FBQUEsSUFDbkM7QUFBQSxJQUNBLFFBQVEsQ0FBQztBQUFBLElBQ1QsTUFBTTtBQUFBLEVBQ1I7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,30 @@
1
+ /// <reference path="../../../library.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * ESLint rule: manifest-name
6
+ *
7
+ * Enforces the Community directory's constraints on a plugin's `manifest.json` `name`: no `Obsidian` or
8
+ * its variants, no `Plugin`, and Basic Latin only with hyphens, plus signs and parentheses the sole
9
+ * permitted punctuation.
10
+ *
11
+ * Runs on the `@eslint/json` `json/json` language; see `manifest-helpers.ts` for why the AST is Momoa
12
+ * rather than ESTree.
13
+ */
14
+ import type { Rule } from 'eslint' with { 'resolution-mode': 'import' };
15
+ /**
16
+ Message ID reported when the name contains `Obsidian` or one of its variants.
17
+ */
18
+ export declare const MESSAGE_ID_CONTAINS_OBSIDIAN = "nameContainsObsidian";
19
+ /**
20
+ Message ID reported when the name contains `Plugin`.
21
+ */
22
+ export declare const MESSAGE_ID_CONTAINS_PLUGIN = "nameContainsPlugin";
23
+ /**
24
+ Message ID reported when the name holds a character outside Basic Latin, or punctuation the directory rejects.
25
+ */
26
+ export declare const MESSAGE_ID_INVALID_CHARACTERS = "nameInvalidCharacters";
27
+ /**
28
+ * ESLint rule enforcing the Community directory's constraints on a plugin's `manifest.json` `name`.
29
+ */
30
+ export declare const manifestName: Rule.RuleModule;