Dynamic Document Modification


In addition to snippets, ProbeJS in v4.6.0 also allows you to create Special. types or modify documents programmatically at runtime.

#Adding Special types

Special. types are widely used in ProbeJS's documents. For example, Special.Item is a union type of every item ID available in the current game, and it is used in Internal.ItemStack_ and other types to provide type hinting and suggestions:
To create a Special. type in KubeJS, no matter for later usage in documents or @type jsdoc annotation. Write:
ProbeJSEvents.generateDoc(event => {
    event.specialType("SussyBaka", [
        1, 2, 3, "\"sus\"", "\"lol\"", "Internal.ItemStack_"
    ])
})
And you will get the Special.SussyBaka like:
Note that the string literals (sus and lol) are guarded with "". Special type generation will not add quotes around inputs so you can create more flexible types.

#Modifying documents

With type created, it is also possible to blend them into parameters of methods, or just mess around with the original documents by transforming them.
Using the Special.Advancement as an example, we now try to modify the stage() in RecipeJS class to let it provides only suggestion of advancements when typed:
Recommended to read with /addons/third-party/probejs/document-properties.
ProbeJSEvents.generateDoc(event => {
    // So we will load the class and tell ProbeJS that we will transform the document of it
    event.transformDocument(Java.loadClass('dev.latvian.mods.kubejs.recipe.RecipeJS'), document => {

        // Find the first method with name "stage", it is also possible to find others by having more conditions
        document.methods.find(method => method.name == "stage")
            // Adds a property to modify the parameter, this will be explained in detail later
            .addPropertyJson({
                // The type of the property
                type: "property:modify",
                // The name of the property, property name will not change if this is omitted
                name: "sussy_baka",
                // The ordinal of the parameter to be modified
                index: 0,
                // The new type of property to be modified, type will not change if this is omitted
                newType: {
                    type: "type:primitive",
                    name: "Special.Advancement"
                }
            })
    })
})
And now we see a modified RecipeJS after dumping: