@sandstone-mc/mcdoc-ts-generator 0.1.5 → 0.1.6

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/dist/cli.js CHANGED
@@ -28,6 +28,8 @@ function pascal_case(name) {
28
28
  return words.map((word) => word[0].toUpperCase() + word.slice(1)).join("");
29
29
  }
30
30
  function pluralize(name) {
31
+ if (name.endsWith("ey"))
32
+ return name + "s";
31
33
  if (name.endsWith("y"))
32
34
  return name.slice(0, -1) + "ies";
33
35
  if (name.endsWith("s") || name.endsWith("ch") || name.endsWith("sh") || name.endsWith("x") || name.endsWith("z"))
@@ -1803,15 +1805,12 @@ function mcdoc_string(type) {
1803
1805
  }).with({ name: "time_pattern" }, () => {
1804
1806
  return (args) => static_value3.time;
1805
1807
  }).with({ name: "translation_key" }, () => {
1806
- const TRANSLATION_KEYS = "TRANSLATION_KEYS";
1807
- const LiteralUnion = "LiteralUnion";
1808
+ const Registry = "::java::registry::Registry";
1808
1809
  return (args) => ({
1809
- type: factory17.createTypeReferenceNode(LiteralUnion, [
1810
- factory17.createTypeReferenceNode(TRANSLATION_KEYS)
1811
- ]),
1810
+ type: factory17.createIndexedAccessTypeNode(factory17.createTypeReferenceNode("Registry"), Bind.StringLiteral("minecraft:translation_key")),
1812
1811
  imports: {
1813
- ordered: [`sandstone::arguments::${TRANSLATION_KEYS}`, `sandstone::${LiteralUnion}`],
1814
- check: new Map([[`sandstone::arguments::${TRANSLATION_KEYS}`, 0], [`sandstone::${LiteralUnion}`, 1]])
1812
+ ordered: [Registry],
1813
+ check: new Map([[Registry, 0]])
1815
1814
  }
1816
1815
  });
1817
1816
  }).with({ name: "translation_value" }, () => {
@@ -2637,9 +2636,9 @@ class TypesGenerator {
2637
2636
  resolved_symbols = new Map;
2638
2637
  resolved_dispatchers = new Map;
2639
2638
  constructor() {}
2640
- resolve_types(symbols) {
2639
+ resolve_types(symbols, translation_keys) {
2641
2640
  console.log("registries");
2642
- this.resolve_registry_symbols(symbols);
2641
+ this.resolve_registry_symbols(symbols, translation_keys);
2643
2642
  const registry_exports = export_registry(this.resolved_registries);
2644
2643
  this.resolved_symbols.set("::java::registry", registry_exports);
2645
2644
  const dispatchers = symbols.getVisibleSymbols("mcdoc/dispatcher");
@@ -2656,12 +2655,12 @@ class TypesGenerator {
2656
2655
  const dispatcher_exports = export_dispatcher(this.resolved_dispatchers);
2657
2656
  this.resolved_symbols.set("mcdoc::dispatcher", dispatcher_exports);
2658
2657
  }
2659
- resolve_registry_symbols(registries) {
2660
- for (const registry_name of AllCategories) {
2658
+ resolve_registry_symbols(registries, translation_keys) {
2659
+ for (const registry_name of [...AllCategories]) {
2661
2660
  if (registry_name === "mcdoc" || registry_name === "mcdoc/dispatcher") {
2662
2661
  continue;
2663
2662
  }
2664
- const registry = Object.keys(registries.getVisibleSymbols(registry_name));
2663
+ const registry = registry_name === "translation_key" ? translation_keys : Object.keys(registries.getVisibleSymbols(registry_name));
2665
2664
  if (registry.length === 0)
2666
2665
  continue;
2667
2666
  const type_name = pluralize(registry_name.split("/").join("_")).toUpperCase();
@@ -2886,7 +2885,13 @@ function handle_imports(imports) {
2886
2885
  } else if (path[1] === "java") {
2887
2886
  file = `sandstone/arguments/generated/${path.slice(2).join("/")}.js`;
2888
2887
  } else if (path[0] === "sandstone") {
2889
- file = path.length === 1 ? "sandstone" : `${path.join("/")}.js`;
2888
+ if (path.length === 1) {
2889
+ file = "sandstone";
2890
+ } else if (path[1] === "arguments" && path.length === 2) {
2891
+ file = "sandstone/arguments";
2892
+ } else {
2893
+ file = `${path.join("/")}.js`;
2894
+ }
2890
2895
  } else {
2891
2896
  throw new Error(`[mcdoc_import] Unsupported import location "${path[0]}" in "${import_path}"`);
2892
2897
  }
@@ -2984,6 +2989,18 @@ async function fetchBlockStates(versionId) {
2984
2989
  }
2985
2990
  return [result, etag];
2986
2991
  }
2992
+ async function fetchTranslationKeys() {
2993
+ console.debug(`[fetchTranslationKeys] latest from github`);
2994
+ const result = new Map;
2995
+ try {
2996
+ const req = await fetchWithCache(`https://raw.githubusercontent.com/misode/mcmeta/refs/heads/assets-tiny/assets/minecraft/lang/en_us.json`);
2997
+ const data = await req.json();
2998
+ return Object.keys(data).map((key) => `minecraft:${key}`);
2999
+ } catch (e) {
3000
+ console.warn("Error occurred while fetching translation keys:", errorMessage(e));
3001
+ }
3002
+ return [];
3003
+ }
2987
3004
  var VanillaMcdocUri = "mcdoc://vanilla-mcdoc/symbols.json";
2988
3005
  function vanillaMcdocRegistrar(vanillaMcdoc) {
2989
3006
  return (symbols) => {
@@ -3058,7 +3075,7 @@ async function generate(options = {}) {
3058
3075
  await service.project.ready();
3059
3076
  await service.project.cacheService.save();
3060
3077
  const type_gen = new TypesGenerator;
3061
- type_gen.resolve_types(service.project.symbols);
3078
+ type_gen.resolve_types(service.project.symbols, await fetchTranslationKeys());
3062
3079
  for await (const [symbol_path, { exports, imports }] of type_gen.resolved_symbols.entries()) {
3063
3080
  const parts = symbol_path.split("::");
3064
3081
  if (parts[0] === "") {
@@ -3084,7 +3101,8 @@ async function generate(options = {}) {
3084
3101
  baseUrl: "./",
3085
3102
  paths: {
3086
3103
  sandstone: ["../sandstone-types/index.ts"],
3087
- "sandstone/arguments/generated/*": [`./*`]
3104
+ "sandstone/arguments": ["../sandstone-types/arguments/index.ts"],
3105
+ "sandstone/arguments/generated/*": ["./*"]
3088
3106
  }
3089
3107
  }
3090
3108
  }, null, 2));
package/dist/index.d.ts CHANGED
@@ -14,4 +14,5 @@ export declare function fetchVanillaMcdoc(): Promise<VanillaMcdocSymbols>;
14
14
  export declare function fetchRegistries(versionId: string): Promise<readonly [Map<string, string[]>, string]>;
15
15
  export type BlockStateData = [Record<string, string[]>, Record<string, string>];
16
16
  export declare function fetchBlockStates(versionId: string): Promise<readonly [Map<string, BlockStateData>, string]>;
17
+ export declare function fetchTranslationKeys(): Promise<string[]>;
17
18
  export declare function generate(options?: GeneratorOptions): Promise<void>;
package/dist/index.js CHANGED
@@ -26,6 +26,8 @@ function pascal_case(name) {
26
26
  return words.map((word) => word[0].toUpperCase() + word.slice(1)).join("");
27
27
  }
28
28
  function pluralize(name) {
29
+ if (name.endsWith("ey"))
30
+ return name + "s";
29
31
  if (name.endsWith("y"))
30
32
  return name.slice(0, -1) + "ies";
31
33
  if (name.endsWith("s") || name.endsWith("ch") || name.endsWith("sh") || name.endsWith("x") || name.endsWith("z"))
@@ -1801,15 +1803,12 @@ function mcdoc_string(type) {
1801
1803
  }).with({ name: "time_pattern" }, () => {
1802
1804
  return (args) => static_value3.time;
1803
1805
  }).with({ name: "translation_key" }, () => {
1804
- const TRANSLATION_KEYS = "TRANSLATION_KEYS";
1805
- const LiteralUnion = "LiteralUnion";
1806
+ const Registry = "::java::registry::Registry";
1806
1807
  return (args) => ({
1807
- type: factory17.createTypeReferenceNode(LiteralUnion, [
1808
- factory17.createTypeReferenceNode(TRANSLATION_KEYS)
1809
- ]),
1808
+ type: factory17.createIndexedAccessTypeNode(factory17.createTypeReferenceNode("Registry"), Bind.StringLiteral("minecraft:translation_key")),
1810
1809
  imports: {
1811
- ordered: [`sandstone::arguments::${TRANSLATION_KEYS}`, `sandstone::${LiteralUnion}`],
1812
- check: new Map([[`sandstone::arguments::${TRANSLATION_KEYS}`, 0], [`sandstone::${LiteralUnion}`, 1]])
1810
+ ordered: [Registry],
1811
+ check: new Map([[Registry, 0]])
1813
1812
  }
1814
1813
  });
1815
1814
  }).with({ name: "translation_value" }, () => {
@@ -2635,9 +2634,9 @@ class TypesGenerator {
2635
2634
  resolved_symbols = new Map;
2636
2635
  resolved_dispatchers = new Map;
2637
2636
  constructor() {}
2638
- resolve_types(symbols) {
2637
+ resolve_types(symbols, translation_keys) {
2639
2638
  console.log("registries");
2640
- this.resolve_registry_symbols(symbols);
2639
+ this.resolve_registry_symbols(symbols, translation_keys);
2641
2640
  const registry_exports = export_registry(this.resolved_registries);
2642
2641
  this.resolved_symbols.set("::java::registry", registry_exports);
2643
2642
  const dispatchers = symbols.getVisibleSymbols("mcdoc/dispatcher");
@@ -2654,12 +2653,12 @@ class TypesGenerator {
2654
2653
  const dispatcher_exports = export_dispatcher(this.resolved_dispatchers);
2655
2654
  this.resolved_symbols.set("mcdoc::dispatcher", dispatcher_exports);
2656
2655
  }
2657
- resolve_registry_symbols(registries) {
2658
- for (const registry_name of AllCategories) {
2656
+ resolve_registry_symbols(registries, translation_keys) {
2657
+ for (const registry_name of [...AllCategories]) {
2659
2658
  if (registry_name === "mcdoc" || registry_name === "mcdoc/dispatcher") {
2660
2659
  continue;
2661
2660
  }
2662
- const registry = Object.keys(registries.getVisibleSymbols(registry_name));
2661
+ const registry = registry_name === "translation_key" ? translation_keys : Object.keys(registries.getVisibleSymbols(registry_name));
2663
2662
  if (registry.length === 0)
2664
2663
  continue;
2665
2664
  const type_name = pluralize(registry_name.split("/").join("_")).toUpperCase();
@@ -2884,7 +2883,13 @@ function handle_imports(imports) {
2884
2883
  } else if (path[1] === "java") {
2885
2884
  file = `sandstone/arguments/generated/${path.slice(2).join("/")}.js`;
2886
2885
  } else if (path[0] === "sandstone") {
2887
- file = path.length === 1 ? "sandstone" : `${path.join("/")}.js`;
2886
+ if (path.length === 1) {
2887
+ file = "sandstone";
2888
+ } else if (path[1] === "arguments" && path.length === 2) {
2889
+ file = "sandstone/arguments";
2890
+ } else {
2891
+ file = `${path.join("/")}.js`;
2892
+ }
2888
2893
  } else {
2889
2894
  throw new Error(`[mcdoc_import] Unsupported import location "${path[0]}" in "${import_path}"`);
2890
2895
  }
@@ -2982,6 +2987,18 @@ async function fetchBlockStates(versionId) {
2982
2987
  }
2983
2988
  return [result, etag];
2984
2989
  }
2990
+ async function fetchTranslationKeys() {
2991
+ console.debug(`[fetchTranslationKeys] latest from github`);
2992
+ const result = new Map;
2993
+ try {
2994
+ const req = await fetchWithCache(`https://raw.githubusercontent.com/misode/mcmeta/refs/heads/assets-tiny/assets/minecraft/lang/en_us.json`);
2995
+ const data = await req.json();
2996
+ return Object.keys(data).map((key) => `minecraft:${key}`);
2997
+ } catch (e) {
2998
+ console.warn("Error occurred while fetching translation keys:", errorMessage(e));
2999
+ }
3000
+ return [];
3001
+ }
2985
3002
  var VanillaMcdocUri = "mcdoc://vanilla-mcdoc/symbols.json";
2986
3003
  function vanillaMcdocRegistrar(vanillaMcdoc) {
2987
3004
  return (symbols) => {
@@ -3056,7 +3073,7 @@ async function generate(options = {}) {
3056
3073
  await service.project.ready();
3057
3074
  await service.project.cacheService.save();
3058
3075
  const type_gen = new TypesGenerator;
3059
- type_gen.resolve_types(service.project.symbols);
3076
+ type_gen.resolve_types(service.project.symbols, await fetchTranslationKeys());
3060
3077
  for await (const [symbol_path, { exports, imports }] of type_gen.resolved_symbols.entries()) {
3061
3078
  const parts = symbol_path.split("::");
3062
3079
  if (parts[0] === "") {
@@ -3082,7 +3099,8 @@ async function generate(options = {}) {
3082
3099
  baseUrl: "./",
3083
3100
  paths: {
3084
3101
  sandstone: ["../sandstone-types/index.ts"],
3085
- "sandstone/arguments/generated/*": [`./*`]
3102
+ "sandstone/arguments": ["../sandstone-types/arguments/index.ts"],
3103
+ "sandstone/arguments/generated/*": ["./*"]
3086
3104
  }
3087
3105
  }
3088
3106
  }, null, 2));
@@ -3093,6 +3111,7 @@ export {
3093
3111
  mcdoc_raw,
3094
3112
  generate,
3095
3113
  fetchVanillaMcdoc,
3114
+ fetchTranslationKeys,
3096
3115
  fetchRegistries,
3097
3116
  fetchBlockStates
3098
3117
  };
@@ -31,7 +31,7 @@ export declare class TypesGenerator {
31
31
  readonly resolved_symbols: Map<string, ResolvedSymbol>;
32
32
  readonly resolved_dispatchers: Map<string, ResolvedDispatcher>;
33
33
  constructor();
34
- resolve_types(symbols: SymbolUtil): void;
34
+ resolve_types(symbols: SymbolUtil, translation_keys: string[]): void;
35
35
  private resolve_registry_symbols;
36
36
  private resolve_module_symbols;
37
37
  private resolve_dispatcher_symbols;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sandstone-mc/mcdoc-ts-generator",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Generate TypeScript types from Minecraft mcdoc definitions",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",