From ea1d87e16d4d56ea4758c2fca49d5dd4dce5b270 Mon Sep 17 00:00:00 2001 From: lcy0x1 Date: Mon, 28 Jul 2025 14:06:49 +0800 Subject: [PATCH] fix token sync --- build.gradle | 70 ++++++++++++------- gradle.properties | 6 +- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 2 +- .../d676ea5630e42c5ee829866be041f19350cce11f | 6 +- .../resources/assets/l2core/lang/en_ud.json | 4 +- .../resources/assets/l2core/lang/en_us.json | 4 +- .../conditionals/ClientDataHandler.java | 5 +- .../conditionals/NetworkSensitiveToken.java | 2 +- .../conditionals/TokenToClient.java | 11 +-- .../l2core/events/BaseCapabilityEvents.java | 8 +++ .../events/ClientEffectRenderEvents.java | 7 +- .../dev/xkmc/l2core/init/L2CoreConfig.java | 3 + .../init/reg/registrate/L2Registrate.java | 10 +-- .../l2core/mixin/CreativeModeTabMixin.java | 17 +++++ .../serial/recipe/AbstractSmithingRecipe.java | 3 +- .../resources/assets/l2core/lang/zh_cn.json | 4 +- src/main/resources/l2core.mixins.json | 3 +- 18 files changed, 113 insertions(+), 54 deletions(-) create mode 100644 src/main/java/dev/xkmc/l2core/mixin/CreativeModeTabMixin.java diff --git a/build.gradle b/build.gradle index 558064f..4a9e05d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,13 @@ + plugins { id 'java-library' id 'eclipse' id 'idea' id 'maven-publish' - id 'net.neoforged.gradle.userdev' version '7.0.165' + id 'net.neoforged.moddev' version '2.0.80' + id 'net.darkhax.curseforgegradle' version '[1.1.24,)' + id "at.stnwtr.gradle-secrets-plugin" version "1.0.1" + id "com.modrinth.minotaur" version "2.+" } version = mod_version @@ -17,37 +21,53 @@ base { archivesName = mod_id } +java { + withSourcesJar() +} + java.toolchain.languageVersion = JavaLanguageVersion.of(21) -minecraft.accessTransformers.file rootProject.file('src/main/resources/META-INF/accesstransformer.cfg') +sourceSets { + client {} + server {} + data {} + common {} +} -runs { - configureEach { - systemProperty 'forge.logging.markers', 'REGISTRIES' - systemProperty 'forge.logging.console.level', 'debug' - modSource project.sourceSets.main +neoForge { + // We currently only support NeoForge versions later than 21.0.x + // See https://projects.neoforged.net/neoforged/neoforge for the latest updates + version = "${neo_version}" + + // Validate AT files and raise errors when they have invalid targets + // This option is false by default, but turning it on is recommended + //validateAccessTransformers = true + accessTransformers.from "./src/main/resources/META-INF/accesstransformer.cfg" + + runs { + client { + client() + } + data { + data() + + programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() + + } + server { + server() + } } - client { - systemProperty 'forge.enabledGameTestNamespaces', project.mod_id - } - server { - systemProperty 'forge.enabledGameTestNamespaces', project.mod_id - } - gameTestServer { - systemProperty 'forge.enabledGameTestNamespaces', project.mod_id - } - data { - programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() + + mods { + "${mod_id}" { + sourceSet sourceSets.main + } } } sourceSets.main.resources { srcDir 'src/generated/resources' } - -dependencies { - implementation "net.neoforged:neoforge:${neo_version}" -} - tasks.withType(ProcessResources).configureEach { var replaceProperties = [ minecraft_version : minecraft_version, minecraft_version_range: minecraft_version_range, @@ -83,10 +103,6 @@ tasks.withType(JavaCompile).configureEach { if (lljij.toBoolean()) jarJar.enable() -java { - withSourcesJar() -} - jar { manifest { attributes([ diff --git a/gradle.properties b/gradle.properties index 271658f..ec001f0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,9 +8,11 @@ org.gradle.debug=false neogradle.subsystems.parchment.minecraftVersion=1.20.6 neogradle.subsystems.parchment.mappingsVersion=2024.06.02 +org.gradle.configuration-cache=false + minecraft_version=1.21.1 minecraft_version_range=[1.21.1,1.22) -neo_version=21.1.93 +neo_version=21.1.143 neo_version_range=[21.1.4,) loader_version_range=[2,) @@ -18,7 +20,7 @@ loader_version_range=[2,) mod_id=l2core mod_name=L2Core mod_license=LGPL-2.1 -mod_version=3.0.8+8 +mod_version=3.0.8+15 mod_group_id=dev.xkmc mod_authors=lcy0x1 mod_description=Core Library mod for all L2 mods diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2617362..707e499 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle index cb5265b..fd1434c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,5 +7,5 @@ pluginManagement { } plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0' + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' } \ No newline at end of file diff --git a/src/generated/resources/.cache/d676ea5630e42c5ee829866be041f19350cce11f b/src/generated/resources/.cache/d676ea5630e42c5ee829866be041f19350cce11f index d36d103..618f6bb 100644 --- a/src/generated/resources/.cache/d676ea5630e42c5ee829866be041f19350cce11f +++ b/src/generated/resources/.cache/d676ea5630e42c5ee829866be041f19350cce11f @@ -1,4 +1,4 @@ -// 1.21 2024-07-25T11:38:15.636395 Registrate Provider for l2core [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider, Tags (mob_effect), Tags (attribute), Tags (enchantment)] -7fd8a37c6437c7cab27c53dbc0df73ececc1cd44 assets/l2core/lang/en_ud.json -18ae34417262501a3c00959390185e01ffb2ae7c assets/l2core/lang/en_us.json +// 1.21.1 2025-07-26T01:42:31.138209 Registrate Provider for l2core [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider, Tags (mob_effect), Tags (attribute), Tags (enchantment)] +72a986cabe624a799bdb74cc1b5e67dd6f80baed assets/l2core/lang/en_ud.json +9eab006827655c8a83941f5d9c71681a1244378c assets/l2core/lang/en_us.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/l2core/tags/mob_effect/tracked_effects.json diff --git a/src/generated/resources/assets/l2core/lang/en_ud.json b/src/generated/resources/assets/l2core/lang/en_ud.json index fe9fc87..a1903e5 100644 --- a/src/generated/resources/assets/l2core/lang/en_ud.json +++ b/src/generated/resources/assets/l2core/lang/en_ud.json @@ -2,7 +2,9 @@ "l2core.configuration.addEnchantmentDescription": "suoıʇdıɹɔsǝᗡ ʇuǝɯʇuɐɥɔuƎ ppⱯ", "l2core.configuration.addEnchantmentDescription.tooltip": "SʎⱯMꞀⱯ 'ʎꞀNO‾⟘ℲIHS 'ƎꞀᗺⱯSIᗡ :sǝnןɐΛ pǝʍoןןⱯ", "l2core.configuration.overlayZVal": "ʎɐןɹǝʌo ɹǝʇɔɐɹɐɥɔ ɯǝʇı ɟo ʇɥbıǝɥ ǝɥ⟘", - "l2core.configuration.overlayZVal.tooltip": "000000Ɩ ~ 000000Ɩ- :ǝbuɐᴚ", + "l2core.configuration.overlayZVal.tooltip": "000000Ɩ ~ 000000Ɩ- :ǝbuɐᴚ \n0ϛᄅ :ʇןnɐɟǝᗡ ", + "l2core.configuration.renderOverlayIcons": "sǝıʇıʇuǝ uo suoɔı ʎɐןɹǝʌo ɹǝpuǝᴚ", + "l2core.configuration.renderOverlayIcons.tooltip": "", "l2core.configuration.section.l2configs.l2core.client.toml": "uoıʇɐɹnbıɟuoƆ ʇuǝıןƆ ǝɹoƆᄅꞀ", "l2core.configuration.section.l2configs.l2core.client.toml.title": "uoıʇɐɹnbıɟuoƆ ʇuǝıןƆ ǝɹoƆᄅꞀ", "l2core.configuration.title": "uoıʇɐɹnbıɟuoƆ ǝɹoƆᄅꞀ", diff --git a/src/generated/resources/assets/l2core/lang/en_us.json b/src/generated/resources/assets/l2core/lang/en_us.json index ee97a7f..3520585 100644 --- a/src/generated/resources/assets/l2core/lang/en_us.json +++ b/src/generated/resources/assets/l2core/lang/en_us.json @@ -2,7 +2,9 @@ "l2core.configuration.addEnchantmentDescription": "Add Enchantment Descriptions", "l2core.configuration.addEnchantmentDescription.tooltip": "Allowed Values: DISABLE, SHIFT_ONLY, ALWAYS", "l2core.configuration.overlayZVal": "The height of item character overlay", - "l2core.configuration.overlayZVal.tooltip": "Range: -1000000 ~ 1000000", + "l2core.configuration.overlayZVal.tooltip": " Default: 250\n Range: -1000000 ~ 1000000", + "l2core.configuration.renderOverlayIcons": "Render overlay icons on entities", + "l2core.configuration.renderOverlayIcons.tooltip": "", "l2core.configuration.section.l2configs.l2core.client.toml": "L2Core Client Configuration", "l2core.configuration.section.l2configs.l2core.client.toml.title": "L2Core Client Configuration", "l2core.configuration.title": "L2Core Configuration", diff --git a/src/main/java/dev/xkmc/l2core/capability/conditionals/ClientDataHandler.java b/src/main/java/dev/xkmc/l2core/capability/conditionals/ClientDataHandler.java index aeab3b9..b18e111 100644 --- a/src/main/java/dev/xkmc/l2core/capability/conditionals/ClientDataHandler.java +++ b/src/main/java/dev/xkmc/l2core/capability/conditionals/ClientDataHandler.java @@ -2,14 +2,17 @@ package dev.xkmc.l2core.capability.conditionals; import dev.xkmc.l2core.init.L2LibReg; import dev.xkmc.l2core.util.Proxy; +import dev.xkmc.l2serial.serialization.codec.PacketCodec; import dev.xkmc.l2serial.util.Wrappers; import net.minecraft.world.entity.player.Player; public class ClientDataHandler { - public static void handle(TokenKey key, T token) { + public static void handle(TokenKey key, byte[] data) { Player player = Proxy.getClientPlayer(); if (player == null) return; + var buf = PacketCodec.decode(player.registryAccess(), data); + T token = Wrappers.cast(PacketCodec.from(buf, ConditionalToken.class, null)); ConditionalToken old = L2LibReg.CONDITIONAL.type().getOrCreate(player).data.put(key, token); if (token instanceof NetworkSensitiveToken t) { t.onSync(Wrappers.cast(old), player); diff --git a/src/main/java/dev/xkmc/l2core/capability/conditionals/NetworkSensitiveToken.java b/src/main/java/dev/xkmc/l2core/capability/conditionals/NetworkSensitiveToken.java index b03de89..c4f1c0f 100644 --- a/src/main/java/dev/xkmc/l2core/capability/conditionals/NetworkSensitiveToken.java +++ b/src/main/java/dev/xkmc/l2core/capability/conditionals/NetworkSensitiveToken.java @@ -10,7 +10,7 @@ public interface NetworkSensitiveToken { void onSync(@Nullable T old, Player player); default void sync(TokenKey key, T token, ServerPlayer sp) { - L2Core.PACKET_HANDLER.toClientPlayer(TokenToClient.of(key, token), sp); + L2Core.PACKET_HANDLER.toClientPlayer(TokenToClient.of(sp.registryAccess(), key, token), sp); } } diff --git a/src/main/java/dev/xkmc/l2core/capability/conditionals/TokenToClient.java b/src/main/java/dev/xkmc/l2core/capability/conditionals/TokenToClient.java index 4e12cbc..dbfbded 100644 --- a/src/main/java/dev/xkmc/l2core/capability/conditionals/TokenToClient.java +++ b/src/main/java/dev/xkmc/l2core/capability/conditionals/TokenToClient.java @@ -1,20 +1,23 @@ package dev.xkmc.l2core.capability.conditionals; import dev.xkmc.l2serial.network.SerialPacketBase; +import dev.xkmc.l2serial.serialization.codec.PacketCodec; +import net.minecraft.core.RegistryAccess; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.Nullable; -public record TokenToClient(ResourceLocation id, ConditionalToken token) +public record TokenToClient(ResourceLocation id, byte[] data) implements SerialPacketBase { - public static TokenToClient of(TokenKey key, T token) { - return new TokenToClient(key.asLocation(), token); + public static TokenToClient of(RegistryAccess access, TokenKey key, T token) { + var data = PacketCodec.toBytes(access, token, ConditionalToken.class, e -> true); + return new TokenToClient(key.asLocation(), data); } @Override public void handle(@Nullable Player player) { - ClientDataHandler.handle(TokenKey.of(id), token); + ClientDataHandler.handle(TokenKey.of(id), data); } } diff --git a/src/main/java/dev/xkmc/l2core/events/BaseCapabilityEvents.java b/src/main/java/dev/xkmc/l2core/events/BaseCapabilityEvents.java index c261529..2527a2f 100644 --- a/src/main/java/dev/xkmc/l2core/events/BaseCapabilityEvents.java +++ b/src/main/java/dev/xkmc/l2core/events/BaseCapabilityEvents.java @@ -6,6 +6,7 @@ import net.minecraft.server.level.ServerPlayer; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.EntityJoinLevelEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.event.tick.PlayerTickEvent; @@ -25,6 +26,13 @@ public class BaseCapabilityEvents { for (PlayerCapabilityHolder holder : PlayerCapabilityHolder.INTERNAL_MAP.values()) { ServerPlayer e = (ServerPlayer) event.getEntity(); holder.getOrCreate(e).onClone(e, event.isWasDeath()); + } + } + + @SubscribeEvent(priority = EventPriority.LOW) + public static void onPlayerJoinLevel(EntityJoinLevelEvent event) { + if (!(event.getEntity() instanceof ServerPlayer e)) return; + for (PlayerCapabilityHolder holder : PlayerCapabilityHolder.INTERNAL_MAP.values()) { holder.network.toClient(e); holder.network.toTracking(e); } diff --git a/src/main/java/dev/xkmc/l2core/events/ClientEffectRenderEvents.java b/src/main/java/dev/xkmc/l2core/events/ClientEffectRenderEvents.java index 3ac03c1..c18f5ab 100644 --- a/src/main/java/dev/xkmc/l2core/events/ClientEffectRenderEvents.java +++ b/src/main/java/dev/xkmc/l2core/events/ClientEffectRenderEvents.java @@ -9,6 +9,7 @@ import dev.xkmc.l2core.base.effects.ClientEffectCap; import dev.xkmc.l2core.base.effects.EffectToClient; import dev.xkmc.l2core.base.effects.api.*; import dev.xkmc.l2core.init.L2Core; +import dev.xkmc.l2core.init.L2CoreConfig; import dev.xkmc.l2core.init.L2LibReg; import dev.xkmc.l2core.util.Proxy; import net.minecraft.Util; @@ -83,7 +84,11 @@ public class ClientEffectRenderEvents { @SubscribeEvent public static void levelRenderLast(RenderLevelStageEvent event) { if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_WEATHER) return; - + if (ICONS.isEmpty()) return; + if (!L2CoreConfig.CLIENT.renderOverlayIcons.get()) { + ICONS.clear(); + return; + } DUMMY.setupRenderState(); DUMMY.clearRenderState(); MultiBufferSource.BufferSource buffers = Minecraft.getInstance().renderBuffers().bufferSource(); diff --git a/src/main/java/dev/xkmc/l2core/init/L2CoreConfig.java b/src/main/java/dev/xkmc/l2core/init/L2CoreConfig.java index 96090a6..1c3236d 100644 --- a/src/main/java/dev/xkmc/l2core/init/L2CoreConfig.java +++ b/src/main/java/dev/xkmc/l2core/init/L2CoreConfig.java @@ -10,6 +10,7 @@ public class L2CoreConfig { public final ModConfigSpec.IntValue overlayZVal; public final ModConfigSpec.EnumValue addEnchantmentDescription; + public final ModConfigSpec.BooleanValue renderOverlayIcons; Client(Builder builder) { markL2(); @@ -17,6 +18,8 @@ public class L2CoreConfig { .defineInRange("overlayZVal", 250, -1000000, 1000000); addEnchantmentDescription = builder.text("Add Enchantment Descriptions") .defineEnum("addEnchantmentDescription", ClientEventHandler.EnchDesc.ALWAYS); + renderOverlayIcons = builder.text("Render overlay icons on entities") + .define("renderOverlayIcons", true); } } diff --git a/src/main/java/dev/xkmc/l2core/init/reg/registrate/L2Registrate.java b/src/main/java/dev/xkmc/l2core/init/reg/registrate/L2Registrate.java index 1784fcd..e52c645 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/registrate/L2Registrate.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/registrate/L2Registrate.java @@ -14,6 +14,7 @@ import dev.xkmc.l2core.init.L2Core; import dev.xkmc.l2core.init.reg.simple.Val; import dev.xkmc.l2core.util.ConfigInit; import dev.xkmc.l2serial.serialization.custom_handler.CodecHandler; +import dev.xkmc.l2serial.serialization.custom_handler.Handlers; import dev.xkmc.l2serial.util.ModContainerHack; import dev.xkmc.l2serial.util.Wrappers; import net.minecraft.client.particle.ParticleEngine; @@ -21,7 +22,6 @@ import net.minecraft.client.particle.ParticleProvider; import net.minecraft.core.Registry; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleType; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.network.codec.ByteBufCodecs; @@ -146,6 +146,7 @@ public class L2Registrate extends AbstractRegistrate { cons.accept(ans); var reg = ans.create(); new CodecHandler<>(Wrappers.cast(cls), reg.byNameCodec(), ByteBufCodecs.fromCodecWithRegistries(reg.byNameCodec())); + Handlers.registerReg(Wrappers.cast(cls), key); OneTimeEventReceiver.addModListener(this, NewRegistryEvent.class, (e) -> e.register(reg)); return new RegistryInstance<>(reg, key); } @@ -246,13 +247,6 @@ public class L2Registrate extends AbstractRegistrate { before = e.id; } } - for (var e : BuiltInRegistries.CREATIVE_MODE_TAB.entrySet()) { - var id = e.getKey().location(); - if (known(id) || known(e.getValue())) { - continue; - } - b.withTabsAfter(id); - } } private static boolean known(ResourceLocation id) { diff --git a/src/main/java/dev/xkmc/l2core/mixin/CreativeModeTabMixin.java b/src/main/java/dev/xkmc/l2core/mixin/CreativeModeTabMixin.java new file mode 100644 index 0000000..1d34b5e --- /dev/null +++ b/src/main/java/dev/xkmc/l2core/mixin/CreativeModeTabMixin.java @@ -0,0 +1,17 @@ +package dev.xkmc.l2core.mixin; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.CreativeModeTab; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(CreativeModeTab.class) +public class CreativeModeTabMixin { + + @Override + public String toString() { + CreativeModeTab tab = (CreativeModeTab) (Object) this; + var key = BuiltInRegistries.CREATIVE_MODE_TAB.getKey(tab); + return key == null ? "[Unregistered]" : key.toString(); + } + +} diff --git a/src/main/java/dev/xkmc/l2core/serial/recipe/AbstractSmithingRecipe.java b/src/main/java/dev/xkmc/l2core/serial/recipe/AbstractSmithingRecipe.java index 9d89909..047858f 100644 --- a/src/main/java/dev/xkmc/l2core/serial/recipe/AbstractSmithingRecipe.java +++ b/src/main/java/dev/xkmc/l2core/serial/recipe/AbstractSmithingRecipe.java @@ -5,6 +5,7 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.SmithingTransformRecipe; @@ -14,7 +15,7 @@ import javax.annotation.ParametersAreNonnullByDefault; @MethodsReturnNonnullByDefault public abstract class AbstractSmithingRecipe> extends SmithingTransformRecipe { - public static final Ingredient TEMPLATE_PLACEHOLDER = Ingredient.EMPTY; + public static final Ingredient TEMPLATE_PLACEHOLDER = Ingredient.of(Items.PAPER); public AbstractSmithingRecipe(Ingredient template, Ingredient base, Ingredient addition, ItemStack result) { super(template, base, addition, result); diff --git a/src/main/resources/assets/l2core/lang/zh_cn.json b/src/main/resources/assets/l2core/lang/zh_cn.json index 6b85abc..031af3a 100644 --- a/src/main/resources/assets/l2core/lang/zh_cn.json +++ b/src/main/resources/assets/l2core/lang/zh_cn.json @@ -6,5 +6,7 @@ "l2core.configuration.overlayZVal.tooltip": "默认值:250", "l2core.configuration.section.l2configs.l2core.client.toml": "莱特兰核心 - 客户端配置", "l2core.configuration.section.l2configs.l2core.client.toml.title": "莱特兰核心 - 客户端配置", - "l2core.configuration.title": "莱特兰核心 - 配置" + "l2core.configuration.title": "莱特兰核心 - 配置", + "l2core.configuration.renderOverlayIcons": "实体图标显示", + "l2core.configuration.renderOverlayIcons.tooltip": "" } \ No newline at end of file diff --git a/src/main/resources/l2core.mixins.json b/src/main/resources/l2core.mixins.json index 2c6ac9c..55e3f7e 100644 --- a/src/main/resources/l2core.mixins.json +++ b/src/main/resources/l2core.mixins.json @@ -4,11 +4,12 @@ "package": "dev.xkmc.l2core.mixin", "compatibilityLevel": "JAVA_21", "mixins": [ + "CreativeModeTabMixin" ], "client": [ ], "injectors": { - "defaultRequire": 1 + "defaultRequire": 1 }, "minVersion": "0.8" }