@spyglassmc/java-edition 0.3.10 → 0.3.12

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/lib/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as core from '@spyglassmc/core';
2
2
  import * as json from '@spyglassmc/json';
3
+ import { localize } from '@spyglassmc/locales';
3
4
  import * as mcdoc from '@spyglassmc/mcdoc';
4
5
  import * as nbt from '@spyglassmc/nbt';
5
6
  import { uriBinder } from './binder/index.js';
@@ -11,7 +12,7 @@ export * as dependency from './dependency/index.js';
11
12
  export * as json from './json/index.js';
12
13
  export * as mcf from './mcfunction/index.js';
13
14
  export const initialize = async (ctx) => {
14
- const { config, downloader, externals, logger, meta, projectRoot } = ctx;
15
+ const { config, downloader, externals, logger, meta, projectRoots } = ctx;
15
16
  async function readPackMcmeta(uri) {
16
17
  try {
17
18
  const data = await core.fileUtil.readJson(externals, uri);
@@ -21,7 +22,7 @@ export const initialize = async (ctx) => {
21
22
  catch (e) {
22
23
  if (!externals.error.isKind(e, 'ENOENT')) {
23
24
  // `pack.mcmeta` exists but broken. Log an error.
24
- logger.error(`[je.initialize] Failed loading pack.mcmeta “${uri}”`, e);
25
+ logger.error(`[je.initialize] Failed loading pack.mcmeta ${uri}`, e);
25
26
  }
26
27
  }
27
28
  return undefined;
@@ -29,16 +30,18 @@ export const initialize = async (ctx) => {
29
30
  async function findPackMcmeta() {
30
31
  const searched = new Set();
31
32
  for (let depth = 0; depth <= 2; depth += 1) {
32
- const files = await externals.fs.getAllFiles(projectRoot, depth + 1);
33
- for (const uri of files.filter(uri => uri.endsWith('/pack.mcmeta'))) {
34
- if (searched.has(uri)) {
35
- continue;
36
- }
37
- searched.add(uri);
38
- const data = await readPackMcmeta(uri);
39
- if (data) {
40
- logger.info(`[je.initialize] Found a valid pack.mcmeta “${uri}” with pack_format “${data.pack.pack_format}”`);
41
- return data;
33
+ for (const projectRoot of projectRoots) {
34
+ const files = await externals.fs.getAllFiles(projectRoot, depth + 1);
35
+ for (const uri of files.filter(uri => uri.endsWith('/pack.mcmeta'))) {
36
+ if (searched.has(uri)) {
37
+ continue;
38
+ }
39
+ searched.add(uri);
40
+ const data = await readPackMcmeta(uri);
41
+ if (data) {
42
+ logger.info(`[je.initialize] Found a valid pack.mcmeta ${uri} with pack_format ${data.pack.pack_format}`);
43
+ return data;
44
+ }
42
45
  }
43
46
  }
44
47
  }
@@ -112,6 +115,37 @@ export const initialize = async (ctx) => {
112
115
  return field;
113
116
  },
114
117
  });
118
+ const packFormats = new Map();
119
+ for (const version of versions) {
120
+ if (version.type === 'release' && !packFormats.has(version.data_pack_version)) {
121
+ packFormats.set(version.data_pack_version, version);
122
+ }
123
+ }
124
+ mcdoc.runtime.registerAttribute(meta, 'pack_format', () => undefined, {
125
+ checker: (_, typeDef) => {
126
+ if (typeDef.kind !== 'literal' || typeof typeDef.value.value !== 'number') {
127
+ return undefined;
128
+ }
129
+ const target = typeDef.value.value;
130
+ return (node, ctx) => {
131
+ const targetVersion = packFormats.get(target);
132
+ if (!targetVersion) {
133
+ ctx.err.report(localize('java-edition.pack-format.unsupported', target), node, 2 /* core.ErrorSeverity.Warning */);
134
+ }
135
+ else if (targetVersion.id !== release) {
136
+ ctx.err.report(localize('java-edition.pack-format.not-loaded', target, release), node, 2 /* core.ErrorSeverity.Warning */);
137
+ }
138
+ };
139
+ },
140
+ numericCompleter: (_, ctx) => {
141
+ return [...packFormats.values()].map((v, i) => ({
142
+ range: core.Range.create(ctx.offset),
143
+ label: `${v.data_pack_version}`,
144
+ labelSuffix: ` (${v.id})`,
145
+ sortText: `${i}`.padStart(4, '0'),
146
+ }));
147
+ },
148
+ });
115
149
  json.initialize(ctx);
116
150
  jeJson.initialize(ctx);
117
151
  jeMcf.initialize(ctx, summary.commands, release);
package/lib/json/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  /* istanbul ignore file */
2
2
  import * as checker from './checker/index.js';
3
+ import { registerMcdocAttributes } from './mcdocAttributes.js';
3
4
  export const initialize = (ctx) => {
5
+ registerMcdocAttributes(ctx.meta);
4
6
  checker.register(ctx.meta);
5
7
  };
6
8
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ import * as core from '@spyglassmc/core';
2
+ export declare function registerMcdocAttributes(meta: core.MetaRegistry): void;
3
+ //# sourceMappingURL=mcdocAttributes.d.ts.map
@@ -0,0 +1,35 @@
1
+ import * as core from '@spyglassmc/core';
2
+ import * as mcdoc from '@spyglassmc/mcdoc';
3
+ import { dissectUri } from '../binder/index.js';
4
+ const validator = mcdoc.runtime.attribute.validator;
5
+ const criterionValidator = validator.alternatives(validator.tree({
6
+ definition: validator.boolean,
7
+ }), () => ({ definition: false }));
8
+ export function registerMcdocAttributes(meta) {
9
+ mcdoc.runtime.registerAttribute(meta, 'criterion', criterionValidator, {
10
+ stringParser: (config, _, ctx) => {
11
+ const parts = dissectUri(ctx.doc.uri, ctx);
12
+ if (!parts || !parts.ok || parts.category !== 'advancement') {
13
+ return undefined;
14
+ }
15
+ return core.symbol({
16
+ category: 'advancement',
17
+ subcategory: 'criterion',
18
+ parentPath: [`${parts.namespace}:${parts.identifier}`],
19
+ usageType: config.definition ? 'definition' : 'reference',
20
+ });
21
+ },
22
+ stringMocker: (config, _, ctx) => {
23
+ const parts = dissectUri(ctx.doc.uri, ctx);
24
+ if (!parts || !parts.ok || parts.category !== 'advancement') {
25
+ return undefined;
26
+ }
27
+ return core.SymbolNode.mock(ctx.offset, {
28
+ category: 'advancement',
29
+ subcategory: 'criterion',
30
+ parentPath: [`${parts.namespace}:${parts.identifier}`],
31
+ });
32
+ },
33
+ });
34
+ }
35
+ //# sourceMappingURL=mcdocAttributes.js.map
@@ -1,5 +1,5 @@
1
1
  import * as core from '@spyglassmc/core';
2
- import * as mcf from '@spyglassmc/mcfunction';
2
+ import type * as mcf from '@spyglassmc/mcfunction';
3
3
  export declare const command: core.Checker<mcf.CommandNode>;
4
4
  export declare function register(meta: core.MetaRegistry): void;
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1,7 +1,6 @@
1
1
  import * as core from '@spyglassmc/core';
2
2
  import * as json from '@spyglassmc/json';
3
3
  import { localize } from '@spyglassmc/locales';
4
- import * as mcf from '@spyglassmc/mcfunction';
5
4
  import * as nbt from '@spyglassmc/nbt';
6
5
  import { dissectUri, reportDissectError } from '../../binder/index.js';
7
6
  import { getTagValues } from '../../common/index.js';
@@ -15,9 +14,6 @@ const entry = (node, ctx) => {
15
14
  core.checker.dispatchSync(node, ctx);
16
15
  };
17
16
  export const command = (node, ctx) => {
18
- if (node.slash && node.parent && mcf.McfunctionNode.is(node.parent)) {
19
- ctx.err.report(localize('unexpected-leading-slash'), node.slash);
20
- }
21
17
  rootCommand(node.children, 0, ctx);
22
18
  };
23
19
  function getEarlierNode(nodes, before, name) {
@@ -5,7 +5,7 @@ import { getTagValues } from '../../common/index.js';
5
5
  import { ReleaseVersion } from '../../dependency/common.js';
6
6
  import { ColorArgumentValues, EntityAnchorArgumentValues, GamemodeArgumentValues, getItemSlotArgumentValues, getItemSlotsArgumentValues, getScoreboardSlotArgumentValues, HeightmapValues, MirrorValues, OperationArgumentValues, RotationValues, SwizzleArgumentValues, } from '../common/index.js';
7
7
  import { BlockNode, ComponentTestExactNode, ComponentTestSubpredicateNode, CoordinateNode, EntitySelectorAtVariable, EntitySelectorNode, IntRangeNode, ItemPredicateNode, ItemStackNode, ObjectiveCriteriaNode, ParticleNode, ScoreHolderNode, VectorNode, } from '../node/index.js';
8
- export const getMockNodes = (rawTreeNode, ctx) => {
8
+ export const getMockNodes = (rawTreeNode, prevNodes, ctx) => {
9
9
  const range = ctx.offset;
10
10
  const treeNode = rawTreeNode;
11
11
  switch (treeNode.parser) {
@@ -122,6 +122,18 @@ export const getMockNodes = (rawTreeNode, ctx) => {
122
122
  return VectorNode.mock(range, { dimension: 2, integersOnly: true });
123
123
  case 'minecraft:vec3':
124
124
  return VectorNode.mock(range, { dimension: 3 });
125
+ case 'spyglassmc:criterion':
126
+ const advancementNode = prevNodes.length > 0
127
+ ? prevNodes[prevNodes.length - 1].children[0]
128
+ : undefined;
129
+ if (ResourceLocationNode.is(advancementNode)) {
130
+ return SymbolNode.mock(range, {
131
+ category: 'advancement',
132
+ subcategory: 'criterion',
133
+ parentPath: [ResourceLocationNode.toString(advancementNode, 'full')],
134
+ });
135
+ }
136
+ return [];
125
137
  case 'spyglassmc:tag':
126
138
  return SymbolNode.mock(range, { category: 'tag' });
127
139
  // ==== Unimplemented ====
@@ -24,11 +24,16 @@ export const initialize = (ctx, commands, releaseVersion) => {
24
24
  validatePatchedTree(tree, ctx.logger);
25
25
  }
26
26
  mcf.initialize(ctx);
27
- const supportsBackslashContinuation = ReleaseVersion.cmp(releaseVersion, '1.20.2') >= 0;
28
- const supportsMacros = ReleaseVersion.cmp(releaseVersion, '1.20.2') >= 0;
27
+ const mcfunctionOptions = {
28
+ lineContinuation: ReleaseVersion.cmp(releaseVersion, '1.20.2') >= 0,
29
+ macros: ReleaseVersion.cmp(releaseVersion, '1.20.2') >= 0,
30
+ commandOptions: ReleaseVersion.cmp(releaseVersion, '1.20.5') >= 0
31
+ ? { maxLength: 2_000_000 }
32
+ : {},
33
+ };
29
34
  meta.registerLanguage('mcfunction', {
30
35
  extensions: ['.mcfunction'],
31
- parser: mcf.entry(tree, parser.argument, { supportsBackslashContinuation, supportsMacros }),
36
+ parser: mcf.entry(tree, parser.argument, mcfunctionOptions),
32
37
  completer: mcf.completer.entry(tree, completer.getMockNodes),
33
38
  triggerCharacters: [' ', '[', '=', '!', ',', '{', ':', '/', '.', '"', "'"],
34
39
  });
@@ -7,6 +7,11 @@ import { getItemSlotsArgumentValues } from './common/index.js';
7
7
  import { EntitySelectorAtVariable, EntitySelectorNode, ScoreHolderNode } from './node/argument.js';
8
8
  import * as parser from './parser/index.js';
9
9
  const validator = mcdoc.runtime.attribute.validator;
10
+ const commandValidator = validator.alternatives(validator.tree({
11
+ slash: validator.optional(validator.options('allowed', 'required', 'chat')),
12
+ max_length: validator.optional(validator.number),
13
+ empty: validator.optional(validator.options('allowed')),
14
+ }), () => ({}));
10
15
  const entityValidator = validator.alternatives(validator.tree({
11
16
  amount: validator.options('multiple', 'single'),
12
17
  type: validator.options('entities', 'players'),
@@ -15,11 +20,20 @@ const scoreHolderValidator = validator.alternatives(validator.tree({
15
20
  amount: validator.options('multiple', 'single'),
16
21
  }), () => ({ amount: 'multiple' }));
17
22
  export function registerMcdocAttributes(meta, rootTreeNode) {
18
- mcdoc.runtime.registerAttribute(meta, 'command', () => undefined, {
19
- // TODO: validate slash
23
+ mcdoc.runtime.registerAttribute(meta, 'command', commandValidator, {
20
24
  // TODO: fix completer inside commands
21
- stringParser: () => {
22
- return mcf.command(rootTreeNode, parser.argument);
25
+ stringParser: ({ slash, max_length, empty }) => {
26
+ return (src, ctx) => {
27
+ if ((empty && !src.canRead()) || (slash === 'chat' && src.peek() !== '/')) {
28
+ return core.string({
29
+ unquotable: { blockList: new Set(), allowEmpty: true },
30
+ })(src, ctx);
31
+ }
32
+ return mcf.command(rootTreeNode, parser.argument, {
33
+ slash: slash === 'chat' ? 'allowed' : slash,
34
+ maxLength: max_length,
35
+ })(src, ctx);
36
+ };
23
37
  },
24
38
  });
25
39
  mcdoc.runtime.registerAttribute(meta, 'text_component', () => undefined, {
@@ -36,7 +36,7 @@ export declare const enum CoordinateSystem {
36
36
  World = 0,
37
37
  Local = 1
38
38
  }
39
- export interface EntitySelectorAdvancementsArgumentCriteriaNode extends core.RecordBaseNode<core.StringNode, core.BooleanNode> {
39
+ export interface EntitySelectorAdvancementsArgumentCriteriaNode extends core.RecordBaseNode<core.StringNode | core.SymbolNode, core.BooleanNode> {
40
40
  type: 'mcfunction:entity_selector/arguments/advancements/criteria';
41
41
  }
42
42
  export interface EntitySelectorAdvancementsArgumentNode extends core.RecordBaseNode<core.ResourceLocationNode, core.BooleanNode | EntitySelectorAdvancementsArgumentCriteriaNode> {
@@ -9,6 +9,7 @@ import { EntitySelectorNode } from '../node/index.js';
9
9
  */
10
10
  export declare const argument: mcf.ArgumentParserGetter;
11
11
  export declare const blockPredicate: core.InfallibleParser<BlockNode>;
12
+ export declare function criterion(advancement: core.FullResourceLocation, usageType?: core.SymbolUsageType, terminators?: string[]): core.InfallibleParser<core.SymbolNode>;
12
13
  export declare function entity(amount: 'multiple' | 'single', type: 'entities' | 'players'): core.Parser<EntityNode>;
13
14
  export declare const itemSlots: core.InfallibleParser<core.LiteralNode>;
14
15
  export declare function jsonParser(typeRef: `::${string}::${string}`): core.Parser<json.TypedJsonNode>;
@@ -45,7 +45,7 @@ function shouldUseOldItemStackFormat(ctx) {
45
45
  * @returns The parser for the specified argument tree node. All argument parsers used in the `mcfunction` package
46
46
  * fail on empty input.
47
47
  */
48
- export const argument = (rawTreeNode) => {
48
+ export const argument = (rawTreeNode, prevNodes) => {
49
49
  const treeNode = rawTreeNode;
50
50
  const wrap = (parser) => core.failOnEmpty(core.stopBefore(parser, '\r', '\n'));
51
51
  switch (treeNode.parser) {
@@ -81,7 +81,7 @@ export const argument = (rawTreeNode) => {
81
81
  return wrap(core.map(core.literal(...ColorArgumentValues), (res) => ({
82
82
  ...res,
83
83
  color: core.Color.NamedColors.has(res.value)
84
- ? core.Color.fromCompositeInt(core.Color.NamedColors.get(res.value))
84
+ ? core.Color.fromCompositeRGB(core.Color.NamedColors.get(res.value))
85
85
  : undefined,
86
86
  })));
87
87
  case 'minecraft:column_pos':
@@ -186,6 +186,16 @@ export const argument = (rawTreeNode) => {
186
186
  return wrap(vector({ dimension: 2, noLocal: true }));
187
187
  case 'minecraft:vec3':
188
188
  return wrap(vector({ dimension: 3 }));
189
+ case 'spyglassmc:criterion':
190
+ const advancementNode = prevNodes.length > 0
191
+ ? prevNodes[prevNodes.length - 1].children[0]
192
+ : undefined;
193
+ if (core.ResourceLocationNode.is(advancementNode)) {
194
+ return wrap(criterion(core.ResourceLocationNode.toString(advancementNode, 'full'), core.SymbolUsageType.is(treeNode.properties?.usageType)
195
+ ? treeNode.properties?.usageType
196
+ : undefined));
197
+ }
198
+ return wrap(greedyString);
189
199
  case 'spyglassmc:tag':
190
200
  return wrap(tag(core.SymbolUsageType.is(treeNode.properties?.usageType)
191
201
  ? treeNode.properties?.usageType
@@ -266,6 +276,9 @@ function coordinate(integerOnly = false) {
266
276
  return ans;
267
277
  };
268
278
  }
279
+ export function criterion(advancement, usageType, terminators = []) {
280
+ return unquotableSymbol({ category: 'advancement', subcategory: 'criterion', parentPath: [advancement], usageType }, terminators);
281
+ }
269
282
  export function entity(amount, type) {
270
283
  return core.map(core.select([{ predicate: (src) => src.peek() === '@', parser: selector() }, {
271
284
  parser: core.any([
@@ -588,26 +601,31 @@ export function selector(ignoreInvalidPrefix = false) {
588
601
  category: 'advancement',
589
602
  }),
590
603
  sep: '=',
591
- value: core.select([{
592
- predicate: (src) => src.peek() === '{',
593
- parser: core.map(core.record({
594
- start: '{',
595
- pair: {
596
- key: unquotedString,
597
- sep: '=',
598
- value: core.boolean,
599
- end: ',',
600
- trailingEnd: true,
601
- },
602
- end: '}',
603
- }), (res) => {
604
- const ans = {
605
- ...res,
606
- type: 'mcfunction:entity_selector/arguments/advancements/criteria',
607
- };
608
- return ans;
609
- }),
610
- }, { parser: core.boolean }]),
604
+ value: {
605
+ get: (_, key) => core.select([{
606
+ predicate: (src) => src.peek() === '{',
607
+ parser: core.map(core.record({
608
+ start: '{',
609
+ pair: {
610
+ key: key
611
+ ? criterion(core.ResourceLocationNode
612
+ .toString(key, 'full'), 'reference', ['}', ',', '='])
613
+ : unquotedString,
614
+ sep: '=',
615
+ value: core.boolean,
616
+ end: ',',
617
+ trailingEnd: true,
618
+ },
619
+ end: '}',
620
+ }), (res) => {
621
+ const ans = {
622
+ ...res,
623
+ type: 'mcfunction:entity_selector/arguments/advancements/criteria',
624
+ };
625
+ return ans;
626
+ }),
627
+ }, { parser: core.boolean }]),
628
+ },
611
629
  end: ',',
612
630
  trailingEnd: true,
613
631
  },
@@ -1066,7 +1084,7 @@ const componentTest = (src, ctx) => {
1066
1084
  negated,
1067
1085
  };
1068
1086
  const value = nbt.parser.entry(src, ctx);
1069
- if (value == core.Failure) {
1087
+ if (value === core.Failure) {
1070
1088
  ctx.err.report(localize('expected', localize('nbt.node')), src);
1071
1089
  src.skipUntilOrEnd(',', '|', ']');
1072
1090
  }
@@ -1090,7 +1108,7 @@ const componentTest = (src, ctx) => {
1090
1108
  negated,
1091
1109
  };
1092
1110
  const predicate = nbt.parser.entry(src, ctx);
1093
- if (predicate == core.Failure) {
1111
+ if (predicate === core.Failure) {
1094
1112
  ctx.err.report(localize('expected', localize('nbt.node')), src);
1095
1113
  src.skipUntilOrEnd(',', '|', ']');
1096
1114
  }
@@ -1,6 +1,6 @@
1
1
  import * as core from '@spyglassmc/core';
2
2
  import * as mcf from '@spyglassmc/mcfunction';
3
- import type { RootTreeNode } from '../dependency';
3
+ import type { RootTreeNode } from '../dependency/index.js';
4
4
  /**
5
5
  * Only command options that can be satisfied by the current command node will be listed in `signatures`.
6
6
  * Only parameters at and immediately after the `offset` will be listed in `parameters`.
@@ -257,8 +257,11 @@ export interface MinecraftVec2ArgumentTreeNode extends mcf.ArgumentTreeNode {
257
257
  export interface MinecraftVec3ArgumentTreeNode extends mcf.ArgumentTreeNode {
258
258
  parser: 'minecraft:vec3';
259
259
  }
260
+ export interface SpyglassmcCriterionArgumentTreeNode extends mcf.ArgumentTreeNode {
261
+ parser: 'spyglassmc:criterion';
262
+ }
260
263
  export interface SpyglassmcTagArgumentTreeNode extends mcf.ArgumentTreeNode {
261
264
  parser: 'spyglassmc:tag';
262
265
  }
263
- export type ArgumentTreeNode = BrigadierBoolArgumentTreeNode | BrigadierDoubleArgumentTreeNode | BrigadierFloatArgumentTreeNode | BrigadierIntegerArgumentTreeNode | BrigadierLongArgumentTreeNode | BrigadierStringArgumentTreeNode | MinecraftAngleArgumentTreeNode | MinecraftBlockPosArgumentTreeNode | MinecraftBlockPredicateArgumentTreeNode | MinecraftBlockStateArgumentTreeNode | MinecraftColorArgumentTreeNode | MinecraftColumnPosArgumentTreeNode | MinecraftComponentArgumentTreeNode | MinecraftDimensionArgumentTreeNode | MinecraftEntityArgumentTreeNode | MinecraftEntityAnchorArgumentTreeNode | MinecraftEntitySummonArgumentTreeNode | MinecraftFloatRangeArgumentTreeNode | MinecraftFunctionArgumentTreeNode | MinecraftGamemodeArgumentTreeNode | MinecraftGameProfileArgumentTreeNode | MinecraftHeightmapArgumentTreeNode | MinecraftIntRangeArgumentTreeNode | MinecraftItemEnchantmentArgumentTreeNode | MinecraftItemPredicateArgumentTreeNode | MinecraftItemSlotArgumentTreeNode | MinecraftItemSlotsArgumentTreeNode | MinecraftItemStackArgumentTreeNode | MinecraftLootModifierArgumentTreeNode | MinecraftLootPredicateArgumentTreeNode | MinecraftLootTableArgumentTreeNode | MinecraftMessageArgumentTreeNode | MinecraftMobEffectArgumentTreeNode | MinecraftNbtCompoundTagArgumentTreeNode | MinecraftNbtPathArgumentTreeNode | MinecraftNbtTagArgumentTreeNode | MinecraftObjectiveArgumentTreeNode | MinecraftObjectiveCriteriaArgumentTreeNode | MinecraftOperationArgumentTreeNode | MinecraftParticleArgumentTreeNode | MinecraftResourceArgumentTreeNode | MinecraftResourceKeyArgumentTreeNode | MinecraftResourceLocationArgumentTreeNode | MinecraftResourceOrTagArgumentTreeNode | MinecraftResourceOrTagKeyArgumentTreeNode | MinecraftRotationArgumentTreeNode | MinecraftScoreHolderArgumentTreeNode | MinecraftScoreboardSlotArgumentTreeNode | MinecraftStyleArgumentTreeNode | MinecraftSwizzleArgumentTreeNode | MinecraftTeamArgumentTreeNode | MinecraftTemplateMirrorArgumentTreeNode | MinecraftTemplateRotationArgumentTreeNode | MinecraftTimeArgumentTreeNode | MinecraftUuidArgumentTreeNode | MinecraftVec2ArgumentTreeNode | MinecraftVec3ArgumentTreeNode | SpyglassmcTagArgumentTreeNode;
266
+ export type ArgumentTreeNode = BrigadierBoolArgumentTreeNode | BrigadierDoubleArgumentTreeNode | BrigadierFloatArgumentTreeNode | BrigadierIntegerArgumentTreeNode | BrigadierLongArgumentTreeNode | BrigadierStringArgumentTreeNode | MinecraftAngleArgumentTreeNode | MinecraftBlockPosArgumentTreeNode | MinecraftBlockPredicateArgumentTreeNode | MinecraftBlockStateArgumentTreeNode | MinecraftColorArgumentTreeNode | MinecraftColumnPosArgumentTreeNode | MinecraftComponentArgumentTreeNode | MinecraftDimensionArgumentTreeNode | MinecraftEntityArgumentTreeNode | MinecraftEntityAnchorArgumentTreeNode | MinecraftEntitySummonArgumentTreeNode | MinecraftFloatRangeArgumentTreeNode | MinecraftFunctionArgumentTreeNode | MinecraftGamemodeArgumentTreeNode | MinecraftGameProfileArgumentTreeNode | MinecraftHeightmapArgumentTreeNode | MinecraftIntRangeArgumentTreeNode | MinecraftItemEnchantmentArgumentTreeNode | MinecraftItemPredicateArgumentTreeNode | MinecraftItemSlotArgumentTreeNode | MinecraftItemSlotsArgumentTreeNode | MinecraftItemStackArgumentTreeNode | MinecraftLootModifierArgumentTreeNode | MinecraftLootPredicateArgumentTreeNode | MinecraftLootTableArgumentTreeNode | MinecraftMessageArgumentTreeNode | MinecraftMobEffectArgumentTreeNode | MinecraftNbtCompoundTagArgumentTreeNode | MinecraftNbtPathArgumentTreeNode | MinecraftNbtTagArgumentTreeNode | MinecraftObjectiveArgumentTreeNode | MinecraftObjectiveCriteriaArgumentTreeNode | MinecraftOperationArgumentTreeNode | MinecraftParticleArgumentTreeNode | MinecraftResourceArgumentTreeNode | MinecraftResourceKeyArgumentTreeNode | MinecraftResourceLocationArgumentTreeNode | MinecraftResourceOrTagArgumentTreeNode | MinecraftResourceOrTagKeyArgumentTreeNode | MinecraftRotationArgumentTreeNode | MinecraftScoreHolderArgumentTreeNode | MinecraftScoreboardSlotArgumentTreeNode | MinecraftStyleArgumentTreeNode | MinecraftSwizzleArgumentTreeNode | MinecraftTeamArgumentTreeNode | MinecraftTemplateMirrorArgumentTreeNode | MinecraftTemplateRotationArgumentTreeNode | MinecraftTimeArgumentTreeNode | MinecraftUuidArgumentTreeNode | MinecraftVec2ArgumentTreeNode | MinecraftVec3ArgumentTreeNode | SpyglassmcCriterionArgumentTreeNode | SpyglassmcTagArgumentTreeNode;
264
267
  //# sourceMappingURL=argument.d.ts.map
@@ -758,6 +758,14 @@ const AdvancementTargets = Object.freeze({
758
758
  properties: {
759
759
  category: 'advancement',
760
760
  },
761
+ children: {
762
+ criterion: {
763
+ parser: 'spyglassmc:criterion',
764
+ properties: {
765
+ usageType: 'reference',
766
+ },
767
+ },
768
+ },
761
769
  },
762
770
  },
763
771
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spyglassmc/java-edition",
3
- "version": "0.3.10",
3
+ "version": "0.3.12",
4
4
  "type": "module",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -17,12 +17,12 @@
17
17
  "release:dry": "npm publish --dry-run"
18
18
  },
19
19
  "dependencies": {
20
- "@spyglassmc/core": "0.4.7",
21
- "@spyglassmc/json": "0.3.9",
22
- "@spyglassmc/locales": "0.3.7",
23
- "@spyglassmc/mcfunction": "0.2.9",
24
- "@spyglassmc/mcdoc": "0.3.10",
25
- "@spyglassmc/nbt": "0.3.10"
20
+ "@spyglassmc/core": "0.4.9",
21
+ "@spyglassmc/json": "0.3.11",
22
+ "@spyglassmc/locales": "0.3.8",
23
+ "@spyglassmc/mcfunction": "0.2.11",
24
+ "@spyglassmc/mcdoc": "0.3.12",
25
+ "@spyglassmc/nbt": "0.3.12"
26
26
  },
27
27
  "devDependencies": {
28
28
  "fast-glob": "^3.2.5"