"use strict"; const assert = require("node:assert"); const { test } = require("node:test"); const { attributeValueType, parseComponentMetadata, parseComponentTags, validateComponentTags, } = require("../src/component-metadata"); const source = `component Button { props { // @required label = "" variant = "primary" disabled = false count = 0 items = [] } view { } }`; test("extracts component prop types, required props, defaults, and options", () => { const component = parseComponentMetadata(source); assert.equal(component.name, "Button"); assert.deepEqual( component.props.map(({ name, type, required, options }) => ({ name, type, required, options })), [ { name: "label", type: "string", required: true, options: [] }, { name: "variant", type: "string", required: false, options: ["danger", "primary"] }, { name: "disabled", type: "boolean", required: false, options: [] }, { name: "count", type: "number", required: false, options: [] }, { name: "items", type: "array", required: false, options: [] }, ], ); }); test("parses multiline component tags and their attribute locations", () => { const page = ` } }`); const diagnostics = validateComponentTags( ``, new Map([["Toggle", target]]), ); assert.deepEqual( diagnostics.map(({ code }) => code), ["wrn-component-prop-type"], ); }); test("accepts unresolved dynamic expressions for declared string options", () => { const target = parseComponentMetadata(`component FeatureCard { props { target: "_blank" | "_self" = "_self" } view {
} }`); const dynamic = ``; assert.deepEqual(validateComponentTags(dynamic, new Map([["FeatureCard", target]])), []); const invalidLiteral = validateComponentTags( ``, new Map([["FeatureCard", target]]), ); assert.deepEqual( invalidLiteral.map(({ code }) => code), ["wrn-component-prop-option"], ); });