@spyglassmc/core 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/README.md +7 -0
  2. package/lib/browser.d.ts +2 -0
  3. package/lib/browser.js +2 -0
  4. package/lib/common/Dev.d.ts +11 -0
  5. package/lib/common/Dev.js +90 -0
  6. package/lib/{service → common}/Logger.d.ts +0 -0
  7. package/lib/{service → common}/Logger.js +2 -5
  8. package/lib/common/Operations.d.ts +12 -0
  9. package/lib/common/Operations.js +33 -0
  10. package/lib/common/ReadonlyProxy.d.ts +9 -0
  11. package/lib/common/ReadonlyProxy.js +23 -0
  12. package/lib/common/StateProxy.d.ts +35 -0
  13. package/lib/common/StateProxy.js +69 -0
  14. package/lib/common/TwoWayMap.d.ts +21 -0
  15. package/lib/common/TwoWayMap.js +69 -0
  16. package/lib/common/externals/BrowserExternals.d.ts +3 -0
  17. package/lib/common/externals/BrowserExternals.js +191 -0
  18. package/lib/common/externals/NodeJsExternals.d.ts +3 -0
  19. package/lib/common/externals/NodeJsExternals.js +152 -0
  20. package/lib/common/externals/downloader.d.ts +31 -0
  21. package/lib/common/externals/downloader.js +32 -0
  22. package/lib/common/externals/index.d.ts +96 -0
  23. package/lib/common/externals/index.js +2 -0
  24. package/lib/common/index.d.ts +8 -1
  25. package/lib/common/index.js +8 -13
  26. package/lib/common/util.d.ts +50 -39
  27. package/lib/common/util.js +73 -122
  28. package/lib/index.d.ts +7 -7
  29. package/lib/index.js +7 -19
  30. package/lib/node/AstNode.d.ts +12 -11
  31. package/lib/node/AstNode.js +10 -16
  32. package/lib/node/BooleanNode.d.ts +2 -2
  33. package/lib/node/BooleanNode.js +4 -7
  34. package/lib/node/CommentNode.d.ts +6 -5
  35. package/lib/node/CommentNode.js +4 -9
  36. package/lib/node/ErrorNode.d.ts +1 -1
  37. package/lib/node/ErrorNode.js +2 -5
  38. package/lib/node/FileNode.d.ts +8 -4
  39. package/lib/node/FileNode.js +3 -6
  40. package/lib/node/FloatNode.d.ts +3 -3
  41. package/lib/node/FloatNode.js +4 -7
  42. package/lib/node/IntegerNode.d.ts +3 -3
  43. package/lib/node/IntegerNode.js +4 -7
  44. package/lib/node/ListNode.d.ts +2 -2
  45. package/lib/node/ListNode.js +2 -5
  46. package/lib/node/LiteralNode.d.ts +5 -5
  47. package/lib/node/LiteralNode.js +5 -8
  48. package/lib/node/LongNode.d.ts +3 -3
  49. package/lib/node/LongNode.js +4 -7
  50. package/lib/node/RecordNode.d.ts +2 -2
  51. package/lib/node/RecordNode.js +2 -5
  52. package/lib/node/ResourceLocationNode.d.ts +8 -10
  53. package/lib/node/ResourceLocationNode.js +9 -12
  54. package/lib/node/Sequence.d.ts +4 -3
  55. package/lib/node/Sequence.js +4 -6
  56. package/lib/node/StringNode.d.ts +5 -5
  57. package/lib/node/StringNode.js +9 -12
  58. package/lib/node/SymbolNode.d.ts +5 -5
  59. package/lib/node/SymbolNode.js +5 -8
  60. package/lib/node/index.d.ts +15 -15
  61. package/lib/node/index.js +15 -27
  62. package/lib/nodejs.d.ts +2 -0
  63. package/lib/nodejs.js +2 -0
  64. package/lib/parser/Parser.d.ts +3 -3
  65. package/lib/parser/Parser.js +1 -4
  66. package/lib/parser/boolean.d.ts +2 -2
  67. package/lib/parser/boolean.js +3 -6
  68. package/lib/parser/comment.d.ts +2 -2
  69. package/lib/parser/comment.js +5 -9
  70. package/lib/parser/empty.d.ts +1 -1
  71. package/lib/parser/empty.js +1 -5
  72. package/lib/parser/error.d.ts +2 -2
  73. package/lib/parser/error.js +5 -9
  74. package/lib/parser/file.d.ts +3 -3
  75. package/lib/parser/file.js +9 -13
  76. package/lib/parser/float.d.ts +4 -4
  77. package/lib/parser/float.js +12 -16
  78. package/lib/parser/index.d.ts +16 -16
  79. package/lib/parser/index.js +16 -34
  80. package/lib/parser/integer.d.ts +4 -4
  81. package/lib/parser/integer.js +10 -14
  82. package/lib/parser/list.d.ts +2 -2
  83. package/lib/parser/list.js +15 -19
  84. package/lib/parser/literal.d.ts +2 -2
  85. package/lib/parser/literal.js +5 -9
  86. package/lib/parser/long.d.ts +4 -4
  87. package/lib/parser/long.js +10 -14
  88. package/lib/parser/record.d.ts +3 -3
  89. package/lib/parser/record.js +20 -24
  90. package/lib/parser/resourceLocation.d.ts +2 -2
  91. package/lib/parser/resourceLocation.js +12 -24
  92. package/lib/parser/string.d.ts +7 -7
  93. package/lib/parser/string.js +40 -44
  94. package/lib/parser/symbol.d.ts +3 -3
  95. package/lib/parser/symbol.js +4 -14
  96. package/lib/parser/util.d.ts +30 -12
  97. package/lib/parser/util.js +78 -65
  98. package/lib/processor/ColorInfoProvider.d.ts +1 -1
  99. package/lib/processor/ColorInfoProvider.js +6 -9
  100. package/lib/processor/InlayHintProvider.d.ts +4 -3
  101. package/lib/processor/InlayHintProvider.js +1 -2
  102. package/lib/processor/SignatureHelpProvider.d.ts +4 -3
  103. package/lib/processor/SignatureHelpProvider.js +1 -2
  104. package/lib/processor/binder/Binder.d.ts +26 -0
  105. package/lib/processor/binder/Binder.js +18 -0
  106. package/lib/processor/binder/builtin.d.ts +27 -0
  107. package/lib/processor/binder/builtin.js +116 -0
  108. package/lib/processor/binder/index.d.ts +3 -0
  109. package/lib/processor/binder/index.js +3 -0
  110. package/lib/processor/checker/Checker.d.ts +2 -2
  111. package/lib/processor/checker/Checker.js +1 -5
  112. package/lib/processor/checker/builtin.d.ts +4 -4
  113. package/lib/processor/checker/builtin.js +22 -33
  114. package/lib/processor/checker/index.d.ts +2 -2
  115. package/lib/processor/checker/index.js +2 -27
  116. package/lib/processor/colorizer/Colorizer.d.ts +6 -5
  117. package/lib/processor/colorizer/Colorizer.js +8 -11
  118. package/lib/processor/colorizer/builtin.d.ts +3 -3
  119. package/lib/processor/colorizer/builtin.js +33 -46
  120. package/lib/processor/colorizer/index.d.ts +2 -2
  121. package/lib/processor/colorizer/index.js +2 -27
  122. package/lib/processor/completer/Completer.d.ts +6 -5
  123. package/lib/processor/completer/Completer.js +14 -33
  124. package/lib/processor/completer/builtin.d.ts +10 -9
  125. package/lib/processor/completer/builtin.js +59 -75
  126. package/lib/processor/completer/index.d.ts +2 -2
  127. package/lib/processor/completer/index.js +2 -27
  128. package/lib/processor/formatter/Formatter.d.ts +4 -3
  129. package/lib/processor/formatter/Formatter.js +2 -7
  130. package/lib/processor/formatter/builtin.d.ts +3 -3
  131. package/lib/processor/formatter/builtin.js +22 -36
  132. package/lib/processor/formatter/index.d.ts +2 -2
  133. package/lib/processor/formatter/index.js +2 -27
  134. package/lib/processor/index.d.ts +10 -9
  135. package/lib/processor/index.js +10 -21
  136. package/lib/processor/linter/Linter.d.ts +4 -3
  137. package/lib/processor/linter/Linter.js +1 -2
  138. package/lib/processor/linter/builtin/undeclaredSymbol.d.ts +2 -2
  139. package/lib/processor/linter/builtin/undeclaredSymbol.js +23 -27
  140. package/lib/processor/linter/builtin.d.ts +4 -3
  141. package/lib/processor/linter/builtin.js +19 -26
  142. package/lib/processor/linter/index.d.ts +2 -2
  143. package/lib/processor/linter/index.js +2 -27
  144. package/lib/processor/util.d.ts +4 -14
  145. package/lib/processor/util.js +1 -16
  146. package/lib/service/CacheService.d.ts +8 -6
  147. package/lib/service/CacheService.js +35 -56
  148. package/lib/service/Config.d.ts +17 -16
  149. package/lib/service/Config.js +56 -51
  150. package/lib/service/Context.d.ts +24 -21
  151. package/lib/service/Context.js +40 -36
  152. package/lib/service/Dependency.js +2 -5
  153. package/lib/service/Downloader.d.ts +9 -39
  154. package/lib/service/Downloader.js +37 -106
  155. package/lib/service/ErrorReporter.d.ts +2 -2
  156. package/lib/service/ErrorReporter.js +11 -15
  157. package/lib/service/FileService.d.ts +40 -14
  158. package/lib/service/FileService.js +107 -81
  159. package/lib/service/Hover.d.ts +2 -2
  160. package/lib/service/Hover.js +4 -7
  161. package/lib/service/MetaRegistry.d.ts +17 -12
  162. package/lib/service/MetaRegistry.js +81 -73
  163. package/lib/service/Profiler.d.ts +3 -2
  164. package/lib/service/Profiler.js +81 -45
  165. package/lib/service/Project.d.ts +101 -73
  166. package/lib/service/Project.js +438 -367
  167. package/lib/service/Service.d.ts +19 -29
  168. package/lib/service/Service.js +57 -53
  169. package/lib/service/SymbolLocations.d.ts +3 -3
  170. package/lib/service/SymbolLocations.js +4 -7
  171. package/lib/service/SymbolRegistrar.d.ts +1 -1
  172. package/lib/service/SymbolRegistrar.js +1 -2
  173. package/lib/service/UriProcessor.d.ts +5 -0
  174. package/lib/service/UriProcessor.js +2 -0
  175. package/lib/service/fileUtil.d.ts +21 -41
  176. package/lib/service/fileUtil.js +59 -129
  177. package/lib/service/index.d.ts +16 -17
  178. package/lib/service/index.js +16 -31
  179. package/lib/source/IndexMap.d.ts +1 -1
  180. package/lib/source/IndexMap.js +7 -10
  181. package/lib/source/LanguageError.d.ts +2 -2
  182. package/lib/source/LanguageError.js +3 -6
  183. package/lib/source/Location.d.ts +3 -3
  184. package/lib/source/Location.js +6 -9
  185. package/lib/source/Offset.d.ts +1 -1
  186. package/lib/source/Offset.js +4 -7
  187. package/lib/source/Position.js +2 -5
  188. package/lib/source/PositionRange.d.ts +2 -2
  189. package/lib/source/PositionRange.js +14 -17
  190. package/lib/source/Range.d.ts +1 -1
  191. package/lib/source/Range.js +7 -10
  192. package/lib/source/Source.d.ts +9 -4
  193. package/lib/source/Source.js +58 -31
  194. package/lib/source/index.d.ts +8 -8
  195. package/lib/source/index.js +8 -20
  196. package/lib/symbol/Symbol.d.ts +15 -14
  197. package/lib/symbol/Symbol.js +53 -68
  198. package/lib/symbol/SymbolUtil.d.ts +30 -39
  199. package/lib/symbol/SymbolUtil.js +189 -168
  200. package/lib/symbol/index.d.ts +2 -3
  201. package/lib/symbol/index.js +2 -15
  202. package/package.json +7 -4
  203. package/lib/service/Operations.d.ts +0 -8
  204. package/lib/service/Operations.js +0 -26
  205. package/lib/symbol/UriBinder.d.ts +0 -3
  206. package/lib/symbol/UriBinder.js +0 -3
@@ -1,17 +1,13 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.registerLinters = exports.configValidator = exports.quote = exports.nameConvention = exports.noop = void 0;
4
- const locales_1 = require("@spyglassmc/locales");
5
- const parser_1 = require("../../parser");
6
- const service_1 = require("../../service");
7
- const symbol_1 = require("../../symbol");
8
- const undeclaredSymbol_1 = require("./builtin/undeclaredSymbol");
9
- const noop = () => { };
10
- exports.noop = noop;
1
+ import { localeQuote, localize } from '@spyglassmc/locales';
2
+ import { isAllowedCharacter } from '../../parser/index.js';
3
+ import { SymbolLinterConfig } from '../../service/index.js';
4
+ import { McdocCategories } from '../../symbol/index.js';
5
+ import { undeclaredSymbol } from './builtin/undeclaredSymbol.js';
6
+ export const noop = () => { };
11
7
  /**
12
8
  * @param key The name of the key on the {@link AstNode} that contains the value to be validated.
13
9
  */
14
- function nameConvention(key) {
10
+ export function nameConvention(key) {
15
11
  return (node, ctx) => {
16
12
  if (typeof node[key] !== 'string') {
17
13
  throw new Error(`Trying to access property "${key}" of node type "${node.type}"`);
@@ -21,7 +17,7 @@ function nameConvention(key) {
21
17
  // SECURITY: ReDoS attack. The risk is acceptable at the moment.
22
18
  const regex = new RegExp(ctx.ruleValue);
23
19
  if (!name.match(regex)) {
24
- ctx.err.lint((0, locales_1.localize)('linter.name-convention.illegal', (0, locales_1.localeQuote)(name), (0, locales_1.localeQuote)(ctx.ruleValue)), node);
20
+ ctx.err.lint(localize('linter.name-convention.illegal', localeQuote(name), localeQuote(ctx.ruleValue)), node);
25
21
  }
26
22
  }
27
23
  catch (e) {
@@ -29,11 +25,10 @@ function nameConvention(key) {
29
25
  }
30
26
  };
31
27
  }
32
- exports.nameConvention = nameConvention;
33
- const quote = (node, ctx) => {
28
+ export const quote = (node, ctx) => {
34
29
  const config = ctx.ruleValue;
35
30
  const mustValueBeQuoted = node.options.unquotable
36
- ? [...node.value].some(c => !(0, parser_1.isAllowedCharacter)(c, node.options.unquotable))
31
+ ? [...node.value].some(c => !isAllowedCharacter(c, node.options.unquotable))
37
32
  : true;
38
33
  const isQuoteRequired = config.always || mustValueBeQuoted;
39
34
  const isQuoteProhibited = config.always === false && !mustValueBeQuoted;
@@ -53,18 +48,17 @@ const quote = (node, ctx) => {
53
48
  // TODO: Error no quote expected
54
49
  }
55
50
  };
56
- exports.quote = quote;
57
- var configValidator;
51
+ export var configValidator;
58
52
  (function (configValidator) {
59
53
  function getDocLink(name) {
60
54
  return `https://spyglassmc.com/user/lint/${name}`;
61
55
  }
62
56
  function wrapError(name, msg) {
63
- return `[Invalid Linter Config] [${name}] ${(0, locales_1.localize)('linter-config-validator.wrapper', msg, getDocLink(name))}`;
57
+ return `[Invalid Linter Config] [${name}] ${localize('linter-config-validator.wrapper', msg, getDocLink(name))}`;
64
58
  }
65
59
  function nameConvention(name, val, logger) {
66
60
  if (typeof val !== 'string') {
67
- logger.error(wrapError(name, (0, locales_1.localize)('linter-config-validator.name-convention.type')));
61
+ logger.error(wrapError(name, localize('linter-config-validator.name-convention.type')));
68
62
  return false;
69
63
  }
70
64
  try {
@@ -72,7 +66,7 @@ var configValidator;
72
66
  new RegExp(val);
73
67
  }
74
68
  catch (e) {
75
- logger.error(wrapError(name, (0, locales_1.localize)('') // FIXME
69
+ logger.error(wrapError(name, localize('') // FIXME
76
70
  ), e);
77
71
  return false;
78
72
  }
@@ -80,11 +74,11 @@ var configValidator;
80
74
  }
81
75
  configValidator.nameConvention = nameConvention;
82
76
  function symbolLinterConfig(_name, value, _logger) {
83
- return service_1.SymbolLinterConfig.is(value);
77
+ return SymbolLinterConfig.is(value);
84
78
  }
85
79
  configValidator.symbolLinterConfig = symbolLinterConfig;
86
- })(configValidator = exports.configValidator || (exports.configValidator = {}));
87
- function registerLinters(meta) {
80
+ })(configValidator || (configValidator = {}));
81
+ export function registerLinters(meta) {
88
82
  meta.registerLinter('nameOfObjective', {
89
83
  configValidator: configValidator.nameConvention,
90
84
  linter: nameConvention('value'),
@@ -107,9 +101,8 @@ function registerLinters(meta) {
107
101
  });
108
102
  meta.registerLinter('undeclaredSymbol', {
109
103
  configValidator: configValidator.symbolLinterConfig,
110
- linter: undeclaredSymbol_1.undeclaredSymbol,
111
- nodePredicate: n => n.symbol && !symbol_1.NbtdocCategories.includes(n.symbol.category),
104
+ linter: undeclaredSymbol,
105
+ nodePredicate: n => n.symbol && !McdocCategories.includes(n.symbol.category),
112
106
  });
113
107
  }
114
- exports.registerLinters = registerLinters;
115
108
  //# sourceMappingURL=builtin.js.map
@@ -1,3 +1,3 @@
1
- export * as linter from './builtin';
2
- export * from './Linter';
1
+ export * as linter from './builtin.js';
2
+ export * from './Linter.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1,28 +1,3 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
22
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
23
- };
24
- Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.linter = void 0;
26
- exports.linter = __importStar(require("./builtin"));
27
- __exportStar(require("./Linter"), exports);
1
+ export * as linter from './builtin.js';
2
+ export * from './Linter.js';
28
3
  //# sourceMappingURL=index.js.map
@@ -1,17 +1,7 @@
1
- import type { AstNode } from '../node';
2
- import { Range } from '../source';
1
+ import type { DeepReadonly } from '../index.js';
2
+ import type { AstNode } from '../node/index.js';
3
3
  declare type Callback<R> = (this: void, node: AstNode, parents: AstNode[]) => R;
4
- export declare function traversePreOrder(node: AstNode, shouldContinue: Callback<unknown>, shouldCallFn: Callback<unknown>, fn: Callback<unknown>): void;
5
- interface NodeResult {
6
- node: AstNode | undefined;
7
- /**
8
- * Ordered from the closest parent to the root node.
9
- */
10
- parents: AstNode[];
11
- }
12
- /**
13
- * @returns The shallowest node that is fully contained within `range`.
14
- */
15
- export declare function findNode(node: AstNode, range: Range): NodeResult;
4
+ export declare function traversePreOrder<CN extends AstNode>(node: DeepReadonly<AstNode>, shouldContinue: Callback<unknown>, shouldCallFn: (this: void, node: AstNode, parents: AstNode[]) => node is CN, fn: (this: void, node: CN, parents: AstNode[]) => void): void;
5
+ export declare function traversePreOrder(node: DeepReadonly<AstNode>, shouldContinue: Callback<unknown>, shouldCallFn: Callback<unknown>, fn: Callback<void>): void;
16
6
  export {};
17
7
  //# sourceMappingURL=util.d.ts.map
@@ -1,11 +1,6 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.findNode = exports.traversePreOrder = void 0;
4
- const source_1 = require("../source");
5
- function traversePreOrder(node, shouldContinue, shouldCallFn, fn) {
1
+ export function traversePreOrder(node, shouldContinue, shouldCallFn, fn) {
6
2
  traversePreOrderImpl(node, shouldContinue, shouldCallFn, fn, []);
7
3
  }
8
- exports.traversePreOrder = traversePreOrder;
9
4
  function traversePreOrderImpl(node, shouldContinue, shouldCallFn, fn, parents) {
10
5
  if (shouldCallFn(node, parents)) {
11
6
  fn(node, parents);
@@ -19,14 +14,4 @@ function traversePreOrderImpl(node, shouldContinue, shouldCallFn, fn, parents) {
19
14
  parents.shift();
20
15
  }
21
16
  }
22
- /**
23
- * @returns The shallowest node that is fully contained within `range`.
24
- */
25
- function findNode(node, range) {
26
- let ans = { node: undefined, parents: [] };
27
- // TODO: Binary search here.
28
- traversePreOrder(node, (node) => ans.node === undefined && source_1.Range.intersects(node.range, range), (node) => source_1.Range.containsRange(range, node.range), (node, parents) => ans = { node, parents: [...parents] });
29
- return ans;
30
- }
31
- exports.findNode = findNode;
32
17
  //# sourceMappingURL=util.js.map
@@ -1,6 +1,7 @@
1
- import { SymbolTable } from '../symbol';
2
- import type { RootUriString } from './fileUtil';
3
- import type { Project } from './Project';
1
+ import type { TextDocument } from 'vscode-languageserver-textdocument';
2
+ import { SymbolTable } from '../symbol/index.js';
3
+ import type { RootUriString } from './fileUtil.js';
4
+ import type { Project } from './Project.js';
4
5
  /**
5
6
  * The format version of the cache. Should be increased when any changes that
6
7
  * could invalidate the cache are introduced to the Spyglass codebase.
@@ -35,19 +36,20 @@ export declare class CacheService {
35
36
  * @param cacheRoot File path to the directory where cache files by Spyglass should be stored.
36
37
  * @param project
37
38
  */
38
- constructor(cacheRoot: string, project: Project);
39
+ constructor(cacheRoot: RootUriString, project: Project);
39
40
  /**
40
41
  * @throws
41
42
  *
42
- * @returns `${cacheRoot}/symbols/${sha1(projectRoot)}.json`
43
+ * @returns `${cacheRoot}symbols/${sha1(projectRoot)}.json`
43
44
  */
44
- private getCacheFilePath;
45
+ private getCacheFileUri;
45
46
  load(): Promise<LoadResult>;
46
47
  validate(): Promise<ValidateResult>;
47
48
  /**
48
49
  * @returns If the cache file was saved successfully.
49
50
  */
50
51
  save(): Promise<boolean>;
52
+ hasFileChangedSinceCache(doc: TextDocument): Promise<boolean>;
51
53
  reset(): void;
52
54
  }
53
55
  export {};
@@ -1,30 +1,11 @@
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_hasValidatedFiles, _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");
1
+ import { Uri } from '../common/index.js';
2
+ import { SymbolTable } from '../symbol/index.js';
3
+ import { fileUtil } from './fileUtil.js';
23
4
  /**
24
5
  * The format version of the cache. Should be increased when any changes that
25
6
  * could invalidate the cache are introduced to the Spyglass codebase.
26
7
  */
27
- exports.LatestCacheVersion = 1;
8
+ export const LatestCacheVersion = 1;
28
9
  var Checksums;
29
10
  (function (Checksums) {
30
11
  function create() {
@@ -36,7 +17,11 @@ var Checksums;
36
17
  }
37
18
  Checksums.create = create;
38
19
  })(Checksums || (Checksums = {}));
39
- class CacheService {
20
+ export class CacheService {
21
+ cacheRoot;
22
+ project;
23
+ checksums = Checksums.create();
24
+ #hasValidatedFiles = false;
40
25
  /**
41
26
  * @param cacheRoot File path to the directory where cache files by Spyglass should be stored.
42
27
  * @param project
@@ -44,30 +29,22 @@ class CacheService {
44
29
  constructor(cacheRoot, project) {
45
30
  this.cacheRoot = cacheRoot;
46
31
  this.project = project;
47
- this.checksums = Checksums.create();
48
- _CacheService_hasValidatedFiles.set(this, false
49
- /**
50
- * @param cacheRoot File path to the directory where cache files by Spyglass should be stored.
51
- * @param project
52
- */
53
- );
54
- _CacheService_cacheFilePath.set(this, void 0);
55
- this.project.on('documentUpdated', ({ doc }) => {
56
- if (!__classPrivateFieldGet(this, _CacheService_hasValidatedFiles, "f")) {
32
+ this.project.on('documentUpdated', async ({ doc }) => {
33
+ if (!this.#hasValidatedFiles) {
57
34
  return;
58
35
  }
59
36
  try {
60
37
  // TODO: Don't update this for every single change.
61
- this.checksums.files[doc.uri] = (0, common_1.getSha1)(doc.getText());
38
+ this.checksums.files[doc.uri] = await this.project.externals.crypto.getSha1(doc.getText());
62
39
  }
63
40
  catch (e) {
64
- if (!(0, common_1.isErrorCode)(e, 'EISDIR')) {
41
+ if (!this.project.externals.error.isKind(e, 'EISDIR')) {
65
42
  this.project.logger.error(`[CacheService#hash-file] ${doc.uri}`);
66
43
  }
67
44
  }
68
45
  });
69
46
  this.project.on('rootsUpdated', async ({ roots }) => {
70
- if (!__classPrivateFieldGet(this, _CacheService_hasValidatedFiles, "f")) {
47
+ if (!this.#hasValidatedFiles) {
71
48
  return;
72
49
  }
73
50
  for (const root of roots) {
@@ -75,7 +52,7 @@ class CacheService {
75
52
  this.checksums.roots[root] = await this.project.fs.hash(root);
76
53
  }
77
54
  catch (e) {
78
- if (!(0, common_1.isErrorCode)(e, 'EISDIR')) {
55
+ if (!this.project.externals.error.isKind(e, 'EISDIR')) {
79
56
  this.project.logger.error(`[CacheService#hash-root] ${root}`);
80
57
  }
81
58
  }
@@ -87,34 +64,35 @@ class CacheService {
87
64
  }
88
65
  });
89
66
  }
67
+ #cacheFilePath;
90
68
  /**
91
69
  * @throws
92
70
  *
93
- * @returns `${cacheRoot}/symbols/${sha1(projectRoot)}.json`
71
+ * @returns `${cacheRoot}symbols/${sha1(projectRoot)}.json`
94
72
  */
95
- getCacheFilePath() {
96
- 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");
73
+ async getCacheFileUri() {
74
+ return this.#cacheFilePath ??= new Uri(`symbols/${await this.project.externals.crypto.getSha1(this.project.projectRoot)}.json.gz`, this.cacheRoot).toString();
97
75
  }
98
76
  async load() {
99
77
  const __profiler = this.project.profilers.get('cache#load');
100
78
  const ans = { symbols: {} };
101
79
  let filePath;
102
80
  try {
103
- filePath = this.getCacheFilePath();
81
+ filePath = await this.getCacheFileUri();
104
82
  this.project.logger.info(`[CacheService#load] symbolCachePath = “${filePath}”`);
105
- const cache = await fileUtil_1.fileUtil.readGzippedJson(filePath);
83
+ const cache = await fileUtil.readGzippedJson(this.project.externals, filePath);
106
84
  __profiler.task('Read File');
107
- if (cache.version === exports.LatestCacheVersion) {
85
+ if (cache.version === LatestCacheVersion) {
108
86
  this.checksums = cache.checksums;
109
- ans.symbols = symbol_1.SymbolTable.link(cache.symbols);
87
+ ans.symbols = SymbolTable.link(cache.symbols);
110
88
  __profiler.task('Link Symbols');
111
89
  }
112
90
  else {
113
- this.project.logger.info(`[CacheService#load] Unsupported cache format ${cache.version}; expected ${exports.LatestCacheVersion}`);
91
+ this.project.logger.info(`[CacheService#load] Unsupported cache format ${cache.version}; expected ${LatestCacheVersion}`);
114
92
  }
115
93
  }
116
94
  catch (e) {
117
- if (!(0, common_1.isEnoent)(e)) {
95
+ if (!this.project.externals.error.isKind(e, 'ENOENT')) {
118
96
  this.project.logger.error('[CacheService#load] ', e);
119
97
  }
120
98
  }
@@ -137,7 +115,7 @@ class CacheService {
137
115
  }
138
116
  }
139
117
  catch (e) {
140
- if (!(0, common_1.isErrorCode)(e, 'EISDIR')) {
118
+ if (!this.project.externals.error.isKind(e, 'EISDIR')) {
141
119
  this.project.logger.error(`[CacheService#hash-file] ${uri}`);
142
120
  }
143
121
  // Failed calculating hash. Assume the root has changed.
@@ -158,7 +136,7 @@ class CacheService {
158
136
  }
159
137
  }
160
138
  catch (e) {
161
- if ((0, common_1.isEnoent)(e) || (0, common_1.isErrorCode)(e, 'EISDIR')) {
139
+ if (this.project.externals.error.isKind(e, 'ENOENT') || this.project.externals.error.isKind(e, 'EISDIR')) {
162
140
  ans.removedFiles.push(uri);
163
141
  }
164
142
  else {
@@ -173,7 +151,7 @@ class CacheService {
173
151
  ans.addedFiles.push(uri);
174
152
  }
175
153
  }
176
- __classPrivateFieldSet(this, _CacheService_hasValidatedFiles, true, "f");
154
+ this.#hasValidatedFiles = true;
177
155
  return ans;
178
156
  }
179
157
  /**
@@ -183,15 +161,15 @@ class CacheService {
183
161
  const __profiler = this.project.profilers.get('cache#save');
184
162
  let filePath;
185
163
  try {
186
- filePath = this.getCacheFilePath();
164
+ filePath = await this.getCacheFileUri();
187
165
  const cache = {
188
166
  checksums: this.checksums,
189
167
  projectRoot: this.project.projectRoot,
190
- symbols: symbol_1.SymbolTable.unlink(this.project.symbols.global),
191
- version: exports.LatestCacheVersion,
168
+ symbols: SymbolTable.unlink(this.project.symbols.global),
169
+ version: LatestCacheVersion,
192
170
  };
193
171
  __profiler.task('Unlink Symbols');
194
- await fileUtil_1.fileUtil.writeGzippedJson(filePath, cache);
172
+ await fileUtil.writeGzippedJson(this.project.externals, filePath, cache);
195
173
  __profiler.task('Write File').finalize();
196
174
  return true;
197
175
  }
@@ -200,10 +178,11 @@ class CacheService {
200
178
  }
201
179
  return false;
202
180
  }
181
+ async hasFileChangedSinceCache(doc) {
182
+ return this.checksums.files[doc.uri] !== await this.project.externals.crypto.getSha1(doc.getText());
183
+ }
203
184
  reset() {
204
185
  this.checksums = Checksums.create();
205
186
  }
206
187
  }
207
- exports.CacheService = CacheService;
208
- _CacheService_hasValidatedFiles = new WeakMap(), _CacheService_cacheFilePath = new WeakMap();
209
188
  //# sourceMappingURL=CacheService.js.map
@@ -1,8 +1,7 @@
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';
1
+ import type { ExternalEventEmitter } from '../common/index.js';
2
+ import { Arrayable } from '../common/index.js';
3
+ import { ErrorSeverity } from '../source/index.js';
4
+ import type { Project } from './Project.js';
6
5
  export interface Config {
7
6
  /**
8
7
  * Environment settings. Unlike other configs, all involved root folders must have the same `env` settings. It is undocumented
@@ -24,15 +23,17 @@ export interface Config {
24
23
  }
25
24
  export interface EnvConfig {
26
25
  /**
27
- * Where to download data like `mcmeta` or `mc-nbtdoc` from (case-insensitive).
26
+ * Where to download data like `mcmeta` or `vanilla-mcdoc` from (case-insensitive).
28
27
  *
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`.
28
+ * * `GitHub`: Recommended, unless you have trouble connecting to `raw.githubusercontent.com`.
29
+ * * `fastly`
30
+ * * `jsDelivr`
31
+ * * A custom URL, with placeholder variables: `${user}`, `${repo}`, `${tag}`, and `${path}`.
31
32
  */
32
33
  dataSource: string;
33
34
  /**
34
35
  * 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
+ * to a data pack folder or data pack archive (e.g. `.zip` or `.tar.gz`), or a special string like `@vanilla-mcdoc`.
36
37
  */
37
38
  dependencies: string[];
38
39
  feature: {
@@ -198,21 +199,21 @@ declare type ErrorEvent = {
198
199
  error: unknown;
199
200
  uri: string;
200
201
  };
201
- export interface ConfigService {
202
+ export declare class ConfigService implements ExternalEventEmitter {
203
+ #private;
204
+ private readonly project;
205
+ private readonly defaultConfig;
206
+ static readonly ConfigFileNames: readonly ["spyglass.json", ".spyglassrc.json"];
207
+ constructor(project: Project, defaultConfig?: Config);
202
208
  on(event: 'changed', callbackFn: (data: ConfigEvent) => void): this;
203
209
  on(event: 'error', callbackFn: (data: ErrorEvent) => void): this;
204
210
  once(event: 'changed', callbackFn: (data: ConfigEvent) => void): this;
205
211
  once(event: 'error', callbackFn: (data: ErrorEvent) => void): this;
206
212
  emit(event: 'changed', data: ConfigEvent): boolean;
207
213
  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
214
  load(): Promise<Config>;
214
215
  private static isConfigFile;
215
- private merge;
216
+ static merge(base: Config, ...overrides: any[]): Config;
216
217
  }
217
218
  export {};
218
219
  //# sourceMappingURL=Config.d.ts.map