obsidian-dev-utils 96.6.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.
- package/CHANGELOG.md +22 -0
- package/LICENSE +1 -1
- package/dist/integration-test-plugin/main.js +1762 -4197
- package/dist/lib/cjs/__merged.cjs +17 -9
- package/dist/lib/cjs/__merged.d.cts +3 -1
- package/dist/lib/cjs/desktop-zip-extractor.cjs +276 -0
- package/dist/lib/cjs/desktop-zip-extractor.d.cts +94 -0
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +38 -38
- package/dist/lib/cjs/obsidian/demo-vault-naming.cjs +167 -0
- package/dist/lib/cjs/obsidian/demo-vault-naming.d.cts +54 -0
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +20 -21
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +21 -16
- package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +9 -9
- package/dist/lib/cjs/obsidian/desktop-trusted-input.d.cts +23 -4
- package/dist/lib/cjs/obsidian/index.cjs +10 -1
- package/dist/lib/cjs/obsidian/index.d.cts +3 -0
- package/dist/lib/cjs/obsidian/mobile-trusted-input.cjs +195 -0
- package/dist/lib/cjs/obsidian/mobile-trusted-input.d.cts +93 -0
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -1
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +4 -0
- package/dist/lib/cjs/obsidian/resource-lock.cjs +122 -122
- package/dist/lib/cjs/obsidian/trusted-input.cjs +206 -0
- package/dist/lib/cjs/obsidian/trusted-input.d.cts +126 -0
- package/dist/lib/cjs/script-utils/build.cjs +30 -6
- package/dist/lib/cjs/script-utils/build.d.cts +5 -0
- package/dist/lib/cjs/script-utils/demo-vault.cjs +26 -6
- package/dist/lib/cjs/script-utils/demo-vault.d.cts +12 -8
- package/dist/lib/cjs/script-utils/exec.cjs +1 -1
- package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -2
- package/dist/lib/cjs/script-utils/index.cjs +4 -1
- package/dist/lib/cjs/script-utils/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/cspell.cjs +3 -3
- package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +39 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +16 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +5 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.cjs +254 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.d.cts +54 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.cjs +217 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.d.cts +141 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.cjs +214 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.d.cts +32 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.cjs +215 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.d.cts +30 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.cjs +318 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.d.cts +45 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +9 -1
- package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -2
- package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +4 -4
- package/dist/lib/cjs/script-utils/npm-run.cjs +4 -3
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +10 -1
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +37 -1
- package/dist/lib/cjs/script-utils/package-manager.cjs +287 -0
- package/dist/lib/cjs/script-utils/package-manager.d.cts +77 -0
- package/dist/lib/cjs/script-utils/version.cjs +21 -9
- package/dist/lib/esm/__merged.d.mts +3 -1
- package/dist/lib/esm/__merged.mjs +18 -10
- package/dist/lib/esm/desktop-zip-extractor.d.mts +94 -0
- package/dist/lib/esm/desktop-zip-extractor.mjs +174 -0
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +38 -38
- package/dist/lib/esm/obsidian/demo-vault-naming.d.mts +54 -0
- package/dist/lib/esm/obsidian/demo-vault-naming.mjs +61 -0
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +21 -16
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +23 -11
- package/dist/lib/esm/obsidian/desktop-trusted-input.d.mts +23 -4
- package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +9 -9
- package/dist/lib/esm/obsidian/index.d.mts +3 -0
- package/dist/lib/esm/obsidian/index.mjs +7 -1
- package/dist/lib/esm/obsidian/mobile-trusted-input.d.mts +93 -0
- package/dist/lib/esm/obsidian/mobile-trusted-input.mjs +84 -0
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +4 -0
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -1
- package/dist/lib/esm/obsidian/resource-lock.mjs +122 -122
- package/dist/lib/esm/obsidian/trusted-input.d.mts +126 -0
- package/dist/lib/esm/obsidian/trusted-input.mjs +85 -0
- package/dist/lib/esm/script-utils/build.d.mts +5 -0
- package/dist/lib/esm/script-utils/build.mjs +30 -6
- package/dist/lib/esm/script-utils/demo-vault.d.mts +12 -8
- package/dist/lib/esm/script-utils/demo-vault.mjs +29 -6
- package/dist/lib/esm/script-utils/exec.mjs +1 -1
- package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -2
- package/dist/lib/esm/script-utils/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/index.mjs +3 -1
- package/dist/lib/esm/script-utils/linters/cspell.mjs +3 -3
- package/dist/lib/esm/script-utils/linters/eslint-config.mjs +39 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +5 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +11 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.d.mts +54 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.mjs +148 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.d.mts +141 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.mjs +92 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.d.mts +32 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.mjs +111 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.d.mts +30 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.mjs +112 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.d.mts +45 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.mjs +217 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +9 -1
- package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -2
- package/dist/lib/esm/script-utils/linters/markdownlint.mjs +4 -4
- package/dist/lib/esm/script-utils/npm-run.mjs +4 -3
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +37 -1
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +10 -1
- package/dist/lib/esm/script-utils/package-manager.d.mts +77 -0
- package/dist/lib/esm/script-utils/package-manager.mjs +173 -0
- package/dist/lib/esm/script-utils/version.mjs +21 -9
- package/obsidian/demo-vault-naming/package.json +6 -0
- package/obsidian/mobile-trusted-input/package.json +6 -0
- package/obsidian/trusted-input/package.json +6 -0
- package/package.json +19 -17
- package/script-utils/linters/eslint-rules/manifest-description/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-helpers/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-id/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-name/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-schema/package.json +6 -0
- package/script-utils/package-manager/package.json +6 -0
|
@@ -0,0 +1,148 @@
|
|
|
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 initEsm() {
|
|
40
|
+
ensureBrowserProcess();
|
|
41
|
+
})();
|
|
42
|
+
})();
|
|
43
|
+
|
|
44
|
+
import {
|
|
45
|
+
findManifestMember,
|
|
46
|
+
getManifestObject,
|
|
47
|
+
getStringValue,
|
|
48
|
+
toReportNode
|
|
49
|
+
} from "./manifest-helpers.mjs";
|
|
50
|
+
const MESSAGE_ID_CONTAINS_OBSIDIAN = "descriptionContainsObsidian";
|
|
51
|
+
const MESSAGE_ID_MISSING_PERIOD = "descriptionMissingPeriod";
|
|
52
|
+
const MESSAGE_ID_NOT_CAPITALIZED = "descriptionNotCapitalized";
|
|
53
|
+
const MESSAGE_ID_SELF_REFERENCE = "descriptionSelfReference";
|
|
54
|
+
const MESSAGE_ID_TOO_LONG = "descriptionTooLong";
|
|
55
|
+
const MESSAGE_ID_TOO_SHORT = "descriptionTooShort";
|
|
56
|
+
const MAX_DESCRIPTION_LENGTH = 250;
|
|
57
|
+
const MIN_DESCRIPTION_LENGTH = 10;
|
|
58
|
+
const OBSIDIAN_WORD = /\bobsidian\b/i;
|
|
59
|
+
const SELF_REFERENCE_PATTERNS = [
|
|
60
|
+
/\bthis plugin\b/i,
|
|
61
|
+
/\bthis is a plugin\b/i,
|
|
62
|
+
/\ba plugin (?:that|which)\b/i,
|
|
63
|
+
/^the plugin\b/i,
|
|
64
|
+
/^plugin\b/i
|
|
65
|
+
];
|
|
66
|
+
const manifestDescription = {
|
|
67
|
+
create(context) {
|
|
68
|
+
return {
|
|
69
|
+
Document(node) {
|
|
70
|
+
const manifestObject = getManifestObject(node);
|
|
71
|
+
if (!manifestObject) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const member = findManifestMember(manifestObject, "description");
|
|
75
|
+
if (!member) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const description = getStringValue(member.value);
|
|
79
|
+
if (description === null) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const reportNode = toReportNode(member.value);
|
|
83
|
+
if (OBSIDIAN_WORD.test(description)) {
|
|
84
|
+
context.report({
|
|
85
|
+
messageId: MESSAGE_ID_CONTAINS_OBSIDIAN,
|
|
86
|
+
node: reportNode
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
if (SELF_REFERENCE_PATTERNS.some((pattern) => pattern.test(description))) {
|
|
90
|
+
context.report({
|
|
91
|
+
messageId: MESSAGE_ID_SELF_REFERENCE,
|
|
92
|
+
node: reportNode
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
if (description.length < MIN_DESCRIPTION_LENGTH) {
|
|
96
|
+
context.report({
|
|
97
|
+
messageId: MESSAGE_ID_TOO_SHORT,
|
|
98
|
+
node: reportNode
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
if (description.length > MAX_DESCRIPTION_LENGTH) {
|
|
102
|
+
context.report({
|
|
103
|
+
data: { maxLength: MAX_DESCRIPTION_LENGTH.toString() },
|
|
104
|
+
messageId: MESSAGE_ID_TOO_LONG,
|
|
105
|
+
node: reportNode
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (!/^[A-Z]/.test(description)) {
|
|
109
|
+
context.report({
|
|
110
|
+
messageId: MESSAGE_ID_NOT_CAPITALIZED,
|
|
111
|
+
node: reportNode
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
if (!description.endsWith(".")) {
|
|
115
|
+
context.report({
|
|
116
|
+
messageId: MESSAGE_ID_MISSING_PERIOD,
|
|
117
|
+
node: reportNode
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
},
|
|
123
|
+
meta: {
|
|
124
|
+
docs: {
|
|
125
|
+
description: "Enforce the Community directory's constraints on a plugin's `manifest.json` `description`"
|
|
126
|
+
},
|
|
127
|
+
messages: {
|
|
128
|
+
[MESSAGE_ID_CONTAINS_OBSIDIAN]: "The `description` must not contain the word `Obsidian`. It is implied by the context of the plugin directory.",
|
|
129
|
+
[MESSAGE_ID_MISSING_PERIOD]: "The `description` must end with a period.",
|
|
130
|
+
[MESSAGE_ID_NOT_CAPITALIZED]: "The `description` must start with a capital letter.",
|
|
131
|
+
[MESSAGE_ID_SELF_REFERENCE]: "The `description` must not refer to itself, e.g. `this plugin` or `a plugin that`. Describe what it does instead.",
|
|
132
|
+
[MESSAGE_ID_TOO_LONG]: "The `description` must be at most {{ maxLength }} characters.",
|
|
133
|
+
[MESSAGE_ID_TOO_SHORT]: "The `description` is too short to say what the plugin does."
|
|
134
|
+
},
|
|
135
|
+
schema: [],
|
|
136
|
+
type: "problem"
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
export {
|
|
140
|
+
MESSAGE_ID_CONTAINS_OBSIDIAN,
|
|
141
|
+
MESSAGE_ID_MISSING_PERIOD,
|
|
142
|
+
MESSAGE_ID_NOT_CAPITALIZED,
|
|
143
|
+
MESSAGE_ID_SELF_REFERENCE,
|
|
144
|
+
MESSAGE_ID_TOO_LONG,
|
|
145
|
+
MESSAGE_ID_TOO_SHORT,
|
|
146
|
+
manifestDescription
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9tYW5pZmVzdC1kZXNjcmlwdGlvbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEVTTGludCBydWxlOiBtYW5pZmVzdC1kZXNjcmlwdGlvblxuICpcbiAqIEVuZm9yY2VzIHRoZSBDb21tdW5pdHkgZGlyZWN0b3J5J3MgY29uc3RyYWludHMgb24gYSBwbHVnaW4ncyBgbWFuaWZlc3QuanNvbmAgYGRlc2NyaXB0aW9uYC5cbiAqXG4gKiBUd28gb2YgdGhlc2UgY2hlY2tzIGRlbGliZXJhdGVseSBkaXZlcmdlIGZyb20gYG9ic2lkaWFubWQvdmFsaWRhdGUtbWFuaWZlc3RgOlxuICpcbiAqIC0gKipTZWxmLXJlZmVyZW5jZSwgbm90IHRoZSB3b3JkIGBwbHVnaW5gLioqIFVwc3RyZWFtJ3MgYEZPUkJJRERFTl9XT1JEU2AgYmFucyB0aGUgYmFyZSBzdWJzdHJpbmdcbiAqICAgYHBsdWdpbmAgaW4gdGhlIGRlc2NyaXB0aW9uLCB3aGljaCByZWplY3RzIHR3byBkZXNjcmlwdGlvbnMgdGhlIGRpcmVjdG9yeSBpdHNlbGYgcGFzc2VkIHVudG91Y2hlZCAtXG4gKiAgIGBFbmhhbmNlcyBOb3RlIGNvbXBvc2VyIGNvcmUgcGx1Z2luLmAgYW5kIGAuLi5ub3QgcGx1Z2luIHVwZGF0ZXMuLi5gIC0gYmVjYXVzZSBlYWNoIG5hbWVzIHNvbWV0aGluZ1xuICogICBvdGhlciB0aGFuIGl0c2VsZi4gVGhlIGRpcmVjdG9yeSdzIGFjdHVhbCBvYmplY3Rpb24gaXMgc2VsZi1yZWZlcmVuY2UsIHNvIG9ubHkgc2VsZi1yZWZlcmVudGlhbFxuICogICBwaHJhc2VzIGFyZSBtYXRjaGVkIGhlcmUuXG4gKiAtICoqTm8gY2hhcmFjdGVyIHdoaXRlbGlzdC4qKiBVcHN0cmVhbSdzIGZvcm1hdCBjaGVjayByZWplY3RzIGFueXRoaW5nIG91dHNpZGVcbiAqICAgYFtBLVphLXowLTlcXHMuLCE/J1wiLV1gLCB3aGljaCBmYWlscyBiYWNrdGlja3MsIGVtIGRhc2hlcywgcGFyZW50aGVzZXMsIGNvbG9ucyBhbmQgc2xhc2hlcy4gU2V2ZW5cbiAqICAgbGl2ZSBsaXN0aW5ncyBjYXJyeSB0aG9zZSBhbmQgdGhlIGRpcmVjdG9yeSBmbGFnZ2VkIG5vbmUsIHNvIHRoZSBjaGVjayBpcyBub2lzZSByYXRoZXIgdGhhbiBhIGdhdGUuXG4gKlxuICogVGhlIG5vLWBPYnNpZGlhbmAgY2hlY2sgaGFzIHRoZSBvcHBvc2l0ZSBwcm92ZW5hbmNlOiB0aGUgZGlyZWN0b3J5IGVuZm9yY2VzIGl0IGFuZCBubyBPYnNpZGlhblxuICogZG9jdW1lbnQgc3RhdGVzIGl0LCB3aGljaCBpcyB3aGF0IGNvc3QgYSByZWxlYXNlZCBwbHVnaW4gYSB2ZXJzaW9uIGJ1bXAgZm9yIG9uZSB3b3JkLlxuICpcbiAqIFJ1bnMgb24gdGhlIGBAZXNsaW50L2pzb25gIGBqc29uL2pzb25gIGxhbmd1YWdlOyBzZWUgYG1hbmlmZXN0LWhlbHBlcnMudHNgIGZvciB3aHkgdGhlIEFTVCBpcyBNb21vYVxuICogcmF0aGVyIHRoYW4gRVNUcmVlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUnVsZSB9IGZyb20gJ2VzbGludCc7XG5cbmltcG9ydCB7XG4gIGZpbmRNYW5pZmVzdE1lbWJlcixcbiAgZ2V0TWFuaWZlc3RPYmplY3QsXG4gIGdldFN0cmluZ1ZhbHVlLFxuICB0b1JlcG9ydE5vZGVcbn0gZnJvbSAnLi9tYW5pZmVzdC1oZWxwZXJzLnRzJztcblxuLyoqXG5NZXNzYWdlIElEIHJlcG9ydGVkIHdoZW4gdGhlIGRlc2NyaXB0aW9uIGNvbnRhaW5zIHRoZSB3b3JkIGBPYnNpZGlhbmAuXG4gKi9cbmV4cG9ydCBjb25zdCBNRVNTQUdFX0lEX0NPTlRBSU5TX09CU0lESUFOID0gJ2Rlc2NyaXB0aW9uQ29udGFpbnNPYnNpZGlhbic7XG5cbi8qKlxuTWVzc2FnZSBJRCByZXBvcnRlZCB3aGVuIHRoZSBkZXNjcmlwdGlvbiBkb2VzIG5vdCBlbmQgd2l0aCBhIHBlcmlvZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSURfTUlTU0lOR19QRVJJT0QgPSAnZGVzY3JpcHRpb25NaXNzaW5nUGVyaW9kJztcblxuLyoqXG5NZXNzYWdlIElEIHJlcG9ydGVkIHdoZW4gdGhlIGRlc2NyaXB0aW9uIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBjYXBpdGFsIGxldHRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSURfTk9UX0NBUElUQUxJWkVEID0gJ2Rlc2NyaXB0aW9uTm90Q2FwaXRhbGl6ZWQnO1xuXG4vKipcbk1lc3NhZ2UgSUQgcmVwb3J0ZWQgd2hlbiB0aGUgZGVzY3JpcHRpb24gcmVmZXJzIHRvIGl0c2VsZi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSURfU0VMRl9SRUZFUkVOQ0UgPSAnZGVzY3JpcHRpb25TZWxmUmVmZXJlbmNlJztcblxuLyoqXG5NZXNzYWdlIElEIHJlcG9ydGVkIHdoZW4gdGhlIGRlc2NyaXB0aW9uIGlzIGxvbmdlciB0aGFuIHRoZSBkaXJlY3RvcnkgYWxsb3dzLlxuICovXG5leHBvcnQgY29uc3QgTUVTU0FHRV9JRF9UT09fTE9ORyA9ICdkZXNjcmlwdGlvblRvb0xvbmcnO1xuXG4vKipcbk1lc3NhZ2UgSUQgcmVwb3J0ZWQgd2hlbiB0aGUgZGVzY3JpcHRpb24gaXMgdG9vIHNob3J0IHRvIGRlc2NyaWJlIGFueXRoaW5nLlxuICovXG5leHBvcnQgY29uc3QgTUVTU0FHRV9JRF9UT09fU0hPUlQgPSAnZGVzY3JpcHRpb25Ub29TaG9ydCc7XG5cbi8qKlxuVGhlIGxvbmdlc3QgZGVzY3JpcHRpb24gdGhlIENvbW11bml0eSBkaXJlY3RvcnkgYWNjZXB0cy5cbiAqL1xuY29uc3QgTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCA9IDI1MDtcblxuLyoqXG5UaGUgc2hvcnRlc3QgZGVzY3JpcHRpb24gdGhhdCBjYW4gcGxhdXNpYmx5IHNheSB3aGF0IGEgcGx1Z2luIGRvZXMuXG4gKi9cbmNvbnN0IE1JTl9ERVNDUklQVElPTl9MRU5HVEggPSAxMDtcblxuLyoqXG5UaGUgd29yZCBgT2JzaWRpYW5gLCB3aGljaCB0aGUgZGlyZWN0b3J5IHJlamVjdHMgaW4gYSBkZXNjcmlwdGlvbiBldmVuIHRob3VnaCBubyBPYnNpZGlhbiBkb2N1bWVudCBzYXlzIHNvLlxuICovXG5jb25zdCBPQlNJRElBTl9XT1JEID0gL1xcYm9ic2lkaWFuXFxiL2k7XG5cbi8qKlxuVGhlIHBocmFzaW5ncyB0aGUgZGlyZWN0b3J5IGNhbGxzIG91dCBhcyBzZWxmLXJlZmVyZW5jZS4gQSBiYXJlIGBwbHVnaW5gIGlzIGRlbGliZXJhdGVseSBub3QgYW1vbmcgdGhlbTpcbm5hbWluZyBhbm90aGVyIHBsdWdpbiwgb3IgcGx1Z2lucyBpbiBnZW5lcmFsLCBpcyBub3QgcmVmZXJyaW5nIHRvIG9uZXNlbGYuXG4gKi9cbmNvbnN0IFNFTEZfUkVGRVJFTkNFX1BBVFRFUk5TID0gW1xuICAvXFxidGhpcyBwbHVnaW5cXGIvaSxcbiAgL1xcYnRoaXMgaXMgYSBwbHVnaW5cXGIvaSxcbiAgL1xcYmEgcGx1Z2luICg/OnRoYXR8d2hpY2gpXFxiL2ksXG4gIC9edGhlIHBsdWdpblxcYi9pLFxuICAvXnBsdWdpblxcYi9pXG5dO1xuXG4vKipcbiAqIEVTTGludCBydWxlIGVuZm9yY2luZyB0aGUgQ29tbXVuaXR5IGRpcmVjdG9yeSdzIGNvbnN0cmFpbnRzIG9uIGEgcGx1Z2luJ3MgYG1hbmlmZXN0Lmpzb25gIGBkZXNjcmlwdGlvbmAuXG4gKi9cbmV4cG9ydCBjb25zdCBtYW5pZmVzdERlc2NyaXB0aW9uOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gIGNyZWF0ZShjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIERvY3VtZW50KG5vZGU6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWFuaWZlc3RPYmplY3QgPSBnZXRNYW5pZmVzdE9iamVjdChub2RlKTtcblxuICAgICAgICBpZiAoIW1hbmlmZXN0T2JqZWN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVtYmVyID0gZmluZE1hbmlmZXN0TWVtYmVyKG1hbmlmZXN0T2JqZWN0LCAnZGVzY3JpcHRpb24nKTtcblxuICAgICAgICBpZiAoIW1lbWJlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZ2V0U3RyaW5nVmFsdWUobWVtYmVyLnZhbHVlKTtcblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXBvcnROb2RlID0gdG9SZXBvcnROb2RlKG1lbWJlci52YWx1ZSk7XG5cbiAgICAgICAgaWYgKE9CU0lESUFOX1dPUkQudGVzdChkZXNjcmlwdGlvbikpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBtZXNzYWdlSWQ6IE1FU1NBR0VfSURfQ09OVEFJTlNfT0JTSURJQU4sXG4gICAgICAgICAgICBub2RlOiByZXBvcnROb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoU0VMRl9SRUZFUkVOQ0VfUEFUVEVSTlMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGRlc2NyaXB0aW9uKSkpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBtZXNzYWdlSWQ6IE1FU1NBR0VfSURfU0VMRl9SRUZFUkVOQ0UsXG4gICAgICAgICAgICBub2RlOiByZXBvcnROb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24ubGVuZ3RoIDwgTUlOX0RFU0NSSVBUSU9OX0xFTkdUSCkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogTUVTU0FHRV9JRF9UT09fU0hPUlQsXG4gICAgICAgICAgICBub2RlOiByZXBvcnROb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24ubGVuZ3RoID4gTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIGRhdGE6IHsgbWF4TGVuZ3RoOiBNQVhfREVTQ1JJUFRJT05fTEVOR1RILnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogTUVTU0FHRV9JRF9UT09fTE9ORyxcbiAgICAgICAgICAgIG5vZGU6IHJlcG9ydE5vZGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghL15bQS1aXS8udGVzdChkZXNjcmlwdGlvbikpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBtZXNzYWdlSWQ6IE1FU1NBR0VfSURfTk9UX0NBUElUQUxJWkVELFxuICAgICAgICAgICAgbm9kZTogcmVwb3J0Tm9kZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkZXNjcmlwdGlvbi5lbmRzV2l0aCgnLicpKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbWVzc2FnZUlkOiBNRVNTQUdFX0lEX01JU1NJTkdfUEVSSU9ELFxuICAgICAgICAgICAgbm9kZTogcmVwb3J0Tm9kZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRW5mb3JjZSB0aGUgQ29tbXVuaXR5IGRpcmVjdG9yeVxcJ3MgY29uc3RyYWludHMgb24gYSBwbHVnaW5cXCdzIGBtYW5pZmVzdC5qc29uYCBgZGVzY3JpcHRpb25gJ1xuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtNRVNTQUdFX0lEX0NPTlRBSU5TX09CU0lESUFOXTogJ1RoZSBgZGVzY3JpcHRpb25gIG11c3Qgbm90IGNvbnRhaW4gdGhlIHdvcmQgYE9ic2lkaWFuYC4gSXQgaXMgaW1wbGllZCBieSB0aGUgY29udGV4dCBvZiB0aGUgcGx1Z2luIGRpcmVjdG9yeS4nLFxuICAgICAgW01FU1NBR0VfSURfTUlTU0lOR19QRVJJT0RdOiAnVGhlIGBkZXNjcmlwdGlvbmAgbXVzdCBlbmQgd2l0aCBhIHBlcmlvZC4nLFxuICAgICAgW01FU1NBR0VfSURfTk9UX0NBUElUQUxJWkVEXTogJ1RoZSBgZGVzY3JpcHRpb25gIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLicsXG4gICAgICBbTUVTU0FHRV9JRF9TRUxGX1JFRkVSRU5DRV06ICdUaGUgYGRlc2NyaXB0aW9uYCBtdXN0IG5vdCByZWZlciB0byBpdHNlbGYsIGUuZy4gYHRoaXMgcGx1Z2luYCBvciBgYSBwbHVnaW4gdGhhdGAuIERlc2NyaWJlIHdoYXQgaXQgZG9lcyBpbnN0ZWFkLicsXG4gICAgICBbTUVTU0FHRV9JRF9UT09fTE9OR106ICdUaGUgYGRlc2NyaXB0aW9uYCBtdXN0IGJlIGF0IG1vc3Qge3sgbWF4TGVuZ3RoIH19IGNoYXJhY3RlcnMuJyxcbiAgICAgIFtNRVNTQUdFX0lEX1RPT19TSE9SVF06ICdUaGUgYGRlc2NyaXB0aW9uYCBpcyB0b28gc2hvcnQgdG8gc2F5IHdoYXQgdGhlIHBsdWdpbiBkb2VzLidcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gICAgdHlwZTogJ3Byb2JsZW0nXG4gIH1cbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkJBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFLQSxNQUFNLCtCQUErQjtBQUtyQyxNQUFNLDRCQUE0QjtBQUtsQyxNQUFNLDZCQUE2QjtBQUtuQyxNQUFNLDRCQUE0QjtBQUtsQyxNQUFNLHNCQUFzQjtBQUs1QixNQUFNLHVCQUF1QjtBQUtwQyxNQUFNLHlCQUF5QjtBQUsvQixNQUFNLHlCQUF5QjtBQUsvQixNQUFNLGdCQUFnQjtBQU10QixNQUFNLDBCQUEwQjtBQUFBLEVBQzlCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBS08sTUFBTSxzQkFBdUM7QUFBQSxFQUNsRCxPQUFPLFNBQVM7QUFDZCxXQUFPO0FBQUEsTUFDTCxTQUFTLE1BQXFCO0FBQzVCLGNBQU0saUJBQWlCLGtCQUFrQixJQUFJO0FBRTdDLFlBQUksQ0FBQyxnQkFBZ0I7QUFDbkI7QUFBQSxRQUNGO0FBRUEsY0FBTSxTQUFTLG1CQUFtQixnQkFBZ0IsYUFBYTtBQUUvRCxZQUFJLENBQUMsUUFBUTtBQUNYO0FBQUEsUUFDRjtBQUVBLGNBQU0sY0FBYyxlQUFlLE9BQU8sS0FBSztBQUUvQyxZQUFJLGdCQUFnQixNQUFNO0FBQ3hCO0FBQUEsUUFDRjtBQUVBLGNBQU0sYUFBYSxhQUFhLE9BQU8sS0FBSztBQUU1QyxZQUFJLGNBQWMsS0FBSyxXQUFXLEdBQUc7QUFDbkMsa0JBQVEsT0FBTztBQUFBLFlBQ2IsV0FBVztBQUFBLFlBQ1gsTUFBTTtBQUFBLFVBQ1IsQ0FBQztBQUFBLFFBQ0g7QUFFQSxZQUFJLHdCQUF3QixLQUFLLENBQUMsWUFBWSxRQUFRLEtBQUssV0FBVyxDQUFDLEdBQUc7QUFDeEUsa0JBQVEsT0FBTztBQUFBLFlBQ2IsV0FBVztBQUFBLFlBQ1gsTUFBTTtBQUFBLFVBQ1IsQ0FBQztBQUFBLFFBQ0g7QUFFQSxZQUFJLFlBQVksU0FBUyx3QkFBd0I7QUFDL0Msa0JBQVEsT0FBTztBQUFBLFlBQ2IsV0FBVztBQUFBLFlBQ1gsTUFBTTtBQUFBLFVBQ1IsQ0FBQztBQUFBLFFBQ0g7QUFFQSxZQUFJLFlBQVksU0FBUyx3QkFBd0I7QUFDL0Msa0JBQVEsT0FBTztBQUFBLFlBQ2IsTUFBTSxFQUFFLFdBQVcsdUJBQXVCLFNBQVMsRUFBRTtBQUFBLFlBQ3JELFdBQVc7QUFBQSxZQUNYLE1BQU07QUFBQSxVQUNSLENBQUM7QUFBQSxRQUNIO0FBRUEsWUFBSSxDQUFDLFNBQVMsS0FBSyxXQUFXLEdBQUc7QUFDL0Isa0JBQVEsT0FBTztBQUFBLFlBQ2IsV0FBVztBQUFBLFlBQ1gsTUFBTTtBQUFBLFVBQ1IsQ0FBQztBQUFBLFFBQ0g7QUFFQSxZQUFJLENBQUMsWUFBWSxTQUFTLEdBQUcsR0FBRztBQUM5QixrQkFBUSxPQUFPO0FBQUEsWUFDYixXQUFXO0FBQUEsWUFDWCxNQUFNO0FBQUEsVUFDUixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBQ0EsTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLENBQUMsNEJBQTRCLEdBQUc7QUFBQSxNQUNoQyxDQUFDLHlCQUF5QixHQUFHO0FBQUEsTUFDN0IsQ0FBQywwQkFBMEIsR0FBRztBQUFBLE1BQzlCLENBQUMseUJBQXlCLEdBQUc7QUFBQSxNQUM3QixDQUFDLG1CQUFtQixHQUFHO0FBQUEsTUFDdkIsQ0FBQyxvQkFBb0IsR0FBRztBQUFBLElBQzFCO0FBQUEsSUFDQSxRQUFRLENBQUM7QUFBQSxJQUNULE1BQU07QUFBQSxFQUNSO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/// <reference path="../../../library.d.mts" />
|
|
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';
|
|
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,92 @@
|
|
|
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 initEsm() {
|
|
40
|
+
ensureBrowserProcess();
|
|
41
|
+
})();
|
|
42
|
+
})();
|
|
43
|
+
|
|
44
|
+
import json from "@eslint/json";
|
|
45
|
+
const JSON_NODE_TYPE_BOOLEAN = "Boolean";
|
|
46
|
+
const JSON_NODE_TYPE_OBJECT = "Object";
|
|
47
|
+
const JSON_NODE_TYPE_STRING = "String";
|
|
48
|
+
const jsonPlugin = bridgeJsonPlugin();
|
|
49
|
+
const UNRELEASED_VERSION = "0.0.0";
|
|
50
|
+
function findManifestMember(manifestObject, key) {
|
|
51
|
+
return manifestObject.members.find((member) => getMemberKey(member) === key) ?? null;
|
|
52
|
+
}
|
|
53
|
+
function getManifestObject(node) {
|
|
54
|
+
const document = node;
|
|
55
|
+
return document.body.type === JSON_NODE_TYPE_OBJECT ? document.body : null;
|
|
56
|
+
}
|
|
57
|
+
function getManifestStringValue(manifestObject, key) {
|
|
58
|
+
const member = findManifestMember(manifestObject, key);
|
|
59
|
+
return member ? getStringValue(member.value) : null;
|
|
60
|
+
}
|
|
61
|
+
function getMemberKey(member) {
|
|
62
|
+
return member.name.value;
|
|
63
|
+
}
|
|
64
|
+
function getStringValue(node) {
|
|
65
|
+
if (node.type !== JSON_NODE_TYPE_STRING) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const literal = node;
|
|
69
|
+
return literal.value;
|
|
70
|
+
}
|
|
71
|
+
function toReportNode(node) {
|
|
72
|
+
const bridged = node;
|
|
73
|
+
return bridged;
|
|
74
|
+
}
|
|
75
|
+
function bridgeJsonPlugin() {
|
|
76
|
+
const bridged = json;
|
|
77
|
+
return bridged;
|
|
78
|
+
}
|
|
79
|
+
export {
|
|
80
|
+
JSON_NODE_TYPE_BOOLEAN,
|
|
81
|
+
JSON_NODE_TYPE_OBJECT,
|
|
82
|
+
JSON_NODE_TYPE_STRING,
|
|
83
|
+
UNRELEASED_VERSION,
|
|
84
|
+
findManifestMember,
|
|
85
|
+
getManifestObject,
|
|
86
|
+
getManifestStringValue,
|
|
87
|
+
getMemberKey,
|
|
88
|
+
getStringValue,
|
|
89
|
+
jsonPlugin,
|
|
90
|
+
toReportNode
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9tYW5pZmVzdC1oZWxwZXJzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogU2hhcmVkIGhlbHBlcnMgZm9yIHRoZSBgbWFuaWZlc3QuanNvbmAgRVNMaW50IHJ1bGVzLlxuICpcbiAqIFRoZSBtYW5pZmVzdCBpcyBsaW50ZWQgdGhyb3VnaCBgQGVzbGludC9qc29uYCdzIGBqc29uL2pzb25gIGxhbmd1YWdlLCB3aG9zZSBBU1QgaXMgTW9tb2FcbiAqIChgRG9jdW1lbnRgIC0+IGBPYmplY3RgIC0+IGBNZW1iZXJgKSByYXRoZXIgdGhhbiBFU1RyZWUsIHNvIHRoZXNlIHJ1bGVzIHZpc2l0IGBEb2N1bWVudGAgaW5zdGVhZCBvZlxuICogYFByb2dyYW1gLiBUaGF0IGRpZmZlcmVuY2UgaXMgZXhhY3RseSB3aHkgYG9ic2lkaWFubWQvdmFsaWRhdGUtbWFuaWZlc3RgIGNhbiBuZXZlciBmaXJlOiBpdCByZWdpc3RlcnMgYVxuICogYFByb2dyYW1gIHZpc2l0b3IgYW5kIGV4cGVjdHMgYW4gRVNUcmVlIGBPYmplY3RFeHByZXNzaW9uYCwgd2hpY2ggbm8gc2hpcHBlZCBKU09OIHBhcnNlciBwcm9kdWNlcy5cbiAqXG4gKiBUaGUgTW9tb2Egbm9kZSBzaGFwZXMgYXJlIGRlY2xhcmVkIHN0cnVjdHVyYWxseSBoZXJlIHJhdGhlciB0aGFuIGltcG9ydGVkIGZyb20gYEBodW1hbndob2NvZGVzL21vbW9hYCxcbiAqIHdoaWNoIGlzIG9ubHkgYSB0cmFuc2l0aXZlIGRlcGVuZGVuY3kgb2YgYEBlc2xpbnQvanNvbmAuIEEgdHlwZS1vbmx5IGltcG9ydCB3b3VsZCBsZWFrIGludG8gdGhlXG4gKiBwdWJsaXNoZWQgZGVjbGFyYXRpb25zIGFuZCBmb3JjZSBldmVyeSBjb25zdW1lciB0byByZXNvbHZlIGEgcGFja2FnZSBpdCBuZXZlciBpbnN0YWxsZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBFU0xpbnQsXG4gIFJ1bGVcbn0gZnJvbSAnZXNsaW50JztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLXJlbmFtZS1kZWZhdWx0IC0tIFRoZSBkZWZhdWx0IGV4cG9ydCBuYW1lIGBwbHVnaW5gIGlzIHRvbyBjb25mdXNpbmcuXG5pbXBvcnQganNvbiBmcm9tICdAZXNsaW50L2pzb24nO1xuXG4vKipcbiAqIFRoZSBNb21vYSBub2RlIHR5cGUgb2YgYSBKU09OIGJvb2xlYW4gdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBKU09OX05PREVfVFlQRV9CT09MRUFOID0gJ0Jvb2xlYW4nO1xuXG4vKipcbiAqIFRoZSBNb21vYSBub2RlIHR5cGUgb2YgYSBKU09OIG9iamVjdCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEpTT05fTk9ERV9UWVBFX09CSkVDVCA9ICdPYmplY3QnO1xuXG4vKipcbiAqIFRoZSBNb21vYSBub2RlIHR5cGUgb2YgYSBKU09OIHN0cmluZyB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEpTT05fTk9ERV9UWVBFX1NUUklORyA9ICdTdHJpbmcnO1xuXG4vKipcbiAqIGBAZXNsaW50L2pzb25gLCB0eXBlZCBhcyB0aGUgcGx1Z2luIHR5cGUgYSBmbGF0IGNvbmZpZyBhbmQgYFJ1bGVUZXN0ZXJgIGFyZSB3cml0dGVuIGFnYWluc3QuXG4gKlxuICogVGhlIHBhY2thZ2UncyBydWxlIGRlZmluaXRpb25zIGFyZSBnZW5lcmljIG92ZXIgaXRzIG93biBKU09OIGxhbmd1YWdlLCB3aGljaCBgQHR5cGVzL2VzbGludGAnc1xuICogYEVTTGludC5QbHVnaW5gIC0gd3JpdHRlbiBhZ2FpbnN0IEVTVHJlZSBydWxlcyAtIGNhbm5vdCBleHByZXNzLCBzbyB0aGUgdHdvIGFyZSBub21pbmFsbHkgaW5jb21wYXRpYmxlXG4gKiB3aGlsZSBiZWluZyBleGFjdGx5IGNvbXBhdGlibGUgYXQgcnVudGltZS4gUmVnaXN0ZXJpbmcgaXQgaXMgd2hhdCBtYWtlcyBgbGFuZ3VhZ2U6ICdqc29uL2pzb24nYFxuICogcmVzb2x2YWJsZSwgc28gdGhlcmUgaXMgbm8gd2F5IHRvIGF2b2lkIHRoZSBicmlkZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBqc29uUGx1Z2luOiBFU0xpbnQuUGx1Z2luID0gYnJpZGdlSnNvblBsdWdpbigpO1xuXG4vKipcbiAqIFRoZSBgdmVyc2lvbmAgYSBwbHVnaW4gcmVwbyBjYXJyaWVzIGJlZm9yZSBpdHMgZmlyc3QgcmVsZWFzZSwgd2hlbiBgbWluQXBwVmVyc2lvbmAgaXMgbGVnaXRpbWF0ZWx5IGFic2VudC5cbiAqL1xuZXhwb3J0IGNvbnN0IFVOUkVMRUFTRURfVkVSU0lPTiA9ICcwLjAuMCc7XG5cbi8qKlxuICogVGhlIHJvb3Qgbm9kZSBvZiBhIHBhcnNlZCBKU09OIGRvY3VtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25Eb2N1bWVudE5vZGUgZXh0ZW5kcyBKc29uTm9kZSB7XG4gIC8qKlxuICAgKiBUaGUgZG9jdW1lbnQncyBzaW5nbGUgdG9wLWxldmVsIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgYm9keTogSnNvbk5vZGU7XG59XG5cbi8qKlxuICogQSBKU09OIGxpdGVyYWwgLSBhIHN0cmluZywgbnVtYmVyLCBib29sZWFuIG9yIG51bGwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbkxpdGVyYWxOb2RlIGV4dGVuZHMgSnNvbk5vZGUge1xuICAvKipcbiAgICogVGhlIGxpdGVyYWwncyBwYXJzZWQgdmFsdWUuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogYm9vbGVhbiB8IG51bGwgfCBudW1iZXIgfCBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgYFwia2V5XCI6IHZhbHVlYCBwYWlyIG9mIGEgSlNPTiBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbk1lbWJlck5vZGUgZXh0ZW5kcyBKc29uTm9kZSB7XG4gIC8qKlxuICAgKiBUaGUgbWVtYmVyJ3Mga2V5LlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogSnNvbkxpdGVyYWxOb2RlO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVtYmVyJ3MgdmFsdWUuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogSnNvbk5vZGU7XG59XG5cbi8qKlxuICogQW55IG5vZGUgb2YgdGhlIE1vbW9hIEpTT04gQVNULlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25Ob2RlIHtcbiAgLyoqXG4gICAqIFRoZSBub2RlIHR5cGUsIGUuZy4gYERvY3VtZW50YCwgYE9iamVjdGAsIGBNZW1iZXJgLCBgU3RyaW5nYC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIEpTT04gb2JqZWN0IHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25PYmplY3ROb2RlIGV4dGVuZHMgSnNvbk5vZGUge1xuICAvKipcbiAgICogVGhlIG9iamVjdCdzIG1lbWJlcnMsIGluIHNvdXJjZSBvcmRlciwgaW5jbHVkaW5nIGFueSBkdXBsaWNhdGUga2V5cy5cbiAgICovXG4gIHJlYWRvbmx5IG1lbWJlcnM6IHJlYWRvbmx5IEpzb25NZW1iZXJOb2RlW107XG59XG5cbi8qKlxuICogRmluZHMgYSB0b3AtbGV2ZWwgbWVtYmVyIG9mIHRoZSBtYW5pZmVzdCBieSBrZXkuXG4gKlxuICogQHBhcmFtIG1hbmlmZXN0T2JqZWN0IC0gVGhlIG1hbmlmZXN0J3Mgcm9vdCBvYmplY3Qgbm9kZS5cbiAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIGxvb2sgZm9yLlxuICogQHJldHVybnMgVGhlIGZpcnN0IG1lbWJlciB3aXRoIHRoYXQga2V5LCBvciBgbnVsbGAgd2hlbiB0aGUgbWFuaWZlc3QgaGFzIG5vbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTWFuaWZlc3RNZW1iZXIobWFuaWZlc3RPYmplY3Q6IEpzb25PYmplY3ROb2RlLCBrZXk6IHN0cmluZyk6IEpzb25NZW1iZXJOb2RlIHwgbnVsbCB7XG4gIHJldHVybiBtYW5pZmVzdE9iamVjdC5tZW1iZXJzLmZpbmQoKG1lbWJlcikgPT4gZ2V0TWVtYmVyS2V5KG1lbWJlcikgPT09IGtleSkgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgbWFuaWZlc3QncyByb290IG9iamVjdCBvdXQgb2YgdGhlIHZpc2l0ZWQgYERvY3VtZW50YCBub2RlLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIGBEb2N1bWVudGAgbm9kZSBoYW5kZWQgdG8gdGhlIHJ1bGUncyB2aXNpdG9yLlxuICogQHJldHVybnMgVGhlIHJvb3Qgb2JqZWN0IG5vZGUsIG9yIGBudWxsYCB3aGVuIHRoZSBkb2N1bWVudCdzIHRvcC1sZXZlbCB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFuaWZlc3RPYmplY3Qobm9kZTogdW5rbm93bik6IEpzb25PYmplY3ROb2RlIHwgbnVsbCB7XG4gIGNvbnN0IGRvY3VtZW50ID0gbm9kZSBhcyBKc29uRG9jdW1lbnROb2RlO1xuICByZXR1cm4gZG9jdW1lbnQuYm9keS50eXBlID09PSBKU09OX05PREVfVFlQRV9PQkpFQ1QgPyBkb2N1bWVudC5ib2R5IGFzIEpzb25PYmplY3ROb2RlIDogbnVsbDtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgdmFsdWUgb2YgYSB0b3AtbGV2ZWwgc3RyaW5nIG1lbWJlciBvZiB0aGUgbWFuaWZlc3QuXG4gKlxuICogQHBhcmFtIG1hbmlmZXN0T2JqZWN0IC0gVGhlIG1hbmlmZXN0J3Mgcm9vdCBvYmplY3Qgbm9kZS5cbiAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIGxvb2sgZm9yLlxuICogQHJldHVybnMgVGhlIG1lbWJlcidzIHZhbHVlLCBvciBgbnVsbGAgd2hlbiBpdCBpcyBhYnNlbnQgb3Igbm90IGEgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFuaWZlc3RTdHJpbmdWYWx1ZShtYW5pZmVzdE9iamVjdDogSnNvbk9iamVjdE5vZGUsIGtleTogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gIGNvbnN0IG1lbWJlciA9IGZpbmRNYW5pZmVzdE1lbWJlcihtYW5pZmVzdE9iamVjdCwga2V5KTtcbiAgcmV0dXJuIG1lbWJlciA/IGdldFN0cmluZ1ZhbHVlKG1lbWJlci52YWx1ZSkgOiBudWxsO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgbWVtYmVyJ3Mga2V5LlxuICpcbiAqIFVuZGVyIHRoZSBganNvbi9qc29uYCBsYW5ndWFnZSBhIG1lbWJlcidzIG5hbWUgaXMgYWx3YXlzIGEgc3RyaW5nIG5vZGUgLSBpZGVudGlmaWVyIGtleXMgZXhpc3Qgb25seSBpblxuICogSlNPTjUgLSBzbyB0aGlzIG5ldmVyIGhhcyB0byBhY2NvdW50IGZvciBhIG1pc3Npbmcga2V5LlxuICpcbiAqIEBwYXJhbSBtZW1iZXIgLSBUaGUgbWVtYmVyIHRvIHJlYWQuXG4gKiBAcmV0dXJucyBUaGUgbWVtYmVyJ3Mga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVtYmVyS2V5KG1lbWJlcjogSnNvbk1lbWJlck5vZGUpOiBzdHJpbmcge1xuICByZXR1cm4gbWVtYmVyLm5hbWUudmFsdWUgYXMgc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSB2YWx1ZSBvZiBhIE1vbW9hIHN0cmluZyBub2RlLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gcmVhZC5cbiAqIEByZXR1cm5zIFRoZSBzdHJpbmcgdmFsdWUsIG9yIGBudWxsYCB3aGVuIHRoZSBub2RlIGlzIG5vdCBhIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmluZ1ZhbHVlKG5vZGU6IEpzb25Ob2RlKTogbnVsbCB8IHN0cmluZyB7XG4gIGlmIChub2RlLnR5cGUgIT09IEpTT05fTk9ERV9UWVBFX1NUUklORykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbGl0ZXJhbCA9IG5vZGUgYXMgSnNvbkxpdGVyYWxOb2RlO1xuICByZXR1cm4gbGl0ZXJhbC52YWx1ZSBhcyBzdHJpbmc7XG59XG5cbi8qKlxuICogQnJpZGdlcyBhIE1vbW9hIG5vZGUgdG8gdGhlIG5vZGUgdHlwZSBgY29udGV4dC5yZXBvcnQoKWAgaXMgdHlwZWQgYWdhaW5zdC5cbiAqXG4gKiBUaGUgdHdvIGFyZSBzdHJ1Y3R1cmFsbHkgaW5jb21wYXRpYmxlIC0gRVNMaW50J3MgcnVsZSB0eXBlcyBkZXNjcmliZSBFU1RyZWUgLSBidXQgdGhlIGBqc29uL2pzb25gXG4gKiBsYW5ndWFnZSdzIHNvdXJjZSBjb2RlIGFkYXB0ZXIgcmVzb2x2ZXMgYSBNb21vYSBub2RlJ3MgcG9zaXRpb24gYXQgcmVwb3J0IHRpbWUsIHNvIHRoZXkgYXJlIGNvbXBhdGlibGVcbiAqIGF0IHJ1bnRpbWUuIFRoaXMgbWlycm9ycyB0aGUgYnJpZGdlIGBydWxlLXRlc3Rlci1oZWxwZXIudHNgIG1ha2VzIG92ZXIgdGhlIHNhbWUga2luZCBvZiB0eXBlLWxldmVsIGdhcC5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBNb21vYSBub2RlIHRvIHJlcG9ydCBvbi5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIG5vZGUsIHR5cGVkIGZvciBgY29udGV4dC5yZXBvcnQoKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1JlcG9ydE5vZGUobm9kZTogdW5rbm93bik6IFJ1bGUuTm9kZSB7XG4gIGNvbnN0IGJyaWRnZWQ6IHVua25vd24gPSBub2RlO1xuICByZXR1cm4gYnJpZGdlZCBhcyBSdWxlLk5vZGU7XG59XG5cbi8qKlxuICogQ2FzdHMgYEBlc2xpbnQvanNvbmAgdG8gdGhlIHBsdWdpbiB0eXBlIGBAdHlwZXMvZXNsaW50YCBkZWNsYXJlcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYEBlc2xpbnQvanNvbmAgcGx1Z2luLCB0eXBlZCBmb3IgYSBmbGF0IGNvbmZpZy5cbiAqL1xuZnVuY3Rpb24gYnJpZGdlSnNvblBsdWdpbigpOiBFU0xpbnQuUGx1Z2luIHtcbiAgY29uc3QgYnJpZGdlZDogdW5rbm93biA9IGpzb247XG4gIHJldHVybiBicmlkZ2VkIGFzIEVTTGludC5QbHVnaW47XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLE9BQU8sVUFBVTtBQUtWLE1BQU0seUJBQXlCO0FBSy9CLE1BQU0sd0JBQXdCO0FBSzlCLE1BQU0sd0JBQXdCO0FBVTlCLE1BQU0sYUFBNEIsaUJBQWlCO0FBS25ELE1BQU0scUJBQXFCO0FBZ0UzQixTQUFTLG1CQUFtQixnQkFBZ0MsS0FBb0M7QUFDckcsU0FBTyxlQUFlLFFBQVEsS0FBSyxDQUFDLFdBQVcsYUFBYSxNQUFNLE1BQU0sR0FBRyxLQUFLO0FBQ2xGO0FBUU8sU0FBUyxrQkFBa0IsTUFBc0M7QUFDdEUsUUFBTSxXQUFXO0FBQ2pCLFNBQU8sU0FBUyxLQUFLLFNBQVMsd0JBQXdCLFNBQVMsT0FBeUI7QUFDMUY7QUFTTyxTQUFTLHVCQUF1QixnQkFBZ0MsS0FBNEI7QUFDakcsUUFBTSxTQUFTLG1CQUFtQixnQkFBZ0IsR0FBRztBQUNyRCxTQUFPLFNBQVMsZUFBZSxPQUFPLEtBQUssSUFBSTtBQUNqRDtBQVdPLFNBQVMsYUFBYSxRQUFnQztBQUMzRCxTQUFPLE9BQU8sS0FBSztBQUNyQjtBQVFPLFNBQVMsZUFBZSxNQUErQjtBQUM1RCxNQUFJLEtBQUssU0FBUyx1QkFBdUI7QUFDdkMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFVBQVU7QUFDaEIsU0FBTyxRQUFRO0FBQ2pCO0FBWU8sU0FBUyxhQUFhLE1BQTBCO0FBQ3JELFFBQU0sVUFBbUI7QUFDekIsU0FBTztBQUNUO0FBT0EsU0FBUyxtQkFBa0M7QUFDekMsUUFBTSxVQUFtQjtBQUN6QixTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/// <reference path="../../../library.d.mts" />
|
|
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';
|
|
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,111 @@
|
|
|
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 initEsm() {
|
|
40
|
+
ensureBrowserProcess();
|
|
41
|
+
})();
|
|
42
|
+
})();
|
|
43
|
+
|
|
44
|
+
import {
|
|
45
|
+
findManifestMember,
|
|
46
|
+
getManifestObject,
|
|
47
|
+
getStringValue,
|
|
48
|
+
toReportNode
|
|
49
|
+
} from "./manifest-helpers.mjs";
|
|
50
|
+
const MESSAGE_ID_CONTAINS_OBSIDIAN = "idContainsObsidian";
|
|
51
|
+
const MESSAGE_ID_ENDS_WITH_PLUGIN = "idEndsWithPlugin";
|
|
52
|
+
const MESSAGE_ID_INVALID_CHARACTERS = "idInvalidCharacters";
|
|
53
|
+
const ALLOWED_ID_CHARACTERS = /^[a-z0-9-]+$/;
|
|
54
|
+
const manifestId = {
|
|
55
|
+
create(context) {
|
|
56
|
+
return {
|
|
57
|
+
Document(node) {
|
|
58
|
+
const manifestObject = getManifestObject(node);
|
|
59
|
+
if (!manifestObject) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const member = findManifestMember(manifestObject, "id");
|
|
63
|
+
if (!member) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const id = getStringValue(member.value);
|
|
67
|
+
if (id === null) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const reportNode = toReportNode(member.value);
|
|
71
|
+
if (!ALLOWED_ID_CHARACTERS.test(id)) {
|
|
72
|
+
context.report({
|
|
73
|
+
messageId: MESSAGE_ID_INVALID_CHARACTERS,
|
|
74
|
+
node: reportNode
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (id.toLowerCase().includes("obsidian")) {
|
|
78
|
+
context.report({
|
|
79
|
+
messageId: MESSAGE_ID_CONTAINS_OBSIDIAN,
|
|
80
|
+
node: reportNode
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (id.toLowerCase().endsWith("plugin")) {
|
|
84
|
+
context.report({
|
|
85
|
+
messageId: MESSAGE_ID_ENDS_WITH_PLUGIN,
|
|
86
|
+
node: reportNode
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
meta: {
|
|
93
|
+
docs: {
|
|
94
|
+
description: "Enforce the Community directory's constraints on a plugin's `manifest.json` `id`"
|
|
95
|
+
},
|
|
96
|
+
messages: {
|
|
97
|
+
[MESSAGE_ID_CONTAINS_OBSIDIAN]: "The `id` must not contain `obsidian`. It is implied by the context of the plugin directory.",
|
|
98
|
+
[MESSAGE_ID_ENDS_WITH_PLUGIN]: "The `id` must not end with `plugin`.",
|
|
99
|
+
[MESSAGE_ID_INVALID_CHARACTERS]: "The `id` must contain only lowercase letters, digits and hyphens."
|
|
100
|
+
},
|
|
101
|
+
schema: [],
|
|
102
|
+
type: "problem"
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
export {
|
|
106
|
+
MESSAGE_ID_CONTAINS_OBSIDIAN,
|
|
107
|
+
MESSAGE_ID_ENDS_WITH_PLUGIN,
|
|
108
|
+
MESSAGE_ID_INVALID_CHARACTERS,
|
|
109
|
+
manifestId
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL2VzbGludC1ydWxlcy9tYW5pZmVzdC1pZC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEVTTGludCBydWxlOiBtYW5pZmVzdC1pZFxuICpcbiAqIEVuZm9yY2VzIHRoZSBDb21tdW5pdHkgZGlyZWN0b3J5J3MgY29uc3RyYWludHMgb24gYSBwbHVnaW4ncyBgbWFuaWZlc3QuanNvbmAgYGlkYDogbG93ZXJjYXNlIGxldHRlcnMsXG4gKiBkaWdpdHMgYW5kIGh5cGhlbnMgb25seTsgbmV2ZXIgY29udGFpbmluZyBgb2JzaWRpYW5gOyBuZXZlciBlbmRpbmcgd2l0aCBgcGx1Z2luYC5cbiAqXG4gKiBBIHB1Ymxpc2hlZCBpZCBjYW4gbmV2ZXIgYmUgY2hhbmdlZCwgc28gYSB2aW9sYXRpb24gaW4gYW4gYWxyZWFkeS1saXN0ZWQgcGx1Z2luIGlzIHBlcm1hbmVudCBhbmQgdGhlXG4gKiBvbmx5IHJlbWVkeSBpcyB0dXJuaW5nIHRoaXMgcnVsZSBvZmYgZm9yIHRoYXQgcmVwbyB3aXRoIHRoZSByZWFzb24gd3JpdHRlbiBiZXNpZGUgaXQuXG4gKlxuICogUnVucyBvbiB0aGUgYEBlc2xpbnQvanNvbmAgYGpzb24vanNvbmAgbGFuZ3VhZ2U7IHNlZSBgbWFuaWZlc3QtaGVscGVycy50c2AgZm9yIHdoeSB0aGUgQVNUIGlzIE1vbW9hXG4gKiByYXRoZXIgdGhhbiBFU1RyZWUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSdWxlIH0gZnJvbSAnZXNsaW50JztcblxuaW1wb3J0IHtcbiAgZmluZE1hbmlmZXN0TWVtYmVyLFxuICBnZXRNYW5pZmVzdE9iamVjdCxcbiAgZ2V0U3RyaW5nVmFsdWUsXG4gIHRvUmVwb3J0Tm9kZVxufSBmcm9tICcuL21hbmlmZXN0LWhlbHBlcnMudHMnO1xuXG4vKipcbk1lc3NhZ2UgSUQgcmVwb3J0ZWQgd2hlbiB0aGUgaWQgY29udGFpbnMgYG9ic2lkaWFuYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSURfQ09OVEFJTlNfT0JTSURJQU4gPSAnaWRDb250YWluc09ic2lkaWFuJztcblxuLyoqXG5NZXNzYWdlIElEIHJlcG9ydGVkIHdoZW4gdGhlIGlkIGVuZHMgd2l0aCBgcGx1Z2luYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSURfRU5EU19XSVRIX1BMVUdJTiA9ICdpZEVuZHNXaXRoUGx1Z2luJztcblxuLyoqXG5NZXNzYWdlIElEIHJlcG9ydGVkIHdoZW4gdGhlIGlkIGhvbGRzIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBsb3dlcmNhc2UgbGV0dGVycywgZGlnaXRzIGFuZCBoeXBoZW5zLlxuICovXG5leHBvcnQgY29uc3QgTUVTU0FHRV9JRF9JTlZBTElEX0NIQVJBQ1RFUlMgPSAnaWRJbnZhbGlkQ2hhcmFjdGVycyc7XG5cbi8qKlxuVGhlIG9ubHkgY2hhcmFjdGVycyBhIHBsdWdpbiBpZCBtYXkgaG9sZC5cbiAqL1xuY29uc3QgQUxMT1dFRF9JRF9DSEFSQUNURVJTID0gL15bYS16MC05LV0rJC87XG5cbi8qKlxuICogRVNMaW50IHJ1bGUgZW5mb3JjaW5nIHRoZSBDb21tdW5pdHkgZGlyZWN0b3J5J3MgY29uc3RyYWludHMgb24gYSBwbHVnaW4ncyBgbWFuaWZlc3QuanNvbmAgYGlkYC5cbiAqL1xuZXhwb3J0IGNvbnN0IG1hbmlmZXN0SWQ6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgRG9jdW1lbnQobm9kZTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBjb25zdCBtYW5pZmVzdE9iamVjdCA9IGdldE1hbmlmZXN0T2JqZWN0KG5vZGUpO1xuXG4gICAgICAgIGlmICghbWFuaWZlc3RPYmplY3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZW1iZXIgPSBmaW5kTWFuaWZlc3RNZW1iZXIobWFuaWZlc3RPYmplY3QsICdpZCcpO1xuXG4gICAgICAgIGlmICghbWVtYmVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWQgPSBnZXRTdHJpbmdWYWx1ZShtZW1iZXIudmFsdWUpO1xuXG4gICAgICAgIGlmIChpZCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlcG9ydE5vZGUgPSB0b1JlcG9ydE5vZGUobWVtYmVyLnZhbHVlKTtcblxuICAgICAgICBpZiAoIUFMTE9XRURfSURfQ0hBUkFDVEVSUy50ZXN0KGlkKSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogTUVTU0FHRV9JRF9JTlZBTElEX0NIQVJBQ1RFUlMsXG4gICAgICAgICAgICBub2RlOiByZXBvcnROb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnb2JzaWRpYW4nKSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogTUVTU0FHRV9JRF9DT05UQUlOU19PQlNJRElBTixcbiAgICAgICAgICAgIG5vZGU6IHJlcG9ydE5vZGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCdwbHVnaW4nKSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogTUVTU0FHRV9JRF9FTkRTX1dJVEhfUExVR0lOLFxuICAgICAgICAgICAgbm9kZTogcmVwb3J0Tm9kZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRW5mb3JjZSB0aGUgQ29tbXVuaXR5IGRpcmVjdG9yeVxcJ3MgY29uc3RyYWludHMgb24gYSBwbHVnaW5cXCdzIGBtYW5pZmVzdC5qc29uYCBgaWRgJ1xuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgIFtNRVNTQUdFX0lEX0NPTlRBSU5TX09CU0lESUFOXTogJ1RoZSBgaWRgIG11c3Qgbm90IGNvbnRhaW4gYG9ic2lkaWFuYC4gSXQgaXMgaW1wbGllZCBieSB0aGUgY29udGV4dCBvZiB0aGUgcGx1Z2luIGRpcmVjdG9yeS4nLFxuICAgICAgW01FU1NBR0VfSURfRU5EU19XSVRIX1BMVUdJTl06ICdUaGUgYGlkYCBtdXN0IG5vdCBlbmQgd2l0aCBgcGx1Z2luYC4nLFxuICAgICAgW01FU1NBR0VfSURfSU5WQUxJRF9DSEFSQUNURVJTXTogJ1RoZSBgaWRgIG11c3QgY29udGFpbiBvbmx5IGxvd2VyY2FzZSBsZXR0ZXJzLCBkaWdpdHMgYW5kIGh5cGhlbnMuJ1xuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgICB0eXBlOiAncHJvYmxlbSdcbiAgfVxufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUtBLE1BQU0sK0JBQStCO0FBS3JDLE1BQU0sOEJBQThCO0FBS3BDLE1BQU0sZ0NBQWdDO0FBSzdDLE1BQU0sd0JBQXdCO0FBS3ZCLE1BQU0sYUFBOEI7QUFBQSxFQUN6QyxPQUFPLFNBQVM7QUFDZCxXQUFPO0FBQUEsTUFDTCxTQUFTLE1BQXFCO0FBQzVCLGNBQU0saUJBQWlCLGtCQUFrQixJQUFJO0FBRTdDLFlBQUksQ0FBQyxnQkFBZ0I7QUFDbkI7QUFBQSxRQUNGO0FBRUEsY0FBTSxTQUFTLG1CQUFtQixnQkFBZ0IsSUFBSTtBQUV0RCxZQUFJLENBQUMsUUFBUTtBQUNYO0FBQUEsUUFDRjtBQUVBLGNBQU0sS0FBSyxlQUFlLE9BQU8sS0FBSztBQUV0QyxZQUFJLE9BQU8sTUFBTTtBQUNmO0FBQUEsUUFDRjtBQUVBLGNBQU0sYUFBYSxhQUFhLE9BQU8sS0FBSztBQUU1QyxZQUFJLENBQUMsc0JBQXNCLEtBQUssRUFBRSxHQUFHO0FBQ25DLGtCQUFRLE9BQU87QUFBQSxZQUNiLFdBQVc7QUFBQSxZQUNYLE1BQU07QUFBQSxVQUNSLENBQUM7QUFBQSxRQUNIO0FBRUEsWUFBSSxHQUFHLFlBQVksRUFBRSxTQUFTLFVBQVUsR0FBRztBQUN6QyxrQkFBUSxPQUFPO0FBQUEsWUFDYixXQUFXO0FBQUEsWUFDWCxNQUFNO0FBQUEsVUFDUixDQUFDO0FBQUEsUUFDSDtBQUVBLFlBQUksR0FBRyxZQUFZLEVBQUUsU0FBUyxRQUFRLEdBQUc7QUFDdkMsa0JBQVEsT0FBTztBQUFBLFlBQ2IsV0FBVztBQUFBLFlBQ1gsTUFBTTtBQUFBLFVBQ1IsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE1BQU07QUFBQSxJQUNKLE1BQU07QUFBQSxNQUNKLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFDQSxVQUFVO0FBQUEsTUFDUixDQUFDLDRCQUE0QixHQUFHO0FBQUEsTUFDaEMsQ0FBQywyQkFBMkIsR0FBRztBQUFBLE1BQy9CLENBQUMsNkJBQTZCLEdBQUc7QUFBQSxJQUNuQztBQUFBLElBQ0EsUUFBUSxDQUFDO0FBQUEsSUFDVCxNQUFNO0FBQUEsRUFDUjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/// <reference path="../../../library.d.mts" />
|
|
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';
|
|
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;
|