{"version":3,"sources":["../src/index.ts","../src/HelperGenerators/BaseGenerator.ts","../src/HelperGenerators/LifecycleGenerator.ts","../src/HelperGenerators/PropViewGenerator.ts","../src/HelperGenerators/ElementGenerator.ts","../src/HelperGenerators/ForwardPropGenerator.ts","../src/NodeGenerators/CompGenerator.ts","../src/error.ts","../src/HelperGenerators/HTMLPropGenerator.ts","../src/NodeGenerators/HTMLGenerator.ts","../src/NodeGenerators/TemplateGenerator.ts","../src/NodeGenerators/ForGenerator.ts","../src/HelperGenerators/CondGenerator.ts","../src/NodeGenerators/IfGenerator.ts","../src/NodeGenerators/EnvGenerator.ts","../src/NodeGenerators/TextGenerator.ts","../src/NodeGenerators/ExpGenerator.ts","../src/NodeGenerators/SnippetGenerator.ts","../src/NodeGenerators/SwitchGenerator.ts","../src/NodeGenerators/TryGenerator.ts","../src/ViewGenerator.ts","../src/MainViewGenerator.ts","../src/SnippetGenerator.ts"],"sourcesContent":["import { type ViewParticle } from \"@dlightjs/reactivity-parser\"\nimport { type ViewGeneratorConfig } from \"./types\"\nimport { type types as t } from \"@babel/core\"\nimport MainViewGenerator from \"./MainViewGenerator\"\nimport SnippetGenerator from \"./SnippetGenerator\"\n\nexport function generateView(\n  viewParticles: ViewParticle[],\n  config: ViewGeneratorConfig\n): [t.BlockStatement, t.ClassProperty[], number] {\n  return new MainViewGenerator(config).generate(viewParticles)\n}\n\nexport function generateSnippet(\n  viewParticlesWithPropertyDep: ViewParticle[],\n  viewParticlesWithIdentityDep: ViewParticle[],\n  propNode: t.ObjectPattern,\n  config: ViewGeneratorConfig\n): [t.BlockStatement, t.ClassProperty[], number] {\n  return new SnippetGenerator(config).generate(\n    viewParticlesWithPropertyDep,\n    viewParticlesWithIdentityDep,\n    propNode\n  )\n}\n\nexport type * from \"./types\"\n","import { type types as t, type traverse } from \"@babel/core\"\nimport { type ViewParticle } from \"@dlightjs/reactivity-parser\"\nimport { type SnippetPropMap, type ViewGeneratorConfig } from \"../types\"\nimport ViewGenerator from \"../ViewGenerator\"\n\nexport const prefixMap = { template: \"$t\", node: \"$node\" }\n\nexport default class BaseGenerator {\n  readonly viewParticle: ViewParticle\n  readonly config: ViewGeneratorConfig\n\n  readonly t: typeof t\n  readonly traverse: typeof traverse\n  readonly className: string\n  readonly importMap: Record<string, string>\n  readonly snippetPropMap: SnippetPropMap\n  readonly elementAttributeMap\n  readonly alterAttributeMap\n\n  readonly viewGenerator\n\n  /**\n   * @brief Constructor\n   * @param viewUnit\n   * @param config\n   */\n  constructor(viewParticle: ViewParticle, config: ViewGeneratorConfig) {\n    this.viewParticle = viewParticle\n    this.config = config\n    this.t = config.babelApi.types\n    this.traverse = config.babelApi.traverse\n    this.className = config.className\n    this.importMap = config.importMap\n    this.snippetPropMap = config.snippetPropMap\n    this.viewGenerator = new ViewGenerator(config)\n    this.elementAttributeMap = config.attributeMap\n      ? Object.entries(config.attributeMap).reduce<Record<string, string[]>>(\n          (acc, [key, elements]) => {\n            elements.forEach(element => {\n              if (!acc[element]) acc[element] = []\n              acc[element].push(key)\n            })\n            return acc\n          },\n          {}\n        )\n      : {}\n    this.alterAttributeMap = config.alterAttributeMap\n  }\n\n  // ---- Init Statements\n  private readonly initStatements: t.Statement[] = []\n  addInitStatement(...statements: (t.Statement | null)[]) {\n    this.initStatements.push(...(statements.filter(Boolean) as t.Statement[]))\n  }\n\n  // ---- Added Class Properties, typically used in for Template\n  private readonly classProperties: t.ClassProperty[] = []\n  addStaticClassProperty(key: string, value: t.Expression) {\n    this.classProperties.push(\n      this.t.classProperty(\n        this.t.identifier(key),\n        value,\n        undefined,\n        undefined,\n        undefined,\n        true\n      )\n    )\n  }\n\n  // ---- Update Statements\n  private readonly updateStatements: Record<number, t.Statement[]> = {}\n  addUpdateStatements(\n    dependencies: number[] | undefined,\n    statement: t.Statement | undefined | null\n  ) {\n    if (!dependencies || dependencies.length === 0) return\n    const depNum = BaseGenerator.calcDependencyNum(dependencies)\n    if (!this.updateStatements[depNum]) this.updateStatements[depNum] = []\n    if (statement) this.updateStatements[depNum].push(statement)\n  }\n\n  addUpdateStatementsWithoutDep(statement: t.Statement) {\n    if (!this.updateStatements[0]) this.updateStatements[0] = []\n    this.updateStatements[0].push(statement)\n  }\n\n  /**\n   * @returns [initStatements, updateStatements, classProperties, nodeName]\n   */\n  generate(): [\n    t.Statement[],\n    Record<number, t.Statement[]>,\n    t.ClassProperty[],\n    string,\n  ] {\n    const nodeName = this.run()\n    return [\n      this.initStatements,\n      this.updateStatements,\n      this.classProperties,\n      nodeName,\n    ]\n  }\n\n  /**\n   * @brief Generate the view given the view particles, mainly used for child particles parsing\n   * @param viewParticles\n   * @param mergeStatements\n   * @returns [initStatements, topLevelNodes, updateStatements]\n   */\n  generateChildren(\n    viewParticles: ViewParticle[],\n    mergeStatements = true,\n    newIdx = false\n  ): [t.Statement[], string[], Record<number, t.Statement[]>, number] {\n    this.viewGenerator.nodeIdx = newIdx ? -1 : this.nodeIdx\n    this.viewGenerator.templateIdx = this.templateIdx\n    const [initStatements, updateStatements, classProperties, topLevelNodes] =\n      this.viewGenerator.generateChildren(viewParticles)\n    if (!newIdx) this.nodeIdx = this.viewGenerator.nodeIdx\n    this.templateIdx = this.viewGenerator.templateIdx\n    this.classProperties.push(...classProperties)\n    if (mergeStatements) this.mergeStatements(updateStatements)\n\n    return [\n      initStatements,\n      topLevelNodes,\n      updateStatements,\n      this.viewGenerator.nodeIdx,\n    ]\n  }\n\n  /**\n   * @brief Merge the update statements\n   * @param statements\n   */\n  private mergeStatements(statements: Record<number, t.Statement[]>): void {\n    Object.entries(statements).forEach(([depNum, statements]) => {\n      if (!this.updateStatements[Number(depNum)]) {\n        this.updateStatements[Number(depNum)] = []\n      }\n      this.updateStatements[Number(depNum)].push(...statements)\n    })\n  }\n\n  /**\n   * @brief Generate the view given the view particle\n   * @param viewParticle\n   * @param mergeStatements\n   * @returns [initStatements, nodeName, updateStatements]\n   */\n  generateChild(\n    viewParticle: ViewParticle,\n    mergeStatements = true,\n    newIdx = false\n  ): [t.Statement[], string, Record<number, t.Statement[]>, number] {\n    this.viewGenerator.nodeIdx = newIdx ? -1 : this.nodeIdx\n    this.viewGenerator.templateIdx = this.templateIdx\n    const [initStatements, updateStatements, classProperties, nodeName] =\n      this.viewGenerator.generateChild(viewParticle)\n    if (!newIdx) this.nodeIdx = this.viewGenerator.nodeIdx\n    this.templateIdx = this.viewGenerator.templateIdx\n    this.classProperties.push(...classProperties)\n    if (mergeStatements) this.mergeStatements(updateStatements)\n\n    return [\n      initStatements,\n      nodeName,\n      updateStatements,\n      this.viewGenerator.nodeIdx,\n    ]\n  }\n\n  /**\n   * @View\n   * const $update = (changed) => { ${updateStatements} }\n   */\n  geneUpdateFunc(updateStatements: Record<number, t.Statement[]>): t.Statement {\n    return this.t.variableDeclaration(\"const\", [\n      this.t.variableDeclarator(\n        this.t.identifier(\"$update\"),\n        this.t.arrowFunctionExpression(\n          [this.t.identifier(\"$changed\")],\n          this.geneUpdateBody(updateStatements)\n        )\n      ),\n    ])\n  }\n\n  get updateParams() {\n    return [this.t.identifier(\"$changed\")]\n  }\n\n  /**\n   * @View\n   * (changed) => {\n   *   if (changed & 1) {\n   *     ...\n   *   }\n   *   ...\n   * }\n   */\n  geneUpdateBody(\n    updateStatements: Record<number, t.Statement[]>\n  ): t.BlockStatement {\n    return this.t.blockStatement([\n      ...Object.entries(updateStatements)\n        .filter(([depNum]) => depNum !== \"0\")\n        .map(([depNum, statements]) => {\n          return this.t.ifStatement(\n            this.t.binaryExpression(\n              \"&\",\n              this.t.identifier(\"$changed\"),\n              this.t.numericLiteral(Number(depNum))\n            ),\n            this.t.blockStatement(statements)\n          )\n        }),\n      ...(updateStatements[0] ?? []),\n    ])\n  }\n\n  /**\n   * @View\n   * let node1, node2, ...\n   */\n  declareNodes(nodeIdx: number): t.VariableDeclaration[] {\n    if (nodeIdx === -1) return []\n    return [\n      this.t.variableDeclaration(\n        \"let\",\n        Array.from({ length: nodeIdx + 1 }, (_, i) =>\n          this.t.variableDeclarator(this.t.identifier(`${prefixMap.node}${i}`))\n        )\n      ),\n    ]\n  }\n\n  /**\n   * @View\n   * return [${topLevelNodes}]\n   */\n  generateReturnStatement(topLevelNodes: string[]): t.ReturnStatement {\n    return this.t.returnStatement(\n      this.t.arrayExpression(topLevelNodes.map(name => this.t.identifier(name)))\n    )\n  }\n\n  /**\n   * @brief To be implemented by the subclass as the main node generation function\n   * @returns dlNodeName\n   */\n  run(): string {\n    return \"\"\n  }\n\n  // ---- Name ----\n  // ---- Used as dlNodeName for any node declaration\n  nodeIdx = -1\n  generateNodeName(idx?: number): string {\n    return `${prefixMap.node}${idx ?? ++this.nodeIdx}`\n  }\n\n  // ---- Used as template generation as class property\n  templateIdx = -1\n  generateTemplateName(): string {\n    return `${prefixMap.template}${++this.templateIdx}`\n  }\n\n  // ---- @Utils -----\n  /**\n   *\n   * @param updateStatements\n   * @returns\n   */\n\n  /**\n   * @brief Calculate the dependency number from an array of dependency index\n   *  e.g.\n   *    [0, 1, 2] => 0b111 => 7\n   *    [1, 3] => 0b1010 => 10\n   * @param dependencies\n   * @returns dependency number\n   */\n  static calcDependencyNum(dependencies: number[] | undefined): number {\n    if (!dependencies || dependencies.length === 0) return 0\n    dependencies = [...new Set(dependencies)]\n    return dependencies.reduce((acc, dep) => acc + (1 << dep), 0)\n  }\n\n  /**\n   * @brief Wrap the value in a file\n   * @param node\n   * @returns wrapped value\n   */\n  valueWrapper(node: t.Expression | t.Statement): t.File {\n    return this.t.file(\n      this.t.program([\n        this.t.isStatement(node) ? node : this.t.expressionStatement(node),\n      ])\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName} && ${expression}\n   */\n  optionalExpression(\n    dlNodeName: string,\n    expression: t.Expression\n  ): t.Statement {\n    return this.t.expressionStatement(\n      this.t.logicalExpression(\"&&\", this.t.identifier(dlNodeName), expression)\n    )\n  }\n\n  /**\n   * @brief Shorthand function for collecting statements in batch\n   * @returns [statements, collect]\n   */\n  static statementsCollector(): [\n    t.Statement[],\n    (...statements: t.Statement[] | t.Statement[][]) => void,\n  ] {\n    const statements: t.Statement[] = []\n    const collect = (...newStatements: t.Statement[] | t.Statement[][]) => {\n      newStatements.forEach(s => {\n        if (Array.isArray(s)) {\n          statements.push(...s)\n        } else {\n          statements.push(s)\n        }\n      })\n    }\n\n    return [statements, collect]\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport BaseGenerator from \"./BaseGenerator\"\n\nexport default class LifecycleGenerator extends BaseGenerator {\n  static lifecycle = [\n    \"willMount\",\n    \"didMount\",\n    \"willUnmount\",\n    \"didUnmount\",\n  ] as const\n\n  /**\n   * @View\n   * ${dlNodeName} && ${value}(${dlNodeName}, changed)\n   */\n  addOnUpdate(dlNodeName: string, value: t.Expression): t.Statement {\n    return this.t.expressionStatement(\n      this.t.logicalExpression(\n        \"&&\",\n        this.t.identifier(dlNodeName),\n        this.t.callExpression(value, [\n          this.t.identifier(dlNodeName),\n          ...this.updateParams.slice(1),\n        ])\n      )\n    )\n  }\n\n  /**\n   * @View\n   * willMount:\n   *  - ${value}(${dlNodeName})\n   * didMount/willUnmount/didUnmount:\n   *  - View.addDidMount(${dlNodeName}, ${value})\n   */\n  addLifecycle(\n    dlNodeName: string,\n    key: (typeof LifecycleGenerator.lifecycle)[number],\n    value: t.Expression\n  ): t.Statement {\n    if (key === \"willMount\") {\n      return this.addWillMount(dlNodeName, value)\n    }\n    return this.addOtherLifecycle(dlNodeName, value, key)\n  }\n\n  /**\n   * @View\n   * ${value}(${dlNodeName})\n   */\n  addWillMount(dlNodeName: string, value: t.Expression): t.ExpressionStatement {\n    return this.t.expressionStatement(\n      this.t.callExpression(value, [this.t.identifier(dlNodeName)])\n    )\n  }\n\n  /**\n   * @View\n   * View.addDidMount(${dlNodeName}, ${value})\n   */\n  addOtherLifecycle(\n    dlNodeName: string,\n    value: t.Expression,\n    type: \"didMount\" | \"willUnmount\" | \"didUnmount\"\n  ): t.ExpressionStatement {\n    return this.t.expressionStatement(\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(\"View\"),\n          this.t.identifier(`add${type[0].toUpperCase()}${type.slice(1)}`)\n        ),\n        [this.t.identifier(dlNodeName), value]\n      )\n    )\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport {\n  type DependencyProp,\n  type ViewParticle,\n} from \"@dlightjs/reactivity-parser\"\nimport LifecycleGenerator from \"./LifecycleGenerator\"\n\nexport default class PropViewGenerator extends LifecycleGenerator {\n  /**\n   * @brief Alter prop view in batch\n   * @param props\n   * @returns altered props\n   */\n  alterPropViews<T extends Record<string, DependencyProp> | undefined>(\n    props: T\n  ): T {\n    if (!props) return props\n    return Object.fromEntries(\n      Object.entries(props).map(([key, prop]) => {\n        return [key, this.alterPropView(prop)!]\n      })\n    ) as T\n  }\n\n  /**\n   * @View\n   * ${dlNodeName} = new PropView(($addUpdate) => {\n   *  addUpdate((changed) => { ${updateStatements} })\n   *  ${initStatements}\n   *  return ${topLevelNodes}\n   * })\n   */\n  declarePropView(viewParticles: ViewParticle[]) {\n    // ---- Generate PropView\n    const [initStatements, topLevelNodes, updateStatements, nodeIdx] =\n      this.generateChildren(viewParticles, false, true)\n    // ---- Add update function to the first node\n    /**\n     * $addUpdate((changed) => { ${updateStatements} })\n     */\n    if (Object.keys(updateStatements).length > 0) {\n      initStatements.unshift(\n        this.t.expressionStatement(\n          this.t.callExpression(this.t.identifier(\"$addUpdate\"), [\n            this.t.arrowFunctionExpression(\n              this.updateParams,\n              this.geneUpdateBody(updateStatements)\n            ),\n          ])\n        )\n      )\n    }\n    initStatements.unshift(...this.declareNodes(nodeIdx))\n    initStatements.push(this.generateReturnStatement(topLevelNodes))\n\n    // ---- Assign as a dlNode\n    const dlNodeName = this.generateNodeName()\n    const propViewNode = this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.identifier(dlNodeName),\n        this.t.newExpression(this.t.identifier(this.importMap.PropView), [\n          this.t.arrowFunctionExpression(\n            [this.t.identifier(\"$addUpdate\")],\n            this.t.blockStatement(initStatements)\n          ),\n        ])\n      )\n    )\n    this.addInitStatement(propViewNode)\n    const propViewIdentifier = this.t.identifier(dlNodeName)\n\n    // ---- Add to update statements\n    /**\n     * ${dlNodeName}?.update(changed)\n     */\n    this.addUpdateStatementsWithoutDep(\n      this.optionalExpression(\n        dlNodeName,\n        this.t.callExpression(\n          this.t.memberExpression(\n            propViewIdentifier,\n            this.t.identifier(\"update\")\n          ),\n          this.updateParams\n        )\n      )\n    )\n\n    return dlNodeName\n  }\n\n  /**\n   * @brief Alter prop view by replacing prop view with a recursively generated prop view\n   * @param prop\n   * @returns altered prop\n   */\n  alterPropView<T extends DependencyProp | undefined>(prop: T): T {\n    if (!prop) return prop\n    const { value, viewPropMap } = prop\n    if (!viewPropMap) return { ...prop, value }\n    let newValue = value\n    this.traverse(this.valueWrapper(value), {\n      StringLiteral: innerPath => {\n        const id = innerPath.node.value\n        const viewParticles = viewPropMap[id]\n        if (!viewParticles) return\n        const propViewIdentifier = this.t.identifier(\n          this.declarePropView(viewParticles)\n        )\n\n        if (value === innerPath.node) newValue = propViewIdentifier\n        innerPath.replaceWith(propViewIdentifier)\n        innerPath.skip()\n      },\n    })\n    return { ...prop, value: newValue }\n  }\n\n  /**\n   * @brief Get the dependency index array from the update statements' keys\n   *  i.e. [1, 2, 7] => [0b1, 0b10, 0b111] => [[1], [2], [0, 1, 2]] => [0, 1, 2]\n   * @param updateStatements\n   * @returns dependency index array\n   */\n  private static reverseDependencyIndexArr(\n    updateStatements: Record<number, t.Statement[]>\n  ): number[] {\n    const allDepsNum = Object.keys(updateStatements)\n      .map(Number)\n      .reduce((acc, depNum) => acc | depNum, 0)\n    const allDeps = []\n    for (let i = 0; i < String(allDepsNum).length; i++) {\n      if (allDepsNum & (1 << i)) allDeps.push(i)\n    }\n    return allDeps\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport PropViewGenerator from \"./PropViewGenerator\"\n\nexport default class ElementGenerator extends PropViewGenerator {\n  /**\n   * @View\n   * el:\n   * View.addDidMount(${dlNodeName}, () => (\n   *   typeof ${value} === \"function\" ? ${value}($nodeEl) : ${value} = $nodeEl\n   * ))\n   * not el:\n   * typeof ${value} === \"function\" ? ${value}($nodeEl) : ${value} = $nodeEl\n   * @param el true: dlNodeName._$el, false: dlNodeName\n   */\n  initElement(\n    dlNodeName: string,\n    value: t.Expression,\n    el = false\n  ): t.Statement {\n    const elNode = el\n      ? this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"_$el\")\n        )\n      : this.t.identifier(dlNodeName)\n    let elementNode\n    if (this.isOnlyMemberExpression(value)) {\n      elementNode = this.t.conditionalExpression(\n        this.t.binaryExpression(\n          \"===\",\n          this.t.unaryExpression(\"typeof\", value, true),\n          this.t.stringLiteral(\"function\")\n        ),\n        this.t.callExpression(value, [elNode]),\n        this.t.assignmentExpression(\"=\", value as t.LVal, elNode)\n      )\n    } else {\n      elementNode = this.t.callExpression(value, [elNode])\n    }\n\n    return el\n      ? this.t.expressionStatement(\n          this.t.callExpression(\n            this.t.memberExpression(\n              this.t.identifier(\"View\"),\n              this.t.identifier(\"addDidMount\")\n            ),\n            [\n              this.t.identifier(dlNodeName),\n              this.t.arrowFunctionExpression([], elementNode),\n            ]\n          )\n        )\n      : this.t.expressionStatement(elementNode)\n  }\n\n  // --- Utils\n  private isOnlyMemberExpression(value: t.Expression): boolean {\n    if (!this.t.isMemberExpression(value)) return false\n    while (value.property) {\n      if (this.t.isMemberExpression(value.property)) {\n        value = value.property\n        continue\n      } else if (this.t.isIdentifier(value.property)) break\n      else return false\n    }\n    return true\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport ElementGenerator from \"./ElementGenerator\"\n\nexport default class ForwardPropsGenerator extends ElementGenerator {\n  /**\n   * @View\n   * this._$forwardProp(${dlNodeName})\n   */\n  forwardProps(dlNodeName: string): t.ExpressionStatement {\n    return this.t.expressionStatement(\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.thisExpression(),\n          this.t.identifier(\"_$addForwardProps\")\n        ),\n        [this.t.identifier(dlNodeName)]\n      )\n    )\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport {\n  type DependencyProp,\n  type CompParticle,\n  type ViewParticle,\n} from \"@dlightjs/reactivity-parser\"\nimport ForwardPropGenerator from \"../HelperGenerators/ForwardPropGenerator\"\n\nexport default class CompGenerator extends ForwardPropGenerator {\n  run() {\n    let { props } = this.viewParticle as CompParticle\n    props = this.alterPropViews(props)\n    const { tag, children } = this.viewParticle as CompParticle\n\n    const dlNodeName = this.generateNodeName()\n\n    this.addInitStatement(\n      ...this.declareCompNode(dlNodeName, tag, props, children)\n    )\n    const allDependencyIndexArr: number[] = []\n\n    // ---- Resolve props\n    Object.entries(props).forEach(\n      ([key, { value, dependencyIndexArr, dependenciesNode }]) => {\n        if (key === \"forwardProps\") return\n        if (key === \"didUpdate\") return\n        allDependencyIndexArr.push(...dependencyIndexArr)\n        if (\n          CompGenerator.lifecycle.includes(\n            key as (typeof CompGenerator.lifecycle)[number]\n          )\n        ) {\n          this.addInitStatement(\n            this.addLifecycle(\n              dlNodeName,\n              key as (typeof CompGenerator.lifecycle)[number],\n              value\n            )\n          )\n          return\n        }\n        if (key === \"ref\") {\n          this.addInitStatement(this.initElement(dlNodeName, value))\n          return\n        }\n        if (key === \"elements\") {\n          this.addInitStatement(this.initElement(dlNodeName, value, true))\n          return\n        }\n        if (key === \"_$content\") {\n          this.addUpdateStatements(\n            dependencyIndexArr,\n            this.setCompContent(dlNodeName, value, dependenciesNode)\n          )\n          return\n        }\n        if (key === \"props\") {\n          this.addUpdateStatements(\n            dependencyIndexArr,\n            this.setCompProps(dlNodeName, value, dependenciesNode)\n          )\n          return\n        }\n\n        this.addUpdateStatements(\n          dependencyIndexArr,\n          this.setCompProp(dlNodeName, key, value, dependenciesNode)\n        )\n      }\n    )\n\n    // ---- Add addUpdate last\n    if (props.didUpdate) {\n      this.addUpdateStatements(\n        allDependencyIndexArr,\n        this.addOnUpdate(dlNodeName, props.didUpdate.value)\n      )\n    }\n\n    return dlNodeName\n  }\n\n  /**\n   * @View\n   * null\n   *  or\n   * [[prop1, value1, deps1], [prop2, value2, deps2], ...\n   */\n  private generateCompProps(\n    props: Record<string, DependencyProp>\n  ): t.Expression {\n    if (Object.keys(props).length === 0) return this.t.nullLiteral()\n    return this.t.arrayExpression(\n      Object.entries(props).map(([key, { value, dependenciesNode }]) => {\n        return this.t.arrayExpression([\n          this.t.stringLiteral(key),\n          value,\n          dependenciesNode,\n        ])\n      })\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName} = new ${tag}()\n   * ${dlNodeName}._$init(${props}, ${content}, ${children}, ${this})\n   */\n  private declareCompNode(\n    dlNodeName: string,\n    tag: t.Expression,\n    props: Record<string, DependencyProp>,\n    children: ViewParticle[]\n  ): t.Statement[] {\n    const willForwardProps = \"forwardProps\" in props\n    const newProps = Object.fromEntries(\n      Object.entries(props).filter(\n        ([key]) =>\n          ![\n            \"ref\",\n            \"elements\",\n            \"forwardProps\",\n            \"_$content\",\n            \"didUpdate\",\n            \"props\",\n            ...CompGenerator.lifecycle,\n          ].includes(key)\n      )\n    )\n\n    const content = props._$content\n\n    return [\n      this.t.expressionStatement(\n        this.t.assignmentExpression(\n          \"=\",\n          this.t.identifier(dlNodeName),\n          this.t.newExpression(tag, [])\n        )\n      ),\n      this.t.expressionStatement(\n        this.t.callExpression(\n          this.t.memberExpression(\n            this.t.identifier(dlNodeName),\n            this.t.identifier(\"_$init\")\n          ),\n          [\n            this.generateCompProps(newProps),\n            content\n              ? this.t.arrayExpression([\n                  content.value,\n                  content.dependenciesNode,\n                ])\n              : this.t.nullLiteral(),\n            children.length > 0\n              ? this.t.identifier(this.declarePropView(children))\n              : this.t.nullLiteral(),\n            willForwardProps ? this.t.identifier(\"this\") : this.t.nullLiteral(),\n          ]\n        )\n      ),\n    ]\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}._$setContent(() => ${value}, ${dependenciesNode})\n   */\n  private setCompContent(\n    dlNodeName: string,\n    value: t.Expression,\n    dependenciesNode: t.ArrayExpression\n  ): t.Statement {\n    return this.optionalExpression(\n      dlNodeName,\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"_$setContent\")\n        ),\n        [this.t.arrowFunctionExpression([], value), dependenciesNode]\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}._$setProp(${key}, () => ${value}, ${dependenciesNode})\n   */\n  private setCompProp(\n    dlNodeName: string,\n    key: string,\n    value: t.Expression,\n    dependenciesNode: t.ArrayExpression\n  ): t.Statement {\n    return this.optionalExpression(\n      dlNodeName,\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"_$setProp\")\n        ),\n        [\n          this.t.stringLiteral(key),\n          this.t.arrowFunctionExpression([], value),\n          dependenciesNode,\n        ]\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}._$setProps(() => ${value}, ${dependenciesNode})\n   */\n  private setCompProps(\n    dlNodeName: string,\n    value: t.Expression,\n    dependenciesNode: t.ArrayExpression\n  ): t.Statement {\n    return this.optionalExpression(\n      dlNodeName,\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"_$setProps\")\n        ),\n        [this.t.arrowFunctionExpression([], value), dependenciesNode]\n      )\n    )\n  }\n}\n","import { createErrorHandler } from \"@dlightjs/error-handler\"\n\nexport const DLError = createErrorHandler(\n  \"ViewGenerator\",\n  {\n    1: \"Element prop in HTML should be a function or an identifier\",\n    2: \"Unrecognized HTML common prop\",\n    3: \"Do prop only accepts function or arrow function\",\n  },\n  {},\n  {\n    1: \"ExpressionNode only supports prop as element and lifecycle, receiving $0\",\n  }\n)\n","import { type types as t } from \"@babel/core\"\nimport { DLError } from \"../error\"\nimport ForwardPropGenerator from \"./ForwardPropGenerator\"\n\nexport default class HTMLPropGenerator extends ForwardPropGenerator {\n  static DelegatedEvents = new Set([\n    \"beforeinput\",\n    \"click\",\n    \"dblclick\",\n    \"contextmenu\",\n    \"focusin\",\n    \"focusout\",\n    \"input\",\n    \"keydown\",\n    \"keyup\",\n    \"mousedown\",\n    \"mousemove\",\n    \"mouseout\",\n    \"mouseover\",\n    \"mouseup\",\n    \"pointerdown\",\n    \"pointermove\",\n    \"pointerout\",\n    \"pointerover\",\n    \"pointerup\",\n    \"touchend\",\n    \"touchmove\",\n    \"touchstart\",\n  ])\n\n  /**\n   * @brief Add any HTML props according to the key\n   * @param name\n   * @param tag\n   * @param key\n   * @param value\n   * @param dependencyIndexArr\n   * @returns t.Statement\n   */\n  addHTMLProp(\n    name: string,\n    tag: string,\n    key: string,\n    value: t.Expression,\n    dynamic: boolean,\n    dependencyIndexArr: number[],\n    dependenciesNode: t.ArrayExpression\n  ): t.Statement | null {\n    // ---- Dynamic HTML prop with init and update\n    if (dynamic) {\n      this.addUpdateStatements(\n        dependencyIndexArr,\n        this.setDynamicHTMLProp(name, tag, key, value, dependenciesNode, true)\n      )\n      return this.setDynamicHTMLProp(\n        name,\n        tag,\n        key,\n        value,\n        dependenciesNode,\n        false\n      )\n    }\n    // ---- Static HTML prop with init only\n    return this.setStaticHTMLProp(name, tag, key, value)\n  }\n\n  /**\n   * @View\n   * insertNode(${dlNodeName}, ${childNodeName}, ${position})\n   */\n  insertNode(\n    dlNodeName: string,\n    childNodeName: string,\n    position: number\n  ): t.ExpressionStatement {\n    return this.t.expressionStatement(\n      this.t.callExpression(this.t.identifier(this.importMap.insertNode), [\n        this.t.identifier(dlNodeName),\n        this.t.identifier(childNodeName),\n        this.t.numericLiteral(position),\n      ])\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName} && ${expression}\n   */\n  private setPropWithCheck(\n    dlNodeName: string,\n    expression: t.Expression,\n    check: boolean\n  ): t.Statement {\n    if (check) {\n      return this.optionalExpression(dlNodeName, expression)\n    }\n    return this.t.expressionStatement(expression)\n  }\n\n  /**\n   * @View\n   * setStyle(${dlNodeName}, ${value})\n   */\n  private setHTMLStyle(\n    dlNodeName: string,\n    value: t.Expression,\n    check: boolean\n  ): t.Statement {\n    return this.setPropWithCheck(\n      dlNodeName,\n      this.t.callExpression(this.t.identifier(this.importMap.setStyle), [\n        this.t.identifier(dlNodeName),\n        value,\n      ]),\n      check\n    )\n  }\n\n  /**\n   * @View\n   * setStyle(${dlNodeName}, ${value})\n   */\n  private setHTMLDataset(\n    dlNodeName: string,\n    value: t.Expression,\n    check: boolean\n  ): t.Statement {\n    return this.setPropWithCheck(\n      dlNodeName,\n      this.t.callExpression(this.t.identifier(this.importMap.setDataset), [\n        this.t.identifier(dlNodeName),\n        value,\n      ]),\n      check\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}.${key} = ${value}\n   */\n  private setHTMLProp(\n    dlNodeName: string,\n    key: string,\n    value: t.Expression\n  ): t.Statement {\n    return this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(key)\n        ),\n        value\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}.setAttribute(${key}, ${value})\n   */\n  private setHTMLAttr(\n    dlNodeName: string,\n    key: string,\n    value: t.Expression\n  ): t.Statement {\n    return this.t.expressionStatement(\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"setAttribute\")\n        ),\n        [this.t.stringLiteral(key), value]\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}.addEventListener(${key}, ${value})\n   */\n  private setHTMLEvent(\n    dlNodeName: string,\n    key: string,\n    value: t.Expression\n  ): t.Statement {\n    return this.t.expressionStatement(\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"addEventListener\")\n        ),\n        [this.t.stringLiteral(key), value]\n      )\n    )\n  }\n\n  /**\n   * @View\n   * setEvent(${dlNodeName}, ${key}, ${value})\n   */\n  private setEvent(\n    dlNodeName: string,\n    key: string,\n    value: t.Expression,\n    check: boolean\n  ): t.Statement {\n    return this.setPropWithCheck(\n      dlNodeName,\n      this.t.callExpression(this.t.identifier(this.importMap.setEvent), [\n        this.t.identifier(dlNodeName),\n        this.t.stringLiteral(key),\n        value,\n      ]),\n      check\n    )\n  }\n\n  /**\n   * @View\n   * delegateEvent(${dlNodeName}, ${key}, ${value})\n   */\n  private delegateEvent(\n    dlNodeName: string,\n    key: string,\n    value: t.Expression,\n    check: boolean\n  ): t.Statement {\n    return this.setPropWithCheck(\n      dlNodeName,\n      this.t.callExpression(this.t.identifier(this.importMap.delegateEvent), [\n        this.t.identifier(dlNodeName),\n        this.t.stringLiteral(key),\n        value,\n      ]),\n      check\n    )\n  }\n\n  /**\n   * @View\n   * setHTMLProp(${dlNodeName}, ${key}, ${valueFunc}, ${dependenciesNode})\n   */\n  private setCachedProp(\n    dlNodeName: string,\n    key: string,\n    value: t.Expression,\n    dependenciesNode: t.ArrayExpression,\n    check: boolean\n  ): t.Statement {\n    return this.setPropWithCheck(\n      dlNodeName,\n      this.t.callExpression(this.t.identifier(this.importMap.setHTMLProp), [\n        this.t.identifier(dlNodeName),\n        this.t.stringLiteral(key),\n        this.t.arrowFunctionExpression([], value),\n        dependenciesNode,\n      ]),\n      check\n    )\n  }\n\n  /**\n   * @View\n   * setHTMLAttr(${dlNodeName}, ${key}, ${valueFunc}, ${dependenciesNode}, ${check})\n   */\n  private setCachedAttr(\n    dlNodeName: string,\n    key: string,\n    value: t.Expression,\n    dependenciesNode: t.ArrayExpression,\n    check: boolean\n  ): t.Statement {\n    return this.setPropWithCheck(\n      dlNodeName,\n      this.t.callExpression(this.t.identifier(this.importMap.setHTMLAttr), [\n        this.t.identifier(dlNodeName),\n        this.t.stringLiteral(key),\n        this.t.arrowFunctionExpression([], value),\n        dependenciesNode,\n      ]),\n      check\n    )\n  }\n\n  /**\n   * @View\n   * setHTMLProps(${dlNodeName}, ${value})\n   */\n  private setHTMLPropObject(\n    dlNodeName: string,\n    value: t.Expression,\n    check: boolean\n  ): t.Statement {\n    return this.setPropWithCheck(\n      dlNodeName,\n      this.t.callExpression(this.t.identifier(this.importMap.setHTMLProps), [\n        this.t.identifier(dlNodeName),\n        value,\n      ]),\n      check\n    )\n  }\n\n  /**\n   * @View\n   * setHTMLAttrs(${dlNodeName}, ${value})\n   */\n  private setHTMLAttrObject(\n    dlNodeName: string,\n    value: t.Expression,\n    check: boolean\n  ): t.Statement {\n    return this.setPropWithCheck(\n      dlNodeName,\n      this.t.callExpression(this.t.identifier(this.importMap.setHTMLAttrs), [\n        this.t.identifier(dlNodeName),\n        value,\n      ]),\n      check\n    )\n  }\n\n  private static commonHTMLPropKeys = [\n    \"style\",\n    \"dataset\",\n    \"props\",\n    \"ref\",\n    \"attrs\",\n    \"forwardProps\",\n    ...HTMLPropGenerator.lifecycle,\n  ]\n\n  /**\n   * For style/dataset/ref/attr/prop\n   */\n  private addCommonHTMLProp(\n    dlNodeName: string,\n    attrName: string,\n    value: t.Expression,\n    check: boolean\n  ): t.Statement | null {\n    if (\n      HTMLPropGenerator.lifecycle.includes(\n        attrName as (typeof HTMLPropGenerator.lifecycle)[number]\n      )\n    ) {\n      if (!check)\n        return this.addLifecycle(\n          dlNodeName,\n          attrName as (typeof HTMLPropGenerator.lifecycle)[number],\n          value\n        )\n      return null\n    }\n    if (attrName === \"ref\") {\n      if (!check) return this.initElement(dlNodeName, value)\n      return null\n    }\n    if (attrName === \"style\") return this.setHTMLStyle(dlNodeName, value, check)\n    if (attrName === \"dataset\")\n      return this.setHTMLDataset(dlNodeName, value, check)\n    if (attrName === \"props\")\n      return this.setHTMLPropObject(dlNodeName, value, check)\n    if (attrName === \"attrs\")\n      return this.setHTMLAttrObject(dlNodeName, value, check)\n    if (attrName === \"forwardProps\") return this.forwardProps(dlNodeName)\n    return DLError.throw2()\n  }\n\n  /**\n   * @View\n   * 1. Event listener\n   *  - ${dlNodeName}.addEventListener(${key}, ${value})\n   * 2. HTML internal attribute -> DOM property\n   *  - ${dlNodeName}.${key} = ${value}\n   * 3. HTML custom attribute\n   *  - ${dlNodeName}.setAttribute(${key}, ${value})\n   */\n  private setStaticHTMLProp(\n    dlNodeName: string,\n    tag: string,\n    attrName: string,\n    value: t.Expression\n  ): t.Statement | null {\n    if (HTMLPropGenerator.commonHTMLPropKeys.includes(attrName))\n      return this.addCommonHTMLProp(dlNodeName, attrName, value, false)\n    if (attrName.startsWith(\"on\")) {\n      const eventName = attrName.slice(2).toLowerCase()\n      if (HTMLPropGenerator.DelegatedEvents.has(eventName)) {\n        return this.delegateEvent(dlNodeName, eventName, value, false)\n      }\n      return this.setHTMLEvent(dlNodeName, eventName, value)\n    }\n    if (this.isInternalAttribute(tag, attrName)) {\n      if (attrName === \"class\") attrName = \"className\"\n      else if (attrName === \"for\") attrName = \"htmlFor\"\n      return this.setHTMLProp(dlNodeName, attrName, value)\n    }\n    return this.setHTMLAttr(dlNodeName, attrName, value)\n  }\n\n  /**\n   * @View\n   * 1. Event listener\n   *  - ${setEvent}(${dlNodeName}, ${key}, ${value})\n   * 2. HTML internal attribute -> DOM property\n   *  - ${setHTMLProp}(${dlNodeName}, ${key}, ${value})\n   * 3. HTML custom attribute\n   *  - ${setHTMLAttr}(${dlNodeName}, ${key}, ${value})\n   */\n  private setDynamicHTMLProp(\n    dlNodeName: string,\n    tag: string,\n    attrName: string,\n    value: t.Expression,\n    dependenciesNode: t.ArrayExpression,\n    check: boolean\n  ): t.Statement | null {\n    if (HTMLPropGenerator.commonHTMLPropKeys.includes(attrName))\n      return this.addCommonHTMLProp(dlNodeName, attrName, value, check)\n    if (attrName.startsWith(\"on\")) {\n      const eventName = attrName.slice(2).toLowerCase()\n      if (HTMLPropGenerator.DelegatedEvents.has(eventName)) {\n        return this.delegateEvent(dlNodeName, eventName, value, check)\n      }\n      return this.setEvent(dlNodeName, eventName, value, check)\n    }\n    if (this.alterAttributeMap[attrName]) {\n      attrName = this.alterAttributeMap[attrName]\n    }\n    if (this.isInternalAttribute(tag, attrName)) {\n      return this.setCachedProp(\n        dlNodeName,\n        attrName,\n        value,\n        dependenciesNode,\n        check\n      )\n    }\n    return this.setCachedAttr(\n      dlNodeName,\n      attrName,\n      value,\n      dependenciesNode,\n      check\n    )\n  }\n\n  /**\n   * @brief Check if the attribute is internal, i.e., can be accessed as js property\n   * @param tag\n   * @param attribute\n   * @returns true if the attribute is internal\n   */\n  isInternalAttribute(tag: string, attribute: string): boolean {\n    return (\n      this.elementAttributeMap[\"*\"]?.includes(attribute) ||\n      this.elementAttributeMap[tag]?.includes(attribute)\n    )\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport { type HTMLParticle } from \"@dlightjs/reactivity-parser\"\nimport HTMLPropGenerator from \"../HelperGenerators/HTMLPropGenerator\"\n\nexport default class HTMLGenerator extends HTMLPropGenerator {\n  run() {\n    const { tag, props, children } = this.viewParticle as HTMLParticle\n\n    const dlNodeName = this.generateNodeName()\n\n    this.addInitStatement(this.declareHTMLNode(dlNodeName, tag))\n\n    // ---- Resolve props\n    // ---- Use the tag name to check if the prop is internal for the tag,\n    //      for dynamic tag, we can't check it, so we just assume it's not internal\n    //      represent by the \"ANY\" tag name\n    const tagName = this.t.isStringLiteral(tag) ? tag.value : \"ANY\"\n    const allDependencyIndexArr: number[] = []\n    Object.entries(props).forEach(\n      ([key, { value, dependencyIndexArr, dependenciesNode, dynamic }]) => {\n        if (key === \"didUpdate\") return\n        allDependencyIndexArr.push(...(dependencyIndexArr ?? []))\n        this.addInitStatement(\n          this.addHTMLProp(\n            dlNodeName,\n            tagName,\n            key,\n            value,\n            dynamic,\n            dependencyIndexArr,\n            dependenciesNode\n          )\n        )\n      }\n    )\n    if (props.didUpdate) {\n      this.addUpdateStatements(\n        allDependencyIndexArr,\n        this.addOnUpdate(dlNodeName, props.didUpdate.value)\n      )\n    }\n\n    // ---- Resolve children\n    const childNames: string[] = []\n    let mutable = false\n    children.forEach((child, idx) => {\n      const [initStatements, childName] = this.generateChild(child)\n      childNames.push(childName)\n      this.addInitStatement(...initStatements)\n      if (child.type === \"html\") {\n        this.addInitStatement(this.appendChild(dlNodeName, childName))\n      } else {\n        mutable = true\n        this.addInitStatement(this.insertNode(dlNodeName, childName, idx))\n      }\n    })\n    if (mutable)\n      this.addInitStatement(this.setHTMLNodes(dlNodeName, childNames))\n\n    return dlNodeName\n  }\n\n  /**\n   * @View\n   * ${dlNodeName} = createElement(${tag})\n   */\n  private declareHTMLNode(dlNodeName: string, tag: t.Expression): t.Statement {\n    return this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.identifier(dlNodeName),\n        this.t.callExpression(this.t.identifier(this.importMap.createElement), [\n          tag,\n        ])\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}._$nodes = [...${childNames}]\n   */\n  private setHTMLNodes(dlNodeName: string, childNames: string[]): t.Statement {\n    return this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"_$nodes\")\n        ),\n        this.t.arrayExpression(childNames.map(name => this.t.identifier(name)))\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}.appendChild(${childNodeName})\n   */\n  private appendChild(dlNodeName: string, childNodeName: string): t.Statement {\n    return this.t.expressionStatement(\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"appendChild\")\n        ),\n        [this.t.identifier(childNodeName)]\n      )\n    )\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport {\n  type HTMLParticle,\n  type TemplateParticle,\n} from \"@dlightjs/reactivity-parser\"\nimport HTMLPropGenerator from \"../HelperGenerators/HTMLPropGenerator\"\n\nexport default class TemplateGenerator extends HTMLPropGenerator {\n  run() {\n    const { template, mutableParticles, props } = this\n      .viewParticle as TemplateParticle\n\n    const dlNodeName = this.generateNodeName()\n    // ---- Add template declaration to class\n    const templateName = this.addTemplate(template)\n    // ---- Declare template node in View body\n    this.addInitStatement(this.declareTemplateNode(dlNodeName, templateName))\n\n    // ---- Insert elements first\n    const paths: number[][] = []\n    props.forEach(({ path }) => {\n      paths.push(path)\n    })\n    mutableParticles.forEach(({ path }) => {\n      paths.push(path.slice(0, -1))\n    })\n    const [insertElementStatements, pathNameMap] = this.insertElements(\n      paths,\n      dlNodeName\n    )\n    this.addInitStatement(...insertElementStatements)\n\n    // ---- Resolve props\n    const didUpdateMap: Record<\n      string,\n      { deps: number[]; value?: t.Expression }\n    > = {}\n    props.forEach(\n      ({\n        tag,\n        path,\n        key,\n        value,\n        dependencyIndexArr,\n        dependenciesNode,\n        dynamic,\n      }) => {\n        const name = pathNameMap[path.join(\".\")]\n        if (!didUpdateMap[name])\n          didUpdateMap[name] = {\n            deps: [],\n          }\n        if (key === \"didUpdate\") {\n          didUpdateMap[name].value = value\n          return\n        }\n\n        didUpdateMap[name].deps.push(...dependencyIndexArr)\n\n        this.addInitStatement(\n          this.addHTMLProp(\n            name,\n            tag,\n            key,\n            value,\n            dynamic,\n            dependencyIndexArr,\n            dependenciesNode\n          )\n        )\n      }\n    )\n\n    Object.entries(didUpdateMap).forEach(([name, { deps, value }]) => {\n      if (!value) return\n      this.addUpdateStatements(deps, this.addOnUpdate(name, value))\n    })\n\n    // ---- Resolve mutable particles\n    mutableParticles.forEach(particle => {\n      const path = particle.path\n      // ---- Find parent htmlElement\n      const parentName = pathNameMap[path.slice(0, -1).join(\".\")]\n      const [initStatements, childName] = this.generateChild(particle)\n      this.addInitStatement(...initStatements)\n      this.addInitStatement(\n        this.insertNode(parentName, childName, path[path.length - 1])\n      )\n    })\n\n    return dlNodeName\n  }\n\n  /**\n   * @View\n   * static ${templateName} = (() => {\n   *   let _$node0, _$node1, ...\n   *   ${template}\n   *\n   *  return _$node0\n   * })()\n   */\n  private addTemplate(template: HTMLParticle): string {\n    const templateName = this.generateTemplateName()\n    const [statements, nodeName, , nodeIdx] = this.generateChild(\n      template,\n      false,\n      true\n    )\n    this.addStaticClassProperty(\n      templateName,\n      this.t.callExpression(\n        this.t.arrowFunctionExpression(\n          [],\n          this.t.blockStatement([\n            ...this.declareNodes(nodeIdx),\n            ...statements,\n            this.t.returnStatement(this.t.identifier(nodeName)),\n          ])\n        ),\n        []\n      )\n    )\n\n    return templateName\n  }\n\n  /**\n   * @View\n   * ${dlNodeName} = ${this.className}.${templateName}.cloneNode(true)\n   */\n  private declareTemplateNode(\n    dlNodeName: string,\n    templateName: string\n  ): t.Statement {\n    return this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.identifier(dlNodeName),\n        this.t.callExpression(\n          this.t.memberExpression(\n            this.t.memberExpression(\n              this.t.identifier(this.className),\n              this.t.identifier(templateName)\n            ),\n            this.t.identifier(\"cloneNode\")\n          ),\n          [this.t.booleanLiteral(true)]\n        )\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}.firstChild\n   *  or\n   * ${dlNodeName}.firstChild.nextSibling\n   *  or\n   * ...\n   * ${dlNodeName}.childNodes[${num}]\n   */\n  private insertElement(\n    dlNodeName: string,\n    path: number[],\n    offset: number\n  ): t.Statement {\n    const newNodeName = this.generateNodeName()\n    if (path.length === 0) {\n      return this.t.expressionStatement(\n        this.t.assignmentExpression(\n          \"=\",\n          this.t.identifier(newNodeName),\n          Array.from({ length: offset }).reduce(\n            (acc: t.Expression) =>\n              this.t.memberExpression(acc, this.t.identifier(\"nextSibling\")),\n            this.t.identifier(dlNodeName)\n          )\n        )\n      )\n    }\n    const addFirstChild = (object: t.Expression) =>\n      // ---- ${object}.firstChild\n      this.t.memberExpression(object, this.t.identifier(\"firstChild\"))\n    const addSecondChild = (object: t.Expression) =>\n      // ---- ${object}.firstChild.nextSibling\n      this.t.memberExpression(\n        addFirstChild(object),\n        this.t.identifier(\"nextSibling\")\n      )\n    const addThirdChild = (object: t.Expression) =>\n      // ---- ${object}.firstChild.nextSibling.nextSibling\n      this.t.memberExpression(\n        addSecondChild(object),\n        this.t.identifier(\"nextSibling\")\n      )\n    const addOtherChild = (object: t.Expression, num: number) =>\n      // ---- ${object}.childNodes[${num}]\n      this.t.memberExpression(\n        this.t.memberExpression(object, this.t.identifier(\"childNodes\")),\n        this.t.numericLiteral(num),\n        true\n      )\n    const addNextSibling = (object: t.Expression) =>\n      // ---- ${object}.nextSibling\n      this.t.memberExpression(object, this.t.identifier(\"nextSibling\"))\n    return this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.identifier(newNodeName),\n        path.reduce((acc: t.Expression, cur: number, idx) => {\n          if (idx === 0 && offset > 0) {\n            for (let i = 0; i < offset; i++) acc = addNextSibling(acc)\n          }\n          if (cur === 0) return addFirstChild(acc)\n          if (cur === 1) return addSecondChild(acc)\n          if (cur === 2) return addThirdChild(acc)\n          return addOtherChild(acc, cur)\n        }, this.t.identifier(dlNodeName))\n      )\n    )\n  }\n\n  /**\n   * @brief Insert elements to the template node from the paths\n   * @param paths\n   * @param dlNodeName\n   * @returns\n   */\n  private insertElements(\n    paths: number[][],\n    dlNodeName: string\n  ): [t.Statement[], Record<string, string>] {\n    const [statements, collect] = HTMLPropGenerator.statementsCollector()\n    const nameMap: Record<string, number[]> = { [dlNodeName]: [] }\n\n    const commonPrefixPaths = TemplateGenerator.pathWithCommonPrefix(paths)\n\n    commonPrefixPaths.forEach(path => {\n      const res = TemplateGenerator.findBestNodeAndPath(\n        nameMap,\n        path,\n        dlNodeName\n      )\n      const [, pat, offset] = res\n      let name = res[0]\n\n      if (pat.length !== 0 || offset !== 0) {\n        collect(this.insertElement(name, pat, offset))\n        name = this.generateNodeName(this.nodeIdx)\n        nameMap[name] = path\n      }\n    })\n    const pathNameMap = Object.fromEntries(\n      Object.entries(nameMap).map(([name, path]) => [path.join(\".\"), name])\n    )\n\n    return [statements, pathNameMap]\n  }\n\n  // ---- Path related\n  /**\n   * @brief Extract common prefix from paths\n   *  e.g.\n   *    [0, 1, 2, 3] + [0, 1, 2, 4] => [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 4]\n   *  [0, 1, 2] is the common prefix\n   * @param paths\n   * @returns paths with common prefix\n   */\n  private static pathWithCommonPrefix(paths: number[][]): number[][] {\n    const allPaths = [...paths]\n    paths.forEach(path0 => {\n      paths.forEach(path1 => {\n        if (path0 === path1) return\n        for (let i = 0; i < path0.length; i++) {\n          if (path0[i] !== path1[i]) {\n            if (i !== 0) {\n              allPaths.push(path0.slice(0, i))\n            }\n            break\n          }\n        }\n      })\n    })\n\n    // ---- Sort by length and then by first element, small to large\n    const sortedPaths = allPaths.sort((a, b) => {\n      if (a.length !== b.length) return a.length - b.length\n      return a[0] - b[0]\n    })\n\n    // ---- Deduplicate\n    const deduplicatedPaths = [\n      ...new Set(sortedPaths.map(path => path.join(\".\"))),\n    ].map(path => path.split(\".\").filter(Boolean).map(Number))\n\n    return deduplicatedPaths\n  }\n\n  /**\n   * @brief Find the best node name and path for the given path by looking into the nameMap.\n   *  If there's a full match, return the name and an empty path\n   *  If there's a partly match, return the name and the remaining path\n   *  If there's a nextSibling match, return the name and the remaining path with sibling offset\n   * @param nameMap\n   * @param path\n   * @param defaultName\n   * @returns [name, path, siblingOffset]\n   */\n  private static findBestNodeAndPath(\n    nameMap: Record<string, number[]>,\n    path: number[],\n    defaultName: string\n  ): [string, number[], number] {\n    let bestMatchCount = 0\n    let bestMatchName: string | undefined\n    let bestHalfMatch: [string, number, number] | undefined\n    Object.entries(nameMap).forEach(([name, pat]) => {\n      let matchCount = 0\n      const pathLength = pat.length\n      for (let i = 0; i < pathLength; i++) {\n        if (pat[i] === path[i]) matchCount++\n      }\n      if (matchCount === pathLength - 1) {\n        const offset = path[pathLength - 1] - pat[pathLength - 1]\n        if (offset > 0 && offset <= 3) {\n          bestHalfMatch = [name, matchCount, offset]\n        }\n      }\n      if (matchCount !== pat.length) return\n      if (matchCount > bestMatchCount) {\n        bestMatchName = name\n        bestMatchCount = matchCount\n      }\n    })\n    if (!bestMatchName) {\n      if (bestHalfMatch) {\n        return [\n          bestHalfMatch[0],\n          path.slice(bestHalfMatch[1] + 1),\n          bestHalfMatch[2],\n        ]\n      }\n      return [defaultName, path, 0]\n    }\n    return [bestMatchName, path.slice(bestMatchCount), 0]\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport BaseGenerator from \"../HelperGenerators/BaseGenerator\"\nimport {\n  type ForParticle,\n  type ViewParticle,\n} from \"@dlightjs/reactivity-parser\"\n\nexport default class ForGenerator extends BaseGenerator {\n  run() {\n    const { item, array, key, children } = this.viewParticle as ForParticle\n\n    const dlNodeName = this.generateNodeName()\n\n    // ---- Declare for node\n    this.addInitStatement(\n      this.declareForNode(\n        dlNodeName,\n        array.value,\n        item,\n        children,\n        BaseGenerator.calcDependencyNum(array.dependencyIndexArr),\n        key\n      )\n    )\n\n    // ---- Update statements\n    this.addUpdateStatements(\n      array.dependencyIndexArr,\n      this.updateForNode(dlNodeName, array.value, item, key)\n    )\n    this.addUpdateStatementsWithoutDep(this.updateForNodeItem(dlNodeName))\n\n    return dlNodeName\n  }\n\n  /**\n   * @View\n   * ${dlNodeName} = new ForNode(${array}, ${depNum}, ${array}.map(${item} => ${key}),\n   * ((${item}, $updateArr, $idx) => {\n   *   $updateArr[$idx] = (changed, $item) => {\n   *      ${item} = $item\n   *      {$updateStatements}\n   *   })\n   *   ${children}\n   *   return [...${topLevelNodes}]\n   * })\n   */\n  private declareForNode(\n    dlNodeName: string,\n    array: t.Expression,\n    item: t.LVal,\n    children: ViewParticle[],\n    depNum: number,\n    key: t.Expression\n  ): t.Statement {\n    // ---- NodeFunc\n    const [childStatements, topLevelNodes, updateStatements, nodeIdx] =\n      this.generateChildren(children, false, true)\n\n    // ---- Update func\n    childStatements.unshift(\n      ...this.declareNodes(nodeIdx),\n      this.t.expressionStatement(\n        this.t.assignmentExpression(\n          \"=\",\n          this.t.memberExpression(\n            this.t.identifier(\"$updateArr\"),\n            this.t.identifier(\"$idx\"),\n            true\n          ),\n          this.t.arrowFunctionExpression(\n            [...this.updateParams, this.t.identifier(\"$item\")],\n            this.t.blockStatement([\n              this.t.expressionStatement(\n                this.t.assignmentExpression(\n                  \"=\",\n                  item,\n                  this.t.identifier(\"$item\")\n                )\n              ),\n              ...this.geneUpdateBody(updateStatements).body,\n            ])\n          )\n        )\n      )\n    )\n\n    // ---- Return statement\n    childStatements.push(this.generateReturnStatement(topLevelNodes))\n\n    return this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.identifier(dlNodeName),\n        this.t.newExpression(this.t.identifier(this.importMap.ForNode), [\n          array,\n          this.t.numericLiteral(depNum),\n          this.getForKeyStatement(array, item, key),\n          this.t.arrowFunctionExpression(\n            [\n              item as any,\n              this.t.identifier(\"$updateArr\"),\n              this.t.identifier(\"$idx\"),\n            ],\n            this.t.blockStatement(childStatements)\n          ),\n        ])\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${array}.map(${item} => ${key})\n   */\n  private getForKeyStatement(\n    array: t.Expression,\n    item: t.LVal,\n    key: t.Expression\n  ): t.Expression {\n    return this.t.isNullLiteral(key)\n      ? key\n      : this.t.callExpression(\n          this.t.memberExpression(array, this.t.identifier(\"map\")),\n          [this.t.arrowFunctionExpression([item as any], key)]\n        )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}.updateArray(${array}, ${array}.map(${item} => ${key}))\n   */\n  private updateForNode(\n    dlNodeName: string,\n    array: t.Expression,\n    item: t.LVal,\n    key: t.Expression\n  ): t.Statement {\n    return this.optionalExpression(\n      dlNodeName,\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"updateArray\")\n        ),\n        [\n          array,\n          ...this.updateParams.slice(1),\n          this.getForKeyStatement(array, item, key),\n        ]\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}?.update(changed)\n   */\n  private updateForNodeItem(dlNodeName: string): t.Statement {\n    return this.optionalExpression(\n      dlNodeName,\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"update\")\n        ),\n        this.updateParams\n      )\n    )\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport BaseGenerator from \"./BaseGenerator\"\n\nexport default class CondGenerator extends BaseGenerator {\n  /**\n   * @View\n   * $thisCond.cond = ${idx}\n   */\n  geneCondIdx(idx: number): t.ExpressionStatement {\n    return this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.memberExpression(\n          this.t.identifier(\"$thisCond\"),\n          this.t.identifier(\"cond\")\n        ),\n        this.t.numericLiteral(idx)\n      )\n    )\n  }\n\n  /**\n   * @View\n   * if ($thisCond.cond === ${idx}) {\n   *  $thisCond.didntChange = true\n   *  return []\n   * }\n   */\n  geneCondCheck(idx: number): t.IfStatement {\n    return this.t.ifStatement(\n      this.t.binaryExpression(\n        \"===\",\n        this.t.memberExpression(\n          this.t.identifier(\"$thisCond\"),\n          this.t.identifier(\"cond\")\n        ),\n        this.t.numericLiteral(idx)\n      ),\n      this.t.blockStatement([\n        this.t.expressionStatement(\n          this.t.assignmentExpression(\n            \"=\",\n            this.t.memberExpression(\n              this.t.identifier(\"$thisCond\"),\n              this.t.identifier(\"didntChange\")\n            ),\n            this.t.booleanLiteral(true)\n          )\n        ),\n        this.t.returnStatement(this.t.arrayExpression([])),\n      ])\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}?.updateCond(key)\n   */\n  updateCondNodeCond(dlNodeName: string): t.Statement {\n    return this.optionalExpression(\n      dlNodeName,\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"updateCond\")\n        ),\n        [...this.updateParams.slice(1)]\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}?.update(changed)\n   */\n  updateCondNode(dlNodeName: string): t.Statement {\n    return this.optionalExpression(\n      dlNodeName,\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"update\")\n        ),\n        this.updateParams\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName} = new CondNode(${depNum}, ($thisCond) => {})\n   */\n  declareCondNode(\n    dlNodeName: string,\n    condFunc: t.BlockStatement,\n    deps: number[]\n  ): t.Statement {\n    return this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.identifier(dlNodeName),\n        this.t.newExpression(this.t.identifier(this.importMap.CondNode), [\n          this.t.numericLiteral(CondGenerator.calcDependencyNum(deps)),\n          this.t.arrowFunctionExpression(\n            [this.t.identifier(\"$thisCond\")],\n            condFunc\n          ),\n        ])\n      )\n    )\n  }\n\n  /**\n   * return $thisCond.cond === ${branchIdx} ? [${nodeNames}] : $thisCond.updateCond()\n   */\n  geneCondReturnStatement(nodeNames: string[], branchIdx: number): t.Statement {\n    // ---- If the returned cond is not the last one,\n    //      it means it's been altered in the childrenNodes,\n    //      so we update the cond again to get the right one\n    return this.t.returnStatement(\n      this.t.conditionalExpression(\n        this.t.binaryExpression(\n          \"===\",\n          this.t.memberExpression(\n            this.t.identifier(\"$thisCond\"),\n            this.t.identifier(\"cond\")\n          ),\n          this.t.numericLiteral(branchIdx)\n        ),\n        this.t.arrayExpression(nodeNames.map(name => this.t.identifier(name))),\n        this.t.callExpression(\n          this.t.memberExpression(\n            this.t.identifier(\"$thisCond\"),\n            this.t.identifier(\"updateCond\")\n          ),\n          this.updateParams.slice(1)\n        )\n      )\n    )\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport { type IfParticle, type IfBranch } from \"@dlightjs/reactivity-parser\"\nimport CondGenerator from \"../HelperGenerators/CondGenerator\"\n\nexport default class IfGenerator extends CondGenerator {\n  run() {\n    const { branches } = this.viewParticle as IfParticle\n    const deps = branches.flatMap(\n      ({ condition }) => condition.dependencyIndexArr ?? []\n    )\n\n    // ---- declareIfNode\n    const dlNodeName = this.generateNodeName()\n    this.addInitStatement(this.declareIfNode(dlNodeName, branches, deps))\n\n    this.addUpdateStatements(deps, this.updateCondNodeCond(dlNodeName))\n    this.addUpdateStatementsWithoutDep(this.updateCondNode(dlNodeName))\n\n    return dlNodeName\n  }\n\n  /**\n   * @View\n   * if (${test}) { ${body} } else { ${alternate} }\n   */\n  geneIfStatement(\n    test: t.Expression,\n    body: t.Statement[],\n    alternate: t.Statement\n  ): t.IfStatement {\n    return this.t.ifStatement(test, this.t.blockStatement(body), alternate)\n  }\n\n  /**\n   * @View\n   * const ${dlNodeName} = new IfNode(($thisCond) => {\n   *   if (cond1) {\n   *    if ($thisCond.cond === 0) return\n   *    ${children}\n   *    $thisCond.cond = 0\n   *    return [nodes]\n   *   } else if (cond2) {\n   *    if ($thisCond.cond === 1) return\n   *    ${children}\n   *    $thisCond.cond = 1\n   *    return [nodes]\n   *   }\n   * })\n   */\n  private declareIfNode(\n    dlNodeName: string,\n    branches: IfBranch[],\n    deps: number[]\n  ): t.Statement {\n    // ---- If no else statement, add one\n    if (\n      !this.t.isBooleanLiteral(branches[branches.length - 1].condition.value, {\n        value: true,\n      })\n    ) {\n      branches.push({\n        condition: {\n          value: this.t.booleanLiteral(true),\n          dependencyIndexArr: [],\n          dependenciesNode: this.t.arrayExpression([]),\n          dynamic: false,\n        },\n        children: [],\n      })\n    }\n    const ifStatement = branches\n      .reverse()\n      .reduce<any>((acc, { condition, children }, i) => {\n        const idx = branches.length - i - 1\n        // ---- Generate children\n        const [childStatements, topLevelNodes, updateStatements, nodeIdx] =\n          this.generateChildren(children, false, true)\n\n        // ---- Even if no updateStatements, we still need reassign an empty updateFunc\n        //      to overwrite the previous one\n        /**\n         * $thisCond.updateFunc = (changed) => { ${updateStatements} }\n         */\n        const updateNode = this.t.expressionStatement(\n          this.t.assignmentExpression(\n            \"=\",\n            this.t.memberExpression(\n              this.t.identifier(\"$thisCond\"),\n              this.t.identifier(\"updateFunc\")\n            ),\n            this.t.arrowFunctionExpression(\n              this.updateParams,\n              this.geneUpdateBody(updateStatements)\n            )\n          )\n        )\n\n        // ---- Update func\n        childStatements.unshift(...this.declareNodes(nodeIdx), updateNode)\n\n        // ---- Check cond and update cond\n        childStatements.unshift(this.geneCondCheck(idx), this.geneCondIdx(idx))\n\n        // ---- Return statement\n        childStatements.push(this.geneCondReturnStatement(topLevelNodes, idx))\n\n        // ---- else statement\n        if (i === 0) return this.t.blockStatement(childStatements)\n\n        return this.geneIfStatement(condition.value, childStatements, acc)\n      }, undefined)\n\n    return this.declareCondNode(\n      dlNodeName,\n      this.t.blockStatement([ifStatement]),\n      deps\n    )\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport {\n  type ViewParticle,\n  type DependencyProp,\n  type EnvParticle,\n} from \"@dlightjs/reactivity-parser\"\nimport PropViewGenerator from \"../HelperGenerators/PropViewGenerator\"\n\nexport default class EnvGenerator extends PropViewGenerator {\n  run() {\n    let { props } = this.viewParticle as EnvParticle\n    props = this.alterPropViews(props)!\n    const { children } = this.viewParticle as EnvParticle\n\n    const dlNodeName = this.generateNodeName()\n\n    this.addInitStatement(this.declareEnvNode(dlNodeName, props))\n\n    // ---- Children\n    this.addInitStatement(this.geneEnvChildren(dlNodeName, children))\n\n    // ---- Update props\n    Object.entries(props).forEach(\n      ([key, { dependencyIndexArr, value, dependenciesNode }]) => {\n        if (!dependencyIndexArr) return\n        this.addUpdateStatements(\n          dependencyIndexArr,\n          this.updateEnvNode(dlNodeName, key, value, dependenciesNode)\n        )\n      }\n    )\n\n    return dlNodeName\n  }\n\n  /**\n   * @View\n   * { ${key}: ${value}, ... }\n   * { ${key}: ${deps}, ... }\n   */\n  private generateEnvs(props: Record<string, DependencyProp>): t.Expression[] {\n    return [\n      this.t.objectExpression(\n        Object.entries(props).map(([key, { value }]) =>\n          this.t.objectProperty(this.t.identifier(key), value)\n        )\n      ),\n      this.t.objectExpression(\n        Object.entries(props)\n          .map(\n            ([key, { dependenciesNode }]) =>\n              dependenciesNode &&\n              this.t.objectProperty(this.t.identifier(key), dependenciesNode)\n          )\n          .filter(Boolean) as t.ObjectProperty[]\n      ),\n    ]\n  }\n\n  /**\n   * @View\n   * ${dlNodeName} = new EnvNode(envs)\n   */\n  private declareEnvNode(\n    dlNodeName: string,\n    props: Record<string, DependencyProp>\n  ): t.Statement {\n    return this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.identifier(dlNodeName),\n        this.t.newExpression(\n          this.t.identifier(this.importMap.EnvNode),\n          this.generateEnvs(props)\n        )\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}.initNodes([${childrenNames}])\n   */\n  private geneEnvChildren(\n    dlNodeName: string,\n    children: ViewParticle[]\n  ): t.Statement {\n    const [statements, childrenNames] = this.generateChildren(children)\n    this.addInitStatement(...statements)\n    return this.t.expressionStatement(\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"initNodes\")\n        ),\n        [\n          this.t.arrayExpression(\n            childrenNames.map(name => this.t.identifier(name))\n          ),\n        ]\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}.updateEnv(${key}, () => ${value}, ${dependenciesNode})\n   */\n  private updateEnvNode(\n    dlNodeName: string,\n    key: string,\n    value: t.Expression,\n    dependenciesNode: t.ArrayExpression\n  ): t.Statement {\n    return this.optionalExpression(\n      dlNodeName,\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"updateEnv\")\n        ),\n        [\n          this.t.stringLiteral(key),\n          this.t.arrowFunctionExpression([], value),\n          dependenciesNode,\n        ]\n      )\n    )\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport { type TextParticle } from \"@dlightjs/reactivity-parser\"\nimport BaseGenerator from \"../HelperGenerators/BaseGenerator\"\n\nexport default class TextGenerator extends BaseGenerator {\n  run() {\n    const { content } = this.viewParticle as TextParticle\n\n    const dlNodeName = this.generateNodeName()\n\n    this.addInitStatement(\n      this.declareTextNode(dlNodeName, content.value, content.dependenciesNode)\n    )\n\n    if (content.dynamic) {\n      this.addUpdateStatements(\n        content.dependencyIndexArr,\n        this.updateTextNode(dlNodeName, content.value, content.dependenciesNode)\n      )\n    }\n\n    return dlNodeName\n  }\n\n  /**\n   * @View\n   * ${dlNodeName} = createTextNode(${value}, ${deps})\n   */\n  private declareTextNode(\n    dlNodeName: string,\n    value: t.Expression,\n    dependenciesNode: t.Expression\n  ): t.Statement {\n    return this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.identifier(dlNodeName),\n        this.t.callExpression(\n          this.t.identifier(this.importMap.createTextNode),\n          [value, dependenciesNode]\n        )\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName} && updateText(${dlNodeName}, () => ${value}, ${deps})\n   */\n  private updateTextNode(\n    dlNodeName: string,\n    value: t.Expression,\n    dependenciesNode: t.Expression\n  ): t.Statement {\n    return this.t.expressionStatement(\n      this.t.logicalExpression(\n        \"&&\",\n        this.t.identifier(dlNodeName),\n        this.t.callExpression(this.t.identifier(this.importMap.updateText), [\n          this.t.identifier(dlNodeName),\n          this.t.arrowFunctionExpression([], value),\n          dependenciesNode,\n        ])\n      )\n    )\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport { type ExpParticle } from \"@dlightjs/reactivity-parser\"\nimport ElementGenerator from \"../HelperGenerators/ElementGenerator\"\nimport { DLError } from \"../error\"\n\nexport default class ExpGenerator extends ElementGenerator {\n  run() {\n    let { content, props } = this.viewParticle as ExpParticle\n    content = this.alterPropView(content)!\n    props = this.alterPropViews(props)\n\n    const dlNodeName = this.generateNodeName()\n\n    this.addInitStatement(\n      this.declareExpNode(dlNodeName, content.value, content.dependenciesNode)\n    )\n\n    if (content.dynamic) {\n      this.addUpdateStatements(\n        content.dependencyIndexArr,\n        this.updateExpNode(dlNodeName, content.value, content.dependenciesNode)\n      )\n    }\n\n    if (props) {\n      Object.entries(props).forEach(([key, { value }]) => {\n        if (\n          ExpGenerator.lifecycle.includes(\n            key as (typeof ExpGenerator.lifecycle)[number]\n          )\n        ) {\n          return this.addInitStatement(\n            this.addLifecycle(\n              dlNodeName,\n              key as (typeof ExpGenerator.lifecycle)[number],\n              value\n            )\n          )\n        }\n        if (key === \"ref\") {\n          return this.addInitStatement(this.initElement(dlNodeName, value))\n        }\n        if (key === \"elements\") {\n          return this.addInitStatement(\n            this.initElement(dlNodeName, value, true)\n          )\n        }\n        if (key === \"didUpdate\") {\n          return this.addUpdateStatements(\n            content.dependencyIndexArr,\n            this.addOnUpdate(dlNodeName, value)\n          )\n        }\n        DLError.warn1(key)\n      })\n    }\n\n    return dlNodeName\n  }\n\n  /**\n   * @View\n   * ${dlNodeName} = new ExpNode(${value}, dependenciesNode)\n   */\n  private declareExpNode(\n    dlNodeName: string,\n    value: t.Expression,\n    dependenciesNode: t.ArrayExpression\n  ): t.Statement {\n    return this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.identifier(dlNodeName),\n        this.t.newExpression(this.t.identifier(this.importMap.ExpNode), [\n          value,\n          dependenciesNode ?? this.t.nullLiteral(),\n        ])\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}.update(() => value, dependenciesNode)\n   */\n  private updateExpNode(\n    dlNodeName: string,\n    value: t.Expression,\n    dependenciesNode: t.ArrayExpression\n  ): t.Statement {\n    return this.optionalExpression(\n      dlNodeName,\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"update\")\n        ),\n        [\n          this.t.arrowFunctionExpression([], value),\n          dependenciesNode ?? this.t.nullLiteral(),\n        ]\n      )\n    )\n  }\n}\n","import {\n  type DependencyProp,\n  type SnippetParticle,\n} from \"@dlightjs/reactivity-parser\"\nimport type { types as t } from \"@babel/core\"\nimport PropViewGenerator from \"../HelperGenerators/PropViewGenerator\"\n\nexport default class SnippetGenerator extends PropViewGenerator {\n  run() {\n    let { props } = this.viewParticle as SnippetParticle\n    props = this.alterPropViews(props)\n    const { tag } = this.viewParticle as SnippetParticle\n\n    const dlNodeName = this.generateNodeName()\n\n    const availableProperties = this.snippetPropMap[tag] ?? []\n\n    const allDependenciesNode: (t.ArrayExpression | t.NullLiteral)[] =\n      Array.from(\n        {\n          length: availableProperties.length,\n        },\n        () => this.t.nullLiteral()\n      )\n\n    const allDependencyIndexArr: number[] = []\n\n    Object.entries(props).forEach(\n      ([key, { value, dependencyIndexArr, dependenciesNode }]) => {\n        if (key === \"didUpdate\") return\n        if (\n          SnippetGenerator.lifecycle.includes(\n            key as (typeof SnippetGenerator.lifecycle)[number]\n          )\n        ) {\n          this.addInitStatement(\n            this.addLifecycle(\n              dlNodeName,\n              key as (typeof SnippetGenerator.lifecycle)[number],\n              value\n            )\n          )\n          return\n        }\n        if (!dependencyIndexArr || dependencyIndexArr.length === 0) return\n        allDependencyIndexArr.push(...dependencyIndexArr)\n        const depIdx = availableProperties.indexOf(key)\n        if (dependenciesNode) allDependenciesNode[depIdx] = dependenciesNode\n        const propChange = 1 << depIdx\n        this.addUpdateStatements(\n          dependencyIndexArr,\n          this.updateProp(\n            dlNodeName,\n            propChange,\n            key,\n            value,\n            allDependenciesNode[depIdx]\n          )\n        )\n      }\n    )\n    if (props.didUpdate) {\n      this.addUpdateStatements(\n        allDependencyIndexArr,\n        this.addOnUpdate(dlNodeName, props.didUpdate.value)\n      )\n    }\n\n    this.addInitStatement(\n      ...this.declareSnippetNode(dlNodeName, tag, props, allDependenciesNode)\n    )\n\n    this.addUpdateStatementsWithoutDep(this.updateSnippet(dlNodeName))\n\n    return dlNodeName\n  }\n\n  /**\n   * @View\n   * { ${key}: ${value}, ... }\n   */\n  private genePropNode(props: Record<string, DependencyProp>): t.Expression {\n    return this.t.objectExpression(\n      Object.entries(props).map(([key, prop]) => {\n        return this.t.objectProperty(this.t.identifier(key), prop.value)\n      })\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName} = new SnippetNode(${allDependenciesNode})\n   * this.${tag}({${props}}, ${dlNodeName})\n   */\n  private declareSnippetNode(\n    dlNodeName: string,\n    tag: string,\n    props: Record<string, DependencyProp>,\n    allDependenciesNode: (t.ArrayExpression | t.NullLiteral)[]\n  ): t.Statement[] {\n    return [\n      this.t.expressionStatement(\n        this.t.assignmentExpression(\n          \"=\",\n          this.t.identifier(dlNodeName),\n          this.t.newExpression(this.t.identifier(this.importMap.SnippetNode), [\n            this.t.arrayExpression(allDependenciesNode),\n          ])\n        )\n      ),\n      this.t.expressionStatement(\n        this.t.callExpression(\n          this.t.memberExpression(\n            this.t.thisExpression(),\n            this.t.identifier(tag)\n          ),\n          [this.genePropNode(props), this.t.identifier(dlNodeName)]\n        )\n      ),\n    ]\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}.updateProp?.(${propChanged}, ...updateParams, () => { ${key}: ${value} }, allDependenciesNode)\n   */\n  private updateProp(\n    dlNodeName: string,\n    propChanged: number,\n    key: string,\n    value: t.Expression,\n    allDependenciesNode: t.ArrayExpression | t.NullLiteral\n  ): t.Statement {\n    return this.optionalExpression(\n      dlNodeName,\n      this.t.optionalCallExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"updateProp\")\n        ),\n        [\n          this.t.numericLiteral(propChanged),\n          ...this.updateParams.slice(1),\n          this.t.arrowFunctionExpression(\n            [],\n            this.t.objectExpression([\n              this.t.objectProperty(this.t.identifier(key), value),\n            ])\n          ),\n          allDependenciesNode,\n        ],\n        true\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}.update(changed)\n   */\n  private updateSnippet(dlNodeName: string): t.Statement {\n    return this.optionalExpression(\n      dlNodeName,\n      this.t.optionalCallExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"update\")\n        ),\n        this.updateParams,\n        true\n      )\n    )\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport { SwitchBranch, SwitchParticle } from \"@dlightjs/reactivity-parser\"\nimport CondGenerator from \"../HelperGenerators/CondGenerator\"\n\nexport default class SwitchGenerator extends CondGenerator {\n  run() {\n    const { branches, discriminant } = this.viewParticle as SwitchParticle\n\n    const deps = branches.flatMap(({ case: _case }) => _case.dependencyIndexArr)\n    deps.push(...discriminant.dependencyIndexArr)\n\n    // ---- declareSwitchNode\n    const dlNodeName = this.generateNodeName()\n    this.addInitStatement(\n      this.declareSwitchNode(dlNodeName, discriminant.value, branches, deps)\n    )\n\n    this.addUpdateStatements(deps, this.updateCondNodeCond(dlNodeName))\n    this.addUpdateStatementsWithoutDep(this.updateCondNode(dlNodeName))\n\n    return dlNodeName\n  }\n\n  /**\n   * @View\n   * const ${dlNodeName} = new CondNode(($thisCond) => {\n   *   switch ($discriminant) {\n   *    case ${case0}:\n   *      if ($thisCond.case === 0) return\n   *    case ${case1}:\n   *      if ($thisCond.case === 1) return\n   *      return [...${case1Nodes}]\n   *    default:\n   *      if ($thisCond.case === 2) return\n   *  }\n   *   _$nodes[0]._$updateFunc = (changed) => {\n   *    _$updates.forEach(update => update(changed))\n   *  })\n   *   return _$nodes\n   * })\n   */\n  private declareSwitchNode(\n    dlNodeName: string,\n    discriminant: t.Expression,\n    branches: SwitchBranch[],\n    deps: number[]\n  ): t.Statement {\n    // ---- Format statements, make fallthrough statements append to the previous case\n    const formattedBranches: SwitchBranch[] = branches.map(\n      ({ case: _case, break: _break, children }, idx) => {\n        if (!_break) {\n          for (let i = idx + 1; i < branches.length; i++) {\n            children.push(...branches[i].children)\n            if (branches[i].break) break\n          }\n        }\n        return { case: _case, break: _break, children }\n      }\n    )\n    // ---- Add default case\n    const defaultCaseIdx = formattedBranches.findIndex(\n      ({ case: _case }) => _case === null\n    )\n    if (defaultCaseIdx === -1) {\n      formattedBranches.push({\n        case: {\n          value: this.t.booleanLiteral(true),\n          dependencyIndexArr: [],\n          dependenciesNode: this.t.arrayExpression([]),\n          dynamic: false,\n        },\n        break: true,\n        children: [],\n      })\n    }\n\n    const switchStatements = formattedBranches.map(\n      ({ case: _case, children }, idx) => {\n        // ---- Generate case statements\n        const [childStatements, topLevelNodes, updateStatements, nodeIdx] =\n          this.generateChildren(children, false, true)\n\n        // ---- Even if no updateStatements, we still need reassign an empty updateFunc\n        //      to overwrite the previous one\n        /**\n         * $thisCond.updateFunc = (changed) => { ${updateStatements} }\n         */\n        const updateNode = this.t.expressionStatement(\n          this.t.assignmentExpression(\n            \"=\",\n            this.t.memberExpression(\n              this.t.identifier(\"$thisCond\"),\n              this.t.identifier(\"updateFunc\")\n            ),\n            this.t.arrowFunctionExpression(\n              this.updateParams,\n              this.geneUpdateBody(updateStatements)\n            )\n          )\n        )\n\n        // ---- Update func\n        childStatements.unshift(...this.declareNodes(nodeIdx), updateNode)\n\n        // ---- Check cond and update cond\n        childStatements.unshift(this.geneCondCheck(idx), this.geneCondIdx(idx))\n\n        // ---- Return statement\n        childStatements.push(this.geneCondReturnStatement(topLevelNodes, idx))\n\n        return this.t.switchCase(_case ? _case.value : null, [\n          this.t.blockStatement(childStatements),\n        ])\n      }\n    )\n\n    return this.declareCondNode(\n      dlNodeName,\n      this.t.blockStatement([\n        this.t.switchStatement(discriminant, switchStatements),\n      ]),\n      deps\n    )\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport BaseGenerator from \"../HelperGenerators/BaseGenerator\"\nimport { TryParticle, type ViewParticle } from \"@dlightjs/reactivity-parser\"\n\nexport default class TryGenerator extends BaseGenerator {\n  run() {\n    const { children, catchChildren, exception } = this\n      .viewParticle as TryParticle\n\n    const dlNodeName = this.generateNodeName()\n\n    // ---- Declare for node\n    this.addInitStatement(\n      this.declareTryNode(dlNodeName, children, catchChildren, exception)\n    )\n\n    // ---- Update statements\n    this.addUpdateStatementsWithoutDep(this.declareUpdate(dlNodeName))\n\n    return dlNodeName\n  }\n\n  /**\n   * @View\n   * $setUpdate($catchable(updateStatements))\n   * ${children}\n   * return [...${topLevelNodes}]\n   */\n  private declareTryNodeUpdate(\n    children: ViewParticle[],\n    addCatchable = true\n  ): t.Statement[] {\n    const [childStatements, topLevelNodes, updateStatements, nodeIdx] =\n      this.generateChildren(children, false, true)\n\n    const updateFunc = this.t.arrowFunctionExpression(\n      [this.t.identifier(\"$changed\")],\n      this.geneUpdateBody(updateStatements)\n    )\n\n    childStatements.unshift(\n      ...this.declareNodes(nodeIdx),\n      this.t.expressionStatement(\n        this.t.callExpression(\n          this.t.identifier(\"$setUpdate\"),\n          addCatchable\n            ? [\n                this.t.callExpression(this.t.identifier(\"$catchable\"), [\n                  updateFunc,\n                ]),\n              ]\n            : [updateFunc]\n        )\n      )\n    )\n    childStatements.push(\n      this.t.returnStatement(\n        this.t.arrayExpression(\n          topLevelNodes.map(node => this.t.identifier(node))\n        )\n      )\n    )\n\n    return childStatements\n  }\n\n  /**\n   * @View\n   * ${dlNodeName} = new TryNode(($setUpdate, $catchable) => {\n   *     ${children}\n   *   }, ($setUpdate, e) => {\n   *     ${catchChildren}\n   *  })\n   * })\n   */\n  private declareTryNode(\n    dlNodeName: string,\n    children: ViewParticle[],\n    catchChildren: ViewParticle[],\n    exception: TryParticle[\"exception\"]\n  ): t.Statement {\n    const exceptionNodes = exception ? [exception] : []\n    return this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.identifier(dlNodeName),\n        this.t.newExpression(this.t.identifier(this.importMap.TryNode), [\n          this.t.arrowFunctionExpression(\n            [this.t.identifier(\"$setUpdate\"), this.t.identifier(\"$catchable\")],\n            this.t.blockStatement(this.declareTryNodeUpdate(children, true))\n          ),\n          this.t.arrowFunctionExpression(\n            [this.t.identifier(\"$setUpdate\"), ...exceptionNodes],\n            this.t.blockStatement(\n              this.declareTryNodeUpdate(catchChildren, false)\n            )\n          ),\n        ])\n      )\n    )\n  }\n\n  /**\n   * @View\n   * ${dlNodeName}?.update(changed)\n   */\n  private declareUpdate(dlNodeName: string): t.Statement {\n    return this.optionalExpression(\n      dlNodeName,\n      this.t.callExpression(\n        this.t.memberExpression(\n          this.t.identifier(dlNodeName),\n          this.t.identifier(\"update\")\n        ),\n        this.updateParams\n      )\n    )\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport { type ViewParticle } from \"@dlightjs/reactivity-parser\"\nimport { type ViewGeneratorConfig } from \"./types\"\nimport BaseGenerator, { prefixMap } from \"./HelperGenerators/BaseGenerator\"\nimport CompGenerator from \"./NodeGenerators/CompGenerator\"\nimport HTMLGenerator from \"./NodeGenerators/HTMLGenerator\"\nimport TemplateGenerator from \"./NodeGenerators/TemplateGenerator\"\nimport ForGenerator from \"./NodeGenerators/ForGenerator\"\nimport IfGenerator from \"./NodeGenerators/IfGenerator\"\nimport EnvGenerator from \"./NodeGenerators/EnvGenerator\"\nimport TextGenerator from \"./NodeGenerators/TextGenerator\"\nimport ExpGenerator from \"./NodeGenerators/ExpGenerator\"\nimport SnippetGenerator from \"./NodeGenerators/SnippetGenerator\"\nimport SwitchGenerator from \"./NodeGenerators/SwitchGenerator\"\nimport TryGenerator from \"./NodeGenerators/TryGenerator\"\n\nexport default class ViewGenerator {\n  config: ViewGeneratorConfig\n  t: typeof t\n\n  /**\n   * @brief Construct the view generator from config\n   * @param config\n   */\n  constructor(config: ViewGeneratorConfig) {\n    this.config = config\n    this.t = config.babelApi.types\n    this.templateIdx = config.templateIdx\n  }\n\n  /**\n   * @brief Different generator classes for different view particle types\n   */\n  static generatorMap: Record<string, typeof BaseGenerator> = {\n    comp: CompGenerator,\n    html: HTMLGenerator,\n    template: TemplateGenerator,\n    for: ForGenerator,\n    if: IfGenerator,\n    switch: SwitchGenerator,\n    env: EnvGenerator,\n    text: TextGenerator,\n    exp: ExpGenerator,\n    snippet: SnippetGenerator,\n    try: TryGenerator,\n  }\n\n  /**\n   * @brief Generate the view given the view particles, mainly used for child particles parsing\n   * @param viewParticles\n   * @returns [initStatements, updateStatements, classProperties, topLevelNodes]\n   */\n  generateChildren(\n    viewParticles: ViewParticle[]\n  ): [\n    t.Statement[],\n    Record<number, t.Statement[]>,\n    t.ClassProperty[],\n    string[],\n  ] {\n    const allInitStatements: t.Statement[] = []\n    const allClassProperties: t.ClassProperty[] = []\n    const allUpdateStatements: Record<number, t.Statement[]> = {}\n    const topLevelNodes: string[] = []\n\n    viewParticles.forEach(viewParticle => {\n      const [initStatements, updateStatements, classProperties, nodeName] =\n        this.generateChild(viewParticle)\n      allInitStatements.push(...initStatements)\n      Object.entries(updateStatements).forEach(([depNum, statements]) => {\n        if (!allUpdateStatements[Number(depNum)]) {\n          allUpdateStatements[Number(depNum)] = []\n        }\n        allUpdateStatements[Number(depNum)].push(...statements)\n      })\n      allClassProperties.push(...classProperties)\n      topLevelNodes.push(nodeName)\n    })\n\n    return [\n      allInitStatements,\n      allUpdateStatements,\n      allClassProperties,\n      topLevelNodes,\n    ]\n  }\n\n  nodeIdx = -1\n  templateIdx = -1\n  /**\n   * @brief Generate the view given the view particle, using generator from the map\n   * @param viewParticle\n   * @returns\n   */\n  generateChild(viewParticle: ViewParticle) {\n    const { type } = viewParticle\n    const GeneratorClass = ViewGenerator.generatorMap[type]\n    if (!GeneratorClass) {\n      throw new Error(`Unknown view particle type: ${type}`)\n    }\n    const generator = new GeneratorClass(viewParticle, this.config)\n    generator.nodeIdx = this.nodeIdx\n    generator.templateIdx = this.templateIdx\n    const result = generator.generate()\n    this.nodeIdx = generator.nodeIdx\n    this.templateIdx = generator.templateIdx\n    return result\n  }\n\n  /**\n   * @View\n   * let node1, node2, ...\n   */\n  declareNodes(): t.Statement[] {\n    if (this.nodeIdx === -1) return []\n    return [\n      this.t.variableDeclaration(\n        \"let\",\n        Array.from({ length: this.nodeIdx + 1 }, (_, i) =>\n          this.t.variableDeclarator(this.t.identifier(`${prefixMap.node}${i}`))\n        )\n      ),\n    ]\n  }\n\n  get updateParams() {\n    return [this.t.identifier(\"$changed\")]\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport { type ViewParticle } from \"@dlightjs/reactivity-parser\"\nimport ViewGenerator from \"./ViewGenerator\"\n\nexport default class MainViewGenerator extends ViewGenerator {\n  /**\n   * @brief Generate the main view, i.e., View() { ... }\n   * @param viewParticles\n   * @returns [viewBody, classProperties, templateIdx]\n   */\n  generate(\n    viewParticles: ViewParticle[]\n  ): [t.BlockStatement, t.ClassProperty[], number] {\n    const allClassProperties: t.ClassProperty[] = []\n    const allInitStatements: t.Statement[] = []\n    const allUpdateStatements: Record<number, t.Statement[]> = {}\n    const topLevelNodes: string[] = []\n\n    viewParticles.forEach(viewParticle => {\n      const [initStatements, updateStatements, classProperties, nodeName] =\n        this.generateChild(viewParticle)\n      allInitStatements.push(...initStatements)\n      Object.entries(updateStatements).forEach(([depNum, statements]) => {\n        if (!allUpdateStatements[Number(depNum)]) {\n          allUpdateStatements[Number(depNum)] = []\n        }\n        allUpdateStatements[Number(depNum)].push(...statements)\n      })\n      allClassProperties.push(...classProperties)\n      topLevelNodes.push(nodeName)\n    })\n\n    const viewBody = this.t.blockStatement([\n      ...this.declareNodes(),\n      ...this.geneUpdate(allUpdateStatements),\n      ...allInitStatements,\n      this.geneReturn(topLevelNodes),\n    ])\n\n    return [viewBody, allClassProperties, this.templateIdx]\n  }\n\n  /**\n   * @View\n   * this._$update = ($changed) => {\n   *  if ($changed & 1) {\n   *    ...\n   *  }\n   *  ...\n   * }\n   */\n  private geneUpdate(\n    updateStatements: Record<number, t.Statement[]>\n  ): t.Statement[] {\n    if (Object.keys(updateStatements).length === 0) return []\n    return [\n      this.t.expressionStatement(\n        this.t.assignmentExpression(\n          \"=\",\n          this.t.memberExpression(\n            this.t.thisExpression(),\n            this.t.identifier(\"_$update\"),\n            false\n          ),\n          this.t.arrowFunctionExpression(\n            this.updateParams,\n            this.t.blockStatement([\n              ...Object.entries(updateStatements)\n                .filter(([depNum]) => depNum !== \"0\")\n                .map(([depNum, statements]) => {\n                  return this.t.ifStatement(\n                    this.t.binaryExpression(\n                      \"&\",\n                      this.t.identifier(\"$changed\"),\n                      this.t.numericLiteral(Number(depNum))\n                    ),\n                    this.t.blockStatement(statements)\n                  )\n                }),\n              ...(updateStatements[0] ?? []),\n            ])\n          )\n        )\n      ),\n    ]\n  }\n\n  /**\n   * @View\n   * return [${nodeNames}]\n   */\n  private geneReturn(topLevelNodes: string[]) {\n    return this.t.returnStatement(\n      this.t.arrayExpression(\n        topLevelNodes.map(nodeName => this.t.identifier(nodeName))\n      )\n    )\n  }\n}\n","import { type types as t } from \"@babel/core\"\nimport { type ViewParticle } from \"@dlightjs/reactivity-parser\"\nimport ViewGenerator from \"./ViewGenerator\"\n\nexport default class SnippetGenerator extends ViewGenerator {\n  /**\n   * @brief Generate the snippet, i.e., @View MySnippet({ prop1, prop2 }) { ... }\n   *  This is different from the main view in that it has a props node\n   *  and is needed to parse twice,\n   *    1. for this.deps (viewParticlesWithPropertyDep)\n   *    2. for props that passed in this snippet (viewParticlesWithIdentityDep)\n   * @param viewParticlesWithPropertyDep\n   * @param viewParticlesWithIdentityDep\n   * @param propsNode\n   * @returns [viewBody, classProperties, templateIdx]\n   */\n  generate(\n    viewParticlesWithPropertyDep: ViewParticle[],\n    viewParticlesWithIdentityDep: ViewParticle[],\n    propsNode: t.ObjectPattern\n  ): [t.BlockStatement, t.ClassProperty[], number] {\n    const allClassProperties: t.ClassProperty[] = []\n    const allInitStatements: t.Statement[] = []\n    const propertyUpdateStatements: Record<number, t.Statement[]> = {}\n    const identifierUpdateStatements: Record<number, t.Statement[]> = {}\n    const topLevelNodes: string[] = []\n\n    const templateIdx = this.templateIdx\n    viewParticlesWithPropertyDep.forEach(viewParticle => {\n      const [initStatements, updateStatements, classProperties, nodeName] =\n        this.generateChild(viewParticle)\n      allInitStatements.push(...initStatements)\n      Object.entries(updateStatements).forEach(([depNum, statements]) => {\n        if (!propertyUpdateStatements[Number(depNum)]) {\n          propertyUpdateStatements[Number(depNum)] = []\n        }\n        propertyUpdateStatements[Number(depNum)].push(...statements)\n      })\n      allClassProperties.push(...classProperties)\n      topLevelNodes.push(nodeName)\n    })\n    // ---- Recover the templateIdx and reinitialize the nodeIdx\n    this.templateIdx = templateIdx\n    this.nodeIdx = -1\n    viewParticlesWithIdentityDep.forEach(viewParticle => {\n      // ---- We only need the update statements for the second props parsing\n      //      because all the init statements are already generated\n      //      a little bit time consuming but otherwise we need to write two different generators\n      const [, updateStatements] = this.generateChild(viewParticle)\n\n      Object.entries(updateStatements).forEach(([depNum, statements]) => {\n        if (!identifierUpdateStatements[Number(depNum)]) {\n          identifierUpdateStatements[Number(depNum)] = []\n        }\n        identifierUpdateStatements[Number(depNum)].push(...statements)\n      })\n    })\n\n    const hasPropertyUpdateFunc =\n      Object.keys(propertyUpdateStatements).length > 0\n    const hasIdentifierUpdateFunc =\n      Object.keys(identifierUpdateStatements).filter(n => n !== \"0\").length > 0\n\n    const viewBody = this.t.blockStatement([\n      ...this.declareNodes(),\n      ...(hasPropertyUpdateFunc\n        ? [this.geneUpdateFunc(\"update\", propertyUpdateStatements)]\n        : []),\n      ...(hasIdentifierUpdateFunc\n        ? [\n            this.geneUpdateFunc(\n              \"updateProp\",\n              identifierUpdateStatements,\n              propsNode\n            ),\n          ]\n        : []),\n      ...allInitStatements,\n      this.geneAddNodes(topLevelNodes),\n    ])\n\n    return [viewBody, allClassProperties, this.templateIdx]\n  }\n\n  /**\n   * @View\n   * $snippetNode._$nodes = ${topLevelNodes}\n   */\n  geneAddNodes(topLevelNodes: string[]): t.Statement {\n    return this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.memberExpression(\n          this.t.identifier(\"$snippetNode\"),\n          this.t.identifier(\"_$nodes\")\n        ),\n        this.t.arrayExpression(\n          topLevelNodes.map(nodeName => this.t.identifier(nodeName))\n        )\n      )\n    )\n  }\n\n  /**\n   * @View\n   * $snippetNode.${name} = (changed) => { ${updateStatements} }\n   */\n  geneUpdateFunc(\n    name: string,\n    updateStatements: Record<number, t.Statement[]>,\n    propsNode?: t.ObjectPattern\n  ): t.Statement {\n    return this.t.expressionStatement(\n      this.t.assignmentExpression(\n        \"=\",\n        this.t.memberExpression(\n          this.t.identifier(\"$snippetNode\"),\n          this.t.identifier(name)\n        ),\n        this.geneUpdateBody(updateStatements, propsNode)\n      )\n    )\n  }\n\n  /**\n   * @View\n   * (changed) => {\n   *  if (changed & 1) {\n   *    ...\n   *  }\n   *  ...\n   * }\n   */\n  private geneUpdateBody(\n    updateStatements: Record<number, t.Statement[]>,\n    propsNode?: t.ObjectPattern\n  ): t.ArrowFunctionExpression {\n    const bodyEntryNodes: t.Statement[] = []\n    // ---- Args\n    const args: t.Identifier[] = this.updateParams\n    if (propsNode) {\n      // ---- Add $snippetProps and $depsArr to args\n      args.push(\n        this.t.identifier(\"$snippetPropsFunc\"),\n        this.t.identifier(\"$depsArr\")\n      )\n\n      // ---- Add cache\n      /**\n       * if ($snippetNode.cached(depsArr, changed)) return\n       */\n      bodyEntryNodes.push(\n        this.t.ifStatement(\n          this.t.callExpression(\n            this.t.memberExpression(\n              this.t.identifier(\"$snippetNode\"),\n              this.t.identifier(\"cached\")\n            ),\n            [this.t.identifier(\"$depsArr\"), this.t.identifier(\"$changed\")]\n          ),\n          this.t.blockStatement([this.t.returnStatement()])\n        )\n      )\n\n      /**\n       * const $snippetProps = $snippetPropsFunc()\n       */\n      bodyEntryNodes.push(\n        this.t.variableDeclaration(\"const\", [\n          this.t.variableDeclarator(\n            this.t.identifier(\"$snippetProps\"),\n            this.t.callExpression(this.t.identifier(\"$snippetPropsFunc\"), [])\n          ),\n        ])\n      )\n\n      /**\n       * ${prop} = $snippetProps\n       */\n      propsNode.properties\n        .filter(prop => this.t.isObjectProperty(prop))\n        .forEach((prop, idx) => {\n          const depNum = 1 << idx\n          if (!updateStatements[depNum]) updateStatements[depNum] = []\n          updateStatements[depNum].unshift(\n            this.t.expressionStatement(\n              this.t.assignmentExpression(\n                \"=\",\n                this.t.objectPattern([prop]),\n                this.t.identifier(\"$snippetProps\")\n              )\n            )\n          )\n        })\n    }\n    // ---- End\n    const runAllStatements = propsNode ? [] : updateStatements[0] ?? []\n\n    return this.t.arrowFunctionExpression(\n      args,\n      this.t.blockStatement([\n        ...bodyEntryNodes,\n        ...Object.entries(updateStatements)\n          .filter(([depNum]) => depNum !== \"0\")\n          .map(([depNum, statements]) => {\n            return this.t.ifStatement(\n              this.t.binaryExpression(\n                \"&\",\n                this.t.identifier(\"$changed\"),\n                this.t.numericLiteral(Number(depNum))\n              ),\n              this.t.blockStatement(statements)\n            )\n          }),\n        ...runAllStatements,\n      ])\n    )\n  }\n}\n"],"mappings":"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","names":["statements","SnippetGenerator","SnippetGenerator"]}