@bobe-js/lang-core 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var compiler = require('bobe/compiler');
4
- var typescript = require('typescript');
5
4
 
6
5
  const G = {};
7
6
  function log(...args) {
@@ -518,7 +517,7 @@ class Bobe2ts {
518
517
  this.output += "{";
519
518
  const checker = this.program.getTypeChecker();
520
519
  const gotType = checker.getTypeAtLocation(templateSpan.expression);
521
- const exec = new PropertyExtractor(checker, key, templateSpan.expression);
520
+ const exec = new PropertyExtractor(checker, key, templateSpan.expression, this.c.tss);
522
521
  const names = exec.extractPropertyNames(gotType);
523
522
  for (const name of names) {
524
523
  const start = this.output.length;
@@ -684,10 +683,11 @@ class IdGenerator {
684
683
  }
685
684
  }
686
685
  class PropertyExtractor {
687
- constructor(checker, key, locationNode) {
686
+ constructor(checker, key, locationNode, tss) {
688
687
  this.checker = checker;
689
688
  this.key = key;
690
689
  this.locationNode = locationNode;
690
+ this.tss = tss;
691
691
  }
692
692
  /**
693
693
  * 主入口:两步提取属性名
@@ -715,7 +715,7 @@ class PropertyExtractor {
715
715
  const symbol = type.getSymbol() || type.aliasSymbol;
716
716
  if (!symbol) return null;
717
717
  const instanceType = this.checker.getDeclaredTypeOfSymbol(symbol);
718
- if (!(instanceType.flags & typescript.TypeFlags.Object)) return null;
718
+ if (!(instanceType.flags & this.tss.TypeFlags.Object)) return null;
719
719
  const targetProp = instanceType.getProperty(this.key);
720
720
  if (!targetProp) return null;
721
721
  return this.checker.getTypeOfSymbolAtLocation(targetProp, this.locationNode);
@@ -737,7 +737,7 @@ class PropertyExtractor {
737
737
  * 2.2 midType 是 { defineProps?: T } → 获取 defineProps 的所有属性名
738
738
  */
739
739
  extractNamesFromMidType(midType) {
740
- if (midType.flags & typescript.TypeFlags.UnionOrIntersection) {
740
+ if (midType.flags & this.tss.TypeFlags.UnionOrIntersection) {
741
741
  const types = midType.types;
742
742
  if (types) {
743
743
  for (const t of types) {
@@ -751,7 +751,7 @@ class PropertyExtractor {
751
751
  const symbol = midType.getSymbol() || midType.aliasSymbol;
752
752
  if (!symbol) return [];
753
753
  const instanceType = this.checker.getDeclaredTypeOfSymbol(symbol);
754
- if (!(instanceType.flags & typescript.TypeFlags.Object)) return [];
754
+ if (!(instanceType.flags & this.tss.TypeFlags.Object)) return [];
755
755
  return this.getStandardProperties(instanceType);
756
756
  }
757
757
  if (this.isObjectType(midType)) {
@@ -770,13 +770,13 @@ class PropertyExtractor {
770
770
  isClassType(type) {
771
771
  const symbol = type.getSymbol() || type.aliasSymbol;
772
772
  if (!symbol) return false;
773
- return !!(symbol.flags & (typescript.SymbolFlags.Class | typescript.SymbolFlags.Function));
773
+ return !!(symbol.flags & (this.tss.SymbolFlags.Class | this.tss.SymbolFlags.Function));
774
774
  }
775
775
  /**
776
776
  * 判断是否为普通对象类型 (Object)
777
777
  */
778
778
  isObjectType(type) {
779
- return !!(type.flags & typescript.TypeFlags.Object);
779
+ return !!(type.flags & this.tss.TypeFlags.Object);
780
780
  }
781
781
  /**
782
782
  * 获取类型的所有属性名(排除 prototype 等元属性)
@@ -1 +1 @@
1
- {"version":3,"file":"bobe-language-core.cjs","sources":["../src/global.ts","../src/util.ts","../src/bobeToTs.ts","../src/buildVirtualDocument.ts"],"sourcesContent":["export const G: Record<any, any> = {};\n\nexport function log(...args: (string | number)[]) {\n G.log?.info?.(args.join(' '));\n}\n\nexport const Virtual_File_Suffix = '__bobe_virtual_file__';\n\nexport const Virtual_File_Exp = /__bobe_virtual_file__/;\n","import type * as ts from 'typescript';\nimport { Virtual_File_Exp, Virtual_File_Suffix } from './global';\nimport { AbsMap, BobeTemplateInfo, HeadMap, IClassNode, Template } from './type';\nimport type { SourceLocation } from 'bobe';\n\nexport class LRUCache<K = string, V = any> {\n private maxSize: number;\n private cache: Map<K, V> = new Map();\n\n constructor(maxSize: number) {\n this.maxSize = maxSize;\n }\n\n get(key: K): V | undefined {\n if (!this.cache.has(key)) {\n return undefined; // 如果缓存中没有该键,返回 -1\n }\n\n // 将该键值对移动到 Map 的末尾,表示它是最近使用的\n const value = this.cache.get(key)!;\n this.cache.delete(key); // 先删除\n this.cache.set(key, value); // 再插入到末尾\n return value;\n }\n\n set(key: K, value: V): void {\n if (this.cache.has(key)) {\n // 更新已有的键值对,并将其移动到末尾\n this.cache.delete(key);\n this.cache.set(key, value);\n } else {\n // 如果缓存已满,移除最久未使用的元素\n if (this.cache.size >= this.maxSize) {\n // Map 会保持插入顺序,删除最前面的键值对\n this.cache.delete(this.cache.keys().next().value!);\n }\n this.cache.set(key, value);\n }\n }\n\n // 新增 has 方法,检查某个键是否在缓存中\n has = this.cache.has.bind(this.cache) as typeof this.cache.has;\n\n delete = this.cache.delete.bind(this.cache) as typeof this.cache.delete;\n}\nexport type SingleArgFn = (v: any) => any;\n\nconst cache = new LRUCache<any, any>(1000);\nexport function memo<T extends SingleArgFn>(fn: T): T {\n const wrap = (v: Parameters<T>) => {\n const res = fn(v);\n cache.set(v, res);\n return res;\n };\n return wrap as T;\n}\n\nexport function createMemo() {\n const cache = new LRUCache<any, any>(1000);\n return function memo<T extends SingleArgFn>(fn: T): T {\n const wrap = (v: Parameters<T>) => {\n const res = fn(v);\n cache.set(v, res);\n return res;\n };\n return wrap as T;\n };\n}\n\nexport function uniqBy<T>(arr: T[], keyFn: (item: T) => any): T[] {\n const seen = new Set();\n return arr.filter(item => {\n const key = keyFn(item);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nexport function getVirtualName(fileName: string) {\n const dotI = fileName.lastIndexOf('.');\n const rawName = fileName.slice(0, dotI);\n const suffix = fileName.slice(dotI);\n return rawName + Virtual_File_Suffix + suffix;\n}\n\nexport function getRealName(virtualFileName: string) {\n return virtualFileName.replace(Virtual_File_Exp, '');\n}\n\nexport function isVirtualFile(fileName: string) {\n return fileName.match(Virtual_File_Exp);\n}\n\n/**\n * s1 e1\n * 0 1\n * 1 2\n * s2 e2\n */\nexport function isOverlap(start1: number, end1: number, start2: number, end2: number) {\n return start1 < end2 && start2 < end1;\n}\n\n/** 判断在 {} 内 */\nexport function inInsBrace(content: string, targetIndex: number): boolean {\n let stack: ('block' | 'expression')[] = [];\n\n for (let i = 0; i < content.length; i++) {\n // 在检查状态之前,先判断是否到达了目标索引\n if (i === targetIndex) {\n // 判断标准:\n // 1. 栈不为空(表示在某类括号内)\n // 2. 栈顶必须是 'block',不能是 'expression'\n return stack.length > 0 && stack[stack.length - 1] === 'block';\n }\n\n const char = content[i];\n const nextChar = content[i + 1];\n\n // 1. 识别 ${\n if (char === '$' && nextChar === '{') {\n stack.push('expression');\n i++; // 跳过 '{',避免下次循环重复处理\n continue;\n }\n\n // 2. 识别普通的 {\n if (char === '{') {\n stack.push('block');\n continue;\n }\n\n // 3. 识别 }\n if (char === '}') {\n stack.pop();\n continue;\n }\n }\n\n return false;\n}\n\nexport function isBobeIdentifier(node: ts.TaggedTemplateExpression, tss: typeof ts): boolean {\n return tss.isIdentifier(node.tag) && node.tag.text === 'bobe';\n}\n\nexport function isBobeTemplate(node: ts.Node, tss: typeof ts): node is ts.TaggedTemplateExpression {\n return tss.isTaggedTemplateExpression(node) && isBobeIdentifier(node, tss);\n}\n\nexport function sfHasBobeTemplate(sf: ts.SourceFile, tss: typeof ts) {\n let hasBobe = false;\n function visit(node: ts.Node) {\n if (hasBobe) {\n return;\n }\n if (isBobeTemplate(node, tss)) {\n hasBobe = true;\n } else {\n tss.forEachChild(node, visit);\n }\n }\n visit(sf);\n return hasBobe;\n}\n\nexport const strHasBobeTemplate = (str: string) => str.match(/bobe(?:\\\\s*(<)([^`]*)(>))?`/);\n\n/** 获取当前节点最近的类名 */\nexport function findPrecedingClassNode(\n targetNode: ts.Node,\n sourceFile: ts.SourceFile,\n tss: typeof ts\n): IClassNode | undefined {\n let result: IClassNode | undefined,\n alreadyCrossTargetNode = false;\n function visit(node: ts.Node) {\n if (node.pos >= targetNode.pos || alreadyCrossTargetNode || result) {\n return (alreadyCrossTargetNode = true);\n }\n if (isClass(node, tss) && node.name && contains(node, targetNode)) {\n result = node;\n }\n tss.forEachChild(node, visit);\n }\n visit(sourceFile);\n return result;\n}\n\nexport function findPrecedingBobeTemplate(targetNode: ts.Node, classNode: ts.Node, tss: typeof ts) {\n let result: ts.TaggedTemplateExpression | undefined;\n function visit(node: ts.Node) {\n if (node.pos >= targetNode.pos) return;\n if (isBobeTemplate(node, tss)) {\n result = node;\n }\n tss.forEachChild(node, visit);\n }\n visit(classNode);\n return result;\n}\n\nexport function getClassMembersInClass(classNode: IClassNode, tss: typeof ts) {\n const names: ts.ClassElement[] = [];\n for (const member of classNode.members) {\n if (isClassProp(member, tss)) {\n names.push(member);\n }\n }\n return names;\n}\n\n/** 根据类名获取成员名称列表 */\nexport function getClassMemberNames(className: string, rangeNode: ts.Node, tss: typeof ts): ts.ClassElement[] {\n const names: ts.ClassElement[] = [];\n function visit(node: ts.Node) {\n if (isClass(node, tss) && node.name?.text === className) {\n for (const member of node.members) {\n if (isClassProp(member, tss)) {\n names.push(member);\n }\n }\n return;\n }\n tss.forEachChild(node, visit);\n }\n visit(rangeNode);\n return names;\n}\n\nexport function calcAbsSourceMap(cursorOffset: number, templates: Template[], isVirtualCursor = false) {\n const compareKey = isVirtualCursor ? 'codeOffset' : 'originOffset';\n const startKey = isVirtualCursor ? 'virtualStart' : 'templateStart';\n for (let i = templates.length; i--; ) {\n const template = templates[i];\n if (template[startKey] < cursorOffset) {\n for (const map of template.sourceMap) {\n if (cursorOffset >= map[compareKey] && cursorOffset <= map[compareKey] + map.length) {\n const { codeOffset: virtualStart, originOffset: originStart, length } = map;\n const dt = cursorOffset - map[compareKey];\n return {\n virtualStart,\n originStart,\n virtualOffset: virtualStart + dt,\n originOffset: originStart + dt,\n length\n };\n }\n }\n }\n }\n}\n\nexport function inWitchVirtualPart(absCursorOffset: number, templates: Template[]) {\n for (const template of templates) {\n const range = template.headTemplate?.findRange(absCursorOffset);\n // 属于模板 head 解构区\n if (range) {\n return { template, part: 'headTemplate', range };\n } else {\n for (const area of template?.headAreas || []) {\n const found = area.findRange(absCursorOffset);\n if (found) {\n return { template, part: 'headClass', range: found };\n }\n }\n }\n }\n return { template: undefined, part: undefined, range: undefined };\n}\n\n/** 计算的是 IIFE 中 解构的 所有类成员的 映射*/\nexport function calcHeadSourceMap(absCursorOffset: number, templates: BobeTemplateInfo[]) {\n let virtualStart: number | undefined;\n let originStart: number, length: number;\n for (const tmpl of templates) {\n if (!inVirtualHead(tmpl.headMap, { start: absCursorOffset } as any, tmpl)) continue;\n const cursorOffset = absCursorOffset - tmpl.iifeStartInVirtual!;\n for (const entry of tmpl.headMap) {\n if (cursorOffset >= entry.codeOffset && cursorOffset <= entry.codeOffset + entry.length) {\n virtualStart = tmpl.iifeStartInVirtual! + entry.codeOffset;\n originStart = entry.originOffset;\n const dt = cursorOffset - entry.codeOffset;\n length = entry.length;\n return {\n virtualStart,\n originStart,\n virtualOffset: virtualStart + dt,\n originOffset: originStart + dt,\n length\n };\n }\n }\n }\n}\n\n/**\n * 1. 插值表达式中的 js 标识符 如 tag prop={ a ? foo : bar } 中的 bar\n * 2. 完整的标识符,如 tag prop=xxx 中的 prop\n */\nexport function fixTextSpan(textSpan: ts.TextSpan, code: string, map: AbsMap) {\n const originalCode = code.slice(map.originStart, map.originStart + map.length);\n /** 当内容为 js 标识符 且 textSpan 是插值表达式中的一部分时\n * span.start ~ virtualOffset 和\n * targetStart ~ originOffset 是相同的\n * 因此 targetStart = originOffset - (virtualOffset - span.start)\n */\n if (textSpan.length < map.length && !originalCode.match(domPropertyExp)) {\n const { start, length } = textSpan;\n const targetStart = map.originOffset - (map.virtualOffset - start);\n return { start: targetStart, length };\n }\n\n // 其余情况直接返回完整的原始标识符\n return { start: map.originStart, length: map.length };\n}\n\nexport function getPosTemplateCtx(\n info: ts.server.PluginCreateInfo,\n tss: typeof ts,\n fileName: string,\n position: number\n) {\n const sf = info.languageService.getProgram()?.getSourceFile(fileName);\n if (!sf) return null;\n const node = findNodeAtPosition(tss, sf, position);\n if (!node) return null;\n const templateNode = getValidBobeTemplateNode(tss, node);\n if (!templateNode || position <= templateNode.pos) return null;\n const baseOffset = templateNode.getStart() + 1;\n const ctx = makeContext(templateNode, sf, fileName, baseOffset);\n const relPos = getRelativePosition(info, baseOffset, fileName, position); // 这里找到了相对第二个模板的开始位置\n return { ctx, relPos: relPos as SourceLocation['start'] };\n}\n\nexport function getSourceFileAndNode(\n info: ts.server.PluginCreateInfo,\n tss: typeof ts,\n fileName: string,\n position: number\n) {\n const sf = info.languageService.getProgram()?.getSourceFile(fileName);\n if (!sf) return null;\n const node = findNodeAtPosition(tss, sf, position);\n if (!node) return null;\n return { sf, node };\n}\n\n// 判断节点是否属于 bobe 标签模板,返回模板字面量节点\nexport function getValidBobeTemplateNode(tss: typeof ts, node: ts.Node): ts.TemplateLiteral | undefined {\n switch (node.kind) {\n case tss.SyntaxKind.TaggedTemplateExpression: {\n const t = node as ts.TaggedTemplateExpression;\n return isBobeIdentifier(t, tss) ? t.template : undefined;\n }\n case tss.SyntaxKind.NoSubstitutionTemplateLiteral: {\n const p = node.parent;\n return p && isBobeTemplate(p, tss) ? (node as ts.NoSubstitutionTemplateLiteral) : undefined;\n }\n case tss.SyntaxKind.TemplateHead:\n return node.parent?.parent ? getValidBobeTemplateNode(tss, node.parent.parent) : undefined;\n case tss.SyntaxKind.TemplateMiddle:\n case tss.SyntaxKind.TemplateTail:\n return node.parent?.parent?.parent ? getValidBobeTemplateNode(tss, node.parent.parent.parent) : undefined;\n default:\n return undefined;\n }\n}\n\n/** 将文件绝对 offset 转换为相对模板开头 ` 的偏移量 */\nexport function getRelativePosition(\n info: ts.server.PluginCreateInfo,\n baseOffset: number,\n fileName: string,\n position: number\n): SourceLocation['start'] {\n const scriptInfo = info.project.getScriptInfo(fileName);\n if (!scriptInfo) return { line: 0, column: 0, offset: position - baseOffset };\n const baseLoc = scriptInfo.positionToLineOffset(baseOffset); // 1-based\n const cursorLoc = scriptInfo.positionToLineOffset(position);\n const bl = baseLoc.line - 1,\n bc = baseLoc.offset - 1;\n const cl = cursorLoc.line - 1,\n cc = cursorLoc.offset - 1;\n return { line: cl - bl, column: cl === bl ? cc - bc : cc, offset: position - baseOffset };\n}\n\n// 构造最小 context 对象(BobeTemplateService 只用 node、fileName、text)\nexport function makeContext(templateNode: ts.TemplateLiteral, sf: ts.SourceFile, fileName: string, baseOffset: number) {\n return { node: templateNode, fileName, text: templateNode.getText().slice(1, -1), sf, baseOffset };\n}\n\n// 在 AST 中找到 position 处最深的节点\nexport function findNodeAtPosition(tss: typeof ts, sf: ts.SourceFile, position: number): ts.Node | undefined {\n function find(node: ts.Node): ts.Node | undefined {\n if (position >= node.getStart() && position < node.getEnd()) {\n return tss.forEachChild(node, find) || node;\n }\n return undefined;\n }\n return find(sf);\n}\n\n/** 当前位置是bobe 模板的类型声明,找一下在虚拟文件对应的位置 */\nexport function findTemplateTypePos(templates: Template[], pos: number) {\n for (const tmpl of templates) {\n const { typeMap } = tmpl;\n if (!typeMap) continue;\n const { originOffset, codeOffset, length } = typeMap;\n if (originOffset <= pos && pos < originOffset + length) {\n const dt = pos - originOffset;\n return {\n virtualStart: codeOffset,\n originStart: originOffset,\n virtualOffset: codeOffset + dt,\n originOffset: originOffset + dt,\n length\n };\n }\n }\n}\n\nexport const domPropertyExp = /^[a-zA-Z][\\w-]*$/;\n\nexport const AND = `__BOBE_AND_${Date.now().toString(36)}__`;\n\nexport function isClassProp(node: ts.Node, tss: typeof ts) {\n return tss.isPropertyDeclaration(node) || (tss.isMethodDeclaration(node) && tss.isIdentifier(node.name));\n}\n\nexport function isClass(node: ts.Node, tss: typeof ts) {\n return tss.isClassDeclaration(node) || tss.isClassExpression(node);\n}\n\nexport function* getSharedItems<A, B>(\n arr1: A[],\n arr2: B[],\n isEqual: (a: A, b: B) => boolean,\n isBigger: (a: A, b: B) => boolean\n) {\n const it1 = arr1[Symbol.iterator]();\n const it2 = arr2[Symbol.iterator]();\n\n let res1 = it1.next();\n let res2 = it2.next();\n\n while (!res1.done && !res2.done) {\n const v1 = res1.value;\n const v2 = res2.value;\n\n // 始终保持 v1 在前,v2 在后\n if (isEqual(v1, v2)) {\n yield [v1, v2] as const; // 或者根据需求 yield { v1, v2 }\n res1 = it1.next();\n res2 = it2.next();\n } else if (isBigger(v1, v2)) {\n // v1 > v2: 因为是递增数组,说明 v2 太小了,需要移动 arr2 的指针\n res2 = it2.next();\n } else {\n // v1 < v2: 说明 v1 太小了,移动 arr1 的指针\n res1 = it1.next();\n }\n }\n}\n\nexport const inVirtualPart = (sf: ts.SourceFile, textSpan: ts.TextSpan) => textSpan.start > sf.getFullWidth();\nexport const inVirtualHead = (headMap: HeadMap, textSpan: ts.TextSpan, tmpl: BobeTemplateInfo) =>\n tmpl.iifeStartInVirtual! + headMap.range![0] <= textSpan.start &&\n textSpan.start < tmpl.iifeStartInVirtual! + headMap.range![1];\n\nexport const contains = (parent: ts.Node, child: ts.Node): boolean =>\n // parent.pos 是包含注释和空白的起始位置\n // parent.getStart() 是代码实际开始的位置\n child.getStart() >= parent.getStart() && child.getEnd() <= parent.getEnd();\n\nexport const processHandlers = (fns: ((node: ts.Node) => number | null | void)[], node: ts.Node) => {\n for (const handler of fns) {\n const shouldSkip = handler(node);\n if (shouldSkip != null) {\n // 1是跳过,0继续\n return shouldSkip as unknown as boolean;\n }\n }\n // 默认不跳过\n return 0;\n};\n\nexport class Range {\n constructor(\n public start: number,\n public end: number\n ) {}\n contains(pos: number) {\n return this.start <= pos && pos < this.end;\n }\n}\n\nexport class Area {\n ranges: Range[] = [];\n\n get start() {\n return this.ranges[0]?.start || -1;\n }\n\n get end() {\n return this.ranges[this.ranges.length - 1]?.end || -1;\n }\n\n findRange(pos: number) {\n if (!Range.prototype.contains.call(this, pos)) {\n return;\n }\n for (const range of this.ranges) {\n if (range.contains(pos)) {\n return range;\n }\n }\n }\n\n addRange(start: number, end: number) {\n this.ranges.push(new Range(start, end));\n }\n}\n","import { Compiler, Tokenizer, NodeType } from 'bobe/compiler';\nimport type {\n ElementNode,\n ComponentNode,\n LoopNode,\n ConditionalNode,\n Property,\n TemplateNode,\n DynamicValue,\n StaticValue,\n InterpolationNode,\n PropertyValue\n} from 'bobe';\nimport { log } from './global';\nimport { BuildVDocCtx, SourceMapEntry, Template } from './type';\nimport { SymbolFlags, TypeFlags } from 'typescript';\nimport type { TemplateSpan, Program, Type, TypeChecker, Node } from 'typescript';\nimport { Area } from './util';\n\nexport interface BobeToTsResult {\n output: string;\n input: string;\n sourceMap: SourceMapEntry[];\n}\n\nclass Dent {\n stack: number[];\n constructor(public base: number) {\n this.stack = [base];\n }\n get v() {\n const length = this.stack[this.stack.length - 1];\n return new Array(length).fill(' ').join('');\n }\n indent() {\n const length = this.stack[this.stack.length - 1];\n this.stack.push(length + 2);\n }\n dedent() {\n this.stack.pop();\n }\n}\n\nconst BRACE_REG = /(^\\$\\{)|(^\\{)|(\\}$)/g;\nexport const BOBE_PREFIX = '$Bobe' + Date.now().toString(36);\nexport const BOBE_DOM_PROP_TRANSFER = `type ${BOBE_PREFIX}ToMap<K extends string, T> = {\n [P in K]?: T;\n};\ntype ${BOBE_PREFIX}BooleanProps = ${BOBE_PREFIX}ToMap<\n 'disabled' | 'checked' | 'selected' | 'readonly' | 'required' | \n 'multiple' | 'hidden' | 'autofocus' | 'novalidate' | 'ismap' | \n 'open' | 'reversed' | 'indeterminate', \n boolean|string|undefined|null\n>;\ntype ${BOBE_PREFIX}NumericProps = ${BOBE_PREFIX}ToMap<\n 'style'|'value' | 'placeholder' | 'title' | 'alt' | 'width' | 'height' | 'columnCount' | 'tabIndex' | 'maxLength' | \n 'minLength' | 'size' | 'rows' | 'cols' | 'span' | 'start' | \n 'valueAsNumber' | 'max' | 'min' | 'step', \n string|number|undefined|null\n>;\ntype ${BOBE_PREFIX}NativeProperties = ${BOBE_PREFIX}BooleanProps & ${BOBE_PREFIX}NumericProps;\ntype ${BOBE_PREFIX}CreateTextOrComponent = {\n <T>(a: {defineProps?: T} & Record<any, any>): T;\n <T extends new (...args: any[]) =>any>(input: T): InstanceType<T>;\n (input: any): Text;\n};\nlet ${BOBE_PREFIX}_h!:<K extends keyof HTMLElementTagNameMap>(\n tag: K, \n options?: ElementCreationOptions\n) => Omit<HTMLElementTagNameMap[K], keyof ${BOBE_PREFIX}NativeProperties |'textContent' > & { text: string|number|undefined|null } & ${BOBE_PREFIX}NativeProperties & Record<string, any>;\nlet ${BOBE_PREFIX}_t!: ${BOBE_PREFIX}CreateTextOrComponent;\n`;\n\nexport class Bobe2ts {\n tokenizer: Tokenizer;\n compiler: Compiler;\n res: BobeToTsResult = {\n output: '',\n input: '',\n sourceMap: []\n };\n map(\n /** 在模板字符串中的起始 offset(相对于模板内容开头,0-based) */\n templateOffset: number,\n /** 在生成的 bobeToTs code 字符串中的起始 offset */\n codeOffset: number,\n /** 表达式的字符长度 */\n length: number\n ) {\n const item: SourceMapEntry = {\n originOffset: this.templateStart + templateOffset,\n codeOffset: this.virtualStart + codeOffset,\n length\n };\n this.res.sourceMap.push(item);\n return item;\n }\n dent = new Dent(2);\n lines: string[] = [];\n output = ``;\n nextInsExp() {\n const nextData = this.c.tempStaticIns?.next();\n return nextData?.value;\n }\n\n public idg: IdGenerator;\n public program?: Program;\n constructor(\n public c: BuildVDocCtx,\n public template: Template,\n public templateStart: number,\n public virtualStart: number,\n public templateCode: string\n ) {\n this.idg = c.idg || new IdGenerator();\n this.program = c.program;\n const tokenizer = (this.tokenizer = new Tokenizer(() => undefined, false));\n tokenizer.setCode(templateCode);\n const compiler = (this.compiler = new Compiler(tokenizer, {\n parsePropertyInlineFragment: {\n enter: node => {\n const prop = node!.parent! as Property & { inlineName: string };\n const component = prop.parent! as ComponentNode;\n const { varName: cmpInsName, templateSpan } = component.componentName as PropertyValue & {\n varName: string;\n templateSpan?: TemplateSpan;\n };\n const key = prop.key.key;\n const inlineName = this.idg.name;\n this.idg.i++;\n prop.inlineName = inlineName;\n this.output += `let ${inlineName}=(`;\n const rightBrace = `}: NonNullable<NonNullable<(typeof ${cmpInsName})['${key}']>['defineProps']>) => {\\n`;\n\n if (templateSpan && this.program) {\n const area = new Area();\n this.output += '{';\n const checker = this.program.getTypeChecker();\n const gotType = checker.getTypeAtLocation(templateSpan.expression);\n\n const exec = new PropertyExtractor(checker, key, templateSpan.expression);\n const names = exec.extractPropertyNames(gotType);\n for (const name of names) {\n const start = this.output.length;\n this.output += `${name}:${name},`;\n area.addRange(this.virtualStart + start, this.virtualStart + this.output.length);\n }\n this.output += rightBrace;\n this.template.headAreas!.push(area);\n } else {\n this.c.undoneDocPoint.push(this.output.length);\n this.output += `{${rightBrace}`;\n }\n },\n leave: () => {\n this.output += `};\\n`;\n }\n },\n parseElementNode: {\n propsAdded: node => {\n const _node = node!;\n const tagName = _node.tagName;\n const varName = this.idg.name;\n this.output += `${this.dent.v}let ${varName}=${BOBE_PREFIX}_h('`;\n this.map(this.off(_node), this.output.length, tagName.length);\n this.output += `${tagName}');`;\n this.createSetPropsExp(_node.props, varName);\n this.output += `\\n`;\n this.idg.i++;\n }\n },\n parseName: {\n leave: node => {\n const varName = this.idg.name;\n this.idg.i++;\n const name = node! as PropertyValue & { varName: string; templateSpan: TemplateSpan };\n name.varName = varName;\n const source = name.loc!.source!;\n const sourceName = source.replace(BRACE_REG, match => {\n if (match.length === 1) return ' ';\n return ' ';\n });\n this.output += `${this.dent.v}let ${varName}=${BOBE_PREFIX}_t(`;\n const map = this.map(this.off(name), this.output.length, source.length);\n this.output += `${sourceName});\\n`;\n if(name.type !== NodeType.StaticValue) {\n return;\n }\n let ins: TemplateSpan | undefined;\n while ((ins = this.nextInsExp()) != null) {\n const insStart = ins.getFullStart();\n if (insStart > map.originOffset) {\n if (insStart < map.originOffset + map.length) {\n name.templateSpan = ins;\n }\n break;\n }\n }\n }\n },\n parseComponentNode: {\n propsAdded: node => {\n const _node = node!;\n const name = _node.componentName! as PropertyValue & { varName: string };\n this.createSetPropsExp(_node.props, name.varName);\n this.output += `\\n`;\n }\n },\n parseConditionalNode: {\n propsAdded: node => {\n const _node = node!;\n const cond = _node.condition;\n const condVal = cond.loc!.source;\n const ifHeadS = `${this.dent.v}if(`;\n this.output += ifHeadS;\n this.map(this.off(cond), this.output.length, condVal.length);\n this.output += condVal + `){\\n`;\n this.dent.indent();\n },\n leave: node => {\n this.dent.dedent();\n this.output += `${this.dent.v}}\\n`;\n }\n },\n parseLoopNode: {\n propsAdded: node => {\n const _node = node!;\n this.output += `${this.dent.v}`;\n const { collection: arr, item, index, key } = _node;\n this.map(this.off(arr), this.output.length, arr.loc!.source!.length);\n this.output += arr.loc!.source + '.forEach((';\n this.map(this.off(item), this.output.length, item.loc!.source!.length);\n this.output += item.loc!.source;\n if (index) {\n this.output += ',';\n this.map(this.off(index), this.output.length, index.loc!.source!.length);\n this.output += index.loc!.source;\n }\n this.output += `)=>{`;\n if (key) {\n this.output += `let ${this.idg.k}=`;\n this.map(this.off(key), this.output.length, key.loc!.source!.length);\n this.output += key.loc!.source + ';';\n }\n this.output += '\\n';\n\n this.dent.indent();\n },\n leave: node => {\n this.dent.dedent();\n this.output += `${this.dent.v}});\\n`;\n }\n }\n }));\n }\n off(n: { loc?: any }) {\n return n.loc!.start.offset - 1;\n }\n createSetPropsExp = (props: Property[], name: string) => {\n const nameDot = `${name}.`;\n props.forEach(_prop => {\n const prop = _prop as Property & { inlineName: string };\n const loc = prop.key.loc!;\n let { source: key } = loc;\n this.map(this.off(prop.key), this.output.length + nameDot.length, key.length);\n let replaceCount = 0;\n key = key.replace(/\\-(\\w)/g, (_, match) => {\n const res = match.toUpperCase();\n replaceCount++;\n return res;\n });\n key = key + new Array(replaceCount).fill(' ').join('');\n const assignLeft = `${nameDot}${key}=`;\n this.output += assignLeft;\n if (!prop.value) {\n this.output += 'null;';\n return;\n }\n // 是文档片段\n if (prop.inlineName) {\n this.output += `${prop.inlineName} as any;`;\n return;\n }\n\n let { source: value } = prop.value.loc!;\n if (prop.value.type === NodeType.DynamicValue) {\n // 替换成空格\n value = value.replace(BRACE_REG, ' ');\n }\n\n this.map(this.off(prop.value), this.output.length, value.length);\n this.output += value + ';';\n });\n };\n\n process() {\n this.compiler.parseProgram();\n // log('output', this.output);\n // log('errors', this.compiler.errors.map(e => e.message).join('\\n'));\n return {\n output: this.output,\n input: this.templateCode,\n sourceMap: this.res.sourceMap,\n errors: this.compiler.errors\n };\n }\n}\n\nexport class IdGenerator {\n id = Date.now().toString(36);\n i = 0;\n get name() {\n return `${BOBE_PREFIX}_var_${this.id}_${this.i}`;\n }\n get h() {\n return `h_${this.id}`;\n }\n get t() {\n return `t_${this.id}`;\n }\n get k() {\n return `${BOBE_PREFIX}_for_key_${this.id}`;\n }\n}\n\nexport class PropertyExtractor {\n constructor(private checker: TypeChecker, private key: string, private locationNode: Node) {}\n\n /**\n * 主入口:两步提取属性名\n * 1. 解析 midType(通过 key 从原始类型中获取)\n * 2. 从 midType 中提取属性名列表\n * 中间任何一步不符合正向逻辑时返回空数组\n */\n public extractPropertyNames(type: Type): string[] {\n if (!type || (type as any).intrinsicName === 'error') {\n return [];\n }\n\n const midType = this.resolveMidType(type);\n if (!midType) return [];\n const midTStr = this.checker.typeToString(midType);\n log('midType:', midTStr);\n\n return this.extractNamesFromMidType(midType);\n }\n\n /**\n * Step 1: 获取传入类型对应实例属性的 key 的类型 (midType)\n * 1.1 classType 是类 → 获取实例类型 → 获取 instance.key 的类型\n * 1.2 classType 是 { defineProps?: T } → 获取 defineProps.key 的类型\n */\n private resolveMidType(type: Type): Type | null {\n if (this.isClassType(type)) {\n const symbol = type.getSymbol() || type.aliasSymbol;\n if (!symbol) return null;\n const instanceType = this.checker.getDeclaredTypeOfSymbol(symbol);\n if (!(instanceType.flags & TypeFlags.Object)) return null;\n const targetProp = instanceType.getProperty(this.key);\n if (!targetProp) return null;\n return this.checker.getTypeOfSymbolAtLocation(targetProp, this.locationNode);\n }\n\n if (this.isObjectType(type)) {\n const defineProps = type.getProperty('defineProps');\n if (defineProps) {\n const definePropsType = this.checker.getTypeOfSymbolAtLocation(defineProps, this.locationNode);\n const targetProp = definePropsType.getProperty(this.key);\n if (!targetProp) return null;\n return this.checker.getTypeOfSymbolAtLocation(targetProp, this.locationNode);\n }\n }\n\n return null;\n }\n\n /**\n * Step 2: 处理 midType,提取属性名列表\n * 2.1 midType 是 class → 获取其实例的所有属性名\n * 2.2 midType 是 { defineProps?: T } → 获取 defineProps 的所有属性名\n */\n private extractNamesFromMidType(midType: Type): string[] {\n if (midType.flags & TypeFlags.UnionOrIntersection) {\n const types = (midType as any).types as Type[] | undefined;\n if (types) {\n for (const t of types) {\n const names = this.extractNamesFromMidType(t);\n if (names.length > 0) return names;\n }\n }\n return [];\n }\n\n if (this.isClassType(midType)) {\n const symbol = midType.getSymbol() || midType.aliasSymbol;\n if (!symbol) return [];\n const instanceType = this.checker.getDeclaredTypeOfSymbol(symbol);\n if (!(instanceType.flags & TypeFlags.Object)) return [];\n return this.getStandardProperties(instanceType);\n }\n\n if (this.isObjectType(midType)) {\n const defineProps = midType.getProperty('defineProps');\n if (defineProps) {\n const definePropsType = this.checker.getTypeOfSymbolAtLocation(defineProps, this.locationNode);\n return this.extractNamesFromMidType(definePropsType);\n }\n return this.getStandardProperties(midType);\n }\n\n return [];\n }\n\n /**\n * 判断是否为 Class(构造函数静态类型)\n */\n private isClassType(type: Type): boolean {\n const symbol = type.getSymbol() || type.aliasSymbol;\n if (!symbol) return false;\n return !!(symbol.flags & (SymbolFlags.Class | SymbolFlags.Function));\n }\n\n /**\n * 判断是否为普通对象类型 (Object)\n */\n private isObjectType(type: Type): boolean {\n return !!(type.flags & TypeFlags.Object);\n }\n\n /**\n * 获取类型的所有属性名(排除 prototype 等元属性)\n */\n private getStandardProperties(type: Type): string[] {\n try {\n const props = this.checker.getPropertiesOfType(type);\n return props.map(p => p.name).filter(name => name !== 'prototype');\n } catch {\n return [];\n }\n }\n}\n\n// const p = new Bobe2ts(\n// new IdGenerator(),\n// 0,\n// `\n// input value={he} style='width: 100px;' onclick={Mes}\n// \\${We} abc=1\n// `\n// );\n\n// const res = p.process();\n\n// const { input, output, sourceMap } = res;\n// let verify = sourceMap.map(({ originOffset: inOffset, codeOffset: outOffset, length }) => {\n// return {\n// _in: input.slice(inOffset, inOffset + length),\n// out: output.slice(outOffset, outOffset + length)\n// };\n// });\n// verify = verify.filter(it => it._in !== it.out);\n// console.log(verify);\n","import type * as ts from 'typescript';\nimport { Bobe2ts, BOBE_DOM_PROP_TRANSFER, IdGenerator } from './bobeToTs';\nimport { log } from './global';\nimport {\n Area,\n getClassMembersInClass,\n isBobeIdentifier,\n isBobeTemplate,\n isClass,\n processHandlers,\n Range\n} from './util';\nimport { BuildVDocCtx, IClassNode, Template, VirtualDocumentResult } from './type';\n\ntype TemplatePreInfo = {\n raw: string;\n className: string;\n sf: ts.SourceFile;\n templateStart: number;\n uiName?: string;\n props?: string[];\n typeExp?: string;\n};\n\nexport function findBobeTemplatesInClass(\n classNode: IClassNode,\n tss: typeof ts,\n sourceFile: ts.SourceFile,\n program?: ts.Program\n) {\n const preInfos: TemplatePreInfo[] = [];\n const checker = program?.getTypeChecker();\n function visit(node: ts.Node) {\n if (isBobeTemplate(node, tss)) {\n const template = node.template;\n const typeArg = node.typeArguments?.[0];\n let props: string[] | undefined = undefined,\n parent = node.parent,\n uiName: string | undefined = undefined,\n typeExp: string | undefined = undefined;\n for (let i = 0; i < 5 && parent; i++) {\n const parentIsAssign = tss.isPropertyDeclaration(parent);\n if (parentIsAssign) {\n uiName = parent.name.getText();\n break;\n }\n }\n if (typeArg && checker && uiName) {\n typeExp = typeArg.getText();\n const typeNode = checker.getTypeAtLocation(typeArg);\n const propNodes = checker.getPropertiesOfType(typeNode);\n props = propNodes.map(prop => prop.name);\n }\n const raw = tss.isNoSubstitutionTemplateLiteral(template)\n ? (template.rawText ?? template.text)\n : template.getText().slice(1, -1);\n // 模板内容在源文件中的起始 offset(反引号后第一个字符)\n const templateStart = template.getStart() + 1; // +1 跳过反引号\n preInfos.push({\n raw,\n uiName,\n typeExp,\n props,\n className: classNode.name?.text || '',\n sf: sourceFile,\n templateStart\n });\n } else {\n tss.forEachChild(node, visit);\n }\n }\n visit(classNode);\n return preInfos;\n}\n\nlet c = {} as BuildVDocCtx;\nexport function buildVirtualDocument(\n sourceFile: ts.SourceFile,\n tss: typeof ts,\n program?: ts.Program\n): VirtualDocumentResult {\n const source = sourceFile.text;\n const virtualCode = source + '\\nexport {};\\n' + BOBE_DOM_PROP_TRANSFER;\n const baseVOffset = virtualCode.length;\n c = { tss, program, baseVOffset, virtualCode, templates: [], undoneDocPoint: [] };\n function walk(node: ts.Node) {\n const skip = processHandlers([beginClass, beginTemplate], node);\n if (!skip) tss.forEachChild(node, walk);\n processHandlers([endClass, endTemplate], node);\n }\n walk(sourceFile);\n log('虚拟文件\\n', c.virtualCode);\n const result = { code: c.virtualCode, templates: c.templates, sf: sourceFile };\n c = {} as any;\n return result;\n}\n\nfunction beginClass(node: ts.Node) {\n if (!isClass(node, c.tss)) return;\n c.currentClass = node;\n return 0;\n}\nfunction endClass(node: ts.Node) {\n if (!isClass(node, c.tss)) return;\n c.currentClass = undefined;\n if (c.builtHeadAreas) {\n c.builtHeadAreas = undefined;\n c.idg = undefined;\n c.virtualCode += `}\\n`;\n }\n return;\n}\nfunction beginTemplate(node: ts.Node) {\n if (!c.tss.isTaggedTemplateExpression(node)) return;\n // 非 bobe 模板语法可以直接跳过\n if (!isBobeIdentifier(node, c.tss)) return 1;\n // bobe 模板语法需要为文件末尾添加东西\n // 1. 为 class 添加类型上下文\n const template = { headAreas: [] } as any as Template;\n if (c.currentClass && !c.builtHeadAreas) {\n c.idg = new IdGenerator();\n const { currentClass } = c;\n const className = currentClass.name!.getText();\n\n const area = new Area();\n c.virtualCode += `{\\nconst {`;\n const members = getClassMembersInClass(currentClass, c.tss);\n for (const member of members) {\n const nameText = member.name!.getText();\n const itemStart = c.virtualCode.length;\n c.virtualCode += `${nameText}:${nameText},`;\n const itemEnd = c.virtualCode.length;\n area.addRange(itemStart, itemEnd);\n }\n c.virtualCode += `} = {} as any as ${className};\\n`;\n c.builtHeadAreas = template.headAreas = [area];\n }\n c.virtualCode += '{\\n';\n // 2. 为泛型添加类型上下文\n if (node.typeArguments) {\n const typeArg = node.typeArguments[0];\n const checker = c.program?.getTypeChecker();\n if (checker) {\n const typeNode = checker.getTypeAtLocation(typeArg);\n const typeExp = typeArg.getText();\n const originOffset = typeArg.getFullStart();\n const propNodes = checker.getPropertiesOfType(typeNode);\n /*----------------- 增加类型解构 -----------------*/\n const area = new Area();\n c.virtualCode += `const {`;\n for (const { name } of propNodes) {\n const itemStart = c.virtualCode.length;\n c.virtualCode += `${name}:${name},`;\n const itemEnd = c.virtualCode.length;\n area.addRange(itemStart, itemEnd);\n }\n\n c.virtualCode += `} = {} as any as `;\n const codeOffset = c.virtualCode.length;\n /*----------------- 记录类型位置的映射 -----------------*/\n c.virtualCode += typeExp;\n template.headTemplate = area;\n template.typeMap = {\n originOffset,\n codeOffset,\n length: typeExp.length\n };\n c.virtualCode += `;\\n`;\n }\n }\n if (!c.tss.isNoSubstitutionTemplateLiteral(node.template)) {\n const insArr = Array.from(node.template.templateSpans);\n c.tempStaticIns = insArr[Symbol.iterator]();\n }\n // 3. 构建虚拟文档\n const templateStart = node.template.getFullStart() + 1;\n const virtualStart = c.virtualCode.length;\n const raw = node.template.getText().slice(1, -1);\n const { output, sourceMap, errors } = new Bobe2ts(c, template, templateStart, virtualStart, raw).process();\n c.virtualCode += output + `}\\n`;\n template.sourceMap = sourceMap;\n template.errors = errors;\n template.templateStart = templateStart;\n template.virtualStart = virtualStart;\n c.templates.push(template);\n return 1;\n}\nfunction endTemplate(node: ts.Node) {\n if (!isBobeTemplate(node, c.tss)) return;\n return;\n}\n"],"names":["cache","memo","NodeType","Tokenizer","Compiler","TypeFlags","SymbolFlags"],"mappings":"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"}
1
+ {"version":3,"file":"bobe-language-core.cjs","sources":["../src/global.ts","../src/util.ts","../src/bobeToTs.ts","../src/buildVirtualDocument.ts"],"sourcesContent":["export const G: Record<any, any> = {};\n\nexport function log(...args: (string | number)[]) {\n G.log?.info?.(args.join(' '));\n}\n\nexport const Virtual_File_Suffix = '__bobe_virtual_file__';\n\nexport const Virtual_File_Exp = /__bobe_virtual_file__/;\n","import type * as ts from 'typescript';\nimport { Virtual_File_Exp, Virtual_File_Suffix } from './global';\nimport { AbsMap, BobeTemplateInfo, HeadMap, IClassNode, Template } from './type';\nimport type { SourceLocation } from 'bobe';\n\nexport class LRUCache<K = string, V = any> {\n private maxSize: number;\n private cache: Map<K, V> = new Map();\n\n constructor(maxSize: number) {\n this.maxSize = maxSize;\n }\n\n get(key: K): V | undefined {\n if (!this.cache.has(key)) {\n return undefined; // 如果缓存中没有该键,返回 -1\n }\n\n // 将该键值对移动到 Map 的末尾,表示它是最近使用的\n const value = this.cache.get(key)!;\n this.cache.delete(key); // 先删除\n this.cache.set(key, value); // 再插入到末尾\n return value;\n }\n\n set(key: K, value: V): void {\n if (this.cache.has(key)) {\n // 更新已有的键值对,并将其移动到末尾\n this.cache.delete(key);\n this.cache.set(key, value);\n } else {\n // 如果缓存已满,移除最久未使用的元素\n if (this.cache.size >= this.maxSize) {\n // Map 会保持插入顺序,删除最前面的键值对\n this.cache.delete(this.cache.keys().next().value!);\n }\n this.cache.set(key, value);\n }\n }\n\n // 新增 has 方法,检查某个键是否在缓存中\n has = this.cache.has.bind(this.cache) as typeof this.cache.has;\n\n delete = this.cache.delete.bind(this.cache) as typeof this.cache.delete;\n}\nexport type SingleArgFn = (v: any) => any;\n\nconst cache = new LRUCache<any, any>(1000);\nexport function memo<T extends SingleArgFn>(fn: T): T {\n const wrap = (v: Parameters<T>) => {\n const res = fn(v);\n cache.set(v, res);\n return res;\n };\n return wrap as T;\n}\n\nexport function createMemo() {\n const cache = new LRUCache<any, any>(1000);\n return function memo<T extends SingleArgFn>(fn: T): T {\n const wrap = (v: Parameters<T>) => {\n const res = fn(v);\n cache.set(v, res);\n return res;\n };\n return wrap as T;\n };\n}\n\nexport function uniqBy<T>(arr: T[], keyFn: (item: T) => any): T[] {\n const seen = new Set();\n return arr.filter(item => {\n const key = keyFn(item);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nexport function getVirtualName(fileName: string) {\n const dotI = fileName.lastIndexOf('.');\n const rawName = fileName.slice(0, dotI);\n const suffix = fileName.slice(dotI);\n return rawName + Virtual_File_Suffix + suffix;\n}\n\nexport function getRealName(virtualFileName: string) {\n return virtualFileName.replace(Virtual_File_Exp, '');\n}\n\nexport function isVirtualFile(fileName: string) {\n return fileName.match(Virtual_File_Exp);\n}\n\n/**\n * s1 e1\n * 0 1\n * 1 2\n * s2 e2\n */\nexport function isOverlap(start1: number, end1: number, start2: number, end2: number) {\n return start1 < end2 && start2 < end1;\n}\n\n/** 判断在 {} 内 */\nexport function inInsBrace(content: string, targetIndex: number): boolean {\n let stack: ('block' | 'expression')[] = [];\n\n for (let i = 0; i < content.length; i++) {\n // 在检查状态之前,先判断是否到达了目标索引\n if (i === targetIndex) {\n // 判断标准:\n // 1. 栈不为空(表示在某类括号内)\n // 2. 栈顶必须是 'block',不能是 'expression'\n return stack.length > 0 && stack[stack.length - 1] === 'block';\n }\n\n const char = content[i];\n const nextChar = content[i + 1];\n\n // 1. 识别 ${\n if (char === '$' && nextChar === '{') {\n stack.push('expression');\n i++; // 跳过 '{',避免下次循环重复处理\n continue;\n }\n\n // 2. 识别普通的 {\n if (char === '{') {\n stack.push('block');\n continue;\n }\n\n // 3. 识别 }\n if (char === '}') {\n stack.pop();\n continue;\n }\n }\n\n return false;\n}\n\nexport function isBobeIdentifier(node: ts.TaggedTemplateExpression, tss: typeof ts): boolean {\n return tss.isIdentifier(node.tag) && node.tag.text === 'bobe';\n}\n\nexport function isBobeTemplate(node: ts.Node, tss: typeof ts): node is ts.TaggedTemplateExpression {\n return tss.isTaggedTemplateExpression(node) && isBobeIdentifier(node, tss);\n}\n\nexport function sfHasBobeTemplate(sf: ts.SourceFile, tss: typeof ts) {\n let hasBobe = false;\n function visit(node: ts.Node) {\n if (hasBobe) {\n return;\n }\n if (isBobeTemplate(node, tss)) {\n hasBobe = true;\n } else {\n tss.forEachChild(node, visit);\n }\n }\n visit(sf);\n return hasBobe;\n}\n\nexport const strHasBobeTemplate = (str: string) => str.match(/bobe(?:\\\\s*(<)([^`]*)(>))?`/);\n\n/** 获取当前节点最近的类名 */\nexport function findPrecedingClassNode(\n targetNode: ts.Node,\n sourceFile: ts.SourceFile,\n tss: typeof ts\n): IClassNode | undefined {\n let result: IClassNode | undefined,\n alreadyCrossTargetNode = false;\n function visit(node: ts.Node) {\n if (node.pos >= targetNode.pos || alreadyCrossTargetNode || result) {\n return (alreadyCrossTargetNode = true);\n }\n if (isClass(node, tss) && node.name && contains(node, targetNode)) {\n result = node;\n }\n tss.forEachChild(node, visit);\n }\n visit(sourceFile);\n return result;\n}\n\nexport function findPrecedingBobeTemplate(targetNode: ts.Node, classNode: ts.Node, tss: typeof ts) {\n let result: ts.TaggedTemplateExpression | undefined;\n function visit(node: ts.Node) {\n if (node.pos >= targetNode.pos) return;\n if (isBobeTemplate(node, tss)) {\n result = node;\n }\n tss.forEachChild(node, visit);\n }\n visit(classNode);\n return result;\n}\n\nexport function getClassMembersInClass(classNode: IClassNode, tss: typeof ts) {\n const names: ts.ClassElement[] = [];\n for (const member of classNode.members) {\n if (isClassProp(member, tss)) {\n names.push(member);\n }\n }\n return names;\n}\n\n/** 根据类名获取成员名称列表 */\nexport function getClassMemberNames(className: string, rangeNode: ts.Node, tss: typeof ts): ts.ClassElement[] {\n const names: ts.ClassElement[] = [];\n function visit(node: ts.Node) {\n if (isClass(node, tss) && node.name?.text === className) {\n for (const member of node.members) {\n if (isClassProp(member, tss)) {\n names.push(member);\n }\n }\n return;\n }\n tss.forEachChild(node, visit);\n }\n visit(rangeNode);\n return names;\n}\n\nexport function calcAbsSourceMap(cursorOffset: number, templates: Template[], isVirtualCursor = false) {\n const compareKey = isVirtualCursor ? 'codeOffset' : 'originOffset';\n const startKey = isVirtualCursor ? 'virtualStart' : 'templateStart';\n for (let i = templates.length; i--; ) {\n const template = templates[i];\n if (template[startKey] < cursorOffset) {\n for (const map of template.sourceMap) {\n if (cursorOffset >= map[compareKey] && cursorOffset <= map[compareKey] + map.length) {\n const { codeOffset: virtualStart, originOffset: originStart, length } = map;\n const dt = cursorOffset - map[compareKey];\n return {\n virtualStart,\n originStart,\n virtualOffset: virtualStart + dt,\n originOffset: originStart + dt,\n length\n };\n }\n }\n }\n }\n}\n\nexport function inWitchVirtualPart(absCursorOffset: number, templates: Template[]) {\n for (const template of templates) {\n const range = template.headTemplate?.findRange(absCursorOffset);\n // 属于模板 head 解构区\n if (range) {\n return { template, part: 'headTemplate', range };\n } else {\n for (const area of template?.headAreas || []) {\n const found = area.findRange(absCursorOffset);\n if (found) {\n return { template, part: 'headClass', range: found };\n }\n }\n }\n }\n return { template: undefined, part: undefined, range: undefined };\n}\n\n/** 计算的是 IIFE 中 解构的 所有类成员的 映射*/\nexport function calcHeadSourceMap(absCursorOffset: number, templates: BobeTemplateInfo[]) {\n let virtualStart: number | undefined;\n let originStart: number, length: number;\n for (const tmpl of templates) {\n if (!inVirtualHead(tmpl.headMap, { start: absCursorOffset } as any, tmpl)) continue;\n const cursorOffset = absCursorOffset - tmpl.iifeStartInVirtual!;\n for (const entry of tmpl.headMap) {\n if (cursorOffset >= entry.codeOffset && cursorOffset <= entry.codeOffset + entry.length) {\n virtualStart = tmpl.iifeStartInVirtual! + entry.codeOffset;\n originStart = entry.originOffset;\n const dt = cursorOffset - entry.codeOffset;\n length = entry.length;\n return {\n virtualStart,\n originStart,\n virtualOffset: virtualStart + dt,\n originOffset: originStart + dt,\n length\n };\n }\n }\n }\n}\n\n/**\n * 1. 插值表达式中的 js 标识符 如 tag prop={ a ? foo : bar } 中的 bar\n * 2. 完整的标识符,如 tag prop=xxx 中的 prop\n */\nexport function fixTextSpan(textSpan: ts.TextSpan, code: string, map: AbsMap) {\n const originalCode = code.slice(map.originStart, map.originStart + map.length);\n /** 当内容为 js 标识符 且 textSpan 是插值表达式中的一部分时\n * span.start ~ virtualOffset 和\n * targetStart ~ originOffset 是相同的\n * 因此 targetStart = originOffset - (virtualOffset - span.start)\n */\n if (textSpan.length < map.length && !originalCode.match(domPropertyExp)) {\n const { start, length } = textSpan;\n const targetStart = map.originOffset - (map.virtualOffset - start);\n return { start: targetStart, length };\n }\n\n // 其余情况直接返回完整的原始标识符\n return { start: map.originStart, length: map.length };\n}\n\nexport function getPosTemplateCtx(\n info: ts.server.PluginCreateInfo,\n tss: typeof ts,\n fileName: string,\n position: number\n) {\n const sf = info.languageService.getProgram()?.getSourceFile(fileName);\n if (!sf) return null;\n const node = findNodeAtPosition(tss, sf, position);\n if (!node) return null;\n const templateNode = getValidBobeTemplateNode(tss, node);\n if (!templateNode || position <= templateNode.pos) return null;\n const baseOffset = templateNode.getStart() + 1;\n const ctx = makeContext(templateNode, sf, fileName, baseOffset);\n const relPos = getRelativePosition(info, baseOffset, fileName, position); // 这里找到了相对第二个模板的开始位置\n return { ctx, relPos: relPos as SourceLocation['start'] };\n}\n\nexport function getSourceFileAndNode(\n info: ts.server.PluginCreateInfo,\n tss: typeof ts,\n fileName: string,\n position: number\n) {\n const sf = info.languageService.getProgram()?.getSourceFile(fileName);\n if (!sf) return null;\n const node = findNodeAtPosition(tss, sf, position);\n if (!node) return null;\n return { sf, node };\n}\n\n// 判断节点是否属于 bobe 标签模板,返回模板字面量节点\nexport function getValidBobeTemplateNode(tss: typeof ts, node: ts.Node): ts.TemplateLiteral | undefined {\n switch (node.kind) {\n case tss.SyntaxKind.TaggedTemplateExpression: {\n const t = node as ts.TaggedTemplateExpression;\n return isBobeIdentifier(t, tss) ? t.template : undefined;\n }\n case tss.SyntaxKind.NoSubstitutionTemplateLiteral: {\n const p = node.parent;\n return p && isBobeTemplate(p, tss) ? (node as ts.NoSubstitutionTemplateLiteral) : undefined;\n }\n case tss.SyntaxKind.TemplateHead:\n return node.parent?.parent ? getValidBobeTemplateNode(tss, node.parent.parent) : undefined;\n case tss.SyntaxKind.TemplateMiddle:\n case tss.SyntaxKind.TemplateTail:\n return node.parent?.parent?.parent ? getValidBobeTemplateNode(tss, node.parent.parent.parent) : undefined;\n default:\n return undefined;\n }\n}\n\n/** 将文件绝对 offset 转换为相对模板开头 ` 的偏移量 */\nexport function getRelativePosition(\n info: ts.server.PluginCreateInfo,\n baseOffset: number,\n fileName: string,\n position: number\n): SourceLocation['start'] {\n const scriptInfo = info.project.getScriptInfo(fileName);\n if (!scriptInfo) return { line: 0, column: 0, offset: position - baseOffset };\n const baseLoc = scriptInfo.positionToLineOffset(baseOffset); // 1-based\n const cursorLoc = scriptInfo.positionToLineOffset(position);\n const bl = baseLoc.line - 1,\n bc = baseLoc.offset - 1;\n const cl = cursorLoc.line - 1,\n cc = cursorLoc.offset - 1;\n return { line: cl - bl, column: cl === bl ? cc - bc : cc, offset: position - baseOffset };\n}\n\n// 构造最小 context 对象(BobeTemplateService 只用 node、fileName、text)\nexport function makeContext(templateNode: ts.TemplateLiteral, sf: ts.SourceFile, fileName: string, baseOffset: number) {\n return { node: templateNode, fileName, text: templateNode.getText().slice(1, -1), sf, baseOffset };\n}\n\n// 在 AST 中找到 position 处最深的节点\nexport function findNodeAtPosition(tss: typeof ts, sf: ts.SourceFile, position: number): ts.Node | undefined {\n function find(node: ts.Node): ts.Node | undefined {\n if (position >= node.getStart() && position < node.getEnd()) {\n return tss.forEachChild(node, find) || node;\n }\n return undefined;\n }\n return find(sf);\n}\n\n/** 当前位置是bobe 模板的类型声明,找一下在虚拟文件对应的位置 */\nexport function findTemplateTypePos(templates: Template[], pos: number) {\n for (const tmpl of templates) {\n const { typeMap } = tmpl;\n if (!typeMap) continue;\n const { originOffset, codeOffset, length } = typeMap;\n if (originOffset <= pos && pos < originOffset + length) {\n const dt = pos - originOffset;\n return {\n virtualStart: codeOffset,\n originStart: originOffset,\n virtualOffset: codeOffset + dt,\n originOffset: originOffset + dt,\n length\n };\n }\n }\n}\n\nexport const domPropertyExp = /^[a-zA-Z][\\w-]*$/;\n\nexport const AND = `__BOBE_AND_${Date.now().toString(36)}__`;\n\nexport function isClassProp(node: ts.Node, tss: typeof ts) {\n return tss.isPropertyDeclaration(node) || (tss.isMethodDeclaration(node) && tss.isIdentifier(node.name));\n}\n\nexport function isClass(node: ts.Node, tss: typeof ts) {\n return tss.isClassDeclaration(node) || tss.isClassExpression(node);\n}\n\nexport function* getSharedItems<A, B>(\n arr1: A[],\n arr2: B[],\n isEqual: (a: A, b: B) => boolean,\n isBigger: (a: A, b: B) => boolean\n) {\n const it1 = arr1[Symbol.iterator]();\n const it2 = arr2[Symbol.iterator]();\n\n let res1 = it1.next();\n let res2 = it2.next();\n\n while (!res1.done && !res2.done) {\n const v1 = res1.value;\n const v2 = res2.value;\n\n // 始终保持 v1 在前,v2 在后\n if (isEqual(v1, v2)) {\n yield [v1, v2] as const; // 或者根据需求 yield { v1, v2 }\n res1 = it1.next();\n res2 = it2.next();\n } else if (isBigger(v1, v2)) {\n // v1 > v2: 因为是递增数组,说明 v2 太小了,需要移动 arr2 的指针\n res2 = it2.next();\n } else {\n // v1 < v2: 说明 v1 太小了,移动 arr1 的指针\n res1 = it1.next();\n }\n }\n}\n\nexport const inVirtualPart = (sf: ts.SourceFile, textSpan: ts.TextSpan) => textSpan.start > sf.getFullWidth();\nexport const inVirtualHead = (headMap: HeadMap, textSpan: ts.TextSpan, tmpl: BobeTemplateInfo) =>\n tmpl.iifeStartInVirtual! + headMap.range![0] <= textSpan.start &&\n textSpan.start < tmpl.iifeStartInVirtual! + headMap.range![1];\n\nexport const contains = (parent: ts.Node, child: ts.Node): boolean =>\n // parent.pos 是包含注释和空白的起始位置\n // parent.getStart() 是代码实际开始的位置\n child.getStart() >= parent.getStart() && child.getEnd() <= parent.getEnd();\n\nexport const processHandlers = (fns: ((node: ts.Node) => number | null | void)[], node: ts.Node) => {\n for (const handler of fns) {\n const shouldSkip = handler(node);\n if (shouldSkip != null) {\n // 1是跳过,0继续\n return shouldSkip as unknown as boolean;\n }\n }\n // 默认不跳过\n return 0;\n};\n\nexport class Range {\n constructor(\n public start: number,\n public end: number\n ) {}\n contains(pos: number) {\n return this.start <= pos && pos < this.end;\n }\n}\n\nexport class Area {\n ranges: Range[] = [];\n\n get start() {\n return this.ranges[0]?.start || -1;\n }\n\n get end() {\n return this.ranges[this.ranges.length - 1]?.end || -1;\n }\n\n findRange(pos: number) {\n if (!Range.prototype.contains.call(this, pos)) {\n return;\n }\n for (const range of this.ranges) {\n if (range.contains(pos)) {\n return range;\n }\n }\n }\n\n addRange(start: number, end: number) {\n this.ranges.push(new Range(start, end));\n }\n}\n","import { Compiler, Tokenizer, NodeType } from 'bobe/compiler';\nimport type {\n ElementNode,\n ComponentNode,\n LoopNode,\n ConditionalNode,\n Property,\n TemplateNode,\n DynamicValue,\n StaticValue,\n InterpolationNode,\n PropertyValue\n} from 'bobe';\nimport { log } from './global';\nimport { BuildVDocCtx, SourceMapEntry, Template } from './type';\nimport type * as ts from 'typescript';\nimport type { TemplateSpan, Program, Type, TypeChecker, Node } from 'typescript';\nimport { Area } from './util';\n\nexport interface BobeToTsResult {\n output: string;\n input: string;\n sourceMap: SourceMapEntry[];\n}\n\nclass Dent {\n stack: number[];\n constructor(public base: number) {\n this.stack = [base];\n }\n get v() {\n const length = this.stack[this.stack.length - 1];\n return new Array(length).fill(' ').join('');\n }\n indent() {\n const length = this.stack[this.stack.length - 1];\n this.stack.push(length + 2);\n }\n dedent() {\n this.stack.pop();\n }\n}\n\nconst BRACE_REG = /(^\\$\\{)|(^\\{)|(\\}$)/g;\nexport const BOBE_PREFIX = '$Bobe' + Date.now().toString(36);\nexport const BOBE_DOM_PROP_TRANSFER = `type ${BOBE_PREFIX}ToMap<K extends string, T> = {\n [P in K]?: T;\n};\ntype ${BOBE_PREFIX}BooleanProps = ${BOBE_PREFIX}ToMap<\n 'disabled' | 'checked' | 'selected' | 'readonly' | 'required' | \n 'multiple' | 'hidden' | 'autofocus' | 'novalidate' | 'ismap' | \n 'open' | 'reversed' | 'indeterminate', \n boolean|string|undefined|null\n>;\ntype ${BOBE_PREFIX}NumericProps = ${BOBE_PREFIX}ToMap<\n 'style'|'value' | 'placeholder' | 'title' | 'alt' | 'width' | 'height' | 'columnCount' | 'tabIndex' | 'maxLength' | \n 'minLength' | 'size' | 'rows' | 'cols' | 'span' | 'start' | \n 'valueAsNumber' | 'max' | 'min' | 'step', \n string|number|undefined|null\n>;\ntype ${BOBE_PREFIX}NativeProperties = ${BOBE_PREFIX}BooleanProps & ${BOBE_PREFIX}NumericProps;\ntype ${BOBE_PREFIX}CreateTextOrComponent = {\n <T>(a: {defineProps?: T} & Record<any, any>): T;\n <T extends new (...args: any[]) =>any>(input: T): InstanceType<T>;\n (input: any): Text;\n};\nlet ${BOBE_PREFIX}_h!:<K extends keyof HTMLElementTagNameMap>(\n tag: K, \n options?: ElementCreationOptions\n) => Omit<HTMLElementTagNameMap[K], keyof ${BOBE_PREFIX}NativeProperties |'textContent' > & { text: string|number|undefined|null } & ${BOBE_PREFIX}NativeProperties & Record<string, any>;\nlet ${BOBE_PREFIX}_t!: ${BOBE_PREFIX}CreateTextOrComponent;\n`;\n\nexport class Bobe2ts {\n tokenizer: Tokenizer;\n compiler: Compiler;\n res: BobeToTsResult = {\n output: '',\n input: '',\n sourceMap: []\n };\n map(\n /** 在模板字符串中的起始 offset(相对于模板内容开头,0-based) */\n templateOffset: number,\n /** 在生成的 bobeToTs code 字符串中的起始 offset */\n codeOffset: number,\n /** 表达式的字符长度 */\n length: number\n ) {\n const item: SourceMapEntry = {\n originOffset: this.templateStart + templateOffset,\n codeOffset: this.virtualStart + codeOffset,\n length\n };\n this.res.sourceMap.push(item);\n return item;\n }\n dent = new Dent(2);\n lines: string[] = [];\n output = ``;\n nextInsExp() {\n const nextData = this.c.tempStaticIns?.next();\n return nextData?.value;\n }\n\n public idg: IdGenerator;\n public program?: Program;\n constructor(\n public c: BuildVDocCtx,\n public template: Template,\n public templateStart: number,\n public virtualStart: number,\n public templateCode: string\n ) {\n this.idg = c.idg || new IdGenerator();\n this.program = c.program;\n const tokenizer = (this.tokenizer = new Tokenizer(() => undefined, false));\n tokenizer.setCode(templateCode);\n const compiler = (this.compiler = new Compiler(tokenizer, {\n parsePropertyInlineFragment: {\n enter: node => {\n const prop = node!.parent! as Property & { inlineName: string };\n const component = prop.parent! as ComponentNode;\n const { varName: cmpInsName, templateSpan } = component.componentName as PropertyValue & {\n varName: string;\n templateSpan?: TemplateSpan;\n };\n const key = prop.key.key;\n const inlineName = this.idg.name;\n this.idg.i++;\n prop.inlineName = inlineName;\n this.output += `let ${inlineName}=(`;\n const rightBrace = `}: NonNullable<NonNullable<(typeof ${cmpInsName})['${key}']>['defineProps']>) => {\\n`;\n\n if (templateSpan && this.program) {\n const area = new Area();\n this.output += '{';\n const checker = this.program.getTypeChecker();\n const gotType = checker.getTypeAtLocation(templateSpan.expression);\n\n const exec = new PropertyExtractor(checker, key, templateSpan.expression, this.c.tss);\n const names = exec.extractPropertyNames(gotType);\n for (const name of names) {\n const start = this.output.length;\n this.output += `${name}:${name},`;\n area.addRange(this.virtualStart + start, this.virtualStart + this.output.length);\n }\n this.output += rightBrace;\n this.template.headAreas!.push(area);\n } else {\n this.c.undoneDocPoint.push(this.output.length);\n this.output += `{${rightBrace}`;\n }\n },\n leave: () => {\n this.output += `};\\n`;\n }\n },\n parseElementNode: {\n propsAdded: node => {\n const _node = node!;\n const tagName = _node.tagName;\n const varName = this.idg.name;\n this.output += `${this.dent.v}let ${varName}=${BOBE_PREFIX}_h('`;\n this.map(this.off(_node), this.output.length, tagName.length);\n this.output += `${tagName}');`;\n this.createSetPropsExp(_node.props, varName);\n this.output += `\\n`;\n this.idg.i++;\n }\n },\n parseName: {\n leave: node => {\n const varName = this.idg.name;\n this.idg.i++;\n const name = node! as PropertyValue & { varName: string; templateSpan: TemplateSpan };\n name.varName = varName;\n const source = name.loc!.source!;\n const sourceName = source.replace(BRACE_REG, match => {\n if (match.length === 1) return ' ';\n return ' ';\n });\n this.output += `${this.dent.v}let ${varName}=${BOBE_PREFIX}_t(`;\n const map = this.map(this.off(name), this.output.length, source.length);\n this.output += `${sourceName});\\n`;\n if(name.type !== NodeType.StaticValue) {\n return;\n }\n let ins: TemplateSpan | undefined;\n while ((ins = this.nextInsExp()) != null) {\n const insStart = ins.getFullStart();\n if (insStart > map.originOffset) {\n if (insStart < map.originOffset + map.length) {\n name.templateSpan = ins;\n }\n break;\n }\n }\n }\n },\n parseComponentNode: {\n propsAdded: node => {\n const _node = node!;\n const name = _node.componentName! as PropertyValue & { varName: string };\n this.createSetPropsExp(_node.props, name.varName);\n this.output += `\\n`;\n }\n },\n parseConditionalNode: {\n propsAdded: node => {\n const _node = node!;\n const cond = _node.condition;\n const condVal = cond.loc!.source;\n const ifHeadS = `${this.dent.v}if(`;\n this.output += ifHeadS;\n this.map(this.off(cond), this.output.length, condVal.length);\n this.output += condVal + `){\\n`;\n this.dent.indent();\n },\n leave: node => {\n this.dent.dedent();\n this.output += `${this.dent.v}}\\n`;\n }\n },\n parseLoopNode: {\n propsAdded: node => {\n const _node = node!;\n this.output += `${this.dent.v}`;\n const { collection: arr, item, index, key } = _node;\n this.map(this.off(arr), this.output.length, arr.loc!.source!.length);\n this.output += arr.loc!.source + '.forEach((';\n this.map(this.off(item), this.output.length, item.loc!.source!.length);\n this.output += item.loc!.source;\n if (index) {\n this.output += ',';\n this.map(this.off(index), this.output.length, index.loc!.source!.length);\n this.output += index.loc!.source;\n }\n this.output += `)=>{`;\n if (key) {\n this.output += `let ${this.idg.k}=`;\n this.map(this.off(key), this.output.length, key.loc!.source!.length);\n this.output += key.loc!.source + ';';\n }\n this.output += '\\n';\n\n this.dent.indent();\n },\n leave: node => {\n this.dent.dedent();\n this.output += `${this.dent.v}});\\n`;\n }\n }\n }));\n }\n off(n: { loc?: any }) {\n return n.loc!.start.offset - 1;\n }\n createSetPropsExp = (props: Property[], name: string) => {\n const nameDot = `${name}.`;\n props.forEach(_prop => {\n const prop = _prop as Property & { inlineName: string };\n const loc = prop.key.loc!;\n let { source: key } = loc;\n this.map(this.off(prop.key), this.output.length + nameDot.length, key.length);\n let replaceCount = 0;\n key = key.replace(/\\-(\\w)/g, (_, match) => {\n const res = match.toUpperCase();\n replaceCount++;\n return res;\n });\n key = key + new Array(replaceCount).fill(' ').join('');\n const assignLeft = `${nameDot}${key}=`;\n this.output += assignLeft;\n if (!prop.value) {\n this.output += 'null;';\n return;\n }\n // 是文档片段\n if (prop.inlineName) {\n this.output += `${prop.inlineName} as any;`;\n return;\n }\n\n let { source: value } = prop.value.loc!;\n if (prop.value.type === NodeType.DynamicValue) {\n // 替换成空格\n value = value.replace(BRACE_REG, ' ');\n }\n\n this.map(this.off(prop.value), this.output.length, value.length);\n this.output += value + ';';\n });\n };\n\n process() {\n this.compiler.parseProgram();\n // log('output', this.output);\n // log('errors', this.compiler.errors.map(e => e.message).join('\\n'));\n return {\n output: this.output,\n input: this.templateCode,\n sourceMap: this.res.sourceMap,\n errors: this.compiler.errors\n };\n }\n}\n\nexport class IdGenerator {\n id = Date.now().toString(36);\n i = 0;\n get name() {\n return `${BOBE_PREFIX}_var_${this.id}_${this.i}`;\n }\n get h() {\n return `h_${this.id}`;\n }\n get t() {\n return `t_${this.id}`;\n }\n get k() {\n return `${BOBE_PREFIX}_for_key_${this.id}`;\n }\n}\n\nexport class PropertyExtractor {\n constructor(private checker: TypeChecker, private key: string, private locationNode: Node, private tss: typeof ts) {}\n\n /**\n * 主入口:两步提取属性名\n * 1. 解析 midType(通过 key 从原始类型中获取)\n * 2. 从 midType 中提取属性名列表\n * 中间任何一步不符合正向逻辑时返回空数组\n */\n public extractPropertyNames(type: Type): string[] {\n if (!type || (type as any).intrinsicName === 'error') {\n return [];\n }\n\n const midType = this.resolveMidType(type);\n if (!midType) return [];\n const midTStr = this.checker.typeToString(midType);\n log('midType:', midTStr);\n\n return this.extractNamesFromMidType(midType);\n }\n\n /**\n * Step 1: 获取传入类型对应实例属性的 key 的类型 (midType)\n * 1.1 classType 是类 → 获取实例类型 → 获取 instance.key 的类型\n * 1.2 classType 是 { defineProps?: T } → 获取 defineProps.key 的类型\n */\n private resolveMidType(type: Type): Type | null {\n if (this.isClassType(type)) {\n const symbol = type.getSymbol() || type.aliasSymbol;\n if (!symbol) return null;\n const instanceType = this.checker.getDeclaredTypeOfSymbol(symbol);\n if (!(instanceType.flags & this.tss.TypeFlags.Object)) return null;\n const targetProp = instanceType.getProperty(this.key);\n if (!targetProp) return null;\n return this.checker.getTypeOfSymbolAtLocation(targetProp, this.locationNode);\n }\n\n if (this.isObjectType(type)) {\n const defineProps = type.getProperty('defineProps');\n if (defineProps) {\n const definePropsType = this.checker.getTypeOfSymbolAtLocation(defineProps, this.locationNode);\n const targetProp = definePropsType.getProperty(this.key);\n if (!targetProp) return null;\n return this.checker.getTypeOfSymbolAtLocation(targetProp, this.locationNode);\n }\n }\n\n return null;\n }\n\n /**\n * Step 2: 处理 midType,提取属性名列表\n * 2.1 midType 是 class → 获取其实例的所有属性名\n * 2.2 midType 是 { defineProps?: T } → 获取 defineProps 的所有属性名\n */\n private extractNamesFromMidType(midType: Type): string[] {\n if (midType.flags & this.tss.TypeFlags.UnionOrIntersection) {\n const types = (midType as any).types as Type[] | undefined;\n if (types) {\n for (const t of types) {\n const names = this.extractNamesFromMidType(t);\n if (names.length > 0) return names;\n }\n }\n return [];\n }\n\n if (this.isClassType(midType)) {\n const symbol = midType.getSymbol() || midType.aliasSymbol;\n if (!symbol) return [];\n const instanceType = this.checker.getDeclaredTypeOfSymbol(symbol);\n if (!(instanceType.flags & this.tss.TypeFlags.Object)) return [];\n return this.getStandardProperties(instanceType);\n }\n\n if (this.isObjectType(midType)) {\n const defineProps = midType.getProperty('defineProps');\n if (defineProps) {\n const definePropsType = this.checker.getTypeOfSymbolAtLocation(defineProps, this.locationNode);\n return this.extractNamesFromMidType(definePropsType);\n }\n return this.getStandardProperties(midType);\n }\n\n return [];\n }\n\n /**\n * 判断是否为 Class(构造函数静态类型)\n */\n private isClassType(type: Type): boolean {\n const symbol = type.getSymbol() || type.aliasSymbol;\n if (!symbol) return false;\n return !!(symbol.flags & (this.tss.SymbolFlags.Class | this.tss.SymbolFlags.Function));\n }\n\n /**\n * 判断是否为普通对象类型 (Object)\n */\n private isObjectType(type: Type): boolean {\n return !!(type.flags & this.tss.TypeFlags.Object);\n }\n\n /**\n * 获取类型的所有属性名(排除 prototype 等元属性)\n */\n private getStandardProperties(type: Type): string[] {\n try {\n const props = this.checker.getPropertiesOfType(type);\n return props.map(p => p.name).filter(name => name !== 'prototype');\n } catch {\n return [];\n }\n }\n}\n\n// const p = new Bobe2ts(\n// new IdGenerator(),\n// 0,\n// `\n// input value={he} style='width: 100px;' onclick={Mes}\n// \\${We} abc=1\n// `\n// );\n\n// const res = p.process();\n\n// const { input, output, sourceMap } = res;\n// let verify = sourceMap.map(({ originOffset: inOffset, codeOffset: outOffset, length }) => {\n// return {\n// _in: input.slice(inOffset, inOffset + length),\n// out: output.slice(outOffset, outOffset + length)\n// };\n// });\n// verify = verify.filter(it => it._in !== it.out);\n// console.log(verify);\n","import type * as ts from 'typescript';\nimport { Bobe2ts, BOBE_DOM_PROP_TRANSFER, IdGenerator } from './bobeToTs';\nimport { log } from './global';\nimport {\n Area,\n getClassMembersInClass,\n isBobeIdentifier,\n isBobeTemplate,\n isClass,\n processHandlers,\n Range\n} from './util';\nimport { BuildVDocCtx, IClassNode, Template, VirtualDocumentResult } from './type';\n\ntype TemplatePreInfo = {\n raw: string;\n className: string;\n sf: ts.SourceFile;\n templateStart: number;\n uiName?: string;\n props?: string[];\n typeExp?: string;\n};\n\nexport function findBobeTemplatesInClass(\n classNode: IClassNode,\n tss: typeof ts,\n sourceFile: ts.SourceFile,\n program?: ts.Program\n) {\n const preInfos: TemplatePreInfo[] = [];\n const checker = program?.getTypeChecker();\n function visit(node: ts.Node) {\n if (isBobeTemplate(node, tss)) {\n const template = node.template;\n const typeArg = node.typeArguments?.[0];\n let props: string[] | undefined = undefined,\n parent = node.parent,\n uiName: string | undefined = undefined,\n typeExp: string | undefined = undefined;\n for (let i = 0; i < 5 && parent; i++) {\n const parentIsAssign = tss.isPropertyDeclaration(parent);\n if (parentIsAssign) {\n uiName = parent.name.getText();\n break;\n }\n }\n if (typeArg && checker && uiName) {\n typeExp = typeArg.getText();\n const typeNode = checker.getTypeAtLocation(typeArg);\n const propNodes = checker.getPropertiesOfType(typeNode);\n props = propNodes.map(prop => prop.name);\n }\n const raw = tss.isNoSubstitutionTemplateLiteral(template)\n ? (template.rawText ?? template.text)\n : template.getText().slice(1, -1);\n // 模板内容在源文件中的起始 offset(反引号后第一个字符)\n const templateStart = template.getStart() + 1; // +1 跳过反引号\n preInfos.push({\n raw,\n uiName,\n typeExp,\n props,\n className: classNode.name?.text || '',\n sf: sourceFile,\n templateStart\n });\n } else {\n tss.forEachChild(node, visit);\n }\n }\n visit(classNode);\n return preInfos;\n}\n\nlet c = {} as BuildVDocCtx;\nexport function buildVirtualDocument(\n sourceFile: ts.SourceFile,\n tss: typeof ts,\n program?: ts.Program\n): VirtualDocumentResult {\n const source = sourceFile.text;\n const virtualCode = source + '\\nexport {};\\n' + BOBE_DOM_PROP_TRANSFER;\n const baseVOffset = virtualCode.length;\n c = { tss, program, baseVOffset, virtualCode, templates: [], undoneDocPoint: [] };\n function walk(node: ts.Node) {\n const skip = processHandlers([beginClass, beginTemplate], node);\n if (!skip) tss.forEachChild(node, walk);\n processHandlers([endClass, endTemplate], node);\n }\n walk(sourceFile);\n log('虚拟文件\\n', c.virtualCode);\n const result = { code: c.virtualCode, templates: c.templates, sf: sourceFile };\n c = {} as any;\n return result;\n}\n\nfunction beginClass(node: ts.Node) {\n if (!isClass(node, c.tss)) return;\n c.currentClass = node;\n return 0;\n}\nfunction endClass(node: ts.Node) {\n if (!isClass(node, c.tss)) return;\n c.currentClass = undefined;\n if (c.builtHeadAreas) {\n c.builtHeadAreas = undefined;\n c.idg = undefined;\n c.virtualCode += `}\\n`;\n }\n return;\n}\nfunction beginTemplate(node: ts.Node) {\n if (!c.tss.isTaggedTemplateExpression(node)) return;\n // 非 bobe 模板语法可以直接跳过\n if (!isBobeIdentifier(node, c.tss)) return 1;\n // bobe 模板语法需要为文件末尾添加东西\n // 1. 为 class 添加类型上下文\n const template = { headAreas: [] } as any as Template;\n if (c.currentClass && !c.builtHeadAreas) {\n c.idg = new IdGenerator();\n const { currentClass } = c;\n const className = currentClass.name!.getText();\n\n const area = new Area();\n c.virtualCode += `{\\nconst {`;\n const members = getClassMembersInClass(currentClass, c.tss);\n for (const member of members) {\n const nameText = member.name!.getText();\n const itemStart = c.virtualCode.length;\n c.virtualCode += `${nameText}:${nameText},`;\n const itemEnd = c.virtualCode.length;\n area.addRange(itemStart, itemEnd);\n }\n c.virtualCode += `} = {} as any as ${className};\\n`;\n c.builtHeadAreas = template.headAreas = [area];\n }\n c.virtualCode += '{\\n';\n // 2. 为泛型添加类型上下文\n if (node.typeArguments) {\n const typeArg = node.typeArguments[0];\n const checker = c.program?.getTypeChecker();\n if (checker) {\n const typeNode = checker.getTypeAtLocation(typeArg);\n const typeExp = typeArg.getText();\n const originOffset = typeArg.getFullStart();\n const propNodes = checker.getPropertiesOfType(typeNode);\n /*----------------- 增加类型解构 -----------------*/\n const area = new Area();\n c.virtualCode += `const {`;\n for (const { name } of propNodes) {\n const itemStart = c.virtualCode.length;\n c.virtualCode += `${name}:${name},`;\n const itemEnd = c.virtualCode.length;\n area.addRange(itemStart, itemEnd);\n }\n\n c.virtualCode += `} = {} as any as `;\n const codeOffset = c.virtualCode.length;\n /*----------------- 记录类型位置的映射 -----------------*/\n c.virtualCode += typeExp;\n template.headTemplate = area;\n template.typeMap = {\n originOffset,\n codeOffset,\n length: typeExp.length\n };\n c.virtualCode += `;\\n`;\n }\n }\n if (!c.tss.isNoSubstitutionTemplateLiteral(node.template)) {\n const insArr = Array.from(node.template.templateSpans);\n c.tempStaticIns = insArr[Symbol.iterator]();\n }\n // 3. 构建虚拟文档\n const templateStart = node.template.getFullStart() + 1;\n const virtualStart = c.virtualCode.length;\n const raw = node.template.getText().slice(1, -1);\n const { output, sourceMap, errors } = new Bobe2ts(c, template, templateStart, virtualStart, raw).process();\n c.virtualCode += output + `}\\n`;\n template.sourceMap = sourceMap;\n template.errors = errors;\n template.templateStart = templateStart;\n template.virtualStart = virtualStart;\n c.templates.push(template);\n return 1;\n}\nfunction endTemplate(node: ts.Node) {\n if (!isBobeTemplate(node, c.tss)) return;\n return;\n}\n"],"names":["cache","memo","NodeType","Tokenizer","Compiler"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { NodeType, Tokenizer, Compiler } from 'bobe/compiler';
2
- import { TypeFlags, SymbolFlags } from 'typescript';
3
2
 
4
3
  const G = {};
5
4
  function log(...args) {
@@ -516,7 +515,7 @@ class Bobe2ts {
516
515
  this.output += "{";
517
516
  const checker = this.program.getTypeChecker();
518
517
  const gotType = checker.getTypeAtLocation(templateSpan.expression);
519
- const exec = new PropertyExtractor(checker, key, templateSpan.expression);
518
+ const exec = new PropertyExtractor(checker, key, templateSpan.expression, this.c.tss);
520
519
  const names = exec.extractPropertyNames(gotType);
521
520
  for (const name of names) {
522
521
  const start = this.output.length;
@@ -682,10 +681,11 @@ class IdGenerator {
682
681
  }
683
682
  }
684
683
  class PropertyExtractor {
685
- constructor(checker, key, locationNode) {
684
+ constructor(checker, key, locationNode, tss) {
686
685
  this.checker = checker;
687
686
  this.key = key;
688
687
  this.locationNode = locationNode;
688
+ this.tss = tss;
689
689
  }
690
690
  /**
691
691
  * 主入口:两步提取属性名
@@ -713,7 +713,7 @@ class PropertyExtractor {
713
713
  const symbol = type.getSymbol() || type.aliasSymbol;
714
714
  if (!symbol) return null;
715
715
  const instanceType = this.checker.getDeclaredTypeOfSymbol(symbol);
716
- if (!(instanceType.flags & TypeFlags.Object)) return null;
716
+ if (!(instanceType.flags & this.tss.TypeFlags.Object)) return null;
717
717
  const targetProp = instanceType.getProperty(this.key);
718
718
  if (!targetProp) return null;
719
719
  return this.checker.getTypeOfSymbolAtLocation(targetProp, this.locationNode);
@@ -735,7 +735,7 @@ class PropertyExtractor {
735
735
  * 2.2 midType 是 { defineProps?: T } → 获取 defineProps 的所有属性名
736
736
  */
737
737
  extractNamesFromMidType(midType) {
738
- if (midType.flags & TypeFlags.UnionOrIntersection) {
738
+ if (midType.flags & this.tss.TypeFlags.UnionOrIntersection) {
739
739
  const types = midType.types;
740
740
  if (types) {
741
741
  for (const t of types) {
@@ -749,7 +749,7 @@ class PropertyExtractor {
749
749
  const symbol = midType.getSymbol() || midType.aliasSymbol;
750
750
  if (!symbol) return [];
751
751
  const instanceType = this.checker.getDeclaredTypeOfSymbol(symbol);
752
- if (!(instanceType.flags & TypeFlags.Object)) return [];
752
+ if (!(instanceType.flags & this.tss.TypeFlags.Object)) return [];
753
753
  return this.getStandardProperties(instanceType);
754
754
  }
755
755
  if (this.isObjectType(midType)) {
@@ -768,13 +768,13 @@ class PropertyExtractor {
768
768
  isClassType(type) {
769
769
  const symbol = type.getSymbol() || type.aliasSymbol;
770
770
  if (!symbol) return false;
771
- return !!(symbol.flags & (SymbolFlags.Class | SymbolFlags.Function));
771
+ return !!(symbol.flags & (this.tss.SymbolFlags.Class | this.tss.SymbolFlags.Function));
772
772
  }
773
773
  /**
774
774
  * 判断是否为普通对象类型 (Object)
775
775
  */
776
776
  isObjectType(type) {
777
- return !!(type.flags & TypeFlags.Object);
777
+ return !!(type.flags & this.tss.TypeFlags.Object);
778
778
  }
779
779
  /**
780
780
  * 获取类型的所有属性名(排除 prototype 等元属性)
@@ -1 +1 @@
1
- {"version":3,"file":"bobe-language-core.esm.js","sources":["../src/global.ts","../src/util.ts","../src/bobeToTs.ts","../src/buildVirtualDocument.ts"],"sourcesContent":["export const G: Record<any, any> = {};\n\nexport function log(...args: (string | number)[]) {\n G.log?.info?.(args.join(' '));\n}\n\nexport const Virtual_File_Suffix = '__bobe_virtual_file__';\n\nexport const Virtual_File_Exp = /__bobe_virtual_file__/;\n","import type * as ts from 'typescript';\nimport { Virtual_File_Exp, Virtual_File_Suffix } from './global';\nimport { AbsMap, BobeTemplateInfo, HeadMap, IClassNode, Template } from './type';\nimport type { SourceLocation } from 'bobe';\n\nexport class LRUCache<K = string, V = any> {\n private maxSize: number;\n private cache: Map<K, V> = new Map();\n\n constructor(maxSize: number) {\n this.maxSize = maxSize;\n }\n\n get(key: K): V | undefined {\n if (!this.cache.has(key)) {\n return undefined; // 如果缓存中没有该键,返回 -1\n }\n\n // 将该键值对移动到 Map 的末尾,表示它是最近使用的\n const value = this.cache.get(key)!;\n this.cache.delete(key); // 先删除\n this.cache.set(key, value); // 再插入到末尾\n return value;\n }\n\n set(key: K, value: V): void {\n if (this.cache.has(key)) {\n // 更新已有的键值对,并将其移动到末尾\n this.cache.delete(key);\n this.cache.set(key, value);\n } else {\n // 如果缓存已满,移除最久未使用的元素\n if (this.cache.size >= this.maxSize) {\n // Map 会保持插入顺序,删除最前面的键值对\n this.cache.delete(this.cache.keys().next().value!);\n }\n this.cache.set(key, value);\n }\n }\n\n // 新增 has 方法,检查某个键是否在缓存中\n has = this.cache.has.bind(this.cache) as typeof this.cache.has;\n\n delete = this.cache.delete.bind(this.cache) as typeof this.cache.delete;\n}\nexport type SingleArgFn = (v: any) => any;\n\nconst cache = new LRUCache<any, any>(1000);\nexport function memo<T extends SingleArgFn>(fn: T): T {\n const wrap = (v: Parameters<T>) => {\n const res = fn(v);\n cache.set(v, res);\n return res;\n };\n return wrap as T;\n}\n\nexport function createMemo() {\n const cache = new LRUCache<any, any>(1000);\n return function memo<T extends SingleArgFn>(fn: T): T {\n const wrap = (v: Parameters<T>) => {\n const res = fn(v);\n cache.set(v, res);\n return res;\n };\n return wrap as T;\n };\n}\n\nexport function uniqBy<T>(arr: T[], keyFn: (item: T) => any): T[] {\n const seen = new Set();\n return arr.filter(item => {\n const key = keyFn(item);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nexport function getVirtualName(fileName: string) {\n const dotI = fileName.lastIndexOf('.');\n const rawName = fileName.slice(0, dotI);\n const suffix = fileName.slice(dotI);\n return rawName + Virtual_File_Suffix + suffix;\n}\n\nexport function getRealName(virtualFileName: string) {\n return virtualFileName.replace(Virtual_File_Exp, '');\n}\n\nexport function isVirtualFile(fileName: string) {\n return fileName.match(Virtual_File_Exp);\n}\n\n/**\n * s1 e1\n * 0 1\n * 1 2\n * s2 e2\n */\nexport function isOverlap(start1: number, end1: number, start2: number, end2: number) {\n return start1 < end2 && start2 < end1;\n}\n\n/** 判断在 {} 内 */\nexport function inInsBrace(content: string, targetIndex: number): boolean {\n let stack: ('block' | 'expression')[] = [];\n\n for (let i = 0; i < content.length; i++) {\n // 在检查状态之前,先判断是否到达了目标索引\n if (i === targetIndex) {\n // 判断标准:\n // 1. 栈不为空(表示在某类括号内)\n // 2. 栈顶必须是 'block',不能是 'expression'\n return stack.length > 0 && stack[stack.length - 1] === 'block';\n }\n\n const char = content[i];\n const nextChar = content[i + 1];\n\n // 1. 识别 ${\n if (char === '$' && nextChar === '{') {\n stack.push('expression');\n i++; // 跳过 '{',避免下次循环重复处理\n continue;\n }\n\n // 2. 识别普通的 {\n if (char === '{') {\n stack.push('block');\n continue;\n }\n\n // 3. 识别 }\n if (char === '}') {\n stack.pop();\n continue;\n }\n }\n\n return false;\n}\n\nexport function isBobeIdentifier(node: ts.TaggedTemplateExpression, tss: typeof ts): boolean {\n return tss.isIdentifier(node.tag) && node.tag.text === 'bobe';\n}\n\nexport function isBobeTemplate(node: ts.Node, tss: typeof ts): node is ts.TaggedTemplateExpression {\n return tss.isTaggedTemplateExpression(node) && isBobeIdentifier(node, tss);\n}\n\nexport function sfHasBobeTemplate(sf: ts.SourceFile, tss: typeof ts) {\n let hasBobe = false;\n function visit(node: ts.Node) {\n if (hasBobe) {\n return;\n }\n if (isBobeTemplate(node, tss)) {\n hasBobe = true;\n } else {\n tss.forEachChild(node, visit);\n }\n }\n visit(sf);\n return hasBobe;\n}\n\nexport const strHasBobeTemplate = (str: string) => str.match(/bobe(?:\\\\s*(<)([^`]*)(>))?`/);\n\n/** 获取当前节点最近的类名 */\nexport function findPrecedingClassNode(\n targetNode: ts.Node,\n sourceFile: ts.SourceFile,\n tss: typeof ts\n): IClassNode | undefined {\n let result: IClassNode | undefined,\n alreadyCrossTargetNode = false;\n function visit(node: ts.Node) {\n if (node.pos >= targetNode.pos || alreadyCrossTargetNode || result) {\n return (alreadyCrossTargetNode = true);\n }\n if (isClass(node, tss) && node.name && contains(node, targetNode)) {\n result = node;\n }\n tss.forEachChild(node, visit);\n }\n visit(sourceFile);\n return result;\n}\n\nexport function findPrecedingBobeTemplate(targetNode: ts.Node, classNode: ts.Node, tss: typeof ts) {\n let result: ts.TaggedTemplateExpression | undefined;\n function visit(node: ts.Node) {\n if (node.pos >= targetNode.pos) return;\n if (isBobeTemplate(node, tss)) {\n result = node;\n }\n tss.forEachChild(node, visit);\n }\n visit(classNode);\n return result;\n}\n\nexport function getClassMembersInClass(classNode: IClassNode, tss: typeof ts) {\n const names: ts.ClassElement[] = [];\n for (const member of classNode.members) {\n if (isClassProp(member, tss)) {\n names.push(member);\n }\n }\n return names;\n}\n\n/** 根据类名获取成员名称列表 */\nexport function getClassMemberNames(className: string, rangeNode: ts.Node, tss: typeof ts): ts.ClassElement[] {\n const names: ts.ClassElement[] = [];\n function visit(node: ts.Node) {\n if (isClass(node, tss) && node.name?.text === className) {\n for (const member of node.members) {\n if (isClassProp(member, tss)) {\n names.push(member);\n }\n }\n return;\n }\n tss.forEachChild(node, visit);\n }\n visit(rangeNode);\n return names;\n}\n\nexport function calcAbsSourceMap(cursorOffset: number, templates: Template[], isVirtualCursor = false) {\n const compareKey = isVirtualCursor ? 'codeOffset' : 'originOffset';\n const startKey = isVirtualCursor ? 'virtualStart' : 'templateStart';\n for (let i = templates.length; i--; ) {\n const template = templates[i];\n if (template[startKey] < cursorOffset) {\n for (const map of template.sourceMap) {\n if (cursorOffset >= map[compareKey] && cursorOffset <= map[compareKey] + map.length) {\n const { codeOffset: virtualStart, originOffset: originStart, length } = map;\n const dt = cursorOffset - map[compareKey];\n return {\n virtualStart,\n originStart,\n virtualOffset: virtualStart + dt,\n originOffset: originStart + dt,\n length\n };\n }\n }\n }\n }\n}\n\nexport function inWitchVirtualPart(absCursorOffset: number, templates: Template[]) {\n for (const template of templates) {\n const range = template.headTemplate?.findRange(absCursorOffset);\n // 属于模板 head 解构区\n if (range) {\n return { template, part: 'headTemplate', range };\n } else {\n for (const area of template?.headAreas || []) {\n const found = area.findRange(absCursorOffset);\n if (found) {\n return { template, part: 'headClass', range: found };\n }\n }\n }\n }\n return { template: undefined, part: undefined, range: undefined };\n}\n\n/** 计算的是 IIFE 中 解构的 所有类成员的 映射*/\nexport function calcHeadSourceMap(absCursorOffset: number, templates: BobeTemplateInfo[]) {\n let virtualStart: number | undefined;\n let originStart: number, length: number;\n for (const tmpl of templates) {\n if (!inVirtualHead(tmpl.headMap, { start: absCursorOffset } as any, tmpl)) continue;\n const cursorOffset = absCursorOffset - tmpl.iifeStartInVirtual!;\n for (const entry of tmpl.headMap) {\n if (cursorOffset >= entry.codeOffset && cursorOffset <= entry.codeOffset + entry.length) {\n virtualStart = tmpl.iifeStartInVirtual! + entry.codeOffset;\n originStart = entry.originOffset;\n const dt = cursorOffset - entry.codeOffset;\n length = entry.length;\n return {\n virtualStart,\n originStart,\n virtualOffset: virtualStart + dt,\n originOffset: originStart + dt,\n length\n };\n }\n }\n }\n}\n\n/**\n * 1. 插值表达式中的 js 标识符 如 tag prop={ a ? foo : bar } 中的 bar\n * 2. 完整的标识符,如 tag prop=xxx 中的 prop\n */\nexport function fixTextSpan(textSpan: ts.TextSpan, code: string, map: AbsMap) {\n const originalCode = code.slice(map.originStart, map.originStart + map.length);\n /** 当内容为 js 标识符 且 textSpan 是插值表达式中的一部分时\n * span.start ~ virtualOffset 和\n * targetStart ~ originOffset 是相同的\n * 因此 targetStart = originOffset - (virtualOffset - span.start)\n */\n if (textSpan.length < map.length && !originalCode.match(domPropertyExp)) {\n const { start, length } = textSpan;\n const targetStart = map.originOffset - (map.virtualOffset - start);\n return { start: targetStart, length };\n }\n\n // 其余情况直接返回完整的原始标识符\n return { start: map.originStart, length: map.length };\n}\n\nexport function getPosTemplateCtx(\n info: ts.server.PluginCreateInfo,\n tss: typeof ts,\n fileName: string,\n position: number\n) {\n const sf = info.languageService.getProgram()?.getSourceFile(fileName);\n if (!sf) return null;\n const node = findNodeAtPosition(tss, sf, position);\n if (!node) return null;\n const templateNode = getValidBobeTemplateNode(tss, node);\n if (!templateNode || position <= templateNode.pos) return null;\n const baseOffset = templateNode.getStart() + 1;\n const ctx = makeContext(templateNode, sf, fileName, baseOffset);\n const relPos = getRelativePosition(info, baseOffset, fileName, position); // 这里找到了相对第二个模板的开始位置\n return { ctx, relPos: relPos as SourceLocation['start'] };\n}\n\nexport function getSourceFileAndNode(\n info: ts.server.PluginCreateInfo,\n tss: typeof ts,\n fileName: string,\n position: number\n) {\n const sf = info.languageService.getProgram()?.getSourceFile(fileName);\n if (!sf) return null;\n const node = findNodeAtPosition(tss, sf, position);\n if (!node) return null;\n return { sf, node };\n}\n\n// 判断节点是否属于 bobe 标签模板,返回模板字面量节点\nexport function getValidBobeTemplateNode(tss: typeof ts, node: ts.Node): ts.TemplateLiteral | undefined {\n switch (node.kind) {\n case tss.SyntaxKind.TaggedTemplateExpression: {\n const t = node as ts.TaggedTemplateExpression;\n return isBobeIdentifier(t, tss) ? t.template : undefined;\n }\n case tss.SyntaxKind.NoSubstitutionTemplateLiteral: {\n const p = node.parent;\n return p && isBobeTemplate(p, tss) ? (node as ts.NoSubstitutionTemplateLiteral) : undefined;\n }\n case tss.SyntaxKind.TemplateHead:\n return node.parent?.parent ? getValidBobeTemplateNode(tss, node.parent.parent) : undefined;\n case tss.SyntaxKind.TemplateMiddle:\n case tss.SyntaxKind.TemplateTail:\n return node.parent?.parent?.parent ? getValidBobeTemplateNode(tss, node.parent.parent.parent) : undefined;\n default:\n return undefined;\n }\n}\n\n/** 将文件绝对 offset 转换为相对模板开头 ` 的偏移量 */\nexport function getRelativePosition(\n info: ts.server.PluginCreateInfo,\n baseOffset: number,\n fileName: string,\n position: number\n): SourceLocation['start'] {\n const scriptInfo = info.project.getScriptInfo(fileName);\n if (!scriptInfo) return { line: 0, column: 0, offset: position - baseOffset };\n const baseLoc = scriptInfo.positionToLineOffset(baseOffset); // 1-based\n const cursorLoc = scriptInfo.positionToLineOffset(position);\n const bl = baseLoc.line - 1,\n bc = baseLoc.offset - 1;\n const cl = cursorLoc.line - 1,\n cc = cursorLoc.offset - 1;\n return { line: cl - bl, column: cl === bl ? cc - bc : cc, offset: position - baseOffset };\n}\n\n// 构造最小 context 对象(BobeTemplateService 只用 node、fileName、text)\nexport function makeContext(templateNode: ts.TemplateLiteral, sf: ts.SourceFile, fileName: string, baseOffset: number) {\n return { node: templateNode, fileName, text: templateNode.getText().slice(1, -1), sf, baseOffset };\n}\n\n// 在 AST 中找到 position 处最深的节点\nexport function findNodeAtPosition(tss: typeof ts, sf: ts.SourceFile, position: number): ts.Node | undefined {\n function find(node: ts.Node): ts.Node | undefined {\n if (position >= node.getStart() && position < node.getEnd()) {\n return tss.forEachChild(node, find) || node;\n }\n return undefined;\n }\n return find(sf);\n}\n\n/** 当前位置是bobe 模板的类型声明,找一下在虚拟文件对应的位置 */\nexport function findTemplateTypePos(templates: Template[], pos: number) {\n for (const tmpl of templates) {\n const { typeMap } = tmpl;\n if (!typeMap) continue;\n const { originOffset, codeOffset, length } = typeMap;\n if (originOffset <= pos && pos < originOffset + length) {\n const dt = pos - originOffset;\n return {\n virtualStart: codeOffset,\n originStart: originOffset,\n virtualOffset: codeOffset + dt,\n originOffset: originOffset + dt,\n length\n };\n }\n }\n}\n\nexport const domPropertyExp = /^[a-zA-Z][\\w-]*$/;\n\nexport const AND = `__BOBE_AND_${Date.now().toString(36)}__`;\n\nexport function isClassProp(node: ts.Node, tss: typeof ts) {\n return tss.isPropertyDeclaration(node) || (tss.isMethodDeclaration(node) && tss.isIdentifier(node.name));\n}\n\nexport function isClass(node: ts.Node, tss: typeof ts) {\n return tss.isClassDeclaration(node) || tss.isClassExpression(node);\n}\n\nexport function* getSharedItems<A, B>(\n arr1: A[],\n arr2: B[],\n isEqual: (a: A, b: B) => boolean,\n isBigger: (a: A, b: B) => boolean\n) {\n const it1 = arr1[Symbol.iterator]();\n const it2 = arr2[Symbol.iterator]();\n\n let res1 = it1.next();\n let res2 = it2.next();\n\n while (!res1.done && !res2.done) {\n const v1 = res1.value;\n const v2 = res2.value;\n\n // 始终保持 v1 在前,v2 在后\n if (isEqual(v1, v2)) {\n yield [v1, v2] as const; // 或者根据需求 yield { v1, v2 }\n res1 = it1.next();\n res2 = it2.next();\n } else if (isBigger(v1, v2)) {\n // v1 > v2: 因为是递增数组,说明 v2 太小了,需要移动 arr2 的指针\n res2 = it2.next();\n } else {\n // v1 < v2: 说明 v1 太小了,移动 arr1 的指针\n res1 = it1.next();\n }\n }\n}\n\nexport const inVirtualPart = (sf: ts.SourceFile, textSpan: ts.TextSpan) => textSpan.start > sf.getFullWidth();\nexport const inVirtualHead = (headMap: HeadMap, textSpan: ts.TextSpan, tmpl: BobeTemplateInfo) =>\n tmpl.iifeStartInVirtual! + headMap.range![0] <= textSpan.start &&\n textSpan.start < tmpl.iifeStartInVirtual! + headMap.range![1];\n\nexport const contains = (parent: ts.Node, child: ts.Node): boolean =>\n // parent.pos 是包含注释和空白的起始位置\n // parent.getStart() 是代码实际开始的位置\n child.getStart() >= parent.getStart() && child.getEnd() <= parent.getEnd();\n\nexport const processHandlers = (fns: ((node: ts.Node) => number | null | void)[], node: ts.Node) => {\n for (const handler of fns) {\n const shouldSkip = handler(node);\n if (shouldSkip != null) {\n // 1是跳过,0继续\n return shouldSkip as unknown as boolean;\n }\n }\n // 默认不跳过\n return 0;\n};\n\nexport class Range {\n constructor(\n public start: number,\n public end: number\n ) {}\n contains(pos: number) {\n return this.start <= pos && pos < this.end;\n }\n}\n\nexport class Area {\n ranges: Range[] = [];\n\n get start() {\n return this.ranges[0]?.start || -1;\n }\n\n get end() {\n return this.ranges[this.ranges.length - 1]?.end || -1;\n }\n\n findRange(pos: number) {\n if (!Range.prototype.contains.call(this, pos)) {\n return;\n }\n for (const range of this.ranges) {\n if (range.contains(pos)) {\n return range;\n }\n }\n }\n\n addRange(start: number, end: number) {\n this.ranges.push(new Range(start, end));\n }\n}\n","import { Compiler, Tokenizer, NodeType } from 'bobe/compiler';\nimport type {\n ElementNode,\n ComponentNode,\n LoopNode,\n ConditionalNode,\n Property,\n TemplateNode,\n DynamicValue,\n StaticValue,\n InterpolationNode,\n PropertyValue\n} from 'bobe';\nimport { log } from './global';\nimport { BuildVDocCtx, SourceMapEntry, Template } from './type';\nimport { SymbolFlags, TypeFlags } from 'typescript';\nimport type { TemplateSpan, Program, Type, TypeChecker, Node } from 'typescript';\nimport { Area } from './util';\n\nexport interface BobeToTsResult {\n output: string;\n input: string;\n sourceMap: SourceMapEntry[];\n}\n\nclass Dent {\n stack: number[];\n constructor(public base: number) {\n this.stack = [base];\n }\n get v() {\n const length = this.stack[this.stack.length - 1];\n return new Array(length).fill(' ').join('');\n }\n indent() {\n const length = this.stack[this.stack.length - 1];\n this.stack.push(length + 2);\n }\n dedent() {\n this.stack.pop();\n }\n}\n\nconst BRACE_REG = /(^\\$\\{)|(^\\{)|(\\}$)/g;\nexport const BOBE_PREFIX = '$Bobe' + Date.now().toString(36);\nexport const BOBE_DOM_PROP_TRANSFER = `type ${BOBE_PREFIX}ToMap<K extends string, T> = {\n [P in K]?: T;\n};\ntype ${BOBE_PREFIX}BooleanProps = ${BOBE_PREFIX}ToMap<\n 'disabled' | 'checked' | 'selected' | 'readonly' | 'required' | \n 'multiple' | 'hidden' | 'autofocus' | 'novalidate' | 'ismap' | \n 'open' | 'reversed' | 'indeterminate', \n boolean|string|undefined|null\n>;\ntype ${BOBE_PREFIX}NumericProps = ${BOBE_PREFIX}ToMap<\n 'style'|'value' | 'placeholder' | 'title' | 'alt' | 'width' | 'height' | 'columnCount' | 'tabIndex' | 'maxLength' | \n 'minLength' | 'size' | 'rows' | 'cols' | 'span' | 'start' | \n 'valueAsNumber' | 'max' | 'min' | 'step', \n string|number|undefined|null\n>;\ntype ${BOBE_PREFIX}NativeProperties = ${BOBE_PREFIX}BooleanProps & ${BOBE_PREFIX}NumericProps;\ntype ${BOBE_PREFIX}CreateTextOrComponent = {\n <T>(a: {defineProps?: T} & Record<any, any>): T;\n <T extends new (...args: any[]) =>any>(input: T): InstanceType<T>;\n (input: any): Text;\n};\nlet ${BOBE_PREFIX}_h!:<K extends keyof HTMLElementTagNameMap>(\n tag: K, \n options?: ElementCreationOptions\n) => Omit<HTMLElementTagNameMap[K], keyof ${BOBE_PREFIX}NativeProperties |'textContent' > & { text: string|number|undefined|null } & ${BOBE_PREFIX}NativeProperties & Record<string, any>;\nlet ${BOBE_PREFIX}_t!: ${BOBE_PREFIX}CreateTextOrComponent;\n`;\n\nexport class Bobe2ts {\n tokenizer: Tokenizer;\n compiler: Compiler;\n res: BobeToTsResult = {\n output: '',\n input: '',\n sourceMap: []\n };\n map(\n /** 在模板字符串中的起始 offset(相对于模板内容开头,0-based) */\n templateOffset: number,\n /** 在生成的 bobeToTs code 字符串中的起始 offset */\n codeOffset: number,\n /** 表达式的字符长度 */\n length: number\n ) {\n const item: SourceMapEntry = {\n originOffset: this.templateStart + templateOffset,\n codeOffset: this.virtualStart + codeOffset,\n length\n };\n this.res.sourceMap.push(item);\n return item;\n }\n dent = new Dent(2);\n lines: string[] = [];\n output = ``;\n nextInsExp() {\n const nextData = this.c.tempStaticIns?.next();\n return nextData?.value;\n }\n\n public idg: IdGenerator;\n public program?: Program;\n constructor(\n public c: BuildVDocCtx,\n public template: Template,\n public templateStart: number,\n public virtualStart: number,\n public templateCode: string\n ) {\n this.idg = c.idg || new IdGenerator();\n this.program = c.program;\n const tokenizer = (this.tokenizer = new Tokenizer(() => undefined, false));\n tokenizer.setCode(templateCode);\n const compiler = (this.compiler = new Compiler(tokenizer, {\n parsePropertyInlineFragment: {\n enter: node => {\n const prop = node!.parent! as Property & { inlineName: string };\n const component = prop.parent! as ComponentNode;\n const { varName: cmpInsName, templateSpan } = component.componentName as PropertyValue & {\n varName: string;\n templateSpan?: TemplateSpan;\n };\n const key = prop.key.key;\n const inlineName = this.idg.name;\n this.idg.i++;\n prop.inlineName = inlineName;\n this.output += `let ${inlineName}=(`;\n const rightBrace = `}: NonNullable<NonNullable<(typeof ${cmpInsName})['${key}']>['defineProps']>) => {\\n`;\n\n if (templateSpan && this.program) {\n const area = new Area();\n this.output += '{';\n const checker = this.program.getTypeChecker();\n const gotType = checker.getTypeAtLocation(templateSpan.expression);\n\n const exec = new PropertyExtractor(checker, key, templateSpan.expression);\n const names = exec.extractPropertyNames(gotType);\n for (const name of names) {\n const start = this.output.length;\n this.output += `${name}:${name},`;\n area.addRange(this.virtualStart + start, this.virtualStart + this.output.length);\n }\n this.output += rightBrace;\n this.template.headAreas!.push(area);\n } else {\n this.c.undoneDocPoint.push(this.output.length);\n this.output += `{${rightBrace}`;\n }\n },\n leave: () => {\n this.output += `};\\n`;\n }\n },\n parseElementNode: {\n propsAdded: node => {\n const _node = node!;\n const tagName = _node.tagName;\n const varName = this.idg.name;\n this.output += `${this.dent.v}let ${varName}=${BOBE_PREFIX}_h('`;\n this.map(this.off(_node), this.output.length, tagName.length);\n this.output += `${tagName}');`;\n this.createSetPropsExp(_node.props, varName);\n this.output += `\\n`;\n this.idg.i++;\n }\n },\n parseName: {\n leave: node => {\n const varName = this.idg.name;\n this.idg.i++;\n const name = node! as PropertyValue & { varName: string; templateSpan: TemplateSpan };\n name.varName = varName;\n const source = name.loc!.source!;\n const sourceName = source.replace(BRACE_REG, match => {\n if (match.length === 1) return ' ';\n return ' ';\n });\n this.output += `${this.dent.v}let ${varName}=${BOBE_PREFIX}_t(`;\n const map = this.map(this.off(name), this.output.length, source.length);\n this.output += `${sourceName});\\n`;\n if(name.type !== NodeType.StaticValue) {\n return;\n }\n let ins: TemplateSpan | undefined;\n while ((ins = this.nextInsExp()) != null) {\n const insStart = ins.getFullStart();\n if (insStart > map.originOffset) {\n if (insStart < map.originOffset + map.length) {\n name.templateSpan = ins;\n }\n break;\n }\n }\n }\n },\n parseComponentNode: {\n propsAdded: node => {\n const _node = node!;\n const name = _node.componentName! as PropertyValue & { varName: string };\n this.createSetPropsExp(_node.props, name.varName);\n this.output += `\\n`;\n }\n },\n parseConditionalNode: {\n propsAdded: node => {\n const _node = node!;\n const cond = _node.condition;\n const condVal = cond.loc!.source;\n const ifHeadS = `${this.dent.v}if(`;\n this.output += ifHeadS;\n this.map(this.off(cond), this.output.length, condVal.length);\n this.output += condVal + `){\\n`;\n this.dent.indent();\n },\n leave: node => {\n this.dent.dedent();\n this.output += `${this.dent.v}}\\n`;\n }\n },\n parseLoopNode: {\n propsAdded: node => {\n const _node = node!;\n this.output += `${this.dent.v}`;\n const { collection: arr, item, index, key } = _node;\n this.map(this.off(arr), this.output.length, arr.loc!.source!.length);\n this.output += arr.loc!.source + '.forEach((';\n this.map(this.off(item), this.output.length, item.loc!.source!.length);\n this.output += item.loc!.source;\n if (index) {\n this.output += ',';\n this.map(this.off(index), this.output.length, index.loc!.source!.length);\n this.output += index.loc!.source;\n }\n this.output += `)=>{`;\n if (key) {\n this.output += `let ${this.idg.k}=`;\n this.map(this.off(key), this.output.length, key.loc!.source!.length);\n this.output += key.loc!.source + ';';\n }\n this.output += '\\n';\n\n this.dent.indent();\n },\n leave: node => {\n this.dent.dedent();\n this.output += `${this.dent.v}});\\n`;\n }\n }\n }));\n }\n off(n: { loc?: any }) {\n return n.loc!.start.offset - 1;\n }\n createSetPropsExp = (props: Property[], name: string) => {\n const nameDot = `${name}.`;\n props.forEach(_prop => {\n const prop = _prop as Property & { inlineName: string };\n const loc = prop.key.loc!;\n let { source: key } = loc;\n this.map(this.off(prop.key), this.output.length + nameDot.length, key.length);\n let replaceCount = 0;\n key = key.replace(/\\-(\\w)/g, (_, match) => {\n const res = match.toUpperCase();\n replaceCount++;\n return res;\n });\n key = key + new Array(replaceCount).fill(' ').join('');\n const assignLeft = `${nameDot}${key}=`;\n this.output += assignLeft;\n if (!prop.value) {\n this.output += 'null;';\n return;\n }\n // 是文档片段\n if (prop.inlineName) {\n this.output += `${prop.inlineName} as any;`;\n return;\n }\n\n let { source: value } = prop.value.loc!;\n if (prop.value.type === NodeType.DynamicValue) {\n // 替换成空格\n value = value.replace(BRACE_REG, ' ');\n }\n\n this.map(this.off(prop.value), this.output.length, value.length);\n this.output += value + ';';\n });\n };\n\n process() {\n this.compiler.parseProgram();\n // log('output', this.output);\n // log('errors', this.compiler.errors.map(e => e.message).join('\\n'));\n return {\n output: this.output,\n input: this.templateCode,\n sourceMap: this.res.sourceMap,\n errors: this.compiler.errors\n };\n }\n}\n\nexport class IdGenerator {\n id = Date.now().toString(36);\n i = 0;\n get name() {\n return `${BOBE_PREFIX}_var_${this.id}_${this.i}`;\n }\n get h() {\n return `h_${this.id}`;\n }\n get t() {\n return `t_${this.id}`;\n }\n get k() {\n return `${BOBE_PREFIX}_for_key_${this.id}`;\n }\n}\n\nexport class PropertyExtractor {\n constructor(private checker: TypeChecker, private key: string, private locationNode: Node) {}\n\n /**\n * 主入口:两步提取属性名\n * 1. 解析 midType(通过 key 从原始类型中获取)\n * 2. 从 midType 中提取属性名列表\n * 中间任何一步不符合正向逻辑时返回空数组\n */\n public extractPropertyNames(type: Type): string[] {\n if (!type || (type as any).intrinsicName === 'error') {\n return [];\n }\n\n const midType = this.resolveMidType(type);\n if (!midType) return [];\n const midTStr = this.checker.typeToString(midType);\n log('midType:', midTStr);\n\n return this.extractNamesFromMidType(midType);\n }\n\n /**\n * Step 1: 获取传入类型对应实例属性的 key 的类型 (midType)\n * 1.1 classType 是类 → 获取实例类型 → 获取 instance.key 的类型\n * 1.2 classType 是 { defineProps?: T } → 获取 defineProps.key 的类型\n */\n private resolveMidType(type: Type): Type | null {\n if (this.isClassType(type)) {\n const symbol = type.getSymbol() || type.aliasSymbol;\n if (!symbol) return null;\n const instanceType = this.checker.getDeclaredTypeOfSymbol(symbol);\n if (!(instanceType.flags & TypeFlags.Object)) return null;\n const targetProp = instanceType.getProperty(this.key);\n if (!targetProp) return null;\n return this.checker.getTypeOfSymbolAtLocation(targetProp, this.locationNode);\n }\n\n if (this.isObjectType(type)) {\n const defineProps = type.getProperty('defineProps');\n if (defineProps) {\n const definePropsType = this.checker.getTypeOfSymbolAtLocation(defineProps, this.locationNode);\n const targetProp = definePropsType.getProperty(this.key);\n if (!targetProp) return null;\n return this.checker.getTypeOfSymbolAtLocation(targetProp, this.locationNode);\n }\n }\n\n return null;\n }\n\n /**\n * Step 2: 处理 midType,提取属性名列表\n * 2.1 midType 是 class → 获取其实例的所有属性名\n * 2.2 midType 是 { defineProps?: T } → 获取 defineProps 的所有属性名\n */\n private extractNamesFromMidType(midType: Type): string[] {\n if (midType.flags & TypeFlags.UnionOrIntersection) {\n const types = (midType as any).types as Type[] | undefined;\n if (types) {\n for (const t of types) {\n const names = this.extractNamesFromMidType(t);\n if (names.length > 0) return names;\n }\n }\n return [];\n }\n\n if (this.isClassType(midType)) {\n const symbol = midType.getSymbol() || midType.aliasSymbol;\n if (!symbol) return [];\n const instanceType = this.checker.getDeclaredTypeOfSymbol(symbol);\n if (!(instanceType.flags & TypeFlags.Object)) return [];\n return this.getStandardProperties(instanceType);\n }\n\n if (this.isObjectType(midType)) {\n const defineProps = midType.getProperty('defineProps');\n if (defineProps) {\n const definePropsType = this.checker.getTypeOfSymbolAtLocation(defineProps, this.locationNode);\n return this.extractNamesFromMidType(definePropsType);\n }\n return this.getStandardProperties(midType);\n }\n\n return [];\n }\n\n /**\n * 判断是否为 Class(构造函数静态类型)\n */\n private isClassType(type: Type): boolean {\n const symbol = type.getSymbol() || type.aliasSymbol;\n if (!symbol) return false;\n return !!(symbol.flags & (SymbolFlags.Class | SymbolFlags.Function));\n }\n\n /**\n * 判断是否为普通对象类型 (Object)\n */\n private isObjectType(type: Type): boolean {\n return !!(type.flags & TypeFlags.Object);\n }\n\n /**\n * 获取类型的所有属性名(排除 prototype 等元属性)\n */\n private getStandardProperties(type: Type): string[] {\n try {\n const props = this.checker.getPropertiesOfType(type);\n return props.map(p => p.name).filter(name => name !== 'prototype');\n } catch {\n return [];\n }\n }\n}\n\n// const p = new Bobe2ts(\n// new IdGenerator(),\n// 0,\n// `\n// input value={he} style='width: 100px;' onclick={Mes}\n// \\${We} abc=1\n// `\n// );\n\n// const res = p.process();\n\n// const { input, output, sourceMap } = res;\n// let verify = sourceMap.map(({ originOffset: inOffset, codeOffset: outOffset, length }) => {\n// return {\n// _in: input.slice(inOffset, inOffset + length),\n// out: output.slice(outOffset, outOffset + length)\n// };\n// });\n// verify = verify.filter(it => it._in !== it.out);\n// console.log(verify);\n","import type * as ts from 'typescript';\nimport { Bobe2ts, BOBE_DOM_PROP_TRANSFER, IdGenerator } from './bobeToTs';\nimport { log } from './global';\nimport {\n Area,\n getClassMembersInClass,\n isBobeIdentifier,\n isBobeTemplate,\n isClass,\n processHandlers,\n Range\n} from './util';\nimport { BuildVDocCtx, IClassNode, Template, VirtualDocumentResult } from './type';\n\ntype TemplatePreInfo = {\n raw: string;\n className: string;\n sf: ts.SourceFile;\n templateStart: number;\n uiName?: string;\n props?: string[];\n typeExp?: string;\n};\n\nexport function findBobeTemplatesInClass(\n classNode: IClassNode,\n tss: typeof ts,\n sourceFile: ts.SourceFile,\n program?: ts.Program\n) {\n const preInfos: TemplatePreInfo[] = [];\n const checker = program?.getTypeChecker();\n function visit(node: ts.Node) {\n if (isBobeTemplate(node, tss)) {\n const template = node.template;\n const typeArg = node.typeArguments?.[0];\n let props: string[] | undefined = undefined,\n parent = node.parent,\n uiName: string | undefined = undefined,\n typeExp: string | undefined = undefined;\n for (let i = 0; i < 5 && parent; i++) {\n const parentIsAssign = tss.isPropertyDeclaration(parent);\n if (parentIsAssign) {\n uiName = parent.name.getText();\n break;\n }\n }\n if (typeArg && checker && uiName) {\n typeExp = typeArg.getText();\n const typeNode = checker.getTypeAtLocation(typeArg);\n const propNodes = checker.getPropertiesOfType(typeNode);\n props = propNodes.map(prop => prop.name);\n }\n const raw = tss.isNoSubstitutionTemplateLiteral(template)\n ? (template.rawText ?? template.text)\n : template.getText().slice(1, -1);\n // 模板内容在源文件中的起始 offset(反引号后第一个字符)\n const templateStart = template.getStart() + 1; // +1 跳过反引号\n preInfos.push({\n raw,\n uiName,\n typeExp,\n props,\n className: classNode.name?.text || '',\n sf: sourceFile,\n templateStart\n });\n } else {\n tss.forEachChild(node, visit);\n }\n }\n visit(classNode);\n return preInfos;\n}\n\nlet c = {} as BuildVDocCtx;\nexport function buildVirtualDocument(\n sourceFile: ts.SourceFile,\n tss: typeof ts,\n program?: ts.Program\n): VirtualDocumentResult {\n const source = sourceFile.text;\n const virtualCode = source + '\\nexport {};\\n' + BOBE_DOM_PROP_TRANSFER;\n const baseVOffset = virtualCode.length;\n c = { tss, program, baseVOffset, virtualCode, templates: [], undoneDocPoint: [] };\n function walk(node: ts.Node) {\n const skip = processHandlers([beginClass, beginTemplate], node);\n if (!skip) tss.forEachChild(node, walk);\n processHandlers([endClass, endTemplate], node);\n }\n walk(sourceFile);\n log('虚拟文件\\n', c.virtualCode);\n const result = { code: c.virtualCode, templates: c.templates, sf: sourceFile };\n c = {} as any;\n return result;\n}\n\nfunction beginClass(node: ts.Node) {\n if (!isClass(node, c.tss)) return;\n c.currentClass = node;\n return 0;\n}\nfunction endClass(node: ts.Node) {\n if (!isClass(node, c.tss)) return;\n c.currentClass = undefined;\n if (c.builtHeadAreas) {\n c.builtHeadAreas = undefined;\n c.idg = undefined;\n c.virtualCode += `}\\n`;\n }\n return;\n}\nfunction beginTemplate(node: ts.Node) {\n if (!c.tss.isTaggedTemplateExpression(node)) return;\n // 非 bobe 模板语法可以直接跳过\n if (!isBobeIdentifier(node, c.tss)) return 1;\n // bobe 模板语法需要为文件末尾添加东西\n // 1. 为 class 添加类型上下文\n const template = { headAreas: [] } as any as Template;\n if (c.currentClass && !c.builtHeadAreas) {\n c.idg = new IdGenerator();\n const { currentClass } = c;\n const className = currentClass.name!.getText();\n\n const area = new Area();\n c.virtualCode += `{\\nconst {`;\n const members = getClassMembersInClass(currentClass, c.tss);\n for (const member of members) {\n const nameText = member.name!.getText();\n const itemStart = c.virtualCode.length;\n c.virtualCode += `${nameText}:${nameText},`;\n const itemEnd = c.virtualCode.length;\n area.addRange(itemStart, itemEnd);\n }\n c.virtualCode += `} = {} as any as ${className};\\n`;\n c.builtHeadAreas = template.headAreas = [area];\n }\n c.virtualCode += '{\\n';\n // 2. 为泛型添加类型上下文\n if (node.typeArguments) {\n const typeArg = node.typeArguments[0];\n const checker = c.program?.getTypeChecker();\n if (checker) {\n const typeNode = checker.getTypeAtLocation(typeArg);\n const typeExp = typeArg.getText();\n const originOffset = typeArg.getFullStart();\n const propNodes = checker.getPropertiesOfType(typeNode);\n /*----------------- 增加类型解构 -----------------*/\n const area = new Area();\n c.virtualCode += `const {`;\n for (const { name } of propNodes) {\n const itemStart = c.virtualCode.length;\n c.virtualCode += `${name}:${name},`;\n const itemEnd = c.virtualCode.length;\n area.addRange(itemStart, itemEnd);\n }\n\n c.virtualCode += `} = {} as any as `;\n const codeOffset = c.virtualCode.length;\n /*----------------- 记录类型位置的映射 -----------------*/\n c.virtualCode += typeExp;\n template.headTemplate = area;\n template.typeMap = {\n originOffset,\n codeOffset,\n length: typeExp.length\n };\n c.virtualCode += `;\\n`;\n }\n }\n if (!c.tss.isNoSubstitutionTemplateLiteral(node.template)) {\n const insArr = Array.from(node.template.templateSpans);\n c.tempStaticIns = insArr[Symbol.iterator]();\n }\n // 3. 构建虚拟文档\n const templateStart = node.template.getFullStart() + 1;\n const virtualStart = c.virtualCode.length;\n const raw = node.template.getText().slice(1, -1);\n const { output, sourceMap, errors } = new Bobe2ts(c, template, templateStart, virtualStart, raw).process();\n c.virtualCode += output + `}\\n`;\n template.sourceMap = sourceMap;\n template.errors = errors;\n template.templateStart = templateStart;\n template.virtualStart = virtualStart;\n c.templates.push(template);\n return 1;\n}\nfunction endTemplate(node: ts.Node) {\n if (!isBobeTemplate(node, c.tss)) return;\n return;\n}\n"],"names":["cache","memo"],"mappings":"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"}
1
+ {"version":3,"file":"bobe-language-core.esm.js","sources":["../src/global.ts","../src/util.ts","../src/bobeToTs.ts","../src/buildVirtualDocument.ts"],"sourcesContent":["export const G: Record<any, any> = {};\n\nexport function log(...args: (string | number)[]) {\n G.log?.info?.(args.join(' '));\n}\n\nexport const Virtual_File_Suffix = '__bobe_virtual_file__';\n\nexport const Virtual_File_Exp = /__bobe_virtual_file__/;\n","import type * as ts from 'typescript';\nimport { Virtual_File_Exp, Virtual_File_Suffix } from './global';\nimport { AbsMap, BobeTemplateInfo, HeadMap, IClassNode, Template } from './type';\nimport type { SourceLocation } from 'bobe';\n\nexport class LRUCache<K = string, V = any> {\n private maxSize: number;\n private cache: Map<K, V> = new Map();\n\n constructor(maxSize: number) {\n this.maxSize = maxSize;\n }\n\n get(key: K): V | undefined {\n if (!this.cache.has(key)) {\n return undefined; // 如果缓存中没有该键,返回 -1\n }\n\n // 将该键值对移动到 Map 的末尾,表示它是最近使用的\n const value = this.cache.get(key)!;\n this.cache.delete(key); // 先删除\n this.cache.set(key, value); // 再插入到末尾\n return value;\n }\n\n set(key: K, value: V): void {\n if (this.cache.has(key)) {\n // 更新已有的键值对,并将其移动到末尾\n this.cache.delete(key);\n this.cache.set(key, value);\n } else {\n // 如果缓存已满,移除最久未使用的元素\n if (this.cache.size >= this.maxSize) {\n // Map 会保持插入顺序,删除最前面的键值对\n this.cache.delete(this.cache.keys().next().value!);\n }\n this.cache.set(key, value);\n }\n }\n\n // 新增 has 方法,检查某个键是否在缓存中\n has = this.cache.has.bind(this.cache) as typeof this.cache.has;\n\n delete = this.cache.delete.bind(this.cache) as typeof this.cache.delete;\n}\nexport type SingleArgFn = (v: any) => any;\n\nconst cache = new LRUCache<any, any>(1000);\nexport function memo<T extends SingleArgFn>(fn: T): T {\n const wrap = (v: Parameters<T>) => {\n const res = fn(v);\n cache.set(v, res);\n return res;\n };\n return wrap as T;\n}\n\nexport function createMemo() {\n const cache = new LRUCache<any, any>(1000);\n return function memo<T extends SingleArgFn>(fn: T): T {\n const wrap = (v: Parameters<T>) => {\n const res = fn(v);\n cache.set(v, res);\n return res;\n };\n return wrap as T;\n };\n}\n\nexport function uniqBy<T>(arr: T[], keyFn: (item: T) => any): T[] {\n const seen = new Set();\n return arr.filter(item => {\n const key = keyFn(item);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nexport function getVirtualName(fileName: string) {\n const dotI = fileName.lastIndexOf('.');\n const rawName = fileName.slice(0, dotI);\n const suffix = fileName.slice(dotI);\n return rawName + Virtual_File_Suffix + suffix;\n}\n\nexport function getRealName(virtualFileName: string) {\n return virtualFileName.replace(Virtual_File_Exp, '');\n}\n\nexport function isVirtualFile(fileName: string) {\n return fileName.match(Virtual_File_Exp);\n}\n\n/**\n * s1 e1\n * 0 1\n * 1 2\n * s2 e2\n */\nexport function isOverlap(start1: number, end1: number, start2: number, end2: number) {\n return start1 < end2 && start2 < end1;\n}\n\n/** 判断在 {} 内 */\nexport function inInsBrace(content: string, targetIndex: number): boolean {\n let stack: ('block' | 'expression')[] = [];\n\n for (let i = 0; i < content.length; i++) {\n // 在检查状态之前,先判断是否到达了目标索引\n if (i === targetIndex) {\n // 判断标准:\n // 1. 栈不为空(表示在某类括号内)\n // 2. 栈顶必须是 'block',不能是 'expression'\n return stack.length > 0 && stack[stack.length - 1] === 'block';\n }\n\n const char = content[i];\n const nextChar = content[i + 1];\n\n // 1. 识别 ${\n if (char === '$' && nextChar === '{') {\n stack.push('expression');\n i++; // 跳过 '{',避免下次循环重复处理\n continue;\n }\n\n // 2. 识别普通的 {\n if (char === '{') {\n stack.push('block');\n continue;\n }\n\n // 3. 识别 }\n if (char === '}') {\n stack.pop();\n continue;\n }\n }\n\n return false;\n}\n\nexport function isBobeIdentifier(node: ts.TaggedTemplateExpression, tss: typeof ts): boolean {\n return tss.isIdentifier(node.tag) && node.tag.text === 'bobe';\n}\n\nexport function isBobeTemplate(node: ts.Node, tss: typeof ts): node is ts.TaggedTemplateExpression {\n return tss.isTaggedTemplateExpression(node) && isBobeIdentifier(node, tss);\n}\n\nexport function sfHasBobeTemplate(sf: ts.SourceFile, tss: typeof ts) {\n let hasBobe = false;\n function visit(node: ts.Node) {\n if (hasBobe) {\n return;\n }\n if (isBobeTemplate(node, tss)) {\n hasBobe = true;\n } else {\n tss.forEachChild(node, visit);\n }\n }\n visit(sf);\n return hasBobe;\n}\n\nexport const strHasBobeTemplate = (str: string) => str.match(/bobe(?:\\\\s*(<)([^`]*)(>))?`/);\n\n/** 获取当前节点最近的类名 */\nexport function findPrecedingClassNode(\n targetNode: ts.Node,\n sourceFile: ts.SourceFile,\n tss: typeof ts\n): IClassNode | undefined {\n let result: IClassNode | undefined,\n alreadyCrossTargetNode = false;\n function visit(node: ts.Node) {\n if (node.pos >= targetNode.pos || alreadyCrossTargetNode || result) {\n return (alreadyCrossTargetNode = true);\n }\n if (isClass(node, tss) && node.name && contains(node, targetNode)) {\n result = node;\n }\n tss.forEachChild(node, visit);\n }\n visit(sourceFile);\n return result;\n}\n\nexport function findPrecedingBobeTemplate(targetNode: ts.Node, classNode: ts.Node, tss: typeof ts) {\n let result: ts.TaggedTemplateExpression | undefined;\n function visit(node: ts.Node) {\n if (node.pos >= targetNode.pos) return;\n if (isBobeTemplate(node, tss)) {\n result = node;\n }\n tss.forEachChild(node, visit);\n }\n visit(classNode);\n return result;\n}\n\nexport function getClassMembersInClass(classNode: IClassNode, tss: typeof ts) {\n const names: ts.ClassElement[] = [];\n for (const member of classNode.members) {\n if (isClassProp(member, tss)) {\n names.push(member);\n }\n }\n return names;\n}\n\n/** 根据类名获取成员名称列表 */\nexport function getClassMemberNames(className: string, rangeNode: ts.Node, tss: typeof ts): ts.ClassElement[] {\n const names: ts.ClassElement[] = [];\n function visit(node: ts.Node) {\n if (isClass(node, tss) && node.name?.text === className) {\n for (const member of node.members) {\n if (isClassProp(member, tss)) {\n names.push(member);\n }\n }\n return;\n }\n tss.forEachChild(node, visit);\n }\n visit(rangeNode);\n return names;\n}\n\nexport function calcAbsSourceMap(cursorOffset: number, templates: Template[], isVirtualCursor = false) {\n const compareKey = isVirtualCursor ? 'codeOffset' : 'originOffset';\n const startKey = isVirtualCursor ? 'virtualStart' : 'templateStart';\n for (let i = templates.length; i--; ) {\n const template = templates[i];\n if (template[startKey] < cursorOffset) {\n for (const map of template.sourceMap) {\n if (cursorOffset >= map[compareKey] && cursorOffset <= map[compareKey] + map.length) {\n const { codeOffset: virtualStart, originOffset: originStart, length } = map;\n const dt = cursorOffset - map[compareKey];\n return {\n virtualStart,\n originStart,\n virtualOffset: virtualStart + dt,\n originOffset: originStart + dt,\n length\n };\n }\n }\n }\n }\n}\n\nexport function inWitchVirtualPart(absCursorOffset: number, templates: Template[]) {\n for (const template of templates) {\n const range = template.headTemplate?.findRange(absCursorOffset);\n // 属于模板 head 解构区\n if (range) {\n return { template, part: 'headTemplate', range };\n } else {\n for (const area of template?.headAreas || []) {\n const found = area.findRange(absCursorOffset);\n if (found) {\n return { template, part: 'headClass', range: found };\n }\n }\n }\n }\n return { template: undefined, part: undefined, range: undefined };\n}\n\n/** 计算的是 IIFE 中 解构的 所有类成员的 映射*/\nexport function calcHeadSourceMap(absCursorOffset: number, templates: BobeTemplateInfo[]) {\n let virtualStart: number | undefined;\n let originStart: number, length: number;\n for (const tmpl of templates) {\n if (!inVirtualHead(tmpl.headMap, { start: absCursorOffset } as any, tmpl)) continue;\n const cursorOffset = absCursorOffset - tmpl.iifeStartInVirtual!;\n for (const entry of tmpl.headMap) {\n if (cursorOffset >= entry.codeOffset && cursorOffset <= entry.codeOffset + entry.length) {\n virtualStart = tmpl.iifeStartInVirtual! + entry.codeOffset;\n originStart = entry.originOffset;\n const dt = cursorOffset - entry.codeOffset;\n length = entry.length;\n return {\n virtualStart,\n originStart,\n virtualOffset: virtualStart + dt,\n originOffset: originStart + dt,\n length\n };\n }\n }\n }\n}\n\n/**\n * 1. 插值表达式中的 js 标识符 如 tag prop={ a ? foo : bar } 中的 bar\n * 2. 完整的标识符,如 tag prop=xxx 中的 prop\n */\nexport function fixTextSpan(textSpan: ts.TextSpan, code: string, map: AbsMap) {\n const originalCode = code.slice(map.originStart, map.originStart + map.length);\n /** 当内容为 js 标识符 且 textSpan 是插值表达式中的一部分时\n * span.start ~ virtualOffset 和\n * targetStart ~ originOffset 是相同的\n * 因此 targetStart = originOffset - (virtualOffset - span.start)\n */\n if (textSpan.length < map.length && !originalCode.match(domPropertyExp)) {\n const { start, length } = textSpan;\n const targetStart = map.originOffset - (map.virtualOffset - start);\n return { start: targetStart, length };\n }\n\n // 其余情况直接返回完整的原始标识符\n return { start: map.originStart, length: map.length };\n}\n\nexport function getPosTemplateCtx(\n info: ts.server.PluginCreateInfo,\n tss: typeof ts,\n fileName: string,\n position: number\n) {\n const sf = info.languageService.getProgram()?.getSourceFile(fileName);\n if (!sf) return null;\n const node = findNodeAtPosition(tss, sf, position);\n if (!node) return null;\n const templateNode = getValidBobeTemplateNode(tss, node);\n if (!templateNode || position <= templateNode.pos) return null;\n const baseOffset = templateNode.getStart() + 1;\n const ctx = makeContext(templateNode, sf, fileName, baseOffset);\n const relPos = getRelativePosition(info, baseOffset, fileName, position); // 这里找到了相对第二个模板的开始位置\n return { ctx, relPos: relPos as SourceLocation['start'] };\n}\n\nexport function getSourceFileAndNode(\n info: ts.server.PluginCreateInfo,\n tss: typeof ts,\n fileName: string,\n position: number\n) {\n const sf = info.languageService.getProgram()?.getSourceFile(fileName);\n if (!sf) return null;\n const node = findNodeAtPosition(tss, sf, position);\n if (!node) return null;\n return { sf, node };\n}\n\n// 判断节点是否属于 bobe 标签模板,返回模板字面量节点\nexport function getValidBobeTemplateNode(tss: typeof ts, node: ts.Node): ts.TemplateLiteral | undefined {\n switch (node.kind) {\n case tss.SyntaxKind.TaggedTemplateExpression: {\n const t = node as ts.TaggedTemplateExpression;\n return isBobeIdentifier(t, tss) ? t.template : undefined;\n }\n case tss.SyntaxKind.NoSubstitutionTemplateLiteral: {\n const p = node.parent;\n return p && isBobeTemplate(p, tss) ? (node as ts.NoSubstitutionTemplateLiteral) : undefined;\n }\n case tss.SyntaxKind.TemplateHead:\n return node.parent?.parent ? getValidBobeTemplateNode(tss, node.parent.parent) : undefined;\n case tss.SyntaxKind.TemplateMiddle:\n case tss.SyntaxKind.TemplateTail:\n return node.parent?.parent?.parent ? getValidBobeTemplateNode(tss, node.parent.parent.parent) : undefined;\n default:\n return undefined;\n }\n}\n\n/** 将文件绝对 offset 转换为相对模板开头 ` 的偏移量 */\nexport function getRelativePosition(\n info: ts.server.PluginCreateInfo,\n baseOffset: number,\n fileName: string,\n position: number\n): SourceLocation['start'] {\n const scriptInfo = info.project.getScriptInfo(fileName);\n if (!scriptInfo) return { line: 0, column: 0, offset: position - baseOffset };\n const baseLoc = scriptInfo.positionToLineOffset(baseOffset); // 1-based\n const cursorLoc = scriptInfo.positionToLineOffset(position);\n const bl = baseLoc.line - 1,\n bc = baseLoc.offset - 1;\n const cl = cursorLoc.line - 1,\n cc = cursorLoc.offset - 1;\n return { line: cl - bl, column: cl === bl ? cc - bc : cc, offset: position - baseOffset };\n}\n\n// 构造最小 context 对象(BobeTemplateService 只用 node、fileName、text)\nexport function makeContext(templateNode: ts.TemplateLiteral, sf: ts.SourceFile, fileName: string, baseOffset: number) {\n return { node: templateNode, fileName, text: templateNode.getText().slice(1, -1), sf, baseOffset };\n}\n\n// 在 AST 中找到 position 处最深的节点\nexport function findNodeAtPosition(tss: typeof ts, sf: ts.SourceFile, position: number): ts.Node | undefined {\n function find(node: ts.Node): ts.Node | undefined {\n if (position >= node.getStart() && position < node.getEnd()) {\n return tss.forEachChild(node, find) || node;\n }\n return undefined;\n }\n return find(sf);\n}\n\n/** 当前位置是bobe 模板的类型声明,找一下在虚拟文件对应的位置 */\nexport function findTemplateTypePos(templates: Template[], pos: number) {\n for (const tmpl of templates) {\n const { typeMap } = tmpl;\n if (!typeMap) continue;\n const { originOffset, codeOffset, length } = typeMap;\n if (originOffset <= pos && pos < originOffset + length) {\n const dt = pos - originOffset;\n return {\n virtualStart: codeOffset,\n originStart: originOffset,\n virtualOffset: codeOffset + dt,\n originOffset: originOffset + dt,\n length\n };\n }\n }\n}\n\nexport const domPropertyExp = /^[a-zA-Z][\\w-]*$/;\n\nexport const AND = `__BOBE_AND_${Date.now().toString(36)}__`;\n\nexport function isClassProp(node: ts.Node, tss: typeof ts) {\n return tss.isPropertyDeclaration(node) || (tss.isMethodDeclaration(node) && tss.isIdentifier(node.name));\n}\n\nexport function isClass(node: ts.Node, tss: typeof ts) {\n return tss.isClassDeclaration(node) || tss.isClassExpression(node);\n}\n\nexport function* getSharedItems<A, B>(\n arr1: A[],\n arr2: B[],\n isEqual: (a: A, b: B) => boolean,\n isBigger: (a: A, b: B) => boolean\n) {\n const it1 = arr1[Symbol.iterator]();\n const it2 = arr2[Symbol.iterator]();\n\n let res1 = it1.next();\n let res2 = it2.next();\n\n while (!res1.done && !res2.done) {\n const v1 = res1.value;\n const v2 = res2.value;\n\n // 始终保持 v1 在前,v2 在后\n if (isEqual(v1, v2)) {\n yield [v1, v2] as const; // 或者根据需求 yield { v1, v2 }\n res1 = it1.next();\n res2 = it2.next();\n } else if (isBigger(v1, v2)) {\n // v1 > v2: 因为是递增数组,说明 v2 太小了,需要移动 arr2 的指针\n res2 = it2.next();\n } else {\n // v1 < v2: 说明 v1 太小了,移动 arr1 的指针\n res1 = it1.next();\n }\n }\n}\n\nexport const inVirtualPart = (sf: ts.SourceFile, textSpan: ts.TextSpan) => textSpan.start > sf.getFullWidth();\nexport const inVirtualHead = (headMap: HeadMap, textSpan: ts.TextSpan, tmpl: BobeTemplateInfo) =>\n tmpl.iifeStartInVirtual! + headMap.range![0] <= textSpan.start &&\n textSpan.start < tmpl.iifeStartInVirtual! + headMap.range![1];\n\nexport const contains = (parent: ts.Node, child: ts.Node): boolean =>\n // parent.pos 是包含注释和空白的起始位置\n // parent.getStart() 是代码实际开始的位置\n child.getStart() >= parent.getStart() && child.getEnd() <= parent.getEnd();\n\nexport const processHandlers = (fns: ((node: ts.Node) => number | null | void)[], node: ts.Node) => {\n for (const handler of fns) {\n const shouldSkip = handler(node);\n if (shouldSkip != null) {\n // 1是跳过,0继续\n return shouldSkip as unknown as boolean;\n }\n }\n // 默认不跳过\n return 0;\n};\n\nexport class Range {\n constructor(\n public start: number,\n public end: number\n ) {}\n contains(pos: number) {\n return this.start <= pos && pos < this.end;\n }\n}\n\nexport class Area {\n ranges: Range[] = [];\n\n get start() {\n return this.ranges[0]?.start || -1;\n }\n\n get end() {\n return this.ranges[this.ranges.length - 1]?.end || -1;\n }\n\n findRange(pos: number) {\n if (!Range.prototype.contains.call(this, pos)) {\n return;\n }\n for (const range of this.ranges) {\n if (range.contains(pos)) {\n return range;\n }\n }\n }\n\n addRange(start: number, end: number) {\n this.ranges.push(new Range(start, end));\n }\n}\n","import { Compiler, Tokenizer, NodeType } from 'bobe/compiler';\nimport type {\n ElementNode,\n ComponentNode,\n LoopNode,\n ConditionalNode,\n Property,\n TemplateNode,\n DynamicValue,\n StaticValue,\n InterpolationNode,\n PropertyValue\n} from 'bobe';\nimport { log } from './global';\nimport { BuildVDocCtx, SourceMapEntry, Template } from './type';\nimport type * as ts from 'typescript';\nimport type { TemplateSpan, Program, Type, TypeChecker, Node } from 'typescript';\nimport { Area } from './util';\n\nexport interface BobeToTsResult {\n output: string;\n input: string;\n sourceMap: SourceMapEntry[];\n}\n\nclass Dent {\n stack: number[];\n constructor(public base: number) {\n this.stack = [base];\n }\n get v() {\n const length = this.stack[this.stack.length - 1];\n return new Array(length).fill(' ').join('');\n }\n indent() {\n const length = this.stack[this.stack.length - 1];\n this.stack.push(length + 2);\n }\n dedent() {\n this.stack.pop();\n }\n}\n\nconst BRACE_REG = /(^\\$\\{)|(^\\{)|(\\}$)/g;\nexport const BOBE_PREFIX = '$Bobe' + Date.now().toString(36);\nexport const BOBE_DOM_PROP_TRANSFER = `type ${BOBE_PREFIX}ToMap<K extends string, T> = {\n [P in K]?: T;\n};\ntype ${BOBE_PREFIX}BooleanProps = ${BOBE_PREFIX}ToMap<\n 'disabled' | 'checked' | 'selected' | 'readonly' | 'required' | \n 'multiple' | 'hidden' | 'autofocus' | 'novalidate' | 'ismap' | \n 'open' | 'reversed' | 'indeterminate', \n boolean|string|undefined|null\n>;\ntype ${BOBE_PREFIX}NumericProps = ${BOBE_PREFIX}ToMap<\n 'style'|'value' | 'placeholder' | 'title' | 'alt' | 'width' | 'height' | 'columnCount' | 'tabIndex' | 'maxLength' | \n 'minLength' | 'size' | 'rows' | 'cols' | 'span' | 'start' | \n 'valueAsNumber' | 'max' | 'min' | 'step', \n string|number|undefined|null\n>;\ntype ${BOBE_PREFIX}NativeProperties = ${BOBE_PREFIX}BooleanProps & ${BOBE_PREFIX}NumericProps;\ntype ${BOBE_PREFIX}CreateTextOrComponent = {\n <T>(a: {defineProps?: T} & Record<any, any>): T;\n <T extends new (...args: any[]) =>any>(input: T): InstanceType<T>;\n (input: any): Text;\n};\nlet ${BOBE_PREFIX}_h!:<K extends keyof HTMLElementTagNameMap>(\n tag: K, \n options?: ElementCreationOptions\n) => Omit<HTMLElementTagNameMap[K], keyof ${BOBE_PREFIX}NativeProperties |'textContent' > & { text: string|number|undefined|null } & ${BOBE_PREFIX}NativeProperties & Record<string, any>;\nlet ${BOBE_PREFIX}_t!: ${BOBE_PREFIX}CreateTextOrComponent;\n`;\n\nexport class Bobe2ts {\n tokenizer: Tokenizer;\n compiler: Compiler;\n res: BobeToTsResult = {\n output: '',\n input: '',\n sourceMap: []\n };\n map(\n /** 在模板字符串中的起始 offset(相对于模板内容开头,0-based) */\n templateOffset: number,\n /** 在生成的 bobeToTs code 字符串中的起始 offset */\n codeOffset: number,\n /** 表达式的字符长度 */\n length: number\n ) {\n const item: SourceMapEntry = {\n originOffset: this.templateStart + templateOffset,\n codeOffset: this.virtualStart + codeOffset,\n length\n };\n this.res.sourceMap.push(item);\n return item;\n }\n dent = new Dent(2);\n lines: string[] = [];\n output = ``;\n nextInsExp() {\n const nextData = this.c.tempStaticIns?.next();\n return nextData?.value;\n }\n\n public idg: IdGenerator;\n public program?: Program;\n constructor(\n public c: BuildVDocCtx,\n public template: Template,\n public templateStart: number,\n public virtualStart: number,\n public templateCode: string\n ) {\n this.idg = c.idg || new IdGenerator();\n this.program = c.program;\n const tokenizer = (this.tokenizer = new Tokenizer(() => undefined, false));\n tokenizer.setCode(templateCode);\n const compiler = (this.compiler = new Compiler(tokenizer, {\n parsePropertyInlineFragment: {\n enter: node => {\n const prop = node!.parent! as Property & { inlineName: string };\n const component = prop.parent! as ComponentNode;\n const { varName: cmpInsName, templateSpan } = component.componentName as PropertyValue & {\n varName: string;\n templateSpan?: TemplateSpan;\n };\n const key = prop.key.key;\n const inlineName = this.idg.name;\n this.idg.i++;\n prop.inlineName = inlineName;\n this.output += `let ${inlineName}=(`;\n const rightBrace = `}: NonNullable<NonNullable<(typeof ${cmpInsName})['${key}']>['defineProps']>) => {\\n`;\n\n if (templateSpan && this.program) {\n const area = new Area();\n this.output += '{';\n const checker = this.program.getTypeChecker();\n const gotType = checker.getTypeAtLocation(templateSpan.expression);\n\n const exec = new PropertyExtractor(checker, key, templateSpan.expression, this.c.tss);\n const names = exec.extractPropertyNames(gotType);\n for (const name of names) {\n const start = this.output.length;\n this.output += `${name}:${name},`;\n area.addRange(this.virtualStart + start, this.virtualStart + this.output.length);\n }\n this.output += rightBrace;\n this.template.headAreas!.push(area);\n } else {\n this.c.undoneDocPoint.push(this.output.length);\n this.output += `{${rightBrace}`;\n }\n },\n leave: () => {\n this.output += `};\\n`;\n }\n },\n parseElementNode: {\n propsAdded: node => {\n const _node = node!;\n const tagName = _node.tagName;\n const varName = this.idg.name;\n this.output += `${this.dent.v}let ${varName}=${BOBE_PREFIX}_h('`;\n this.map(this.off(_node), this.output.length, tagName.length);\n this.output += `${tagName}');`;\n this.createSetPropsExp(_node.props, varName);\n this.output += `\\n`;\n this.idg.i++;\n }\n },\n parseName: {\n leave: node => {\n const varName = this.idg.name;\n this.idg.i++;\n const name = node! as PropertyValue & { varName: string; templateSpan: TemplateSpan };\n name.varName = varName;\n const source = name.loc!.source!;\n const sourceName = source.replace(BRACE_REG, match => {\n if (match.length === 1) return ' ';\n return ' ';\n });\n this.output += `${this.dent.v}let ${varName}=${BOBE_PREFIX}_t(`;\n const map = this.map(this.off(name), this.output.length, source.length);\n this.output += `${sourceName});\\n`;\n if(name.type !== NodeType.StaticValue) {\n return;\n }\n let ins: TemplateSpan | undefined;\n while ((ins = this.nextInsExp()) != null) {\n const insStart = ins.getFullStart();\n if (insStart > map.originOffset) {\n if (insStart < map.originOffset + map.length) {\n name.templateSpan = ins;\n }\n break;\n }\n }\n }\n },\n parseComponentNode: {\n propsAdded: node => {\n const _node = node!;\n const name = _node.componentName! as PropertyValue & { varName: string };\n this.createSetPropsExp(_node.props, name.varName);\n this.output += `\\n`;\n }\n },\n parseConditionalNode: {\n propsAdded: node => {\n const _node = node!;\n const cond = _node.condition;\n const condVal = cond.loc!.source;\n const ifHeadS = `${this.dent.v}if(`;\n this.output += ifHeadS;\n this.map(this.off(cond), this.output.length, condVal.length);\n this.output += condVal + `){\\n`;\n this.dent.indent();\n },\n leave: node => {\n this.dent.dedent();\n this.output += `${this.dent.v}}\\n`;\n }\n },\n parseLoopNode: {\n propsAdded: node => {\n const _node = node!;\n this.output += `${this.dent.v}`;\n const { collection: arr, item, index, key } = _node;\n this.map(this.off(arr), this.output.length, arr.loc!.source!.length);\n this.output += arr.loc!.source + '.forEach((';\n this.map(this.off(item), this.output.length, item.loc!.source!.length);\n this.output += item.loc!.source;\n if (index) {\n this.output += ',';\n this.map(this.off(index), this.output.length, index.loc!.source!.length);\n this.output += index.loc!.source;\n }\n this.output += `)=>{`;\n if (key) {\n this.output += `let ${this.idg.k}=`;\n this.map(this.off(key), this.output.length, key.loc!.source!.length);\n this.output += key.loc!.source + ';';\n }\n this.output += '\\n';\n\n this.dent.indent();\n },\n leave: node => {\n this.dent.dedent();\n this.output += `${this.dent.v}});\\n`;\n }\n }\n }));\n }\n off(n: { loc?: any }) {\n return n.loc!.start.offset - 1;\n }\n createSetPropsExp = (props: Property[], name: string) => {\n const nameDot = `${name}.`;\n props.forEach(_prop => {\n const prop = _prop as Property & { inlineName: string };\n const loc = prop.key.loc!;\n let { source: key } = loc;\n this.map(this.off(prop.key), this.output.length + nameDot.length, key.length);\n let replaceCount = 0;\n key = key.replace(/\\-(\\w)/g, (_, match) => {\n const res = match.toUpperCase();\n replaceCount++;\n return res;\n });\n key = key + new Array(replaceCount).fill(' ').join('');\n const assignLeft = `${nameDot}${key}=`;\n this.output += assignLeft;\n if (!prop.value) {\n this.output += 'null;';\n return;\n }\n // 是文档片段\n if (prop.inlineName) {\n this.output += `${prop.inlineName} as any;`;\n return;\n }\n\n let { source: value } = prop.value.loc!;\n if (prop.value.type === NodeType.DynamicValue) {\n // 替换成空格\n value = value.replace(BRACE_REG, ' ');\n }\n\n this.map(this.off(prop.value), this.output.length, value.length);\n this.output += value + ';';\n });\n };\n\n process() {\n this.compiler.parseProgram();\n // log('output', this.output);\n // log('errors', this.compiler.errors.map(e => e.message).join('\\n'));\n return {\n output: this.output,\n input: this.templateCode,\n sourceMap: this.res.sourceMap,\n errors: this.compiler.errors\n };\n }\n}\n\nexport class IdGenerator {\n id = Date.now().toString(36);\n i = 0;\n get name() {\n return `${BOBE_PREFIX}_var_${this.id}_${this.i}`;\n }\n get h() {\n return `h_${this.id}`;\n }\n get t() {\n return `t_${this.id}`;\n }\n get k() {\n return `${BOBE_PREFIX}_for_key_${this.id}`;\n }\n}\n\nexport class PropertyExtractor {\n constructor(private checker: TypeChecker, private key: string, private locationNode: Node, private tss: typeof ts) {}\n\n /**\n * 主入口:两步提取属性名\n * 1. 解析 midType(通过 key 从原始类型中获取)\n * 2. 从 midType 中提取属性名列表\n * 中间任何一步不符合正向逻辑时返回空数组\n */\n public extractPropertyNames(type: Type): string[] {\n if (!type || (type as any).intrinsicName === 'error') {\n return [];\n }\n\n const midType = this.resolveMidType(type);\n if (!midType) return [];\n const midTStr = this.checker.typeToString(midType);\n log('midType:', midTStr);\n\n return this.extractNamesFromMidType(midType);\n }\n\n /**\n * Step 1: 获取传入类型对应实例属性的 key 的类型 (midType)\n * 1.1 classType 是类 → 获取实例类型 → 获取 instance.key 的类型\n * 1.2 classType 是 { defineProps?: T } → 获取 defineProps.key 的类型\n */\n private resolveMidType(type: Type): Type | null {\n if (this.isClassType(type)) {\n const symbol = type.getSymbol() || type.aliasSymbol;\n if (!symbol) return null;\n const instanceType = this.checker.getDeclaredTypeOfSymbol(symbol);\n if (!(instanceType.flags & this.tss.TypeFlags.Object)) return null;\n const targetProp = instanceType.getProperty(this.key);\n if (!targetProp) return null;\n return this.checker.getTypeOfSymbolAtLocation(targetProp, this.locationNode);\n }\n\n if (this.isObjectType(type)) {\n const defineProps = type.getProperty('defineProps');\n if (defineProps) {\n const definePropsType = this.checker.getTypeOfSymbolAtLocation(defineProps, this.locationNode);\n const targetProp = definePropsType.getProperty(this.key);\n if (!targetProp) return null;\n return this.checker.getTypeOfSymbolAtLocation(targetProp, this.locationNode);\n }\n }\n\n return null;\n }\n\n /**\n * Step 2: 处理 midType,提取属性名列表\n * 2.1 midType 是 class → 获取其实例的所有属性名\n * 2.2 midType 是 { defineProps?: T } → 获取 defineProps 的所有属性名\n */\n private extractNamesFromMidType(midType: Type): string[] {\n if (midType.flags & this.tss.TypeFlags.UnionOrIntersection) {\n const types = (midType as any).types as Type[] | undefined;\n if (types) {\n for (const t of types) {\n const names = this.extractNamesFromMidType(t);\n if (names.length > 0) return names;\n }\n }\n return [];\n }\n\n if (this.isClassType(midType)) {\n const symbol = midType.getSymbol() || midType.aliasSymbol;\n if (!symbol) return [];\n const instanceType = this.checker.getDeclaredTypeOfSymbol(symbol);\n if (!(instanceType.flags & this.tss.TypeFlags.Object)) return [];\n return this.getStandardProperties(instanceType);\n }\n\n if (this.isObjectType(midType)) {\n const defineProps = midType.getProperty('defineProps');\n if (defineProps) {\n const definePropsType = this.checker.getTypeOfSymbolAtLocation(defineProps, this.locationNode);\n return this.extractNamesFromMidType(definePropsType);\n }\n return this.getStandardProperties(midType);\n }\n\n return [];\n }\n\n /**\n * 判断是否为 Class(构造函数静态类型)\n */\n private isClassType(type: Type): boolean {\n const symbol = type.getSymbol() || type.aliasSymbol;\n if (!symbol) return false;\n return !!(symbol.flags & (this.tss.SymbolFlags.Class | this.tss.SymbolFlags.Function));\n }\n\n /**\n * 判断是否为普通对象类型 (Object)\n */\n private isObjectType(type: Type): boolean {\n return !!(type.flags & this.tss.TypeFlags.Object);\n }\n\n /**\n * 获取类型的所有属性名(排除 prototype 等元属性)\n */\n private getStandardProperties(type: Type): string[] {\n try {\n const props = this.checker.getPropertiesOfType(type);\n return props.map(p => p.name).filter(name => name !== 'prototype');\n } catch {\n return [];\n }\n }\n}\n\n// const p = new Bobe2ts(\n// new IdGenerator(),\n// 0,\n// `\n// input value={he} style='width: 100px;' onclick={Mes}\n// \\${We} abc=1\n// `\n// );\n\n// const res = p.process();\n\n// const { input, output, sourceMap } = res;\n// let verify = sourceMap.map(({ originOffset: inOffset, codeOffset: outOffset, length }) => {\n// return {\n// _in: input.slice(inOffset, inOffset + length),\n// out: output.slice(outOffset, outOffset + length)\n// };\n// });\n// verify = verify.filter(it => it._in !== it.out);\n// console.log(verify);\n","import type * as ts from 'typescript';\nimport { Bobe2ts, BOBE_DOM_PROP_TRANSFER, IdGenerator } from './bobeToTs';\nimport { log } from './global';\nimport {\n Area,\n getClassMembersInClass,\n isBobeIdentifier,\n isBobeTemplate,\n isClass,\n processHandlers,\n Range\n} from './util';\nimport { BuildVDocCtx, IClassNode, Template, VirtualDocumentResult } from './type';\n\ntype TemplatePreInfo = {\n raw: string;\n className: string;\n sf: ts.SourceFile;\n templateStart: number;\n uiName?: string;\n props?: string[];\n typeExp?: string;\n};\n\nexport function findBobeTemplatesInClass(\n classNode: IClassNode,\n tss: typeof ts,\n sourceFile: ts.SourceFile,\n program?: ts.Program\n) {\n const preInfos: TemplatePreInfo[] = [];\n const checker = program?.getTypeChecker();\n function visit(node: ts.Node) {\n if (isBobeTemplate(node, tss)) {\n const template = node.template;\n const typeArg = node.typeArguments?.[0];\n let props: string[] | undefined = undefined,\n parent = node.parent,\n uiName: string | undefined = undefined,\n typeExp: string | undefined = undefined;\n for (let i = 0; i < 5 && parent; i++) {\n const parentIsAssign = tss.isPropertyDeclaration(parent);\n if (parentIsAssign) {\n uiName = parent.name.getText();\n break;\n }\n }\n if (typeArg && checker && uiName) {\n typeExp = typeArg.getText();\n const typeNode = checker.getTypeAtLocation(typeArg);\n const propNodes = checker.getPropertiesOfType(typeNode);\n props = propNodes.map(prop => prop.name);\n }\n const raw = tss.isNoSubstitutionTemplateLiteral(template)\n ? (template.rawText ?? template.text)\n : template.getText().slice(1, -1);\n // 模板内容在源文件中的起始 offset(反引号后第一个字符)\n const templateStart = template.getStart() + 1; // +1 跳过反引号\n preInfos.push({\n raw,\n uiName,\n typeExp,\n props,\n className: classNode.name?.text || '',\n sf: sourceFile,\n templateStart\n });\n } else {\n tss.forEachChild(node, visit);\n }\n }\n visit(classNode);\n return preInfos;\n}\n\nlet c = {} as BuildVDocCtx;\nexport function buildVirtualDocument(\n sourceFile: ts.SourceFile,\n tss: typeof ts,\n program?: ts.Program\n): VirtualDocumentResult {\n const source = sourceFile.text;\n const virtualCode = source + '\\nexport {};\\n' + BOBE_DOM_PROP_TRANSFER;\n const baseVOffset = virtualCode.length;\n c = { tss, program, baseVOffset, virtualCode, templates: [], undoneDocPoint: [] };\n function walk(node: ts.Node) {\n const skip = processHandlers([beginClass, beginTemplate], node);\n if (!skip) tss.forEachChild(node, walk);\n processHandlers([endClass, endTemplate], node);\n }\n walk(sourceFile);\n log('虚拟文件\\n', c.virtualCode);\n const result = { code: c.virtualCode, templates: c.templates, sf: sourceFile };\n c = {} as any;\n return result;\n}\n\nfunction beginClass(node: ts.Node) {\n if (!isClass(node, c.tss)) return;\n c.currentClass = node;\n return 0;\n}\nfunction endClass(node: ts.Node) {\n if (!isClass(node, c.tss)) return;\n c.currentClass = undefined;\n if (c.builtHeadAreas) {\n c.builtHeadAreas = undefined;\n c.idg = undefined;\n c.virtualCode += `}\\n`;\n }\n return;\n}\nfunction beginTemplate(node: ts.Node) {\n if (!c.tss.isTaggedTemplateExpression(node)) return;\n // 非 bobe 模板语法可以直接跳过\n if (!isBobeIdentifier(node, c.tss)) return 1;\n // bobe 模板语法需要为文件末尾添加东西\n // 1. 为 class 添加类型上下文\n const template = { headAreas: [] } as any as Template;\n if (c.currentClass && !c.builtHeadAreas) {\n c.idg = new IdGenerator();\n const { currentClass } = c;\n const className = currentClass.name!.getText();\n\n const area = new Area();\n c.virtualCode += `{\\nconst {`;\n const members = getClassMembersInClass(currentClass, c.tss);\n for (const member of members) {\n const nameText = member.name!.getText();\n const itemStart = c.virtualCode.length;\n c.virtualCode += `${nameText}:${nameText},`;\n const itemEnd = c.virtualCode.length;\n area.addRange(itemStart, itemEnd);\n }\n c.virtualCode += `} = {} as any as ${className};\\n`;\n c.builtHeadAreas = template.headAreas = [area];\n }\n c.virtualCode += '{\\n';\n // 2. 为泛型添加类型上下文\n if (node.typeArguments) {\n const typeArg = node.typeArguments[0];\n const checker = c.program?.getTypeChecker();\n if (checker) {\n const typeNode = checker.getTypeAtLocation(typeArg);\n const typeExp = typeArg.getText();\n const originOffset = typeArg.getFullStart();\n const propNodes = checker.getPropertiesOfType(typeNode);\n /*----------------- 增加类型解构 -----------------*/\n const area = new Area();\n c.virtualCode += `const {`;\n for (const { name } of propNodes) {\n const itemStart = c.virtualCode.length;\n c.virtualCode += `${name}:${name},`;\n const itemEnd = c.virtualCode.length;\n area.addRange(itemStart, itemEnd);\n }\n\n c.virtualCode += `} = {} as any as `;\n const codeOffset = c.virtualCode.length;\n /*----------------- 记录类型位置的映射 -----------------*/\n c.virtualCode += typeExp;\n template.headTemplate = area;\n template.typeMap = {\n originOffset,\n codeOffset,\n length: typeExp.length\n };\n c.virtualCode += `;\\n`;\n }\n }\n if (!c.tss.isNoSubstitutionTemplateLiteral(node.template)) {\n const insArr = Array.from(node.template.templateSpans);\n c.tempStaticIns = insArr[Symbol.iterator]();\n }\n // 3. 构建虚拟文档\n const templateStart = node.template.getFullStart() + 1;\n const virtualStart = c.virtualCode.length;\n const raw = node.template.getText().slice(1, -1);\n const { output, sourceMap, errors } = new Bobe2ts(c, template, templateStart, virtualStart, raw).process();\n c.virtualCode += output + `}\\n`;\n template.sourceMap = sourceMap;\n template.errors = errors;\n template.templateStart = templateStart;\n template.virtualStart = virtualStart;\n c.templates.push(template);\n return 1;\n}\nfunction endTemplate(node: ts.Node) {\n if (!isBobeTemplate(node, c.tss)) return;\n return;\n}\n"],"names":["cache","memo"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -245,7 +245,8 @@ declare class PropertyExtractor {
245
245
  private checker;
246
246
  private key;
247
247
  private locationNode;
248
- constructor(checker: TypeChecker, key: string, locationNode: Node);
248
+ private tss;
249
+ constructor(checker: TypeChecker, key: string, locationNode: Node, tss: typeof ts);
249
250
  /**
250
251
  * 主入口:两步提取属性名
251
252
  * 1. 解析 midType(通过 key 从原始类型中获取)
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bobe-js/lang-core",
3
3
  "description": "Shared Bobe language utilities for editor and TypeScript service integrations.",
4
- "version": "0.0.2",
4
+ "version": "0.0.3",
5
5
  "type": "module",
6
6
  "main": "dist/bobe-language-core.cjs",
7
7
  "module": "dist/bobe-language-core.esm.js",
@@ -20,9 +20,6 @@
20
20
  "dependencies": {
21
21
  "bobe": "^0.0.73"
22
22
  },
23
- "devDependencies": {
24
- "typescript": "^6.0.2"
25
- },
26
23
  "repository": {
27
24
  "type": "git",
28
25
  "url": "https://github.com/bobe-js/bobe-tools"