@spyglassmc/java-edition 0.3.1 → 0.3.3

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 (44) hide show
  1. package/lib/binder/index.d.ts +1 -1
  2. package/lib/binder/index.js +110 -19
  3. package/lib/common/index.js +10 -7
  4. package/lib/dependency/common.d.ts +1 -1
  5. package/lib/dependency/index.js +11 -9
  6. package/lib/dependency/mcmeta.d.ts +4 -4
  7. package/lib/dependency/mcmeta.js +32 -15
  8. package/lib/index.js +18 -6
  9. package/lib/json/checker/data/advancement.js +24 -13
  10. package/lib/json/checker/data/biome.js +3 -3
  11. package/lib/json/checker/data/common.js +29 -30
  12. package/lib/json/checker/data/dimension.js +7 -18
  13. package/lib/json/checker/data/feature.js +45 -27
  14. package/lib/json/checker/data/index.d.ts +1 -1
  15. package/lib/json/checker/data/index.js +3 -3
  16. package/lib/json/checker/data/loot_table.js +40 -21
  17. package/lib/json/checker/data/recipe.js +1 -1
  18. package/lib/json/checker/data/structure.js +24 -14
  19. package/lib/json/checker/data/tag.js +2 -2
  20. package/lib/json/checker/data/text_component.js +24 -8
  21. package/lib/json/checker/index.d.ts +10 -3
  22. package/lib/json/checker/index.js +231 -3
  23. package/lib/json/checker/util/advancement.js +3 -2
  24. package/lib/json/checker/util/block_states.d.ts +2 -2
  25. package/lib/json/checker/util/block_states.js +7 -5
  26. package/lib/json/checker/util/color.js +8 -2
  27. package/lib/json/checker/util/nbt.d.ts +1 -1
  28. package/lib/json/checker/util/nbt.js +4 -2
  29. package/lib/json/checker/util/recipe.js +7 -6
  30. package/lib/json/checker/util/version.d.ts +1 -1
  31. package/lib/json/checker/util/version.js +2 -2
  32. package/lib/mcfunction/checker/index.js +14 -11
  33. package/lib/mcfunction/colorizer/index.js +2 -4
  34. package/lib/mcfunction/common/index.js +46 -15
  35. package/lib/mcfunction/completer/argument.js +53 -24
  36. package/lib/mcfunction/index.js +13 -1
  37. package/lib/mcfunction/inlayHintProvider.js +8 -3
  38. package/lib/mcfunction/node/argument.d.ts +6 -6
  39. package/lib/mcfunction/node/argument.js +57 -17
  40. package/lib/mcfunction/parser/argument.js +158 -63
  41. package/lib/mcfunction/signatureHelpProvider.js +9 -4
  42. package/lib/mcfunction/tree/argument.d.ts +1 -1
  43. package/lib/mcfunction/tree/patch.js +132 -126
  44. package/package.json +7 -7
@@ -7,7 +7,7 @@ export declare const Categories: Map<string, {
7
7
  }>;
8
8
  export declare function getRels(uri: string, rootUris: readonly RootUriString[]): Generator<string, undefined, unknown>;
9
9
  export declare function dissectUri(uri: string, ctx: ContextBase): {
10
- category: "function" | "advancement" | "dimension" | "dimension_type" | "item_modifier" | "loot_table" | "predicate" | "recipe" | "structure" | "worldgen/biome" | "worldgen/configured_carver" | "worldgen/configured_feature" | "worldgen/configured_structure_feature" | "worldgen/configured_surface_builder" | "worldgen/noise" | "worldgen/noise_settings" | "worldgen/placed_feature" | "worldgen/processor_list" | "worldgen/template_pool" | "tag/function" | "tag/activity" | "tag/attribute" | "tag/block" | "tag/block_entity_type" | "tag/block_predicate_type" | "tag/chunk_status" | "tag/custom_stat" | "tag/enchantment" | "tag/entity_type" | "tag/float_provider_type" | "tag/fluid" | "tag/game_event" | "tag/height_provider_type" | "tag/int_provider_type" | "tag/item" | "tag/loot_condition_type" | "tag/loot_function_type" | "tag/loot_nbt_provider_type" | "tag/loot_number_provider_type" | "tag/loot_pool_entry_type" | "tag/loot_score_provider_type" | "tag/memory_module_type" | "tag/menu" | "tag/mob_effect" | "tag/motive" | "tag/particle_type" | "tag/point_of_interest_type" | "tag/pos_rule_test" | "tag/position_source_type" | "tag/potion" | "tag/recipe_serializer" | "tag/recipe_type" | "tag/rule_test" | "tag/schedule" | "tag/sensor_type" | "tag/sound_event" | "tag/stat_type" | "tag/villager_profession" | "tag/villager_type" | "tag/worldgen/biome_source" | "tag/worldgen/block_placer_type" | "tag/worldgen/block_state_provider_type" | "tag/worldgen/carver" | "tag/worldgen/chunk_generator" | "tag/worldgen/decorator" | "tag/worldgen/feature" | "tag/worldgen/feature_size_type" | "tag/worldgen/foliage_placer_type" | "tag/worldgen/material_condition" | "tag/worldgen/material_rule" | "tag/worldgen/placement_modifier_type" | "tag/worldgen/structure_feature" | "tag/worldgen/structure_piece" | "tag/worldgen/structure_pool_element" | "tag/worldgen/structure_processor" | "tag/worldgen/surface_builder" | "tag/worldgen/tree_decorator_type" | "tag/worldgen/trunk_placer_type" | "tag/worldgen/biome" | "tag/worldgen/configured_carver" | "tag/worldgen/configured_feature" | "tag/worldgen/configured_structure_feature" | "tag/worldgen/configured_surface_builder" | "tag/worldgen/noise" | "tag/worldgen/noise_settings" | "tag/worldgen/placed_feature" | "tag/worldgen/processor_list" | "tag/worldgen/template_pool";
10
+ category: "function" | "advancement" | "dimension" | "dimension_type" | "item_modifier" | "loot_table" | "predicate" | "recipe" | "structure" | "worldgen/biome" | "worldgen/configured_carver" | "worldgen/configured_feature" | "worldgen/configured_structure_feature" | "worldgen/configured_surface_builder" | "worldgen/density_function" | "worldgen/noise" | "worldgen/noise_settings" | "worldgen/placed_feature" | "worldgen/processor_list" | "worldgen/template_pool" | "tag/function" | "tag/activity" | "tag/attribute" | "tag/block" | "tag/block_entity_type" | "tag/block_predicate_type" | "tag/chunk_status" | "tag/custom_stat" | "tag/enchantment" | "tag/entity_type" | "tag/float_provider_type" | "tag/fluid" | "tag/game_event" | "tag/height_provider_type" | "tag/int_provider_type" | "tag/item" | "tag/loot_condition_type" | "tag/loot_function_type" | "tag/loot_nbt_provider_type" | "tag/loot_number_provider_type" | "tag/loot_pool_entry_type" | "tag/loot_score_provider_type" | "tag/memory_module_type" | "tag/menu" | "tag/mob_effect" | "tag/motive" | "tag/particle_type" | "tag/point_of_interest_type" | "tag/pos_rule_test" | "tag/position_source_type" | "tag/potion" | "tag/recipe_serializer" | "tag/recipe_type" | "tag/rule_test" | "tag/schedule" | "tag/sensor_type" | "tag/sound_event" | "tag/stat_type" | "tag/villager_profession" | "tag/villager_type" | "tag/worldgen/biome_source" | "tag/worldgen/block_placer_type" | "tag/worldgen/block_state_provider_type" | "tag/worldgen/carver" | "tag/worldgen/chunk_generator" | "tag/worldgen/decorator" | "tag/worldgen/feature" | "tag/worldgen/feature_size_type" | "tag/worldgen/foliage_placer_type" | "tag/worldgen/material_condition" | "tag/worldgen/material_rule" | "tag/worldgen/placement_modifier_type" | "tag/worldgen/structure_feature" | "tag/worldgen/structure_piece" | "tag/worldgen/structure_pool_element" | "tag/worldgen/structure_processor" | "tag/worldgen/surface_builder" | "tag/worldgen/tree_decorator_type" | "tag/worldgen/trunk_placer_type" | "tag/worldgen/biome" | "tag/worldgen/configured_carver" | "tag/worldgen/configured_feature" | "tag/worldgen/configured_structure_feature" | "tag/worldgen/configured_surface_builder" | "tag/worldgen/density_function" | "tag/worldgen/noise" | "tag/worldgen/noise_settings" | "tag/worldgen/placed_feature" | "tag/worldgen/processor_list" | "tag/worldgen/template_pool";
11
11
  namespace: string;
12
12
  identifier: string;
13
13
  } | undefined;
@@ -1,16 +1,27 @@
1
- import { fileUtil, RegistryCategories } from '@spyglassmc/core';
1
+ import { fileUtil, TaggableResourceLocationCategories } from '@spyglassmc/core';
2
2
  import { ReleaseVersion } from '../dependency/index.js';
3
3
  export const Categories = (() => {
4
4
  const NonTaggableRegistries = new Set([
5
- 'block', 'fluid', 'game_event', 'item',
6
- 'worldgen/block_placer_type', 'worldgen/surface_builder', // They are removed at some point.
5
+ 'block',
6
+ 'fluid',
7
+ 'function',
8
+ 'game_event',
9
+ 'item',
10
+ 'worldgen/block_placer_type',
11
+ 'worldgen/surface_builder', // They are removed at some point.
7
12
  ]);
8
13
  const ans = new Map([
9
14
  ['advancements', { category: 'advancement', extname: '.json' }],
10
15
  ['dimension', { category: 'dimension', extname: '.json', since: '1.16' }],
11
- ['dimension_type', { category: 'dimension_type', extname: '.json', since: '1.16' }],
16
+ [
17
+ 'dimension_type',
18
+ { category: 'dimension_type', extname: '.json', since: '1.16' },
19
+ ],
12
20
  ['functions', { category: 'function', extname: '.mcfunction' }],
13
- ['item_modifiers', { category: 'item_modifier', extname: '.json', since: '1.17' }],
21
+ [
22
+ 'item_modifiers',
23
+ { category: 'item_modifier', extname: '.json', since: '1.17' },
24
+ ],
14
25
  ['loot_tables', { category: 'loot_table', extname: '.json' }],
15
26
  ['predicates', { category: 'predicate', extname: '.json' }],
16
27
  ['recipes', { category: 'recipe', extname: '.json' }],
@@ -18,24 +29,102 @@ export const Categories = (() => {
18
29
  ['tags/entity_types', { category: 'tag/entity_type', extname: '.json' }],
19
30
  ['tags/fluids', { category: 'tag/fluid', extname: '.json' }],
20
31
  ['tags/functions', { category: 'tag/function', extname: '.json' }],
21
- ['tags/game_events', { category: 'tag/game_event', extname: '.json', since: '1.17' }],
32
+ [
33
+ 'tags/game_events',
34
+ { category: 'tag/game_event', extname: '.json', since: '1.17' },
35
+ ],
22
36
  ['tags/items', { category: 'tag/item', extname: '.json' }],
23
- ['worldgen/biome', { category: 'worldgen/biome', extname: '.json', since: '1.16' }],
24
- ['worldgen/configured_carver', { category: 'worldgen/configured_carver', extname: '.json', since: '1.16' }],
25
- ['worldgen/configured_feature', { category: 'worldgen/configured_feature', extname: '.json', since: '1.16' }],
26
- ['worldgen/configured_structure_feature', { category: 'worldgen/configured_structure_feature', extname: '.json', since: '1.16' }],
27
- ['worldgen/configured_surface_builder', { category: 'worldgen/configured_surface_builder', extname: '.json', since: '1.16', until: '1.17' }],
28
- ['worldgen/noise', { category: 'worldgen/noise', extname: '.json', since: '1.18' }],
29
- ['worldgen/noise_settings', { category: 'worldgen/noise_settings', extname: '.json', since: '1.16' }],
30
- ['worldgen/placed_feature', { category: 'worldgen/placed_feature', extname: '.json', since: '1.18' }],
31
- ['worldgen/processor_list', { category: 'worldgen/processor_list', extname: '.json', since: '1.16' }],
32
- ['worldgen/template_pool', { category: 'worldgen/template_pool', extname: '.json', since: '1.16' }],
37
+ [
38
+ 'worldgen/biome',
39
+ { category: 'worldgen/biome', extname: '.json', since: '1.16' },
40
+ ],
41
+ [
42
+ 'worldgen/configured_carver',
43
+ {
44
+ category: 'worldgen/configured_carver',
45
+ extname: '.json',
46
+ since: '1.16',
47
+ },
48
+ ],
49
+ [
50
+ 'worldgen/configured_feature',
51
+ {
52
+ category: 'worldgen/configured_feature',
53
+ extname: '.json',
54
+ since: '1.16',
55
+ },
56
+ ],
57
+ [
58
+ 'worldgen/configured_structure_feature',
59
+ {
60
+ category: 'worldgen/configured_structure_feature',
61
+ extname: '.json',
62
+ since: '1.16',
63
+ },
64
+ ],
65
+ [
66
+ 'worldgen/configured_surface_builder',
67
+ {
68
+ category: 'worldgen/configured_surface_builder',
69
+ extname: '.json',
70
+ since: '1.16',
71
+ until: '1.17',
72
+ },
73
+ ],
74
+ [
75
+ 'worldgen/density_function',
76
+ {
77
+ category: 'worldgen/density_function',
78
+ extname: '.json',
79
+ since: '1.18',
80
+ },
81
+ ],
82
+ [
83
+ 'worldgen/noise',
84
+ { category: 'worldgen/noise', extname: '.json', since: '1.18' },
85
+ ],
86
+ [
87
+ 'worldgen/noise_settings',
88
+ {
89
+ category: 'worldgen/noise_settings',
90
+ extname: '.json',
91
+ since: '1.16',
92
+ },
93
+ ],
94
+ [
95
+ 'worldgen/placed_feature',
96
+ {
97
+ category: 'worldgen/placed_feature',
98
+ extname: '.json',
99
+ since: '1.18',
100
+ },
101
+ ],
102
+ [
103
+ 'worldgen/processor_list',
104
+ {
105
+ category: 'worldgen/processor_list',
106
+ extname: '.json',
107
+ since: '1.16',
108
+ },
109
+ ],
110
+ [
111
+ 'worldgen/template_pool',
112
+ {
113
+ category: 'worldgen/template_pool',
114
+ extname: '.json',
115
+ since: '1.16',
116
+ },
117
+ ],
33
118
  ]);
34
- for (const registry of RegistryCategories) {
119
+ for (const registry of TaggableResourceLocationCategories) {
35
120
  if (NonTaggableRegistries.has(registry)) {
36
121
  continue;
37
122
  }
38
- ans.set(`tags/${registry}`, { category: `tag/${registry}`, extname: '.json', since: '1.18' });
123
+ ans.set(`tags/${registry}`, {
124
+ category: `tag/${registry}`,
125
+ extname: '.json',
126
+ since: '1.18',
127
+ });
39
128
  }
40
129
  return ans;
41
130
  })();
@@ -61,7 +150,9 @@ export function dissectUri(uri, ctx) {
61
150
  if (!def || def.extname !== match[4]) {
62
151
  continue;
63
152
  }
64
- if (!matchVersion(ctx.project['loadedVersion'], def.since, def.until)) {
153
+ const loadedVersion = ctx.project['loadedVersion'];
154
+ if (!loadedVersion || // FIXME: check why this can be undefined sometimes
155
+ !matchVersion(loadedVersion, def.since, def.until)) {
65
156
  continue;
66
157
  }
67
158
  return {
@@ -4,26 +4,29 @@ import * as json from '@spyglassmc/json';
4
4
  * @returns An array of URIs corresponding to the specified resource.
5
5
  */
6
6
  export function getUris(category, id, ctx) {
7
- return ctx.symbols
7
+ return (ctx.symbols
8
8
  .query(ctx.doc, category, core.ResourceLocation.lengthen(id))
9
- .symbol?.definition?.map(v => v.uri) ?? [];
9
+ .symbol?.definition?.map((v) => v.uri) ?? []);
10
10
  }
11
11
  export function getTagValues(category, id, ctx) {
12
12
  const resolveValueNode = (node) => json.JsonStringNode.is(node)
13
13
  ? node.value
14
- : node.children.find(n => n.key?.value === 'id').value.value;
14
+ : node.children.find((n) => n.key?.value === 'id')
15
+ .value.value;
15
16
  const set = getUris(category, id, ctx).reduce((ans, uri) => {
16
17
  // const result = ctx.getDocAndNode(uri)
17
18
  const result = undefined; // FIXME: Use global symbol table to get the result
18
- if (!result || result.node.parserErrors.length || result.node.checkerErrors?.length) {
19
+ if (!result ||
20
+ result.node.parserErrors.length ||
21
+ result.node.checkerErrors?.length) {
19
22
  return ans;
20
23
  }
21
24
  // No errors in the node. We can assume it is a semantically correct tag file.
22
25
  const rootNode = result.node.children[0];
23
- const replaceNode = rootNode.children.find(n => n.key?.value === 'replace')?.value;
24
- const valuesNode = rootNode.children.find(n => n.key?.value === 'values')?.value;
26
+ const replaceNode = rootNode.children.find((n) => n.key?.value === 'replace')?.value;
27
+ const valuesNode = rootNode.children.find((n) => n.key?.value === 'values')?.value;
25
28
  const replace = replaceNode?.value;
26
- const values = valuesNode.children.map(n => core.ResourceLocation.lengthen(resolveValueNode(n.value)));
29
+ const values = valuesNode.children.map((n) => core.ResourceLocation.lengthen(resolveValueNode(n.value)));
27
30
  if (replace) {
28
31
  ans = new Set();
29
32
  }
@@ -1,4 +1,4 @@
1
- export declare type ReleaseVersion = `1.${number}`;
1
+ export type ReleaseVersion = `1.${number}`;
2
2
  export declare namespace ReleaseVersion {
3
3
  /**
4
4
  * @returns
@@ -13,7 +13,7 @@ export async function getVersions(externals, downloader) {
13
13
  return downloader.download({
14
14
  id: 'mc-je/versions.json.gz',
15
15
  uri: 'https://raw.githubusercontent.com/misode/mcmeta/summary/versions/data.json.gz',
16
- transformer: buffer => core.parseGzippedJson(externals, buffer),
16
+ transformer: (buffer) => core.parseGzippedJson(externals, buffer),
17
17
  cache: getCacheOptionsBasedOnGitHubCommitSha('misode', 'mcmeta', 'refs/heads/summary'),
18
18
  ttl: DownloaderTtl,
19
19
  });
@@ -27,7 +27,7 @@ export async function getVersions(externals, downloader) {
27
27
  export async function getMcmetaSummary(externals, downloader, logger, version, isLatest, source, overridePaths = {}) {
28
28
  const ref = getGitRef({
29
29
  defaultBranch: 'summary',
30
- getTag: v => `${v}-summary`,
30
+ getTag: (v) => `${v}-summary`,
31
31
  isLatest,
32
32
  version,
33
33
  });
@@ -36,7 +36,7 @@ export async function getMcmetaSummary(externals, downloader, logger, version, i
36
36
  async function handleOverride(currentValue, overrideConfig) {
37
37
  if (overrideConfig) {
38
38
  try {
39
- const override = await core.fileUtil.readJson(externals, overrideConfig.path);
39
+ const override = (await core.fileUtil.readJson(externals, overrideConfig.path));
40
40
  if (overrideConfig.replace) {
41
41
  return override;
42
42
  }
@@ -55,7 +55,7 @@ export async function getMcmetaSummary(externals, downloader, logger, version, i
55
55
  const data = await downloader.download({
56
56
  id: `mc-je/${version}/${type}.json.gz`,
57
57
  uri: uris[type],
58
- transformer: buffer => core.parseGzippedJson(externals, buffer),
58
+ transformer: (buffer) => core.parseGzippedJson(externals, buffer),
59
59
  cache: getCacheOptionsBasedOnGitHubCommitSha('misode', 'mcmeta', ref),
60
60
  ttl: DownloaderTtl,
61
61
  }, out);
@@ -70,8 +70,10 @@ export async function getMcmetaSummary(externals, downloader, logger, version, i
70
70
  ];
71
71
  return { blocks, commands, fluids, registries, checksum };
72
72
  }
73
- function getGitRef({ defaultBranch, getTag, isLatest, version }) {
74
- return isLatest ? `refs/heads/${defaultBranch}` : `refs/tags/${getTag(version)}`;
73
+ function getGitRef({ defaultBranch, getTag, isLatest, version, }) {
74
+ return isLatest
75
+ ? `refs/heads/${defaultBranch}`
76
+ : `refs/tags/${getTag(version)}`;
75
77
  }
76
78
  const GitHubApiDownloadOptions = {
77
79
  headers: {
@@ -109,13 +111,13 @@ function getCacheOptionsBasedOnGitHubCommitSha(owner, repo, ref) {
109
111
  *
110
112
  * @returns The URI to the `.tar.gz` file.
111
113
  */
112
- async function downloadGitHubRepo({ defaultBranch, downloader, getTag, repo, isLatest, owner, version }) {
114
+ async function downloadGitHubRepo({ defaultBranch, downloader, getTag, repo, isLatest, owner, version, }) {
113
115
  const ref = getGitRef({ defaultBranch, getTag, isLatest, version });
114
116
  const out = {};
115
117
  await downloader.download({
116
118
  id: `mc-je/${version}/${repo}.tar.gz`,
117
119
  uri: `https://api.github.com/repos/${owner}/${repo}/tarball/${ref}`,
118
- transformer: b => b,
120
+ transformer: (b) => b,
119
121
  cache: getCacheOptionsBasedOnGitHubCommitSha(owner, repo, ref),
120
122
  options: GitHubApiDownloadOptions,
121
123
  ttl: DownloaderTtl,
@@ -138,7 +140,7 @@ export async function getVanillaMcdoc(downloader) {
138
140
  await downloader.download({
139
141
  id: 'mc-je/vanilla-mcdoc.tar.gz',
140
142
  uri: `https://api.github.com/repos/${owner}/${repo}/tarball/${ref}`,
141
- transformer: b => b,
143
+ transformer: (b) => b,
142
144
  cache: getCacheOptionsBasedOnGitHubCommitSha(owner, repo, ref),
143
145
  options: GitHubApiDownloadOptions,
144
146
  ttl: DownloaderTtl,
@@ -3,7 +3,7 @@ import type { PackMcmeta, VersionInfo } from './common.js';
3
3
  /**
4
4
  * @param inputVersion {@link core.Config.env.gameVersion}
5
5
  */
6
- export declare function resolveConfiguredVersion(inputVersion: string, { packMcmeta, versions }: {
6
+ export declare function resolveConfiguredVersion(inputVersion: string, { packMcmeta, versions, }: {
7
7
  packMcmeta: PackMcmeta | undefined;
8
8
  versions: McmetaVersions;
9
9
  }): VersionInfo;
@@ -28,7 +28,7 @@ export interface McmetaVersion {
28
28
  release_time: string;
29
29
  sha1: string;
30
30
  }
31
- export declare type McmetaVersions = McmetaVersion[];
31
+ export type McmetaVersions = McmetaVersion[];
32
32
  export interface McmetaSummary {
33
33
  blocks: McmetaStates;
34
34
  commands: McmetaCommands;
@@ -45,7 +45,7 @@ export interface McmetaStates {
45
45
  }
46
46
  ];
47
47
  }
48
- export declare type McmetaCommands = RootTreeNode;
48
+ export type McmetaCommands = RootTreeNode;
49
49
  interface BaseTreeNode {
50
50
  type: string;
51
51
  children?: {
@@ -70,7 +70,7 @@ export interface RootTreeNode extends BaseTreeNode {
70
70
  [command: string]: LiteralTreeNode;
71
71
  };
72
72
  }
73
- export declare type CommandTreeNode = ArgumentTreeNode | LiteralTreeNode | RootTreeNode;
73
+ export type CommandTreeNode = ArgumentTreeNode | LiteralTreeNode | RootTreeNode;
74
74
  export interface McmetaRegistries {
75
75
  [id: string]: string[];
76
76
  }
@@ -3,7 +3,7 @@ import { PackVersionMap } from './common.js';
3
3
  /**
4
4
  * @param inputVersion {@link core.Config.env.gameVersion}
5
5
  */
6
- export function resolveConfiguredVersion(inputVersion, { packMcmeta, versions }) {
6
+ export function resolveConfiguredVersion(inputVersion, { packMcmeta, versions, }) {
7
7
  function toVersionInfo(index) {
8
8
  if (index < 0) {
9
9
  index = 0;
@@ -12,7 +12,7 @@ export function resolveConfiguredVersion(inputVersion, { packMcmeta, versions })
12
12
  return {
13
13
  id: version.id,
14
14
  name: version.name,
15
- release: version.release_target,
15
+ release: (version.release_target ?? '1.99'),
16
16
  isLatest: index === 0,
17
17
  };
18
18
  }
@@ -25,18 +25,19 @@ export function resolveConfiguredVersion(inputVersion, { packMcmeta, versions })
25
25
  if (packMcmeta) {
26
26
  const regex = PackVersionMap[packMcmeta.pack.pack_format];
27
27
  if (regex) {
28
- return toVersionInfo(versions.findIndex(v => regex.test(v.release_target)));
28
+ return toVersionInfo(versions.findIndex((v) => regex.test(v.release_target)));
29
29
  }
30
30
  }
31
31
  return toVersionInfo(0);
32
32
  }
33
33
  else if (inputVersion === 'latest release') {
34
- return toVersionInfo(versions.findIndex(v => v.type === 'release'));
34
+ return toVersionInfo(versions.findIndex((v) => v.type === 'release'));
35
35
  }
36
36
  else if (inputVersion === 'latest snapshot') {
37
- return toVersionInfo(versions.findIndex(v => v.type === 'snapshot'));
37
+ return toVersionInfo(versions.findIndex((v) => v.type === 'snapshot'));
38
38
  }
39
- return toVersionInfo(versions.findIndex(v => inputVersion === v.id.toLowerCase() || inputVersion === v.name.toLowerCase()));
39
+ return toVersionInfo(versions.findIndex((v) => inputVersion === v.id.toLowerCase() ||
40
+ inputVersion === v.name.toLowerCase()));
40
41
  }
41
42
  const DataSources = {
42
43
  fastly: 'https://fastly.jsdelivr.net/gh/${user}/${repo}@${tag}/${path}',
@@ -76,14 +77,14 @@ export function symbolRegistrar(summary) {
76
77
  .query(uri, category, core.ResourceLocation.lengthen(id))
77
78
  .onEach(Object.entries(properties), ([state, values], blockQuery) => {
78
79
  const defaultValue = defaults[state];
79
- blockQuery.member(`${uri}#${capitalizedCategory}_states`, state, stateQuery => {
80
+ blockQuery.member(`${uri}#${capitalizedCategory}_states`, state, (stateQuery) => {
80
81
  stateQuery
81
82
  .enter({
82
83
  data: { subcategory: 'state' },
83
84
  usage: { type: 'declaration' },
84
85
  })
85
- .onEach(values, value => {
86
- stateQuery.member(value, valueQuery => {
86
+ .onEach(values, (value) => {
87
+ stateQuery.member(value, (valueQuery) => {
87
88
  valueQuery.enter({
88
89
  data: { subcategory: 'state_value' },
89
90
  usage: { type: 'declaration' },
@@ -92,7 +93,10 @@ export function symbolRegistrar(summary) {
92
93
  stateQuery.amend({
93
94
  data: {
94
95
  relations: {
95
- default: { category, path: valueQuery.path },
96
+ default: {
97
+ category,
98
+ path: valueQuery.path,
99
+ },
96
100
  },
97
101
  },
98
102
  });
@@ -105,7 +109,8 @@ export function symbolRegistrar(summary) {
105
109
  }
106
110
  function addRegistriesSymbols(registries, symbols) {
107
111
  function isCategory(str) {
108
- return (core.FileCategories.includes(str) || core.RegistryCategories.includes(str));
112
+ return (core.FileCategories.includes(str) ||
113
+ core.RegistryCategories.includes(str));
109
114
  }
110
115
  for (const [registryId, registry] of Object.entries(registries)) {
111
116
  if (isCategory(registryId)) {
@@ -117,17 +122,29 @@ export function symbolRegistrar(summary) {
117
122
  }
118
123
  }
119
124
  }
120
- return symbols => {
125
+ return (symbols) => {
121
126
  addRegistriesSymbols(summary.registries, symbols);
122
127
  addStatesSymbols('block', summary.blocks, symbols);
123
128
  addStatesSymbols('fluid', summary.fluids, symbols);
124
129
  };
125
130
  }
126
131
  export const Fluids = {
127
- flowing_lava: [{ falling: ['false', 'true'], level: ['1', '2', '3', '4', '5', '6', '7', '8'] }, { falling: 'false', level: '1' }],
128
- flowing_water: [{ falling: ['false', 'true'], level: ['1', '2', '3', '4', '5', '6', '7', '8'] }, { falling: 'false', level: '1' }],
132
+ flowing_lava: [
133
+ {
134
+ falling: ['false', 'true'],
135
+ level: ['1', '2', '3', '4', '5', '6', '7', '8'],
136
+ },
137
+ { falling: 'false', level: '1' },
138
+ ],
139
+ flowing_water: [
140
+ {
141
+ falling: ['false', 'true'],
142
+ level: ['1', '2', '3', '4', '5', '6', '7', '8'],
143
+ },
144
+ { falling: 'false', level: '1' },
145
+ ],
129
146
  lava: [{ falling: ['false', 'true'] }, { falling: 'false' }],
130
147
  water: [{ falling: ['false', 'true'] }, { falling: 'false' }],
131
148
  };
132
- //#endregion
149
+ // #endregion
133
150
  //# sourceMappingURL=mcmeta.js.map
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@ import * as core from '@spyglassmc/core';
2
2
  import * as mcdoc from '@spyglassmc/mcdoc';
3
3
  import * as nbt from '@spyglassmc/nbt';
4
4
  import { uriBinder } from './binder/index.js';
5
- import { getMcmetaSummary, getVanillaMcdoc, getVersions, PackMcmeta, resolveConfiguredVersion, symbolRegistrar } from './dependency/index.js';
5
+ import { getMcmetaSummary, getVanillaMcdoc, getVersions, PackMcmeta, resolveConfiguredVersion, symbolRegistrar, } from './dependency/index.js';
6
6
  import * as jeJson from './json/index.js';
7
7
  import * as jeMcf from './mcfunction/index.js';
8
8
  export * as dependency from './dependency/index.js';
@@ -33,10 +33,16 @@ export const initialize = async (ctx) => {
33
33
  return;
34
34
  }
35
35
  const packMcmeta = await getPackMcmeta();
36
- const { release, id: version, isLatest } = resolveConfiguredVersion(config.env.gameVersion, { packMcmeta, versions });
36
+ const { release, id: version, isLatest, } = resolveConfiguredVersion(config.env.gameVersion, {
37
+ packMcmeta,
38
+ versions,
39
+ });
37
40
  meta.registerDependencyProvider('@vanilla-mcdoc', () => getVanillaMcdoc(downloader));
38
41
  const summary = await getMcmetaSummary(ctx.externals, downloader, logger, version, isLatest, config.env.dataSource, config.env.mcmetaSummaryOverrides);
39
- if (!summary.blocks || !summary.commands || !summary.fluids || !summary.registries) {
42
+ if (!summary.blocks ||
43
+ !summary.commands ||
44
+ !summary.fluids ||
45
+ !summary.registries) {
40
46
  ctx.logger.error('[je-initialize] Failed loading mcmeta summaries. Expect everything to be broken.');
41
47
  return;
42
48
  }
@@ -47,13 +53,19 @@ export const initialize = async (ctx) => {
47
53
  meta.registerLinter('nameOfNbtKey', {
48
54
  configValidator: core.linter.configValidator.nameConvention,
49
55
  linter: core.linter.nameConvention('value'),
50
- nodePredicate: n => (
56
+ nodePredicate: (n) =>
51
57
  // nbt compound keys without mcdoc definition.
52
- (!n.symbol && n.parent?.parent?.type === 'nbt:compound' && core.PairNode.is(n.parent) && n.type === 'string' && n.parent.key === n) ||
58
+ (!n.symbol &&
59
+ n.parent?.parent?.type === 'nbt:compound' &&
60
+ core.PairNode.is(n.parent) &&
61
+ n.type === 'string' &&
62
+ n.parent.key === n) ||
53
63
  // nbt path keys without mcdoc definition.
54
64
  (!n.symbol && n.parent?.type === 'nbt:path' && n.type === 'string') ||
55
65
  // mcdoc compound key definition outside of `::minecraft` modules.
56
- (mcdoc.StructFieldNode.is(n.parent) && mcdoc.StructKeyNode.is(n) && !n.symbol?.path[0]?.startsWith('::minecraft'))),
66
+ (mcdoc.StructFieldNode.is(n.parent) &&
67
+ mcdoc.StructKeyNode.is(n) &&
68
+ !n.symbol?.path[0]?.startsWith('::minecraft')),
57
69
  });
58
70
  jeJson.initialize(ctx);
59
71
  jeMcf.initialize(ctx, summary.commands, release);
@@ -1,6 +1,6 @@
1
- import { any, as, boolean, dispatch, extract, extractStringArray, int, listOf, literal, object, opt, pick, record, ref, resource, simpleString, string, when } from '@spyglassmc/json/lib/checker/primitives/index.js';
1
+ import { any, as, boolean, dispatch, extract, extractStringArray, int, listOf, literal, object, opt, pick, record, ref, resource, simpleString, string, when, } from '@spyglassmc/json/lib/checker/primitives/index.js';
2
2
  import { dissectUri } from '../../../binder/index.js';
3
- import { blockStateMap, criterionReference, deprecated, nbt, versioned } from '../util/index.js';
3
+ import { blockStateMap, criterionReference, deprecated, nbt, versioned, } from '../util/index.js';
4
4
  import { float_bounds, int_bounds, Slots } from './common.js';
5
5
  import { predicate } from './loot_table.js';
6
6
  import { text_component } from './text_component.js';
@@ -64,7 +64,11 @@ export const item_predicate = as('item', dispatch((props, ctx) => record({
64
64
  count: opt(int_bounds),
65
65
  durability: opt(float_bounds),
66
66
  potion: opt(resource('potion')),
67
- nbt: opt(nbt({ registry: 'item', ids: extractStringArray('items', props), tag: extract('tag', props) })),
67
+ nbt: opt(nbt({
68
+ registry: 'item',
69
+ ids: extractStringArray('items', props),
70
+ tag: extract('tag', props),
71
+ })),
68
72
  enchantments: opt(listOf(record({
69
73
  enchantment: opt(resource('enchantment')),
70
74
  levels: opt(int_bounds),
@@ -77,14 +81,18 @@ export const block_predicate = as('block', dispatch((props, ctx) => record({
77
81
  blocks: opt(listOf(resource('block'))),
78
82
  }),
79
83
  tag: opt(resource('tag/block')),
80
- nbt: opt(nbt({ registry: 'block', ids: extractStringArray('blocks', props), tag: extract('tag', props) })),
84
+ nbt: opt(nbt({
85
+ registry: 'block',
86
+ ids: extractStringArray('blocks', props),
87
+ tag: extract('tag', props),
88
+ })),
81
89
  state: opt(blockStateMap({
82
90
  ids: extractStringArray('blocks', props),
83
91
  tag: extract('tag', props),
84
92
  mixedTypes: true,
85
93
  })),
86
94
  })));
87
- export const fluid_predicate = as('fluid', dispatch(props => record({
95
+ export const fluid_predicate = as('fluid', dispatch((props) => record({
88
96
  fluid: opt(resource('fluid')),
89
97
  tag: opt(resource('tag/fluid')),
90
98
  state: opt(blockStateMap({
@@ -197,13 +205,10 @@ export const damage_predicate = as('damage', record({
197
205
  source_entity: opt(entity_predicate),
198
206
  type: opt(damage_source_predicate),
199
207
  }));
200
- const entity = any([
201
- entity_predicate,
202
- listOf(ref(() => predicate)),
203
- ]);
208
+ const entity = any([entity_predicate, listOf(ref(() => predicate))]);
204
209
  export const criterion = as('criterion', dispatch('trigger', (trigger, _, ctx) => record({
205
210
  trigger: resource(Triggers(ctx)),
206
- conditions: opt(dispatch(props => record({
211
+ conditions: opt(dispatch((props) => record({
207
212
  ...versioned(ctx, '1.16', when(trigger, ['impossible'], {}, {
208
213
  player: opt(versioned(ctx, entity_predicate, '1.16', entity)),
209
214
  })),
@@ -381,7 +386,12 @@ export const criterion = as('criterion', dispatch('trigger', (trigger, _, ctx) =
381
386
  location: opt(versioned(ctx, '1.16', location_predicate)),
382
387
  },
383
388
  }),
384
- ...when(trigger, ['hero_of_the_village', 'location', 'slept_in_bed', 'voluntary_exile'], {
389
+ ...when(trigger, [
390
+ 'hero_of_the_village',
391
+ 'location',
392
+ 'slept_in_bed',
393
+ 'voluntary_exile',
394
+ ], {
385
395
  position: opt(deprecated(ctx, '1.16', record({
386
396
  x: opt(float_bounds),
387
397
  y: opt(float_bounds),
@@ -401,7 +411,7 @@ export const criterion = as('criterion', dispatch('trigger', (trigger, _, ctx) =
401
411
  })));
402
412
  export const advancement = as('advancement', record({
403
413
  display: opt(record({
404
- icon: dispatch(props => record({
414
+ icon: dispatch((props) => record({
405
415
  item: resource('item'),
406
416
  nbt: opt(nbt({ registry: 'item', id: extract('item', props) })),
407
417
  })),
@@ -422,7 +432,8 @@ export const advancement = as('advancement', record({
422
432
  const parts = dissectUri(ctx.doc.uri, ctx);
423
433
  const advancement = `${parts?.namespace}:${parts?.identifier}`;
424
434
  const criterion = node.value;
425
- ctx.symbols.query(ctx.doc, 'advancement', advancement, criterion)
435
+ ctx.symbols
436
+ .query(ctx.doc, 'advancement', advancement, criterion)
426
437
  .enter({
427
438
  data: { subcategory: 'criterion' },
428
439
  usage: { type: 'definition', node },
@@ -1,7 +1,7 @@
1
- import { any, as, boolean, dispatch, float, floatRange, int, intRange, listOf, literal, object, opt, record, resource, when } from '@spyglassmc/json/lib/checker/primitives/index.js';
1
+ import { any, as, boolean, dispatch, float, floatRange, int, intRange, listOf, literal, object, opt, record, resource, when, } from '@spyglassmc/json/lib/checker/primitives/index.js';
2
2
  import { intColor, versioned } from '../util/index.js';
3
- import { block_state, floatProvider, height_provider, vertical_anchor } from './common.js';
4
- import { configured_feature_list_ref, placed_feature_list_ref } from './feature.js';
3
+ import { block_state, floatProvider, height_provider, vertical_anchor, } from './common.js';
4
+ import { configured_feature_list_ref, placed_feature_list_ref, } from './feature.js';
5
5
  import { configured_structure_feature } from './structure.js';
6
6
  const BiomeCategory = (ctx) => [
7
7
  'beach',