@spyglassmc/core 0.1.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/README.md +10 -0
- package/lib/common/Heap.d.ts +1 -0
- package/lib/common/Heap.js +2 -0
- package/lib/common/index.d.ts +2 -0
- package/lib/common/index.js +14 -0
- package/lib/common/util.d.ts +120 -0
- package/lib/common/util.js +292 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.js +20 -0
- package/lib/node/AstNode.d.ts +64 -0
- package/lib/node/AstNode.js +108 -0
- package/lib/node/BooleanNode.d.ts +13 -0
- package/lib/node/BooleanNode.js +20 -0
- package/lib/node/CommentNode.d.ts +12 -0
- package/lib/node/CommentNode.js +11 -0
- package/lib/node/ErrorNode.d.ts +8 -0
- package/lib/node/ErrorNode.js +12 -0
- package/lib/node/FileNode.d.ts +21 -0
- package/lib/node/FileNode.js +11 -0
- package/lib/node/FloatNode.d.ts +13 -0
- package/lib/node/FloatNode.js +21 -0
- package/lib/node/IntegerNode.d.ts +13 -0
- package/lib/node/IntegerNode.js +20 -0
- package/lib/node/ListNode.d.ts +15 -0
- package/lib/node/ListNode.js +11 -0
- package/lib/node/LiteralNode.d.ts +19 -0
- package/lib/node/LiteralNode.js +22 -0
- package/lib/node/LongNode.d.ts +13 -0
- package/lib/node/LongNode.js +20 -0
- package/lib/node/RecordNode.d.ts +20 -0
- package/lib/node/RecordNode.js +11 -0
- package/lib/node/ResourceLocationNode.d.ts +41 -0
- package/lib/node/ResourceLocationNode.js +65 -0
- package/lib/node/Sequence.d.ts +22 -0
- package/lib/node/Sequence.js +11 -0
- package/lib/node/StringNode.d.ts +63 -0
- package/lib/node/StringNode.js +43 -0
- package/lib/node/SymbolNode.d.ts +21 -0
- package/lib/node/SymbolNode.js +22 -0
- package/lib/node/TableNode.d.ts +17 -0
- package/lib/node/TableNode.js +11 -0
- package/lib/node/index.d.ts +16 -0
- package/lib/node/index.js +28 -0
- package/lib/parser/Parser.d.ts +16 -0
- package/lib/parser/Parser.js +5 -0
- package/lib/parser/boolean.d.ts +4 -0
- package/lib/parser/boolean.js +11 -0
- package/lib/parser/comment.d.ts +12 -0
- package/lib/parser/comment.js +34 -0
- package/lib/parser/empty.d.ts +3 -0
- package/lib/parser/empty.js +7 -0
- package/lib/parser/error.d.ts +8 -0
- package/lib/parser/error.js +22 -0
- package/lib/parser/file.d.ts +9 -0
- package/lib/parser/file.js +37 -0
- package/lib/parser/float.d.ts +33 -0
- package/lib/parser/float.js +57 -0
- package/lib/parser/index.d.ts +17 -0
- package/lib/parser/index.js +36 -0
- package/lib/parser/integer.d.ts +33 -0
- package/lib/parser/integer.js +46 -0
- package/lib/parser/list.d.ts +12 -0
- package/lib/parser/list.js +70 -0
- package/lib/parser/literal.d.ts +5 -0
- package/lib/parser/literal.js +41 -0
- package/lib/parser/long.d.ts +33 -0
- package/lib/parser/long.js +50 -0
- package/lib/parser/record.d.ts +22 -0
- package/lib/parser/record.js +97 -0
- package/lib/parser/resourceLocation.d.ts +4 -0
- package/lib/parser/resourceLocation.js +67 -0
- package/lib/parser/string.d.ts +18 -0
- package/lib/parser/string.js +129 -0
- package/lib/parser/symbol.d.ts +12 -0
- package/lib/parser/symbol.js +33 -0
- package/lib/parser/table.d.ts +22 -0
- package/lib/parser/table.js +97 -0
- package/lib/parser/util.d.ts +134 -0
- package/lib/parser/util.js +224 -0
- package/lib/processor/ColorInfoProvider.d.ts +87 -0
- package/lib/processor/ColorInfoProvider.js +141 -0
- package/lib/processor/InlayHintProvider.d.ts +8 -0
- package/lib/processor/InlayHintProvider.js +3 -0
- package/lib/processor/SignatureHelpProvider.d.ts +18 -0
- package/lib/processor/SignatureHelpProvider.js +3 -0
- package/lib/processor/checker/Checker.d.ts +7 -0
- package/lib/processor/checker/Checker.js +7 -0
- package/lib/processor/checker/builtin.d.ts +23 -0
- package/lib/processor/checker/builtin.js +83 -0
- package/lib/processor/checker/index.d.ts +3 -0
- package/lib/processor/checker/index.js +28 -0
- package/lib/processor/colorizer/Colorizer.d.ts +23 -0
- package/lib/processor/colorizer/Colorizer.js +70 -0
- package/lib/processor/colorizer/builtin.d.ts +17 -0
- package/lib/processor/colorizer/builtin.js +84 -0
- package/lib/processor/colorizer/index.d.ts +3 -0
- package/lib/processor/colorizer/index.js +28 -0
- package/lib/processor/completer/Completer.d.ts +75 -0
- package/lib/processor/completer/Completer.js +92 -0
- package/lib/processor/completer/builtin.d.ts +30 -0
- package/lib/processor/completer/builtin.js +172 -0
- package/lib/processor/completer/index.d.ts +3 -0
- package/lib/processor/completer/index.js +28 -0
- package/lib/processor/formatter/Formatter.d.ts +6 -0
- package/lib/processor/formatter/Formatter.js +19 -0
- package/lib/processor/formatter/builtin.d.ts +15 -0
- package/lib/processor/formatter/builtin.js +60 -0
- package/lib/processor/formatter/index.d.ts +3 -0
- package/lib/processor/formatter/index.js +28 -0
- package/lib/processor/index.d.ts +10 -0
- package/lib/processor/index.js +22 -0
- package/lib/processor/linter/Linter.d.ts +4 -0
- package/lib/processor/linter/Linter.js +3 -0
- package/lib/processor/linter/builtin/undeclaredSymbol.d.ts +4 -0
- package/lib/processor/linter/builtin/undeclaredSymbol.js +73 -0
- package/lib/processor/linter/builtin.d.ts +15 -0
- package/lib/processor/linter/builtin.js +120 -0
- package/lib/processor/linter/index.d.ts +3 -0
- package/lib/processor/linter/index.js +28 -0
- package/lib/processor/util.d.ts +17 -0
- package/lib/processor/util.js +32 -0
- package/lib/service/CacheService.d.ts +54 -0
- package/lib/service/CacheService.js +195 -0
- package/lib/service/CommandExecutor.d.ts +3 -0
- package/lib/service/CommandExecutor.js +7 -0
- package/lib/service/Config.d.ts +218 -0
- package/lib/service/Config.js +264 -0
- package/lib/service/Context.d.ts +143 -0
- package/lib/service/Context.js +143 -0
- package/lib/service/Dependency.d.ts +10 -0
- package/lib/service/Dependency.js +11 -0
- package/lib/service/Downloader.d.ts +67 -0
- package/lib/service/Downloader.js +185 -0
- package/lib/service/ErrorReporter.d.ts +27 -0
- package/lib/service/ErrorReporter.js +49 -0
- package/lib/service/FileService.d.ts +96 -0
- package/lib/service/FileService.js +224 -0
- package/lib/service/Hover.d.ts +10 -0
- package/lib/service/Hover.js +16 -0
- package/lib/service/Logger.d.ts +31 -0
- package/lib/service/Logger.js +30 -0
- package/lib/service/MetaRegistry.d.ts +106 -0
- package/lib/service/MetaRegistry.js +192 -0
- package/lib/service/Operations.d.ts +8 -0
- package/lib/service/Operations.js +26 -0
- package/lib/service/Profiler.d.ts +33 -0
- package/lib/service/Profiler.js +76 -0
- package/lib/service/Project.d.ts +173 -0
- package/lib/service/Project.js +593 -0
- package/lib/service/Service.d.ts +55 -0
- package/lib/service/Service.js +207 -0
- package/lib/service/SymbolLocations.d.ts +17 -0
- package/lib/service/SymbolLocations.js +16 -0
- package/lib/service/SymbolRegistrar.d.ts +5 -0
- package/lib/service/SymbolRegistrar.js +3 -0
- package/lib/service/fileUtil.d.ts +121 -0
- package/lib/service/fileUtil.js +268 -0
- package/lib/service/index.d.ts +18 -0
- package/lib/service/index.js +33 -0
- package/lib/source/IndexMap.d.ts +16 -0
- package/lib/source/IndexMap.js +46 -0
- package/lib/source/LanguageError.d.ts +27 -0
- package/lib/source/LanguageError.js +15 -0
- package/lib/source/Location.d.ts +19 -0
- package/lib/source/Location.js +25 -0
- package/lib/source/Offset.d.ts +13 -0
- package/lib/source/Offset.js +25 -0
- package/lib/source/Position.d.ts +23 -0
- package/lib/source/Position.js +43 -0
- package/lib/source/PositionRange.d.ts +38 -0
- package/lib/source/PositionRange.js +83 -0
- package/lib/source/Range.d.ts +68 -0
- package/lib/source/Range.js +155 -0
- package/lib/source/Source.d.ts +110 -0
- package/lib/source/Source.js +222 -0
- package/lib/source/index.d.ts +9 -0
- package/lib/source/index.js +21 -0
- package/lib/symbol/Symbol.d.ts +219 -0
- package/lib/symbol/Symbol.js +324 -0
- package/lib/symbol/SymbolUtil.d.ts +407 -0
- package/lib/symbol/SymbolUtil.js +880 -0
- package/lib/symbol/UriBinder.d.ts +3 -0
- package/lib/symbol/UriBinder.js +3 -0
- package/lib/symbol/index.d.ts +4 -0
- package/lib/symbol/index.js +16 -0
- package/package.json +41 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
5
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
8
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
11
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
var _CacheService_cacheFilePath;
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.CacheService = exports.LatestCacheVersion = void 0;
|
|
19
|
+
const path_1 = __importDefault(require("path"));
|
|
20
|
+
const common_1 = require("../common");
|
|
21
|
+
const symbol_1 = require("../symbol");
|
|
22
|
+
const fileUtil_1 = require("./fileUtil");
|
|
23
|
+
/**
|
|
24
|
+
* The format version of the cache. Should be increased when any changes that
|
|
25
|
+
* could invalidate the cache are introduced to the Spyglass codebase.
|
|
26
|
+
*/
|
|
27
|
+
exports.LatestCacheVersion = 1;
|
|
28
|
+
var Checksums;
|
|
29
|
+
(function (Checksums) {
|
|
30
|
+
function create() {
|
|
31
|
+
return {
|
|
32
|
+
files: {},
|
|
33
|
+
roots: {},
|
|
34
|
+
symbolRegistrars: {},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
Checksums.create = create;
|
|
38
|
+
})(Checksums || (Checksums = {}));
|
|
39
|
+
class CacheService {
|
|
40
|
+
/**
|
|
41
|
+
* @param cacheRoot File path to the directory where cache files by Spyglass should be stored.
|
|
42
|
+
* @param project
|
|
43
|
+
*/
|
|
44
|
+
constructor(cacheRoot, project) {
|
|
45
|
+
this.cacheRoot = cacheRoot;
|
|
46
|
+
this.project = project;
|
|
47
|
+
this.checksums = Checksums.create();
|
|
48
|
+
_CacheService_cacheFilePath.set(this, void 0);
|
|
49
|
+
this.project.on('documentUpdated', ({ doc }) => {
|
|
50
|
+
try {
|
|
51
|
+
// TODO: Don't update this for every single change.
|
|
52
|
+
this.checksums.files[doc.uri] = (0, common_1.getSha1)(doc.getText());
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
if (!(0, common_1.isErrorCode)(e, 'EISDIR')) {
|
|
56
|
+
this.project.logger.error(`[CacheService#hash-file] ${doc.uri}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
this.project.on('rootsUpdated', async ({ roots }) => {
|
|
61
|
+
for (const root of roots) {
|
|
62
|
+
try {
|
|
63
|
+
this.checksums.roots[root] = await this.project.fs.hash(root);
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
if (!(0, common_1.isErrorCode)(e, 'EISDIR')) {
|
|
67
|
+
this.project.logger.error(`[CacheService#hash-root] ${root}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
this.project.on('symbolRegistrarExecuted', ({ id, checksum }) => {
|
|
73
|
+
if (checksum !== undefined) {
|
|
74
|
+
this.checksums.symbolRegistrars[id] = checksum;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* @throws
|
|
80
|
+
*
|
|
81
|
+
* @returns `${cacheRoot}/symbols/${sha1(projectRoot)}.json`
|
|
82
|
+
*/
|
|
83
|
+
getCacheFilePath() {
|
|
84
|
+
return __classPrivateFieldSet(this, _CacheService_cacheFilePath, __classPrivateFieldGet(this, _CacheService_cacheFilePath, "f") ?? path_1.default.join(this.cacheRoot, 'symbols', `${(0, common_1.getSha1)(this.project.projectRoot)}.json.gz`), "f");
|
|
85
|
+
}
|
|
86
|
+
async load() {
|
|
87
|
+
const __profiler = this.project.profilers.get('cache#load');
|
|
88
|
+
const ans = { symbols: {} };
|
|
89
|
+
let filePath;
|
|
90
|
+
try {
|
|
91
|
+
filePath = this.getCacheFilePath();
|
|
92
|
+
const cache = await fileUtil_1.fileUtil.readGzippedJson(filePath);
|
|
93
|
+
__profiler.task('Read File');
|
|
94
|
+
if (cache.version === exports.LatestCacheVersion) {
|
|
95
|
+
this.checksums = cache.checksums;
|
|
96
|
+
ans.symbols = symbol_1.SymbolTable.link(cache.symbols);
|
|
97
|
+
__profiler.task('Link Symbols');
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
this.project.logger.info(`[CacheService#load] Unsupported cache format ${cache.version}; expected ${exports.LatestCacheVersion}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
if (!(0, common_1.isEnoent)(e)) {
|
|
105
|
+
this.project.logger.error(`[CacheService#load] path = “${filePath}”`, e);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
__profiler.finalize();
|
|
109
|
+
return ans;
|
|
110
|
+
}
|
|
111
|
+
async validate() {
|
|
112
|
+
const ans = {
|
|
113
|
+
addedFiles: [],
|
|
114
|
+
changedFiles: [],
|
|
115
|
+
removedFiles: [],
|
|
116
|
+
unchangedFiles: [],
|
|
117
|
+
};
|
|
118
|
+
const unchangedRoots = [];
|
|
119
|
+
for (const [uri, checksum] of Object.entries(this.checksums.roots)) {
|
|
120
|
+
try {
|
|
121
|
+
const hash = await this.project.fs.hash(uri);
|
|
122
|
+
if (hash === checksum) {
|
|
123
|
+
unchangedRoots.push(uri);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
if (!(0, common_1.isErrorCode)(e, 'EISDIR')) {
|
|
128
|
+
this.project.logger.error(`[CacheService#hash-file] ${uri}`);
|
|
129
|
+
}
|
|
130
|
+
// Failed calculating hash. Assume the root has changed.
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
for (const [uri, checksum] of Object.entries(this.checksums.files)) {
|
|
134
|
+
if (unchangedRoots.some(root => uri.startsWith(root))) {
|
|
135
|
+
ans.unchangedFiles.push(uri);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
const hash = await this.project.fs.hash(uri);
|
|
140
|
+
if (hash === checksum) {
|
|
141
|
+
ans.unchangedFiles.push(uri);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
ans.changedFiles.push(uri);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
if ((0, common_1.isEnoent)(e) || (0, common_1.isErrorCode)(e, 'EISDIR')) {
|
|
149
|
+
ans.removedFiles.push(uri);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
this.project.logger.error(`[CacheService#validate] ${uri}`, e);
|
|
153
|
+
// Assume the file has changed.
|
|
154
|
+
ans.changedFiles.push(uri);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
for (const uri of this.project.getTrackedFiles()) {
|
|
159
|
+
if (!(uri in this.checksums.files)) {
|
|
160
|
+
ans.addedFiles.push(uri);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return ans;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* @returns If the cache file was saved successfully.
|
|
167
|
+
*/
|
|
168
|
+
async save() {
|
|
169
|
+
const __profiler = this.project.profilers.get('cache#save');
|
|
170
|
+
let filePath;
|
|
171
|
+
try {
|
|
172
|
+
filePath = this.getCacheFilePath();
|
|
173
|
+
const cache = {
|
|
174
|
+
checksums: this.checksums,
|
|
175
|
+
projectRoot: this.project.projectRoot,
|
|
176
|
+
symbols: symbol_1.SymbolTable.unlink(this.project.symbols.global),
|
|
177
|
+
version: exports.LatestCacheVersion,
|
|
178
|
+
};
|
|
179
|
+
__profiler.task('Unlink Symbols');
|
|
180
|
+
await fileUtil_1.fileUtil.writeGzippedJson(filePath, cache);
|
|
181
|
+
__profiler.task('Write File').finalize();
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
catch (e) {
|
|
185
|
+
this.project.logger.error(`[CacheService#save] path = “${filePath}”`, e);
|
|
186
|
+
}
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
reset() {
|
|
190
|
+
this.checksums = Checksums.create();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
exports.CacheService = CacheService;
|
|
194
|
+
_CacheService_cacheFilePath = new WeakMap();
|
|
195
|
+
//# sourceMappingURL=CacheService.js.map
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import EventEmitter from 'events';
|
|
3
|
+
import { Arrayable } from '../common';
|
|
4
|
+
import { ErrorSeverity } from '../source';
|
|
5
|
+
import type { Project } from './Project';
|
|
6
|
+
export interface Config {
|
|
7
|
+
/**
|
|
8
|
+
* Environment settings. Unlike other configs, all involved root folders must have the same `env` settings. It is undocumented
|
|
9
|
+
* what would happen if two roots have conflicting `env` settings.
|
|
10
|
+
*/
|
|
11
|
+
env: EnvConfig;
|
|
12
|
+
/**
|
|
13
|
+
* Formatter rules.
|
|
14
|
+
*/
|
|
15
|
+
format: FormatterConfig;
|
|
16
|
+
/**
|
|
17
|
+
*t Linter rules.
|
|
18
|
+
*/
|
|
19
|
+
lint: LinterConfig;
|
|
20
|
+
/**
|
|
21
|
+
* Code snippets.
|
|
22
|
+
*/
|
|
23
|
+
snippet: SnippetsConfig;
|
|
24
|
+
}
|
|
25
|
+
export interface EnvConfig {
|
|
26
|
+
/**
|
|
27
|
+
* Where to download data like `mcmeta` or `mc-nbtdoc` from (case-insensitive).
|
|
28
|
+
*
|
|
29
|
+
* * `GitHub`
|
|
30
|
+
* * `jsDelivr`: Not recommended as files from there can be outdated. Only use this if you have trouble connecting to `raw.githubusercontent.com`.
|
|
31
|
+
*/
|
|
32
|
+
dataSource: string;
|
|
33
|
+
/**
|
|
34
|
+
* A list of data packs the current project depends on. Each value in this array can be either an absolute file path
|
|
35
|
+
* to a data pack folder or data pack archive (e.g. `.zip` or `.tar.gz`), or a special string like `@mc-nbtdoc`.
|
|
36
|
+
*/
|
|
37
|
+
dependencies: string[];
|
|
38
|
+
feature: {
|
|
39
|
+
codeActions: boolean;
|
|
40
|
+
colors: boolean;
|
|
41
|
+
completions: boolean;
|
|
42
|
+
documentHighlighting: boolean;
|
|
43
|
+
documentLinks: boolean;
|
|
44
|
+
foldingRanges: boolean;
|
|
45
|
+
formatting: boolean;
|
|
46
|
+
hover: boolean;
|
|
47
|
+
inlayHint: boolean | {
|
|
48
|
+
enabledNodes: string[];
|
|
49
|
+
};
|
|
50
|
+
semanticColoring: boolean;
|
|
51
|
+
selectionRanges: boolean;
|
|
52
|
+
signatures: boolean;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* This field is case-insensitive.
|
|
56
|
+
*
|
|
57
|
+
* - `Auto`: Auto infer from `pack.mcmeta`.
|
|
58
|
+
* - `Latest release`
|
|
59
|
+
* - `Latest snapshot`
|
|
60
|
+
* - A version identifier or name found in [mcmeta's version data](https://github.com/misode/mcmeta/blob/summary/versions/data.json) that is older than `1.15` (inclusive).
|
|
61
|
+
*/
|
|
62
|
+
gameVersion: string;
|
|
63
|
+
/**
|
|
64
|
+
* Locale language for error messages and other texts provided by Spyglass.
|
|
65
|
+
*/
|
|
66
|
+
language: string;
|
|
67
|
+
/**
|
|
68
|
+
* Use custom files as mcmeta summaries.
|
|
69
|
+
*
|
|
70
|
+
* // TODO: Support file paths relative to the project root.
|
|
71
|
+
*/
|
|
72
|
+
mcmetaSummaryOverrides: Partial<Record<'blocks' | 'commands' | 'fluids' | 'registries', {
|
|
73
|
+
path: string;
|
|
74
|
+
replace?: boolean;
|
|
75
|
+
}>>;
|
|
76
|
+
permissionLevel: 1 | 2 | 3 | 4;
|
|
77
|
+
plugins: string[];
|
|
78
|
+
}
|
|
79
|
+
export declare type LinterSeverity = 'hint' | 'information' | 'warning' | 'error';
|
|
80
|
+
export declare namespace LinterSeverity {
|
|
81
|
+
function is(value: unknown): value is LinterSeverity;
|
|
82
|
+
function toErrorSeverity(value: LinterSeverity): ErrorSeverity;
|
|
83
|
+
}
|
|
84
|
+
declare type BracketSpacingConfig = any;
|
|
85
|
+
declare type SepSpacingConfig = any;
|
|
86
|
+
export declare type QuoteConfig = {
|
|
87
|
+
always?: boolean;
|
|
88
|
+
avoidEscape?: boolean | null;
|
|
89
|
+
type?: 'double' | 'single';
|
|
90
|
+
};
|
|
91
|
+
declare type LinterConfigValue<T> = T extends boolean ? null | T | [LinterSeverity, T] | LinterSeverity : null | T | [LinterSeverity, T];
|
|
92
|
+
export declare namespace LinterConfigValue {
|
|
93
|
+
function destruct(value: LinterConfigValue<boolean | string | number | object>): {
|
|
94
|
+
ruleSeverity: ErrorSeverity;
|
|
95
|
+
ruleValue: boolean | string | number | object;
|
|
96
|
+
} | undefined;
|
|
97
|
+
}
|
|
98
|
+
export interface FormatterConfig {
|
|
99
|
+
blockStateBracketSpacing: BracketSpacingConfig;
|
|
100
|
+
blockStateCommaSpacing: SepSpacingConfig;
|
|
101
|
+
blockStateEqualSpacing: SepSpacingConfig;
|
|
102
|
+
blockStateTrailingComma: boolean;
|
|
103
|
+
eol: 'auto' | 'CRLF' | 'LF';
|
|
104
|
+
nbtArrayBracketSpacing: BracketSpacingConfig;
|
|
105
|
+
nbtArrayCommaSpacing: SepSpacingConfig;
|
|
106
|
+
nbtArraySemicolonSpacing: {
|
|
107
|
+
after: number;
|
|
108
|
+
};
|
|
109
|
+
nbtArrayTrailingComma: boolean;
|
|
110
|
+
nbtByteSuffix: 'b' | 'B';
|
|
111
|
+
nbtCompoundBracketSpacing: BracketSpacingConfig;
|
|
112
|
+
nbtCompoundColonSpacing: SepSpacingConfig;
|
|
113
|
+
nbtCompoundCommaSpacing: SepSpacingConfig;
|
|
114
|
+
nbtCompoundTrailingComma: boolean;
|
|
115
|
+
nbtDoubleOmitSuffix: boolean;
|
|
116
|
+
nbtDoubleSuffix: 'd' | 'D';
|
|
117
|
+
nbtFloatSuffix: 'f' | 'F';
|
|
118
|
+
nbtListBracketSpacing: BracketSpacingConfig;
|
|
119
|
+
nbtListCommaSpacing: SepSpacingConfig;
|
|
120
|
+
nbtListTrailingComma: boolean;
|
|
121
|
+
nbtLongSuffix: 'l' | 'L';
|
|
122
|
+
nbtShortSuffix: 's' | 'S';
|
|
123
|
+
selectorBracketSpacing: BracketSpacingConfig;
|
|
124
|
+
selectorCommaSpacing: SepSpacingConfig;
|
|
125
|
+
selectorEqualSpacing: SepSpacingConfig;
|
|
126
|
+
selectorTrailingComma: boolean;
|
|
127
|
+
timeOmitTickUnit: boolean;
|
|
128
|
+
}
|
|
129
|
+
export interface LinterConfig {
|
|
130
|
+
blockStateSortKeys: LinterConfigValue<'alphabetically'>;
|
|
131
|
+
nbtCompoundSortKeys: LinterConfigValue<'alphabetically'>;
|
|
132
|
+
selectorSortKeys: LinterConfigValue<string[]>;
|
|
133
|
+
commandStringQuote: LinterConfigValue<QuoteConfig>;
|
|
134
|
+
nbtKeyQuote: LinterConfigValue<QuoteConfig>;
|
|
135
|
+
nbtPathQuote: LinterConfigValue<QuoteConfig>;
|
|
136
|
+
nbtStringQuote: LinterConfigValue<QuoteConfig>;
|
|
137
|
+
selectorKeyQuote: LinterConfigValue<QuoteConfig>;
|
|
138
|
+
idOmitDefaultNamespace: LinterConfigValue<boolean>;
|
|
139
|
+
nameOfNbtKey: LinterConfigValue<string>;
|
|
140
|
+
nameOfObjective: LinterConfigValue<string>;
|
|
141
|
+
nameOfScoreHolder: LinterConfigValue<string>;
|
|
142
|
+
nameOfTag: LinterConfigValue<string>;
|
|
143
|
+
nameOfTeam: LinterConfigValue<string>;
|
|
144
|
+
nbtArrayLengthCheck: LinterConfigValue<boolean>;
|
|
145
|
+
nbtBoolean: LinterConfigValue<boolean>;
|
|
146
|
+
nbtListLengthCheck: LinterConfigValue<boolean>;
|
|
147
|
+
nbtTypeCheck: LinterConfigValue<'strictly' | 'loosely'>;
|
|
148
|
+
undeclaredSymbol: LinterConfigValue<SymbolLinterConfig>;
|
|
149
|
+
}
|
|
150
|
+
export interface SnippetsConfig {
|
|
151
|
+
[label: string]: string;
|
|
152
|
+
}
|
|
153
|
+
export declare type SymbolLinterConfig = Arrayable<SymbolLinterConfig.Complex> | SymbolLinterConfig.Action;
|
|
154
|
+
export declare namespace SymbolLinterConfig {
|
|
155
|
+
function is(value: unknown): value is SymbolLinterConfig;
|
|
156
|
+
interface Complex {
|
|
157
|
+
/**
|
|
158
|
+
* {@link Condition}s in this array are connected with OR.
|
|
159
|
+
*/
|
|
160
|
+
if?: Arrayable<Condition>;
|
|
161
|
+
then?: Action;
|
|
162
|
+
override?: Arrayable<Complex>;
|
|
163
|
+
}
|
|
164
|
+
namespace Complex {
|
|
165
|
+
function is(v: unknown): v is Complex;
|
|
166
|
+
}
|
|
167
|
+
interface Condition {
|
|
168
|
+
category?: Arrayable<string>;
|
|
169
|
+
pattern?: Arrayable<string>;
|
|
170
|
+
excludePattern?: Arrayable<string>;
|
|
171
|
+
namespace?: Arrayable<string>;
|
|
172
|
+
excludeNamespace?: Arrayable<string>;
|
|
173
|
+
}
|
|
174
|
+
namespace Condition {
|
|
175
|
+
function is(v: unknown): v is Condition;
|
|
176
|
+
}
|
|
177
|
+
interface DeclareAction {
|
|
178
|
+
declare: 'block' | 'file' | 'public';
|
|
179
|
+
}
|
|
180
|
+
interface ReportAction {
|
|
181
|
+
report: LinterSeverity | 'inherit';
|
|
182
|
+
}
|
|
183
|
+
type Action = DeclareAction | ReportAction;
|
|
184
|
+
namespace Action {
|
|
185
|
+
function isDeclare(value: Action | undefined): value is DeclareAction;
|
|
186
|
+
function isReport(value: Action | undefined): value is ReportAction;
|
|
187
|
+
function is(v: unknown): v is Action;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Config which simulates the default vanilla command system.
|
|
192
|
+
*/
|
|
193
|
+
export declare const VanillaConfig: Config;
|
|
194
|
+
declare type ConfigEvent = {
|
|
195
|
+
config: Config;
|
|
196
|
+
};
|
|
197
|
+
declare type ErrorEvent = {
|
|
198
|
+
error: unknown;
|
|
199
|
+
uri: string;
|
|
200
|
+
};
|
|
201
|
+
export interface ConfigService {
|
|
202
|
+
on(event: 'changed', callbackFn: (data: ConfigEvent) => void): this;
|
|
203
|
+
on(event: 'error', callbackFn: (data: ErrorEvent) => void): this;
|
|
204
|
+
once(event: 'changed', callbackFn: (data: ConfigEvent) => void): this;
|
|
205
|
+
once(event: 'error', callbackFn: (data: ErrorEvent) => void): this;
|
|
206
|
+
emit(event: 'changed', data: ConfigEvent): boolean;
|
|
207
|
+
emit(event: 'error', data: ErrorEvent): boolean;
|
|
208
|
+
}
|
|
209
|
+
export declare class ConfigService extends EventEmitter {
|
|
210
|
+
private readonly project;
|
|
211
|
+
static readonly ConfigFileNames: readonly ["spyglass.json", ".spyglassrc.json"];
|
|
212
|
+
constructor(project: Project);
|
|
213
|
+
load(): Promise<Config>;
|
|
214
|
+
private static isConfigFile;
|
|
215
|
+
private merge;
|
|
216
|
+
}
|
|
217
|
+
export {};
|
|
218
|
+
//# sourceMappingURL=Config.d.ts.map
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ConfigService = exports.VanillaConfig = exports.SymbolLinterConfig = exports.LinterConfigValue = exports.LinterSeverity = void 0;
|
|
7
|
+
const events_1 = __importDefault(require("events"));
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const rfdc_1 = __importDefault(require("rfdc"));
|
|
10
|
+
const common_1 = require("../common");
|
|
11
|
+
const symbol_1 = require("../symbol");
|
|
12
|
+
var LinterSeverity;
|
|
13
|
+
(function (LinterSeverity) {
|
|
14
|
+
function is(value) {
|
|
15
|
+
return value === 'hint' ||
|
|
16
|
+
value === 'information' ||
|
|
17
|
+
value === 'warning' ||
|
|
18
|
+
value === 'error';
|
|
19
|
+
}
|
|
20
|
+
LinterSeverity.is = is;
|
|
21
|
+
function toErrorSeverity(value) {
|
|
22
|
+
switch (value) {
|
|
23
|
+
case 'error':
|
|
24
|
+
return 3 /* Error */;
|
|
25
|
+
case 'hint':
|
|
26
|
+
return 0 /* Hint */;
|
|
27
|
+
case 'information':
|
|
28
|
+
return 1 /* Information */;
|
|
29
|
+
case 'warning':
|
|
30
|
+
return 2 /* Warning */;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
LinterSeverity.toErrorSeverity = toErrorSeverity;
|
|
34
|
+
})(LinterSeverity = exports.LinterSeverity || (exports.LinterSeverity = {}));
|
|
35
|
+
var LinterConfigValue;
|
|
36
|
+
(function (LinterConfigValue) {
|
|
37
|
+
function destruct(value) {
|
|
38
|
+
if (value === null || value === undefined) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
if (LinterSeverity.is(value)) {
|
|
42
|
+
return {
|
|
43
|
+
ruleSeverity: LinterSeverity.toErrorSeverity(value),
|
|
44
|
+
ruleValue: true,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if (Array.isArray(value) && LinterSeverity.is(value[0])) {
|
|
48
|
+
return {
|
|
49
|
+
ruleSeverity: LinterSeverity.toErrorSeverity(value[0]),
|
|
50
|
+
ruleValue: value[1],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
ruleSeverity: 2 /* Warning */,
|
|
55
|
+
ruleValue: value,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
LinterConfigValue.destruct = destruct;
|
|
59
|
+
})(LinterConfigValue = exports.LinterConfigValue || (exports.LinterConfigValue = {}));
|
|
60
|
+
var SymbolLinterConfig;
|
|
61
|
+
(function (SymbolLinterConfig) {
|
|
62
|
+
function is(value) {
|
|
63
|
+
return common_1.Arrayable.is(value, Complex.is) || Action.is(value);
|
|
64
|
+
}
|
|
65
|
+
SymbolLinterConfig.is = is;
|
|
66
|
+
let Complex;
|
|
67
|
+
(function (Complex) {
|
|
68
|
+
function is(v) {
|
|
69
|
+
if (!v || typeof v !== 'object') {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
const value = v;
|
|
73
|
+
return ((value.if === undefined || common_1.Arrayable.is(value.if, Condition.is)) &&
|
|
74
|
+
(value.then === undefined || Action.is(value.then)) &&
|
|
75
|
+
(value.override === undefined || common_1.Arrayable.is(value.override, Complex.is)));
|
|
76
|
+
}
|
|
77
|
+
Complex.is = is;
|
|
78
|
+
})(Complex = SymbolLinterConfig.Complex || (SymbolLinterConfig.Complex = {}));
|
|
79
|
+
let Condition;
|
|
80
|
+
(function (Condition) {
|
|
81
|
+
function is(v) {
|
|
82
|
+
if (!v || typeof v !== 'object') {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
const value = v;
|
|
86
|
+
return ((value.category === undefined || common_1.Arrayable.is(value.category, common_1.TypePredicates.isString)) &&
|
|
87
|
+
(value.pattern === undefined || common_1.Arrayable.is(value.pattern, common_1.TypePredicates.isString)) &&
|
|
88
|
+
(value.excludePattern === undefined || common_1.Arrayable.is(value.excludePattern, common_1.TypePredicates.isString)) &&
|
|
89
|
+
(value.namespace === undefined || common_1.Arrayable.is(value.namespace, common_1.TypePredicates.isString)) &&
|
|
90
|
+
(value.excludeNamespace === undefined || common_1.Arrayable.is(value.excludeNamespace, common_1.TypePredicates.isString)));
|
|
91
|
+
}
|
|
92
|
+
Condition.is = is;
|
|
93
|
+
})(Condition = SymbolLinterConfig.Condition || (SymbolLinterConfig.Condition = {}));
|
|
94
|
+
let Action;
|
|
95
|
+
(function (Action) {
|
|
96
|
+
function isDeclare(value) {
|
|
97
|
+
return value !== undefined && ['block', 'file', 'public'].includes(value.declare);
|
|
98
|
+
}
|
|
99
|
+
Action.isDeclare = isDeclare;
|
|
100
|
+
function isReport(value) {
|
|
101
|
+
return value !== undefined && ['inherit', 'hint', 'information', 'warning', 'error'].includes(value.report);
|
|
102
|
+
}
|
|
103
|
+
Action.isReport = isReport;
|
|
104
|
+
function is(v) {
|
|
105
|
+
if (!v || typeof v !== 'object') {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
const value = v;
|
|
109
|
+
return isDeclare(value) || isReport(value);
|
|
110
|
+
}
|
|
111
|
+
Action.is = is;
|
|
112
|
+
})(Action = SymbolLinterConfig.Action || (SymbolLinterConfig.Action = {}));
|
|
113
|
+
})(SymbolLinterConfig = exports.SymbolLinterConfig || (exports.SymbolLinterConfig = {}));
|
|
114
|
+
/**
|
|
115
|
+
* Config which simulates the default vanilla command system.
|
|
116
|
+
*/
|
|
117
|
+
exports.VanillaConfig = {
|
|
118
|
+
env: {
|
|
119
|
+
dataSource: 'GitHub',
|
|
120
|
+
dependencies: [
|
|
121
|
+
'@mc-nbtdoc',
|
|
122
|
+
],
|
|
123
|
+
feature: {
|
|
124
|
+
codeActions: true,
|
|
125
|
+
colors: true,
|
|
126
|
+
completions: true,
|
|
127
|
+
documentHighlighting: true,
|
|
128
|
+
documentLinks: true,
|
|
129
|
+
foldingRanges: true,
|
|
130
|
+
formatting: true,
|
|
131
|
+
hover: true,
|
|
132
|
+
inlayHint: {
|
|
133
|
+
enabledNodes: [
|
|
134
|
+
'mcfunction:command_child/unknown',
|
|
135
|
+
],
|
|
136
|
+
},
|
|
137
|
+
semanticColoring: true,
|
|
138
|
+
selectionRanges: true,
|
|
139
|
+
signatures: true,
|
|
140
|
+
},
|
|
141
|
+
gameVersion: 'Auto',
|
|
142
|
+
language: 'Default',
|
|
143
|
+
permissionLevel: 2,
|
|
144
|
+
plugins: [],
|
|
145
|
+
mcmetaSummaryOverrides: {},
|
|
146
|
+
},
|
|
147
|
+
format: {
|
|
148
|
+
blockStateBracketSpacing: { inside: 0 },
|
|
149
|
+
blockStateCommaSpacing: { before: 0, after: 1 },
|
|
150
|
+
blockStateEqualSpacing: { before: 0, after: 0 },
|
|
151
|
+
blockStateTrailingComma: false,
|
|
152
|
+
eol: 'auto',
|
|
153
|
+
nbtArrayBracketSpacing: { inside: 0 },
|
|
154
|
+
nbtArrayCommaSpacing: { before: 0, after: 1 },
|
|
155
|
+
nbtArraySemicolonSpacing: { after: 1 },
|
|
156
|
+
nbtArrayTrailingComma: false,
|
|
157
|
+
nbtByteSuffix: 'b',
|
|
158
|
+
nbtCompoundBracketSpacing: { inside: 0 },
|
|
159
|
+
nbtCompoundColonSpacing: { before: 0, after: 1 },
|
|
160
|
+
nbtCompoundCommaSpacing: { before: 0, after: 1 },
|
|
161
|
+
nbtCompoundTrailingComma: false,
|
|
162
|
+
nbtDoubleOmitSuffix: false,
|
|
163
|
+
nbtDoubleSuffix: 'd',
|
|
164
|
+
nbtFloatSuffix: 'f',
|
|
165
|
+
nbtListBracketSpacing: { inside: 0 },
|
|
166
|
+
nbtListCommaSpacing: { before: 0, after: 1 },
|
|
167
|
+
nbtListTrailingComma: false,
|
|
168
|
+
nbtLongSuffix: 'L',
|
|
169
|
+
nbtShortSuffix: 's',
|
|
170
|
+
selectorBracketSpacing: { inside: 0 },
|
|
171
|
+
selectorCommaSpacing: { before: 0, after: 1 },
|
|
172
|
+
selectorEqualSpacing: { before: 0, after: 0 },
|
|
173
|
+
selectorTrailingComma: false,
|
|
174
|
+
timeOmitTickUnit: false,
|
|
175
|
+
},
|
|
176
|
+
lint: {
|
|
177
|
+
blockStateSortKeys: null,
|
|
178
|
+
nbtCompoundSortKeys: null,
|
|
179
|
+
selectorSortKeys: null,
|
|
180
|
+
commandStringQuote: null,
|
|
181
|
+
nbtKeyQuote: null,
|
|
182
|
+
nbtPathQuote: null,
|
|
183
|
+
nbtStringQuote: null,
|
|
184
|
+
selectorKeyQuote: null,
|
|
185
|
+
idOmitDefaultNamespace: null,
|
|
186
|
+
nameOfNbtKey: null,
|
|
187
|
+
nameOfObjective: null,
|
|
188
|
+
nameOfScoreHolder: null,
|
|
189
|
+
nameOfTag: null,
|
|
190
|
+
nameOfTeam: null,
|
|
191
|
+
nbtArrayLengthCheck: true,
|
|
192
|
+
nbtBoolean: null,
|
|
193
|
+
nbtListLengthCheck: null,
|
|
194
|
+
nbtTypeCheck: 'loosely',
|
|
195
|
+
undeclaredSymbol: [
|
|
196
|
+
{
|
|
197
|
+
if: [
|
|
198
|
+
{ category: symbol_1.RegistryCategories, namespace: 'minecraft' },
|
|
199
|
+
{ category: [...symbol_1.FileCategories, 'bossbar', 'objective', 'team'] },
|
|
200
|
+
],
|
|
201
|
+
then: { report: 'warning' },
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
then: { declare: 'block' },
|
|
205
|
+
},
|
|
206
|
+
],
|
|
207
|
+
},
|
|
208
|
+
snippet: {
|
|
209
|
+
executeIfScoreSet: 'execute if score ${1:score_holder} ${2:objective} = ${1:score_holder} ${2:objective} $0',
|
|
210
|
+
summonAec: 'summon minecraft:area_effect_cloud ~ ~ ~ {Age: -2147483648, Duration: -1, WaitTime: -2147483648, Tags: ["${1:tag}"]}',
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
class ConfigService extends events_1.default {
|
|
214
|
+
constructor(project) {
|
|
215
|
+
super();
|
|
216
|
+
this.project = project;
|
|
217
|
+
const handler = async ({ uri }) => {
|
|
218
|
+
if (ConfigService.isConfigFile(uri)) {
|
|
219
|
+
this.emit('changed', { config: await this.load() });
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
project.on('fileCreated', handler);
|
|
223
|
+
project.on('fileModified', handler);
|
|
224
|
+
project.on('fileDeleted', handler);
|
|
225
|
+
}
|
|
226
|
+
async load() {
|
|
227
|
+
let ans = exports.VanillaConfig;
|
|
228
|
+
for (const name of ConfigService.ConfigFileNames) {
|
|
229
|
+
const uriString = this.project.projectRoot + name;
|
|
230
|
+
const uri = new common_1.Uri(uriString);
|
|
231
|
+
try {
|
|
232
|
+
ans = JSON.parse((0, common_1.bufferToString)(await fs_1.promises.readFile(uri)));
|
|
233
|
+
}
|
|
234
|
+
catch (e) {
|
|
235
|
+
if ((0, common_1.isEnoent)(e)) {
|
|
236
|
+
// File doesn't exist.
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
this.emit('error', { error: e, uri: uriString });
|
|
240
|
+
}
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
return this.merge(exports.VanillaConfig, ans);
|
|
244
|
+
}
|
|
245
|
+
static isConfigFile(uri) {
|
|
246
|
+
return ConfigService.ConfigFileNames.some(n => uri.endsWith(`/${n}`));
|
|
247
|
+
}
|
|
248
|
+
merge(base, ...overrides) {
|
|
249
|
+
// FIXME
|
|
250
|
+
const ans = (0, rfdc_1.default)()(base);
|
|
251
|
+
for (const override of overrides) {
|
|
252
|
+
for (const key of ['env', 'format', 'lint', 'snippet']) {
|
|
253
|
+
ans[key] = { ...ans[key], ...override[key] };
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return ans;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
exports.ConfigService = ConfigService;
|
|
260
|
+
ConfigService.ConfigFileNames = Object.freeze([
|
|
261
|
+
'spyglass.json',
|
|
262
|
+
'.spyglassrc.json',
|
|
263
|
+
]);
|
|
264
|
+
//# sourceMappingURL=Config.js.map
|