Files
picoGraph/scripts/nodes/nodeTypes.js
Max Litruv Boonzaayer f917cf6ad5 Add initial Pico-8 cartridges for testing
- Created test_cart.p8 with basic drawing functionality and a print statement.
- Created test_unix.p8 with a simple initialization function.
2026-03-21 18:38:43 +11:00

94 lines
5.1 KiB
JavaScript

/**
* @typedef {Object} PropertySchema
* @property {string} key Property identifier.
* @property {string} label Human-friendly label.
* @property {('string'|'number'|'boolean'|'enum'|'multiline')} type Control type used in the inspector.
* @property {unknown} [defaultValue] Default property value.
* @property {Array<{label:string,value:string}>} [options] Option collection for enum values.
* @property {string} [placeholder] Optional placeholder text.
*/
/**
* @typedef {Object} PinConfig
* @property {string} id Stable identifier unique within the node definition.
* @property {string} name Display name.
* @property {('input'|'output')} direction Pin direction relative to the node.
* @property {('exec'|'number'|'boolean'|'string'|'table'|'any'|'color')} kind Blueprint connection kind.
* @property {string} [description] Optional tooltip text.
* @property {unknown} [defaultValue] Default literal for data pins.
* @property {Array<{label: string, value: string}>} [options] Renders an inline select dropdown when the pin is unconnected.
* @property {boolean} [spawnLiteralNode] Whether dragging off this pin offers the default literal node. Defaults to the handler's spawnableByDefault.
*/
/**
* @typedef {Object} NodeDefinition
* @property {string} id Node identifier used for instantiation.
* @property {string} title Display title.
* @property {string} category Group name for palette organization.
* @property {string} [description] Optional description used in the palette.
* @property {Array<PinConfig>} inputs Input pins.
* @property {Array<PinConfig>} outputs Output pins.
* @property {Array<PropertySchema>} properties Property schema displayed in inspector.
* @property {Array<string>} [searchTags] Optional keywords aiding palette searches.
* @property {(properties: Record<string, unknown>) => void} [onPropertiesChanged] Lifecycle hook invoked after inspector edits.
* @property {(properties: Record<string, unknown>) => void} [initializeProperties] Optional initializer for property defaults.
* @property {boolean} [unique=false] Whether the node is limited to a single instance within the workspace.
*/
/**
* @typedef {import('../core/BlueprintNode.js').BlueprintNode} BlueprintNode
*/
/**
* @typedef {Object} ExecContext
* @property {BlueprintNode} node Active node instance.
* @property {number} indentLevel Current indentation level.
* @property {Set<string>} path Cycle detection guard set.
* @property {(pinId: string) => Array<string>} emitNextExec Emits the next exec branch for the supplied output pin.
* @property {(pinId: string, overrides?: { indentLevel?: number, path?: Set<string> }) => Array<string>} emitBranch Emits all branches reachable from the supplied exec output pin.
* @property {(nodeId: string, indentLevel: number, path: Set<string>) => Array<string>} emitExecChain Walks the exec chain starting from the provided node identifier.
* @property {(pinId: string, fallback: string) => string} resolveValueInput Resolves a value input for the active node.
* @property {(pinId: string) => Array<{nodeId: string, pinId: string}>} findExecTargets Finds exec targets for the supplied pin.
* @property {(level?: number) => string} indent Produces indentation whitespace for the supplied level (defaults to the current level).
* @property {(name: string) => string} sanitizeIdentifier Normalizes identifiers for Lua emission.
* @property {(operator: string) => string} sanitizeOperator Normalizes comparison operators for Lua.
* @property {(kind: string, value: unknown) => string} formatLiteral Formats a literal value for Lua output.
*/
/**
* @typedef {Object} ValueContext
* @property {BlueprintNode} node Active node instance.
* @property {(pinId: string, fallback: string) => string} resolveValueInput Resolves a value input for the active node.
* @property {(name: string) => string} sanitizeIdentifier Normalizes identifiers for Lua emission.
* @property {(operator: string) => string} sanitizeOperator Normalizes comparison operators for Lua.
* @property {(kind: string, value: unknown) => string} formatLiteral Formats a literal value for Lua output.
*/
/**
* @typedef {Object} NodeBehavior
* @property {boolean} [isEntryPoint] Indicates whether the node should be treated as the primary entry point.
* @property {('_init'|'_update'|'_draw'|'_update60')} [eventName] Optional PICO-8 lifecycle callback to generate.
* @property {(context: ExecContext) => Array<string>} [emitExec] Generates Lua statements for exec-oriented nodes.
* @property {(context: ValueContext) => string} [evaluateValue] Generates a Lua expression for value-oriented nodes.
*/
/**
* @typedef {Object} NodeModule
* @property {NodeDefinition} definition Node metadata exposed to the editor.
* @property {NodeBehavior} [behavior] Optional Lua emission hooks for the node.
*/
/**
* Creates a node module ensuring a behavior object is always present.
*
* @param {NodeDefinition} definition Node metadata.
* @param {NodeBehavior} [behavior] Optional behavior hooks.
* @returns {NodeModule}
*/
export const createNodeModule = (definition, behavior = {}) => ({
definition,
behavior,
});
export {};