More Niagara tests

This commit is contained in:
barsdeveloper
2024-11-08 22:36:44 +01:00
parent 73176a8102
commit 007eec971b
19 changed files with 324 additions and 203 deletions

50
dist/ueblueprint.js vendored
View File

@@ -3768,6 +3768,9 @@ function nodeColor(entity) {
if (entity.bIsPureFunc?.valueOf()) {
return Configuration.nodeColors.green
}
if (entity["Input"]?.["Name"]) {
return Configuration.nodeColors.gray
}
return Configuration.nodeColors.blue
}
@@ -4218,8 +4221,9 @@ function nodeTitle(entity) {
if (className === Configuration.paths.macro) {
return Utility.formatStringName(entity.MacroGraphReference?.getMacroName())
}
if (entity.isMaterial() && entity.getMaterialSubobject()) {
let result = nodeTitle(entity.getMaterialSubobject());
const materialSubobject = entity.getMaterialSubobject();
if (materialSubobject) {
let result = nodeTitle(materialSubobject);
result = result.match(/Material Expression (.+)/)?.[1] ?? result;
return result
}
@@ -4425,7 +4429,10 @@ function nodeTitle(entity) {
className.startsWith(prefix = "/Script/NiagaraEditor.NiagaraNodeParameter")
|| className.startsWith(prefix = "/Script/NiagaraEditor.NiagaraNode")
) {
return Utility.formatStringName(className.substring(prefix.length))
return entity["Input"]?.["Name"]?.toString() ?? Utility.formatStringName(className.substring(prefix.length))
}
if (entity.ParameterName) {
return entity.ParameterName.toString()
}
return Utility.formatStringName(entity.getNameAndCounter()[0])
}
@@ -6282,8 +6289,11 @@ class ObjectEntity extends IEntity {
SizeX: MirroredEntity.of(IntegerEntity),
SizeY: MirroredEntity.of(IntegerEntity),
Text: MirroredEntity.of(StringEntity),
ParameterName: StringEntity,
ExpressionGUID: GuidEntity,
MaterialExpressionEditorX: MirroredEntity.of(IntegerEntity),
MaterialExpressionEditorY: MirroredEntity.of(IntegerEntity),
MaterialExpressionGuid: GuidEntity,
NodeTitle: StringEntity,
NodeTitleColor: LinearColorEntity,
PositionX: MirroredEntity.of(IntegerEntity),
@@ -6376,20 +6386,20 @@ class ObjectEntity extends IEntity {
super(values);
// Attributes
/** @type {ArrayEntity<typeof PinEntity | typeof UnknownPinEntity>} */ this.CustomProperties;
/** @type {InstanceType<typeof ObjectEntity.attributes.AddedPins>} */ this.AddedPins;
/** @type {InstanceType<typeof ObjectEntity.attributes.AdvancedPinDisplay>} */ this.AdvancedPinDisplay;
/** @type {InstanceType<typeof ObjectEntity.attributes.Archetype>} */ this.Archetype;
/** @type {InstanceType<typeof ObjectEntity.attributes.AxisKey>} */ this.AxisKey;
/** @type {InstanceType<typeof ObjectEntity.attributes.bIsPureFunc>} */ this.bIsPureFunc;
/** @type {InstanceType<typeof ObjectEntity.attributes.BlueprintElementInstance>} */ this.BlueprintElementInstance;
/** @type {InstanceType<typeof ObjectEntity.attributes.ConstA>} */ this.ConstA;
/** @type {InstanceType<typeof ObjectEntity.attributes.ConstB>} */ this.ConstB;
/** @type {InstanceType<typeof ObjectEntity.attributes.BlueprintElementType>} */ this.BlueprintElementType;
/** @type {InstanceType<typeof ObjectEntity.attributes.Class>} */ this.Class;
/** @type {InstanceType<typeof ObjectEntity.attributes.CommentColor>} */ this.CommentColor;
/** @type {InstanceType<typeof ObjectEntity.attributes.ComponentPropertyName>} */ this.ComponentPropertyName;
/** @type {InstanceType<typeof ObjectEntity.attributes.ConstA>} */ this.ConstA;
/** @type {InstanceType<typeof ObjectEntity.attributes.ConstB>} */ this.ConstB;
/** @type {InstanceType<typeof ObjectEntity.attributes.CustomFunctionName>} */ this.CustomFunctionName;
/** @type {ArrayEntity<typeof PinEntity | typeof UnknownPinEntity>} */ this.CustomProperties;
/** @type {InstanceType<typeof ObjectEntity.attributes.DelegatePropertyName>} */ this.DelegatePropertyName;
/** @type {InstanceType<typeof ObjectEntity.attributes.DelegateReference>} */ this.DelegateReference;
/** @type {InstanceType<typeof ObjectEntity.attributes.EnabledState>} */ this.EnabledState;
@@ -6428,9 +6438,10 @@ class ObjectEntity extends IEntity {
/** @type {InstanceType<typeof ObjectEntity.attributes.Operation>} */ this.Operation;
/** @type {InstanceType<typeof ObjectEntity.attributes.OpName>} */ this.OpName;
/** @type {InstanceType<typeof ObjectEntity.attributes.OutputPins>} */ this.OutputPins;
/** @type {InstanceType<typeof ObjectEntity.attributes.ParameterName>} */ this.ParameterName;
/** @type {InstanceType<typeof ObjectEntity.attributes.PCGNode>} */ this.PCGNode;
/** @type {InstanceType<typeof ObjectEntity.attributes.PinTags>} */ this.PinTags;
/** @type {InstanceType<typeof ObjectEntity.attributes.PinNames>} */ this.PinNames;
/** @type {InstanceType<typeof ObjectEntity.attributes.PinTags>} */ this.PinTags;
/** @type {InstanceType<typeof ObjectEntity.attributes.PositionX>} */ this.PositionX;
/** @type {InstanceType<typeof ObjectEntity.attributes.PositionY>} */ this.PositionY;
/** @type {InstanceType<typeof ObjectEntity.attributes.ProxyFactoryFunctionName>} */ this.ProxyFactoryFunctionName;
@@ -6738,24 +6749,10 @@ class ObjectEntity extends IEntity {
}
isMaterial() {
return this.getClass() === Configuration.paths.materialGraphNode
// return [
// Configuration.paths.materialExpressionConstant,
// Configuration.paths.materialExpressionConstant2Vector,
// Configuration.paths.materialExpressionConstant3Vector,
// Configuration.paths.materialExpressionConstant4Vector,
// Configuration.paths.materialExpressionLogarithm,
// Configuration.paths.materialExpressionLogarithm10,
// Configuration.paths.materialExpressionLogarithm2,
// Configuration.paths.materialExpressionMaterialFunctionCall,
// Configuration.paths.materialExpressionSquareRoot,
// Configuration.paths.materialExpressionTextureCoordinate,
// Configuration.paths.materialExpressionTextureSample,
// Configuration.paths.materialGraphNode,
// Configuration.paths.materialGraphNodeComment,
// ]
// .includes(this.getClass())
const classValue = this.getClass();
return classValue.startsWith("/Script/Engine.MaterialExpression")
|| classValue.startsWith("/Script/InterchangeImport.MaterialExpression")
|| classValue.startsWith("/Script/UnrealEd.MaterialGraph")
}
/** @return {ObjectEntity} */
@@ -8518,12 +8515,13 @@ function nodeSubtitle(entity) {
switch (entity.getType()) {
case Configuration.paths.addDelegate:
case Configuration.paths.clearDelegate:
case Configuration.paths.callDelegate:
case Configuration.paths.removeDelegate:
return null
}
const targetPin = entity
.getPinEntities()
.find(pin => pin.PinName?.toString() === "self" && pinTitle(pin) === "Target");
.find(pin => !pin.isHidden() && pin.PinName?.toString() === "self" && pinTitle(pin) === "Target");
if (targetPin) {
const target = entity.FunctionReference?.MemberParent?.getName()
?? targetPin.PinType?.PinSubCategoryObject?.getName()

File diff suppressed because one or more lines are too long

View File

@@ -76,5 +76,8 @@ export default function nodeColor(entity) {
if (entity.bIsPureFunc?.valueOf()) {
return Configuration.nodeColors.green
}
if (entity["Input"]?.["Name"]) {
return Configuration.nodeColors.gray
}
return Configuration.nodeColors.blue
}

View File

@@ -10,12 +10,13 @@ export default function nodeSubtitle(entity) {
switch (entity.getType()) {
case Configuration.paths.addDelegate:
case Configuration.paths.clearDelegate:
case Configuration.paths.callDelegate:
case Configuration.paths.removeDelegate:
return null
}
const targetPin = entity
.getPinEntities()
.find(pin => pin.PinName?.toString() === "self" && pinTitle(pin) === "Target")
.find(pin => !pin.isHidden() && pin.PinName?.toString() === "self" && pinTitle(pin) === "Target")
if (targetPin) {
const target = entity.FunctionReference?.MemberParent?.getName()
?? targetPin.PinType?.PinSubCategoryObject?.getName()

View File

@@ -250,8 +250,9 @@ export default function nodeTitle(entity) {
if (className === Configuration.paths.macro) {
return Utility.formatStringName(entity.MacroGraphReference?.getMacroName())
}
if (entity.isMaterial() && entity.getMaterialSubobject()) {
let result = nodeTitle(entity.getMaterialSubobject())
const materialSubobject = entity.getMaterialSubobject()
if (materialSubobject) {
let result = nodeTitle(materialSubobject)
result = result.match(/Material Expression (.+)/)?.[1] ?? result
return result
}
@@ -457,7 +458,10 @@ export default function nodeTitle(entity) {
className.startsWith(prefix = "/Script/NiagaraEditor.NiagaraNodeParameter")
|| className.startsWith(prefix = "/Script/NiagaraEditor.NiagaraNode")
) {
return Utility.formatStringName(className.substring(prefix.length))
return entity["Input"]?.["Name"]?.toString() ?? Utility.formatStringName(className.substring(prefix.length))
}
if (entity.ParameterName) {
return entity.ParameterName.toString()
}
return Utility.formatStringName(entity.getNameAndCounter()[0])
}

View File

@@ -107,8 +107,11 @@ export default class ObjectEntity extends IEntity {
SizeX: MirroredEntity.of(IntegerEntity),
SizeY: MirroredEntity.of(IntegerEntity),
Text: MirroredEntity.of(StringEntity),
ParameterName: StringEntity,
ExpressionGUID: GuidEntity,
MaterialExpressionEditorX: MirroredEntity.of(IntegerEntity),
MaterialExpressionEditorY: MirroredEntity.of(IntegerEntity),
MaterialExpressionGuid: GuidEntity,
NodeTitle: StringEntity,
NodeTitleColor: LinearColorEntity,
PositionX: MirroredEntity.of(IntegerEntity),
@@ -201,20 +204,20 @@ export default class ObjectEntity extends IEntity {
super(values)
// Attributes
/** @type {ArrayEntity<typeof PinEntity | typeof UnknownPinEntity>} */ this.CustomProperties
/** @type {InstanceType<typeof ObjectEntity.attributes.AddedPins>} */ this.AddedPins
/** @type {InstanceType<typeof ObjectEntity.attributes.AdvancedPinDisplay>} */ this.AdvancedPinDisplay
/** @type {InstanceType<typeof ObjectEntity.attributes.Archetype>} */ this.Archetype
/** @type {InstanceType<typeof ObjectEntity.attributes.AxisKey>} */ this.AxisKey
/** @type {InstanceType<typeof ObjectEntity.attributes.bIsPureFunc>} */ this.bIsPureFunc
/** @type {InstanceType<typeof ObjectEntity.attributes.BlueprintElementInstance>} */ this.BlueprintElementInstance
/** @type {InstanceType<typeof ObjectEntity.attributes.ConstA>} */ this.ConstA
/** @type {InstanceType<typeof ObjectEntity.attributes.ConstB>} */ this.ConstB
/** @type {InstanceType<typeof ObjectEntity.attributes.BlueprintElementType>} */ this.BlueprintElementType
/** @type {InstanceType<typeof ObjectEntity.attributes.Class>} */ this.Class
/** @type {InstanceType<typeof ObjectEntity.attributes.CommentColor>} */ this.CommentColor
/** @type {InstanceType<typeof ObjectEntity.attributes.ComponentPropertyName>} */ this.ComponentPropertyName
/** @type {InstanceType<typeof ObjectEntity.attributes.ConstA>} */ this.ConstA
/** @type {InstanceType<typeof ObjectEntity.attributes.ConstB>} */ this.ConstB
/** @type {InstanceType<typeof ObjectEntity.attributes.CustomFunctionName>} */ this.CustomFunctionName
/** @type {ArrayEntity<typeof PinEntity | typeof UnknownPinEntity>} */ this.CustomProperties
/** @type {InstanceType<typeof ObjectEntity.attributes.DelegatePropertyName>} */ this.DelegatePropertyName
/** @type {InstanceType<typeof ObjectEntity.attributes.DelegateReference>} */ this.DelegateReference
/** @type {InstanceType<typeof ObjectEntity.attributes.EnabledState>} */ this.EnabledState
@@ -253,9 +256,10 @@ export default class ObjectEntity extends IEntity {
/** @type {InstanceType<typeof ObjectEntity.attributes.Operation>} */ this.Operation
/** @type {InstanceType<typeof ObjectEntity.attributes.OpName>} */ this.OpName
/** @type {InstanceType<typeof ObjectEntity.attributes.OutputPins>} */ this.OutputPins
/** @type {InstanceType<typeof ObjectEntity.attributes.ParameterName>} */ this.ParameterName
/** @type {InstanceType<typeof ObjectEntity.attributes.PCGNode>} */ this.PCGNode
/** @type {InstanceType<typeof ObjectEntity.attributes.PinTags>} */ this.PinTags
/** @type {InstanceType<typeof ObjectEntity.attributes.PinNames>} */ this.PinNames
/** @type {InstanceType<typeof ObjectEntity.attributes.PinTags>} */ this.PinTags
/** @type {InstanceType<typeof ObjectEntity.attributes.PositionX>} */ this.PositionX
/** @type {InstanceType<typeof ObjectEntity.attributes.PositionY>} */ this.PositionY
/** @type {InstanceType<typeof ObjectEntity.attributes.ProxyFactoryFunctionName>} */ this.ProxyFactoryFunctionName
@@ -565,24 +569,10 @@ export default class ObjectEntity extends IEntity {
}
isMaterial() {
return this.getClass() === Configuration.paths.materialGraphNode
// return [
// Configuration.paths.materialExpressionConstant,
// Configuration.paths.materialExpressionConstant2Vector,
// Configuration.paths.materialExpressionConstant3Vector,
// Configuration.paths.materialExpressionConstant4Vector,
// Configuration.paths.materialExpressionLogarithm,
// Configuration.paths.materialExpressionLogarithm10,
// Configuration.paths.materialExpressionLogarithm2,
// Configuration.paths.materialExpressionMaterialFunctionCall,
// Configuration.paths.materialExpressionSquareRoot,
// Configuration.paths.materialExpressionTextureCoordinate,
// Configuration.paths.materialExpressionTextureSample,
// Configuration.paths.materialGraphNode,
// Configuration.paths.materialGraphNodeComment,
// ]
// .includes(this.getClass())
const classValue = this.getClass()
return classValue.startsWith("/Script/Engine.MaterialExpression")
|| classValue.startsWith("/Script/InterchangeImport.MaterialExpression")
|| classValue.startsWith("/Script/UnrealEd.MaterialGraph")
}
/** @return {ObjectEntity} */

310
tests/fixtures/test.js vendored
View File

@@ -47,156 +47,168 @@ export * from "@playwright/test"
/** @param {TestData} testData */
export function testNode(testData) {
test.describe(testData.name, () => {
test.beforeAll(async ({ blueprintPage }) => {
await blueprintPage.removeNodes()
await blueprintPage.paste(testData.value)
})
testData.title ??= testData.name
if (testData.color) {
test(
`${testData.name}: Has correct color`,
async ({ blueprintPage }) => {
expect(
await blueprintPage.node.evaluate(node => node.entity.nodeColor().toString())
).toBe(testData.color.toString())
}
)
}
test(
`${testData.name}: Has correct delegate`,
async ({ blueprintPage }) => {
const delegate = blueprintPage.blueprintLocator.locator(
'ueb-node .ueb-node-top ueb-pin[data-type="delegate"]'
)
if (testData.delegate) {
await expect(delegate).toBeVisible()
} else {
await expect(delegate).toBeHidden()
}
}
)
test(
`${testData.name}: Has title ${testData.title}`,
async ({ blueprintPage }) => expect(
await blueprintPage.node.evaluate(node => node.nodeDisplayName)
).toBe(testData.title)
)
if (testData.subtitle) {
test(
`${testData.name}: Has expected subtitle ${testData.subtitle}`,
async ({ blueprintPage }) => await expect(blueprintPage.node.locator(".ueb-node-subtitle-text"))
.toHaveText(testData.subtitle, { useInnerText: true })
)
}
if (testData.size) {
test(
`${testData.name}: Has approximately the expected size`,
async ({ blueprintPage }) => {
const expectedSize = await blueprintPage.node.evaluate(
(node, gridSize) => {
const bounding = node.getBoundingClientRect()
const expectedSize = [bounding.width / gridSize, bounding.height / gridSize]
return expectedSize
},
Configuration.gridSize
)
expect(Math.abs(testData.size[0] - expectedSize[0])).toBeLessThanOrEqual(1.5)
expect(Math.abs(testData.size[1] - expectedSize[1])).toBeLessThanOrEqual(1.5)
if (
Math.abs(testData.size[0] - expectedSize[0]) > 0.6
|| Math.abs(testData.size[1] - expectedSize[1]) > 0.6
) {
console.error(`Node "${testData.name}" size does not match`)
}
}
)
}
if (testData.icon !== undefined) {
test(
`${testData.name}: Has the correct icon`,
async ({ blueprintPage }) => expect(
await blueprintPage.node.evaluate(
node => node.entity.nodeIcon()?.strings.join("")
)
).toBe(testData.icon?.strings.join(""))
)
}
if (testData.pins !== undefined) {
test(
`${testData.name}: Has ${testData.pins} pins`,
async ({ blueprintPage }) => expect(
await blueprintPage.node.evaluate(
node => node.querySelectorAll("ueb-pin").length
)
).toBe(testData.pins)
)
}
if (testData.pinNames) {
test(
`${testData.name}: Has correct pin names`,
async ({ blueprintPage }) => {
const innerTexts = await blueprintPage.node.locator(".ueb-pin-content .ueb-pin-name").allInnerTexts()
const pinNames = innerTexts.map(v => v.trim()).filter(v => v.length > 0)
expect(pinNames).toStrictEqual(testData.pinNames)
}
)
}
test(
`${testData.name}: Expected development`,
async ({ blueprintPage }) => expect(
await blueprintPage.node.evaluate(node => node.entity.isDevelopmentOnly())
).toBe(testData.development)
)
test(
`${testData.name}: Maintains the order of attributes`,
async ({ blueprintPage }) => {
const actualSerialization = await blueprintPage.getSerializedNodes()
const expectedWords = testData.value
.split("\n")
.map(row => row.match(/\s*("?\w+(\s+\w+)*).+/)?.[1])
.filter(v => v?.length > 0)
expect(actualSerialization).toMatch(Utility.getFirstWordOrder(expectedWords))
}
)
if (testData.variadic) {
test(
`${testData.name}: Can add new pins`,
async ({ blueprintPage }) => {
const variadic = blueprintPage.node.getByText("Add pin")
await expect(variadic).toBeVisible()
await variadic.hover()
await variadic.click()
expect(await blueprintPage.node.locator("ueb-pin").all()).toHaveLength(testData.pins + 1)
await variadic.blur()
}
)
}
if (testData.additionalTest) {
test(
`${testData.name}: Additional tests`,
async ({ blueprintPage }) =>
testData.additionalTest(
blueprintPage.node,
await blueprintPage.node.locator("ueb-pin").all(),
blueprintPage,
)
)
}
test.beforeAll(async ({ blueprintPage }) => {
await blueprintPage.removeNodes()
await blueprintPage.paste(testData.value)
})
testData.title ??= testData.name
if (testData.color) {
test(
`${testData.name}: Has correct color`,
async ({ blueprintPage }) => {
expect(
await blueprintPage.node.evaluate(node => node.entity.nodeColor().toString())
).toBe(testData.color.toString())
}
)
}
test(
`${testData.name}: Has correct delegate`,
async ({ blueprintPage }) => {
const delegate = blueprintPage.blueprintLocator.locator(
'ueb-node .ueb-node-top ueb-pin[data-type="delegate"]'
)
if (testData.delegate) {
await expect(delegate).toBeVisible()
} else {
await expect(delegate).toBeHidden()
}
}
)
test(
`${testData.name}: Has title ${testData.title}`,
async ({ blueprintPage }) => expect(
await blueprintPage.node.evaluate(node => node.nodeDisplayName)
).toBe(testData.title)
)
if (testData.subtitle) {
test(
`${testData.name}: Has expected subtitle ${testData.subtitle}`,
async ({ blueprintPage }) => await expect(blueprintPage.node.locator(".ueb-node-subtitle-text"))
.toHaveText(testData.subtitle, { useInnerText: true })
)
} else {
test(
`${testData.name}: Has no subtitle`,
async ({ blueprintPage }) => await expect(blueprintPage.node.locator(".ueb-node-subtitle-text"))
.toBeHidden()
)
}
if (testData.size) {
test(
`${testData.name}: Has approximately the expected size`,
async ({ blueprintPage }) => {
const expectedSize = await blueprintPage.node.evaluate(
(node, gridSize) => {
const bounding = node.getBoundingClientRect()
const expectedSize = [bounding.width / gridSize, bounding.height / gridSize]
return expectedSize
},
Configuration.gridSize
)
expect(Math.abs(testData.size[0] - expectedSize[0])).toBeLessThanOrEqual(1.5)
expect(Math.abs(testData.size[1] - expectedSize[1])).toBeLessThanOrEqual(1.5)
if (
Math.abs(testData.size[0] - expectedSize[0]) > 0.6
|| Math.abs(testData.size[1] - expectedSize[1]) > 0.6
) {
console.error(`Node "${testData.name}" size does not match`)
}
}
)
}
if (testData.icon) {
test(
`${testData.name}: Has the correct icon`,
async ({ blueprintPage }) => expect(
await blueprintPage.node.evaluate(
node => node.entity.nodeIcon()?.strings.join("")
)
).toBe(testData.icon?.strings.join(""))
)
} else if (testData.icon === null) {
test(
`${testData.name}: Has no icon`,
async ({ blueprintPage }) => expect(
await blueprintPage.node.evaluate(
node => node.entity.nodeIcon()
)
).toBeNull()
)
}
if (testData.pins !== undefined) {
test(
`${testData.name}: Has ${testData.pins} pins`,
async ({ blueprintPage }) => expect(
await blueprintPage.node.evaluate(
node => node.querySelectorAll("ueb-pin").length
)
).toBe(testData.pins)
)
}
if (testData.pinNames) {
test(
`${testData.name}: Has correct pin names`,
async ({ blueprintPage }) => {
const innerTexts = await blueprintPage.node.locator(".ueb-pin-content .ueb-pin-name").allInnerTexts()
const pinNames = innerTexts.map(v => v.trim()).filter(v => v.length > 0)
expect(pinNames).toStrictEqual(testData.pinNames)
}
)
}
test(
`${testData.name}: Expected development`,
async ({ blueprintPage }) => expect(
await blueprintPage.node.evaluate(node => node.entity.isDevelopmentOnly())
).toBe(testData.development)
)
test(
`${testData.name}: Maintains the order of attributes`,
async ({ blueprintPage }) => {
const actualSerialization = await blueprintPage.getSerializedNodes()
const expectedWords = testData.value
.split("\n")
.map(row => row.match(/\s*("?\w+(\s+\w+)*).+/)?.[1])
.filter(v => v?.length > 0)
expect(actualSerialization).toMatch(Utility.getFirstWordOrder(expectedWords))
}
)
if (testData.variadic) {
test(
`${testData.name}: Can add new pins`,
async ({ blueprintPage }) => {
const variadic = blueprintPage.node.getByText("Add pin")
await expect(variadic).toBeVisible()
await variadic.hover()
await variadic.click()
expect(await blueprintPage.node.locator("ueb-pin").all()).toHaveLength(testData.pins + 1)
await variadic.blur()
}
)
}
if (testData.additionalTest) {
test(
`${testData.name}: Additional tests`,
async ({ blueprintPage }) =>
testData.additionalTest(
blueprintPage.node,
await blueprintPage.node.locator("ueb-pin").all(),
blueprintPage,
)
)
}
}

View File

@@ -15,6 +15,7 @@ testNode({
CustomProperties Pin (PinId=88182FCB4DE7B6D80AD1B79906069691,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "BaseMCDelegateSelfPinName", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=/Script/Engine.BlueprintGeneratedClass'"/PCG/BP_Elements/PCGAsset.PCGAsset_C"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
`,
size: [13.5, 6],
color: Configuration.nodeColors.blue,
icon: SVGIcon.node,
pins: 3,

View File

@@ -1,4 +1,5 @@
import Configuration from "../js/Configuration.js"
import PinElement from "../js/element/PinElement.js"
import NumberEntity from "../js/entity/NumberEntity.js"
import { expect, testNode } from "./fixtures/test.js"

View File

@@ -1,4 +1,5 @@
import Configuration from "../js/Configuration.js"
import PinElement from "../js/element/PinElement.js"
import NumberEntity from "../js/entity/NumberEntity.js"
import { expect, testNode } from "./fixtures/test.js"

View File

@@ -1,4 +1,5 @@
import Configuration from "../js/Configuration.js"
import PinElement from "../js/element/PinElement.js"
import NumberEntity from "../js/entity/NumberEntity.js"
import { expect, testNode } from "./fixtures/test.js"

View File

@@ -1,4 +1,5 @@
import Configuration from "../js/Configuration.js"
import PinElement from "../js/element/PinElement.js"
import { expect, testNode } from "./fixtures/test.js"
testNode({

View File

@@ -0,0 +1,28 @@
import Configuration from "../js/Configuration.js"
import SVGIcon from "../js/SVGIcon.js"
import { testNode } from "./fixtures/test.js"
testNode({
name: "Copy Payload",
value: String.raw`
Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_0" ExportPath="/Script/BlueprintGraph.K2Node_CallFunction'/Engine/Maps/Templates/NewEditorUtilityBlueprint.NewEditorUtilityBlueprint:NewFunction.K2Node_CallFunction_0'"
FunctionReference=(MemberParent="/Script/CoreUObject.Class'/Script/Engine.AnimationDataModelNotifiesExtensions'",MemberName="CopyPayload")
NodePosX=-624
NodePosY=224
NodeGuid=A3F89A4516E64DF89CFD2A53F14A8BF7
CustomProperties Pin (PinId=3EBC7147C5E74160A63ED4B20541B11C,PinName="execute",PinToolTip="\nExec",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=E611C1C002DA4E88833EF4E18018DE29,PinName="then",PinToolTip="\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=7EAB5C36979142AE9CC0C1EC06988D82,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nAnimation Data Model Notifies Extensions Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.AnimationDataModelNotifiesExtensions'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultObject="/Script/Engine.Default__AnimationDataModelNotifiesExtensions",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=C195EDB3B4904220A87E2E211E876787,PinName="Payload",PinToolTip="Payload\nAnim Data Model Notif Payload Structure (by ref)",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.ScriptStruct'/Script/Engine.AnimDataModelNotifPayload'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=True,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=True,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=BBD426289F74416D98B160B163A715B2,PinName="ExpectedStruct",PinToolTip="Expected Struct\nScript Struct Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/CoreUObject.ScriptStruct'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=377DFCDE9F154E10BE14955375E29365,PinName="OutPayload",PinToolTip="Out Payload\nEmpty Payload Structure (by ref)",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.ScriptStruct'/Script/Engine.EmptyPayload'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=True,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
`,
// size: [14.5, 11],
color: Configuration.nodeColors.blue,
icon: SVGIcon.functionSymbol,
pins: 5,
pinNames: ["Payload", "Expected Struct", "Out Payload"],
delegate: false,
development: false,
})

View File

@@ -0,0 +1,17 @@
import Configuration from "../js/Configuration.js"
import { testNode } from "./fixtures/test.js"
testNode({
name: "Emitter.Determinism",
value: String.raw`
Begin Object Class=/Script/NiagaraEditor.NiagaraClipboardContent Name="NiagaraClipboardContent_10" ExportPath="/Script/NiagaraEditor.NiagaraClipboardContent'/Engine/Transient.NiagaraClipboardContent_10'"
ExportedNodes="QmVnaW4gT2JqZWN0IENsYXNzPS9TY3JpcHQvTmlhZ2FyYUVkaXRvci5OaWFnYXJhTm9kZUlucHV0IE5hbWU9Ik5pYWdhcmFOb2RlSW5wdXRfNDYiIEV4cG9ydFBhdGg9Ii9TY3JpcHQvTmlhZ2FyYUVkaXRvci5OaWFnYXJhTm9kZUlucHV0Jy9FbmdpbmUvVHJhbnNpZW50Lk5ld05pYWdhcmFTY3JpcHQ6TmlhZ2FyYVNjcmlwdFNvdXJjZV8wLk5pYWdhcmFHcmFwaF8wLk5pYWdhcmFOb2RlSW5wdXRfNDYnIgogICBJbnB1dD0oTmFtZT0iRW1pdHRlci5EZXRlcm1pbmlzbSIsVHlwZURlZkhhbmRsZT0oUmVnaXN0ZXJlZFR5cGVJbmRleD04MikpDQogICBVc2FnZT1TeXN0ZW1Db25zdGFudA0KICAgQ2hhbmdlSWQ9MjY3NDNBNzU3MDVENDdGMDlENENBMzlCOEM3N0Y2NDUNCiAgIE5vZGVQb3NYPTIwOA0KICAgTm9kZVBvc1k9LTQzMg0KICAgTm9kZUd1aWQ9M0YzMkJDMjEyMUNCNDZERDk4NEJGNzIzRUI1Qzk0QzYNCiAgIEN1c3RvbVByb3BlcnRpZXMgUGluIChQaW5JZD1CRENFMTBCNTBGREQ0NDlCQjQ1NUU0NDk1MDM0MjM4NSxQaW5OYW1lPSJJbnB1dCIsRGlyZWN0aW9uPSJFR1BEX091dHB1dCIsUGluVHlwZS5QaW5DYXRlZ29yeT0iVHlwZSIsUGluVHlwZS5QaW5TdWJDYXRlZ29yeT0iIixQaW5UeXBlLlBpblN1YkNhdGVnb3J5T2JqZWN0PSIvU2NyaXB0L0NvcmVVT2JqZWN0LlNjcmlwdFN0cnVjdCcvU2NyaXB0L05pYWdhcmEuTmlhZ2FyYUJvb2wnIixQaW5UeXBlLlBpblN1YkNhdGVnb3J5TWVtYmVyUmVmZXJlbmNlPSgpLFBpblR5cGUuUGluVmFsdWVUeXBlPSgpLFBpblR5cGUuQ29udGFpbmVyVHlwZT1Ob25lLFBpblR5cGUuYklzUmVmZXJlbmNlPUZhbHNlLFBpblR5cGUuYklzQ29uc3Q9RmFsc2UsUGluVHlwZS5iSXNXZWFrUG9pbnRlcj1GYWxzZSxQaW5UeXBlLmJJc1VPYmplY3RXcmFwcGVyPUZhbHNlLFBpblR5cGUuYlNlcmlhbGl6ZUFzU2luZ2xlUHJlY2lzaW9uRmxvYXQ9RmFsc2UsUGVyc2lzdGVudEd1aWQ9MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAsYkhpZGRlbj1GYWxzZSxiTm90Q29ubmVjdGFibGU9RmFsc2UsYkRlZmF1bHRWYWx1ZUlzUmVhZE9ubHk9RmFsc2UsYkRlZmF1bHRWYWx1ZUlzSWdub3JlZD1GYWxzZSxiQWR2YW5jZWRWaWV3PUZhbHNlLGJPcnBoYW5lZFBpbj1GYWxzZSwpDQpFbmQgT2JqZWN0DQo="
End Object
`,
color: Configuration.nodeColors.gray,
icon: null,
pins: 1,
pinNames: ["Input"],
delegate: false,
development: false,
})

View File

@@ -1,3 +1,4 @@
import PinElement from "../js/element/PinElement.js"
import Utility from "../js/Utility.js"
import { expect, testNode } from "./fixtures/test.js"

View File

@@ -1,4 +1,5 @@
import Configuration from "../js/Configuration.js"
import PinElement from "../js/element/PinElement.js"
import { expect, testNode } from "./fixtures/test.js"
testNode({

View File

@@ -0,0 +1,17 @@
import Configuration from "../js/Configuration.js"
import { testNode } from "./fixtures/test.js"
testNode({
name: "Translator.CallID",
value: String.raw`
Begin Object Class=/Script/NiagaraEditor.NiagaraClipboardContent Name="NiagaraClipboardContent_2" ExportPath="/Script/NiagaraEditor.NiagaraClipboardContent'/Engine/Transient.NiagaraClipboardContent_2'"
ExportedNodes="QmVnaW4gT2JqZWN0IENsYXNzPS9TY3JpcHQvTmlhZ2FyYUVkaXRvci5OaWFnYXJhTm9kZUlucHV0IE5hbWU9Ik5pYWdhcmFOb2RlSW5wdXRfNTIiIEV4cG9ydFBhdGg9Ii9TY3JpcHQvTmlhZ2FyYUVkaXRvci5OaWFnYXJhTm9kZUlucHV0Jy9FbmdpbmUvVHJhbnNpZW50Lk5ld05pYWdhcmFTY3JpcHQ6TmlhZ2FyYVNjcmlwdFNvdXJjZV8wLk5pYWdhcmFHcmFwaF8wLk5pYWdhcmFOb2RlSW5wdXRfNTInIgogICBJbnB1dD0oTmFtZT0iVHJhbnNsYXRvci5DYWxsSUQiLFR5cGVEZWZIYW5kbGU9KFJlZ2lzdGVyZWRUeXBlSW5kZXg9ODEpKQ0KICAgVXNhZ2U9VHJhbnNsYXRvckNvbnN0YW50DQogICBFeHBvc3VyZU9wdGlvbnM9KGJFeHBvc2VkPUZhbHNlLGJSZXF1aXJlZD1GYWxzZSxiQ2FuQXV0b0JpbmQ9VHJ1ZSxiSGlkZGVuPVRydWUpDQogICBDaGFuZ2VJZD02QUFFMjM1RkVGRDU0OTJFQjFGMUFCRUNDM0NBOTUwQw0KICAgTm9kZVBvc1g9LTUxMg0KICAgTm9kZUd1aWQ9RkRCRjcxMzIyNDM5NDFBMTk2RUVFQ0NEMzc5NDg1NTQNCiAgIEN1c3RvbVByb3BlcnRpZXMgUGluIChQaW5JZD1BNjlFODNGRTNBQkM0MkYyQkNEOTk1OEU3RkFDMzczQSxQaW5OYW1lPSJJbnB1dCIsRGlyZWN0aW9uPSJFR1BEX091dHB1dCIsUGluVHlwZS5QaW5DYXRlZ29yeT0iVHlwZSIsUGluVHlwZS5QaW5TdWJDYXRlZ29yeT0iIixQaW5UeXBlLlBpblN1YkNhdGVnb3J5T2JqZWN0PSIvU2NyaXB0L0NvcmVVT2JqZWN0LlNjcmlwdFN0cnVjdCcvU2NyaXB0L05pYWdhcmEuTmlhZ2FyYUludDMyJyIsUGluVHlwZS5QaW5TdWJDYXRlZ29yeU1lbWJlclJlZmVyZW5jZT0oKSxQaW5UeXBlLlBpblZhbHVlVHlwZT0oKSxQaW5UeXBlLkNvbnRhaW5lclR5cGU9Tm9uZSxQaW5UeXBlLmJJc1JlZmVyZW5jZT1GYWxzZSxQaW5UeXBlLmJJc0NvbnN0PUZhbHNlLFBpblR5cGUuYklzV2Vha1BvaW50ZXI9RmFsc2UsUGluVHlwZS5iSXNVT2JqZWN0V3JhcHBlcj1GYWxzZSxQaW5UeXBlLmJTZXJpYWxpemVBc1NpbmdsZVByZWNpc2lvbkZsb2F0PUZhbHNlLFBlcnNpc3RlbnRHdWlkPTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLGJIaWRkZW49RmFsc2UsYk5vdENvbm5lY3RhYmxlPUZhbHNlLGJEZWZhdWx0VmFsdWVJc1JlYWRPbmx5PUZhbHNlLGJEZWZhdWx0VmFsdWVJc0lnbm9yZWQ9RmFsc2UsYkFkdmFuY2VkVmlldz1GYWxzZSxiT3JwaGFuZWRQaW49RmFsc2UsKQ0KRW5kIE9iamVjdA0K"
End Object
`,
color: Configuration.nodeColors.gray,
icon: null,
pins: 1,
pinNames: ["Input"],
delegate: false,
development: false,
})

View File

@@ -0,0 +1,43 @@
import SVGIcon from "../js/SVGIcon.js"
import { expect, testNode } from "./fixtures/test.js"
testNode({
name: "UseDepthBiasedAlpha",
value: String.raw`
Begin Object Class=/Script/UnrealEd.MaterialGraphNode Name="MaterialGraphNode_1" ExportPath="/Script/UnrealEd.MaterialGraphNode'/Engine/Transient.M_EV_FalloffSphere_Master_01:MaterialGraph_0.MaterialGraphNode_1'"
Begin Object Class=/Script/Engine.MaterialExpressionStaticSwitchParameter Name="MaterialExpressionStaticSwitchParameter_0" ExportPath="/Script/Engine.MaterialExpressionStaticSwitchParameter'/Engine/Transient.M_EV_FalloffSphere_Master_01:MaterialGraph_0.MaterialGraphNode_1.MaterialExpressionStaticSwitchParameter_0'"
End Object
Begin Object Name="MaterialExpressionStaticSwitchParameter_0" ExportPath="/Script/Engine.MaterialExpressionStaticSwitchParameter'/Engine/Transient.M_EV_FalloffSphere_Master_01:MaterialGraph_0.MaterialGraphNode_1.MaterialExpressionStaticSwitchParameter_0'"
A=(Expression="/Script/Engine.MaterialExpressionDepthFade'MaterialExpressionDepthFade_14'")
B=(Expression="/Script/Engine.MaterialExpressionClamp'MaterialExpressionClamp_4'")
ParameterName="UseDepthBiasedAlpha"
ExpressionGUID=A98669E9462B7E6612CF93B055A7A463
MaterialExpressionEditorX=-192
MaterialExpressionEditorY=80
MaterialExpressionGuid=9D794A6744E0E3E14AE3D591EDA26066
Material="/Script/UnrealEd.PreviewMaterial'/Engine/Transient.M_EV_FalloffSphere_Master_01'"
End Object
MaterialExpression="/Script/Engine.MaterialExpressionStaticSwitchParameter'MaterialExpressionStaticSwitchParameter_0'"
NodePosX=-192
NodePosY=80
bCanRenameNode=True
NodeGuid=89C3972A02314DC8A228AB85296ECA16
CustomProperties Pin (PinId=23E012B58ADF4CF68CA0999863D5163F,PinName="True",PinType.PinCategory="required",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(MaterialGraphNode_22 D118252F518B41C6A3C0547D4373C8D2,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=284ACC75E7314F9CBD42D10EF5FBD72E,PinName="False",PinType.PinCategory="required",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(MaterialGraphNode_3 25011B470F774D60A90AAF331D1D007D,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=DA812709AA7249B5B20C36C2B9416C05,PinName="Default Value",PinType.PinCategory="optional",PinType.PinSubCategory="bool",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="false",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=True,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=DF5352C192C74D44A5C0ABEEA4676022,PinName="Output",PinFriendlyName=NSLOCTEXT("MaterialGraphNode", "Space", " "),Direction="EGPD_Output",PinType.PinCategory="",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(MaterialGraphNode_Root_0 5174BC871BCF4E68A56F055BCFD12053,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
`,
size: [11, 9],
icon: null,
pins: 4,
delegate: false,
development: false,
variadic: false,
additionalTest: async (node, pins) => {
for (const pin of pins) {
expect(await pin.evaluate(pin => pin.template.renderIcon().strings.join("")))
.toStrictEqual(SVGIcon.genericPin.strings.join(""))
}
}
})

View File

@@ -93,6 +93,7 @@
* @typedef {import("./js/entity/UnknownPinEntity.js").default} UnknownPinEntity
* @typedef {import("./js/entity/VariableReferenceEntity.js").default} VariableReferenceEntity
* @typedef {import("./js/entity/Vector2DEntity.js").default} Vector2DEntity
* @typedef {import("./js/entity/Vector4DEntity.js").default} Vector4DEntity
* @typedef {import("./js/entity/VectorEntity.js").default} VectorEntity
* @typedef {import("./js/input/IInput.js").default} IInput
* @typedef {import("./js/input/keyboard/KeyboardShortcut.js").default} KeyboardShortcut
@@ -102,7 +103,6 @@
* @typedef {import("./js/template/ColorSliderTemplate.js").default} ColorSliderTemplate
* @typedef {import("./js/template/IDraggableControlTemplate.js").default} IDraggableControlTemplate
* @typedef {import("./js/template/IDraggablePositionedTemplate.js").default} IDraggablePositionedTemplate
* @typedef {typeof import("./js/entity/ComputedTypeEntity.js").default} ComputedTypeEntityConstructor
* @typedef {import("./js/template/IDraggableTemplate.js").default} IDraggableTemplate
* @typedef {import("./js/template/IFromToPositionedTemplate.js").default} IFromToPositionedTemplate
* @typedef {import("./js/template/IResizeableTemplate.js").default} IResizeableTemplate
@@ -142,6 +142,7 @@
* @typedef {import("lit").CSSResult} CSSResult
* @typedef {import("lit").PropertyValues} PropertyValues
* @typedef {import("lit").TemplateResult} TemplateResult
* @typedef {typeof import("./js/entity/ComputedTypeEntity.js").default} ComputedTypeEntityConstructor
*/
/**
* @template T