@compelem/compiler 0.0.0-stage → 0.30.0-beta.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-DU4Nznh4.js","names":["i","readFileSync","err","error","wrap","program: any","parsed: ParsedFile","out: any[]","decoratorName","render: { body: any; start: number; end: number } | null","cssVars: any[] | null","decs: string[]","kind: ReactiveKind | null","out: any[]","out: ComponentAnalysis[]","worklist: Array<{ className: string; cls: any; isMixin: boolean }>","tagName: string | undefined","degradeReason: string | null","cur: any","reasons: string[]","KNOWN_GLOBALS: ReadonlySet<string>","IMPURE_GLOBALS: ReadonlySet<string>","TEMPLATE_ARG_INDEX: Record<string, number[] | 'rest-after-0'>","thisChain","chain: string[]","cur: any","record","c: any","added: string[]","scanNode","ctx: ScanCtx","wrap","parts: string[]","injected: string[]","additions: string[]","superClassName","strOf","obj: Record<string, any>","inner: Record<string, any>","parts: string[]","v: any","usage: ThisUsage","errs: ConventionError[]","decs: string[]","chain: string[]","cur: any","out: string[]","hits: any[]","quasi: any","isDirectiveCall","directiveName: string | undefined","moduleBindingName: string | undefined","directiveVarChain: string[] | undefined","stack: Array<{ t: string; brace?: number }>","out: string[]","__source: string","collectionExpr: string | undefined","hits: any[]","hit: any","retHits: any[]","quasi: any","strings: string[]","vars: TemplateVarInfo[]","directiveName: string | undefined","moduleBindingName: string | undefined","ctx: CollectCtx","inner","node: any","c: any","cur: any","ctx: ExtractCtx","out: Record<string, string[]>","TOKEN_RE","pos: number","parts: TPart[]","m: RegExpExecArray | null","root: TNode[]","stack: OpenTag[]","err","end","lower","el: TElement","attrValue: string | null","kept: TNode[]","i","out: TNode[]","DIRECTIVE_SCOPES: Record<string, string[]>","superClassName","errs: TemplateRuleError[]","elements: TElement[]","J","factories: string[]","out: string[]","parts: string[]","cur: any","result: WatchExtractResult","chain: Array<{ node: any; fields: Set<string> }>","EMPTY: InitMeta","out: InitMeta","FAM_CODE: Record<Family, string>","cur: any","empty: FieldExtractResult","cands: Cand[]","errors: ConventionError[]","decs: any[]","accs: Record<Family, Acc>","removals: Array<{ start: number; end: number }>","propsCode: string | undefined","statesCode: string | undefined","computedCode: string | undefined","familyLabel: Record<Family, string>","parts: string[]","fieldInits: Array<{ name: string; initText: string; computed?: boolean }>","runtimeHelpers: string[]","result: MethodDecoResult","chain: any[]","args: any[]","J","ctx: Ctx","rootPath: number[]","WALK_LINES: string[]","sn","up: UpOut","IMPURE_GLOBALS","IMPURE_GLOBAL_SET","stack: Array<{ t: string; brace?: number }>","chain: string[]","cur: any","ret: any","scopes: Set<string>[]","collectParams","args: any[]","out: string[]","exprs: string[]","biMap: Record<string, number[]>","alwaysDirty: number[]","chainOut: ChainOut","exprsOut: string[]","chainOut: ChainOut | null","fast: string[]","slow: string[]","fx: string[]","writers: WriterSet","ictx: InlineCtx | undefined","src: string | null","prelude: string | null","stmts: string[]","entries: VarMapEntry[]","updates: VarMapEntry['updates']","kind: VarMapEntry['kind']","deps: DepSummary","KIND_LABEL: Record<string, string>","edits: Array<{\n comp: ComponentAnalysis\n literal: string\n removals?: Array<{ start: number; end: number }>\n /** prop/state 初始值 → 构造体写入(字段已整体删除) */\n fieldInits?: Array<{ name: string; initText: string; computed?: boolean }>\n /** 构造体插入点计划(无初始值时缺省) */\n ctor?: CtorInsertPlan\n /** 方法装饰器(@debounced/@throttled/@onced)构造体注入语句 */\n methodDecoCtor?: string\n /** 方法装饰器 destroy 注入语句 */\n methodDecoDestroy?: string\n /** 本组件访问器所需的运行时函数(已定名)——文件级 import 注入取并集 */\n helpers?: string[]\n /** 本组件方法装饰器所需的 myfx 函数(debounce/throttle/once)——走 myfx 通道注入 */\n myfxHelpers?: string[]\n }>","diagnostics: CompileResult['diagnostics']","renderStrips: Array<{ edit: (typeof edits)[number]; start: number; end: number }>","helperBindings: Record<string, string>","carrierDecls: string[]","watchEffectsCode: string | undefined","watchRemovals: Array<{ start: number; end: number }>","allRemovals: Array<{ start: number; end: number }>","mainHits: any[]","cssEffectCode: string | undefined","subViewDepsRec: Record<number, string[]> | undefined","buildTemplateCode: string | undefined","subsCode: string | undefined","pointEffectsCode: string | undefined","fxCode: string | undefined","tmplErrors: string[]","superHelpers: string[]","mainTmpl: ReturnType<typeof extractMainTemplate>","mainUps: UpOut[] | undefined","mainNodeNames: string[] | undefined","updateMeta: UpdateMeta","subCandidates: ReturnType<typeof collectSubCandidates>","c1SubBvMap: Map<number, ReturnType<typeof generateSubBuildVars>> | undefined","c1Extras: Map<number, string> | undefined","c1Carriers: Map<number, string> | undefined","c1BvOpts: BuildVarsOptions | undefined","freeCache: Map<string, Set<string> | null>","liftPlan: Array<{\n cand: (typeof subCandidates)[number]\n allowed: Set<string>\n r: ReturnType<typeof generateSubBuildVars>\n }>","id","liftGen: ReturnType<typeof generateBuildTemplate> | undefined","bvOpts: BuildVarsOptions","entries: string[]","rec: Record<number, string[]>","edit: (typeof edits)[number]","helperImport: { decl: any; source: string } | undefined","myfxImport: { decl: any; source: string } | undefined","helpersAnchor: number | undefined","topLevelAnchor: number | undefined","lastImportEnd: number | undefined","arr: number[]","lastNl","out: string[]","nl: Int32Array | undefined","err"],"sources":["../node_modules/rolldown/dist/shared/logs-DmYCAKcW.mjs","../node_modules/rolldown/dist/shared/binding-BbrDfv1x.mjs","../node_modules/rolldown/dist/shared/parse-DltPb1DL.mjs","../node_modules/rolldown/dist/parse-ast-index.mjs","../src/utils/oxc.ts","../src/analyze/component.ts","../src/analyze/degrade.ts","../src/utils/globals.ts","../src/analyze/template.ts","../src/analyze/render-body.ts","../src/types.ts","../src/codegen/inject.ts","../src/analyze/conventions.ts","../src/analyze/template-extract.ts","../src/analyze/template-subs.ts","../src/analyze/deps-extract.ts","../src/analyze/template-tree.ts","../src/analyze/template-rules.ts","../src/analyze/watch-extract.ts","../src/analyze/literal-meta.ts","../src/analyze/field-extract.ts","../src/analyze/method-deco-extract.ts","../node_modules/myfx/dist/index.esm.mjs","../src/codegen/template-html.ts","../src/codegen/template-dom.ts","../src/codegen/build-vars.ts","../src/codegen/render-effect.ts","../src/compile.ts","../src/vite.ts"],"sourcesContent":["//#region src/utils/code-frame.ts\nfunction spaces(index) {\n\tlet result = \"\";\n\twhile (index--) result += \" \";\n\treturn result;\n}\nfunction tabsToSpaces(value) {\n\treturn value.replace(/^\\t+/, (match) => match.split(\"\t\").join(\" \"));\n}\nconst LINE_TRUNCATE_LENGTH = 120;\nconst MIN_CHARACTERS_SHOWN_AFTER_LOCATION = 10;\nconst ELLIPSIS = \"...\";\nfunction getCodeFrame(source, line, column) {\n\tlet lines = source.split(\"\\n\");\n\tif (line > lines.length) return \"\";\n\tconst maxLineLength = Math.max(tabsToSpaces(lines[line - 1].slice(0, column)).length + MIN_CHARACTERS_SHOWN_AFTER_LOCATION + 3, LINE_TRUNCATE_LENGTH);\n\tconst frameStart = Math.max(0, line - 3);\n\tlet frameEnd = Math.min(line + 2, lines.length);\n\tlines = lines.slice(frameStart, frameEnd);\n\twhile (!/\\S/.test(lines[lines.length - 1])) {\n\t\tlines.pop();\n\t\tframeEnd -= 1;\n\t}\n\tconst digits = String(frameEnd).length;\n\treturn lines.map((sourceLine, index) => {\n\t\tconst isErrorLine = frameStart + index + 1 === line;\n\t\tlet lineNumber = String(index + frameStart + 1);\n\t\twhile (lineNumber.length < digits) lineNumber = ` ${lineNumber}`;\n\t\tlet displayedLine = tabsToSpaces(sourceLine);\n\t\tif (displayedLine.length > maxLineLength) displayedLine = `${displayedLine.slice(0, maxLineLength - 3)}${ELLIPSIS}`;\n\t\tif (isErrorLine) {\n\t\t\tconst indicator = spaces(digits + 2 + tabsToSpaces(sourceLine.slice(0, column)).length) + \"^\";\n\t\t\treturn `${lineNumber}: ${displayedLine}\\n${indicator}`;\n\t\t}\n\t\treturn `${lineNumber}: ${displayedLine}`;\n\t}).join(\"\\n\");\n}\n//#endregion\n//#region src/log/locate-character/index.js\n/** @typedef {import('./types').Location} Location */\n/**\n* @param {import('./types').Range} range\n* @param {number} index\n*/\nfunction rangeContains(range, index) {\n\treturn range.start <= index && index < range.end;\n}\n/**\n* @param {string} source\n* @param {import('./types').Options} [options]\n*/\nfunction getLocator(source, options = {}) {\n\tconst { offsetLine = 0, offsetColumn = 0 } = options;\n\tlet start = 0;\n\tconst ranges = source.split(\"\\n\").map((line, i) => {\n\t\tconst end = start + line.length + 1;\n\t\t/** @type {import('./types').Range} */\n\t\tconst range = {\n\t\t\tstart,\n\t\t\tend,\n\t\t\tline: i\n\t\t};\n\t\tstart = end;\n\t\treturn range;\n\t});\n\tlet i = 0;\n\t/**\n\t* @param {string | number} search\n\t* @param {number} [index]\n\t* @returns {Location | undefined}\n\t*/\n\tfunction locator(search, index) {\n\t\tif (typeof search === \"string\") search = source.indexOf(search, index ?? 0);\n\t\tif (search === -1) return void 0;\n\t\tlet range = ranges[i];\n\t\tconst d = search >= range.end ? 1 : -1;\n\t\twhile (range) {\n\t\t\tif (rangeContains(range, search)) return {\n\t\t\t\tline: offsetLine + range.line,\n\t\t\t\tcolumn: offsetColumn + search - range.start,\n\t\t\t\tcharacter: search\n\t\t\t};\n\t\t\ti += d;\n\t\t\trange = ranges[i];\n\t\t}\n\t}\n\treturn locator;\n}\n/**\n* @param {string} source\n* @param {string | number} search\n* @param {import('./types').Options} [options]\n* @returns {Location | undefined}\n*/\nfunction locate(source, search, options) {\n\treturn getLocator(source, options)(search, options && options.startIndex);\n}\n//#endregion\n//#region src/log/logs.ts\nconst INVALID_LOG_POSITION = \"INVALID_LOG_POSITION\";\nconst PLUGIN_ERROR = \"PLUGIN_ERROR\";\nconst INPUT_HOOK_IN_OUTPUT_PLUGIN = \"INPUT_HOOK_IN_OUTPUT_PLUGIN\";\nconst CYCLE_LOADING = \"CYCLE_LOADING\";\nconst MULTIPLE_WATCHER_OPTION = \"MULTIPLE_WATCHER_OPTION\";\nconst PARSE_ERROR = \"PARSE_ERROR\";\nconst VALIDATION_ERROR = \"VALIDATION_ERROR\";\nfunction logParseError(message, id, pos) {\n\treturn {\n\t\tcode: PARSE_ERROR,\n\t\tid,\n\t\tmessage,\n\t\tpos\n\t};\n}\nfunction logFailedValidation(message) {\n\treturn {\n\t\tcode: VALIDATION_ERROR,\n\t\tmessage\n\t};\n}\nfunction logInvalidLogPosition(pluginName) {\n\treturn {\n\t\tcode: INVALID_LOG_POSITION,\n\t\tmessage: `Plugin \"${pluginName}\" tried to add a file position to a log or warning. This is only supported in the \"transform\" hook at the moment and will be ignored.`\n\t};\n}\nfunction logInputHookInOutputPlugin(pluginName, hookName) {\n\treturn {\n\t\tcode: INPUT_HOOK_IN_OUTPUT_PLUGIN,\n\t\tmessage: `The \"${hookName}\" hook used by the output plugin ${pluginName} is a build time hook and will not be run for that plugin. Either this plugin cannot be used as an output plugin, or it should have an option to configure it as an output plugin.`\n\t};\n}\nfunction logCycleLoading(pluginName, moduleId) {\n\treturn {\n\t\tcode: CYCLE_LOADING,\n\t\tmessage: `Found the module \"${moduleId}\" cycle loading at ${pluginName} plugin, it maybe blocking fetching modules.`\n\t};\n}\nfunction logMultipleWatcherOption() {\n\treturn {\n\t\tcode: MULTIPLE_WATCHER_OPTION,\n\t\tmessage: `Found multiple watcher options at watch options, using first one to start watcher.`\n\t};\n}\nfunction logPluginError(error, plugin, { hook, id } = {}) {\n\ttry {\n\t\tconst code = error.code;\n\t\tif (!error.pluginCode && code != null && (typeof code !== \"string\" || !code.startsWith(\"PLUGIN_\"))) error.pluginCode = code;\n\t\terror.code = PLUGIN_ERROR;\n\t\terror.plugin = plugin;\n\t\tif (hook) error.hook = hook;\n\t\tif (id) error.id = id;\n\t} catch (_) {} finally {\n\t\treturn error;\n\t}\n}\nfunction error(base) {\n\tif (!(base instanceof Error)) {\n\t\tbase = Object.assign(new Error(base.message), base);\n\t\tObject.defineProperty(base, \"name\", {\n\t\t\tvalue: \"RolldownError\",\n\t\t\twritable: true\n\t\t});\n\t}\n\tthrow base;\n}\nfunction augmentCodeLocation(properties, pos, source, id) {\n\tif (typeof pos === \"object\") {\n\t\tconst { line, column } = pos;\n\t\tproperties.loc = {\n\t\t\tcolumn,\n\t\t\tfile: id,\n\t\t\tline\n\t\t};\n\t} else {\n\t\tproperties.pos = pos;\n\t\tconst location = locate(source, pos, { offsetLine: 1 });\n\t\tif (!location) return;\n\t\tconst { line, column } = location;\n\t\tproperties.loc = {\n\t\t\tcolumn,\n\t\t\tfile: id,\n\t\t\tline\n\t\t};\n\t}\n\tif (properties.frame === void 0) {\n\t\tconst { line, column } = properties.loc;\n\t\tproperties.frame = getCodeFrame(source, line, column);\n\t}\n}\n//#endregion\nexport { logInputHookInOutputPlugin as a, logParseError as c, getCodeFrame as d, logFailedValidation as i, logPluginError as l, error as n, logInvalidLogPosition as o, logCycleLoading as r, logMultipleWatcherOption as s, augmentCodeLocation as t, locate as u };\n","import { createRequire } from \"node:module\";\n//#region \\0rolldown/runtime.js\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);\nvar __copyProps = (to, from, except, desc) => {\n\tif (from && typeof from === \"object\" || typeof from === \"function\") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {\n\t\tkey = keys[i];\n\t\tif (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n\t\t\tget: ((k) => from[k]).bind(null, key),\n\t\t\tenumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n\t\t});\n\t}\n\treturn to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, \"default\") ? __defProp(target, \"default\", {\n\tvalue: mod,\n\tenumerable: true\n}) : target, mod));\nvar __require = /* #__PURE__ */ (() => createRequire(import.meta.url))();\n//#endregion\n//#region src/webcontainer-fallback.cjs\nvar require_webcontainer_fallback = /* @__PURE__ */ __commonJSMin(((exports, module) => {\n\tconst fs = __require(\"node:fs\");\n\tconst childProcess = __require(\"node:child_process\");\n\tconst version = JSON.parse(fs.readFileSync(__require.resolve(\"rolldown/package.json\"), \"utf-8\")).version;\n\tconst baseDir = `/tmp/rolldown-${version}`;\n\tconst bindingEntry = `${baseDir}/node_modules/@rolldown/binding-wasm32-wasi/rolldown-binding.wasi.cjs`;\n\tif (!fs.existsSync(bindingEntry)) {\n\t\tconst bindingPkg = `@rolldown/binding-wasm32-wasi@${version}`;\n\t\tfs.rmSync(baseDir, {\n\t\t\trecursive: true,\n\t\t\tforce: true\n\t\t});\n\t\tfs.mkdirSync(baseDir, { recursive: true });\n\t\tconsole.log(`[rolldown] Downloading ${bindingPkg} on WebContainer...`);\n\t\tchildProcess.execFileSync(\"pnpm\", [\"i\", bindingPkg], {\n\t\t\tcwd: baseDir,\n\t\t\tstdio: \"inherit\"\n\t\t});\n\t}\n\tmodule.exports = __require(bindingEntry);\n}));\n//#endregion\n//#region src/binding.cjs\nvar require_binding = /* @__PURE__ */ __commonJSMin(((exports, module) => {\n\tconst { readFileSync } = __require(\"fs\");\n\tlet nativeBinding = null;\n\tlet __napiLoadedBindingTarget = \"native\";\n\tconst loadErrors = [];\n\tconst isMusl = () => {\n\t\tlet musl = false;\n\t\tif (process.platform === \"linux\") {\n\t\t\tmusl = isMuslFromFilesystem();\n\t\t\tif (musl === null) musl = isMuslFromReport();\n\t\t\tif (musl === null) musl = isMuslFromChildProcess();\n\t\t}\n\t\treturn musl;\n\t};\n\tconst isFileMusl = (f) => f.includes(\"libc.musl-\") || f.includes(\"ld-musl-\");\n\tconst isMuslFromFilesystem = () => {\n\t\ttry {\n\t\t\treturn readFileSync(\"/usr/bin/ldd\", \"utf-8\").includes(\"musl\");\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t};\n\tconst isMuslFromReport = () => {\n\t\tlet report = null;\n\t\tif (process.report && typeof process.report.getReport === \"function\") {\n\t\t\tprocess.report.excludeNetwork = true;\n\t\t\treport = process.report.getReport();\n\t\t}\n\t\tif (!report) return null;\n\t\tif (report.header && report.header.glibcVersionRuntime) return false;\n\t\tif (Array.isArray(report.sharedObjects)) {\n\t\t\tif (report.sharedObjects.some(isFileMusl)) return true;\n\t\t}\n\t\treturn false;\n\t};\n\tconst isMuslFromChildProcess = () => {\n\t\ttry {\n\t\t\treturn __require(\"child_process\").execSync(\"ldd --version\", { encoding: \"utf8\" }).includes(\"musl\");\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t};\n\tfunction requireNative() {\n\t\tif (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) try {\n\t\t\tconst overrideBinding = __require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH);\n\t\t\t__napiLoadedBindingTarget = overrideBinding && typeof overrideBinding.__napiBindingTarget === \"string\" ? overrideBinding.__napiBindingTarget : \"native\";\n\t\t\treturn overrideBinding;\n\t\t} catch (err) {\n\t\t\tloadErrors.push(err);\n\t\t}\n\t\telse if (process.platform === \"android\") {\n\t\t\tif (process.arch === \"arm64\") {\n\t\t\t\ttry {\n\t\t\t\t\treturn __require(\"./rolldown-binding.android-arm64.node\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst binding = __require(\"@rolldown/binding-android-arm64\");\n\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-android-arm64/package.json\").version;\n\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\treturn binding;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t} else if (process.arch === \"arm\") {\n\t\t\t\ttry {\n\t\t\t\t\treturn __require(\"./rolldown-binding.android-arm-eabi.node\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst binding = __require(\"@rolldown/binding-android-arm-eabi\");\n\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-android-arm-eabi/package.json\").version;\n\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\treturn binding;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t} else loadErrors.push(/* @__PURE__ */ new Error(`Unsupported architecture on Android ${process.arch}`));\n\t\t} else if (process.platform === \"win32\") {\n\t\t\tif (process.arch === \"x64\") {\n\t\t\t\tif (process.config && process.config.variables && process.config.variables.shlib_suffix === \"dll.a\" || process.config && process.config.variables && process.config.variables.node_target_type === \"shared_library\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn __require(\"./rolldown-binding.win32-x64-gnu.node\");\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst binding = __require(\"@rolldown/binding-win32-x64-gnu\");\n\t\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-win32-x64-gnu/package.json\").version;\n\t\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\t\treturn binding;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn __require(\"./rolldown-binding.win32-x64-msvc.node\");\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst binding = __require(\"@rolldown/binding-win32-x64-msvc\");\n\t\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-win32-x64-msvc/package.json\").version;\n\t\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\t\treturn binding;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (process.arch === \"ia32\") {\n\t\t\t\ttry {\n\t\t\t\t\treturn __require(\"./rolldown-binding.win32-ia32-msvc.node\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst binding = __require(\"@rolldown/binding-win32-ia32-msvc\");\n\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-win32-ia32-msvc/package.json\").version;\n\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\treturn binding;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t} else if (process.arch === \"arm64\") {\n\t\t\t\ttry {\n\t\t\t\t\treturn __require(\"./rolldown-binding.win32-arm64-msvc.node\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst binding = __require(\"@rolldown/binding-win32-arm64-msvc\");\n\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-win32-arm64-msvc/package.json\").version;\n\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\treturn binding;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t} else loadErrors.push(/* @__PURE__ */ new Error(`Unsupported architecture on Windows: ${process.arch}`));\n\t\t} else if (process.platform === \"darwin\") {\n\t\t\ttry {\n\t\t\t\treturn __require(\"./rolldown-binding.darwin-universal.node\");\n\t\t\t} catch (e) {\n\t\t\t\tloadErrors.push(e);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst binding = __require(\"@rolldown/binding-darwin-universal\");\n\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-darwin-universal/package.json\").version;\n\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\treturn binding;\n\t\t\t} catch (e) {\n\t\t\t\tloadErrors.push(e);\n\t\t\t}\n\t\t\tif (process.arch === \"x64\") {\n\t\t\t\ttry {\n\t\t\t\t\treturn __require(\"./rolldown-binding.darwin-x64.node\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst binding = __require(\"@rolldown/binding-darwin-x64\");\n\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-darwin-x64/package.json\").version;\n\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\treturn binding;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t} else if (process.arch === \"arm64\") {\n\t\t\t\ttry {\n\t\t\t\t\treturn __require(\"./rolldown-binding.darwin-arm64.node\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst binding = __require(\"@rolldown/binding-darwin-arm64\");\n\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-darwin-arm64/package.json\").version;\n\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\treturn binding;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t} else loadErrors.push(/* @__PURE__ */ new Error(`Unsupported architecture on macOS: ${process.arch}`));\n\t\t} else if (process.platform === \"freebsd\") {\n\t\t\tif (process.arch === \"x64\") {\n\t\t\t\ttry {\n\t\t\t\t\treturn __require(\"./rolldown-binding.freebsd-x64.node\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst binding = __require(\"@rolldown/binding-freebsd-x64\");\n\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-freebsd-x64/package.json\").version;\n\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\treturn binding;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t} else if (process.arch === \"arm64\") {\n\t\t\t\ttry {\n\t\t\t\t\treturn __require(\"./rolldown-binding.freebsd-arm64.node\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst binding = __require(\"@rolldown/binding-freebsd-arm64\");\n\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-freebsd-arm64/package.json\").version;\n\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\treturn binding;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t} else loadErrors.push(/* @__PURE__ */ new Error(`Unsupported architecture on FreeBSD: ${process.arch}`));\n\t\t} else if (process.platform === \"linux\") {\n\t\t\tif (process.arch === \"x64\") {\n\t\t\t\tif (isMusl()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn __require(\"./rolldown-binding.linux-x64-musl.node\");\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst binding = __require(\"@rolldown/binding-linux-x64-musl\");\n\t\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-linux-x64-musl/package.json\").version;\n\t\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\t\treturn binding;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn __require(\"../rolldown-binding.linux-x64-gnu.node\");\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst binding = __require(\"@rolldown/binding-linux-x64-gnu\");\n\t\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-linux-x64-gnu/package.json\").version;\n\t\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\t\treturn binding;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (process.arch === \"arm64\") {\n\t\t\t\tif (isMusl()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn __require(\"./rolldown-binding.linux-arm64-musl.node\");\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst binding = __require(\"@rolldown/binding-linux-arm64-musl\");\n\t\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-linux-arm64-musl/package.json\").version;\n\t\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\t\treturn binding;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn __require(\"./rolldown-binding.linux-arm64-gnu.node\");\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst binding = __require(\"@rolldown/binding-linux-arm64-gnu\");\n\t\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-linux-arm64-gnu/package.json\").version;\n\t\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\t\treturn binding;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (process.arch === \"arm\") {\n\t\t\t\tif (isMusl()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn __require(\"./rolldown-binding.linux-arm-musleabihf.node\");\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst binding = __require(\"@rolldown/binding-linux-arm-musleabihf\");\n\t\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-linux-arm-musleabihf/package.json\").version;\n\t\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\t\treturn binding;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn __require(\"./rolldown-binding.linux-arm-gnueabihf.node\");\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst binding = __require(\"@rolldown/binding-linux-arm-gnueabihf\");\n\t\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-linux-arm-gnueabihf/package.json\").version;\n\t\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\t\treturn binding;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (process.arch === \"loong64\") {\n\t\t\t\tif (isMusl()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn __require(\"./rolldown-binding.linux-loong64-musl.node\");\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst binding = __require(\"@rolldown/binding-linux-loong64-musl\");\n\t\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-linux-loong64-musl/package.json\").version;\n\t\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\t\treturn binding;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn __require(\"./rolldown-binding.linux-loong64-gnu.node\");\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst binding = __require(\"@rolldown/binding-linux-loong64-gnu\");\n\t\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-linux-loong64-gnu/package.json\").version;\n\t\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\t\treturn binding;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (process.arch === \"riscv64\") {\n\t\t\t\tif (isMusl()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn __require(\"./rolldown-binding.linux-riscv64-musl.node\");\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst binding = __require(\"@rolldown/binding-linux-riscv64-musl\");\n\t\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-linux-riscv64-musl/package.json\").version;\n\t\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\t\treturn binding;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn __require(\"./rolldown-binding.linux-riscv64-gnu.node\");\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst binding = __require(\"@rolldown/binding-linux-riscv64-gnu\");\n\t\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-linux-riscv64-gnu/package.json\").version;\n\t\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\t\treturn binding;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (process.arch === \"ppc64\") {\n\t\t\t\ttry {\n\t\t\t\t\treturn __require(\"./rolldown-binding.linux-ppc64-gnu.node\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst binding = __require(\"@rolldown/binding-linux-ppc64-gnu\");\n\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-linux-ppc64-gnu/package.json\").version;\n\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\treturn binding;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t} else if (process.arch === \"s390x\") {\n\t\t\t\ttry {\n\t\t\t\t\treturn __require(\"./rolldown-binding.linux-s390x-gnu.node\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst binding = __require(\"@rolldown/binding-linux-s390x-gnu\");\n\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-linux-s390x-gnu/package.json\").version;\n\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\treturn binding;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t} else loadErrors.push(/* @__PURE__ */ new Error(`Unsupported architecture on Linux: ${process.arch}`));\n\t\t} else if (process.platform === \"openharmony\") {\n\t\t\tif (process.arch === \"arm64\") {\n\t\t\t\ttry {\n\t\t\t\t\treturn __require(\"./rolldown-binding.openharmony-arm64.node\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst binding = __require(\"@rolldown/binding-openharmony-arm64\");\n\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-openharmony-arm64/package.json\").version;\n\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\treturn binding;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t} else if (process.arch === \"x64\") {\n\t\t\t\ttry {\n\t\t\t\t\treturn __require(\"./rolldown-binding.openharmony-x64.node\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst binding = __require(\"@rolldown/binding-openharmony-x64\");\n\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-openharmony-x64/package.json\").version;\n\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\treturn binding;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t} else if (process.arch === \"arm\") {\n\t\t\t\ttry {\n\t\t\t\t\treturn __require(\"./rolldown-binding.openharmony-arm.node\");\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst binding = __require(\"@rolldown/binding-openharmony-arm\");\n\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-openharmony-arm/package.json\").version;\n\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\" && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") throw new Error(`Native binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\treturn binding;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tloadErrors.push(e);\n\t\t\t\t}\n\t\t\t} else loadErrors.push(/* @__PURE__ */ new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`));\n\t\t} else loadErrors.push(/* @__PURE__ */ new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`));\n\t}\n\tfunction createLoadErrorChain(errors) {\n\t\treturn errors.reduce((previous, current) => {\n\t\t\tlet message;\n\t\t\ttry {\n\t\t\t\tmessage = current && typeof current.message === \"string\" ? current.message : String(current);\n\t\t\t} catch {\n\t\t\t\tmessage = \"Unknown error\";\n\t\t\t}\n\t\t\tconst error = new Error(message);\n\t\t\terror.cause = previous;\n\t\t\treturn error;\n\t\t}, null);\n\t}\n\tconst __napiWasiFlavors = [\"wasm32-wasi\"];\n\tconst __napiWasiFlavor = process.env.NAPI_RS_WASI_FLAVOR;\n\tconst __napiWasiFlavorRequested = typeof __napiWasiFlavor === \"string\" && __napiWasiFlavor.length > 0;\n\tif (__napiWasiFlavorRequested && __napiWasiFlavors.indexOf(__napiWasiFlavor) === -1) throw new Error(\"Unsupported WASI flavor \\\"\" + __napiWasiFlavor + \"\\\". Available flavors: \" + __napiWasiFlavors.join(\", \"));\n\tconst forceWasiError = process.env.NAPI_RS_FORCE_WASI === \"error\";\n\tconst forceWasi = process.env.NAPI_RS_FORCE_WASI === \"true\" || forceWasiError || __napiWasiFlavorRequested;\n\tif (!forceWasi) nativeBinding = requireNative();\n\tif (!nativeBinding || forceWasi) {\n\t\tlet wasiBinding = null;\n\t\tlet wasiBindingLoaded = false;\n\t\tconst wasiBindingErrors = [];\n\t\tconst __napiWasiResolveCandidate = (specifier, isPackage, localArtifacts) => {\n\t\t\ttry {\n\t\t\t\t__require.resolve(specifier);\n\t\t\t} catch (resolveError) {\n\t\t\t\tif (!resolveError || resolveError.code !== \"MODULE_NOT_FOUND\") throw resolveError;\n\t\t\t\tif (isPackage) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t__require.resolve(specifier + \"/package.json\");\n\t\t\t\t\t} catch (packageError) {\n\t\t\t\t\t\tif (packageError && packageError.code === \"MODULE_NOT_FOUND\") return resolveError;\n\t\t\t\t\t\tthrow resolveError;\n\t\t\t\t\t}\n\t\t\t\t\tthrow resolveError;\n\t\t\t\t}\n\t\t\t\treturn resolveError;\n\t\t\t}\n\t\t\tif (localArtifacts) {\n\t\t\t\tlet artifactError = null;\n\t\t\t\tfor (let i = 0; i < localArtifacts.length; i++) try {\n\t\t\t\t\t__require.resolve(localArtifacts[i]);\n\t\t\t\t\treturn null;\n\t\t\t\t} catch (resolveError) {\n\t\t\t\t\tif (!resolveError || resolveError.code !== \"MODULE_NOT_FOUND\") throw resolveError;\n\t\t\t\t\tartifactError = resolveError;\n\t\t\t\t}\n\t\t\t\treturn artifactError;\n\t\t\t}\n\t\t\treturn null;\n\t\t};\n\t\tif (!wasiBindingLoaded && (!__napiWasiFlavorRequested || __napiWasiFlavor === \"wasm32-wasi\")) {\n\t\t\tlet candidateError = null;\n\t\t\tlet candidateFailed = false;\n\t\t\ttry {\n\t\t\t\tcandidateError = __napiWasiResolveCandidate(\"./rolldown-binding.wasi.cjs\", false, [\"./rolldown-binding.wasm32-wasi.debug.wasm\", \"./rolldown-binding.wasm32-wasi.wasm\"]);\n\t\t\t\tcandidateFailed = candidateError !== null;\n\t\t\t\tif (!candidateFailed) {\n\t\t\t\t\twasiBinding = __require(\"../rolldown-binding.wasi.cjs\");\n\t\t\t\t\tnativeBinding = wasiBinding;\n\t\t\t\t\t__napiLoadedBindingTarget = \"wasm32-wasi\";\n\t\t\t\t\twasiBindingLoaded = true;\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tcandidateError = err;\n\t\t\t\tcandidateFailed = true;\n\t\t\t}\n\t\t\tif (candidateFailed) {\n\t\t\t\twasiBindingErrors.push(candidateError);\n\t\t\t\tloadErrors.push(candidateError);\n\t\t\t}\n\t\t}\n\t\tif (!wasiBindingLoaded && (!__napiWasiFlavorRequested || __napiWasiFlavor === \"wasm32-wasi\")) {\n\t\t\tlet candidateError = null;\n\t\t\tlet candidateFailed = false;\n\t\t\ttry {\n\t\t\t\tcandidateError = __napiWasiResolveCandidate(\"@rolldown/binding-wasm32-wasi\", true, void 0);\n\t\t\t\tcandidateFailed = candidateError !== null;\n\t\t\t\tif (!candidateFailed) {\n\t\t\t\t\tif (process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== \"0\") {\n\t\t\t\t\t\tconst bindingPackageVersion = __require(\"@rolldown/binding-wasm32-wasi/package.json\").version;\n\t\t\t\t\t\tif (bindingPackageVersion !== \"1.2.9\") throw new Error(`WASI binding package version mismatch, expected 1.2.9 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`);\n\t\t\t\t\t}\n\t\t\t\t\twasiBinding = __require(\"@rolldown/binding-wasm32-wasi\");\n\t\t\t\t\tnativeBinding = wasiBinding;\n\t\t\t\t\t__napiLoadedBindingTarget = \"wasm32-wasi\";\n\t\t\t\t\twasiBindingLoaded = true;\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tcandidateError = err;\n\t\t\t\tcandidateFailed = true;\n\t\t\t}\n\t\t\tif (candidateFailed) {\n\t\t\t\twasiBindingErrors.push(candidateError);\n\t\t\t\tloadErrors.push(candidateError);\n\t\t\t}\n\t\t}\n\t\tif (!wasiBindingLoaded && forceWasi && !forceWasiError && !__napiWasiFlavorRequested) nativeBinding = requireNative();\n\t\tif ((forceWasiError || __napiWasiFlavorRequested) && !wasiBindingLoaded) {\n\t\t\tconst error = /* @__PURE__ */ new Error(__napiWasiFlavorRequested ? \"WASI binding for flavor \\\"\" + __napiWasiFlavor + \"\\\" not found\" : \"WASI binding not found and NAPI_RS_FORCE_WASI is set to error\");\n\t\t\terror.cause = createLoadErrorChain(wasiBindingErrors);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tif (!nativeBinding && globalThis.process?.versions?.[\"webcontainer\"]) try {\n\t\tnativeBinding = require_webcontainer_fallback();\n\t} catch (err) {\n\t\tloadErrors.push(err);\n\t}\n\tif (!nativeBinding) {\n\t\tif (loadErrors.length > 0) {\n\t\t\tconst error = /* @__PURE__ */ new Error(\"Cannot find native binding. npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). Please try `npm i` again after removing both package-lock.json and node_modules directory.\");\n\t\t\terror.cause = createLoadErrorChain(loadErrors);\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new Error(`Failed to load native binding`);\n\t}\n\tfunction __napiStampBindingTarget(exportsObject, target) {\n\t\tif (Object.prototype.hasOwnProperty.call(exportsObject, \"__napiBindingTarget\")) {\n\t\t\tif (exportsObject.__napiBindingTarget === target) return target;\n\t\t\tconst error = /* @__PURE__ */ new Error(\"`__napiBindingTarget` is reserved by the generated binding loader, but the loaded binding already exports it. Rename the export, e.g. #[napi(js_name = \\\"...\\\")].\");\n\t\t\terror.code = \"ERR_NAPI_BINDING_TARGET_CONFLICT\";\n\t\t\tthrow error;\n\t\t}\n\t\tif (!Object.isExtensible(exportsObject)) return target;\n\t\ttry {\n\t\t\tObject.defineProperty(exportsObject, \"__napiBindingTarget\", {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: target,\n\t\t\t\twritable: true\n\t\t\t});\n\t\t} catch {}\n\t\treturn target;\n\t}\n\tmodule.exports.__napiBindingTarget = __napiStampBindingTarget(nativeBinding, __napiLoadedBindingTarget);\n\tmodule.exports = nativeBinding;\n\tmodule.exports.LegalCommentsMode = nativeBinding.LegalCommentsMode;\n\tmodule.exports.minify = nativeBinding.minify;\n\tmodule.exports.minifySync = nativeBinding.minifySync;\n\tmodule.exports.Severity = nativeBinding.Severity;\n\tmodule.exports.ParseResult = nativeBinding.ParseResult;\n\tmodule.exports.ExportExportNameKind = nativeBinding.ExportExportNameKind;\n\tmodule.exports.ExportImportNameKind = nativeBinding.ExportImportNameKind;\n\tmodule.exports.ExportLocalNameKind = nativeBinding.ExportLocalNameKind;\n\tmodule.exports.ImportNameKind = nativeBinding.ImportNameKind;\n\tmodule.exports.parse = nativeBinding.parse;\n\tmodule.exports.parseSync = nativeBinding.parseSync;\n\tmodule.exports.rawTransferSupported = nativeBinding.rawTransferSupported;\n\tmodule.exports.ResolverFactory = nativeBinding.ResolverFactory;\n\tmodule.exports.EnforceExtension = nativeBinding.EnforceExtension;\n\tmodule.exports.ModuleType = nativeBinding.ModuleType;\n\tmodule.exports.sync = nativeBinding.sync;\n\tmodule.exports.HelperMode = nativeBinding.HelperMode;\n\tmodule.exports.isolatedDeclaration = nativeBinding.isolatedDeclaration;\n\tmodule.exports.isolatedDeclarationSync = nativeBinding.isolatedDeclarationSync;\n\tmodule.exports.moduleRunnerTransform = nativeBinding.moduleRunnerTransform;\n\tmodule.exports.moduleRunnerTransformSync = nativeBinding.moduleRunnerTransformSync;\n\tmodule.exports.transform = nativeBinding.transform;\n\tmodule.exports.transformSync = nativeBinding.transformSync;\n\tmodule.exports.BindingBundleEndEventData = nativeBinding.BindingBundleEndEventData;\n\tmodule.exports.BindingBundleErrorEventData = nativeBinding.BindingBundleErrorEventData;\n\tmodule.exports.BindingBundler = nativeBinding.BindingBundler;\n\tmodule.exports.BindingCallableBuiltinPlugin = nativeBinding.BindingCallableBuiltinPlugin;\n\tmodule.exports.BindingChunkingContext = nativeBinding.BindingChunkingContext;\n\tmodule.exports.BindingDecodedMap = nativeBinding.BindingDecodedMap;\n\tmodule.exports.BindingDevEngine = nativeBinding.BindingDevEngine;\n\tmodule.exports.BindingLoadPluginContext = nativeBinding.BindingLoadPluginContext;\n\tmodule.exports.BindingMagicString = nativeBinding.BindingMagicString;\n\tmodule.exports.BindingModuleInfo = nativeBinding.BindingModuleInfo;\n\tmodule.exports.BindingNormalizedOptions = nativeBinding.BindingNormalizedOptions;\n\tmodule.exports.BindingOutputAsset = nativeBinding.BindingOutputAsset;\n\tmodule.exports.BindingOutputChunk = nativeBinding.BindingOutputChunk;\n\tmodule.exports.BindingPluginContext = nativeBinding.BindingPluginContext;\n\tmodule.exports.BindingRenderedChunk = nativeBinding.BindingRenderedChunk;\n\tmodule.exports.BindingRenderedChunkMeta = nativeBinding.BindingRenderedChunkMeta;\n\tmodule.exports.BindingRenderedModule = nativeBinding.BindingRenderedModule;\n\tmodule.exports.BindingSourceMap = nativeBinding.BindingSourceMap;\n\tmodule.exports.BindingTransformPluginContext = nativeBinding.BindingTransformPluginContext;\n\tmodule.exports.BindingWatcher = nativeBinding.BindingWatcher;\n\tmodule.exports.BindingWatcherBundler = nativeBinding.BindingWatcherBundler;\n\tmodule.exports.BindingWatcherChangeData = nativeBinding.BindingWatcherChangeData;\n\tmodule.exports.BindingWatcherEvent = nativeBinding.BindingWatcherEvent;\n\tmodule.exports.ParallelJsPluginRegistry = nativeBinding.ParallelJsPluginRegistry;\n\tmodule.exports.TraceSubscriberGuard = nativeBinding.TraceSubscriberGuard;\n\tmodule.exports.TsconfigCache = nativeBinding.TsconfigCache;\n\tmodule.exports.__internalForcePanic = nativeBinding.__internalForcePanic;\n\tmodule.exports.BindingAttachDebugInfo = nativeBinding.BindingAttachDebugInfo;\n\tmodule.exports.BindingBuiltinPluginName = nativeBinding.BindingBuiltinPluginName;\n\tmodule.exports.BindingChunkModuleOrderBy = nativeBinding.BindingChunkModuleOrderBy;\n\tmodule.exports.BindingErrorStage = nativeBinding.BindingErrorStage;\n\tmodule.exports.BindingLogLevel = nativeBinding.BindingLogLevel;\n\tmodule.exports.BindingPluginOrder = nativeBinding.BindingPluginOrder;\n\tmodule.exports.BindingPropertyReadSideEffects = nativeBinding.BindingPropertyReadSideEffects;\n\tmodule.exports.BindingPropertyWriteSideEffects = nativeBinding.BindingPropertyWriteSideEffects;\n\tmodule.exports.BindingRebuildStrategy = nativeBinding.BindingRebuildStrategy;\n\tmodule.exports.collapseSourcemaps = nativeBinding.collapseSourcemaps;\n\tmodule.exports.enhancedTransform = nativeBinding.enhancedTransform;\n\tmodule.exports.enhancedTransformSync = nativeBinding.enhancedTransformSync;\n\tmodule.exports.FilterTokenKind = nativeBinding.FilterTokenKind;\n\tmodule.exports.getNativeMemoryStats = nativeBinding.getNativeMemoryStats;\n\tmodule.exports.initTraceSubscriber = nativeBinding.initTraceSubscriber;\n\tmodule.exports.registerPlugins = nativeBinding.registerPlugins;\n\tmodule.exports.resetNativeMemoryStats = nativeBinding.resetNativeMemoryStats;\n\tmodule.exports.resolveTsconfig = nativeBinding.resolveTsconfig;\n\tmodule.exports.shutdownAsyncRuntime = nativeBinding.shutdownAsyncRuntime;\n\tmodule.exports.startAsyncRuntime = nativeBinding.startAsyncRuntime;\n}));\n//#endregion\nexport { __toESM as n, require_binding as t };\n","import { n as __toESM, t as require_binding } from \"./binding-BbrDfv1x.mjs\";\n//#region ../../node_modules/.pnpm/oxc-parser@0.150.0/node_modules/oxc-parser/src-js/wrap.js\nvar import_binding = /* @__PURE__ */ __toESM(require_binding(), 1);\nfunction wrap(result) {\n\tlet program, module, comments, errors;\n\treturn {\n\t\tget program() {\n\t\t\tif (!program) program = jsonParseAst(result.program);\n\t\t\treturn program;\n\t\t},\n\t\tget module() {\n\t\t\tif (!module) module = result.module;\n\t\t\treturn module;\n\t\t},\n\t\tget comments() {\n\t\t\tif (!comments) comments = result.comments;\n\t\t\treturn comments;\n\t\t},\n\t\tget errors() {\n\t\t\tif (!errors) errors = result.errors;\n\t\t\treturn errors;\n\t\t}\n\t};\n}\nfunction jsonParseAst(programJson) {\n\tconst { node: program, fixes } = JSON.parse(programJson);\n\tfor (const fixPath of fixes) applyFix(program, fixPath);\n\treturn program;\n}\nfunction applyFix(program, fixPath) {\n\tlet node = program;\n\tfor (const key of fixPath) node = node[key];\n\tif (node.bigint) node.value = BigInt(node.bigint);\n\telse try {\n\t\tnode.value = RegExp(node.regex.pattern, node.regex.flags);\n\t} catch {}\n}\n//#endregion\n//#region src/utils/parse.ts\n/**\n* Parse JS/TS source asynchronously on a separate thread.\n*\n* Note that not all of the workload can happen on a separate thread.\n* Parsing on Rust side does happen in a separate thread, but deserialization of the AST to JS objects\n* has to happen on current thread. This synchronous deserialization work typically outweighs\n* the asynchronous parsing by a factor of between 3 and 20.\n*\n* i.e. the majority of the workload cannot be parallelized by using this method.\n*\n* Generally {@linkcode parseSync} is preferable to use as it does not have the overhead of spawning a thread.\n* If you need to parallelize parsing multiple files, it is recommended to use worker threads.\n*\n* @category Utilities\n*/\nasync function parse(filename, sourceText, options) {\n\treturn wrap(await (0, import_binding.parse)(filename, sourceText, options));\n}\n/**\n* Parse JS/TS source synchronously on current thread.\n*\n* This is generally preferable over {@linkcode parse} (async) as it does not have the overhead\n* of spawning a thread, and the majority of the workload cannot be parallelized anyway\n* (see {@linkcode parse} documentation for details).\n*\n* If you need to parallelize parsing multiple files, it is recommended to use worker threads\n* with {@linkcode parseSync} rather than using {@linkcode parse}.\n*\n* @category Utilities\n*/\nfunction parseSync(filename, sourceText, options) {\n\treturn wrap((0, import_binding.parseSync)(filename, sourceText, options));\n}\n//#endregion\nexport { parseSync as n, parse as t };\n","import { c as logParseError, d as getCodeFrame, n as error, t as augmentCodeLocation, u as locate } from \"./shared/logs-DmYCAKcW.mjs\";\nimport { n as parseSync, t as parse } from \"./shared/parse-DltPb1DL.mjs\";\n//#region src/parse-ast-index.ts\nfunction wrap(result, filename, sourceText) {\n\tif (result.errors.length > 0) return normalizeParseError(filename, sourceText, result.errors);\n\treturn result.program;\n}\nfunction normalizeParseError(filename, sourceText, errors) {\n\tlet message = `Parse failed with ${errors.length} error${errors.length < 2 ? \"\" : \"s\"}:\\n`;\n\tconst pos = errors[0]?.labels?.[0]?.start;\n\tfor (let i = 0; i < errors.length; i++) {\n\t\tif (i >= 5) {\n\t\t\tmessage += \"\\n...\";\n\t\t\tbreak;\n\t\t}\n\t\tconst e = errors[i];\n\t\tmessage += e.message + \"\\n\" + e.labels.map((label) => {\n\t\t\tconst location = locate(sourceText, label.start, { offsetLine: 1 });\n\t\t\tif (!location) return;\n\t\t\treturn getCodeFrame(sourceText, location.line, location.column);\n\t\t}).filter(Boolean).join(\"\\n\");\n\t}\n\tconst log = logParseError(message, filename, pos);\n\tif (pos !== void 0 && filename) augmentCodeLocation(log, pos, sourceText, filename);\n\treturn error(log);\n}\nconst defaultParserOptions = {\n\tlang: \"js\",\n\tpreserveParens: false\n};\n/**\n* Parse code synchronously and return the AST.\n*\n* This function is similar to Rollup's `parseAst` function.\n* Prefer using {@linkcode parseSync} instead of this function as it has more information in the return value.\n*\n* @category Utilities\n*/\nfunction parseAst(sourceText, options, filename) {\n\treturn wrap(parseSync(filename ?? \"file.js\", sourceText, {\n\t\t...defaultParserOptions,\n\t\t...options\n\t}), filename, sourceText);\n}\n/**\n* Parse code asynchronously and return the AST.\n*\n* This function is similar to Rollup's `parseAstAsync` function.\n* Prefer using {@linkcode parseAsync} instead of this function as it has more information in the return value.\n*\n* @category Utilities\n*/\nasync function parseAstAsync(sourceText, options, filename) {\n\treturn wrap(await parse(filename ?? \"file.js\", sourceText, {\n\t\t...defaultParserOptions,\n\t\t...options\n\t}), filename, sourceText);\n}\n//#endregion\nexport { parseAst, parseAstAsync };\n","/**\n * Oxc AST 访问工具。\n *\n * 依赖 `rolldown/parseAst`(rolldown 自带 oxc 解析器),不额外引入 `oxc-parser`,\n * 避免版本漂移与重复依赖。\n */\nimport { parseAst } from 'rolldown/parseAst'\n\nexport interface ParsedFile {\n program: any\n /** 源码中所有 import 声明:本地名 → { source, imported } */\n imports: Map<string, { source: string; imported: string }>\n}\n\n/** parse 缓存 LRU 上限(dev 长会话防内存增长;驱逐仅失 memo,重 parse 结果等价)。 */\nconst CACHE_MAX = 512\nconst CACHE = new Map<string, ParsedFile>()\n\n/**\n * FNV-1a 32 位字符串哈希(导出供 vite transform 缓存 key 用,U4)。\n *\n * ⚠️ 缓存 key 不能只用 `id + '::' + code.length`:同一路径下若源码变了但长度\n * 恰好相同(不同写法替换、测试用例复用同一 id),会命中旧 AST 返回错误结果。\n * 实测踩过:两个仅模板内容不同的 fixture 长度都是 39,V4 用例因此少报了违规。\n * 这里补一个轻量哈希(不引依赖),保证「同 id 不同源码」一定 miss。\n */\nexport function hash32(s: string): string {\n let h = 0x811c9dc5\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i)\n h = Math.imul(h, 0x01000193)\n }\n return (h >>> 0).toString(36)\n}\n\n/** 解析 TS/TSX 源码为 Oxc AST(带缓存,LRU:命中回尾、超限逐出最老)。 */\nexport function parse(code: string, id = '<anon>'): ParsedFile {\n const key = id + '::' + code.length + '::' + hash32(code)\n const hit = CACHE.get(key)\n if (hit) {\n //LRU touch:移回尾部(驱逐从头部取最久未用)\n CACHE.delete(key)\n CACHE.set(key, hit)\n return hit\n }\n\n const program: any = parseAst(code, { lang: 'ts', sourceType: 'module' })\n const imports = new Map<string, { source: string; imported: string }>()\n\n for (const node of program.body ?? []) {\n if (node.type !== 'ImportDeclaration') continue\n const source = node.source?.value\n if (typeof source !== 'string') continue\n for (const spec of node.specifiers ?? []) {\n const local = spec.local?.name\n if (!local) continue\n // ImportSpecifier 有 imported;ImportDefaultSpecifier / NamespaceSpecifier 没有\n const imported =\n spec.imported?.name ?? spec.imported?.value ?? (spec.type === 'ImportDefaultSpecifier' ? 'default' : '*')\n imports.set(local, { source, imported })\n }\n }\n\n const parsed: ParsedFile = { program, imports }\n if (CACHE.size >= CACHE_MAX) {\n const oldest = CACHE.keys().next().value\n if (oldest !== undefined) CACHE.delete(oldest)\n }\n CACHE.set(key, parsed)\n return parsed\n}\n\n/**\n * 深度优先遍历,遇到嵌套函数是否下钻由 `descendInto` 决定。\n *\n * `visit(node, parent)` 返回 `false` 表示「不要下钻该节点的子节点」。\n */\nexport function walk(\n node: any,\n visit: (node: any, parent: any | null) => boolean | void,\n parent: any = null,\n opts: { descendIntoFunctions?: boolean } = {},\n): void {\n if (!node || typeof node !== 'object') return\n if (typeof node.type === 'string') {\n if (visit(node, parent) === false) return\n }\n const isFn =\n node.type === 'FunctionDeclaration' ||\n node.type === 'FunctionExpression' ||\n node.type === 'ArrowFunctionExpression' ||\n node.type === 'MethodDefinition' ||\n node.type === 'PropertyDefinition'\n if (isFn && opts.descendIntoFunctions === false) return\n\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const child = node[key]\n if (Array.isArray(child)) {\n for (const item of child) walk(item, visit, node, opts)\n } else if (child && typeof child === 'object' && typeof child.type === 'string') {\n walk(child, visit, node, opts)\n }\n }\n}\n\n/** 收集函数体顶层的 return 语句(不下钻嵌套函数,避免误计回调内 return)。 */\nexport function topLevelReturns(body: any): any[] {\n const out: any[] = []\n const nodes: any[] = Array.isArray(body) ? [...body] : body ? [body] : []\n // 用显式栈做「顶层」遍历:遇到块语句下钻,遇到函数停止\n const stack = [...nodes]\n while (stack.length) {\n const n = stack.pop()!\n if (!n || typeof n.type !== 'string') continue\n if (n.type === 'ReturnStatement') {\n out.push(n)\n continue\n }\n if (\n n.type === 'FunctionDeclaration' ||\n n.type === 'FunctionExpression' ||\n n.type === 'ArrowFunctionExpression'\n ) {\n continue\n }\n for (const key of Object.keys(n)) {\n if (key === 'type' || key === 'start' || key === 'end') continue\n const child = n[key]\n if (Array.isArray(child)) {\n for (const c of child) if (c && typeof c.type === 'string') stack.push(c)\n } else if (child && typeof child === 'object' && typeof child.type === 'string') {\n stack.push(child)\n }\n }\n }\n return out\n}\n\n/** 判断节点是否为一个「自由标识符引用」(非成员访问的属性位、非声明、非标签)。 */\nexport function isFreeIdentifierRef(node: any, parent: any | null): boolean {\n if (!node || node.type !== 'Identifier') return false\n if (!parent) return true\n switch (parent.type) {\n case 'MemberExpression':\n case 'OptionalMemberExpression':\n // `a.b` 里的 `b` 不是自由引用;`a` 是\n return parent.object === node\n case 'Property':\n case 'PropertyDefinition':\n case 'MethodDefinition':\n return parent.key !== node || parent.computed\n case 'VariableDeclarator':\n return parent.id !== node\n case 'FunctionDeclaration':\n case 'FunctionExpression':\n case 'ArrowFunctionExpression':\n return !(parent.params ?? []).includes(node) && parent.id !== node\n case 'LabeledStatement':\n case 'BreakStatement':\n case 'ContinueStatement':\n return false\n case 'ImportSpecifier':\n case 'ImportDefaultSpecifier':\n case 'ImportNamespaceSpecifier':\n return false\n case 'CallExpression':\n case 'NewExpression':\n return parent.callee === node || (parent.arguments ?? []).includes(node)\n case 'TSAsExpression':\n case 'TSTypeAssertion':\n case 'TSNonNullExpression':\n case 'TSSatisfiesExpression':\n case 'ParenthesizedExpression':\n return true\n default:\n return true\n }\n}\n\n/** Oxc 的静态成员/属性 key 取名字符串。 */\nexport function keyName(key: any): string | null {\n if (!key) return null\n if (key.type === 'Identifier') return key.name\n if (key.type === 'PrivateIdentifier') return '#' + key.name\n if (key.type === 'Literal' || key.type === 'StringLiteral') return String(key.value)\n return null\n}\n","/**\n * 组件识别与响应式字段提取。\n *\n * 目标:从单个 `.ts` 源文件里找出所有 compelem 组件类,并提取\n * - 响应式字段白名单(@prop / @state / @computed)\n * - 本类自有方法 / getter(D2 降级判定用)\n * - render() 函数体 AST 与偏移\n * - 从 compelem 导入的绑定名(D3 白名单)\n *\n * ⚠️ 前提:本仓库(compelem)自身 dev 用 `'../src/index'` 这种相对路径导入,\n * 因此 compelem 判定必须同时接受「包名含 compelem」与「相对路径指向 src」两种形态。\n */\nimport type { ComponentAnalysis, ReactiveField, ReactiveKind } from '../types'\nimport { keyName, topLevelReturns } from '../utils/oxc'\nimport type { ParsedFile } from '../utils/oxc'\n\n/** 判断某个 import source 是否指向 compelem 本体。 */\nexport function isCompelemSource(source: string): boolean {\n // 1) 包名 / 路径里含 `compelem`\n if (/(^|[/@])compelem([/@]|$)|compelem\\//.test(source)) return true\n if (/^@compelem\\//.test(source)) return false // @compelem/* 子包不算本体\n // 2) 相对路径指向 src(本仓库 dev 形态:'../src/index'、'./src')\n if (/^(\\.\\.?\\/)+src(\\/|$)/.test(source)) return true\n // 3) 裸相对路径也可能重导出 compelem(如 '../common'),此处不放行,交由调用方二次确认\n return false\n}\n\n/**\n * 判断某个 import source 是否指向 **myfx**。\n *\n * 编译器为方法装饰器前移注入的 `debounce/throttle/once` 走这条通道:它们是 myfx 的\n * 实现,compelem 不再为它们开出口(主项目直接依赖 myfx 即可)。\n * 接受包名(`myfx`)与仓库内常见的相对/别名形态(`../myfx/src`、`@/myfx`)。\n */\nexport function isMyfxSource(source: string): boolean {\n return /(^|[/@])myfx([/@]|$)|myfx\\//.test(source)\n}\n\n/** 从 import 表里挑出 compelem 相关绑定:本地名 → 原始导入名。 */\nexport function collectCompelemImports(imports: ParsedFile['imports']): Map<string, string> {\n const out = new Map<string, string>()\n for (const [local, info] of imports) {\n if (!isCompelemSource(info.source)) continue\n out.set(local, info.imported)\n }\n return out\n}\n\n/** 收集模块级绑定名(含全部 import 本地名与顶层声明名)。 */\nexport function collectModuleBindings(parsed: ParsedFile): Set<string> {\n const out = new Set<string>()\n for (const local of parsed.imports.keys()) out.add(local)\n for (const stmt of parsed.program.body ?? []) {\n collectDeclNames(stmt, out)\n }\n return out\n}\n\n/** 从一条顶层语句里收集声明的名字(不进入函数体/类体)。 */\nfunction collectDeclNames(stmt: any, into: Set<string>) {\n if (!stmt || typeof stmt.type !== 'string') return\n const decl = stmt.type === 'ExportNamedDeclaration' || stmt.type === 'ExportDefaultDeclaration'\n ? stmt.declaration\n : stmt\n if (!decl) return\n switch (decl.type) {\n case 'VariableDeclaration':\n for (const d of decl.declarations ?? []) collectPatNames(d.id, into)\n break\n case 'FunctionDeclaration':\n case 'ClassDeclaration':\n if (decl.id?.name) into.add(decl.id.name)\n break\n case 'TSEnumDeclaration':\n case 'TSInterfaceDeclaration':\n case 'TSTypeAliasDeclaration':\n if (decl.id?.name) into.add(decl.id.name)\n break\n }\n}\n\nfunction collectPatNames(pat: any, into: Set<string>) {\n if (!pat) return\n switch (pat.type) {\n case 'Identifier':\n into.add(pat.name)\n break\n case 'ObjectPattern':\n for (const p of pat.properties ?? []) {\n if (p.type === 'RestElement') collectPatNames(p.argument, into)\n else collectPatNames(p.value ?? p.key, into)\n }\n break\n case 'ArrayPattern':\n for (const el of pat.elements ?? []) collectPatNames(el, into)\n break\n case 'AssignmentPattern':\n collectPatNames(pat.left, into)\n break\n case 'RestElement':\n collectPatNames(pat.argument, into)\n break\n }\n}\n\n/** 组件类的候选:有 decorator 或继承自 CompElem。 */\ninterface ClassCandidate {\n node: any\n className: string\n decorators: string[]\n isCompElemSubclass: boolean\n}\n\nfunction decoratorName(dec: any): string | null {\n const expr = dec?.expression ?? dec\n if (!expr) return null\n // @tag(\"x\") / @prop({...}) → CallExpression\n if (expr.type === 'CallExpression') {\n const callee = expr.callee\n if (callee?.type === 'Identifier') return callee.name\n if (callee?.type === 'MemberExpression' && callee.property?.type === 'Identifier') return callee.property.name\n return null\n }\n // @computed → Identifier\n if (expr.type === 'Identifier') return expr.name\n return null\n}\n\nfunction superClassName(node: any): string | null {\n const sc = node.superClass\n if (!sc) return null\n if (sc.type === 'Identifier') return sc.name\n if (sc.type === 'MemberExpression' && sc.property?.type === 'Identifier') return sc.property.name\n return null\n}\nexport { superClassName }\n\n/** 提取 render() 方法的函数体与偏移。 */\nfunction extractRenderBody(node: any): { body: any; start: number; end: number } | null {\n for (const member of node.body?.body ?? []) {\n if (member.type !== 'MethodDefinition' && member.type !== 'PropertyDefinition') continue\n if (keyName(member.key) !== 'render') continue\n const fn = member.value\n if (!fn || (fn.type !== 'FunctionExpression' && fn.type !== 'ArrowFunctionExpression')) continue\n const body = fn.body\n if (!body || body.type !== 'BlockStatement') continue\n return { body: body.body, start: body.start + 1, end: body.end - 1 }\n }\n return null\n}\n\n/**\n * U5:单 member 遍历提取类信息——原 extractReactiveFields / extractMembers /\n * extractDepBodies / extractRenderBody 各自一遍类体,现合并为一趟循环。\n * 各块语义与原独立函数逐字一致(首个合法 render 胜出、@computed 字段不看 kind 等)。\n */\nexport interface ClassInfo {\n fields: Map<string, ReactiveField>\n /** `@query` / `@queryAll` 字段名(非响应式 DOM 查询属性,依赖提取按死条目记录) */\n queryFields: Set<string>\n methods: Set<string>\n getters: Set<string>\n /** 方法 / getter / 箭头字段的函数体(name → BlockStatement 节点或表达式体),供依赖提取内联扫描 */\n bodies: Map<string, any>\n render: { body: any; start: number; end: number } | null\n cssVarsBody: any[] | null\n computedBodies: Map<string, any[]>\n}\n\nfunction extractClassInfo(node: any, aliases: Set<string>): ClassInfo {\n const fields = new Map<string, ReactiveField>()\n const queryFields = new Set<string>()\n const methods = new Set<string>()\n const getters = new Set<string>()\n const bodies = new Map<string, any>()\n let render: { body: any; start: number; end: number } | null = null\n let cssVars: any[] | null = null\n const computedBodies = new Map<string, any[]>()\n\n for (const member of node.body?.body ?? []) {\n const name = keyName(member.key)\n\n if (name) {\n // ---- 响应式字段(原 extractReactiveFields) ----\n const decs: string[] = (member.decorators ?? []).map(decoratorName).filter(Boolean) as string[]\n let kind: ReactiveKind | null = null\n for (const d of decs) {\n if (!aliases.has(d)) continue\n if (d === 'prop') kind = 'prop'\n else if (d === 'state') kind = 'state'\n else if (d === 'computed') kind = 'computed'\n if (kind) break\n }\n if (kind === 'computed') {\n fields.set(name, { name, kind, init: undefined, shallow: false })\n } else if (kind) {\n const initNode = member.value\n let shallow = false\n if (initNode && (initNode.type === 'ObjectExpression' || initNode.type === 'ArrayExpression')) {\n shallow = !!((member.decorators ?? []).some((dec: any) => {\n const e = dec.expression\n if (e?.type !== 'CallExpression') return false\n return (e.arguments ?? []).some(\n (a: any) =>\n a.type === 'ObjectExpression' &&\n (a.properties ?? []).some(\n (p: any) => keyName(p.key) === 'shallow' && p.value?.value === true,\n ),\n )\n }))\n }\n fields.set(name, { name, kind, init: undefined, shallow })\n } else if (decs.includes('query') || decs.includes('queryAll')) {\n // @query / @queryAll:非响应式 DOM 查询属性(依赖提取中按死条目记录,不参与根分级)\n queryFields.add(name)\n }\n\n // ---- 方法/getter 名(原 extractMembers) ----\n if (member.type === 'MethodDefinition') {\n if (member.kind === 'get') getters.add(name)\n else methods.add(name)\n const fn = member.value\n if (fn?.body) bodies.set(name, fn.body)\n } else if (member.type === 'PropertyDefinition') {\n // 箭头函数字段也算方法\n const init = member.value\n if (init && (init.type === 'ArrowFunctionExpression' || init.type === 'FunctionExpression')) {\n methods.add(name)\n if (init.body) bodies.set(name, init.body)\n }\n }\n }\n\n // ---- render()(原 extractRenderBody;首个合法 render 胜出) ----\n if (\n !render &&\n (member.type === 'MethodDefinition' || member.type === 'PropertyDefinition') &&\n keyName(member.key) === 'render'\n ) {\n const fn = member.value\n if (fn && (fn.type === 'FunctionExpression' || fn.type === 'ArrowFunctionExpression')) {\n const body = fn.body\n if (body && body.type === 'BlockStatement') {\n render = { body: body.body, start: body.start + 1, end: body.end - 1 }\n }\n }\n }\n\n // ---- cssVars / @computed getter 体(原 extractDepBodies) ----\n if (member.type === 'MethodDefinition' && name) {\n const fn = member.value\n if (fn && (fn.type === 'FunctionExpression' || fn.type === 'ArrowFunctionExpression')) {\n const body = fn.body\n if (body && body.type === 'BlockStatement') {\n if (name === 'cssVars' && member.kind === 'get') {\n cssVars = body.body\n } else if (member.kind === 'get') {\n const gdecs: string[] = (member.decorators ?? []).map(decoratorName).filter(Boolean) as string[]\n if (gdecs.some((d) => aliases.has(d) && d === 'computed')) {\n computedBodies.set(name, body.body)\n }\n }\n }\n }\n }\n }\n return { fields, queryFields, methods, getters, bodies, render, cssVarsBody: cssVars, computedBodies }\n}\n\n/** U5:extractClassInfo 按 class 节点记忆(同文件祖先在依赖提取中被多组件复用)。 */\nconst INFO_CACHE = new WeakMap<object, ClassInfo>()\n\n/** 取某 class 节点的 ClassInfo(WeakMap 记忆;aliases 为文件级常量,同文件命中安全)。 */\nexport function classInfoOf(node: any, aliases: Set<string>): ClassInfo {\n const hit = INFO_CACHE.get(node)\n if (hit) return hit\n const info = extractClassInfo(node, aliases)\n INFO_CACHE.set(node, info)\n return info\n}\n\n/** U5:collectLocalClasses 结果按 ParsedFile 记忆(analyzeFile 与 compile.ts 各调一次,共享同一遍结果)。 */\nconst LOCAL_CLASSES_CACHE = new WeakMap<object, Map<string, any>>()\n\n/** 收集文件内全部 class 声明(本地名 → AST 节点),含 export 形态。继承链与约定检查共用。 */\nexport function collectLocalClasses(parsed: ParsedFile): Map<string, any> {\n const cached = LOCAL_CLASSES_CACHE.get(parsed as object)\n if (cached) return cached\n const localClasses = new Map<string, any>()\n for (const stmt of parsed.program.body ?? []) {\n if (stmt.type === 'ClassDeclaration' && stmt.id?.name) {\n localClasses.set(stmt.id.name, stmt)\n }\n if (stmt.type === 'ExportNamedDeclaration' && stmt.declaration?.type === 'ClassDeclaration') {\n localClasses.set(stmt.declaration.id.name, stmt.declaration)\n }\n if (stmt.type === 'ExportDefaultDeclaration' && stmt.declaration?.type === 'ClassDeclaration') {\n const n = stmt.declaration.id?.name ?? 'default'\n localClasses.set(n, stmt.declaration)\n }\n }\n LOCAL_CLASSES_CACHE.set(parsed as object, localClasses)\n return localClasses\n}\n\n/**\n * 类体是否带 compelem 家族装饰器(`@prop/@state/@computed/@query/@queryAll`)。\n *\n * 这是「该类是不是组件」的**精确判别器**:这些装饰器在运行时全是 no-op,\n * 只在编译期有意义 ⇒ 带它们的类必然意图是组件;反之不带它们的类\n * (`class LiveFieldMap extends Map` 之类)不可能是组件。\n */\nexport function hasCompelemFamilyDecorator(cls: any, aliases: Set<string>): boolean {\n return (cls?.body?.body ?? []).some((m: any) =>\n (m.decorators ?? []).some((d: any) => aliases.has(decoratorName(d) ?? '')),\n )\n}\n\n/** U5:collectMixinClasses 结果按 ParsedFile 记忆。 */\nconst MIXIN_CLASSES_CACHE = new WeakMap<object, any[]>()\n\n/**\n * 收集「mixin 工厂内」的 class 声明 —— **单独成列表,绝不混入 `localClasses`**。\n *\n * ## 为什么需要单独一套\n * `localClasses` 是**按类名**索引的,被 `deps-extract` / `conventions` / `component.ts`\n * 的 D0 拆分用于解析**同文件 super 继承链**。mixin 里的类既不与外部按名关联、\n * 也不在模块作用域,混进去会污染这些按名查找(同名遮蔽、深度计算偏移)。\n *\n * ## 收录条件(三者全满足,缺一不可)\n * 1. 位于**模块顶层函数**的函数体直接语句里(`export function mix(B) { class M extends B {} }`);\n * 不递归进任意嵌套(避免把方法体内的局部类、`if`/`for` 块内的类也收进来)\n * 2. 是 `ClassDeclaration`(**不是** `ClassExpression` —— TS 禁止在 class 表达式上写\n * 装饰器 TS1206,能带 `@prop` 的形态只有 class 声明,见 DESIGN「mixin 装饰器」)\n * 3. 类体带**至少一个 compelem 家族装饰器**(`@prop/@state/@computed/@query/@queryAll`)——\n * 这是精确判别器:`class LiveFieldMap extends Map` 之类无 compelem 装饰器,自动排除\n */\nexport function collectMixinClasses(parsed: ParsedFile, aliases: Set<string>): any[] {\n const cached = MIXIN_CLASSES_CACHE.get(parsed as object)\n if (cached) return cached\n const out: any[] = []\n for (const stmt of parsed.program.body ?? []) {\n const decl =\n stmt.type === 'ExportNamedDeclaration' || stmt.type === 'ExportDefaultDeclaration'\n ? stmt.declaration\n : stmt\n if (decl?.type !== 'FunctionDeclaration' && decl?.type !== 'FunctionExpression') continue\n for (const inner of decl.body?.body ?? []) {\n const cls = inner?.type === 'ClassDeclaration' ? inner : undefined\n if (cls && cls.id?.name && hasCompelemFamilyDecorator(cls, aliases)) out.push(cls)\n }\n }\n MIXIN_CLASSES_CACHE.set(parsed as object, out)\n return out\n}\n\n// `classNodeOf` / `componentClassNode` 已于 2026-10-05 删除:它们是「取组件自身 class\n// AST 节点」的兼容包装(优先 `comp.cls`,回退 `localClasses.get(className)`),\n// 但 8 个调用点早已各自内联同一表达式(`conventions.ts:367`、`deps-extract.ts:287`、\n// `field-extract.ts:141/178`、`template-rules.ts:79/111`、`watch-extract.ts:270`、\n// `compile.ts:322`),全仓零调用。\n//\n// ⚠️ 内联时必须保留 `comp.cls ?? localClasses.get(comp.className)` 这个**双通道**:\n// 只按名查 `localClasses` 只收模块顶层的 `ClassDeclaration`,mixin 工厂内的函数作用域类\n// 按名查不到 → `field-extract` 等会拿到 undefined 而**静默不提取**。\n\n/**\n * 分析单个源文件,返回所有 compelem 组件类的信息。\n *\n * `extraFields` 用于合并基类字段(编译器单文件分析,跨文件继承由调用方\n * 通过 `componentIndex` 提供;本版本仅处理同文件继承 + 无继承两种)。\n */\nexport function analyzeFile(code: string, id: string, parsed: ParsedFile): ComponentAnalysis[] {\n const compelemImports = collectCompelemImports(parsed.imports)\n const aliases = new Set(compelemImports.values())\n const hasCompElemAlias = aliases.has('CompElem')\n\n // 1) 先收集同文件里的 class 声明,建立「本地类名 → 是否 CompElem 子类」映射\n const localClasses = collectLocalClasses(parsed)\n // 1b) mixin 工厂内的 class 声明(单独列表,不进 localClasses —— 见 collectMixinClasses 注释)\n const mixinClasses = collectMixinClasses(parsed, aliases)\n\n const isSub = (cls: any, depth = 0): boolean => {\n if (depth > 8) return false\n const sup = superClassName(cls)\n if (!sup) return false\n if (hasCompElemAlias && sup === 'CompElem') return true\n const parent = localClasses.get(sup)\n if (parent) return isSub(parent, depth + 1)\n return false\n }\n\n const out: ComponentAnalysis[] = []\n const moduleBindings = collectModuleBindings(parsed)\n // 顶层 class(按名索引)+ mixin class(函数作用域,按数组)统一成一份工作表处理\n const worklist: Array<{ className: string; cls: any; isMixin: boolean }> = [\n ...[...localClasses].map(([className, cls]) => ({ className, cls, isMixin: false })),\n ...mixinClasses.map((cls) => ({ className: cls.id.name, cls, isMixin: true })),\n ]\n for (const { className, cls, isMixin } of worklist) {\n const decs: string[] = (cls.decorators ?? []).map(decoratorName).filter(Boolean) as string[]\n // 组件准入三选一:\n // 1) `isSub` —— super 链能在**本文件**内解析到 CompElem(最常见)\n // 2) `@tag` —— 显式声明要注册自定义元素\n // 3) **类体带 compelem 家族装饰器** —— 覆盖前两者都判不出的两类:\n // · mixin 工厂内的类(super 是形参)\n // · **跨文件基类**(super 在别的文件,如 `class FormControl extends AppearanceElem`)\n // 这类 super 解析不出 + 无 @tag ⇒ 不被识别为组件 ⇒ 其 @prop 装饰器\n // 从不剥离,而运行时 @prop 是 no-op ⇒ prop 静默退化成普通实例字段。\n // 判别器是精确的:家族装饰器运行时全 no-op,只在编译期有意义。\n const byDecorator = hasCompelemFamilyDecorator(cls, aliases)\n const sub = isSub(cls)\n if (!sub && !decs.includes('tag') && !byDecorator) continue\n /** 仅靠「带家族装饰器」准入 ⇒ super 链不可知(mixin 形参 / 跨文件基类) */\n const unknownSuperAdmitted = !sub && !decs.includes('tag') && byDecorator\n\n const { fields, queryFields, methods, getters, bodies, render, cssVarsBody, computedBodies } = classInfoOf(cls, aliases)\n const tagDec = (cls.decorators ?? []).find((d: any) => decoratorName(d) === 'tag')\n let tagName: string | undefined\n if (tagDec) {\n const e = tagDec.expression\n if (e?.type === 'CallExpression' && e.arguments?.[0]) {\n const a = e.arguments[0]\n if (a.type === 'Literal' || a.type === 'StringLiteral') tagName = String(a.value)\n }\n }\n\n let degradeReason: string | null = null\n let noView = false\n let skipInjection = false\n\n if (!render) {\n // D0 拆分:无 own render() 时,沿同文件继承链向上找;\n // - 链上有 render → skipInjection(不注入,继承父类 __ce_static__,静态字段经构造器原型链继承)\n // - 链终于 CompElem(其 render() 返回 null)→ noView: true 注入(无视图组件)\n // - 链终于未知跨文件基类 → D6 降级(→ 报错)\n // - @tag 非 CompElem 类 → D0 降级\n // - **super 链不可知者(mixin 形参 / 仅靠装饰器准入的跨文件基类)→ 一律\n // skipInjection**(见下)\n const sup = superClassName(cls)\n if (isMixin || unknownSuperAdmitted) {\n // super 不可知 ⇒ 无法判断基类有没有 render:\n // · 判 skipInjection:字面量 spread 继承基类视图字段。基类有视图 → 继承到(正确);\n // 基类无视图 → spread 得到空,退化为「无静态视图」,DEV 报错,与未编译组件同路径。\n // · **绝不能判 noView**:noView 会跳过 Shadow DOM 创建;若基类其实有 render,\n // 组件将静默白屏(无报错、无降级)——这是最坏的失败形态。\n // · 也**不能**沿用 D6/D0 报错:跨文件基类与 mixin 在真实项目里是常态\n // (compelem-ui 的 FormControl/BaseInput/ControlBox 即是),阻断构建等于不可用。\n skipInjection = true\n } else if (!sup) {\n degradeReason = 'D0: 无 render() 或 render 体不是 BlockStatement'\n } else if (hasCompElemAlias && sup === 'CompElem') {\n noView = true\n } else if (localClasses.has(sup)) {\n // 同文件继承链:向上找首个有 render 的祖先\n let cur: any = cls\n let found = false\n let unknownCrossFile = false\n const seen = new Set<any>()\n while (cur && !seen.has(cur)) {\n seen.add(cur)\n const curSup = superClassName(cur)\n if (!curSup) break\n if (hasCompElemAlias && curSup === 'CompElem') {\n // 链终于 CompElem:整条链上都没有 render(当前类无,祖先若有已被 break)\n // 但上面的循环没检查祖先是否有 render——重新走一遍\n found = false\n break\n }\n if (localClasses.has(curSup)) {\n const parent = localClasses.get(curSup)\n if (extractRenderBody(parent)) {\n found = true\n break\n }\n cur = parent\n continue\n }\n // 跨文件基类:无法判断是否有 render\n unknownCrossFile = true\n break\n }\n if (found) {\n skipInjection = true\n } else if (unknownCrossFile) {\n degradeReason = `D6: 跨文件继承 render(基类 ${sup} 不在本文件)`\n } else {\n // 链终于 CompElem 且整条链无 render → 无视图组件\n noView = true\n }\n } else {\n degradeReason = `D0: 无 render() 且非 CompElem 子类(基类 ${sup} 不在本文件)`\n }\n } else {\n const rets = topLevelReturns(render.body)\n if (rets.length === 0) degradeReason = 'D4: render() 内没有顶层 return'\n else if (rets.length > 1) degradeReason = `D5: render() 有 ${rets.length} 个顶层 return`\n }\n\n out.push({\n className,\n cls,\n start: cls.start,\n end: cls.end,\n bodyStart: cls.body?.start ?? -1,\n tagName,\n fields,\n queryFields,\n ownMethods: methods,\n ownGetters: getters,\n bodies,\n hasRender: !!render,\n renderBody: render?.body ?? null,\n renderBodyStart: render?.start ?? -1,\n renderBodyEnd: render?.end ?? -1,\n cssVarsBody,\n computedBodies,\n degradeReason,\n noView,\n skipInjection,\n isMixin: isMixin || unknownSuperAdmitted,\n compelemImports,\n moduleBindings,\n })\n }\n void code\n void id\n return out\n}\n","/**\n * 静态分析校验闸门(D-rules)—— **compelem 不允许降级**。\n *\n * ## 架构前提\n *\n * 基于signal 模型的 compelem **必须依赖编译器编译后执行**:\n * 值从哪来、何时更新、依赖怎么建,全部由编译期产物的 `pointEffects` / `fx` /\n * `subCells` 决定。运行时**没有**「解析 `render()` + 解释执行」的回退路径。\n *\n * 因此当静态分析无法保证正确性(D 系列命中)时,唯一正确的做法是\n * **编译期报错**,而不是产出一个降级产物 —— 后者在运行时的表现只有两种:\n * ① `__ce_static__.buildTemplate` 缺失 → 组件静默渲染成空白;\n * ② 依赖漏建 → DOM 不更新,且**没有任何报错**。\n * 两种都比构建失败难查一个数量级。\n *\n * 只有两种结果:**通过**,或**抛错**。\n *\n * | 规则 | 含义 | 处理 |\n * |---|---|---|\n * | D0 | 无 render() 或 render 体不是 BlockStatement | 报错 |\n * | D3 | 自由标识符(不在 import / 模块级声明 / 词法作用域内) | 报错 |\n * | D4 | render() 无顶层 return | 报错 |\n * | D5 | render() 有多个顶层 return | 报错 |\n * | D6 | 跨文件继承 render(基类不在本文件) | 报错 |\n * | D7 | 模板插值位置直接嵌套 h`` 模板(可修的写法违规) | 报错 |\n *\n * 动态成员访问(D1)与访问非响应式 getter(D2):内联产物每轮求值 + 动态建链兜住,\n * 不需要拒绝。\n *\n * ## 错误如何被消费\n *\n * - **Vite 插件**(`vite.ts`):`res.diagnostics` 里 `degraded === true`\n * 的条目**一律**走 `reportErrors(..., 'error')` 阻断构建,无力度选项。\n * - **API `compileFile`**:`decideDegrade` 命中**直接抛 `StaticAnalysisError`**,\n * 不返回产物。\n *\n */\nimport type { ComponentAnalysis } from '../types'\nimport type { RenderAnalysis } from './render-body'\n\n/**\n * 汇总单个组件的静态分析结论。\n * 命中任何一条 ⇒ 抛错(调用方拿不到「凑合能跑」的产物)。\n */\nexport function decideDegrade(comp: ComponentAnalysis, ra: RenderAnalysis): { degraded: false; reason: null; errors: RenderAnalysis['errors'] } {\n const reasons: string[] = []\n if (comp.degradeReason) reasons.push(comp.degradeReason)\n reasons.push(...ra.degrades)\n // D7 命中的模板其 vars 编号非线性,编译期无法可靠生成扁平取值代码 → 同样不可编译\n for (const e of ra.errors) reasons.push(e.message)\n if (reasons.length) {\n throw new StaticAnalysisError(comp.className, [...new Set(reasons)], ra.errors)\n }\n return { degraded: false, reason: null, errors: [] }\n}\n\n/**\n * 静态分析未通过。`name` 让它在堆栈里一眼可辨。 */\nexport class StaticAnalysisError extends Error {\n readonly className: string\n readonly reasons: string[]\n readonly errors: RenderAnalysis['errors']\n\n constructor(className: string, reasons: string[], errors: RenderAnalysis['errors'] = []) {\n super(\n `[compelem] 组件 ${className} 未通过静态分析,compelem 不支持降级:` +\n reasons.map((r) => `\\n · ${r}`).join(''),\n )\n this.name = 'StaticAnalysisError'\n this.className = className\n this.reasons = reasons\n this.errors = errors\n }\n}\n","/**\n * 模板插值里允许出现的**全局白名单**\n */\nexport const KNOWN_GLOBALS: ReadonlySet<string> = new Set([\n // 值类型与构造\n 'Object', 'Array', 'String', 'Number', 'Boolean', 'Symbol', 'BigInt', 'RegExp', 'Date',\n 'Map', 'Set', 'WeakMap', 'WeakSet', 'WeakRef', 'FinalizationRegistry', 'Promise',\n 'ArrayBuffer', 'SharedArrayBuffer', 'DataView', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray',\n 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array',\n 'BigInt64Array', 'BigUint64Array',\n 'Error', 'TypeError', 'RangeError', 'SyntaxError', 'ReferenceError', 'EvalError', 'URIError',\n 'Proxy', 'Reflect', 'Intl',\n // 字面量与纯函数\n 'undefined', 'null', 'true', 'false', 'NaN', 'Infinity',\n 'Math', 'JSON', 'isNaN', 'isFinite', 'parseInt', 'parseFloat',\n 'encodeURI', 'decodeURI', 'encodeURIComponent', 'decodeURIComponent',\n 'escape', 'unescape', 'structuredClone',\n // 平台 / DOM\n 'console', 'window', 'document', 'globalThis', 'navigator', 'location', 'history',\n 'localStorage', 'sessionStorage', 'performance', 'crypto',\n 'fetch', 'Headers', 'Request', 'Response', 'FormData', 'Blob', 'File', 'URL', 'URLSearchParams',\n 'AbortController', 'AbortSignal', 'Event', 'CustomEvent', 'EventTarget', 'MessageChannel',\n 'Node', 'Element', 'HTMLElement', 'HTMLInputElement', 'HTMLTextAreaElement', 'HTMLSelectElement',\n 'HTMLTemplateElement', 'HTMLSlotElement', 'HTMLAnchorElement', 'HTMLImageElement', 'SVGElement',\n 'Text', 'Comment', 'DocumentFragment', 'ShadowRoot', 'CSSStyleSheet', 'CSSStyleDeclaration',\n 'DOMParser', 'XMLSerializer', 'Image', 'Audio', 'Option', 'TextEncoder', 'TextDecoder',\n 'atob', 'btoa',\n 'getComputedStyle', 'matchMedia', 'requestAnimationFrame', 'cancelAnimationFrame',\n 'requestIdleCallback', 'cancelIdleCallback',\n 'ResizeObserver', 'IntersectionObserver', 'MutationObserver', 'PerformanceObserver',\n 'setTimeout', 'clearTimeout', 'setInterval', 'clearInterval', 'queueMicrotask',\n])\n\n/**\n * 上述全局中**不纯**的子集:取值依赖外部状态 / 时钟,静态依赖映射无法归因\n * → 引用它们的表达式整体归入「常脏」(任一视图更新都重算,与全量求值行为一致)。\n */\nexport const IMPURE_GLOBALS: ReadonlySet<string> = new Set([\n 'Date', 'console', 'window', 'document', 'globalThis', 'navigator', 'location', 'history',\n 'localStorage', 'sessionStorage', 'performance', 'crypto', 'fetch', 'Math', 'JSON',\n 'Event', 'CustomEvent', 'EventTarget', 'MessageChannel',\n])\n","/**\n * 模板形态分析。\n *\n * 本模块做两件事:\n * 1. **D7 违规检测**:模板插值位置不得「直接嵌套」另一个模板(禁止写法)。\n * 2. (后续 B 步骤)静态解析模板 HTML 结构,产出 html / updatePointMetas / skipVarIdx。\n *\n * ## D7 为什么必须禁(背景)\n *\n * 模板解析遇到嵌套在插值里的 Template 会**就地 splice 展开**,\n * 使 `varIndex` 编号不再与模板的 quasis 下标线性对应:\n *\n * ```ts\n * // 会 splice → 编号非线性\n * h`<div>${h`<span>${a}</span>`} ${b}</div>`\n * // 不会 splice → 编号线性\n * h`<div>${ifTrue(c, () => h`<span>${a}</span>`)} ${b}</div>`\n * ```\n *\n * 禁止前者后,`varIndex` 变纯线性递增 → 编译器可以「一个 quasis 下标 ↔ 一个更新点」\n * 直接生成扁平取值代码(C 步骤的前提)。\n *\n * ## 判定边界:为什么「指令回调里的模板」不算嵌套\n *\n * 关键在**求值时机**。模板字面量求值时,`${}` 里的插值表达式会被立刻求值并放进\n * `Template.vars`;而指令回调是**未被调用的函数**,其体内的模板要到 executor 运行时\n * 才求值,压根进不了 `vars`。因此:\n *\n * - `${h`...`}` / `${cond ? h`...` : ''}` → 插值一求值就产生 Template 实例 → 命中\n * - `${ifTrue(c, () => h`...`)}` → 插值是 DirectiveInstance → 不命中\n *\n * 判定规则因此是:**从插值位置出发,不穿过任何函数边界就能到达 `h` 模板 → 违规。**\n */\nimport type { ComponentAnalysis } from '../types'\n\n/** 插值位置上允许「穿透」继续向内检查的表达式类型。 */\nconst PASSTHROUGH = new Set([\n 'ConditionalExpression', // cond ? h`` : ''\n 'LogicalExpression', // cond || h``\n 'SequenceExpression', // (a, h``)\n])\n\n/** 函数边界:越过它就离开了当前模板的插值结构。 */\nconst FN_BOUNDARY = new Set([\n 'ArrowFunctionExpression',\n 'FunctionExpression',\n 'FunctionDeclaration',\n])\n\nexport interface TemplateIssue {\n /** 违规模板在源码中的起始/结束偏移 */\n start: number\n end: number\n /** 违规插值表达式的偏移 */\n exprStart: number\n exprEnd: number\n message: string\n}\n\n/**\n * 从插值表达式出发,判断能否「不穿过函数边界」就到达一个 h 模板。\n * @returns 命中的 h 模板节点,无则 null\n */\nexport function reachesBareTemplate(node: any, hAliases: Set<string>, depth = 0): any | null {\n if (!node || typeof node.type !== 'string') return null\n if (depth > 32) return null\n\n // 函数边界:回调体内的模板不属于本模板的插值结构\n if (FN_BOUNDARY.has(node.type)) return null\n\n if (node.type === 'TaggedTemplateExpression') {\n const tag = node.tag\n if (tag?.type === 'Identifier' && hAliases.has(tag.name)) return node\n // 非 h 的标签模板(罕见):其内部插值继续查\n for (const e of node.quasi?.expressions ?? []) {\n const hit = reachesBareTemplate(e, hAliases, depth + 1)\n if (hit) return hit\n }\n return null\n }\n\n // 裸模板字符串里再嵌 h 模板:`${`x${h``}`}`\n if (node.type === 'TemplateLiteral') {\n for (const e of node.expressions ?? []) {\n const hit = reachesBareTemplate(e, hAliases, depth + 1)\n if (hit) return hit\n }\n return null\n }\n\n // 函数调用:实参里的 h 模板会被立刻求值;\n // 指令回调由上面的 FN_BOUNDARY 拦掉,故此处下钻 arguments 不会误报。\n if (node.type === 'CallExpression' || node.type === 'NewExpression') {\n for (const a of node.arguments ?? []) {\n const hit = reachesBareTemplate(a, hAliases, depth + 1)\n if (hit) return hit\n }\n return null\n }\n\n if (PASSTHROUGH.has(node.type)) {\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end') continue\n const c = node[key]\n if (Array.isArray(c)) {\n for (const x of c) {\n const hit = reachesBareTemplate(x, hAliases, depth + 1)\n if (hit) return hit\n }\n } else if (c && typeof c === 'object' && typeof c.type === 'string') {\n const hit = reachesBareTemplate(c, hAliases, depth + 1)\n if (hit) return hit\n }\n }\n }\n\n return null\n}\n\n/** 找出源码里 h 标签函数的全部别名(通常就是 `h`,import 时可改名)。 */\nexport function collectTemplateTagAliases(comp: ComponentAnalysis): Set<string> {\n const out = new Set<string>()\n for (const [local, imported] of comp.compelemImports) {\n if (imported === 'h') out.add(local)\n }\n return out\n}\n\n/** 判断节点是否是一个 h`` 模板。 */\nfunction isHTemplate(node: any, hAliases: Set<string>): boolean {\n if (!node || node.type !== 'TaggedTemplateExpression') return false\n const tag = node.tag\n return !!tag && tag.type === 'Identifier' && hAliases.has(tag.name)\n}\n\n/**\n * U5:检查单个 h`` 模板节点的全部插值(D7),把违规追加到 out。\n * analyzeRender 内联 D7 检查(renderBody 单 walk)与 param-defaults 子树扫描共用。\n */\nexport function d7IssuesAt(node: any, hAliases: Set<string>, out: TemplateIssue[]): void {\n for (const expr of node.quasi?.expressions ?? []) {\n const hit = reachesBareTemplate(expr, hAliases)\n if (hit) {\n out.push({\n start: node.start,\n end: node.end,\n exprStart: expr.start,\n exprEnd: expr.end,\n message:\n 'D7: 模板插值位置禁止直接嵌套另一个 h`` 模板;' +\n '请改用 ifTrue / ifElse / forEach 等指令包裹(回调内的模板不进入 vars)',\n })\n }\n }\n}\n\n/**\n * U5:在子树内收集全部 D7 违规(DFS 前序,与 collectTemplateIssues 单遍语义一致)。\n * analyzeRender 用它扫描「主 scan 不进入」的函数参数默认值区域,保持覆盖对等。\n * ⚠️ 不 return 于 h`` 节点:指令回调里的模板自身插值同样要检查(继续下钻)。\n */\nexport function collectIssuesInSubtree(\n node: any,\n hAliases: Set<string>,\n out: TemplateIssue[],\n seen?: WeakSet<object>,\n): void {\n const s = seen ?? new WeakSet<object>()\n const visit = (n: any): void => {\n if (!n || typeof n !== 'object' || typeof n.type !== 'string') return\n if (s.has(n)) return\n s.add(n)\n if (isHTemplate(n, hAliases)) d7IssuesAt(n, hAliases, out)\n for (const key of Object.keys(n)) {\n if (key === 'type' || key === 'start' || key === 'end') continue\n const c = n[key]\n if (Array.isArray(c)) for (const x of c) visit(x)\n else if (c && typeof c === 'object' && typeof c.type === 'string') visit(c)\n }\n }\n visit(node)\n}\n\n/**\n * 扫描 render() 函数体,收集全部 D7 违规。\n *\n * 每个 h 模板的每个插值表达式都会单独检查;命中的插值各自报告一次,\n * 便于一次性定位所有待改点。\n */\nexport function collectTemplateIssues(comp: ComponentAnalysis): TemplateIssue[] {\n const hAliases = collectTemplateTagAliases(comp)\n if (!hAliases.size) return []\n\n const issues: TemplateIssue[] = []\n const seen = new WeakSet<object>()\n for (const stmt of comp.renderBody ?? []) collectIssuesInSubtree(stmt, hAliases, issues, seen)\n return issues\n}\n","/**\n * render() 函数体的依赖提取与结构分析。\n *\n * 这是编译器最关键的一层。核心规则(已由 DEPENDENCY-MODEL.md 的 7/7 实测确认):\n *\n * 1. 只有「响应式字段白名单」内的成员访问(`this.x`)才推入依赖收集列表。\n * `this.someMethod` / `this.slots` / `this.inputRef` 普通访问不推入。\n * 2. 深层路径(`this.obj.deep`)推 `obj.deep`;根对象推 `obj`。\n * 3. `@computed` 只推入自身属性名,不展开其内部依赖。\n * 4. 指令实参的作用域归属:\n * - `ifElse(cond, a, b)` 的 `cond` → 调用方作用域(主视图)\n * - `forEach(list, keyFn, tmplFn)` 的 `list`/`keyFn` → 调用方作用域\n * - 指令的**模板回调体**(`a` / `b` / `tmplFn`)→ 子视图(per-UpdatePoint)\n */\nimport type { ComponentAnalysis } from '../types'\nimport { isFreeIdentifierRef, keyName } from '../utils/oxc'\nimport { KNOWN_GLOBALS } from '../utils/globals'\nimport {\n collectIssuesInSubtree,\n collectTemplateTagAliases,\n d7IssuesAt,\n type TemplateIssue,\n} from './template'\n\n/** compelem 内置指令名集合(用于识别「模板回调实参」的位置)。 */\nexport const COMpelem_DIRECTIVES = new Set([\n 'bind', 'show', 'model', 'classes', 'styles',\n 'forEach', 'ifTrue', 'ifElse', 'when', 'slot', 'html',\n])\n\n/** 指令实参中,哪些下标是「模板回调」(其函数体属于子视图)。导出供 template-subs 分区。 */\nexport const TEMPLATE_ARG_INDEX: Record<string, number[] | 'rest-after-0'> = {\n ifTrue: [1],\n ifElse: [1, 2],\n forEach: [2],\n slot: [0],\n when: 'rest-after-0',\n}\n\ninterface ScanCtx {\n comp: ComponentAnalysis\n /** 当前扫描作用域:main = 主视图,sub = 某个指令的模板回调体 */\n inSub: boolean\n /** 主视图依赖收集 */\n mainDeps: Set<string>\n /** 子视图依赖:指令「节点标识」→ 路径集合。用回调节点的 start 偏移做标识(回调唯一) */\n subDeps: Map<number, Set<string>>\n /** 子视图所属回调节点 start(inSub 时有效) */\n subKey: number\n /** 遇到的降级信号 */\n degrades: string[]\n /** 已访问节点,防止 oxc 节点上的意外回指造成无限递归 */\n seen: WeakSet<object>\n /**\n * 当前词法作用域内已绑定的标识符(形参、局部变量、模块级声明)。\n * 出现在此集合里的 Identifier 不是「自由标识符」,不触发 D3。\n */\n bound: Set<string>\n /** U5:h 标签别名(D7 检查 + 主模板命中识别) */\n hAliases: Set<string>\n /** U5:D7 违规收集(原 collectTemplateIssues 独立一遍,现并入本 scan——renderBody 单 walk) */\n issues: TemplateIssue[]\n /** 当前所在函数嵌套深度(0 = render 顶层;主模板 h`` 只在 0 层可命中) */\n fnDepth: number\n /** 可选 sink:主模板 h`` 节点(供 extractMainTemplate 免重扫) */\n sinks?: { mainHits: any[] }\n}\n\n/**\n * 把一条 `this.a.b.c` 链还原为字段路径。\n *\n * 从**最外层** MemberExpression 出发向内回溯;返回 `['a','b','c']`,\n * 非 this 起始或含 computed 访问时返回 null。\n */\nfunction thisChain(node: any): string[] | null {\n const chain: string[] = []\n let cur: any = node\n while (cur && (cur.type === 'MemberExpression' || cur.type === 'OptionalMemberExpression')) {\n if (cur.computed) return null // this[x] / a[x] → 动态访问\n const name = keyName(cur.property)\n if (!name) return null\n chain.unshift(name)\n cur = cur.object\n }\n if (!cur || cur.type !== 'ThisExpression') return null\n return chain.length ? chain : null\n}\n\n/** 记录一条依赖到当前作用域。 */\nfunction record(ctx: ScanCtx, path: string[]) {\n const target = ctx.inSub ? (ctx.subDeps.get(ctx.subKey) ?? new Set<string>()) : ctx.mainDeps\n const full = path.join('.')\n target.add(full)\n // 根对象也推入(Proxy get 会把中间层路径推入)\n if (path.length > 1) target.add(path[0])\n if (ctx.inSub) ctx.subDeps.set(ctx.subKey, target)\n}\n\n/**\n * 扫描函数体,递归处理指令。\n *\n * `nodes` 为语句数组(非单个表达式),保证只扫当前函数体的顶层内容。\n */\nfunction scan(ctx: ScanCtx, nodes: any[]) {\n for (const stmt of nodes) scanNode(ctx, stmt, null)\n}\n\n/** 收集一个函数节点的形参名。 */\nfunction collectParams(fn: any, into: Set<string>) {\n for (const p of fn.params ?? []) collectPatternNames(p, into)\n}\n\n/** 收集解构/简单绑定模式里的所有标识符名。 */\nfunction collectPatternNames(pat: any, into: Set<string>) {\n if (!pat) return\n switch (pat.type) {\n case 'Identifier':\n into.add(pat.name)\n break\n case 'ObjectPattern':\n for (const prop of pat.properties ?? []) {\n if (prop.type === 'RestElement') collectPatternNames(prop.argument, into)\n else collectPatternNames(prop.value ?? prop.key, into)\n }\n break\n case 'ArrayPattern':\n for (const el of pat.elements ?? []) collectPatternNames(el, into)\n break\n case 'AssignmentPattern':\n collectPatternNames(pat.left, into)\n break\n case 'RestElement':\n collectPatternNames(pat.argument, into)\n break\n case 'TSParameterProperty':\n collectPatternNames(pat.parameter, into)\n break\n }\n}\n\n/**\n * U5:函数参数子树的 D7 扫描。\n *\n * 主 scan 的 isFn 分支只收集形参名(collectParams),不下钻 params——\n * 而原 collectTemplateIssues 是通用全量下钻(含参数默认值)。\n * 为保持 D7 覆盖对等,这里对每个 param 整棵子树跑一遍与原 visit 等价的收集。\n */\nfunction scanParamsD7(ctx: ScanCtx, params: any[]): void {\n for (const p of params ?? []) collectIssuesInSubtree(p, ctx.hAliases, ctx.issues)\n}\n\n/** 收集函数体顶层(不下钻嵌套函数)的所有局部声明名。 */\nexport function collectLocals(bodyNodes: any[], into: Set<string>) {\n const stack = [...bodyNodes]\n while (stack.length) {\n const n = stack.pop()\n if (!n || typeof n.type !== 'string') continue\n if (\n n.type === 'FunctionDeclaration' ||\n n.type === 'FunctionExpression' ||\n n.type === 'ArrowFunctionExpression' ||\n n.type === 'ClassDeclaration'\n ) {\n // 嵌套函数自身的名字对当前作用域可见,但其内部声明不可见\n if (n.type === 'FunctionDeclaration' && n.id?.name) into.add(n.id.name)\n continue\n }\n if (n.type === 'VariableDeclaration') {\n for (const d of n.declarations ?? []) collectPatternNames(d.id, into)\n }\n if (n.type === 'ClassDeclaration' && n.id?.name) into.add(n.id.name)\n for (const key of Object.keys(n)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const c: any = n[key]\n if (Array.isArray(c)) {\n for (const x of c) if (x && typeof x.type === 'string') stack.push(x)\n } else if (c && typeof c === 'object' && typeof c.type === 'string') {\n stack.push(c)\n }\n }\n }\n}\n\n/** 在受限的 bound 集合下执行 fn,返回后恢复原集合。 */\nfunction withBound<T>(ctx: ScanCtx, extra: Iterable<string>, fn: () => T): T {\n const added: string[] = []\n for (const n of extra) {\n if (!ctx.bound.has(n)) {\n ctx.bound.add(n)\n added.push(n)\n }\n }\n try {\n return fn()\n } finally {\n for (const n of added) ctx.bound.delete(n)\n }\n}\n\nfunction scanNode(ctx: ScanCtx, node: any, parent: any) {\n if (!node || typeof node !== 'object' || typeof node.type !== 'string') return\n // 防环:oxc 节点可能带非枚举回指;同时避免同一子树被重复扫描\n if (!ctx.seen) ctx.seen = new WeakSet<object>()\n if (ctx.seen.has(node)) return\n ctx.seen.add(node)\n\n // --- U5:D7 内联检查 + 主模板节点收集(原 collectTemplateIssues / extractMainTemplate 各自一遍的 walk,现并入本 scan) ---\n if (node.type === 'TaggedTemplateExpression' && node.tag?.type === 'Identifier' && ctx.hAliases.has(node.tag.name)) {\n d7IssuesAt(node, ctx.hAliases, ctx.issues)\n if (ctx.fnDepth === 0 && ctx.sinks) ctx.sinks.mainHits.push(node)\n }\n\n // --- 响应式字段访问:this.x / this.x.y.z ---\n // 只在「链的最外层」处理一次:多层链的内层节点(this.obj、this.obj.deep)由父节点统一记录,\n // 避免重复与路径截断。判定条件不能用 `node.object === ThisExpression`(那只覆盖单层),\n // 必须靠「父节点不是把本节点当 object 的 MemberExpression」+ 链回溯到 this。\n if (node.type === 'MemberExpression' || node.type === 'OptionalMemberExpression') {\n const parentIsMember =\n parent &&\n (parent.type === 'MemberExpression' || parent.type === 'OptionalMemberExpression') &&\n parent.object === node\n if (!parentIsMember) {\n // 整条链的最外层;thisChain 内部会校验链根是否为 ThisExpression\n const chain = thisChain(node)\n if (chain !== null) {\n const root = chain[0]\n const field = ctx.comp.fields.get(root)\n if (field) {\n record(ctx, chain)\n } else if (ctx.comp.ownMethods.has(root)) {\n // 自有方法值不可变 → 不推入依赖,也不降级。\n } else {\n // 普通 getter(以及跨文件基类的未知成员)。\n //\n // 普通 getter 的链按依赖记录:getter 内部可能读响应式字段,静态推不出,\n // 但取值表达式内联后每轮 effect 都会重新求值 → 依赖在执行期动态建立\n // (getter 读 `this.__s.a.value` 即建链),由动态订阅兜住正确性。\n // 派生 getter 是生态里最常见的写法,不该因静态推不出而放弃静态管线。\n record(ctx, chain)\n }\n // 自有方法调用(this.goto、this.fmt)不推入依赖,也不降级:值不可变、不影响正确性。\n } else if (node.object?.type === 'ThisExpression' && node.computed) {\n // this[expr] 动态访问:静态推不出依赖,但内联产物里表达式按源改写 this→rc\n // 后每轮 effect 求值,取值经注入访问器读 __s.*.value 动态建链(build-vars 侧\n // classifyThisChain 归入 uncertain/常脏)。静态推不出只意味着「无法预过滤」,\n // 正确性由 per-point effect 的动态 track + 求值期建链兜住。\n }\n }\n }\n\n // --- 调用 compelem 指令:区分「实参」与「模板回调」 ---\n if (node.type === 'CallExpression' && node.callee?.type === 'Identifier') {\n const fnName = node.callee.name\n const importedAs = ctx.comp.compelemImports.get(fnName)\n const isDirective = !!importedAs && COMpelem_DIRECTIVES.has(importedAs)\n\n if (isDirective) {\n const tmplIdx = TEMPLATE_ARG_INDEX[importedAs]\n const args: any[] = node.arguments ?? []\n args.forEach((arg: any, i: number) => {\n const isTemplate =\n tmplIdx === 'rest-after-0' ? i >= 1 : Array.isArray(tmplIdx) && tmplIdx.includes(i)\n if (isTemplate && (arg.type === 'ArrowFunctionExpression' || arg.type === 'FunctionExpression')) {\n const key = arg.start\n const prev = ctx.subKey\n ctx.subKey = key\n const wasSub = ctx.inSub\n ctx.inSub = true\n // 回调形参与局部变量属于子视图作用域\n const names = new Set<string>()\n collectParams(arg, names)\n scanParamsD7(ctx, arg.params)\n if (arg.body?.type === 'BlockStatement') collectLocals(arg.body.body, names)\n ctx.fnDepth++\n withBound(ctx, names, () => {\n if (arg.body?.type === 'BlockStatement') scan(ctx, arg.body.body)\n else scanNode(ctx, arg.body, arg)\n })\n ctx.fnDepth--\n ctx.inSub = wasSub\n ctx.subKey = prev\n return\n }\n // 非模板实参:属于调用方作用域\n scanNode(ctx, arg, node)\n })\n // 不继续按通用规则下钻(已手动处理实参)\n return\n }\n\n // 其他函数调用:若 callee 是自由标识符且不在 import/指令白名单 → D3\n if (isFreeIdentifierRef(node.callee, node)) {\n const local = node.callee.name\n if (!ctx.bound.has(local) && !ctx.comp.compelemImports.has(local) && !isKnownGlobal(local)) {\n ctx.degrades.push(`D3: render() 内调用未知自由标识符 ${local}()`)\n }\n }\n }\n\n // --- 自由标识符引用(非调用位)--- D3\n if (node.type === 'Identifier' && isFreeIdentifierRef(node, parent)) {\n const local = node.name\n if (!ctx.bound.has(local) && !ctx.comp.compelemImports.has(local) && !isKnownGlobal(local)) {\n ctx.degrades.push(`D3: render() 内出现未知自由标识符 ${local}`)\n }\n }\n\n // 通用下钻。\n //\n // 嵌套函数(非指令模板回调的那些,如 `list.find(it => it.id === this.x)` 里的箭头函数)\n // 必须继续下钻:其中的 `this.x` 读取同样会被推入依赖。这里只把它们的形参/局部变量\n // 并入 bound 作用域后递归。\n const isFn =\n node.type === 'ArrowFunctionExpression' ||\n node.type === 'FunctionExpression' ||\n node.type === 'FunctionDeclaration'\n if (isFn) {\n const names = new Set<string>()\n collectParams(node, names)\n scanParamsD7(ctx, node.params)\n if (node.body?.type === 'BlockStatement') collectLocals(node.body.body, names)\n ctx.fnDepth++\n withBound(ctx, names, () => {\n if (node.body?.type === 'BlockStatement') scan(ctx, node.body.body)\n else scanNode(ctx, node.body, node)\n })\n ctx.fnDepth--\n return\n }\n\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const child = node[key]\n if (Array.isArray(child)) {\n for (const c of child) scanNode(ctx, c, node)\n } else if (child && typeof child === 'object' && typeof child.type === 'string') {\n scanNode(ctx, child, node)\n }\n }\n}\n\n// 全局白名单见 utils/globals.ts(与 build-vars 共用同一份,避免两处名单分叉)\nfunction isKnownGlobal(name: string): boolean {\n return KNOWN_GLOBALS.has(name)\n}\n\n/** 主视图依赖提取结果。 */\nexport interface RenderAnalysis {\n /** 主视图依赖路径(对应 ViewDepMap) */\n viewDeps: string[]\n /** 子视图依赖:回调节点 start 偏移 → 路径列表 */\n subViewDeps: Map<number, string[]>\n /** 降级原因列表(空表示未降级) */\n degrades: string[]\n /**\n * 硬性违规(当前只有 D7:模板内直接嵌套模板)。\n *\n * 与 degrades 的区别:degrades 是「静态推不出,放弃注入(降级)」,\n * errors 是「写法违反约束,必须改代码」——二者都导致降级,但 errors 需要在\n * 构建期报给用户,因为它是可修的、且修掉后才能启用编译期产物。\n */\n errors: TemplateIssue[]\n}\n\n/** 对单个组件的 render() 做依赖分析。 */\nexport function analyzeRender(comp: ComponentAnalysis, sinks?: { mainHits: any[] }): RenderAnalysis {\n const bound = new Set<string>(comp.moduleBindings ?? [])\n //render 顶层局部声明(const/let/var/function)不是「未知自由标识符」——与嵌套函数\n //(isFn 分支 collectLocals)和指令回调(collectParams/collectLocals)同规则。\n //D3 只拦真正未声明的标识符;模板插值引用到的局部变量由 filterFree\n //给出准确原因(buildvars-e2e §E 的正则已预留该分类)。\n if (Array.isArray(comp.renderBody)) collectLocals(comp.renderBody, bound)\n const ctx: ScanCtx = {\n comp,\n inSub: false,\n mainDeps: new Set<string>(),\n subDeps: new Map<number, Set<string>>(),\n subKey: -1,\n degrades: [],\n seen: new WeakSet<object>(),\n bound,\n hAliases: collectTemplateTagAliases(comp),\n issues: [],\n fnDepth: 0,\n sinks,\n }\n if (comp.renderBody) scan(ctx, comp.renderBody)\n\n // 去重降级原因\n const degrades = [...new Set(ctx.degrades)]\n const subViewDeps = new Map<number, string[]>()\n for (const [k, v] of ctx.subDeps) subViewDeps.set(k, [...v])\n\n return {\n viewDeps: [...ctx.mainDeps],\n subViewDeps,\n degrades,\n errors: ctx.issues,\n }\n}\n","/**\n * @compelem/compiler — 类型定义\n *\n * 与 compelem 侧 `CompiledStatic`(src/types.ts)保持结构一致。\n * 双份定义的取舍:compiler 不应强依赖 compelem 的类型包(peer 可选),\n * 因此本地镜像一份,并在 `test/` 里做一致性断言防止漂移。\n */\n\n/**\n * 每个类的 `props`/`states`/`computedGetters` 都是**沿构造器原型链浅替换合并后的\n * 完整表**(子类字面量叠加 `Reflect.getPrototypeOf(this).__ce_static__`)。\n */\n\n/** debug 分块产物的整行注释前缀:`//////// …… <标签>`(纯注释、不改行为)。产物默认按块生成,无开关。 */\nexport const DEBUG_DIV = '////////////////////////////////////'\n\n/**\n * 编译器注入到组件类上的静态成员。\n * 强制编译插件模式:`buildTemplate` 准入静态视图路径(缺失 = 无视图,无运行时回退);\n * 其余字段可选。取值表达式一律内联进 fx/pointEffects 工厂,产物不携带取值函数或\n * 静态依赖元数据;依赖在 effect 运行期动态建立(DepSummary 仅在 compile.ts 内部\n * 计算,供 verbose 展示)。\n */\nexport interface CompiledStatic {\n version: number\n /**\n * `buildTemplate` 静态实现:纯 `document` API 建 DOM 函数\n * (以首个组件实例为 `this` 调用;与 compelem 侧 `CompiledStatic.buildTemplate` 同形)。\n */\n buildTemplate?: (this: any) => {\n fragment: any\n ups: any[]\n emptyEvents?: Record<number, string[]>\n /** 文档序元素+文本节点(与 nodeSn 对齐;运行时免 collectNodes 回扫) */\n nodes?: any[]\n updateSns?: number[]\n updatePaths?: number[][]\n }\n /** `@watch` 编译期解析产物(`analyze/watch-extract.ts` 序列化,装饰器被删时必须注入) */\n watchers?: CompiledWatcher[]\n /**\n * 结构指令模板回调的子视图 codegen:`__subId` → 独立 buildTemplate + fx/pointEffects。\n * 运行时结构指令经 `fn.__subId` 查表消费;缺失按构建期报错处理。\n */\n subViews?: Record<\n number,\n {\n buildTemplate?: (this: any) => {\n fragment: any\n ups: any[]\n emptyEvents?: Record<number, string[]>\n nodes?: any[]\n updateSns?: number[]\n updatePaths?: number[][]\n }\n }\n >\n /**\n * 无视图组件标记:render() 不存在 / 返回 null / 继承链终点为 CompElem(其\n * `render()` 返回 null)。注入后运行时不创建 Shadow DOM,仅支持 HOST/GLOBAL 样式。\n */\n noView?: boolean\n /*\n * `diag` 不在产物契约里:降级信息只经 `compileResult.diagnostics` 出口。\n * 未通过静态分析的组件直接抛 `StaticAnalysisError`,不存在带 `degraded: true`\n * 的产物。\n */\n}\n\n/** `@watch` 编译期解析条目(与 compelem `CompiledWatcher` 同形) */\nexport interface CompiledWatcher {\n name: string\n sources: string[]\n deep?: boolean\n immediate?: boolean\n once?: boolean\n static?: boolean\n}\n\n/** 响应式字段类别,用于判定「该成员是否会被推入依赖收集列表」。 */\nexport type ReactiveKind = 'prop' | 'state' | 'computed'\n\n/** 组件内一个响应式成员的信息。 */\nexport interface ReactiveField {\n name: string\n kind: ReactiveKind\n /** 静态初始化器里的默认值表达式源码(用于静态取值内联),无则 undefined */\n init?: string\n /** 是否为深层对象(init 是对象/数组字面量),影响依赖路径展开 */\n shallow: boolean\n}\n\n/** 一个组件的完整静态分析结果。 */\nexport interface ComponentAnalysis {\n className: string\n /**\n * 该组件的 class AST 节点本体。\n *\n * 直接随分析结果下发节点本身:按名反查 `localClasses` 只覆盖**模块顶层**的\n * `ClassDeclaration`,mixin 工厂内的类在函数作用域里按名查不到,会让\n * `field-extract` / `watch-extract` / `conventions` 拿到 `undefined` 而静默\n * 什么都不做。\n */\n cls?: any\n /** 源文件中该 class 声明的起始/结束偏移(用于 MagicString 注入) */\n start: number\n end: number\n /**\n * 类体左花括号 `{` 的源码偏移(`cls.body.start`)。\n *\n * 注入锚点必须是它,不能用 `code.indexOf('{', start)` —— `extends mixin({ a: 1 })`\n * 里第一个 `{` 落在 extends 子句中,扫到那里会把 `static __ce_static__` 插进\n * 对象字面量里,产出整模块语法错误。-1 表示无 AST 可用(调用方应回退扫描)。\n */\n bodyStart: number\n /** `@tag` 名称,无则 undefined */\n tagName?: string\n /** 响应式字段(含继承链上收集到的,按声明顺序) */\n fields: Map<string, ReactiveField>\n /** 本类自身定义的实例方法名(用于 D2 降级判定) */\n ownMethods: Set<string>\n /** 本类自身定义的 getter 名(`@computed` 之外的普通 getter,D2 视为方法) */\n ownGetters: Set<string>\n /** 是否有 render() */\n hasRender: boolean\n /** render() 函数体 AST(Program 级 node),无则 null */\n renderBody: any | null\n /** render() 函数体在源码中的偏移区间(不含大括号) */\n renderBodyStart: number\n renderBodyEnd: number\n /** `get cssVars()` 函数体语句数组(无则 null),供 cssDeps 静态提取 */\n cssVarsBody: any[] | null\n /** `@computed` getter 名 → 函数体语句数组,供 computedDeps 静态提取 */\n computedBodies: Map<string, any[]>\n /** `@query` / `@queryAll` 字段名(非响应式 DOM 查询属性,依赖提取按死条目记录) */\n queryFields?: Set<string>\n /** 本类方法 / getter / 箭头字段的函数体(name → BlockStatement 节点或表达式体),供依赖提取内联扫描 */\n bodies?: Map<string, any>\n /** 降级原因;null 表示未降级 */\n degradeReason: string | null\n /** 无视图组件(render() 不存在 / 返回 null / 继承链终点为 CompElem)→ 注入 noView: true */\n noView: boolean\n /** 跳过注入(同文件继承链上有 render 的祖先,继承其 __ce_static__)→ 不生成注入语句 */\n skipInjection: boolean\n /**\n * **mixin 工厂内的 class 声明**(`export function mix(B) { class M extends B {} ; return M }`)。\n *\n * super 是调用方传入的形参 ⇒ 静态不可知链:不做 D6 报错、无 own render 时一律\n * `skipInjection`(绝不判 `noView`,否则基类有视图时会静默白屏)。\n * 家族表(props/states/computedGetters)的合并走 `Reflect.getPrototypeOf(this)`,\n * 与本标记无关,mixin 声明的 @prop 会沿链传递到具体组件。\n *\n * 写法约束:必须是 class **声明**,不能是 class **表达式** —— TS 禁止在 class\n * 表达式上写装饰器(TS1206),能带 `@prop` 的形态只有 class 声明。\n */\n isMixin?: boolean\n /** 静态导入绑定:本地名 → 从 compelem 导入的原始名 */\n compelemImports: Map<string, string>\n /**\n * 模块级绑定名(顶层 const/let/var/function/class,以及全部 import 的本地名)。\n * 用于 D3 判定:这些名字不是「自由标识符」。\n */\n moduleBindings: Set<string>\n}\n\n/** 插件选项。 */\nexport interface CompilerOptions {\n /**\n * 参与编译的文件过滤。默认只处理 `.ts` 且源码里出现 `extends CompElem` 的文件。\n * ⚠️ 不要放宽到 `.js`:IIFE 打包产物里指令名不在 scope,会触发 D3 误报。\n */\n include?: (id: string, code: string) => boolean\n /**\n * verbose 日志:依赖清单人类可读打印(vite 插件侧同时打印每文件编译状态行)。\n * 也可用环境变量 `CE_DEPS_DEBUG`(非空且非 '0')单独开启清单打印,无需改配置。\n * 注:产物的块分隔注释(`//////// …… <标签>`)默认始终生成,与本选项无关。\n */\n verbose?: boolean\n /**\n * 跨文件标签注册表:已知组件的 kebab 标签名(大小写不敏感)。\n * 用于 SLOT 判定与 `.prop` 目标校验;vite 插件可跨文件累积后注入\n * (TEMPLATE-CODEGEN.md §4)。\n */\n knownTags?: Iterable<string>\n /** 关闭指定生成步骤(用于 A/B 实测对照) */\n disable?: {\n buildVars?: boolean\n }\n}\n","/**\n * 编译产物注入。\n *\n * 用 MagicString 做**最小侵入**的源码改写:在 class 体开头插入一个\n * `static __ce_static__ = { ... }`(+ 可选合成 constructor),在已有\n * constructor 的 super 语句后插入 prop/state 初始值写入,并扩展/新增\n * compelem 运行时函数 import;其余源码逐字节不动(保留原始 sourcemap 映射)。\n */\nimport MagicString from 'magic-string'\nimport type { ComponentAnalysis } from '../types'\nimport { DEBUG_DIV } from '../types'\n\nexport interface InjectOptions {\n /** 是否生成取值函数 */\n buildVars?: boolean\n /** 无视图组件标记:注入 noView: true(不创建 Shadow DOM) */\n noView?: boolean\n}\n\n/** `buildStaticLiteral` 可选生成物(任一缺失则对应字段不注入)。 */\nexport interface StaticLiteralCodes {\n /** per-point effect 工厂数组(值/指令点的订阅与写 DOM) */\n pointEffects?: string\n /**\n * `fx`:与 ups 逐项 1:1 的工厂数组。值点返回 effect,指令点返回 DirectiveInstance,\n * 事件/ref 点返回 handler / ref 对象。renderTemplate 借它取首屏值,运行时按\n * up 上的 `ux` 下标索引(Q2 的前提:ups 与工厂 1:1 后才能互查)。\n */\n fx?: string\n /** watch effect 工厂数组 */\n watchEffects?: string\n /** cssVars effect 工厂(读 CSS 依赖信号 → 更新自定义属性) */\n cssEffect?: string\n /** 结构指令元数据占位字段,运行时从不读取(分派参数在 pointEffects 内) */\n dirMeta?: string\n buildTemplate?: string\n /** 子视图表(结构指令的子模板元数据):`subViews: { <subId>: { buildTemplate, fx } }` */\n subViews?: string\n /**\n * 抽出的表达式中用到的 `super.METHOD` 名。注入到 class 体:\n * `__ce_s_METHOD(...a){return super.METHOD(...a)}`,\n * 保留 home-object 的 super 绑定,供静态取值函数经 `__comp` 调用。\n */\n superHelpers?: string[]\n /** `__ce_static__.props` 字面量值(@prop 前移,analyze/field-extract.ts) */\n props?: string\n /** `__ce_static__.states` 字面量值(@state 前移) */\n states?: string\n /** `__ce_static__.computedGetters` 字面量值(@computed 前移,原 getter 体外提) */\n computedGetters?: string\n /** 类体访问器源码(prop/state/computed 的 get/set + `@tag` 类的 observedAttributes),\n * 接在 static 字面量之后注入。无 `@tag` 的类不带 observedAttributes —— 它们永不被\n * `customElements.define`,浏览器不会读它们的表。 */\n accessors?: string\n}\n\n/** prop/state 初始值写入语句的构造体插入点计划。 */\nexport interface CtorInsertPlan {\n /** 插入点(原始源码偏移) */\n pos: number\n /** true = 类无构造体 → 合成 `constructor(...__a){ super(...__a); ... }` */\n synthesize: boolean\n}\n\n/**\n * 计算 prop/state 初始值写入的构造体插入点。\n * 与原字段初始化时机等价:super() 返回后、构造体其余语句之前;\n * 顶层无 super 语句(嵌套形态)时退到构造体末尾(闭合 `}` 前,保证执行且在 super 后)。\n */\nexport function planCtorInsert(\n comp: ComponentAnalysis,\n clsNode: any,\n code: string,\n): CtorInsertPlan | undefined {\n const braceIdx = code.indexOf('{', comp.start)\n if (braceIdx < 0 || braceIdx > comp.end) return undefined\n const ctor = (clsNode?.body?.body ?? []).find(\n (m: any) => m.type === 'MethodDefinition' && m.kind === 'constructor',\n )\n if (!ctor) return { pos: braceIdx + 1, synthesize: true }\n const stmts = ctor.value?.body?.body ?? []\n for (const st of stmts) {\n if (st.type === 'ExpressionStatement' && code.startsWith('super(', st.start)) {\n return { pos: st.end, synthesize: false }\n }\n }\n const body = ctor.value?.body\n if (!body) return undefined\n return { pos: body.end - 1, synthesize: false }\n}\n\n/** 文件级运行时函数 import 注入参数。 */\nexport interface ImportInjectOptions {\n /** 需要导入的运行时函数名(已定名,含可能的 __ce_ 别名) */\n helpers?: string[]\n /** 定位到的 compelem import 声明:有命名 specifier 则原位扩展,否则新增独立行 */\n helperImport?: { decl: any; source: string }\n /** 新增独立 import 行时的锚点(首个 import 起点或首语句起点) */\n helpersAnchor?: number\n /** 需要从 **myfx** 注入的运行时函数名(方法装饰器前移的 debounce/throttle/once) */\n myfxHelpers?: string[]\n /** 定位到的 myfx import 声明:有命名 specifier 则原位扩展,否则新增独立行 */\n myfxImport?: { decl: any; source: string }\n /**\n * 顶层语句(模块级常量,如子模板 carrier `const __ce_t0 = Object.assign(...)`),\n * 插在 `topLevelAnchor` 之后(通常取最后一个 import 声明的末尾偏移)。\n */\n topLevel?: string\n /** topLevel 的插入锚点(紧跟其后的偏移) */\n topLevelAnchor?: number\n}\n\n/**\n * 家族字段(props/states/computedGetters)的父类合并表达式。\n *\n * 用 `Reflect.getPrototypeOf(this)` 而非 `super`:\n * - 静态字段初始化器里 `this` 即类本身,`super` 只在有 extends 子句时合法\n * (无 extends 的类上写 `super` 是 SyntaxError,整个模块加载失败);\n * - `super.__ce_static__` 需要 AST 知道 extends 子句的**源码文本**,而\n * `extends FieldContainer(CompElem)` 这类 mixin 形态重放该表达式等于\n * **二次调用 mixin 工厂**,拿到的是另一个类;\n * - 构造器原型链是 mixin / 跨文件 / node_modules 预构建包的**唯一共同通道**,\n * 运行时查找天然穿透这三者,不需要模块图。\n */\nconst SUPER_STATIC = 'Reflect.getPrototypeOf(this).__ce_static__'\n\n/** `superProps` 表达式:取父类(可能未编译 → undefined)的家族表。 */\nconst superFamily = (name: 'props' | 'states' | 'computedGetters') => `${SUPER_STATIC}?.${name}`\n\n/**\n * 家族字段的 emit 形态 —— **浅替换**语义。\n *\n * - 有 own 条目:`{ ...super?.<name>, ...<own> }`。own 后置 → 同名 key 整体\n * 替换父类选项对象(不做逐字段深合并,见 DESIGN「prop 选项浅替换」)。\n * - 无 own 条目:直接别名父类表(不复制)。表对象本身从不被改写,\n * 只有条目上的 `_defaultValue`/`_typeAry` 派生缓存会被写,且其值是\n * 「本类信号默认值」的纯函数 → 同链同 key 必然一致,共享安全。\n *\n * 无论哪种都必须 emit:own `__ce_static__` 会**遮蔽**父类的整个静态字段,\n * 漏掉就会把祖先的 prop/state 定义一并遮没(这正是连续两层无自有 prop\n * 子类丢失整张定义表的根因)。\n */\nexport function emitFamily(name: 'props' | 'states' | 'computedGetters', ownCode?: string): string {\n const sup = superFamily(name)\n return ownCode === undefined ? sup : `{ ...${sup}, ...${ownCode} }`\n}\n\n/** 生成 `static __ce_static__ = {...}` 的源码文本。 */\nexport function buildStaticLiteral(\n opts: InjectOptions,\n codes: StaticLiteralCodes = {},\n): string {\n /** 字段块分隔注释(`//////// …… <标签>` 整行,纯注释、不改行为)。 */\n const mark = (label: string, body: string) => `${DEBUG_DIV} ${label}\\n${body}`\n /** `{ … }` 展开逐字段一行(分隔注释须行首)。 */\n const wrap = (ps: string[]) => `static __ce_static__ = {\\n${ps.join(',\\n')}\\n};\\n`\n const parts: string[] = []\n\n if (codes.buildTemplate) {\n // buildTemplate:编译期生成的直接建 DOM 函数(docs/TEMPLATE-CODEGEN.md §2)\n parts.push(mark('buildTemplate', `buildTemplate: ${codes.buildTemplate}`))\n }\n\n if (codes.subViews) {\n // subViews:结构指令模板回调的子视图。与主 buildTemplate 同生共死。\n parts.push(mark('subViews', `subViews: ${codes.subViews}`))\n }\n\n // ---- 五族访问器前移(field-extract):与降级无关,必须注入 ----\n // props/states/computedGetters 一律 emit(own 浅替换叠加父类表,见 emitFamily):\n // own 静态字面量会遮蔽父类整张表,漏 emit 即丢祖先定义。\n parts.push(mark('props', `props: ${emitFamily('props', codes.props)}`))\n parts.push(mark('states', `states: ${emitFamily('states', codes.states)}`))\n parts.push(mark('computedGetters', `computedGetters: ${emitFamily('computedGetters', codes.computedGetters)}`))\n\n if (codes.watchEffects) {\n // watch effect 工厂数组。\n // 每个工厂 (rc) => effectFn:读信号 → 变更时调用处理器。\n parts.push(mark('watchEffects', `watchEffects: ${codes.watchEffects}`))\n }\n\n if (codes.cssEffect) {\n // cssVars effect 工厂(读 CSS 依赖信号 → 更新自定义属性)。\n parts.push(mark('cssEffect', `cssEffect: ${codes.cssEffect}`))\n }\n\nif (codes.pointEffects) {\n // per-point effect 工厂数组:\n // 每个工厂 (rc, nodes) => effectFn,订阅一个信号,取值 → 守卫 → 写 DOM 在微任务里。\n parts.push(mark('pointEffects', `pointEffects: ${codes.pointEffects}`))\n }\n\n if (codes.fx) {\n // fx:与 ups 1:1。值点的项与 pointEffects 中对应项**是同一份源码**(同一工厂),\n // 指令点返回 DirectiveInstance、事件/ref 点返回 handler/ref 对象 —— 后两类\n // 不订阅信号,故不出现在 pointEffects 里,却仍需在 fx 占位以维持 1:1。\n parts.push(mark('fx', `fx: ${codes.fx}`))\n }\n\n // `diag` 不注入产物:降级信息只经 `compileResult.diagnostics` 出口\n // (按类记录,每条带 `degraded` 与 `reason`)。**不要把降级信息写进产物**。\n\n if (opts.noView) {\n // 无视图组件:只注入 noView,不注入任何视图加速字段\n // (访问器/家族元数据与视图无关,仍须随字面量注入)\n parts.push(mark('noView', `noView: true`))\n return wrap(parts) + (codes.accessors ?? '')\n }\n\n let literal = wrap(parts)\n // super 转发方法:仅当某处抽出的表达式用到 super.METHOD 时注入。\n //\n // ⚠️ 判据只看 `codes.superHelpers` 是否非空:它已经是**全量汇流**\n // (compile.ts 把子模板的 superHelpers 与 fx 内联时的都 push 进同一数组)。\n if (codes.superHelpers?.length) {\n literal += `${DEBUG_DIV} super-forwarders\\n`\n for (const name of codes.superHelpers) {\n if (!/^[A-Za-z_$][\\w$]*$/.test(name)) continue\n literal += `__ce_s_${name}(...__a){return super.${name}(...__a)}\\n`\n }\n }\n // 访问器(get/set/observedAttributes):与 super 转发方法同批 appendLeft\n literal += codes.accessors ?? ''\n return literal\n}\n\n/**\n * 把生成物注入到源文件。\n *\n * 多个组件在同文件时按 **end 倒序** 插入,避免前一次插入改变后一次偏移。\n */\nexport function injectInto(\n code: string,\n edits: Array<{\n comp: ComponentAnalysis\n literal: string\n removals?: Array<{ start: number; end: number }>\n fieldInits?: Array<{ name: string; initText: string; computed?: boolean }>\n ctor?: CtorInsertPlan\n /** 方法装饰器(@debounced/@throttled/@onced)构造体注入语句 */\n methodDecoCtor?: string\n /** 方法装饰器 destroy 注入语句(插到 destroy() 内) */\n methodDecoDestroy?: string\n }>,\n id: string,\n extras: ImportInjectOptions = {},\n): { code: string; map: any; injected: string[]; additions: string[] } {\n const s = new MagicString(code)\n const injected: string[] = []\n const additions: string[] = []\n\n const sorted = [...edits].sort((a, b) => b.comp.start - a.comp.start)\n for (const { comp, literal, removals, fieldInits, ctor, methodDecoCtor, methodDecoDestroy } of sorted) {\n // 定位 class 体的左花括号。优先用 AST 给出的 `cls.body.start` —— 从 class 起始处\n // 往后扫第一个 `{` 会在 `extends mixin({ a: 1 })` 上扫进 extends 子句的对象字面量,\n // 把 static 字段插进对象里,产出整模块语法错误。AST 不可用时才回退扫描。\n const braceIdx =\n comp.bodyStart >= 0 && comp.bodyStart < comp.end\n ? comp.bodyStart\n : code.indexOf('{', comp.start)\n if (braceIdx < 0 || braceIdx > comp.end) continue\n s.appendLeft(braceIdx + 1, '\\n' + literal)\n // 记入 additions:`literal` 是本次注入的 `static __ce_static__ = {...}` 全文。\n // 必须记录,否则「移除 additions + 应用 removals 还原源码」的校验无法把它删掉 ——\n // 那个校验(inject-e2e / field-e2e 的「removals 字节恒等」)会因残留字面量而失败。\n additions.push('\\n' + literal)\n // prop/state 初始值与 computed 信号体写入构造体(字段声明已随 removals 整体删除;\n // 插入点在 super() 语句后 / 合成 constructor 内,时机与原字段初始化等价)\n // 方法装饰器注入(@debounced/@throttled/@onced)**接在 fieldInits 之后**同一插入点:\n // 编译器已算好直线语句(`this.onX = throttle(this.onX, 100)`),运行时零遍历。\n // 次序:super() → this.__s ??= {} → fieldInits → methodDecoCtor。\n // (方法体在构造期不会被调用,但\"信号先建\"更稳 —— 见 method-deco-extract 头注释)\n const hasFieldInits = fieldInits?.length && ctor\n if ((hasFieldInits || methodDecoCtor) && ctor) {\n const inits = hasFieldInits\n ? fieldInits!\n .map((i) =>\n i.computed\n ? `this.__s.${i.name} = signalComputed(function()${i.initText}.bind(this));`\n : `this.__s.${i.name} = signal(${i.initText});`,\n )\n .join(' ')\n : ''\n const md = methodDecoCtor ? (inits ? ' ' : '') + methodDecoCtor : ''\n const stmts = inits + md\n // `this.__s ??= {}` 而非 `this.__s = {}`:\n // 继承链上 super() 已把**父类**的信号建好(CompElem 构造函数里初始化),\n // 子类若直接 `= {}` 会把父类信号整体抹掉 —— 随后父类访问器读\n // `this.__s.<父键>.value` 即抛 \"Cannot read properties of undefined\"。\n // 实测:skipInjection 子类(无 own render,继承父类视图)必现。\n // 前导分号是**必需的**,不是保险:ctor.pos = 顶层 `super(...)` 语句的 st.end,\n // 该位置落在其终止分号**之前**,直接 appendLeft 会把 `super(...a)` 的分号顶掉,\n // 产出 `super(...a) this.__s ??= {}; …` —— 同一行两个表达式语句,ASI 不生效,\n // 整个组件产物语法错误(`';' expected.`),组件直接加载失败。\n // 若某些解析器的 st.end 已含分号,多出的 `;` 只是一个空语句,无副作用。\n const text = ctor.synthesize\n ? `\\nconstructor(...__a) { super(...__a); this.__s ??= {}; ${stmts} }\\n`\n : `; this.__s ??= {}; ${stmts}`\n s.appendLeft(ctor.pos, text)\n additions.push(text)\n }\n // 方法装饰器 destroy 清理:**不注入到基类 `destroy()`**(那是基类代码,用户源码里没有),\n // 而是生成一个 `beforeDestroyed()` 重写 —— 基类 `destroy()`:393 会调用它,且它本身\n // 是空钩子(CompElem.ts:376)。必须 `super.beforeDestroyed?.()` 保留用户/祖先实现。\n //\n // 用户已声明 `beforeDestroyed` 的情形在**分析层**(method-deco-extract)就已拦截:\n // 有 own `beforeDestroyed` → 整个方法装饰器前移放弃并报 E 码,故这里不必再判\n // (若在此\"跳过清理但保留包装\"会造成包装了却永不清理的泄漏,比不包装更难查)。\n if (methodDecoDestroy) {\n const text = `\\n beforeDestroyed() { ${methodDecoDestroy} super.beforeDestroyed?.() }\\n`\n s.appendLeft(braceIdx + 1, text)\n additions.push(text)\n }\n // @watch 装饰器删除(span 均为原始源码偏移,MagicString 自动组合)。\n // 必须与注入同成功/同失败:装饰器被删而 watchers 未注入会丢 watch。\n for (const r of removals ?? []) s.remove(r.start, r.end)\n injected.push(comp.className)\n }\n\n // 运行时函数 import:优先扩展现有 compelem 命名导入(`}` 处 appendLeft);\n // 仅 default/namespace/无 compelem import 时新增独立行(锚点=首 import 或首语句前)\n const injectHelperImport = (\n namesIn: string[] | undefined,\n importDecl: { decl: any; source: string } | undefined,\n anchor: number | undefined,\n fallbackSource: string,\n ) => {\n const names = [...new Set((namesIn ?? []).filter((n) => /^[A-Za-z_$][\\w$]*$/.test(n)))]\n if (!names.length) return\n const decl = importDecl?.decl\n const hasNamed = !!decl && (decl.specifiers ?? []).some((sp: any) => sp.type === 'ImportSpecifier')\n const braceIdx = decl ? code.lastIndexOf('}', decl.end) : -1\n if (decl && hasNamed && braceIdx > decl.start) {\n // 源码 `}` 前已是尾逗号(多行命名导入风格)→ 只补空格,否则 `, ,` 双逗号语法错误\n const needComma = !/,\\s*$/.test(code.slice(decl.start, braceIdx))\n const text = (needComma ? ', ' : ' ') + names.join(', ')\n s.appendLeft(braceIdx, text)\n additions.push(text)\n } else {\n const at = anchor ?? 0\n const text = `import { ${names.join(', ')} } from ${JSON.stringify(importDecl?.source ?? fallbackSource)};\\n`\n s.appendLeft(at, text)\n additions.push(text)\n }\n }\n injectHelperImport(extras.helpers, extras.helperImport, extras.helpersAnchor, 'compelem')\n // 方法装饰器前移注入的 `debounce/throttle/once` 是 **myfx** 的实现,不是 compelem 的\n // 出口 —— 走独立的 myfx 通道:优先扩展源码已有的 `from \"myfx\"` 命名导入。\n injectHelperImport(extras.myfxHelpers, extras.myfxImport, extras.helpersAnchor, 'myfx')\n\n // 模块级常量(子模板 carrier 等):插在最后一个 import 之后。\n // 与 class 体内注入同批记入 additions —— 「removals 还原源码」的字节恒等校验\n // 要能把它一并删掉。\n if (extras.topLevel) {\n const anchor = extras.topLevelAnchor ?? 0\n const text = `\\n${extras.topLevel}\\n`\n s.appendLeft(anchor, text)\n additions.push(text)\n }\n\n return {\n code: s.toString(),\n map: s.generateMap({ source: id, hires: true, includeContent: true }),\n injected,\n additions,\n }\n}\n","/**\n * 约定错误静态检查(对应运行时 showError/showTagError 中「可静态判定」的调用点)。\n *\n * 设计原则(对齐 docs/TEMPLATE-CODEGEN.md §5「仅静态编译」):\n * 运行时用 DEV 断言兜底的「约定违规」,编译期能证明的直接在构建期报错;\n * 编译期为唯一入口。\n *\n * 检查项 → 运行时调用点映射:\n * E-EMIT-ARG this.emit(实参无法静态解析) ← CompElem.ts emit()\n * E-EMIT-UNDECLARED emit 事件名未在 @emits 声明 ← CompElem.ts:1273 / event.ts matchEmit\n * E-EMITS-ARG @emits(...) 实参无法静态解析 ← 装饰期静默收 Set,无法校验\n * E-PROP-TYPE @prop 无默认值且未声明 type ← CompElem.ts(编译期唯一入口)\n * E-PROP-CASE @prop 字段名非 lowerCamelCase ← prop.ts:35\n * E-PROP-ASSIGN 组件内对 this.<非model prop> 赋值 ← prop.ts:105-113(set 通道仅 model 开放)\n * E-COMPUTED-NOT-GETTER @computed 用在非 getter 上 ← computed.ts(编译期唯一入口)\n * E-CSSCOPE-TARGET @csscope 用在非 static getter 上 ← csscope.ts(编译期唯一入口)\n *\n * 静态字符串解析:除字符串字面量外,还支持解析模块级 const 常量\n * (`const EV = 'x'`、`const EVS = { Ready: 'x', G: { A: 'y' } }`),\n * 以及对它们的成员访问(`EVS.Ready`、`EVS.G.A`)—— 对齐真实代码库的枚举式写法。\n *\n * 不可静态判定的调用点(转换器报错、required 缺失、forEach 重复 key 等)不在此处。\n */\nimport type { ComponentAnalysis } from '../types'\nimport { keyName } from '../utils/oxc'\n\nexport interface ConventionError {\n start: number\n end: number\n message: string\n}\n\nexport interface ConventionsContext {\n /** 本文件内全部类声明(含非组件类),继承链解析用 */\n localClasses: Map<string, any>\n /** 模块级字符串常量表(collectStringConsts 产物),emit/@emits 实参解析用 */\n stringConsts: Map<string, any>\n /** 本文件全部 import 本地名。导入常量(跨文件)无法解析值 → 按「不透明」放行 */\n importedLocals: Set<string>\n /**\n * 模块级 `const NAME = <init>` 的 init 节点表(collectModuleConsts 产物)。\n * 五族访问器前移(field-extract)用:`@prop(OPTS)` 等 options 标识符\n * 只支持**文件内静态分析**——inline init 源码到注入字面量(同模块作用域等价求值)。\n */\n moduleConsts?: Map<string, any>\n /**\n * U5:本文件源码(compileFile 注入,测试可缺省)。\n * collectThisUsage 的预筛依据——函数体切片不含 `this` 字面量即可跳过深度 walk\n * (emit/propAssign 赋值模式都要求 ThisExpression,源码必含 `this`)。\n */\n code?: string\n}\n\nexport function decoratorName(dec: any): string | null {\n const expr = dec?.expression ?? dec\n if (!expr) return null\n if (expr.type === 'CallExpression') {\n const callee = expr.callee\n if (callee?.type === 'Identifier') return callee.name\n if (callee?.type === 'MemberExpression' && callee.property?.type === 'Identifier') return callee.property.name\n return null\n }\n if (expr.type === 'Identifier') return expr.name\n return null\n}\n\nfunction superClassName(node: any): string | null {\n const sc = node.superClass\n if (!sc) return null\n if (sc.type === 'Identifier') return sc.name\n if (sc.type === 'MemberExpression' && sc.property?.type === 'Identifier') return sc.property.name\n return null\n}\n\n/** isStringLiteral:覆盖 oxc 的 Literal / StringLiteral 两种形态。 */\nfunction isStringLiteral(n: any): boolean {\n return !!n && (n.type === 'StringLiteral' || (n.type === 'Literal' && typeof n.value === 'string'))\n}\n\n/** 对象属性节点:oxc 产出 `Property`(ESTree 形态),兼容 `ObjectProperty`。 */\nfunction isObjectProp(p: any): boolean {\n return !!p && (p.type === 'Property' || p.type === 'ObjectProperty') && !p.computed\n}\n\n/**\n * 收集模块级字符串常量:`const X = 'str'`、`const X = { K: 'v', N: { K: 'v' } }`。\n * 值必须是纯静态字符串(对象允许嵌套一层对象),动态初始化不收录。\n */\nexport function collectStringConsts(program: any): Map<string, any> {\n const out = new Map<string, any>()\n const strOf = (n: any): string | null => (isStringLiteral(n) ? String(n.value) : null)\n for (const stmt of program?.body ?? []) {\n const decl = stmt?.type === 'ExportNamedDeclaration' ? stmt.declaration : stmt\n if (decl?.type !== 'VariableDeclaration' || decl.kind !== 'const') continue\n for (const d of decl.declarations ?? []) {\n if (d.id?.type !== 'Identifier' || !d.init) continue\n const name = d.id.name\n const sv = strOf(d.init)\n if (sv != null) {\n out.set(name, sv)\n continue\n }\n if (d.init.type === 'ObjectExpression') {\n const obj: Record<string, any> = {}\n let ok = true\n for (const p of d.init.properties ?? []) {\n if (!isObjectProp(p)) { ok = false; break }\n const k = keyName(p.key)\n if (!k) { ok = false; break }\n const v = strOf(p.value)\n if (v != null) { obj[k] = v; continue }\n if (p.value?.type === 'ObjectExpression') {\n const inner: Record<string, any> = {}\n let ok2 = true\n for (const ip of p.value.properties ?? []) {\n if (!isObjectProp(ip)) { ok2 = false; break }\n const ik = keyName(ip.key)\n const iv = strOf(ip.value)\n if (!ik || iv == null) { ok2 = false; break }\n inner[ik] = iv\n }\n if (ok2) { obj[k] = inner; continue }\n }\n ok = false\n break\n }\n if (ok) out.set(name, obj)\n }\n }\n }\n return out\n}\n\n/**\n * 收集模块级 `const NAME = <init>` 的 init 节点(含 `export const`)。\n * 五族 options 标识符解析用(field-extract.ts):不做内容校验——init 源码\n * 原样内联进同文件的 `__ce_static__` 字面量,模块作用域下等价求值。\n * 仅收 `const`(import / 运行时拼接 / `let` 不支持 → 调用方报 E-PROP-ARG 等)。\n */\nexport function collectModuleConsts(program: any): Map<string, any> {\n const out = new Map<string, any>()\n for (const stmt of program?.body ?? []) {\n const decl = stmt?.type === 'ExportNamedDeclaration' ? stmt.declaration : stmt\n if (decl?.type !== 'VariableDeclaration' || decl.kind !== 'const') continue\n for (const d of decl.declarations ?? []) {\n if (d.id?.type !== 'Identifier' || !d.init) continue\n out.set(d.id.name, d.init)\n }\n }\n return out\n}\n\n/** 剥掉 TS 包装节点(as / satisfies / 括号),取可静态分析的本体。 */\nexport function unwrapTsExpr(n: any): any {\n let cur = n\n while (\n cur &&\n (cur.type === 'TSAsExpression' ||\n cur.type === 'TSSatisfiesExpression' ||\n cur.type === 'TSNonNullExpression' ||\n cur.type === 'ParenthesizedExpression')\n ) {\n cur = cur.expression\n }\n return cur\n}\n\n/**\n * 静态解析字符串表达式:字面量 / 常量标识符 / 常量成员访问(两级对象)。\n * 返回:\n * { ok: true, value } 解析成功\n * { ok: true, opaque: true } 根标识符是跨文件导入(值不可知),跳过校验\n * { ok: false, unknownKey } 表达式形态可静态分析,但常量 key 不存在(unknownKey 形如 'EVS.Other')\n * { ok: false } 标识符不在常量表(可能是运行期变量)\n * null 完全无法静态分析(动态表达式)\n */\ntype ResolveResult =\n | { ok: true; value: string; opaque?: boolean }\n | { ok: false; unknownKey?: string }\n | null\n\nfunction resolveStaticString(n: any, consts: Map<string, any>, importedLocals: Set<string>): ResolveResult {\n if (isStringLiteral(n)) return { ok: true, value: String(n.value) }\n if (n?.type === 'Identifier') {\n if (importedLocals.has(n.name)) return { ok: true, value: '', opaque: true }\n const v = consts.get(n.name)\n if (typeof v === 'string') return { ok: true, value: v }\n return { ok: false }\n }\n if (n?.type === 'MemberExpression' && !n.computed) {\n // A.B / A.B.C:沿常量表下钻\n const parts: string[] = []\n let cur = n\n while (cur?.type === 'MemberExpression' && !cur.computed && keyName(cur.property)) {\n parts.unshift(keyName(cur.property)!)\n cur = cur.object\n }\n if (cur?.type !== 'Identifier') return null\n if (importedLocals.has(cur.name)) return { ok: true, value: '', opaque: true }\n const root = consts.get(cur.name)\n if (root == null) return { ok: false }\n let v: any = root\n let path = cur.name\n for (const p of parts) {\n path += '.' + p\n if (v == null || typeof v !== 'object') return { ok: false, unknownKey: path }\n v = v[p]\n if (v === undefined) return { ok: false, unknownKey: path }\n }\n return typeof v === 'string' ? { ok: true, value: v } : { ok: false, unknownKey: path }\n }\n return null\n}\n\n/** 复刻 matchEmit(event.ts:274-287)的匹配语义:精确命中或 'prefix:*' 通配。 */\nfunction matchEmits(declared: Set<string>, evName: string): boolean {\n if (declared.has(evName)) return true\n for (const n of declared) {\n if (n.endsWith(':*') && evName.startsWith(n.slice(0, -1))) return true\n }\n return false\n}\n\n/**\n * 收集一个类(含同文件基类链)的 @emits 声明。\n * 实参无法静态解析为字符串 → E-EMITS-ARG 编译错误。\n * 实参是跨文件导入常量 → 记入 hasOpaque(声明集不完整,后续放弃 UNDECLARED 校验)。\n */\nfunction collectDeclaredEmits(\n cls: any,\n ctx: ConventionsContext,\n isEmitsDec: (localName: string) => boolean,\n errs: ConventionError[],\n): { declared: Set<string>; hasOpaque: boolean } {\n const out = new Set<string>()\n let hasOpaque = false\n const seen = new Set<any>()\n const visit = (node: any) => {\n if (!node || seen.has(node)) return\n seen.add(node)\n for (const dec of node.decorators ?? []) {\n const name = decoratorName(dec)\n if (!name || !isEmitsDec(name)) continue\n const expr = dec.expression ?? dec\n for (const arg of expr.arguments ?? []) {\n if (arg.type === 'SpreadElement') {\n errs.push({ start: arg.start, end: arg.end, message: 'E-EMITS-ARG: @emits 不支持展开实参(无法静态解析)' })\n continue\n }\n const r = resolveStaticString(arg, ctx.stringConsts, ctx.importedLocals)\n if (r?.ok && r.opaque) hasOpaque = true\n else if (r?.ok) out.add(r.value)\n else if (r?.unknownKey) errs.push({ start: arg.start, end: arg.end, message: `E-CONST-KEY: 常量成员 '${r.unknownKey}' 不存在` })\n else errs.push({ start: arg.start, end: arg.end, message: 'E-EMITS-ARG: @emits 实参必须是字符串字面量或可静态解析的常量(编译期静态校验)' })\n }\n }\n const sup = superClassName(node)\n if (sup && ctx.localClasses.has(sup)) visit(ctx.localClasses.get(sup))\n }\n visit(cls)\n return { declared: out, hasOpaque }\n}\n\n/**\n * 遍历成员函数体,收集 `this.emit(...)` 调用与 `this.<name> = ...` 赋值。\n *\n * `this` 绑定规则:箭头函数继承外层 this;非箭头函数(function/方法内的 function 声明)\n * 重新绑定 this —— 进入非箭头函数后收集到的 this.* 不再属于组件实例,跳过。\n */\ninterface ThisUsage {\n emitCalls: Array<{ node: any; arg: any }>\n propAssignments: Array<{ node: any; propName: string }>\n}\n\nfunction collectThisUsage(memberFn: any, code?: string): ThisUsage {\n const usage: ThisUsage = { emitCalls: [], propAssignments: [] }\n // U5 预筛:emit/propAssign 匹配都要求 ThisExpression → 函数体源码必含字面 `this`。\n // 无则直接返回空(slice+includes 的原生扫描比递归 Object.keys walk 便宜一个量级)。\n const body = memberFn.body\n if (\n code &&\n body &&\n typeof body.start === 'number' &&\n typeof body.end === 'number' &&\n !code.slice(body.start, body.end).includes('this')\n ) {\n return usage\n }\n const rec = (n: any, fnBarrier: boolean) => {\n if (!n || typeof n.type !== 'string') return\n if (!fnBarrier && n.type === 'CallExpression') {\n const c = n.callee\n if (\n c?.type === 'MemberExpression' &&\n !c.computed &&\n c.object?.type === 'ThisExpression' &&\n keyName(c.property) === 'emit' &&\n n.arguments?.length\n ) {\n usage.emitCalls.push({ node: n, arg: n.arguments[0] })\n }\n }\n if (!fnBarrier && n.type === 'AssignmentExpression' && n.operator === '=') {\n const l = n.left\n if (\n l?.type === 'MemberExpression' &&\n !l.computed &&\n l.object?.type === 'ThisExpression' &&\n keyName(l.property)\n ) {\n usage.propAssignments.push({ node: n, propName: keyName(l.property)! })\n }\n }\n // 进入非箭头函数(function 声明/表达式)后 this 重绑 → 后代 this.* 不再属于组件实例\n const childBarrier = fnBarrier || n.type === 'FunctionExpression' || n.type === 'FunctionDeclaration'\n for (const k of Object.keys(n)) {\n if (k === 'start' || k === 'end' || k === 'type') continue\n const v = (n as any)[k]\n if (Array.isArray(v)) {\n for (const c of v) rec(c, childBarrier)\n } else if (v && typeof v === 'object' && typeof v.type === 'string') {\n rec(v, childBarrier)\n }\n }\n }\n // 从函数体开始遍历:成员函数自身(MethodDefinition.value 是 FunctionExpression)不算「嵌套函数」\n rec(memberFn.body, false)\n return usage\n}\n\n/** 提取装饰器实参里的 options 对象节点(无参形态返回 null;Identifier 经 moduleConsts 内联解析)。 */\nfunction decoratorOptionsNode(member: any, decName: string, isDec: (n: string) => boolean, ctx?: ConventionsContext): any | null {\n for (const dec of member.decorators ?? []) {\n if (decoratorName(dec) !== decName || !isDec(decName)) continue\n const expr = dec.expression ?? dec\n if (expr.type === 'CallExpression') {\n const a0 = expr.arguments?.[0]\n if (a0?.type === 'ObjectExpression') return a0\n if (a0?.type === 'Identifier' && ctx?.moduleConsts?.has(a0.name)) {\n const init = unwrapTsExpr(ctx.moduleConsts.get(a0.name))\n if (init?.type === 'ObjectExpression') return init\n }\n return null\n }\n return null // 无参形态\n }\n return null\n}\n\nfunction objectHasTrueProp(optsNode: any, key: string): boolean {\n if (!optsNode) return false\n for (const p of optsNode.properties ?? []) {\n if (keyName(p.key) === key && p.value?.value === true) return true\n }\n return false\n}\n\n/**\n * 对单个组件执行全部约定检查。返回错误列表(可为空)。\n * 注意:约定检查独立于模板 codegen 与降级判定 —— 降级组件同样检查。\n */\nexport function checkConventions(\n comp: ComponentAnalysis,\n ctx: ConventionsContext,\n): ConventionError[] {\n const errs: ConventionError[] = []\n const cls = comp.cls ?? ctx.localClasses.get(comp.className)\n if (!cls) return errs\n\n // 装饰器判定:按「本地名 → imported 名」精确解析(兼容 import { emits as e })\n const isEmitsDec = (local: string) => comp.compelemImports.get(local) === 'emits'\n const isPropDec = (local: string) => comp.compelemImports.get(local) === 'prop'\n const isComputedDec = (local: string) => comp.compelemImports.get(local) === 'computed'\n const isCsscopeDec = (local: string) => comp.compelemImports.get(local) === 'csscope'\n\n // ---- 1. @emits 声明收集(含继承链) ----\n const { declared, hasOpaque } = collectDeclaredEmits(cls, ctx, isEmitsDec, errs)\n\n // ---- 2. 遍历类成员:emit 调用 / prop 赋值 / 装饰器目标检查 ----\n const propFields = new Map<string, any>() // name → PropertyDefinition 节点\n for (const member of cls.body?.body ?? []) {\n const name = keyName(member.key)\n if (!name || member.type !== 'PropertyDefinition') continue\n const decs: string[] = (member.decorators ?? []).map(decoratorName).filter(Boolean) as string[]\n if (decs.some((d) => isPropDec(d))) propFields.set(name, member)\n }\n\n for (const member of cls.body?.body ?? []) {\n const memberName = keyName(member.key)\n\n // 装饰器目标检查(与成员是否有函数体无关)\n const decs: string[] = (member.decorators ?? []).map(decoratorName).filter(Boolean) as string[]\n if (memberName && isComputedDec('computed') && decs.includes('computed') && member.kind !== 'get') {\n errs.push({\n start: member.start,\n end: member.end,\n message: `E-COMPUTED-NOT-GETTER: @computed 只能用于非静态 getter('${memberName}' 是 ${member.kind ?? 'member'})`,\n })\n }\n if (memberName && isCsscopeDec('csscope') && decs.includes('csscope')) {\n if (!member.static || member.kind !== 'get') {\n errs.push({\n start: member.start,\n end: member.end,\n message: `E-CSSCOPE-TARGET: @csscope 只能用于 static getter('${memberName}' ${member.static ? '非 getter' : '非 static'})`,\n })\n }\n }\n\n // ---- 内置装饰器目标校验(E-DECO-TARGET)----\n // 内置装饰器 targets:\n // debounced / onced / throttled → METHOD(编译期前移,见 analyze/method-deco-extract.ts)\n // query / queryAll → FIELD\n // 自定义装饰器在编译期不可知 → 放行\n // targets 校验完全由编译期负责 —— 这是唯一的校验点。\n if (memberName) {\n const checkTarget = (importedName: string, allowed: string[]) => {\n // compelemImports 是 local→imported,需按 imported 值反查 local 名\n const hasDec = [...comp.compelemImports.values()].includes(importedName) &&\n decs.some((d) => comp.compelemImports.get(d) === importedName)\n if (!hasDec) return\n let actual = 'unknown'\n if (member.type === 'MethodDefinition') actual = 'METHOD'\n else if (member.type === 'PropertyDefinition') actual = 'FIELD'\n if (!allowed.includes(actual)) {\n errs.push({\n start: member.start,\n end: member.end,\n message: `E-DECO-TARGET: @${importedName} 只能用于 ${allowed.join('/')}('${memberName}' 是 ${actual})`,\n })\n }\n }\n checkTarget('debounced', ['METHOD'])\n checkTarget('onced', ['METHOD'])\n checkTarget('throttled', ['METHOD'])\n checkTarget('query', ['FIELD'])\n checkTarget('queryAll', ['FIELD'])\n }\n\n // @prop 约定\n if (memberName && propFields.has(memberName)) {\n if (!/^[a-z]/.test(memberName)) {\n errs.push({\n start: member.start,\n end: member.end,\n message: `E-PROP-CASE: Prop '${memberName}' 必须是 lowerCamelCase`,\n })\n }\n const opts = decoratorOptionsNode(member, 'prop', isPropDec, ctx)\n const hasInit = member.value != null // PropertyDefinition 的初始化表达式\n if (!hasInit && !(opts && (opts.properties ?? []).some((p: any) => keyName(p.key) === 'type'))) {\n errs.push({\n start: member.start,\n end: member.end,\n message: `E-PROP-TYPE: Prop '${memberName}' 没有默认值也没有声明 type,运行时无法做类型推断`,\n })\n }\n }\n\n // 函数体内的 this 使用\n const fn =\n member.type === 'MethodDefinition' || member.type === 'PropertyDefinition' ? member.value : null\n if (!fn || (fn.type !== 'FunctionExpression' && fn.type !== 'ArrowFunctionExpression')) continue\n\n const usage = collectThisUsage(fn, ctx.code)\n for (const { arg } of usage.emitCalls) {\n const r = resolveStaticString(arg, ctx.stringConsts, ctx.importedLocals)\n if (r?.ok && r.opaque) {\n // 跨文件导入常量:值不可知,跳过校验(跨文件常量表是 vite 插件的后续工作)\n continue\n }\n if (r?.ok) {\n if (hasOpaque) continue // 声明集不完整 → 放弃 UNDECLARED 校验,避免误报\n if (!matchEmits(declared, r.value)) {\n errs.push({\n start: arg.start,\n end: arg.end,\n message: `E-EMIT-UNDECLARED: '${r.value}' was not declared in @emits`,\n })\n }\n } else if (r?.unknownKey) {\n errs.push({\n start: arg.start,\n end: arg.end,\n message: `E-CONST-KEY: 常量成员 '${r.unknownKey}' 不存在`,\n })\n } else {\n errs.push({\n start: arg.start,\n end: arg.end,\n message: 'E-EMIT-ARG: this.emit 实参必须是字符串字面量或可静态解析的常量(编译期静态校验)',\n })\n }\n }\n for (const { node, propName } of usage.propAssignments) {\n const field = propFields.get(propName)\n if (!field) continue\n // model:true 的 prop 运行时开放 set 通道(双向绑定),允许组件内赋值\n const opts = decoratorOptionsNode(field, 'prop', isPropDec, ctx)\n if (objectHasTrueProp(opts, 'model')) continue\n errs.push({\n start: node.start,\n end: node.end,\n message: `E-PROP-ASSIGN: 不能在组件内对 prop '${propName}' 赋值(props 由外部单向传入;双向请用 model 或 updateProps)`,\n })\n }\n }\n\n // 按位置排序,稳定输出\n errs.sort((a, b) => a.start - b.start)\n return errs\n}\n","/**\n * 从 render() 函数体提取「主视图模板」:h`` 模板字面量 + 各插值的信息。\n *\n * 主视图定义:在 render() 函数体内、**不穿过任何函数边界**即可到达的 h`` 模板\n * (指令回调内的模板属于子视图,有独立的子模板 codegen)。\n * D7 已禁止「插值处直接嵌套模板」,因此主模板的 vars 编号是纯线性的。\n */\nimport type { ComponentAnalysis } from '../types'\nimport { COMpelem_DIRECTIVES } from './render-body'\nimport { collectTemplateTagAliases } from './template'\n\nexport interface TemplateVarInfo {\n /** Template 序下标 */\n index: number\n /** 表达式源码(原样切片,可能含 TS 语法时已报错) */\n exprSource: string\n /** 是否为「直接调用 compelem 指令函数」(isDirective 的静态证明,见 B1 §3.3) */\n isDirectiveCall: boolean\n directiveName?: string\n /**\n * callee 是**模块绑定**的函数名(自定义指令 `directive()` 工厂产物,或普通格式化函数)。\n *\n * 静态上无法区分二者 —— 模块级 `pick`/`fmt`/`t` 与 `ripples`/`tooltip` 长得一样。\n * 故 extract 阶段**不**据此判定指令,只在**标签位**由 codegen 放行\n * (`<div ${ripples()}>` 是自定义指令的规范用法;文本位 `${fmt(x)}` 是取值)。\n *\n * 误判代价不对称:文本位误判成指令会生成 `get(i)[1][0]`,而该 var 的值是\n * 字符串/数字 → `undefined[0]` 在挂载时直接抛 TypeError。\n */\n moduleBindingName?: string\n /** TAG 指令实参中 this 链的全前缀路径(供运行时 directiveVarChain 回退) */\n directiveVarChain?: string[]\n /** 表达式在原始源码中的绝对起止偏移(子模板 wraps / prelude 切片用) */\n start?: number\n end?: number\n /**\n * 模块 AST 中的表达式节点(U2:freeIdentifiers 免重复 parse——模块已解析过,\n * 直接对该节点做自由标识符/this 链分类收集,语义与 wrapper 重解析一致)。\n * 手工构造的 vars 可不带(调用方回退字符串 parse 路径)。\n */\n node?: any\n}\n\nexport interface MainTemplate {\n /** quasis 的 cooked 串(长度 = 插值数 + 1) */\n strings: string[]\n vars: TemplateVarInfo[]\n start: number\n end: number\n}\n\n/** TS 专有语法检测(生成到 JS 运行时会语法错误)。导出供子模板 stripTs 后复检。 */\nexport const TS_SYNTAX_RE = /\\b(?:as|satisfies)\\s+[A-Za-z_(<]|[\\w\\)\\]]!(?:\\.|\\[|\\))/\n\nexport class TemplateExtractError extends Error {}\n\n/** 仅允许出现在 TAG 位置的内置指令(其非模板实参可静态提取 this 链)。 */\nconst TAG_ONLY_DIRECTIVES = new Set(['bind', 'show', 'model', 'classes', 'styles', 'html'])\n\n/**\n * 把一条 `this.a.b.c` 成员链还原为字段路径数组(最外层在前)。\n * 非 this 起始 / 含 computed 访问时返回 null。\n */\nfunction thisChain(node: any): string[] | null {\n const chain: string[] = []\n let cur: any = node\n while (cur && (cur.type === 'MemberExpression' || cur.type === 'OptionalMemberExpression')) {\n if (cur.computed) return null\n const prop = cur.property\n const name = prop?.type === 'Identifier' ? prop.name : prop?.type === 'PrivateIdentifier' ? prop.name : null\n if (!name) return null\n chain.unshift(name)\n cur = cur.object\n }\n if (!cur || cur.type !== 'ThisExpression') return null\n return chain.length ? chain : null\n}\n\n/**\n * 提取 TAG 指令实参中的 this 链全前缀路径。\n *\n * 收集的路径与指令工厂调用期间运行时建立的依赖对齐:\n * `model(this.form.name)` → `['form', 'form.name']`(根 + 全路径前缀链)。\n * 仅收集可静态解析的 this 成员链;表达式中其他部分忽略。\n */\nfunction extractThisChainPaths(args: any[]): string[] | undefined {\n const out: string[] = []\n const seen = new Set<string>()\n const push = (p: string) => { if (!seen.has(p)) { seen.add(p); out.push(p) } }\n const walk = (node: any) => {\n if (!node || typeof node !== 'object' || typeof node.type !== 'string') return\n if (node.type === 'MemberExpression' || node.type === 'OptionalMemberExpression') {\n const parentIsMember = false // 由 thisChain 从最外层回溯,内层不再单独处理\n if (!parentIsMember) {\n const chain = thisChain(node)\n if (chain) {\n let acc = ''\n for (const seg of chain) {\n acc = acc ? acc + '.' + seg : seg\n push(acc)\n }\n return // 整条链已处理\n }\n }\n }\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const c = node[key]\n if (Array.isArray(c)) for (const x of c) walk(x)\n else if (c && typeof c === 'object' && typeof c.type === 'string') walk(c)\n }\n }\n for (const a of args) walk(a)\n return out.length ? out : undefined\n}\n\nexport function extractMainTemplate(\n comp: ComponentAnalysis,\n source: string,\n /** U5:analyzeRender 单 walk 时顺带收集的 depth-0 h`` 节点;提供则免本函数重扫。 */\n preHits?: any[],\n): MainTemplate | null {\n const hAliases = collectTemplateTagAliases(comp)\n if (!hAliases.size) return null\n if (!comp.renderBody) return null\n\n const hits: any[] = []\n if (preHits !== undefined) {\n hits.push(...preHits)\n } else {\n // 不下钻函数边界:回调内模板属于子视图\n const walk = (node: any) => {\n if (!node || typeof node !== 'object' || typeof node.type !== 'string') return\n if (\n node.type === 'ArrowFunctionExpression' ||\n node.type === 'FunctionExpression' ||\n node.type === 'FunctionDeclaration'\n ) {\n return\n }\n if (\n node.type === 'TaggedTemplateExpression' &&\n node.tag?.type === 'Identifier' &&\n hAliases.has(node.tag.name)\n ) {\n hits.push(node)\n }\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const c = node[key]\n if (Array.isArray(c)) for (const x of c) walk(x)\n else if (c && typeof c === 'object' && typeof c.type === 'string') walk(c)\n }\n }\n for (const stmt of comp.renderBody) walk(stmt)\n }\n\n if (!hits.length) return null\n if (hits.length > 1) {\n throw new TemplateExtractError(\n `组件 ${comp.className} 的 render() 中发现 ${hits.length} 个主视图 h\\`\\` 模板` +\n `(指令回调内的模板不计);codegen 要求主视图模板唯一`,\n )\n }\n\n const tmpl = hits[0]\n const quasi: any = tmpl.quasi\n const strings: string[] = (quasi.quasis ?? []).map((q: any) => String(q.value?.cooked ?? ''))\n const exprs: any[] = quasi.expressions ?? []\n\n const vars: TemplateVarInfo[] = exprs.map((e: any, index: number) => {\n const exprSource = source.slice(e.start, e.end).trim()\n if (TS_SYNTAX_RE.test(exprSource)) {\n throw new TemplateExtractError(\n `组件 ${comp.className} 模板插值 #${index} 含 TS 专有语法(as/satisfies/非空断言):` +\n `\\`${exprSource}\\`;codegen 产物为纯 JS,请在模板外完成类型操作`,\n )\n }\n let isDirectiveCall = false\n let directiveName: string | undefined\n let moduleBindingName: string | undefined\n let directiveVarChain: string[] | undefined\n if (e.type === 'CallExpression' && e.callee?.type === 'Identifier') {\n const imported = comp.compelemImports.get(e.callee.name)\n if (imported && COMpelem_DIRECTIVES.has(imported)) {\n isDirectiveCall = true\n directiveName = imported\n if (TAG_ONLY_DIRECTIVES.has(imported)) {\n directiveVarChain = extractThisChainPaths(e.arguments ?? [])\n }\n } else if (comp.moduleBindings?.has(e.callee.name)) {\n // 模块绑定调用:只记名,**不在此处**判为指令。\n // 静态无法区分自定义指令(directive() 产物)与普通函数(formatter/i18n);\n // 只有标签位才放行,见 TemplateVarInfo.moduleBindingName 的说明。\n moduleBindingName = e.callee.name\n }\n }\n return { index, exprSource, isDirectiveCall, directiveName, moduleBindingName, directiveVarChain, start: e.start, end: e.end, node: e }\n })\n\n return { strings, vars, start: tmpl.start, end: tmpl.end }\n}\n","/**\n * 子模板提取:结构指令回调内的 h`` → 独立 buildTemplate + 内联 fx codegen。\n *\n * 产出 `__ce_static__.subViews[subId] = { buildTemplate, pointEffects, fx }`,并在回调函数上\n * 标注 `__subId`(Object.assign 包装,不改指令公开签名)。运行时结构指令消费静态 subs。\n *\n * 准入约束:\n * - 每个模板回调内恰好 1 个 h``(块体须为顶层 return 的直接参数);\n * - 回调形参 / prelude / 插值中的自由标识符必须可在静态作用域解析;\n * - 任一回调提取失败 → SubExtractError → 整组件降级(编译插件默认报错阻断)。\n */\nimport type { ComponentAnalysis } from '../types'\nimport { COMpelem_DIRECTIVES, TEMPLATE_ARG_INDEX } from './render-body'\nimport {\n TS_SYNTAX_RE,\n TemplateExtractError,\n type MainTemplate,\n type TemplateVarInfo,\n} from './template-extract'\nimport { collectTemplateTagAliases } from './template'\nimport { topLevelReturns } from '../utils/oxc'\n\nexport class SubExtractError extends Error {}\n\n/** 指令实参分区:与 render-body 的 TEMPLATE_ARG_INDEX 同语义。 */\nexport function partitionDirectiveArgs(directive: string, args: any[]): boolean[] {\n const tmplIdx = TEMPLATE_ARG_INDEX[directive]\n return args.map((_, i) => {\n if (tmplIdx === 'rest-after-0') return i >= 1\n if (Array.isArray(tmplIdx)) return tmplIdx.includes(i)\n return false\n })\n}\n\nconst FN_TYPES = new Set(['ArrowFunctionExpression', 'FunctionExpression'])\n\nfunction isFnNode(n: any): boolean {\n return !!n && FN_TYPES.has(n.type)\n}\n\nfunction unwrapExpr(n: any): any {\n let cur = n\n while (\n cur &&\n (cur.type === 'ParenthesizedExpression' ||\n cur.type === 'TSAsExpression' ||\n cur.type === 'TSNonNullExpression' ||\n cur.type === 'TSSatisfiesExpression' ||\n cur.type === 'TSTypeAssertion')\n ) {\n cur = cur.expression ?? cur\n }\n return cur\n}\n\n/** 一个被提取的模板回调子模板。start/end 为回调函数节点的绝对偏移。 */\nexport interface SubCandidate {\n /** 按绝对 start 升序分配的稳定编号(0..n-1),写入 __subId */\n subId: number\n start: number\n end: number\n /** 形参源码片段(已去类型标注) */\n params: string[]\n /** prelude 为回调体顶层、return 之前的语句切片;表达式体为 '' */\n preludeStart: number\n preludeEnd: number\n preludeSrc: string\n /** 唯一 h`` 的 quasis cooked 串 */\n strings: string[]\n /** h`` 插值的绝对偏移与源码 */\n vars: TemplateVarInfo[]\n /**\n * 拥有本回调的结构指令的「集合实参」源码(仅 forEach;其余 undefined)。\n * 例:`forEach(this.rows, ...)` → `'this.rows'`。\n *\n * 用途:子模板 per-point effect 需要一个**信号**依赖。item 形参本身不是信号\n * (`${cell}` 的 cell 是普通参数),只有集合信号可订阅——没有它,整表替换\n * 集合不会通知任何 <td> 的文本点。嵌套子模板(`forEach(r.cells, ...)`)的\n * 集合是 `r.cells`,`r` 也是形参,故须沿 enclosingCandidates 上溯到最外层\n * 可解析为 `this.x` 的集合(见 subCollectionRoot)。\n */\n collectionExpr?: string\n}\n\n// ---------- TS 剥离(prelude / 回调体常见 `x!` 后缀非空断言) ----------\n\n/**\n * 剥离后缀非空断言 `expr!`(上下文感知,跳过字符串/模板字面量)。\n * 不处理 `as`/`satisfies`:复检 TS_SYNTAX_RE 仍命中则由调用方降级。\n */\nexport function stripTs(src: string): string {\n let out = ''\n const stack: Array<{ t: string; brace?: number }> = [{ t: 'code', brace: 0 }]\n let i = 0\n const n = src.length\n const isWord = (ch: string) => !!ch && /[A-Za-z0-9_$]/.test(ch)\n while (i < n) {\n const top = stack[stack.length - 1]\n const c = src[i]\n if (top.t === 'sq' || top.t === 'dq' || top.t === \"'\" || top.t === '\"') {\n if (c === '\\\\') {\n out += src.slice(i, i + 2)\n i += 2\n continue\n }\n if (top.t === c) stack.pop()\n out += c\n i++\n continue\n }\n if (top.t === 'tpl' || top.t === '`') {\n if (c === '\\\\') {\n out += src.slice(i, i + 2)\n i += 2\n continue\n }\n if (c === '`') {\n stack.pop()\n out += c\n i++\n continue\n }\n if (c === '$' && src[i + 1] === '{') {\n stack.push({ t: 'code', brace: 0 })\n out += '${'\n i += 2\n continue\n }\n out += c\n i++\n continue\n }\n // code\n if (c === \"'\" || c === '\"' || c === '`') {\n stack.push({ t: c })\n out += c\n i++\n continue\n }\n if (c === '{') {\n top.brace = (top.brace ?? 0) + 1\n out += c\n i++\n continue\n }\n if (c === '}') {\n if ((top.brace ?? 0) === 0 && stack.length > 1) {\n stack.pop()\n out += c\n i++\n continue\n }\n top.brace = (top.brace ?? 0) - 1\n out += c\n i++\n continue\n }\n if (c === '!') {\n const prev = out.length ? out[out.length - 1] : ''\n const next = i + 1 < n ? src[i + 1] : ''\n // 后缀非空断言:前驱为词/)/]/引号/反引号,且不是 != / !==\n const postfix =\n next !== '=' &&\n next !== '' &&\n (isWord(prev) || prev === ')' || prev === ']' || prev === \"'\" || prev === '\"' || prev === '`')\n // 行尾/结构符前的 `x!`(next 为 ; , } ) 换行或已到末尾前的空白序列)\n const eol =\n next === '' ||\n /[;,\\n\\r)}]/.test(next) ||\n (next === ' ' && /^\\s*[;,\\n\\r)}]/.test(src.slice(i + 1)))\n if ((postfix && (eol || next === '.' || next === '[' || next === '(')) || (isWord(prev) && eol)) {\n i++\n continue\n }\n }\n out += c\n i++\n }\n if (stack.length !== 1) return src\n return out\n}\n\n/**\n * 在绝对区间 [absStart, absEnd) 内为候选回调插入 Object.assign(..., {__subId: N}) 包装。\n *\n * 回调体(`h\\`...\\`` 模板源码)是**死代码**:运行时对第三参只读 `__subId` / `__fx` / `__bv`\n * (`resolveSubTemplateMeta` / `buildSubTemplate` / `getSubFx`),子视图 DOM 一律来自\n * `__ce_static__.subViews[N].buildTemplate`。故包装体改发 `function(){}`。\n *\n * `carriers` 提供时更进一步:**自洽子模板**(自身 fx 已落在 `subs[N].fx`,回调不携带\n * extras)的 carrier 是编译期常量,直接引用即可 —— 该包装原本写在 fx 工厂体内,\n * 每次更新都会重跑一遍 `Object.assign` + 新建闭包;提到模块级后更新路径零分配。\n * 携带 extras(`__fx` / `__bv`,必须逐次求值以捕获祖先形参)的候选仍走每次新建。\n *\n * @param extras subId → 追加属性源码片段(如 `, __fx: function(__comp){...}`,C1 闭包提升)\n */\nexport function applySubIdWraps(\n absStart: number,\n absEnd: number,\n source: string,\n candidates: readonly SubCandidate[],\n extras?: ReadonlyMap<number, string>,\n carriers?: ReadonlyMap<number, string>,\n): string {\n const inside = candidates.filter(\n (c) =>\n typeof c.start === 'number' &&\n typeof c.end === 'number' &&\n c.start >= absStart &&\n c.end <= absEnd &&\n c.end > c.start,\n )\n if (!inside.length) return source.slice(absStart, absEnd)\n\n // start ASC, end DESC:父在前,同区间不交叠(函数区间只嵌套)\n const sorted = [...inside].sort((a, b) => a.start - b.start || b.end - a.end)\n\n const render = (lo: number, hi: number, list: SubCandidate[]): string => {\n let out = ''\n let pos = lo\n for (const c of list) {\n if (c.start < pos) continue\n if (c.start > pos) out += source.slice(pos, c.start)\n const children = list.filter((x) => x !== c && x.start >= c.start && x.end <= c.end)\n const extra = extras?.get(c.subId) ?? ''\n const carRef = carriers?.get(c.subId)\n if (carRef && !extra) {\n // 自洽子模板:模块级常量 carrier,一次创建、全局共享\n out += carRef\n } else if (carRef) {\n // 需要逐次求值的 extras(__fx/__bv):新建载体但不带死体\n out += `Object.assign(function(){}, {__subId: ${c.subId}${extra}})`\n } else if (extra) {\n out += `Object.assign(function(){}, {__subId: ${c.subId}${extra}})`\n } else {\n // 无 carriers(未启用提升):保留原回调源码形态\n out += `Object.assign(${render(c.start, c.end, children)}, {__subId: ${c.subId}})`\n }\n pos = c.end\n }\n if (pos < hi) out += source.slice(pos, hi)\n return out\n }\n return render(absStart, absEnd, sorted)\n}\n\n/** 从 params 源码片段提取形参基名(`item = 1` → `item`;`...rest` → `rest`;解构取标识符)。 */\nexport function paramBaseNames(params: readonly string[]): Set<string> {\n const out = new Set<string>()\n for (const p of params) {\n let s = p.trim()\n if (s.startsWith('...')) s = s.slice(3)\n const eq = s.indexOf('=')\n if (eq >= 0) s = s.slice(0, eq)\n const idents = s.match(/[A-Za-z_$][\\w$]*/g)\n if (idents) for (const id of idents) out.add(id)\n }\n return out\n}\n\n/** cand 的嵌套祖先(由外到内:start 升序、end 降序,严格包含)。 */\nexport function enclosingCandidates(\n cand: SubCandidate,\n all: readonly SubCandidate[],\n): SubCandidate[] {\n const parents = all.filter(\n (o) =>\n o !== cand &&\n typeof o.start === 'number' &&\n typeof o.end === 'number' &&\n o.start <= cand.start &&\n cand.end <= o.end &&\n (o.start < cand.start || cand.end < o.end),\n )\n parents.sort((a, b) => a.start - b.start || b.end - a.end)\n return parents\n}\n\n// ---------- 形参源码 ----------\n\nfunction paramsSource(fn: any): string[] {\n const out: string[] = []\n for (const p of fn.params ?? []) {\n const t = p.type\n if (t === 'Identifier') {\n out.push(p.name)\n } else if (t === 'AssignmentPattern') {\n const left = paramsPattern(p.left)\n out.push(p.init ? `${left} = ${sliceNode(p.init)}` : left)\n } else if (t === 'RestElement') {\n out.push('...' + paramsPattern(p.argument))\n } else {\n const s = sliceNode(p)\n const stripped = stripTs(s)\n if (TS_SYNTAX_RE.test(stripped)) throw new SubExtractError(`回调形参含 TS 语法:${s}`)\n out.push(stripped)\n }\n }\n return out\n}\n\nfunction paramsPattern(pat: any): string {\n if (!pat) return ''\n switch (pat.type) {\n case 'Identifier':\n return pat.name\n case 'ObjectPattern':\n case 'ArrayPattern': {\n const s = sliceNode(pat)\n const stripped = stripTs(s)\n if (TS_SYNTAX_RE.test(stripped)) throw new SubExtractError(`回调解构形参含 TS 语法:${s}`)\n return stripped\n }\n case 'AssignmentPattern': {\n const left = paramsPattern(pat.left)\n return pat.init ? `${left} = ${sliceNode(pat.init)}` : left\n }\n case 'RestElement':\n return '...' + paramsPattern(pat.argument)\n default:\n throw new SubExtractError(`不支持的形参模式:${pat.type}`)\n }\n}\n\n// SOURCE 注入:切片依赖完整源码;collect 时通过 withSource 设置\nlet __source: string = ''\nfunction sliceNode(n: any): string {\n if (typeof n?.start !== 'number' || typeof n?.end !== 'number') {\n throw new SubExtractError('AST 节点缺少偏移,无法切片')\n }\n return __source.slice(n.start, n.end)\n}\n\n// ---------- 收集候选 ----------\n\ninterface CollectCtx {\n comp: ComponentAnalysis\n hAliases: Set<string>\n candidates: any[] // 未赋 subId 的裸 fn 节点\n seen: WeakSet<object>\n /** fn 节点 → 拥有它的 forEach 的集合实参源码 */\n collections: Map<object, string>\n}\n\nfunction isDirectiveCall(node: any, comp: ComponentAnalysis): string | null {\n if (node.type !== 'CallExpression' || node.callee?.type !== 'Identifier') return null\n const imported = comp.compelemImports.get(node.callee.name)\n if (imported && COMpelem_DIRECTIVES.has(imported)) return imported\n return null\n}\n\nfunction collectFromArgs(ctx: CollectCtx, directive: string, args: any[]): void {\n const flags = partitionDirectiveArgs(directive, args)\n // forEach 的 arg0 = 集合实参:记录源码供子模板 effect 建立信号依赖\n let collectionExpr: string | undefined\n if (directive === 'forEach' && args[0] && typeof args[0].type === 'string') {\n collectionExpr = __source.slice(args[0].start, args[0].end).trim()\n }\n args.forEach((arg, i) => {\n if (!arg || typeof arg.type !== 'string') return\n const isTemplate = flags[i]\n if (isTemplate && isFnNode(arg)) {\n if (collectionExpr !== undefined && !ctx.collections.has(arg)) {\n ctx.collections.set(arg, collectionExpr)\n }\n if (!ctx.candidates.includes(arg)) ctx.candidates.push(arg)\n walkCollect(ctx, arg)\n return\n }\n if (isTemplate && directive === 'when') {\n collectWhenCases(ctx, arg)\n return\n }\n // 非模板实参 / 非字面量模板位(Identifier 引用、内层 CallExpression 等)\n walkCollect(ctx, arg)\n })\n}\n\nfunction collectWhenCases(ctx: CollectCtx, cases: any): void {\n if (!cases || typeof cases.type !== 'string') return\n if (cases.type === 'ObjectExpression') {\n for (const prop of cases.properties ?? []) {\n if (prop.type === 'SpreadElement') {\n walkCollect(ctx, prop.argument)\n continue\n }\n const val = prop.value\n if (isFnNode(val)) {\n if (!ctx.candidates.includes(val)) ctx.candidates.push(val)\n walkCollect(ctx, val)\n } else {\n walkCollect(ctx, val)\n }\n }\n return\n }\n if (cases.type === 'ArrayExpression') {\n for (const el of cases.elements ?? []) {\n if (!el) continue\n if (isFnNode(el)) {\n if (!ctx.candidates.includes(el)) ctx.candidates.push(el)\n walkCollect(ctx, el)\n continue\n }\n if (el.type === 'ArrayExpression') {\n // [condFn, tmplFn]\n const els = el.elements ?? []\n if (els[0]) walkCollect(ctx, els[0])\n const tmpl = els[1]\n if (isFnNode(tmpl)) {\n if (!ctx.candidates.includes(tmpl)) ctx.candidates.push(tmpl)\n walkCollect(ctx, tmpl)\n } else if (tmpl) {\n walkCollect(ctx, tmpl)\n }\n continue\n }\n walkCollect(ctx, el)\n }\n return\n }\n // 非字面量(Identifier 等)→ 运行时 fallback,无候选\n}\n\nfunction walkCollect(ctx: CollectCtx, node: any): void {\n if (!node || typeof node.type !== 'string') return\n if (ctx.seen.has(node)) return\n ctx.seen.add(node)\n\n const directive = isDirectiveCall(node, ctx.comp)\n if (directive) {\n collectFromArgs(ctx, directive, node.arguments ?? [])\n return\n }\n\n // 普通嵌套继续下钻(含非指令回调体内的指令)\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const c = node[key]\n if (Array.isArray(c)) for (const x of c) walkCollect(ctx, x)\n else if (c && typeof c === 'object' && typeof c.type === 'string') walkCollect(ctx, c)\n }\n}\n\n// ---------- 回调解析:唯一 h`` + prelude + vars ----------\n\nfunction findTemplateHits(ctx: CollectCtx, fn: any): any[] {\n const hits: any[] = []\n const walk = (node: any): void => {\n if (!node || typeof node.type !== 'string') return\n if (\n node.type === 'TaggedTemplateExpression' &&\n node.tag?.type === 'Identifier' &&\n ctx.hAliases.has(node.tag.name)\n ) {\n hits.push(node)\n return\n }\n // 不把嵌套 h`` 的内部表达式算作额外命中(D7 已禁插值处嵌套模板)\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const c = node[key]\n if (Array.isArray(c)) for (const x of c) walk(x)\n else if (c && typeof c === 'object' && typeof c.type === 'string') walk(c)\n }\n }\n walk(fn.body)\n return hits\n}\n\nfunction buildCandidate(ctx: CollectCtx, fn: any): SubCandidate {\n const body = fn.body\n const isBlock = body?.type === 'BlockStatement'\n let hit: any\n let preludeStart = fn.start\n let preludeEnd = fn.start\n let preludeSrc = ''\n\n if (!isBlock) {\n const hits = findTemplateHits(ctx, fn)\n const bare = unwrapExpr(body)\n if (hits.length !== 1 || bare !== hits[0]) {\n throw new SubExtractError(\n `回调 @${fn.start} 需要唯一 h\\`\\` 模板(命中 ${hits.length} 个,表达式体须直接返回模板)`,\n )\n }\n hit = hits[0]\n } else {\n const rets = topLevelReturns(body.body)\n const retHits: any[] = []\n for (const r of rets) {\n const arg = unwrapExpr(r.argument)\n if (\n arg?.type === 'TaggedTemplateExpression' &&\n arg.tag?.type === 'Identifier' &&\n ctx.hAliases.has(arg.tag.name)\n ) {\n retHits.push(arg)\n }\n }\n const allHits = findTemplateHits(ctx, fn)\n if (allHits.length === 0) {\n throw new SubExtractError(`回调 @${fn.start} 内未找到 h\\`\\` 模板`)\n }\n if (allHits.length > 1) {\n throw new SubExtractError(`回调 @${fn.start} 内发现 ${allHits.length} 个 h\\`\\` 模板,codegen 要求唯一`)\n }\n if (retHits.length !== 1 || retHits[0] !== allHits[0]) {\n throw new SubExtractError(`回调 @${fn.start} 的 h\\`\\` 必须是函数体顶层 return 的直接参数`)\n }\n hit = retHits[0]\n // prelude = return 之前的全部顶层语句\n const retNode = rets.find((r) => unwrapExpr(r.argument) === hit)\n const stmts = body.body\n const retIdx = stmts.indexOf(retNode)\n if (retIdx > 0) {\n preludeStart = stmts[0].start\n preludeEnd = stmts[retIdx - 1].end\n preludeSrc = __source.slice(preludeStart, preludeEnd)\n }\n }\n\n const quasi: any = hit.quasi\n const strings: string[] = (quasi.quasis ?? []).map((q: any) => String(q.value?.cooked ?? ''))\n const exprs: any[] = quasi.expressions ?? []\n const vars: TemplateVarInfo[] = exprs.map((e: any, index: number) => {\n const exprSource = __source.slice(e.start, e.end).trim()\n let isDirectiveCallFlag = false\n let directiveName: string | undefined\n let moduleBindingName: string | undefined\n if (e.type === 'CallExpression' && e.callee?.type === 'Identifier') {\n const imported = ctx.comp.compelemImports.get(e.callee.name)\n if (imported && COMpelem_DIRECTIVES.has(imported)) {\n isDirectiveCallFlag = true\n directiveName = imported\n } else if (ctx.comp.moduleBindings?.has(e.callee.name)) {\n // 同 template-extract:模块绑定只记名,指令判定交由标签位 codegen 放行\n moduleBindingName = e.callee.name\n }\n }\n return {\n index,\n exprSource,\n isDirectiveCall: isDirectiveCallFlag,\n directiveName,\n moduleBindingName,\n start: e.start,\n end: e.end,\n }\n })\n\n return {\n subId: -1,\n start: fn.start,\n end: fn.end,\n params: paramsSource(fn),\n preludeStart,\n preludeEnd,\n preludeSrc,\n strings,\n vars,\n }\n}\n\n/**\n * 收集组件 render() 内全部结构指令模板回调,按绝对 start 排序分配 subId。\n * 无主模板 / 无回调时返回 []。\n */\nexport function collectSubCandidates(comp: ComponentAnalysis, source: string): SubCandidate[] {\n if (!comp.renderBody) return []\n const hAliases = collectTemplateTagAliases(comp)\n if (!hAliases.size) return []\n\n const prevSource = __source\n __source = source\n try {\n const ctx: CollectCtx = {\n comp,\n hAliases,\n candidates: [],\n seen: new WeakSet<object>(),\n collections: new Map<object, string>(),\n }\n const body = Array.isArray(comp.renderBody) ? comp.renderBody : [comp.renderBody]\n for (const stmt of body) walkCollect(ctx, stmt)\n if (!ctx.candidates.length) return []\n\n // 绝对 start 升序 → 稳定 subId\n const nodes = [...ctx.candidates].sort(\n (a, b) => (a.start ?? 0) - (b.start ?? 0) || (b.end ?? 0) - (a.end ?? 0),\n )\n return nodes.map((fn, i) => {\n const cand = buildCandidate(ctx, fn)\n cand.subId = i\n const coll = ctx.collections.get(fn)\n if (coll !== undefined) cand.collectionExpr = coll\n return cand\n })\n } catch (e) {\n if (e instanceof SubExtractError || e instanceof TemplateExtractError) throw e\n throw new SubExtractError(e instanceof Error ? e.message : String(e))\n } finally {\n __source = prevSource\n }\n}\n\n/** 从 MainTemplate 提取失败时的兼容出口(D7 等在 extractMainTemplate 抛 TemplateExtractError)。 */\nexport type { MainTemplate }\n","/**\n * cssVars / @computed getter 的响应式依赖静态提取(编译期静态分析)。\n *\n * 语义(只收集响应式读取;宁可省略键走全根兜底,不可欠收集):\n *\n * 1. 纯语法并集:三目/逻辑短路不裁剪,凡可达的 this 链读取一律入集。\n * 2. 依赖入口三合一:\n * - this 链(`this.a.b`;`this.arr[i]` 取静态前缀 `arr` 并继续扫描下标表达式)\n * - 别名等价类(`let that = this`、传递、后置赋值——预扫描 fixpoint,进箭头、不进非箭头函数体)\n * - 解构捕获(`const {a, b: {c}} = this` → 记 `a` / `b.c`;rest/数组解构 → 放弃该键)\n * 失败入口:裸 this / 裸别名逃逸(`return that`、`f(this)`、`[...this]`)→ 该 getter 放弃(键省略)\n * 3. 链根五级分级:\n * ① fields(prop/state/computed)→ 记录链路 + 根\n * ② queryFields(@query/@queryAll,非响应式)→ 记录死条目\n * ③ own bodies(方法/普通 getter/箭头字段)→ 内联扫体(不记 root,inlineDepth ≤ 8 防环)\n * ④ 同文件祖先(localClasses + classInfoOf 记忆)→ 同级处理\n * ⑤ 未知(跨文件基类成员、mixin 链、this.slots、super 等)→ 放弃该 getter\n * 4. 调用表达式:callee 为 this/别名链 → 按③分级;自由/模块/局部 callee → 只扫实参\n * (模块函数的 this 非组件实例);FunctionExpression/Declaration 体内含 this → 放弃。\n * 5. 自由/局部/形参/模块标识符一律忽略(非响应式读取不收集)。\n * 6. 嵌套箭头共享 this 等价类,词法下钻。\n *\n * 失败语义:cssVars 任一失败 → 整体 undefined(不注入,运行时全根兜底);\n * @computed 失败键跳过(该键运行时全根兜底),全部失败 → 注入空对象;无 @computed → undefined。\n *\n * 调试:环境变量 DEPS_TRACE=1 时每次失败向 stderr 输出 `[deps-fail] <原因标签>`。\n */\nimport type { ComponentAnalysis } from '../types'\nimport { keyName } from '../utils/oxc'\nimport { classInfoOf, superClassName } from './component'\n\ninterface ExtractCtx {\n comp: ComponentAnalysis\n localClasses: Map<string, any>\n /** 本组件可识别的 compelem 导入原名集合(用于链终点 CompElem 判定) */\n aliases: Set<string>\n /** this 等价类:预扫描收集的别名名 */\n aliasNames: Set<string>\n /** 豁免的 ThisExpression(别名/解构声明 init 位,身份判定) */\n exemptThis: Set<object>\n deps: Set<string>\n failed: boolean\n seen: WeakSet<object>\n /** 内联扫体深度(防环) */\n depth: number\n}\n\nfunction record(ctx: ExtractCtx, path: string[]) {\n const full = path.join('.')\n ctx.deps.add(full)\n if (path.length > 1) ctx.deps.add(path[0])\n}\n\n/** TS 包装节点解包(`this as any` / `that!` 等) */\nfunction isTsWrapper(node: any): boolean {\n const t = node?.type\n return (\n t === 'TSAsExpression' ||\n t === 'TSSatisfiesExpression' ||\n t === 'TSNonNullExpression' ||\n t === 'TSInstantiationExpression' ||\n t === 'ParenthesizedExpression'\n )\n}\nfunction unwrapTs(node: any): any {\n let cur = node\n while (cur && isTsWrapper(cur)) cur = cur.expression\n return cur\n}\n\n/** 置失败标记;DEPS_TRACE=1 时输出原因标签(见文件头)。 */\nfunction failAt(ctx: ExtractCtx, where: string) {\n if (typeof process !== 'undefined' && process.env?.DEPS_TRACE) {\n console.error('[deps-fail]', where)\n }\n ctx.failed = true\n}\n\n// ---------------------------------------------------------------------------\n// 预扫描:this 别名等价类 + 解构捕获\n// ---------------------------------------------------------------------------\n\nfunction addAlias(ctx: ExtractCtx, name: string, mark: () => void) {\n if (ctx.aliasNames.has(name)) return\n ctx.aliasNames.add(name)\n mark()\n}\n\n/** `const {a, b: {c}} = <this|别名>` 的模式绑定:成员位记依赖,rest/数组解构放弃该键 */\nfunction bindMemberPattern(ctx: ExtractCtx, pat: any, prefix: string[], mark: () => void) {\n if (!pat) return\n switch (pat.type) {\n case 'Identifier':\n record(ctx, [...prefix, pat.name]) // 记录不触发 fixpoint(非别名变化)\n break\n case 'ObjectPattern':\n for (const p of pat.properties ?? []) {\n if (p.type === 'RestElement') {\n failAt(ctx, 'destructure-rest')\n return\n }\n const key = keyName(p.key)\n if (!key || p.computed) {\n failAt(ctx, 'destructure-key')\n return\n }\n bindMemberPattern(ctx, p.value, [...prefix, key], mark)\n }\n break\n case 'AssignmentPattern':\n bindMemberPattern(ctx, pat.left, prefix, mark)\n break\n case 'ArrayPattern':\n case 'RestElement':\n failAt(ctx, 'destructure-array')\n break\n }\n}\n\n/** 声明绑定:顶层 Identifier → 别名;ObjectPattern → 按成员捕获记依赖 */\nfunction bindFrom(ctx: ExtractCtx, pat: any, mark: () => void) {\n if (!pat) return\n switch (pat.type) {\n case 'Identifier':\n addAlias(ctx, pat.name, mark)\n break\n case 'ObjectPattern':\n for (const p of pat.properties ?? []) {\n if (p.type === 'RestElement') {\n failAt(ctx, 'bind-rest')\n return\n }\n const key = keyName(p.key)\n if (!key || p.computed) {\n failAt(ctx, 'bind-key')\n return\n }\n bindMemberPattern(ctx, p.value, [key], mark)\n }\n break\n case 'AssignmentPattern':\n bindFrom(ctx, pat.left, mark)\n break\n case 'ArrayPattern':\n failAt(ctx, 'bind-array')\n break\n }\n}\n\n/**\n * fixpoint 预扫描:收集别名等价类与解构捕获。\n * 进入箭头(共享 this),不进入 FunctionExpression/FunctionDeclaration/Class 体。\n */\nfunction prescanBody(ctx: ExtractCtx, nodes: any[]): void {\n const walk = (node: any, mark: () => void): void => {\n if (!node || typeof node.type !== 'string') return\n const t = node.type\n if (\n t === 'FunctionExpression' ||\n t === 'FunctionDeclaration' ||\n t === 'ClassDeclaration' ||\n t === 'ClassExpression'\n ) {\n return\n }\n if (t === 'VariableDeclarator') {\n const init = unwrapTs(node.init)\n if (init) {\n if (init.type === 'ThisExpression') {\n ctx.exemptThis.add(init)\n bindFrom(ctx, node.id, mark)\n } else if (init.type === 'Identifier' && ctx.aliasNames.has(init.name)) {\n bindFrom(ctx, node.id, mark)\n }\n }\n } else if (t === 'AssignmentExpression') {\n const right = unwrapTs(node.right)\n if (right && node.left?.type === 'Identifier') {\n if (right.type === 'ThisExpression') {\n ctx.exemptThis.add(right)\n addAlias(ctx, node.left.name, mark)\n } else if (right.type === 'Identifier' && ctx.aliasNames.has(right.name)) {\n addAlias(ctx, node.left.name, mark)\n }\n }\n }\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const child = node[key]\n if (Array.isArray(child)) {\n for (const c of child) walk(c, mark)\n } else if (child && typeof child === 'object' && typeof child.type === 'string') {\n walk(child, mark)\n }\n }\n }\n\n for (let round = 0; round < 16; round++) {\n let changed = false\n const mark = () => {\n changed = true\n }\n for (const n of nodes) walk(n, mark)\n if (!changed) return\n if (round === 15) failAt(ctx, 'alias-round15') // 别名链过深未收敛 → 保守放弃\n }\n}\n\n// ---------------------------------------------------------------------------\n// 链解析与根分级\n// ---------------------------------------------------------------------------\n\n/**\n * 从表达式解析「以 this/别名起始的最长静态路径」。\n * 返回 `{ path: [...] }`(可能为空 = 裸 this/别名)、`{ path: null }`(根级动态 `this[x]`)、\n * `null`(非 this/别名 起始)。遇到中间 computed 止步于前缀(更深下标由 scanChainRemainders 扫描)。\n */\nfunction resolveChain(ctx: ExtractCtx, node: any): { path: string[] | null } | null {\n let cur = unwrapTs(node)\n if (cur.type === 'ThisExpression') return { path: [] }\n if (cur.type === 'Identifier' && ctx.aliasNames.has(cur.name)) return { path: [] }\n if (cur.type === 'MemberExpression' || cur.type === 'OptionalMemberExpression') {\n if (cur.computed) {\n const inner = resolveChain(ctx, cur.object)\n if (!inner || inner.path === null) return inner\n if (inner.path.length === 0) return { path: null } // this[x] 根级动态\n return inner // 前缀止于 computed;下标表达式留给 scanChainRemainders\n }\n const name = keyName(cur.property)\n const inner = resolveChain(ctx, cur.object)\n if (!inner) return null\n if (inner.path === null) return inner\n if (!name) return { path: null }\n return { path: [...inner.path, name] }\n }\n return null\n}\n\n/** 分级结果:命中(已记录/已内联)/ 未命中(继续向上找)/ 失败。 */\nfunction applyLevel(\n ctx: ExtractCtx,\n level: {\n fields: Map<string, any>\n queryFields?: Set<string>\n bodies?: Map<string, any>\n methods?: Set<string>\n getters?: Set<string>\n },\n path: string[],\n): 'hit' | 'miss' | 'fail' {\n const root = path[0]\n if (level.fields.has(root)) {\n record(ctx, path)\n return 'hit'\n }\n if (level.queryFields?.has(root)) {\n record(ctx, path) // @query 非响应式:死条目(运行时永不通知,无害)\n return 'hit'\n }\n if (level.bodies?.has(root)) {\n inlineScan(ctx, level.bodies.get(root))\n return 'hit' // 内联扫体,不记 root\n }\n if (level.methods?.has(root) || level.getters?.has(root)) return 'fail' // 有名无体 → 未知\n return 'miss'\n}\n\n/** 链根五级分级:① own → ② query → ③ own bodies → ④ 同文件祖先 → ⑤ 未知失败。 */\nfunction classifyPath(ctx: ExtractCtx, path: string[]): void {\n const comp = ctx.comp\n const own = applyLevel(\n ctx,\n {\n fields: comp.fields,\n queryFields: comp.queryFields,\n bodies: comp.bodies,\n methods: comp.ownMethods,\n getters: comp.ownGetters,\n },\n path,\n )\n if (own !== 'miss') {\n if (own === 'fail') failAt(ctx, 'own-no-body')\n return\n }\n\n let node: any = comp.cls ?? ctx.localClasses.get(comp.className)\n const seenCls = new Set<any>()\n for (let i = 0; node && i < 8; i++) {\n const sup = superClassName(node)\n if (!sup) break\n if (ctx.aliases.has('CompElem') && sup === 'CompElem') break // 链终点:根未知\n const parent = ctx.localClasses.get(sup)\n if (!parent || seenCls.has(parent)) {\n if (!parent) failAt(ctx, 'cross-file') // 跨文件基类 → 未知\n break\n }\n seenCls.add(parent)\n const info = classInfoOf(parent, ctx.aliases)\n const hit = applyLevel(\n ctx,\n {\n fields: info.fields,\n queryFields: info.queryFields,\n bodies: info.bodies,\n methods: info.methods,\n getters: info.getters,\n },\n path,\n )\n if (hit !== 'miss') {\n if (hit === 'fail') failAt(ctx, 'ancestor-no-body')\n return\n }\n node = parent\n }\n failAt(ctx, 'unknown-root') // 五级尽未命中(含 this.slots / super)→ 该键省略 → 运行时全根兜底\n}\n\n// ---------------------------------------------------------------------------\n// 主扫描\n// ---------------------------------------------------------------------------\n\nfunction subtreeHasThis(node: any): boolean {\n if (!node || typeof node.type !== 'string') return false\n if (node.type === 'ThisExpression') return true\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const c: any = node[key]\n if (Array.isArray(c)) {\n for (const x of c) if (subtreeHasThis(x)) return true\n } else if (c && typeof c === 'object' && typeof c.type === 'string') {\n if (subtreeHasThis(c)) return true\n }\n }\n return false\n}\n\n/** 裸别名的合法位:声明/赋值/链根。其余(实参、return、spread…)= 逃逸 → 失败。 */\nfunction legalAliasPos(node: any, parent: any): boolean {\n if (!parent) return false\n if (parent.type === 'VariableDeclarator') return parent.id === node || parent.init === node\n if (parent.type === 'AssignmentExpression') return parent.left === node\n if (parent.type === 'MemberExpression' || parent.type === 'OptionalMemberExpression') {\n return parent.object === node\n }\n return false\n}\n\n/** 链分类后补扫 computed 下标表达式(`this.arr[this.i]` 的 `this.i` 不可漏)。 */\nfunction scanChainRemainders(ctx: ExtractCtx, node: any): void {\n let cur: any = node\n while (cur) {\n if (isTsWrapper(cur)) {\n cur = cur.expression\n continue\n }\n if (cur.type === 'MemberExpression' || cur.type === 'OptionalMemberExpression') {\n if (cur.computed) scanNode(ctx, cur.property, cur)\n cur = cur.object\n continue\n }\n break\n }\n}\n\nfunction toStatements(bodyNode: any): any[] {\n if (!bodyNode) return []\n if (bodyNode.type === 'BlockStatement') return bodyNode.body ?? []\n return [{ type: 'ExpressionStatement', expression: bodyNode }]\n}\n\n/** 内联扫体:方法/getter/箭头字段的函数体直接展开扫描(不记 root)。 */\nfunction inlineScan(ctx: ExtractCtx, bodyNode: any): void {\n if (ctx.failed) return\n if (ctx.depth >= 8) {\n failAt(ctx, 'depth') // 深度超限(递归调用环)→ 保守放弃\n return\n }\n ctx.depth++\n const snapAlias = new Set(ctx.aliasNames)\n try {\n const nodes = toStatements(bodyNode)\n prescanBody(ctx, nodes)\n for (const stmt of nodes) scanNode(ctx, stmt, null)\n } finally {\n ctx.aliasNames = snapAlias\n ctx.depth--\n }\n}\n\nfunction scanNode(ctx: ExtractCtx, node: any, parent: any): void {\n if (ctx.failed || !node || typeof node.type !== 'string') return\n if (ctx.seen.has(node)) return\n ctx.seen.add(node)\n\n // --- TS 包装:透传 parent(裸 this/别名的合法位判定要看真实位置) ---\n if (isTsWrapper(node)) {\n scanNode(ctx, node.expression, parent)\n return\n }\n\n // --- 非箭头函数:体内含 this(含参数默认值/嵌套箭头)→ 非组件 this → 放弃 ---\n if (node.type === 'FunctionExpression' || node.type === 'FunctionDeclaration') {\n if (subtreeHasThis(node)) {\n failAt(ctx, 'fn-this')\n return\n }\n // 无 this → 参数/体可安全下钻(通用规则)\n }\n\n // --- super:组件外基类成员 → 未知 ---\n if (node.type === 'Super') {\n failAt(ctx, 'super')\n return\n }\n\n // --- this/别名链(只在最外层分类一次) ---\n if (node.type === 'MemberExpression' || node.type === 'OptionalMemberExpression') {\n const parentIsMember =\n parent &&\n (parent.type === 'MemberExpression' || parent.type === 'OptionalMemberExpression') &&\n parent.object === node\n if (!parentIsMember) {\n const resolved = resolveChain(ctx, node)\n if (resolved) {\n if (resolved.path === null) {\n failAt(ctx, 'dynamic-index') // 根级动态 this[x]\n return\n }\n classifyPath(ctx, resolved.path)\n if (ctx.failed) return\n scanChainRemainders(ctx, node)\n return\n }\n // 非 this/别名 起始 → 通用下钻(object 内可能有调用包裹的 this 链)\n }\n }\n\n // --- 裸 this(豁免位 = 别名/解构声明 init,由预扫描记录) ---\n if (node.type === 'ThisExpression') {\n if (!ctx.exemptThis.has(node)) {\n failAt(ctx, 'bare-this')\n return\n }\n return\n }\n\n // --- 裸别名(链位已由 classify 消费;到这里 = 逃逸) ---\n if (node.type === 'Identifier' && ctx.aliasNames.has(node.name)) {\n if (!legalAliasPos(node, parent)) {\n failAt(ctx, 'alias-escape')\n return\n }\n return\n }\n\n // --- 其余标识符(自由/局部/形参/模块绑定):一律忽略,规则5 ---\n // --- 通用下钻:三目/逻辑/嵌套箭头纯语法并集 ---\n for (const key of Object.keys(node)) {\n if (key === 'type' || key === 'start' || key === 'end' || key === 'parent') continue\n const child = node[key]\n if (Array.isArray(child)) {\n for (const c of child) scanNode(ctx, c, node)\n } else if (child && typeof child === 'object' && typeof child.type === 'string') {\n scanNode(ctx, child, node)\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// 入口\n// ---------------------------------------------------------------------------\n\nfunction runExtract(\n comp: ComponentAnalysis,\n localClasses: Map<string, any> | undefined,\n body: any[],\n): string[] | undefined {\n const ctx: ExtractCtx = {\n comp,\n localClasses: localClasses ?? new Map(),\n aliases: new Set(comp.compelemImports.values()),\n aliasNames: new Set<string>(),\n exemptThis: new Set<object>(),\n deps: new Set<string>(),\n failed: false,\n seen: new WeakSet<object>(),\n depth: 0,\n }\n prescanBody(ctx, body)\n for (const stmt of body) scanNode(ctx, stmt, null)\n if (ctx.failed) return undefined\n return [...ctx.deps]\n}\n\n/**\n * 提取 `get cssVars()` 的响应式依赖。无法静态化时返回 undefined(不注入,运行时全根兜底)。\n * 无 cssVars getter 或 getter 体为空 → 返回 [](合法的空依赖)。\n */\nexport function extractCssDeps(\n comp: ComponentAnalysis,\n localClasses?: Map<string, any>,\n): string[] | undefined {\n if (!comp.cssVarsBody) return undefined // 无自有 getter(可能继承基类)→ 不注入\n if (!comp.cssVarsBody.length) return []\n return runExtract(comp, localClasses, comp.cssVarsBody)\n}\n\n/**\n * 提取各 `@computed` getter 的响应式依赖(per-key):\n * - 失败键跳过(该键运行时全根兜底);全部失败 → 注入空对象;\n * - 无 @computed → undefined(不注入)。\n */\nexport function extractComputedDeps(\n comp: ComponentAnalysis,\n localClasses?: Map<string, any>,\n): Record<string, string[]> | undefined {\n if (!comp.computedBodies || comp.computedBodies.size === 0) return undefined\n const out: Record<string, string[]> = {}\n for (const [name, body] of comp.computedBodies) {\n if (!body.length) {\n out[name] = []\n continue\n }\n const deps = runExtract(comp, localClasses, body)\n if (deps === undefined) continue // 失败键省略 → 运行时全根兜底\n out[name] = deps\n }\n return out\n}\n","/**\n * 模板源码级解析:h`` 模板字面量(strings + 插值)→ 节点树 IR(TNode)。\n *\n * 与运行时正则管线(parseTemplate/convertHTML/createTemplate)的**根本区别**:\n * 本模块解析的是**开发者源码**(见 docs/TEMPLATE-CODEGEN.md §3)——\n * 不做 innerHTML 解析、convertHTML、自动闭合与实体解码。\n * 相关容错行为在本层均为**编译错误**(静态编译唯一路径)。\n *\n * 占位符 token 与 compelem `src/constants.ts` 的 PLACEHOLDER 一致:\n * 解析时以 `⟬Ċ⟭N`(N = Template 序,即源码插值顺序)拼接 quasis,\n * 与运行时 parseTemplate 的编号空间相同 —— 保证 attrTmpl 生成物逐字节可比。\n */\n\n/** 与 compelem constants.ts PLACEHOLDER 完全一致(⟬ + Ċ + ⟭)。 */\nexport const PLACEHOLDER = '⟬Ċ⟭'\n\nconst TOKEN_RE = new RegExp(`${PLACEHOLDER}(\\\\d+)`, 'g')\n\n/** HTML void 元素(不需要闭合标签)。 */\nexport const VOID_TAGS = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr',\n])\n\nexport const SVG_NS = 'http://www.w3.org/2000/svg'\n\n// ---------- IR 数据结构 ----------\n\nexport interface TStaticPart { type: 'static'; text: string }\nexport interface TVarPart { type: 'var'; index: number }\nexport type TPart = TStaticPart | TVarPart\n\nexport interface TAttr {\n /** 源码属性名(保留前缀字符 . ? @ * 与大小写) */\n name: string\n /** 原始值(未解码);null = 无值属性(如布尔写法) */\n value: string | null\n /** 值按插值拆分 */\n parts: TPart[]\n}\n\nexport interface TElement {\n type: 'element'\n tag: string\n attrs: TAttr[]\n children: TNode[]\n ns: 'html' | 'svg'\n}\n\nexport interface TText {\n type: 'text'\n raw: string\n parts: TPart[]\n}\n\nexport interface TComment {\n type: 'comment'\n text: string\n}\n\nexport type TNode = TElement | TText | TComment\n\n/** 带源码位置的错误(偏移基于拼接后的 html 串)。 */\nexport class TemplateParseError extends Error {\n constructor(\n message: string,\n public readonly pos: number,\n ) {\n super(message)\n }\n}\n\n// ---------- 拼接与拆分 ----------\n\n/** quasis + 插值 → 源码级 html 串(插值以 ⟬Ċ⟭N 占位)。 */\nexport function buildTemplateHTML(strings: readonly string[]): string {\n let html = ''\n for (let i = 0; i < strings.length; i++) {\n html += strings[i]\n if (i < strings.length - 1) html += PLACEHOLDER + i\n }\n return html\n}\n\n/** 把含占位符的字符串拆成 static/var 片段(每次调用重置 lastIndex,避免 /g 状态泄漏)。 */\nexport function splitParts(s: string): TPart[] {\n const parts: TPart[] = []\n let last = 0\n TOKEN_RE.lastIndex = 0\n let m: RegExpExecArray | null\n while ((m = TOKEN_RE.exec(s))) {\n if (m.index > last) parts.push({ type: 'static', text: s.slice(last, m.index) })\n parts.push({ type: 'var', index: parseInt(m[1]) })\n last = m.index + m[0].length\n }\n if (last < s.length) parts.push({ type: 'static', text: s.slice(last) })\n return parts\n}\n\n// ---------- 解析器 ----------\n\nexport interface TemplateTree {\n /** 根级节点 */\n root: TNode[]\n}\n\n/**\n * 解析源码级模板串为节点树。\n *\n * 抛出 `TemplateParseError` 表示源码写法不受 codegen 支持(静态编译下不允许回退)。\n */\nexport function parseTemplateTree(\n html: string,\n varCount: number,\n): TemplateTree {\n const root: TNode[] = []\n const stack: OpenTag[] = []\n let inSvg = false\n let i = 0\n const n = html.length\n\n const err = (msg: string): never => {\n throw new TemplateParseError(msg, i)\n }\n\n while (i < n) {\n const parent = stack.length ? stack[stack.length - 1].node.children : root\n\n if (html.startsWith('<!--', i)) {\n const end = html.indexOf('-->', i + 4)\n if (end < 0) err('注释未闭合')\n const text = html.slice(i + 4, end)\n if (TOKEN_RE.test(text)) err('注释内不允许出现模板插值(会被静默丢弃)')\n parent.push({ type: 'comment', text })\n i = end + 3\n continue\n }\n\n if (html[i] === '<') {\n // 结束标签\n if (html[i + 1] === '/') {\n const m = /^<\\/\\s*([^\\s>]+)\\s*>/.exec(html.slice(i))\n if (!m) err('非法的结束标签')\n const lower = m![1].toLowerCase()\n let found = -1\n for (let k = stack.length - 1; k >= 0; k--) {\n if (stack[k].lower === lower) { found = k; break }\n }\n if (found < 0) err(`</${m![1]}> 没有对应的开始标签`)\n if (found !== stack.length - 1) {\n err(`<${stack[stack.length - 1].name}> 未闭合(不支持 HTML 自动闭合,请显式书写结束标签)`)\n }\n const popped = stack.pop()!\n if (popped.lower === 'svg') inSvg = false\n i += m![0].length\n continue\n }\n\n // 开始标签\n if (!/[a-zA-Z]/.test(html[i + 1] || '')) err(`'<' 后未跟标签名(如需文本请转义)`)\n const rest = html.slice(i)\n const nameMatch = /^<([^\\s/>]+?)(?=[\\s/>])/.exec(rest)\n if (!nameMatch) err('非法的标签名')\n const tag = nameMatch![1]\n const lower = tag.toLowerCase()\n // <svg> 自身也是 SVG 命名空间(对齐 innerHTML 语义)\n const el: TElement = {\n type: 'element',\n tag,\n attrs: [],\n children: [],\n ns: inSvg || lower === 'svg' ? 'svg' : 'html',\n }\n parent.push(el)\n\n // 属性区\n let j = i + 1 + tag.length\n let selfClosing = false\n while (j < n) {\n while (j < n && /\\s/.test(html[j])) j++\n if (j >= n) err(`标签 <${tag}> 未闭合`)\n if (html[j] === '>') { j++; break }\n if (html[j] === '/' && html[j + 1] === '>') { selfClosing = true; j += 2; break }\n let nameStart = j\n while (j < n && !/[\\s=/>]/.test(html[j])) j++\n if (j === nameStart) err(`标签 <${tag}> 的属性区非法(位置 ${j})`)\n const attrName = html.slice(nameStart, j)\n let attrValue: string | null = null\n let k = j\n while (k < n && /\\s/.test(html[k])) k++\n if (html[k] === '=') {\n k++\n while (k < n && /\\s/.test(html[k])) k++\n const q = html[k]\n if (q === '\"' || q === '\\'') {\n const endQ = html.indexOf(q, k + 1)\n if (endQ < 0) err(`属性 ${attrName} 的引号未闭合`)\n attrValue = html.slice(k + 1, endQ)\n j = endQ + 1\n } else {\n const vStart = k\n while (k < n && !/[\\s>]/.test(html[k])) k++\n attrValue = html.slice(vStart, k)\n j = k\n }\n }\n el.attrs.push({ name: attrName, value: attrValue, parts: attrValue == null ? [] : splitParts(attrValue) })\n }\n i = j\n\n // 属性区约束(静态编译硬约束)\n for (const a of el.attrs) {\n const nameParts = splitParts(a.name)\n const nameVars = nameParts.filter((p): p is TVarPart => p.type === 'var')\n if (nameVars.length > 1 || (nameVars.length === 1 && a.name !== PLACEHOLDER + nameVars[0].index)) {\n err(`属性名 ${a.name} 只允许整体为一个插值(标签位指令写法),不允许部分插值`)\n }\n const valVars = a.parts.filter((p): p is TVarPart => p.type === 'var').length\n if (valVars > 1) err(`属性 ${a.name} 的值最多允许一个插值(对齐 EXP_ATTR_CHECK)`)\n // 实体检查对静态/动态属性都生效(setAttribute 不解码,与 innerHTML 行为有差异 → 强制写明面字符)\n if (a.value != null && /&[a-zA-Z#0-9]+;/.test(a.value)) {\n err(`属性 ${a.name} 的值包含 HTML 实体;codegen 不做实体解码,请直接书写目标字符`)\n }\n }\n\n if (lower === 'svg') inSvg = true\n if (lower === 'foreignobject') err('foreignObject 暂不支持(v1)')\n\n if (!selfClosing && !VOID_TAGS.has(lower)) {\n stack.push({ name: tag, lower, node: el })\n }\n continue\n }\n\n // 文本节点:到下一个 '<' 为止(原样保留,含纯空白 —— 分裂/裁剪在 codegen 层做)\n let end = html.indexOf('<', i)\n if (end < 0) end = n\n const raw = html.slice(i, end)\n parent.push({ type: 'text', raw, parts: splitParts(raw) })\n i = end\n }\n\n if (stack.length) {\n err(`<${stack[stack.length - 1].name}> 未闭合(不支持 HTML 自动闭合,请显式书写结束标签)`)\n }\n\n // 插值槽完整性:每个 varIndex 必须在树里恰好出现一次\n const seen = new Set<number>()\n const visit = (nodes: TNode[]) => {\n for (const nd of nodes) {\n if (nd.type === 'text') {\n for (const p of nd.parts) if (p.type === 'var') seen.add(p.index)\n } else if (nd.type === 'element') {\n for (const a of nd.attrs) {\n for (const p of a.parts) if (p.type === 'var') seen.add(p.index)\n for (const p of splitParts(a.name)) if (p.type === 'var') seen.add(p.index)\n }\n visit(nd.children)\n }\n }\n }\n visit(root)\n for (let v = 0; v < varCount; v++) {\n if (!seen.has(v)) err(`插值槽 ${v} 未在模板结构中出现`)\n }\n if (seen.size !== varCount) err('模板中出现未知编号的插值槽')\n\n // <transition> 在解包阶段显式拦截(见 unwrapList)\n const newRoot = unwrapList(root)\n\n // 编译期剔除「仅排版用的空白文本」节点:源码换行/缩进会解析出不带占位符的\n // 纯空白 Text,它们在 innerHTML 路径里会变成空 Text 节点,白占 nodes[] 名额与\n // clone/effect 开销。判据:`raw` 全是空白(只含空格/Tab/换行)⇒ 纯排版空白。\n //\n // ⚠️ 代价(已知取舍):`</b> <span>` 这类**同一行内**、两个内联元素之间的单个空格\n // 也会被剔除,渲染时两者直接相邻。依赖该空格做视觉分隔的写法请改用 CSS\n // (gap / margin)表达。rawtext 系(script/style/textarea/title/xmp/listing/pre)\n // 的空白是真内容,一律不动。\n const RAWTEXT = new Set(['script','style','textarea','title','xmp','listing','pre'])\n const prune = (nodes: TNode[], parentTag: string | null): TNode[] => {\n if (parentTag !== null && RAWTEXT.has(parentTag)) return nodes\n const kept: TNode[] = []\n for (let i = 0; i < nodes.length; i++) {\n const nd = nodes[i]\n if (nd.type === 'element') { nd.children = prune(nd.children, nd.tag.toLowerCase()) }\n if (nd.type !== 'text') { kept.push(nd); continue }\n // 纯空白(仅空格/Tab/换行且有非空内容的空白为分界)全部剔除——\n // 用户要求:</b> <span> 间的 \" \" 这种排版空白不留在 nodes[] 中。\n // 注意:两个内联元素间若依赖该空格做视觉分隔,需改在外层用 CSS gap/markup 表达。\n if (/^[ \\t\\r\\n]+$/.test(nd.raw)) continue\n kept.push(nd)\n }\n return kept\n }\n const pruned = prune(newRoot, null)\n return { root: pruned }\n}\n\ninterface OpenTag {\n name: string\n lower: string\n node: TElement\n}\n\nfunction unwrapList(list: TNode[]): TNode[] {\n const out: TNode[] = []\n for (const nd of list) {\n if (nd.type !== 'element') { out.push(nd); continue }\n if (nd.tag.toLowerCase() === 'transition') {\n // `<transition>` 伪标签不受支持。显式报错而不是当普通标签渲染\n // —— 后者会在页面上留下一个真实的 <transition> 元素,且结构指令锚点丢失,\n // 属于「构建通过但行为静默错误」,比构建失败难查一个数量级。\n errT('<transition> 不受支持,请改用 CSS 动画或自行实现过渡逻辑')\n }\n nd.children = unwrapList(nd.children)\n out.push(nd)\n }\n return out\n}\n\nfunction errT(msg: string): never {\n throw new TemplateParseError(msg, -1)\n}\n","/**\n * 模板层约定规则:模板树 + 插值表达式源码 → 编译期诊断。\n *\n * 编译期覆盖以下约定检查:\n * E-PROP-INTERP .prop 的值必须是插值\n * E-EVENT-FN 事件处理器必须是函数/成员\n * E-REF-TYPE ref 必须绑定 createRef() 结果\n *\n * 其余同类运行时检查的编译期覆盖:\n * - 动态根元素(vars.length != updatePointMetas.length)的三个触发条件\n * (注释内插值 / 属性多插值 / 标签名插值)→ template-tree.ts 硬错误\n *\n * 无法静态判定的表达式形态(外部标识符、动态访问、未知基类成员)一律放行 —— 宁漏勿误报。\n * 错误定位统一挂在模板字面量整体(start/end = 模板源码区间),明细在 message 中。\n */\nimport type { ComponentAnalysis } from '../types'\nimport { keyName } from '../utils/oxc'\nimport type { TemplateTree, TElement, TNode } from './template-tree'\nimport type { MainTemplate, TemplateVarInfo } from './template-extract'\nimport type { ConventionsContext } from './conventions'\n\nexport interface TemplateRuleError {\n start: number\n end: number\n message: string\n}\n\n/** 指令允许的插入位置(EnterPointType 值,小写)。 */\nconst DIRECTIVE_SCOPES: Record<string, string[]> = {\n bind: ['tag'],\n show: ['tag'],\n model: ['tag'],\n classes: ['tag'],\n styles: ['tag'],\n forEach: ['text', 'slot'],\n ifTrue: ['text', 'slot'],\n ifElse: ['text', 'slot'],\n when: ['text', 'slot'],\n slot: ['slot'],\n html: ['tag', 'text', 'slot'],\n}\n\n/** CompElem 基类内置实例成员(事件绑定到它们不算错误)。 */\nconst KNOWN_BASE_MEMBERS = new Set([\n // 方法\n 'emit', 'nextTick', 'forceUpdate', 'updateProps', 'insertStyleSheet', 'destroy',\n 'propsReady', 'render', 'beforeMount', 'mounted', 'shouldUpdate', 'beforeDestroyed', 'destroyed',\n // 只读字段 / getter\n 'rootComponent', 'parentComponent', 'wrapperComponent', 'renderRoot', 'renderRoots',\n 'shadowRoot', 'slots', 'slotHooks', 'cssSheets', 'globalCssSheet', 'attrs', 'props',\n 'isMounted', 'isDestroyed', 'cssVars', 'tagName',\n])\n\nfunction superClassName(node: any): string | null {\n const sc = node.superClass\n if (!sc) return null\n if (sc.type === 'Identifier') return sc.name\n if (sc.type === 'MemberExpression' && sc.property?.type === 'Identifier') return sc.property.name\n return null\n}\n\nfunction collectElements(nodes: TNode[], out: TElement[]): void {\n for (const nd of nodes) {\n if (nd.type !== 'element') continue\n out.push(nd)\n collectElements(nd.children, out)\n }\n}\n\n/**\n * 沿同文件继承链收集成员名。\n * 链尾不可知(非本地类且非导入的 CompElem)→ 返回 null(无法穷尽,全部放行)。\n */\nfunction collectMemberNames(comp: ComponentAnalysis, ctx: ConventionsContext): Set<string> | null {\n const out = new Set<string>()\n let node = comp.cls ?? ctx.localClasses.get(comp.className)\n if (!node) return null\n const seen = new Set<any>()\n while (node && !seen.has(node)) {\n seen.add(node)\n for (const m of node.body?.body ?? []) {\n const n = keyName(m.key)\n if (n) out.add(n)\n }\n const sup = superClassName(node)\n if (!sup) {\n // 无标识符基类但有 superClass 节点(mixin 调用 `extends Mixin(X)`)→ 成员不可穷尽\n if (node.superClass) return null\n break\n }\n if (ctx.localClasses.has(sup)) {\n node = ctx.localClasses.get(sup)\n continue\n }\n // 链尾:基类是导入的 CompElem → 成员空间已知(仅剩框架内置),可穷尽\n if (comp.compelemImports.get(sup) === 'CompElem') break\n return null\n }\n return out\n}\n\n/** 在继承链上找成员定义节点(PropertyDefinition / MethodDefinition),自派生类向上取首个命中。 */\nfunction findMemberNode(\n comp: ComponentAnalysis,\n ctx: ConventionsContext,\n name: string,\n): any | null {\n let node = comp.cls ?? ctx.localClasses.get(comp.className)\n const seen = new Set<any>()\n while (node && !seen.has(node)) {\n seen.add(node)\n for (const m of node.body?.body ?? []) {\n if (keyName(m.key) === name) return m\n }\n const sup = superClassName(node)\n node = sup && ctx.localClasses.has(sup) ? ctx.localClasses.get(sup) : null\n }\n return null\n}\n\nfunction isCreateRefCall(initNode: any, comp: ComponentAnalysis): boolean {\n return (\n initNode?.type === 'CallExpression' &&\n initNode.callee?.type === 'Identifier' &&\n comp.compelemImports.get(initNode.callee.name) === 'createRef'\n )\n}\n\n/** 内联函数形态:function 声明 / async / 箭头函数。 */\nconst INLINE_FN_RE = /(^function\\b)|(^async\\s*(?:function\\b|\\())|=>/\n\n/** 对单个组件的主模板执行模板层约定检查。返回错误列表(可为空)。 */\nexport function checkTemplateRules(\n tree: TemplateTree,\n tmpl: MainTemplate,\n comp: ComponentAnalysis,\n ctx: ConventionsContext,\n knownTags?: Set<string>,\n): TemplateRuleError[] {\n const errs: TemplateRuleError[] = []\n const pos = { start: tmpl.start, end: tmpl.end }\n\n const elements: TElement[] = []\n collectElements(tree.root, elements)\n\n const members = collectMemberNames(comp, ctx)\n\n // ---- C1: 指令插入位置校验 ----\n // 遍历主模板 vars,对 isDirectiveCall 的插值检查其在树中的位置是否被该指令允许\n const directiveVars = tmpl.vars.filter((v) => v.isDirectiveCall && v.directiveName)\n if (directiveVars.length) {\n // 建立 varIndex → 所在位置 的映射(tag=标签属性位 / text=文本插值 / slot=组件标签体内插值)\n const varPosMap = new Map<number, 'tag' | 'text' | 'slot'>()\n // 标签属性位\n for (const el of elements) {\n for (const a of el.attrs) {\n if (a.name.includes('⟬')) {\n // 属性名整体插值 = TAG 指令位\n const m = /⟬Ċ⟭(\\d+)/.exec(a.name)\n if (m) varPosMap.set(+m[1], 'tag')\n }\n for (const p of a.parts) {\n if (p.type === 'var') {\n // 属性值内的指令调用:按 TAG 处理(模板中指令出现在属性值里的情况极少,但 bind/show 等确实可能)\n // 实际上指令只允许出现在标签位或文本位;属性值内的指令调用由 codegen 层报错,这里不重复\n }\n }\n }\n }\n // 文本/插值位(含 slot 体内)\n const walkText = (nodes: TNode[], inSlot: boolean) => {\n for (const nd of nodes) {\n if (nd.type === 'text') {\n for (const p of nd.parts) {\n if (p.type === 'var' && !varPosMap.has(p.index)) {\n varPosMap.set(p.index, inSlot ? 'slot' : 'text')\n }\n }\n } else if (nd.type === 'element') {\n const isComp =\n (knownTags?.has(nd.tag.toLowerCase()) ?? false) ||\n nd.tag === 'SLOT' ||\n nd.tag === 'slot'\n walkText(nd.children, isComp)\n }\n }\n }\n walkText(tree.root, false)\n\n for (const v of directiveVars) {\n const allowed = DIRECTIVE_SCOPES[v.directiveName!]\n if (!allowed) continue // 未知指令名(自定义指令)→ 放行\n const pos2 = varPosMap.get(v.index)\n if (pos2 && !allowed.includes(pos2)) {\n errs.push({\n ...pos,\n message:\n `E-DIRECTIVE-SCOPE: 指令 '${v.directiveName}' 只能出现在 ${allowed.join('/')} 位置,` +\n `当前在 ${pos2} 位置`,\n })\n }\n }\n }\n\n for (const el of elements) {\n for (const a of el.attrs) {\n // 属性名整体插值 = TAG 指令写法,不属于以下任何检查\n if (a.name.includes('⟬')) continue\n\n const varPart = a.parts.find((p) => p.type === 'var')\n const varCount = a.parts.filter((p) => p.type === 'var').length\n\n // ---- E-PROP-INTERP:.prop 的值必须是插值(对齐 render.ts:336 的 EXP_TAG 判定)----\n if (a.name.startsWith('.') && varCount === 0) {\n errs.push({\n ...pos,\n message:\n `E-PROP-INTERP: Prop '${a.name}' 必须是插值(.foo=\"${'$'}{expr}\");` +\n `静态值请直接写属性或改用 bind 指令`,\n })\n continue\n }\n\n // ---- .prop 目标校验(.prop 只能设在 CompElem 或 <slot> 上)----\n if (a.name.startsWith('.') && varCount === 1) {\n const lower = el.tag.toLowerCase()\n const isKnown = knownTags?.has(lower) ?? false\n const isSlot = lower === 'slot'\n if (!isKnown && !isSlot) {\n // 无连字符的原生标签(div/span 等)→ 确定性错误;同文件组件可查 prop 存在性\n // 跨文件组件(无连字符且不在 knownTags)→ 保守放行(宁漏勿误报)\n if (!/^[a-z][a-z0-9]*$/.test(el.tag) || el.tag.includes('-')) {\n // 有连字符但未注册 → 错误;无连字符的原生标签 → 错误\n errs.push({\n ...pos,\n message:\n `E-PROP-TARGET: Prop '${a.name}' 只能设置在 CompElem 或 <slot> 上` +\n `(<${el.tag}> 未注册为组件)`,\n })\n }\n } else if (isKnown) {\n // 同文件组件:检查 prop 是否存在(通过 knownTags 只知标签名,prop 集合需从 comp.fields 推断——\n // 跨组件 prop 存在性检查需要 componentIndex,暂不覆盖,仅做位置校验)\n }\n }\n\n // ---- E-EVENT-FN:事件处理器必须是函数 ----\n if (a.name.startsWith('@') && varCount === 1 && varPart) {\n const exprSource = tmpl.vars[varPart.index]?.exprSource ?? ''\n if (INLINE_FN_RE.test(exprSource)) continue\n const m = /^this\\.([A-Za-z_$][\\w$]*)$/.exec(exprSource)\n if (m) {\n const name = m[1]\n // 成员不可穷尽(外部基类)→ 放行;命中已知成员 / 框架内置 → 放行\n if (members === null || members.has(name) || KNOWN_BASE_MEMBERS.has(name)) continue\n errs.push({\n ...pos,\n message: `E-EVENT-FN: 事件 '${a.name}' 的处理器 '${exprSource}' 不是组件 ${comp.className} 的成员`,\n })\n }\n // 其他形态(外部标识符、动态访问、条件表达式)→ 无法判定,放行\n continue\n }\n\n // ---- E-REF-TYPE:ref 必须绑定 createRef() 结果 ----\n if (a.name === 'ref' && varCount === 1 && varPart) {\n const exprSource = tmpl.vars[varPart.index]?.exprSource ?? ''\n const m = /^this\\.([A-Za-z_$][\\w$]*)$/.exec(exprSource)\n if (m && members !== null) {\n const name = m[1]\n if (!members.has(name)) {\n errs.push({\n ...pos,\n message: `E-REF-TYPE: ref 绑定的 '${exprSource}' 不是组件 ${comp.className} 的成员`,\n })\n } else {\n const member = findMemberNode(comp, ctx, name)\n // 仅对「有初始化器的字段」可静态证明;方法/getter/无初始化器 → 放行\n if (member?.type === 'PropertyDefinition' && member.value != null) {\n if (!isCreateRefCall(member.value, comp)) {\n errs.push({\n ...pos,\n message:\n `E-REF-TYPE: ref 绑定的 '${exprSource}' 初始化器不是 createRef() 调用,` +\n `运行时将报「Ref must be a RefObject」`,\n })\n }\n }\n }\n }\n // members===null(外部基类)或非 this.* 形态 → 放行\n }\n }\n }\n\n return errs\n}\n","/**\r\n * @watch 编译期解析(watch 前移)。\r\n *\r\n * 运行时 @watch 装饰器在类定义期用 myfx `get(options, 'deep'/'immediate'/'once')`\r\n * 逐键解析选项并注册六张 watch 表;这里把「选项解析」移到编译期:\r\n * - 静态解析 @watch(source, options?) → watchEffects 工厂数组注入 __ce_static__,\r\n * 并从源码中**删除 @watch 装饰器调用**(处理器方法保留);\r\n * - 运行时由 CompElem 构造期 `for (const factory of ceStatic.watchEffects)\r\n * effect(factory(this))` 消费 —— 每个工厂产出一个 signal effect,\r\n * 直接读 `rc.__s.<source>.value` 建立依赖,变更即回调处理器;\r\n * - 解析失败(source / options 非静态字面量)→ E-WATCH-ARG(error 级,阻断构建),\r\n * 此时**不删除装饰器、不注入 watchEffects**,运行时装饰器路径照常兜底。\r\n *\r\n * source 支持形态:字符串字面量、字符串字面量数组、模块级 const 字符串常量\r\n * (含成员访问,如 EV.TITLE —— 对齐 conventions 的 stringConsts 机制)。\r\n */\r\nimport type { ComponentAnalysis } from '../types'\r\nimport { keyName } from '../utils/oxc'\r\nimport { decoratorName, type ConventionError, type ConventionsContext } from './conventions'\r\nimport { classInfoOf, superClassName } from './component'\r\n\r\n/** 源码字面量序列化(与 codegen 各文件的同名局部常量一致) */\r\nconst J = JSON.stringify\r\n\r\nexport interface WatchEntry {\r\n /** 处理器方法名 */\r\n name: string\r\n /** 监控路径(多路径已展开) */\r\n sources: string[]\r\n deep?: boolean\r\n immediate?: boolean\r\n once?: boolean\r\n /** 处理器是否为 static 成员 */\r\n isStatic?: boolean\r\n}\r\n\r\nexport interface WatchExtractResult {\r\n entries: WatchEntry[]\r\n /** 需从源码删除的 @watch(...) 装饰器 span(已做整行清理) */\r\n removals: Array<{ start: number; end: number }>\r\n errors: ConventionError[]\r\n}\r\n/**\r\n * 生成 signal 模式 watch effect 工厂数组。\r\n * 每个 watch 条目 → `(rc) => effectFn`。\r\n *\r\n * ⚠️ 处理器实参必须与**库 API** 一致,本实现按下列权威来源对齐:\r\n * - `compelem/README.md`「属性/状态监视」:\r\n * `@watch(\"width\", { immediate: true }) watchWidth(nv: string, ov: string, sourceName: string)`\r\n * - `WatchHandler` 签名:\r\n * `(newValue, oldValue, source: string, subNewValue?, subOldValue?) => any`\r\n *\r\n * 两个由此推出的语义要点:\r\n * 1. **每个 source 各自独立判定与独立调用**。多源 `@watch(['a','b'])` 时处理器被\r\n * 调用**多次**,每次带各自的 nv/ov/sourceName —— 靠 sourceName 区分是哪个源\r\n * 触发的(README 明确这么用)。\r\n * 2. `ov` 是**该源的上一次值**,不是数组。\r\n *\r\n * deep:signal 模型下没有 Proxy,**就地修改**(`obj.n.v = 7`)不会写信号,\r\n * 因此不可能被任何 effect 观测到;此处仅对 `deep: true` 的源退化为 JSON 深比较,\r\n * 用于「整体换成新引用但内容相同」时不误触发。非 deep 源一律 `!==` 引用比较\r\n * (比 JSON.stringify 便宜得多,且对对象源语义正确)。\r\n *\r\n * once:按源各自计一次。\r\n * immediate:创建时按源各调用一次,ov 为 undefined。\r\n */\r\nexport function generateWatchEffects(entries: WatchEntry[]): string {\r\n const factories: string[] = []\r\n for (const entry of entries) {\r\n const { name, sources, immediate, once, isStatic, deep } = entry\r\n /**\r\n * static handler 不在原型上,必须经构造器取:`rc.constructor.<name>(...)`。\r\n * 写成 `rc.<name>` 会得到 undefined,effect 首次触发即抛\r\n * \"rc.onA is not a function\"。\r\n */\r\n const recv = isStatic ? 'rc.constructor' : 'rc'\r\n /**\r\n * source → 读取表达式。\r\n *\r\n * source 可以是**多级路径**。signal 模型下 `__s` 只按根键建信号,\r\n * 所以 `\"a.b\"` 必须读成 `rc.__s.a.value.b`;直接拼成 `rc.__s.a.b.value`\r\n * 会把整串当键名,运行时得到 `undefined.value`。\r\n */\r\n const readOf = (src: string): string => {\r\n const segs = src.split('.')\r\n const root = segs[0]\r\n return `rc.__s.${root}.value${segs.slice(1).map((x) => '.' + x).join('')}`\r\n }\r\n const reads = sources.map(readOf)\r\n const seed = `[${reads.join(', ')}]`\r\n const idx = sources.map((_, i) => i)\r\n /**\r\n * deep 源用「序列化缓存」:每次触发只对 n[i] 做**一次** JSON.stringify,\r\n * 与上一轮缓存的字符串比较。\r\n * s[i] 在工厂期用同一读取表达式播种,保证 immediate 语义不变\r\n * (首轮 n 与播种 o 相同 → 不触发)。\r\n */\r\n const useStrCache = deep === true\r\n const sSeed = useStrCache ? ` const s = [${reads.map((r) => `JSON.stringify(${r})`).join(', ')}];` : ''\r\n const qDecl = useStrCache ? 'let q; ' : ''\r\n /** 该源是否真的变了:deep 走缓存字符串比较,其余走引用比较 */\r\n const changed = (i: number) =>\r\n useStrCache\r\n ? `(q = JSON.stringify(n[${i}])) !== s[${i}] && (s[${i}] = q, true)`\r\n : `n[${i}] !== o[${i}]`\r\n/**\r\n * 变更回调:(nv, ov, sourceName)。\r\n *\r\n * ⚠️ **必须包 `untrack`**:这个调用发生在 effect 体**内部**(`CompElem.setup` 里\r\n * `effect(factory(this))`),作者方法体里任何额外的信号读都会被 `track()` 收编成\r\n * 本 watch 的依赖 —— 而本 watch 的订阅集本该**只含装饰器里声明的源**(`reads` 是\r\n * 静态算出的)。例:\r\n *\r\n * ```ts\r\n * @watch('a', 'aChanged')\r\n * aChanged(nv) { this.a = nv; console.log(this.debugInfo) } // debugInfo 被误订阅\r\n * ```\r\n *\r\n * 方法体对 codegen 是黑盒(用户代码),无法静态剔除里面的读,故在调用点整体\r\n * 关闭收集。这是 `untrack` 唯一的内部使用点,也是它存在的理由。\r\n */\r\n const call = (i: number) => `untrack(() => ${recv}.${name}(n[${i}], o[${i}], ${J(sources[i])}))`\r\n /** immediate 前奏:ov 此刻尚不存在,按 API 传 undefined */\r\n const callInit = (i: number) => `untrack(() => ${recv}.${name}(o[${i}], undefined, ${J(sources[i])}))`\n const store = idx.map((i) => `o[${i}] = n[${i}]`).join('; ')\r\n\r\n if (once && immediate) {\r\n // 创建时按源各触发一次,之后永不触发\r\n factories.push(\r\n `(rc) => { const o = ${seed}; ${idx.map(callInit).join('; ')}; return () => {} }`,\r\n )\r\n } else if (once) {\r\n // o 在建 effect 时播种 → 首轮判定「无变化」;f 按源各自只允许一次\r\n factories.push(\r\n `(rc) => { const o = ${seed};${sSeed} const f = ${JSON.stringify(idx.map(() => 0))}; ` +\r\n `return () => { const n = [${reads.join(', ')}]; ${qDecl}` +\r\n idx.map((i) => `if (!f[${i}] && ${changed(i)}) { f[${i}] = 1; ${call(i)} }`).join('; ') +\r\n `; ${store} } }`,\r\n )\r\n } else if (immediate) {\r\n factories.push(\r\n `(rc) => { const o = ${seed};${sSeed} ${idx.map(callInit).join('; ')}; ` +\r\n `return () => { const n = [${reads.join(', ')}]; ${qDecl}` +\r\n idx.map((i) => `if (${changed(i)}) { ${call(i)} }`).join('; ') +\r\n `; ${store} } }`,\r\n )\r\n } else {\r\n factories.push(\r\n `(rc) => { const o = ${seed};${sSeed} return () => { const n = [${reads.join(', ')}]; ${qDecl}` +\r\n idx.map((i) => `if (${changed(i)}) { ${call(i)} }`).join('; ') +\r\n `; ${store} } }`,\r\n )\r\n }\r\n }\r\n return `[${factories.join(',')}]`\r\n}\r\n\r\nfunction strOf(n: any): string | null {\r\n if (!n) return null\r\n if (n.type === 'StringLiteral') return String(n.value)\r\n if (n.type === 'Literal' && typeof n.value === 'string') return String(n.value)\r\n return null\r\n}\r\n\r\nfunction boolOf(n: any): boolean | null {\r\n if (!n) return null\r\n if (n.type === 'BooleanLiteral') return n.value === true\r\n if (n.type === 'Literal' && typeof n.value === 'boolean') return n.value\r\n return null\r\n}\r\n\r\n/**\r\n * 该组件(含**同文件内**基类链)会被建成 `__s` 信号的键集。\r\n *\r\n * `comp.fields` 只含本类**自身**成员(classInfoOf 不做基类合并),所以子类上\r\n * `@watch(\"title\")`(title 来自父类 @state)会被误判为非信号。必须沿 extends 链上溯。\r\n *\r\n * 返回 null = 链上有本文件之外的基类 → 键集不可知,调用方应跳过校验(宁可放过,\r\n * 也不误伤)。这与「基类在别处」时组件本身通常已 D6 降级的情形一致。\r\n */\r\nfunction signalKeysOf(\r\n cls: any,\r\n ctx: ConventionsContext,\r\n comp: ComponentAnalysis,\r\n ownFields: Set<string>,\r\n): Set<string> | null {\r\n const keys = new Set<string>(ownFields)\r\n let cur = cls\r\n for (let depth = 0; depth < 8; depth++) {\r\n const sup = superClassName(cur)\r\n if (!sup) return keys\r\n // CompElem 是框架基类,永远在链尾且不贡献响应式字段(slots 除外)——\r\n // 必须当终止条件返回已知键集,不能当成「本文件外的未知基类」而放弃校验,\r\n // 否则所有直接继承 CompElem 的组件(也就是绝大多数)都跳过检查。\r\n if ([...comp.compelemImports.values()].includes(sup) && sup === 'CompElem') {\r\n keys.add('slots')\r\n return keys\r\n }\r\n const parent = ctx.localClasses.get(sup)\r\n if (!parent) return null // 基类在别处 → 不可知\r\n const info = classInfoOf(parent, new Set(comp.compelemImports.values()))\r\n for (const k of info.fields.keys()) keys.add(k)\r\n cur = parent\r\n }\r\n return null // 链过深,视为不可知\r\n}\r\n\r\n/** 解析 source 实参 → 路径数组;不可静态解析返回 null。(field-extract 复用) */\r\nexport function resolveSources(arg: any, ctx: ConventionsContext): string[] | null {\r\n const s = strOf(arg)\r\n if (s != null) return [s]\r\n if (arg?.type === 'ArrayExpression') {\r\n const out: string[] = []\r\n for (const el of arg.elements ?? []) {\r\n const v = strOf(el)\r\n if (v == null) return null\r\n out.push(v)\r\n }\r\n return out.length ? out : null\r\n }\r\n // 模块级 const(字符串或字符串常量的成员访问,如 EV.TITLE)\r\n if (arg?.type === 'Identifier') {\r\n const v = ctx.stringConsts.get(arg.name)\r\n return typeof v === 'string' ? [v] : null\r\n }\r\n if (arg?.type === 'MemberExpression' && !arg.computed) {\r\n let parts: string[] = []\r\n let node = arg\r\n while (node?.type === 'MemberExpression' && !node.computed) {\r\n const k = keyName(node.property)\r\n if (!k) return null\r\n parts.unshift(k)\r\n node = node.object\r\n }\r\n if (node?.type === 'Identifier') {\r\n const base = ctx.stringConsts.get(node.name)\r\n if (base && typeof base === 'object') {\r\n let cur: any = base\r\n for (const p of parts) {\r\n cur = cur[p]\r\n if (cur == null) return null\r\n }\r\n return typeof cur === 'string' ? [cur] : null\r\n }\r\n }\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * 装饰器独占一行时把删除范围扩到整行(含换行),避免留下纯缩进的空行。(field-extract 复用)\r\n */\r\nexport function lineSpan(code: string, start: number, end: number): { start: number; end: number } {\r\n const ls = code.lastIndexOf('\\n', start - 1) + 1\r\n const leIdx = code.indexOf('\\n', end)\r\n const lineEnd = leIdx === -1 ? code.length : leIdx\r\n const before = code.slice(ls, start)\r\n const after = code.slice(end, lineEnd)\r\n if (/^[ \\t]*$/.test(before) && /^[ \\t]*$/.test(after)) {\r\n return { start: ls, end: Math.min(lineEnd + 1, code.length) }\r\n }\r\n return { start, end }\r\n}\r\n\r\n/**\r\n * 提取组件类上全部 @watch 配置。错误(E-WATCH-ARG / E-WATCH-SOURCE)与条目互斥:\r\n * 有错误时调用方应放弃删除与注入(运行时装饰器路径兜底)。\r\n *\r\n * ⚠️ **继承**:条目里会**先并入同文件基类链上的 @watch**(祖先在前),因为\r\n * `watchEffects` 是按 `(this.constructor).__ce_static__` 逐实例取的 —— 子类若只\r\n * 注入自己的 watch,父类实例上的处理器在子类实例上就完全不生效。\r\n * 顺序「祖先在前」使父类处理器先于子类触发。\r\n *\r\n * 只并入**条目**,不并入 removals:祖先在 analyzeFile 里是独立组件,删自己的装饰器。\r\n */\r\nexport function extractWatchers(\r\n comp: ComponentAnalysis,\r\n code: string,\r\n ctx: ConventionsContext,\r\n): WatchExtractResult {\r\n const result: WatchExtractResult = { entries: [], removals: [], errors: [] }\r\n const cls = comp.cls ?? ctx.localClasses.get(comp.className)\r\n if (!cls) return result\r\n\r\n const aliases = new Set(comp.compelemImports.values())\r\n const isWatchDec = (local: string) => comp.compelemImports.get(local) === 'watch'\r\n\r\n /** 沿 extends 链上溯同文件基类(遇 CompElem 或文件外基类即止),返回 [最远祖先 … 直接父类] */\r\n const ancestorChain = (): Array<{ node: any; fields: Set<string> }> => {\r\n const chain: Array<{ node: any; fields: Set<string> }> = []\r\n let cur = cls\r\n for (let depth = 0; depth < 8; depth++) {\r\n const sup = superClassName(cur)\r\n if (!sup) break\r\n if (aliases.has(sup) && sup === 'CompElem') break\r\n const parent = ctx.localClasses.get(sup)\r\n if (!parent) break // 基类在本文件外,其 watch 由其自身所在文件处理\r\n chain.push({ node: parent, fields: new Set(classInfoOf(parent, aliases).fields.keys()) })\r\n cur = parent\r\n }\r\n return chain.reverse()\r\n }\r\n\r\n /**\r\n * 收集单个类的 @watch 条目。\r\n * @param own true = 本类(记录 removals / errors);false = 祖先(只取条目)\r\n */\r\n const collect = (node: any, knownFields: Set<string>, own: boolean): void => {\r\n /** 处理单个 @watch 装饰器;出错时提前 return(不用 continue,跨函数边界非法)。 */\r\n const handle = (member: any, dec: any): void => {\r\n const memberName = keyName(member.key)\r\n if (!memberName) return\r\n const expr = dec.expression ?? dec\r\n // 祖先的错误在它自己被 analyzeFile 分析时上报,这里不重复报\r\n const fail = (msg: string) => {\r\n if (!own) return\r\n result.errors.push({ start: dec.start ?? expr.start, end: dec.end ?? expr.end, message: msg })\r\n }\r\n\r\n if (expr.type !== 'CallExpression') {\r\n fail(`E-WATCH-ARG: @watch 必须以调用形式使用(@watch(source, options?)),编译期无法解析`)\r\n return\r\n }\r\n const args = expr.arguments ?? []\r\n\r\n // ---- source ----\r\n const sources = resolveSources(args[0], ctx)\r\n if (!sources) {\r\n fail(`E-WATCH-ARG: @watch 的 source 无法静态解析(须为字符串字面量、字符串数组或模块级字符串常量)`)\r\n return\r\n }\r\n // source 必须是**真信号键**。生成的 effect 读 `rc.__s.<s>.value`,\r\n // 普通 getter / 不存在的成员会让 `__s[s]` 为 undefined → setup() 里直接抛错,\r\n // 组件已降级时不做此检查(基类可能在本文件外,键集不全)。\r\n if (own && !comp.degradeReason) {\r\n const signalKeys = signalKeysOf(node, ctx, comp, knownFields)\r\n if (signalKeys) {\r\n // 多级路径按**根键**判定(\"a.b\" 监听的是 __s.a)\r\n const unknown = sources.filter((s) => !signalKeys.has(s.split('.')[0]))\r\n if (unknown.length) {\r\n fail(\r\n `E-WATCH-SOURCE: @watch 的 source ${unknown.map((s) => `'${s}'`).join('、')} ` +\r\n `不是响应式字段(@prop/@state/@computed)—— @watch 只能监听信号`,\r\n )\r\n return\r\n }\r\n }\r\n }\r\n\r\n // ---- options ----\r\n let deep = false\r\n let immediate = false\r\n let once = false\r\n const optsNode = args[1]\r\n if (optsNode) {\r\n if (optsNode.type !== 'ObjectExpression') {\r\n fail(`E-WATCH-ARG: @watch 的 options 无法静态解析(须为对象字面量,deep/immediate/once 须为布尔字面量)`)\r\n return\r\n }\r\n let bad = false\r\n for (const p of optsNode.properties ?? []) {\r\n if (p.type === 'SpreadElement' || (p as any).type === 'ExperimentalSpreadProperty') {\r\n // 展开使得选项不可静态枚举(运行时 get 兜底键不受影响,但无法证明)\r\n bad = true\r\n break\r\n }\r\n const k = keyName(p.key)\r\n if (k === 'deep' || k === 'immediate' || k === 'once') {\r\n const b = boolOf(p.value)\r\n if (b == null) {\r\n bad = true\r\n break\r\n }\r\n if (k === 'deep') deep = b\r\n else if (k === 'immediate') immediate = b\r\n else once = b\r\n }\r\n // 其余键运行时本就不读,忽略\r\n }\r\n if (bad) {\r\n fail(`E-WATCH-ARG: @watch options 的 deep/immediate/once 必须是布尔字面量(编译期静态解析)`)\r\n return\r\n }\r\n }\r\n\r\n result.entries.push({\r\n name: memberName,\r\n sources,\r\n ...(deep ? { deep: true } : {}),\r\n ...(immediate ? { immediate: true } : {}),\r\n ...(once ? { once: true } : {}),\r\n ...(member.static ? { isStatic: true } : {}),\r\n })\r\n if (own) result.removals.push(lineSpan(code, dec.start ?? expr.start - 1, dec.end ?? expr.end))\r\n }\r\n\r\n for (const member of node.body?.body ?? []) {\r\n const memberName = keyName(member.key)\r\n if (!memberName) continue\r\n for (const dec of member.decorators ?? []) {\r\n const dn = decoratorName(dec)\r\n if (!dn || !isWatchDec(dn)) continue\r\n handle(member, dec)\r\n }\r\n }\r\n }\r\n\r\n // 1) 祖先条目(远 → 近),使父类处理器在子类实例上同样生效\r\n for (const anc of ancestorChain()) collect(anc.node, anc.fields, false)\r\n // 2) 本类条目 + removals + errors\r\n collect(cls, new Set(comp.fields.keys()), true)\r\n return result\r\n}\r\n","/**\n * @prop/@state 初始值的**编译期**元数据推导(`defaultValue` / `type`)。\n *\n * 背景:`__ce_static__.props/states` 的条目若只带**装饰器自己给的 options**,\n * 则 `@prop title = 'untitled'` 会产出 `props: { \"title\": {} }` —— 默认值与类型\n * 两个最基本的信息全部丢失。因为字段声明(含初始值)在 field-extract 里被**整体\n * 删除**,初始值只流向构造体的 `signal(<init>)`,从不回流到元数据表。\n *\n * 运行时其实一直有推导能力,但那是**首实例构造期**的惰性补写\n * (CompElem#initProps:从 `__s[key].value` 反推 `propDef.type` 并就地改写\n * ctor 级共享表)。把它前移到编译期有三个好处:产物自解释(devtools / 序列化 /\n * 肉眼 review 都能直接看到默认值与类型)、省掉首实例的一次惰性写入、类型信息在\n * 任何实例创建之前就已就位。\n *\n * 推导规则**严格镜像运行时**(compelem/src/constants.ts 的 `PropTypeMap`:\n * `boolean→Boolean` / `string→String` / `number→Number` / `object→Object` /\n * `array→Array` / `function→Function`),否则编译期与运行期会给出两套答案。\n *\n * 两条独立的判定,宽松程度不同 —— 因为**求值**比**分类**危险得多:\n *\n * - `typeName`(分类)不需要求值,所以范围可以宽:`new Foo()`、标识符、\n * 成员表达式都能靠 `typeof` 语义分类。\n * - `valueText`(求值)要求「原样复制进 `static __ce_static__ = { … }` 后\n * 求值安全」:`static` 类字段在**模块作用域**求值,`this` 不可用(那会是类\n * 自身而非实例),且任何有副作用的表达式都会在类定义时提前跑一次。故只接受\n * **纯字面量**:字符串 / 数字 / 布尔 / null / 正则 / 无插值模板 / 一元数值 /\n * 全纯字面量的数组与对象字面量。标识符、调用、`new`、成员访问、含展开或\n * 标识符值的容器一律**不写** `defaultValue`(运行时会照旧从信号读真值)。\n *\n * 已知的表达力取舍(有意为之,不是遗漏):\n * - `defaultValue` 对对象 / 数组 / 函数**不写**,避免静态表里的对象被误当成\n * 实例真值 —— 构造体里 `signal([])` 建的是**另一个**数组,`!==`。函数尤其\n * 危险:两边是两个不同的函数对象。只给不可变原始值(string/number/boolean/\n * null/RegExp)写 `defaultValue`,值相等即可安全比较。\n * - `null` 写 `defaultValue` 但**不推 type**:`null` 不携带类型信息,而运行时\n * 会把 `typeof null` 推成 `Object`(`PropTypeMap.object`),写 `Object` 是\n * 谎报;不写则运行期仍会补上,行为不变。\n * - BigInt / 正则同理:运行时分别推成 `undefined`(`PropTypeMap` 无 `bigint` 键)\n * 与 `Object`,都不比「不写」更诚实。\n * - `type` 恒不覆盖装饰器里显式写出的 `type`(`@prop({ type: Number })` 是\n * 作者的显式声明,优先级高于从默认值反推)。\n */\nimport { unwrapTsExpr } from './conventions'\n\nexport interface InitMeta {\n /**\n * 纯字面量的源码文本(可原样复制进静态字段求值)。非纯字面量、或对象/数组/\n * 函数默认值(静态表与实例真值不同一)时为 undefined。\n */\n valueText?: string\n /**\n * 推导出的构造器名(`String` / `Number` / `Boolean` / `Array` / `Object` /\n * `Function`),与运行时 `PropTypeMap` 的取值域一致。不可推导时 undefined。\n */\n typeName?: string\n}\n\nconst EMPTY: InitMeta = {}\n\n/** oxc 走 ESTree 形态(`Literal` + `value`/`regex`/`bigint`),babel 形态(`NumericLiteral` 等)也一并认。 */\nexport function isNumericLit(n: any): boolean {\n return n?.type === 'NumericLiteral' || (n?.type === 'Literal' && typeof n.value === 'number')\n}\nexport function isStringLit(n: any): boolean {\n return n?.type === 'StringLiteral' || (n?.type === 'Literal' && typeof n.value === 'string')\n}\nexport function isBooleanLit(n: any): boolean {\n return n?.type === 'BooleanLiteral' || (n?.type === 'Literal' && typeof n.value === 'boolean')\n}\n/** 一元 `+` / `-` 作用在数值字面量上(`-1`、`+0`)—— typeof 仍是 number。 */\nexport function isNumericUnary(n: any): boolean {\n return (\n n?.type === 'UnaryExpression' &&\n (n.operator === '+' || n.operator === '-') &&\n isNumericLit(unwrapTsExpr(n.argument))\n )\n}\n\n/**\n * 是否是「复制进静态字段求值安全」的纯字面量。\n *\n * 判据:无 `this`、无副作用、无标识符/绑定引用、无展开。容器要求**逐元素**递归\n * 通过 —— `{ a: 1, b: SOME_CONST }` 里的 `SOME_CONST` 是自由引用,类定义时求值\n * 会踩模块绑定(顺序/TDZ),故整条链一起否决。\n */\nexport function isPureLiteral(node: any): boolean {\n const n = unwrapTsExpr(node)\n if (!n) return false\n switch (n.type) {\n case 'StringLiteral':\n case 'NumericLiteral':\n case 'BooleanLiteral':\n case 'NullLiteral':\n case 'BigIntLiteral':\n case 'RegExpLiteral':\n return true\n case 'Literal':\n // oxc ESTree 形态:null / bigint / 正则 同为 `Literal`,靠 regex / bigint 字段区分\n return !n.regex && n.bigint === undefined\n case 'TemplateLiteral':\n // 有插值就不是纯字面量(插值内是自由表达式求值)\n return !(n.expressions ?? []).length\n case 'UnaryExpression':\n return (\n (n.operator === '+' || n.operator === '-' || n.operator === '!') && isPureLiteral(n.argument)\n )\n case 'ArrayExpression':\n // 空洞(`[1,,3]` 的 elisions)元素为 null,同样否决\n return (n.elements ?? []).every((e: any) => e != null && isPureLiteral(e))\n case 'ObjectExpression':\n return (n.properties ?? []).every(\n (p: any) =>\n p.type === 'Property' &&\n !p.computed &&\n !p.shorthand &&\n (p.kind ?? 'init') === 'init' &&\n isPureLiteral(p.value),\n )\n default:\n return false\n }\n}\n\n/** 纯字面量的源码文本(`unwrapTsExpr` 后取 span,剥掉 `as T` / 非空断言等 TS 包装)。 */\nfunction literalText(n: any, code: string): string | undefined {\n if (typeof n?.start !== 'number' || typeof n?.end !== 'number') return undefined\n return code.slice(n.start, n.end)\n}\n\n/**\n * 推导字段初始值的编译期元数据。\n * @param rawNode `PropertyDefinition.value`(可能为 undefined = 无初始值)\n * @param code 源文件全文(用于取字面量源码文本)\n */\nexport function inferInitMeta(rawNode: any, code: string): InitMeta {\n const node = unwrapTsExpr(rawNode)\n if (!node) return EMPTY\n\n // ---- 原始值:可写 defaultValue(不可变原始值跨副本仍然相等)----\n if (isStringLit(node)) return { valueText: literalText(node, code), typeName: 'String' }\n if (isNumericLit(node)) return { valueText: literalText(node, code), typeName: 'Number' }\n if (isBooleanLit(node)) return { valueText: literalText(node, code), typeName: 'Boolean' }\n if (node.type === 'Literal') {\n // 未覆盖的 Literal:null(纯、无类型信息)/ bigint / 正则\n return isPureLiteral(node) ? { valueText: literalText(node, code) } : EMPTY\n }\n if (node.type === 'NullLiteral' || node.type === 'BigIntLiteral' || node.type === 'RegExpLiteral') {\n return isPureLiteral(node) ? { valueText: literalText(node, code) } : EMPTY\n }\n if (node.type === 'TemplateLiteral') {\n if (!(node.expressions ?? []).length) return { valueText: literalText(node, code), typeName: 'String' }\n // 有插值 → 类型可判(拼出来必是 string),但求值含自由表达式,不写值\n return { typeName: 'String' }\n }\n if (node.type === 'UnaryExpression') {\n const out: InitMeta = {}\n if (isPureLiteral(node)) out.valueText = literalText(node, code)\n const op = node.operator\n if (isNumericUnary(node)) out.typeName = 'Number'\n else if (op === '!') out.typeName = 'Boolean'\n return out\n }\n if (node.type === 'ArrayExpression') return { typeName: 'Array' }\n if (node.type === 'ObjectExpression') return { typeName: 'Object' }\n if (node.type === 'ArrowFunctionExpression' || node.type === 'FunctionExpression') {\n return { typeName: 'Function' }\n }\n return EMPTY\n}\n","/**\n * @prop/@state/@computed/@query/@queryAll 编译期访问器前移。\n *\n * 与 @watch 前移同构(analyze/watch-extract.ts):\n * - 静态提取五族装饰器配置 → 生成类体访问器(get/set)+ `__ce_static__` 元数据\n * (props/states/computedGetters),并从源码中删除成员:\n * prop/state 字段**整体删除**,初始值改写入构造体 `this.__data_[key]=v`\n * (无构造则合成;#initProps/#initStates 以 this.__data_[key] 为默认值,\n * 不依赖 own 字段遮蔽与 delete);computed 整体替换为缓存读取 getter\n * (原体外提为 computedGetters);query 整体删除字段(注入懒查询 getter);\n * - 访问器经模块级运行时函数直调(`signal` / `signalComputed` / `writeModelProp` /\n * `_queryGet` / `_observedAttrs`,见 RUNTIME_HELPERS);编译注入 compelem import,\n * 模块绑定冲突时改用 __ce_ 前缀别名;\n * - **逐族 all-or-nothing + 失败即报错(E 码,error 级默认阻断构建)**:\n * 族内任一成员不可静态解析 → 该族整体放弃(不删不注)并产出约定错误。\n * 运行时五族装饰器已无定义路径(@prop 运行时为 no-op)——E 码是唯一保护。\n *\n * 静态解析范围(文件内静态分析):\n * - options:对象字面量,或模块级 `const OPTS = {...}` 标识符(init 源码原样\n * 内联进注入字面量——同模块作用域下与装饰器参数等价求值);\n * - selector:字符串字面量 / 模块级 const 字符串(resolveSources);\n * - 不支持 → E 码:import 的 options/selector、let/运行时拼接、computed 体内\n * super、族外/多族装饰器同居(须拆分独立成员,E-DECO-COEXIST)。\n *\n * 已知限制(有意):\n * - query 字段被整体删除 → mounted 前读取从「字段 undefined」变为「即时查询结果」;\n * - skipInjection 类照常提取并注入:`__ce_static__` 以 `...父类.__ce_static__`\n * spread 继承视图字段,own 家族字段(props/states/computedGetters)\n * 显式覆盖——缺失时显式写 `[]`/`undefined`,防止 spread 把父类条目误当 own。\n */\nimport type { ComponentAnalysis } from '../types'\nimport { DEBUG_DIV } from '../types'\nimport { keyName } from '../utils/oxc'\nimport { superClassName } from './component'\nimport { decoratorName, unwrapTsExpr, type ConventionError, type ConventionsContext } from './conventions'\nimport { inferInitMeta } from './literal-meta'\nimport { lineSpan, resolveSources } from './watch-extract'\n\nexport interface FieldExtractResult {\n /** 需从源码删除的 span(prop/state/computed/query 整个成员),已做整行清理 */\n removals: Array<{ start: number; end: number }>\n /** 类体注入的访问器代码(prop/state/computed 的 get/set,以及 **`@tag` 类**的\n * `static get observedAttributes()`),每行以 \\n 结尾。无 `@tag` 的类不带\n * observedAttributes。 */\n accessors: string\n /** `__ce_static__.props` 字面量值(prop 族无成员时 undefined) */\n propsCode?: string\n /** `__ce_static__.states` 字面量值 */\n statesCode?: string\n /** `__ce_static__.computedGetters` 字面量值(方法简写 name(){...}) */\n computedCode?: string\n /** prop/state 初始值 → 构造体写入语句素材(原字段声明改写为构造体赋值) */\n fieldInits: Array<{ name: string; initText: string }>\n /** 本组件访问器所需的模块级运行时函数名(已按 bindings 定名) */\n runtimeHelpers: string[]\n /**\n * 提取期约定错误:E-PROP-ARG / E-STATE-ARG / E-COMPUTED-ARG / E-QUERY-ARG /\n * E-DECO-COEXIST。与条目互斥的族级约定(该族有错 → 不删不注),其余族不受影响。\n */\n errors: ConventionError[]\n}\n\ntype Family = 'prop' | 'state' | 'computed' | 'query'\n\n/** 访问器生成所需的模块级运行时函数(编译注入 compelem import)。 */\nexport const RUNTIME_HELPERS = ['signal', 'signalComputed', 'writeModelProp', '_queryGet', '_observedAttrs'] as const\n\nconst IDENT_RE = /^[A-Za-z_$][\\w$]*$/\n\nconst FAM_CODE: Record<Family, string> = {\n prop: 'E-PROP-ARG',\n state: 'E-STATE-ARG',\n computed: 'E-COMPUTED-ARG',\n query: 'E-QUERY-ARG',\n}\n\n/**\n * `static get observedAttributes()` 的注入体。\n *\n * 体只有一句 `_observedAttrs(this)`:属性名表由**运行时**从合并后的\n * `__ce_static__.props` 推导(compelem/src/CompElem.ts),编译器不生成 kebab 名单。\n *\n * 为什么不能采用「own 属性字面量 + `super.observedAttributes` 并集」的写法:\n * 那样**有 `@tag` 子类的属性表是沿整条继承链拼出来的**,于是无 `@tag` 的基类也必须\n * 带一份自己的表(哪怕它永不被 `customElements.define`、浏览器根本不会读它)。\n * 一旦基类不带,子类就再也拿不到继承来的属性 —— attribute 驱动静默失效\n * (`attributeChangedCallback` 永不触发),链上没有任何 `@tag` 类带 own prop 时更会\n * 整个表变成 undefined。从 props 表推导则不依赖任何祖先的 getter,\n * 「只有 @tag 类带 observedAttributes」才真正安全,且跨文件基类 / mixin 工厂\n * (编译器看不见后代)也照样正确 —— props 表的合并是运行时的展开。\n *\n * 生成物必须是**纯 JS**(注入产物可能被 new Function/JS 环境求值,不得携带类型断言)。\n */\nfunction observedGetter(h: (canon: string) => string): string {\n return `static get observedAttributes() { return ${h('_observedAttrs')}(this) }\\n`\n}\n\n/**\n * 剔除「同文件祖先已经提供、且与本类要发的**逐字节相同**」的访问器行。\n *\n * 背景:`@prop/@state/@computed` 的访问器是**纯名字驱动**的 ——\n * `get title() { return this.__s.title.value }`,与声明处的初始值无关。于是子类\n * 重新声明同名成员时(为了覆盖默认值,本仓库的基类/子类模式就是这么用的:\n * `ScCommon` 声明 `title = 'untitled'`,`ScPartial` 声明 `title = 'A. 局部更新'`),\n * 它发出的那一行与祖先装在**祖先原型**上的那一行完全相同 —— 遮蔽掉祖先的,且不遮蔽\n * 就毫无区别。属纯死代码:三层链(基类→子类→孙类)能把同一行复制 3 份。\n *\n * **判据是「逐字节相同」而不是「同名」,因为同名不同语义是真实存在的**:\n * · `@prop({model:true}) value` 的 setter 是 `writeModelProp(...)`(按宿主类型\n * 三路分派),而子类 `@prop value` 的 setter 是 `this.__s.value.value = __v`。\n * 两者文本不同 ⇒ 不跳过。若按「同名就跳」,子类会静默把 model prop 降级成普通\n * prop,父级再也收不到 `update:value` —— 无报错。\n * · `@state` 与 `@prop` 同名时文本相同(都是读 `__s.<n>.value`)⇒ 可跳。\n * · `@computed` 只有 getter,文本与同名 prop 的 getter 相同 ⇒ 可跳。\n *\n * 只沿**同文件** super 链(`ctx.localClasses`)上溯:跨文件基类与 mixin 工厂的成员\n * 编译器看不见(`unknownSuperAdmitted`),它们的访问器无从比较,一律保留。\n * 也只信任 `inheritedAccessors` 里**确实有条目**的祖先 —— 那意味着该祖先的族已成功\n * 提交(族级 all-or-nothing,失败则一行都不发)。祖先没条目就不跳,即使这在理论上\n * 漏掉了可跳的行,也只是多留一行死代码,不会出错。\n */\nfunction dedupeAncestorAccessors(\n comp: ComponentAnalysis,\n ctx: ConventionsContext,\n accessors: string,\n inherited: Map<string, string[]> | undefined,\n): string {\n if (!inherited) return accessors\n // 本类自己提供的行(回填累加器,让更下层的子类也能剔)\n const own = accessors.split('\\n').filter((l) => l !== '')\n inherited.set(comp.className, own)\n if (own.length <= 1) return accessors // 只有族分块标记,没有访问器\n\n // 同文件 super 链上,祖先们已提供的所有行\n const provided = new Set<string>()\n const seen = new Set<string>()\n let cur: any = comp.cls ?? ctx.localClasses.get(comp.className)\n while (cur) {\n const sup = superClassName(cur)\n if (!sup || seen.has(sup)) break\n seen.add(sup)\n for (const line of inherited.get(sup) ?? []) provided.add(line)\n cur = ctx.localClasses.get(sup)\n }\n if (!provided.size) return accessors\n\n // 只删访问器行,保留 `//////// <族名>` 分块标记(它们是给人看的结构注释,\n // 且 inject-e2e 会统计分块数)。分块标记在过滤后可能出现空块,无害。\n return accessors\n .split('\\n')\n .filter((l) => l === '' || l.startsWith(DEBUG_DIV) || !provided.has(l))\n .join('\\n')\n}\n\n/**\n * 提取组件类上可静态化的五族成员。返回的 errors 非空时调用方应把错误并入\n * conventionErrors(error 级阻断构建);出错的族不删除、不注入。\n *\n * @param inheritedAccessors **文件级**累加器:`类名 → 该类实际生成的访问器行`。\n * 由 compile.ts 在同文件逐个组件调用时传入并回填,用于剔除「同文件祖先已经提供\n * 的、逐字节相同的」访问器行(见文件末 dedupeAncestorAccessors)。传 undefined\n * 时不做任何剔除。\n */\nexport function extractFieldAccessors(\n comp: ComponentAnalysis,\n code: string,\n ctx: ConventionsContext,\n bindings: Record<string, string> = {},\n inheritedAccessors?: Map<string, string[]>,\n): FieldExtractResult {\n const empty: FieldExtractResult = { removals: [], accessors: '', fieldInits: [], runtimeHelpers: [], errors: [] }\n // 组件自身 class 节点:优先 comp.cls(覆盖 mixin 工厂内的函数作用域类),\n // 回退按名查 localClasses(只收模块顶层 class 声明)\n const cls = comp.cls ?? ctx.localClasses.get(comp.className)\n if (!cls) return empty\n /** 运行时函数定名:默认原名,模块绑定冲突时用 __ce_ 前缀别名。 */\n const h = (canon: string) => bindings[canon] ?? canon\n\n /**\n * 「只有 @tag、没有五族成员」时仍要注入的那部分:`observedAttributes` getter。\n *\n * 与函数末尾的 emit 走同一个生成器,保证两条路径产物完全一致。\n * 条件只看 `comp.tagName`,**不看自有 prop** —— 自有 prop 一个都没有的 @tag 类\n * (属性整张来自无 @tag 基类)同样必须带这个 getter,否则浏览器注册它时读到的\n * observedAttributes 是 undefined,attribute 驱动全部静默失效。\n */\n const tagOnlyObservedAttrs = (): Pick<FieldExtractResult, 'accessors' | 'runtimeHelpers'> => {\n if (!comp.tagName) return { accessors: '', runtimeHelpers: [] }\n return {\n accessors: `${DEBUG_DIV} observedAttributes\\n${observedGetter(h)}`,\n runtimeHelpers: ['_observedAttrs'],\n }\n }\n\n const famOf = (local: string | null): Family | null => {\n if (!local) return null\n const imported = comp.compelemImports.get(local)\n if (imported === 'prop') return 'prop'\n if (imported === 'state') return 'state'\n if (imported === 'computed') return 'computed'\n if (imported === 'query' || imported === 'queryAll') return 'query'\n return null\n }\n\n // ---- 第一遍:成员分类 + 前置校验(族级 all-or-nothing,失败 → E 码)----\n interface Cand {\n member: any\n family: Family\n dec: any\n /** query 族区分 query / queryAll */\n decLocal: string\n }\n const cands: Cand[] = []\n const failed = new Set<Family>()\n const errors: ConventionError[] = []\n const failMember = (family: Family, member: any, message: string) => {\n errors.push({ start: member.start, end: member.end, message })\n failed.add(family)\n }\n\n for (const member of cls.body?.body ?? []) {\n const decs: any[] = member.decorators ?? []\n if (!decs.length) continue\n const famDecs = new Map<Family, any[]>()\n let foreign = false\n for (const dec of decs) {\n const fam = famOf(decoratorName(dec))\n if (fam) {\n let arr = famDecs.get(fam)\n if (!arr) famDecs.set(fam, (arr = []))\n arr.push(dec)\n } else foreign = true\n }\n if (!famDecs.size) continue\n\n const name = keyName(member.key)\n const shownName = name ?? '(匿名)'\n\n // 族外装饰器(含 @watch/@debounced 等 compelem 装饰器与用户自定义装饰器)同居:\n // 删除范围与语义无法证明互不干扰 → 报错,要求拆分独立成员(决策4)\n if (foreign) {\n const foreignNames = decs\n .filter((d) => !famOf(decoratorName(d)))\n .map((d) => '@' + decoratorName(d))\n .join(' ')\n for (const f of famDecs.keys()) {\n errors.push({\n start: member.start,\n end: member.end,\n message: `E-DECO-COEXIST: 五族成员 '${shownName}' 与其他装饰器(${foreignNames})同居——请把其他装饰器拆分到独立成员声明`,\n })\n failed.add(f)\n }\n continue\n }\n if (famDecs.size > 1) {\n const famNames = decs.map((d) => '@' + decoratorName(d)).join(' ')\n for (const f of famDecs.keys()) {\n errors.push({\n start: member.start,\n end: member.end,\n message: `E-DECO-COEXIST: 成员 '${shownName}' 同时挂载多个五族装饰器(${famNames})——请拆分为独立成员声明`,\n })\n failed.add(f)\n }\n continue\n }\n const family = famDecs.keys().next().value as Family\n const nodes = famDecs.get(family)!\n const decLocal = decoratorName(nodes[0])!\n if (nodes.length !== 1) {\n failMember(family, member, `${FAM_CODE[family]}: 成员 '${shownName}' 重复挂载 @${decLocal}`)\n continue\n }\n\n if (!name || !IDENT_RE.test(name)) {\n failMember(\n family,\n member,\n `${FAM_CODE[family]}: 成员名 '${shownName}' 非法(须为合法标识符)`,\n )\n continue\n }\n\n if (family === 'prop' || family === 'state') {\n if (member.type !== 'PropertyDefinition' || member.static) {\n failMember(family, member, `${FAM_CODE[family]}: @${decLocal} 只能用于非 static 实例字段('${name}' 是 ${member.static ? 'static ' : ''}${member.kind ?? member.type})`)\n continue\n }\n } else if (family === 'computed') {\n if (member.type !== 'MethodDefinition' || member.kind !== 'get') {\n // 非 getter 目标由 conventions E-COMPUTED-NOT-GETTER 报告(避免同点重复);\n // 此处仅放弃该族——运行时 computed 装饰器仍可兜底。\n failed.add(family)\n continue\n }\n if (member.static) {\n failMember(family, member, `${FAM_CODE[family]}: @computed 只能用于非 static getter('${name}')`)\n continue\n }\n if (!member.value?.body || member.value.body.type !== 'BlockStatement') {\n failMember(family, member, `${FAM_CODE[family]}: getter '${name}' 体无法外提(缺块状函数体)`)\n continue\n }\n const bodyText = code.slice(member.value.body.start, member.value.body.end)\n if (/\\bsuper\\b/.test(bodyText)) {\n // 原体外提为 __ce_static__ 内的普通方法后 super 的 home-object 语义丢失(决策2:不支持\n failMember(family, member, `${FAM_CODE[family]}: getter '${name}' 体内含 super——外提为 __ce_static__ 方法后 home-object 语义丢失,不支持该场景`)\n continue\n }\n const expr = nodes[0].expression ?? nodes[0]\n if (expr.type !== 'Identifier') {\n failMember(family, member, `${FAM_CODE[family]}: @computed 不接受参数('${name}')`)\n continue\n }\n } else {\n // query\n if (member.type !== 'PropertyDefinition') {\n // 非字段目标由 conventions E-DECO-TARGET 报告;仅放弃该族\n failed.add(family)\n continue\n }\n if (member.static) {\n failMember(family, member, `${FAM_CODE[family]}: @${decLocal} 只能用于非 static 实例字段('${name}')`)\n continue\n }\n const expr = nodes[0].expression ?? nodes[0]\n if (expr.type !== 'CallExpression') {\n failMember(family, member, `${FAM_CODE[family]}: @${decLocal} 必须以调用形式使用(@${decLocal}(selector, cache?))`)\n continue\n }\n const args = expr.arguments ?? []\n if (args.length === 0 || args.length > 2) {\n failMember(family, member, `${FAM_CODE[family]}: @${decLocal} 参数个数非法(须 1-2 个)`)\n continue\n }\n if (args[0]?.type === 'ArrayExpression') {\n failMember(family, member, `${FAM_CODE[family]}: selector 不支持数组字面量('${name}')`)\n continue\n }\n const sel = resolveSources(args[0], ctx)\n if (!sel) {\n failMember(family, member, `${FAM_CODE[family]}: selector 无法静态解析(须字符串字面量或文件内 const 字符串——'${name}';import/动态值不支持)`)\n continue\n }\n if (sel.length !== 1) {\n failMember(family, member, `${FAM_CODE[family]}: selector 不支持多值('${name}')`)\n continue\n }\n // cache 参数:缺省 false;静态字符串按 === QueryCache.ONCE('once') 判定\n if (args[1]) {\n const cacheStrs = resolveSources(args[1], ctx)\n if (cacheStrs && cacheStrs.length === 1) {\n // 'once' 字面量即可;其他字符串按非 ONCE 处理(与运行时 === 语义一致)\n } else if (\n args[1]?.type === 'MemberExpression' &&\n !args[1].computed &&\n keyName(args[1].property) === 'ONCE' &&\n args[1].object?.type === 'Identifier' &&\n comp.compelemImports.get(args[1].object.name) === 'QueryCache'\n ) {\n // QueryCache.ONCE(枚举跨模块无法求值,按绑定精确识别)\n } else {\n failMember(family, member, `${FAM_CODE[family]}: cache 参数无法静态解析(须 'once' 字符串或 QueryCache.ONCE——'${name}')`)\n continue\n }\n }\n }\n cands.push({ member, family, dec: nodes[0], decLocal })\n }\n\n if (!cands.length) {\n // 一个五族成员都没有的 @tag 类(如属性全部来自无 @tag 基类的子类)**仍要**\n // emit observedAttributes —— 它的属性表整张来自父表。早退会把它连同\n // runtimeHelpers 一起丢掉,故这里补上,不能直接返回 empty。\n return { ...empty, ...tagOnlyObservedAttrs(), errors }\n }\n\n // ---- 第二遍:按族生成(任一成员失败 → 整族丢弃 + 已产出 E 码)----\n interface Acc {\n removals: Array<{ start: number; end: number }>\n accessors: string[]\n items: AccItem[]\n }\n interface AccItem {\n name: string\n optsText?: string\n bodyText?: string\n model?: boolean\n attr?: boolean\n selector?: string\n all?: boolean\n once?: boolean\n initText?: string\n /** 编译期推导的构造器名(与运行时 PropTypeMap 同域) */\n inferredType?: string\n /** options 里已显式写了 type → 推导值不得覆盖 */\n explicitType?: boolean\n /** options 里已显式写了 defaultValue → 不得重复 emit */\n explicitDefault?: boolean\n /**\n * `@state m = this.<prop>` 的播种源。\n *\n * 真值由编译器注入 `prop`(运行期键),运行期 `CompElem#initStates` 从\n * `__data_[prop]` 深拷贝回灌信号 —— 声明处的初始值是一句会被立刻覆盖的\n * **死代码**,据此推出来的 defaultValue / type 描述的是那个死值,\n * 写进元数据就是谎报,故播种字段一律不推导。\n */\n seedProp?: string\n }\n const accs: Record<Family, Acc> = {\n prop: { removals: [], accessors: [], items: [] },\n state: { removals: [], accessors: [], items: [] },\n computed: { removals: [], accessors: [], items: [] },\n query: { removals: [], accessors: [], items: [] },\n }\n\n const memberSpan = (member: any, dec: any) => {\n const dStart = dec.start ?? (dec.expression?.start ?? member.start)\n return lineSpan(code, Math.min(member.start, dStart), member.end)\n }\n\n /** options 实参 → 可注入的对象字面量节点:字面量直取;Identifier 经 moduleConsts 内联。 */\n const resolveOptsNode = (family: Family, member: any, a0: any): any | null => {\n if (!a0) return null\n if (a0.type === 'ObjectExpression') return a0\n if (a0.type === 'Identifier') {\n const src = a0.name\n if (ctx.importedLocals?.has(src)) {\n failMember(\n family,\n member,\n `${FAM_CODE[family]}: options 标识符 '${src}' 是跨文件导入——import 的 options 不支持(文件内静态分析范围外)`,\n )\n return null\n }\n const init = unwrapTsExpr(ctx.moduleConsts?.get(src))\n if (init?.type === 'ObjectExpression') return init\n failMember(family, member, `${FAM_CODE[family]}: options 标识符 '${src}' 无法解析为文件内 const 对象(须是模块级 const;import/let/运行时拼接不支持)`)\n return null\n }\n failMember(family, member, `${FAM_CODE[family]}: options 无法静态解析(须对象字面量或文件内 const 对象)`)\n return null\n }\n\n /**\n * `@state m = this.<ident>` → `<ident>`;其余形状(字面量 / 标识符 / 调用 /\n * 可选链 / 计算属性 / `this.a.b`)一律返回 undefined,按普通初始值处理。\n *\n * 注意只识别**非计算的单层** `this.x`:`this` 开头还有别的形状\n * (`this.get()`、`this.a.b`),它们的求值结果不是\"播种源名字\",不能猜。\n */\n const parseSeedProp = (value: any): string | undefined => {\n if (value?.type !== 'MemberExpression') return undefined\n if (value.optional === true || value.computed === true) return undefined\n if (value.object?.type !== 'ThisExpression') return undefined\n return value.property?.type === 'Identifier' ? value.property.name : undefined\n }\n\n /**\n * 本类**本地声明**的 state / computed 字段名。\n *\n * 播种识别必须先把它们排除:`@state a = 1` + `@state b = this.a` 是\n * \"抄兄弟字段的初值\",走构造期求值是**正确**的,不能被误判成 prop 播种\n * (播种会去读 `__data_[a]`,那时 `#initStates` 可能还没轮到 a)。\n * 反过来,prop(本类的或从祖先继承的)不在这个集合里,`this.<prop>`\n * 才会走播种分支。\n */\n const localStateishFields = new Set<string>(\n cands\n .filter((c) => c.family === 'state' || c.family === 'computed')\n .map((c) => keyName(c.member.key))\n .filter((k): k is string => !!k),\n )\n\n for (const { member, family, dec, decLocal } of cands) {\n if (failed.has(family)) continue\n const acc = accs[family]\n const name = keyName(member.key)!\n const expr = dec.expression ?? dec\n\n if (family === 'prop') {\n let optsText = '{}'\n let attr = true\n let model = false\n let explicitType = false\n let explicitDefault = false\n if (expr.type === 'CallExpression') {\n const args = expr.arguments ?? []\n if (args.length !== 1) {\n failMember(family, member, `${FAM_CODE[family]}: @prop 必须无参或以单参调用(@prop(options))`)\n continue\n }\n const optsNode = resolveOptsNode(family, member, args[0])\n if (!optsNode) continue\n optsText = code.slice(optsNode.start, optsNode.end)\n for (const p of optsNode.properties ?? []) {\n if (p.type === 'SpreadElement' || p.type === 'ExperimentalSpreadProperty') continue\n const k = keyName(p.key)\n if (k === 'attribute' && p.value?.type === 'BooleanLiteral') attr = p.value.value !== false\n else if (k === 'attribute' && p.value?.type === 'Literal' && typeof p.value.value === 'boolean')\n attr = p.value.value !== false\n else if (k === 'attribute') {\n failMember(family, member, `E-PROP-ARG: attribute 必须是布尔字面量('${name}')`)\n break\n } else if (k === 'model') {\n const v = p.value\n const isBool = v?.type === 'BooleanLiteral' || (v?.type === 'Literal' && typeof v.value === 'boolean')\n if (!isBool) {\n failMember(family, member, `E-PROP-ARG: model 必须是布尔字面量('${name}')`)\n break\n }\n model = v.value === true\n } else if (k === 'type') {\n explicitType = true\n } else if (k === 'defaultValue') {\n // 默认值不应出现在 @prop/@state options 里 —— 它属于字段初始化器\n // (编译器对字面量推导出 `type`,对非字面量则信号初值即真值);\n // 当初为旧运行时兜底的 defaultValue 键在信号管线下是死字段。\n failMember(family, member, `E-FIELD-ARG: @${family} 的 options 中不支持 defaultValue —— 直接在字段初始化器上声明改动` )\n explicitDefault = true\n }\n }\n if (failed.has(family)) continue\n }\n const meta = inferInitMeta(member.value, code)\n acc.removals.push(memberSpan(member, dec))\n acc.items.push({\n name,\n optsText,\n model,\n attr,\n initText: member.value ? code.slice(member.value.start, member.value.end) : undefined,\n inferredType: meta.typeName,\n explicitType,\n explicitDefault,\n })\n acc.accessors.push(\n `get ${name}() { return this.__s.${name}.value }\\n`,\n // model prop 的 setter 语义按**宿主类型**三路分派,判据全在 writeModelProp 内:\n // ① compelem 父端接了 update:<name> ⇒ 父端是权威,可能对值做加工(校验、\n // clamp、格式化)。此时只 emit 不写本地:抢先写会白渲染一次,且用户看到\n // 中间值闪烁(子写 15 → 显示 15 → 父 clamp 到 10 → 回灌 → 又变 10)。\n // 值由父端回写后落回本地,Object.is 去重使其不会重复渲染。\n // ② 无人接 ⇒ 只 emit 会让值彻底蒸发(CompElem#emit 在无 wrapperComponent 时\n // 直接 return,事件丢弃且本地不落值,用户输入凭空消失)⇒ 本地兜底。\n // ③ 无人接但宿主声明 emit-native ⇒ 既本地兜底又发原生 CustomEvent。\n model\n ? `set ${name}(__v) { ${h('writeModelProp')}(${JSON.stringify(name)}, __v, this) }\\n`\n : `set ${name}(__v) { this.__s.${name}.value = __v }\\n`,\n )\n } else if (family === 'state') {\n // 播种:`@state m = this.p` → seedProp。\n //\n // 为什么不能真的当普通初始化求值:字段初始化跑在**构造期**,而 prop 的\n // 真值要到 setup() 里 #initProps() 才落定(父端 property、HTML 属性都\n // 晚于构造)。所以编译器识别出 `this.<ident>` 后**不** emit\n // `signal(this.p)`(那样只拿到默认值),改为注入 `prop`(运行期键),\n // 由 CompElem#initStates 读 `__data_[p]` 深拷贝回灌信号。\n //\n // `this.<x>` 指向本地 state / computed 字段时**不**算播种:\n // 那是\"抄兄弟字段初值\",构造期求值才是对的(见 localStateishFields 注释)。\n const rawSeed = parseSeedProp(member.value)\n const seedProp = rawSeed && !localStateishFields.has(rawSeed) ? rawSeed : undefined\n let optsText = '{}'\n let explicitType = false\n let explicitDefault = false\n if (expr.type === 'CallExpression') {\n const args = expr.arguments ?? []\n if (args.length !== 1) {\n failMember(family, member, `E-STATE-ARG: @state 必须无参或以单参调用(@state(options))`)\n continue\n }\n const optsNode = resolveOptsNode(family, member, args[0])\n if (!optsNode) continue\n optsText = code.slice(optsNode.start, optsNode.end)\n for (const p of optsNode.properties ?? []) {\n if (p.type === 'SpreadElement' || p.type === 'ExperimentalSpreadProperty') continue\n const k = keyName(p.key)\n if (k === 'type') {\n // state 的类型由 TS 标注保证,运行期从不做校验/转换(那是 prop 的 attribute\n // 通道才需要的),故 @state 不接受 type —— 写了也只是被忽略。\n failMember(family, member, `E-FIELD-ARG: @state 的 options 中不支持 type —— 类型由 TS 标注表达,运行期不校验`)\n explicitType = true\n }\n else if (k === 'defaultValue') {\n failMember(family, member, `E-FIELD-ARG: @state 的 options 中不支持 defaultValue —— 直接在字段初始化器上声明`)\n explicitDefault = true\n }\n else if (k === 'prop') {\n // 播种语义由**初始化器**表达(`@state m = this.<prop>`)。\n // 选项值本身就是 prop 名,直接把它翻译成新写法给用户 —— 这样提示\n // 永远是可粘贴的完整替换,不用用户再倒推一遍。\n const optName = typeof (p.value as any)?.value === 'string' ? (p.value as any).value as string : undefined\n const src = member.value ? code.slice(member.value.start, member.value.end) : ''\n const hint = optName !== undefined\n ? `@state ${name} = this.${optName}`\n : seedProp\n ? `@state ${name} = ${src}`\n : `@state ${name} = this.<prop>`\n failMember(\n family,\n member,\n `E-STATE-ARG: @state({prop}) 不是有效语法 —— 改用 ${hint}(初始化器形态;播种仍在 props 落定之后)`,\n )\n }\n }\n }\n // 播种字段的初始值是死代码 → 它的 defaultValue / type 描述的是死值,谎报\n const meta = seedProp ? {} : inferInitMeta(member.value, code)\n acc.removals.push(memberSpan(member, dec))\n acc.items.push({\n name,\n optsText,\n initText: member.value ? code.slice(member.value.start, member.value.end) : undefined,\n inferredType: meta.typeName,\n explicitType,\n explicitDefault,\n seedProp,\n })\n acc.accessors.push(\n `get ${name}() { return this.__s.${name}.value }\\n`,\n `set ${name}(__v) { this.__s.${name}.value = __v }\\n`,\n )\n } else if (family === 'computed') {\n const bodyText = code.slice(member.value.body.start, member.value.body.end)\n acc.removals.push(memberSpan(member, dec))\n acc.items.push({ name, bodyText })\n acc.accessors.push(`get ${name}() { return this.__s.${name}.value }\\n`)\n } else {\n const args = expr.arguments ?? []\n const selector = resolveSources(args[0], ctx)![0]\n let once = false\n if (args[1]) {\n const cacheStrs = resolveSources(args[1], ctx)\n if (cacheStrs && cacheStrs.length === 1) once = cacheStrs[0] === 'once'\n else once = true\n }\n const all = comp.compelemImports.get(decLocal) === 'queryAll'\n acc.removals.push(memberSpan(member, dec)) // 字段声明整体删除(否则 own 字段遮蔽注入 getter)\n acc.items.push({ name, selector, all, once })\n acc.accessors.push(\n `get ${name}() { return ${h('_queryGet')}(${JSON.stringify(selector)}, ${all}, ${once}, this) }\\n`,\n )\n }\n }\n\n // ---- 汇总(族级提交)----\n const removals: Array<{ start: number; end: number }> = []\n let accessors = ''\n let propsCode: string | undefined\n let statesCode: string | undefined\n let computedCode: string | undefined\n const committed = new Set<Family>()\n /** 族块标签(访问器 get/set 的分隔注释) */\n const familyLabel: Record<Family, string> = { prop: 'props', state: 'states', computed: 'computed', query: 'query' }\n\n /**\n * `__ce_static__.props/states` 单条目文本:`{ …options, type }`。\n *\n * options 保持**原样源码**(不重建属性),spread / 注释 / 多行写法一律原样保留;\n * 推导出来的 `type` 追加到这个对象字面量的属性位里。\n * 故取的是 options 切片的**花括号内部**(`slice(1,-1)`)——直接把整个 `{…}`\n * 当属性塞进去会产出 `{ { type: String }, … }` 这种嵌套字面量。\n *\n * 优先级:显式 `type` > 从默认值推导。\n * (`defaultValue` 已经不再 emit —— 运行期真值始终是信号 `__s[key].value`,\n * 静态表里那个字面量与实例信号是两个不同对象,拿它当默认值会误导。)\n */\n const NO_OPTS = '{}'\n /**\n * options 内部切片 → 去掉首尾空白与**尾逗号**。\n *\n * options 源码原样保留(含尾逗号),而 parts 之间靠 `join(', ')` 分隔:\n * 源码里 `{ type: Object, hasChanged(a,b){…}, }` 这种常见写法会把尾逗号带进来,\n * 与 join 叠加产出 `{ …},\\n ,, defaultValue: … }` —— 语法错误,产物整个文件\n * 解析失败(compelem-ui `base/ControlBox.ts`、`table/ColumnConfigPane.ts` 即此症状,\n * vite 报 `vite:oxc PARSE_ERROR Unexpected token`)。\n *\n * 只吃**最后一个**字符为 `,` 的情况,故注释里带逗号(`{ a: 1 ␟,␟ }` 形式)不受影响。\n */\n function optsInnerText(text: string): string {\n let t = text.trim()\n if (t.charCodeAt(t.length - 1) === 44 /* , */) t = t.slice(0, -1).trim()\n return t\n }\n /**\n * `type` 只对 prop 有意义(运行期 attribute 转换/类型校验要读它);state 的\n * 类型由 TS 标注保证,运行期从不读 state 的 type,故**不 emit**(省产物字节,\n * 也避免「表里有 type ⇒ 运行时会校验」的错觉)。\n */\n function fieldEntryText(i: AccItem, family: Family): string {\n const parts: string[] = []\n // options 切片恒以 `{` 开头、`}` 结尾(node.start/node.end 即字面量两侧花括号)\n const opts = i.optsText === undefined || i.optsText === NO_OPTS ? '' : optsInnerText(i.optsText.slice(1, -1))\n if (opts) parts.push(opts)\n // 播种源。值是**标识符名字**而非表达式 —— 运行期由 CompElem#initStates\n // 去 `__data_[p]` 取真值,此刻的 `this.p` 求值太早。\n if (i.seedProp !== undefined) parts.push(`prop: ${JSON.stringify(i.seedProp)}`)\n if (family === 'prop' && i.inferredType !== undefined && !i.explicitType) {\n parts.push(`type: ${i.inferredType}`)\n }\n // 无任何可写字段(推导不出、options 为空)时仍是 `{}` 而不是 `{ }`\n if (!parts.length) return `${JSON.stringify(i.name)}: {}`\n return `${JSON.stringify(i.name)}: { ${parts.join(', ')} }`\n }\n\n const commit = (f: Family, fn: (acc: Acc) => string | undefined) => {\n if (failed.has(f)) return\n const acc = accs[f]\n if (!acc.items.length) return\n removals.push(...acc.removals)\n if (acc.accessors.length) accessors += `${DEBUG_DIV} ${familyLabel[f]}\\n`\n accessors += acc.accessors.join('')\n committed.add(f)\n const code2 = fn(acc)\n if (code2 !== undefined) {\n if (f === 'prop') propsCode = code2\n else if (f === 'state') statesCode = code2\n else if (f === 'computed') computedCode = code2\n }\n }\n\n commit('prop', (a) => `{ ${a.items.map((i) => fieldEntryText(i, 'prop')).join(', ')} }`)\n commit('state', (a) => `{ ${a.items.map((i) => fieldEntryText(i, 'state')).join(', ')} }`)\n commit('computed', (a) => `{ ${a.items.map((i) => `${JSON.stringify(i.name)}()${i.bodyText}`).join(', ')} }`)\n commit('query', () => undefined)\n\n // prop/state 信号 + computed 信号体 → 构造体写入素材\n // (字段声明已整体删除;访问器统一读 `__s.<name>.value`,\n // 故**每个**已提交成员都必须建信号——无默认值者建 `signal(undefined)`,\n // 否则 `this.__s.x.value` 在无初始值的 @prop/@state 上直接抛 undefined.value)\n const fieldInits: Array<{ name: string; initText: string; computed?: boolean }> = []\n const runtimeHelpers: string[] = []\n if (committed.has('prop')) {\n for (const i of accs.prop.items) {\n fieldInits.push({ name: i.name, initText: i.initText ?? 'undefined' })\n }\n runtimeHelpers.push('signal')\n if (accs.prop.items.some((i) => i.model)) runtimeHelpers.push('writeModelProp')\n }\n if (committed.has('state')) {\n for (const i of accs.state.items) {\n // 播种字段(`@state m = this.p`)**不能**把 `this.p` 当初始值 emit:\n // 那是构造期求值,prop 真值那时还没落地(见 parseSeedProp 上方注释)。\n // 这里建 `signal(undefined)` 占位,实际值由 setup() 里的\n // #initStates 按 `prop`(运行期键) 从 `__data_[p]` 深拷贝回灌。\n fieldInits.push({ name: i.name, initText: i.seedProp !== undefined ? 'undefined' : i.initText ?? 'undefined' })\n }\n if (!runtimeHelpers.includes('signal')) runtimeHelpers.push('signal')\n }\n if (committed.has('computed')) {\n if (!runtimeHelpers.includes('signal')) runtimeHelpers.push('signal')\n if (!runtimeHelpers.includes('signalComputed')) runtimeHelpers.push('signalComputed')\n for (const i of accs.computed.items) {\n // bodyText 形如 `{ ... }`(getter 体,含花括号)\n if (i.bodyText === undefined) continue\n fieldInits.push({ name: i.name, initText: i.bodyText, computed: true })\n }\n }\n if (committed.has('query')) runtimeHelpers.push('_queryGet')\n\n // ---- 剔除同文件祖先已提供的、逐字节相同的访问器行 ----\n accessors = dedupeAncestorAccessors(comp, ctx, accessors, inheritedAccessors)\n\n // observedAttributes:**只给 @tag 类 emit**。\n //\n // 只有 `@tag` 类会被 `customElements.define`(tag.ts:immediate 直接 define,\n // 否则经 DefinitionComponentMap → defineComponents),也只有它的表会被浏览器读。\n // 无 `@tag` 的类(纯基类 / mixin 中间层 / 跨文件基类)永不被定义,带一份\n // observedAttributes 就是死代码。\n //\n // 条件只看 `comp.tagName`,**不看自有 prop**:一个自己一个 `@prop` 都没有的\n // @tag 类(属性全来自无 @tag 基类)同样必须 emit —— 它的表整张来自父表。\n //\n // 体是 `_observedAttrs(this)`(运行时从合并后的 props 表推导),因此**不依赖\n // 任何祖先的 getter**:这正是「基类可以不 emit」安全的前提。详见 observedGetter 注释。\n if (comp.tagName) {\n accessors += `${DEBUG_DIV} observedAttributes\\n`\n accessors += observedGetter(h)\n if (!runtimeHelpers.includes('_observedAttrs')) runtimeHelpers.push('_observedAttrs')\n }\n return { removals, accessors, propsCode, statesCode, computedCode, fieldInits, runtimeHelpers, errors }\n}\n","/**\n * 方法装饰器编译期前移:@debounced / @throttled / @onced。\n *\n * 与 @watch / 五族前移同构(analyze/watch-extract.ts、field-extract.ts):\n * - 静态提取装饰器参数 → 生成**构造体注入语句**(逐条直线代码,无计划表、无运行时遍历);\n * - 从源码中删除装饰器本身(**方法体保留**);\n * - 生成 destroy 注入语句(cancel + 置 null)。\n *\n * 产物形态(对齐原运行时 `DebouncedDecorator.created` 等):\n *\n * @throttled(100) onScroll() { this.sync() }\n * ⇒ 构造体:const __f0 = this.onScroll; this.onScroll = throttle(__f0, 100); this.onScroll_$__ = __f0\n * ⇒ destroy:this.onScroll = null; this.onScroll_$__ = null\n *\n * @debounced(50, true) onSearch(kw) { … }\n * ⇒ 构造体:const __f1 = this.onSearch;\n * const __g1 = function (...a) { if (this?.isDestroyed) return; return __f1.apply(this, a) }\n * this.onSearch = debounce(__g1, 50, true); this.onSearch_$__ = __g1\n * ⇒ destroy:this.onSearch?.cancel?.(); this.onSearch = null; this.onSearch_$__ = null\n *\n * @onced init() { … }\n * ⇒ 构造体:const __f2 = this.init.bind(this); this.init = once(__f2); this.init_$__ = __f2\n * ⇒ destroy:this.init = null; this.init_$__ = null\n *\n * ⚠️ **三个装饰器的 `_$__` 语义各不相同**(已实测确认):\n * - debounced:包裹 **guard**(含 isDestroyed),`_$__` **也是 guard**\n * - throttled:包裹**原函数**(无 guard),`_$__` 是**原函数**\n * - onced:包裹 `once(base)`,`_$__` 是 **bind 后**的原函数\n * ⇒ 注入代码必须按类型分支,**不能统一写法**。\n *\n * ⚠️ **必须先把原型方法捞进临时变量**(`const __f = this.onX`):包装后\n * `this.onX` 即指向包装结果,再取就是递归。\n *\n * ⚠️ **继承**:只删**本类 own** 的装饰器(祖先在自己所在文件/类里删)。\n * 但注入语句**必须含祖先条目**(祖先在前)—— 见 §继承说明于 collect 调用处。\n *\n * **逐族 all-or-nothing + 失败即报错**:任一成员参数不可静态解析 → 该族整体\n * 不删不注并报 E 码。运行时装饰器已无定义路径,E 码是唯一保护。\n */\nimport type { ComponentAnalysis } from '../types'\nimport { keyName } from '../utils/oxc'\nimport { superClassName } from './component'\nimport { decoratorName, unwrapTsExpr, type ConventionError, type ConventionsContext } from './conventions'\nimport { isBooleanLit, isNumericLit, isNumericUnary } from './literal-meta'\nimport { lineSpan } from './watch-extract'\n\nexport interface MethodDecoResult {\n /** 构造体注入语句(多条以 '\\n' 连接;空表示无注入) */\n ctorStmts: string\n /** destroy 注入语句 */\n destroyStmts: string\n /** 需删除的 span(**只删装饰器本身**,方法体保留) */\n removals: Array<{ start: number; end: number }>\n /** 运行时的包装函数名(`debounce` / `throttle` / `once`),供文件级 import 注入 */\n runtimeHelpers: string[]\n errors: ConventionError[]\n}\n\ntype Kind = 'debounced' | 'throttled' | 'onced'\n\n/** 本地变量前缀(避开用户标识符;`__` 前缀与框架其余注入一致)。 */\nconst TMP_F = '__ce_mdf'\nconst TMP_G = '__ce_mdg'\n\n/**\n * 提取组件类上的方法装饰器。祖先条目并入(祖先在前),但 removals 只记本类。\n */\nexport function extractMethodDecos(\n comp: ComponentAnalysis,\n code: string,\n ctx: ConventionsContext,\n): MethodDecoResult {\n const result: MethodDecoResult = { ctorStmts: '', destroyStmts: '', removals: [], runtimeHelpers: [], errors: [] }\n const cls = comp.cls ?? ctx.localClasses.get(comp.className)\n if (!cls) return result\n\n const aliases = new Set(comp.compelemImports.values())\n const kindOf = (local: string): Kind | null => {\n const imported = comp.compelemImports.get(local)\n if (imported === 'debounced') return 'debounced'\n if (imported === 'throttled') return 'throttled'\n if (imported === 'onced') return 'onced'\n return null\n }\n\n /** 沿 extends 链上溯同文件基类,返回 [最远祖先 … 直接父类] */\n const ancestorChain = (): any[] => {\n const chain: any[] = []\n let cur = cls\n for (let depth = 0; depth < 8; depth++) {\n const sup = superClassName(cur)\n if (!sup) break\n if (aliases.has(sup) && sup === 'CompElem') break\n const parent = ctx.localClasses.get(sup)\n if (!parent) break // 基类在本文件外,其装饰器由其自身文件处理\n chain.push(parent)\n cur = parent\n }\n return chain.reverse()\n }\n\n /** 全局计数器,保证临时变量名不冲突(祖先 + 本类共用一个序列)。 */\n let seq = 0\n let failed = false\n const usedHelpers = new Set<string>()\n\n /**\n * 解析 `wait`:数字字面量(含一元负号)/ 模块级 `const` 数字。\n * ⚠️ oxc 走 ESTree 形态 —— 是 `Literal` + `value`,**不是** `NumericLiteral`。\n * 故必须用 literal-meta 的判定函数,不能直接比 `type === 'NumericLiteral'`\n * (曾因此让 `@debounced(50)` 全部误报 E-METHOD-DECO-ARG)。\n */\n const resolveWait = (arg: any): number | null => {\n if (!arg) return null\n const n = unwrapTsExpr(arg)\n if (isNumericLit(n)) return n.value\n if (isNumericUnary(n)) {\n const v = unwrapTsExpr(n.argument).value\n return n.operator === '-' ? -v : v\n }\n // 模块级 const:`const W = 200` → moduleConsts 存 init 节点\n if (n?.type === 'Identifier') {\n const init = ctx.moduleConsts?.get(n.name)\n if (init) {\n const i = unwrapTsExpr(init)\n if (isNumericLit(i)) return i.value\n if (isNumericUnary(i)) {\n const v = unwrapTsExpr(i.argument).value\n return i.operator === '-' ? -v : v\n }\n }\n }\n return null\n }\n\n const resolveBool = (arg: any): boolean | null => {\n if (!arg) return null\n const n = unwrapTsExpr(arg)\n if (isBooleanLit(n)) return n.value\n if (n?.type === 'Identifier') {\n const init = ctx.moduleConsts?.get(n.name)\n if (init && isBooleanLit(unwrapTsExpr(init))) return unwrapTsExpr(init).value\n }\n return null\n }\n\n /**\n * 处理单个类节点。\n * @param own true = 本类(记 removals / errors);false = 祖先(只产出注入语句)\n */\n const collect = (node: any, own: boolean): void => {\n const push = (s: string) => { result.ctorStmts += (result.ctorStmts ? '\\n' : '') + s }\n\n const handle = (member: any, dec: any): void => {\n const memberName = keyName(member.key)\n if (!memberName) return\n const dn = decoratorName(dec)\n if (!dn) return\n const kind = kindOf(dn)\n if (!kind) return\n\n const expr = dec.expression ?? dec\n const args: any[] = expr.type === 'CallExpression' ? (expr.arguments ?? []) : []\n\n const fail = (msg: string) => {\n failed = true\n if (own) {\n result.errors.push({\n start: dec.start ?? expr.start ?? member.start,\n end: dec.end ?? expr.end ?? member.end,\n message: msg,\n })\n }\n }\n\n if (kind === 'onced') {\n // 无参\n if (args.length) { fail(`E-METHOD-DECO-ARG: @onced 不接受参数`); return }\n const f = `${TMP_F}${seq++}`\n push(`const ${f} = this.${memberName}.bind(this);`)\n push(`this.${memberName} = once(${f});`)\n push(`this.${memberName}_$__ = ${f};`)\n result.destroyStmts += (result.destroyStmts ? '\\n' : '') +\n `this.${memberName} = null; this.${memberName}_$__ = null;`\n usedHelpers.add('once')\n } else {\n const waitArg = args[0]\n const wait = resolveWait(waitArg)\n if (wait === null || !Number.isFinite(wait)) {\n fail(`E-METHOD-DECO-ARG: @${kind} 的 wait 无法静态解析(须为数字字面量或模块级 const 数字)`)\n return\n }\n let immediate = false\n if (kind === 'debounced' && args.length > 1) {\n const b = resolveBool(args[1])\n if (b === null) { fail(`E-METHOD-DECO-ARG: @debounced 的 immediate 必须是布尔字面量`); return }\n immediate = b\n }\n if (kind === 'throttled' && args.length > 1) {\n fail(`E-METHOD-DECO-ARG: @throttled 不接受第二个参数`)\n return\n }\n\n const f = `${TMP_F}${seq++}`\n push(`const ${f} = this.${memberName};`)\n\n if (kind === 'debounced') {\n // 包装 guard;guard 自身也是 _$__\n const g = `${TMP_G}${seq++}`\n push(`const ${g} = function (...__a) { if (this?.isDestroyed) return; return ${f}.apply(this, __a) };`)\n push(`this.${memberName} = debounce(${g}, ${wait}, ${immediate});`)\n push(`this.${memberName}_$__ = ${g};`)\n result.destroyStmts += (result.destroyStmts ? '\\n' : '') +\n `this.${memberName}?.cancel?.(); this.${memberName} = null; this.${memberName}_$__ = null;`\n usedHelpers.add('debounce')\n } else {\n // throttled:包装原函数,_$__ 即原函数(**无 guard**)\n push(`this.${memberName} = throttle(${f}, ${wait});`)\n push(`this.${memberName}_$__ = ${f};`)\n result.destroyStmts += (result.destroyStmts ? '\\n' : '') +\n `this.${memberName} = null; this.${memberName}_$__ = null;`\n usedHelpers.add('throttle')\n }\n }\n\n if (own) {\n result.removals.push(lineSpan(code, dec.start ?? expr.start - 1, dec.end ?? expr.end))\n }\n }\n\n for (const member of node.body?.body ?? []) {\n if (member.type !== 'MethodDefinition') continue\n for (const dec of member.decorators ?? []) {\n handle(member, dec)\n }\n }\n }\n\n // 1) 祖先条目(远 → 近):使父类声明的装饰器在子类实例上同样生效\n for (const anc of ancestorChain()) collect(anc, false)\n // 2) 本类条目 + removals + errors\n collect(cls, true)\n\n // ⚠️ 用户已声明 own `beforeDestroyed` ⇒ **整体放弃前移并报 E 码**。\n // 原因:清理语句要注入成一个 `beforeDestroyed()` 重写,若用户已有一个,注入会\n // 产生重复方法定义(后者覆盖前者 → 用户逻辑静默丢失)。而\"只跳过清理、保留包装\"\n // 会造成包装了却永不 cancel 的泄漏 —— 比不包装更难查。故与其它失败一样走\n // all-or-nothing(不删不注 + E 码阻断)。\n if (!failed && result.ctorStmts) {\n const dup = (cls.body?.body ?? []).find(\n (m: any) => m.type === 'MethodDefinition' && m.static !== true && keyName(m.key) === 'beforeDestroyed',\n )\n if (dup) {\n result.errors.push({\n start: dup.start,\n end: dup.end,\n message:\n 'E-METHOD-DECO-HOOK: 组件自带 `beforeDestroyed()`,方法装饰器(@debounced/@throttled/@onced)' +\n '的清理需要重写该钩子 —— 请把清理逻辑并入你的 beforeDestroyed,或移除该装饰器',\n })\n }\n }\n\n if (failed || result.errors.length) {\n // 逐族 all-or-nothing:整体放弃(不删不注),运行时装饰器路径已无定义 —— 由 E 码阻断\n result.ctorStmts = ''\n result.destroyStmts = ''\n result.removals = []\n result.runtimeHelpers = []\n return result\n }\n\n result.runtimeHelpers = [...usedHelpers]\n return result\n}\n","/**\n* myfx v2.0.0-beta.2\n* A modular utility library with more utils, higher performance and simpler declarations ...\n* https://github.com/holyhigh2/myfx\n* (c) 2021-2026 @holyhigh2 may be freely distributed under the MIT license\n*/\n//#region src/is/isArray.ts\n/**\n* 判断参数是否为Array对象的实例\n*\n* @example\n* //true\n* console.log(_.isArray([]))\n* //false\n* console.log(_.isArray(document.body.children))\n*\n* @param v\n* @returns\n*/\nfunction isArray(v) {\n\treturn Array.isArray(v);\n}\n//#endregion\n//#region src/is/isFunction.ts\n/**\n* 判断参数是否为函数对象\n*\n* @example\n* //true\n* console.log(_.isFunction(new Function()))\n* //true\n* console.log(_.isFunction(()=>{}))\n*\n* @param v\n* @returns\n*/\nfunction isFunction(v) {\n\treturn typeof v === \"function\";\n}\n//#endregion\n//#region src/is/isArrayLike.ts\n/**\n* 判断参数是否为类数组对象\n*\n* @example\n* //true\n* console.log(_.isArrayLike('abc123'))\n* //true\n* console.log(_.isArrayLike([]))\n* //true\n* console.log(_.isArrayLike(document.body.children))\n*\n* @param v\n* @returns\n*/\nfunction isArrayLike(v) {\n\tconst t = typeof v;\n\tif (t === \"string\") return v.length > 0;\n\tif (t !== \"object\" && t !== \"function\" || v === null) return false;\n\tif (v instanceof String) return v.length > 0;\n\tif (Array.isArray(v)) return true;\n\tconst list = v;\n\tif (\"length\" in list) {\n\t\tif (isFunction(Reflect.getPrototypeOf(list)?.item)) return true;\n\t\tif (isFunction(list[Symbol.iterator])) return true;\n\t}\n\treturn false;\n}\n//#endregion\n//#region src/is/isIterator.ts\n/**\n* 判断值是不是迭代器对象\n*\n* @example\n* //true\n* console.log(_.isIterator(new Map()))\n* //true\n* console.log(_.isIterator(new Map().values()))\n* //false\n* console.log(_.isIterator({a:1}))\n*\n* @param v\n* @returns\n* @since 1.10.0\n*/\nfunction isIterator(v) {\n\treturn typeof v === \"object\" && v !== null && Symbol.iterator in v;\n}\n//#endregion\n//#region src/is/isMap.ts\n/**\n* 判断值是不是一个Map对象\n*\n* @example\n* //true\n* console.log(_.isMap(new Map()))\n* //false\n* console.log(_.isMap(new WeakMap()))\n*\n* @param v\n* @returns\n*/\nfunction isMap(v) {\n\treturn v instanceof Map || Object.prototype.toString.call(v) === \"[object Map]\";\n}\n//#endregion\n//#region src/is/isObject.ts\n/**\n* 判断值是不是一个非基本类型外的值,如果true则认为值是一个对象\n* 同样,该方法还可以用来判断一个值是不是基本类型\n*\n* @example\n* //false\n* console.log(_.isObject(1))\n* //true\n* console.log(_.isObject(new String()))\n* //false\n* console.log(_.isObject(true))\n* //false\n* console.log(_.isObject(null))\n*\n* @param v value\n* @returns 是否对象。如果值是null返回false,即使typeof null === 'object'\n*/\nfunction isObject(v) {\n\treturn v !== null && typeof v === \"object\";\n}\n//#endregion\n//#region src/is/isSet.ts\n/**\n* 判断值是不是一个Set对象\n*\n* @example\n* //false\n* console.log(_.isSet(new WeakSet))\n* //true\n* console.log(_.isSet(new Set))\n*\n* @param v\n* @returns\n*/\nfunction isSet(v) {\n\treturn v instanceof Set || Object.prototype.toString.call(v) === \"[object Set]\";\n}\n//#endregion\n//#region src/is/isString.ts\n/**\n* 判断参数是否为字符串,包括String类的实例以及基本类型string的值\n*\n* @example\n* //true\n* console.log(_.isString(new String('')))\n* //true\n* console.log(_.isString(''))\n*\n* @param v\n* @returns\n*/\nfunction isString(v) {\n\treturn v instanceof String || Object.prototype.toString.call(v) === \"[object String]\";\n}\n//#endregion\n//#region src/object/keys.ts\n/**\n* 返回对象/Map的所有key数组\n* \n* > 只返回对象的自身可枚举属性\n*\n* @example\n* let f = new Function(\"this.a=1;this.b=2;\");\n* f.prototype.c = 3;\n* //[a,b]\n* console.log(_.keys(new f()))\n*\n* @param obj\n* @returns key数组\n*/\nfunction keys(obj) {\n\tif (obj === null || obj === void 0) return [];\n\tif (isMap(obj)) return Array.from(obj.keys());\n\treturn Object.keys(obj);\n}\n//#endregion\n//#region src/object/values.ts\n/**\n* 返回对象/Map的所有value数组\n* <div class=\"alert alert-secondary\">\n只返回对象的自身可枚举属性\n</div>\n*\n*\n* @example\n* let f = new Function(\"this.a=1;this.b=2;\");\n* f.prototype.c = 3;\n* //[1,2]\n* console.log(_.values(new f()))\n*\n* @param obj\n* @returns 值列表\n*/\nfunction values(obj) {\n\tif (isMap(obj)) return Array.from(obj.values());\n\treturn keys(obj).map((k) => obj[k]);\n}\n//#endregion\n//#region src/collection/toArray.ts\n/**\n* 把一个集合对象转为array对象。对于非集合对象,\n* <ul>\n* <li>字符串 - 每个字符都会变成数组的元素</li>\n* <li>其他情况 - 返回包含一个collection元素的数组</li>\n* </ul>\n*\n* @example\n* //[1,2,3]\n* console.log(_.toArray(new Set([1,2,3])))\n* //['a','b','c']\n* console.log(_.toArray('abc'))\n* //[1,2,'b']\n* console.log(_.toArray({x:1,y:2,z:'b'}))\n* //[[1, 'a'], [3, 'b'], ['a', 5]]\n* console.log(_.toArray(new Map([[1,'a'],[3,'b'],['a',5]])))\n* //[1, 3, 'a']\n* console.log(_.toArray(new Map([[1,'a'],[3,'b'],['a',5]])).keys())\n*\n* @param collection 如果是Map/Object对象会转换为值列表\n*\n* @returns 转换后的数组对象\n*/\nfunction toArray(collection) {\n\tif (isArray(collection)) return collection.concat();\n\tif (isFunction(collection)) return [collection];\n\tif (isSet(collection)) return Array.from(collection);\n\telse if (isString(collection)) return collection.split(\"\");\n\telse if (isArrayLike(collection)) return Array.from(collection);\n\telse if (isMap(collection)) return Array.from(collection.values());\n\telse if (isIterator(collection)) return Array.from(collection);\n\telse if (isObject(collection)) return values(collection);\n\treturn [collection];\n}\n//#endregion\n//#region src/array/append.ts\n/**\n* 向数组末尾追加一个或多个元素并返回\n* \n* @effect 修改原数组\n*\n* @example\n* //[1, 2, 3, 4]\n* let ary = [1,2];\n* _.append(ary,3,4);\n* console.log(ary);\n* //[1, 2, Array(2), 5]\n* ary = [1,2];\n* _.append(ary,[3,4],5);\n* console.log(ary);\n* //[1, 2, 3, 4]\n* ary = [1,2];\n* _.append(ary,...[3,4]);\n* console.log(ary);\n*\n* @param array 数组对象。如果非数组类型会自动转为数组\n* @param values 1-n个需要插入列表的值\n* @returns 插入值后的数组对象\n*/\nfunction append(array, ...values) {\n\tconst rs = isArray(array) ? array : toArray(array);\n\trs.push(...values);\n\treturn rs;\n}\n//#endregion\n//#region src/array/chunk.ts\n/**\n* 把指定数组拆分成多个长度为size的子数组,并返回子数组组成的二维数组\n* @example\n* //[[1,2],[3,4]]\n* console.log(_.chunk([1,2,3,4],2))\n* //[[1,2,3],[4]]\n* console.log(_.chunk([1,2,3,4],3))\n*\n* @param array 数组,非数组返回空数组\n* @param size 子数组长度\n* @returns 拆分后的新数组\n* @since 0.23.0\n*/\nfunction chunk(array, size = 1) {\n\tconst rs = [];\n\tif (!Array.isArray(array)) return rs;\n\tconst sizeNum = (size || 1) >> 0;\n\tfor (let i = 0; i < array.length; i += sizeNum) rs.push(array.slice(i, i + sizeNum));\n\treturn rs;\n}\n//#endregion\n//#region src/_identity.ts\n/**\n* 返回参数列表中的第一个值,即<code>f(x) = x</code>。该函数可以用来为高阶函数提供数据如过滤列表或map,也用作默认迭代器\n* @example\n* //[1,2,4,'a','1']\n* console.log(_.filter([0,1,false,2,4,undefined,'a','1','',null],_.identity))\n* const list = [\n* {name:'a',value:1},\n* {name:'b',value:2},\n* {name:'c',value:3}\n* ]\n* //list\n* console.log(_.map(list,_.identity))\n*\n* @param v\n* @returns 第一个参数\n* @since 0.17.0\n*/\nfunction identity(...args) {\n\treturn args[0];\n}\n//#endregion\n//#region src/array/compact.ts\n/**\n* 对集合内的假值进行剔除,并返回剔除后的新数组。假值包括 null/undefined/NaN/0/''/false\n* @example\n* //[1,2,4,'a','1']\n* console.log(_.compact([0,1,false,2,4,undefined,'a','1','',null]))\n*\n* @param array 数组\n* @returns 转换后的新数组对象\n*/\nfunction compact(array) {\n\tif (Array.isArray(array)) return array.filter(identity);\n\treturn toArray(array).filter(identity);\n}\n//#endregion\n//#region src/collection/each.ts\n/**\n* 对集合元素进行顺序遍历。\n* 注意,object类型无法保证遍历顺序\n*\n* @example\n* //1、2、3\n* _.each(new Set([1,2,3]),console.log)\n* //a、b、c\n* _.each({'1':'a','2':'b','3':'c'},console.log)\n* //1、{\"a\":1}、[2,3]\n* _.each([1,{a:1},[2,3]],console.log)\n* //h/o/l/y/h/i/g/h\n* _.each('holyhigh',console.log)\n* //遍历元素集合\n* const x=[];_.each(document.body.children,v=>x.push(v));console.log(x)\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param callback (value[,index|key[,collection][,i]]);回调函数,如果返回false会立即中断遍历\n* @param startIndex 遍历起始索引\n*/\nfunction each(collection, callback, startIndex = 0) {\n\tif (collection == null) return;\n\tif (Array.isArray(collection)) {\n\t\tconst size = collection.length;\n\t\tif (size === 0 || startIndex >= size) return;\n\t\tfor (let i = startIndex; i < size; i++) if (callback(collection[i], i, collection, i) === false) return;\n\t\treturn;\n\t}\n\tif (typeof collection === \"string\") {\n\t\tconst size = collection.length;\n\t\tif (size === 0 || startIndex >= size) return;\n\t\tfor (let i = startIndex; i < size; i++) if (callback(collection[i], i, collection, i) === false) return;\n\t\treturn;\n\t}\n\tif (collection instanceof Set) {\n\t\tconst size = collection.size;\n\t\tif (size === 0 || startIndex >= size) return;\n\t\tconst values = collection.values();\n\t\tfor (let i = startIndex; i < size; i++) if (callback(values.next().value, i, collection, i) === false) return;\n\t\treturn;\n\t}\n\tif (collection instanceof Map) {\n\t\tconst size = collection.size;\n\t\tif (size === 0 || startIndex >= size) return;\n\t\tconst keys = collection.keys();\n\t\tconst values = collection.values();\n\t\tfor (let i = startIndex; i < size; i++) if (callback(values.next().value, keys.next().value, collection, i) === false) return;\n\t\treturn;\n\t}\n\tconst keys = Object.keys(collection);\n\tconst size = keys.length;\n\tif (size === 0 || startIndex >= size) return;\n\tfor (let i = startIndex; i < size; i++) {\n\t\tconst k = keys[i];\n\t\tif (callback(collection[k], k, collection, i) === false) return;\n\t}\n}\n//#endregion\n//#region src/array/concat.ts\n/**\n* 合并数组或值并返回新数组,元素可以重复。基于 `Array.prototype.concat` 实现\n*\n* @example\n* //[a/b/a]\n* console.log(_.concat([{name:'a'},{name:'b'}],[{name:'a'}]))\n* //[1, 2, 3, 1, 2]\n* console.log(_.concat([1,2,3],[1,2]))\n* //[1, 2, 3, 1, 2, null, 0]\n* console.log(_.concat([1,2,3],[1,2],null,0))\n* //[1, 2, 3, 1, 2, doms..., 0, null]\n* console.log(_.concat([1,2,3],[1,2],document.body.children,0,null))\n*\n* @param arrays 1-n个数组对象\n* @returns 如果参数为空,返回空数组\n*/\nfunction concat(...arrays) {\n\tconst argc = arrays.length;\n\tif (argc < 1) return [];\n\tif (argc === 1) {\n\t\tconst only = arrays[0];\n\t\tif (Array.isArray(only)) {\n\t\t\tconst size = only.length;\n\t\t\tconst copy = [];\n\t\t\tfor (let j = 0; j < size; j++) copy.push(only[j]);\n\t\t\treturn copy;\n\t\t}\n\t}\n\tlet rs = [];\n\tfor (let i = 0; i < argc; i++) {\n\t\tconst item = arrays[i];\n\t\tif (Array.isArray(item)) for (let j = 0, size = item.length; j < size; j++) rs.push(item[j]);\n\t\telse if (isArrayLike(item)) each(item, (v) => rs.push(v));\n\t\telse rs.push(item);\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/array/except.ts\n/**\n* 对所有集合做差集并返回差集元素组成的新数组\n*\n* @example\n* //[1]\n* console.log(_.except([1,2,3],[2,3]))\n* //[1,4]\n* console.log(_.except([1,2,3],[2,3],[3,2,1,4]))\n* //[{name: \"b\"}]\n* console.log(_.except([{name:'a'},{name:'b'}],[{name:'a'}],v=>v.name))\n* //[2, 3, \"2\", \"3\"] '2'和2不相等\n* console.log(_.except([1,2,3],[1,'2',3],[2,'3',1]))\n*\n* @param params (...arrays[,identifier(v)]) \n* arrays - 1-n个数组或arraylike对象,非arraylike参数会被忽略; \n* identifier - 标识函数,用来对每个元素返回唯一标识,标识相同的值会认为相等。使用<a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Same-value-zero_equality\">SameValueZero</a> 算法进行值比较。如果为空,直接使用值自身比较\n* @returns 差集元素组成的新数组\n*/\nfunction except(...params) {\n\tlet comparator;\n\tlet list = params;\n\tconst sl = params.length;\n\tif (sl > 2) {\n\t\tconst lp = params[sl - 1];\n\t\tif (isFunction(lp)) {\n\t\t\tcomparator = lp;\n\t\t\tlist = params.slice(0, params.length - 1);\n\t\t}\n\t}\n\tlist = list.filter((v) => isArrayLike(v) || isArray(v));\n\tif (list.length < 1) return list;\n\tconst len = list.length;\n\tconst kvMap = /* @__PURE__ */ new Map();\n\tfor (let j = 0; j < len; j++) {\n\t\tconst ary = list[j];\n\t\tconst localMap = /* @__PURE__ */ new Map();\n\t\tfor (let i = 0; i < ary.length; i++) {\n\t\t\tconst v = ary[i];\n\t\t\tconst id = comparator ? comparator(v) : v;\n\t\t\tlet entry = kvMap.get(id);\n\t\t\tif (!entry) {\n\t\t\t\tentry = {\n\t\t\t\t\ti: 0,\n\t\t\t\t\tv\n\t\t\t\t};\n\t\t\t\tkvMap.set(id, entry);\n\t\t\t}\n\t\t\tif (!localMap.get(id)) {\n\t\t\t\tentry.i++;\n\t\t\t\tlocalMap.set(id, true);\n\t\t\t}\n\t\t}\n\t}\n\tconst rs = [];\n\tkvMap.forEach((entry) => {\n\t\tif (entry.i < len) rs.push(entry.v);\n\t});\n\treturn rs;\n}\n//#endregion\n//#region src/array/fill.ts\n/**\n* 使用固定值填充arrayLike中从起始索引到终止索引内的全部元素\n*\n* @example\n* //[6, 6, 6]\n* console.log(_.fill(new Array(3), 6))\n* //[1, 'x', 'x', 'x', 5]\n* console.log(_.fill([1, 2, 3, 4, 5], 'x', 1, 4))\n*\n* @param array 数组\n* @param value 填充值\n* @param start 起始索引,包含\n* @param end 终止索引,不包含\n* @returns 填充后的新数组\n*/\nfunction fill(array, value, start = 0, end) {\n\tconst rs = toArray(array);\n\tif (end && end > 0 && rs.length < end) rs.length = end;\n\trs.fill(value, start, end);\n\treturn rs;\n}\n//#endregion\n//#region src/is/isUndefined.ts\n/**\n* 判断参数是否为undefined\n* @example\n* //true\n* console.log(_.isUndefined(undefined))\n* //false\n* console.log(_.isUndefined(null))\n*\n* @param v\n* @returns\n*/\nfunction isUndefined(v) {\n\treturn v === void 0;\n}\n//#endregion\n//#region src/_toPath.ts\n/**\n* 解析path并返回数组\n* @example\n* //['a', 'b', '2', 'c']\n* console.log(_.toPath('a.b[2].c'))\n* //['a', 'b', 'c', '1']\n* console.log(_.toPath(['a','b','c[1]']))\n* //['1']\n* console.log(_.toPath(1))\n*\n* @param path 属性路径,可以是数字索引,字符串key,或者多级属性数组\n* @returns path数组\n* @since 0.16.0\n*/\nfunction toPath(path) {\n\tlet chain = path;\n\tif (isArray(chain)) chain = chain.join(\".\");\n\tlet rs = chain + \"\";\n\tif (rs.includes(\"[\")) rs = rs.replace(/\\[(['\"])?([^\\]'\"]+)\\1?\\]/gm, \".$2\");\n\tif (rs[0] === \".\") rs = rs.substring(1);\n\treturn rs.split(\".\");\n}\n//#endregion\n//#region src/object/get.ts\n/**\n* 通过path获取对象属性值\n*\n* @example\n* //2\n* console.log(_.get([1,2,3],1))\n* //Holyhigh\n* console.log(_.get({a:{b:[{x:'Holyhigh'}]}},['a','b',0,'x']))\n* //Holyhigh2\n* console.log(_.get({a:{b:[{x:'Holyhigh2'}]}},'a.b.0.x'))\n* //Holyhigh\n* console.log(_.get({a:{b:[{x:'Holyhigh'}]}},'a.b[0].x'))\n* //hi\n* console.log(_.get([[null,[null,null,'hi']]],'[0][1][2]'))\n* //not find\n* console.log(_.get({},'a.b[0].x','not find'))\n*\n* @param obj 需要获取属性值的对象,如果obj不是对象(isObject返回false),则返回defaultValue\n* @param path 属性路径,可以是索引数字,字符串key,或者多级属性数组\n* @param defaultValue 如果path未定义,返回默认值\n* @returns 属性值或默认值\n*/\nfunction get(obj, path, defaultValue) {\n\tif (!isObject(obj)) return defaultValue;\n\tif (!isArray(path) || path.length === 1 && (path = path[0]) !== void 0) {\n\t\tlet v = obj[path];\n\t\tif (v !== void 0) return v;\n\t}\n\tconst chain = toPath(path);\n\tlet target = obj;\n\tfor (let i = 0; i < chain.length; i++) {\n\t\tconst seg = chain[i];\n\t\ttarget = target[seg];\n\t\tif (!target) break;\n\t}\n\tif (target === void 0) target = defaultValue;\n\treturn target;\n}\n//#endregion\n//#region src/object/prop.ts\n/**\n* 创建一个函数,该函数返回指定对象的path属性值\n* @example\n* const libs = [\n* {name:'func.js',platform:['web','nodejs'],tags:{utils:true},js:false},\n* {name:'juth2',platform:['web','java'],tags:{utils:false,middleware:true},js:true},\n* {name:'soya2d',platform:['web'],tags:{utils:true},js:true}\n* ];\n* //[true,false,true]\n* console.log(_.map(libs,_.prop('tags.utils')))\n* //nodejs\n* console.log(_.prop(['platform',1])(libs[0]))\n*\n* @param path\n* @returns 接收一个对象作为参数的函数\n* @since 0.17.0\n*/\nfunction prop(path) {\n\treturn (obj) => {\n\t\treturn get(obj, path);\n\t};\n}\n//#endregion\n//#region src/_eq.ts\nfunction eq$1(a, b) {\n\treturn a === b || Number.isNaN(a) && Number.isNaN(b);\n}\n//#endregion\n//#region src/is/isNil.ts\n/**\n* 判断值是否为null或undefined\n*\n* @example\n* //true\n* console.log(_.isNil(undefined))\n* //false\n* console.log(_.isNil(0))\n* //true\n* console.log(_.isNil(null))\n* //false\n* console.log(_.isNil(NaN))\n*\n* @param v\n* @returns\n* @since 1.0.0\n*/\nfunction isNil(v) {\n\treturn v === null || v === void 0;\n}\n//#endregion\n//#region src/is/isNode.ts\n/**\n* 判断值是不是Node的实例\n*\n* @example\n* //true\n* console.log(_.isNode(document.body.attributes[0]))\n* //true\n* console.log(_.isNode(document))\n*\n* @param v\n* @returns\n* @since 1.5.0\n*/\nfunction isNode(v) {\n\treturn typeof v === \"object\" && v instanceof (globalThis.Node || Object);\n}\n//#endregion\n//#region src/is/isMatchWith.ts\n/**\n* 检测props对象中的所有属性是否在object中存在并使用自定义比较器对属性值进行对比。可以用于对象的深度对比。\n* 当comparator参数是默认值时,与<code>isMath</code>函数相同\n*\n* @example\n* let target = {a:{x:1,y:2},b:1}\n* //true\n* console.log(_.isMatchWith(target,{b:1},_.eq))\n* //false\n* console.log(_.isMatchWith(target,{b:'1'},_.eq))\n*\n* target = {a:null,b:0}\n* //true\n* console.log(_.isMatchWith(target,{a:'',b:'0'},(a,b)=>_.isEmpty(a) && _.isEmpty(b)?true:a==b))\n*\n* @param target 如果不是对象类型,返回false\n* @param props 对比属性对象,如果是nil,返回true\n* @param comparator 比较器。参数(object[k],props[k],k,object,props),返回true表示匹配\n* @returns 匹配所有props返回true\n* @since 0.18.1\n*/\nfunction isMatchWith(target, props, comparator) {\n\tif (isNil(props)) return true;\n\tconst ks = Object.keys(props);\n\tif (!isObject(target)) return false;\n\tlet rs = true;\n\tfor (let i = ks.length; i--;) {\n\t\tconst k = ks[i];\n\t\tconst v1 = target[k];\n\t\tconst v2 = props[k];\n\t\tif (isObject(v1) && isObject(v2) && !isNode(v1) && !isNode(v2) && !isFunction(v1) && !isFunction(v2)) {\n\t\t\tif (!isMatchWith(v1, v2, comparator)) {\n\t\t\t\trs = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else if (!comparator(v1, v2, k, target, props)) {\n\t\t\trs = false;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/is/isMatch.ts\n/**\n* 检测props对象中的所有属性是否在object中存在,可用于对象的深度对比。\n* 使用<code>eq</code>作为值对比逻辑\n*\n* @example\n* let target = {a:{x:1,y:2},b:1}\n* //true\n* console.log(_.isMatch(target,{b:1}))\n* //true\n* console.log(_.isMatch(target,{a:{x:1}}))\n*\n* target = [{x:1,y:2},{b:1}]\n* //true\n* console.log(_.isMatch(target,{1:{b:1}}))\n* //true\n* console.log(_.isMatch(target,[{x:1}]))\n*\n* @param object\n* @param props 对比属性对象,如果是null,返回true\n* @returns 匹配所有props返回true\n* @since 0.17.0\n*/\nfunction isMatch(object, props) {\n\treturn isMatchWith(object, props, eq$1);\n}\n//#endregion\n//#region src/utils/matcher.ts\n/**\n* 创建一个函数,该函数接收一个对象为参数并返回对该对象使用props进行验证的的断言结果。\n*\n*\n* @example\n* const libs = [\n* {name:'func.js',platform:['web','nodejs'],tags:{utils:true},js:true},\n* {name:'juth2',platform:['web','java'],tags:{utils:false,middleware:true},js:false},\n* {name:'soya2d',platform:['web'],tags:{utils:true},js:false}\n* ];\n*\n* //[{func.js...}]\n* console.log(_.filter(libs,_.matcher({tags:{utils:true},js:true})))\n*\n* @param props 断言条件对象\n* @returns matcher(v)函数\n* @since 0.17.0\n*/\nfunction matcher(props) {\n\treturn (obj) => {\n\t\treturn isMatch(obj, props);\n\t};\n}\n//#endregion\n//#region src/utils/toPath.ts\nvar toPath_default = toPath;\n//#endregion\n//#region src/_iteratee.ts\nvar iterateeCache = /* @__PURE__ */ new WeakMap();\nvar primitiveCache = /* @__PURE__ */ new Map();\n/**\n* 创建一个函数,函数类型根据参数值类型而定。创建的函数常用于迭代回调,在Func.js内部被大量使用\n*\n* @example\n* const libs = [\n* {name:'func.js',platform:['web','nodejs'],tags:{utils:true},js:true},\n* {name:'juth2',platform:['web','java'],tags:{utils:false,middleware:true},js:false},\n* {name:'soya2d',platform:['web'],tags:{utils:true},js:false}\n* ];\n*\n* //[{func.js...}] 如果参数是object,返回_.matcher\n* console.log(_.filter(libs,_.iteratee({tags:{utils:true},js:true})))\n* //[func.js,juth2,soya2d] 如果参数是字符串,返回_.prop\n* console.log(_.map(libs,_.iteratee('name')))\n* //[true,false,true] 如果参数是数组,内容会转为path,并返回_.prop\n* console.log(_.map(libs,_.iteratee(['tags','utils'])))\n* //[1,3,5] 如果参数是函数,返回这个函数\n* console.log(_.filter([1,2,3,4,5],_.iteratee(n=>n%2)))\n* //[1,2,4,'a','1'] 无参返回_.identity\n* console.log(_.filter([0,1,false,2,4,undefined,'a','1','',null],_.iteratee()))\n*\n*\n* @param value 迭代模式\n* <br>当value是字符串类型时,返回_.prop\n* <br>当value是对象类型时,返回_.matcher\n* <br>当value是数组类型时,内容会转为path,并返回_.prop\n* <br>当value是函数时,返回这个函数\n* <br>当value未定义时,返回_.identity\n* <br>其他类型返回f() = false\n* @returns 不同类型的返回函数\n* @since 0.17.0\n*/\nfunction iteratee(value) {\n\tif (isUndefined(value)) return identity;\n\tif (isFunction(value)) return value;\n\tif (isString(value)) {\n\t\tconst cached = primitiveCache.get(value);\n\t\tif (cached) return cached;\n\t\tconst fn = prop(value);\n\t\tprimitiveCache.set(value, fn);\n\t\treturn fn;\n\t}\n\tif (isArray(value)) {\n\t\tconst key = value.join(\"\\0\");\n\t\tconst cached = primitiveCache.get(key);\n\t\tif (cached) return cached;\n\t\tconst fn = prop(toPath_default(value));\n\t\tprimitiveCache.set(key, fn);\n\t\treturn fn;\n\t}\n\tif (isObject(value)) {\n\t\tconst cached = iterateeCache.get(value);\n\t\tif (cached) return cached;\n\t\tconst fn = matcher(value);\n\t\titerateeCache.set(value, fn);\n\t\treturn fn;\n\t}\n\treturn () => false;\n}\n//#endregion\n//#region src/array/findIndex.ts\n/**\n* 对集合内的所有元素进行断言并返回第一个匹配的元素索引\n*\n* @example\n* //3 查询数组的索引\n* console.log(_.findIndex(['a','b','c',1,3,6],_.isNumber))\n* //0\n* console.log(_.findIndex([{a:1},{a:2},{a:3}],'a'))\n* //2\n* console.log(_.findIndex([{a:1},{a:2},{a:3}],{a:3}))\n*\n* @param array 数组,非数组返回-1\n* @param predicate (value[,index[,array]]);断言\n* <br>当断言是函数时回调参数见定义\n* <br>其他类型请参考 {@link utils!iteratee}\n* @param fromIndex 从0开始的起始索引,设置该参数可以减少实际遍历次数。默认0\n* @returns 第一个匹配断言的元素索引或-1\n*/\nfunction findIndex(array, predicate, fromIndex) {\n\tif (!Array.isArray(array)) return -1;\n\tlet rs = -1;\n\tlet fromIndexNum = fromIndex || 0;\n\tconst itee = iteratee(predicate);\n\tfor (let i = fromIndexNum; i < array.length; i++) {\n\t\tconst v = array[i];\n\t\tif (itee(v, i, array)) {\n\t\t\trs = i + fromIndexNum;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/collection/size.ts\n/**\n* 获取集合对象的内容数量,对于map/object对象获取的是键/值对的数量\n*\n* @example\n* //3\n* console.log(_.size({a:1,b:2,c:{x:1}}))\n* //0\n* console.log(_.size(null))\n* //3\n* console.log(_.size(new Set([1,2,3])))\n* //2\n* console.log(_.size([1,[2,[3]]]))\n* //2\n* console.log(_.size(document.body.children))\n* //4\n* console.log(_.size(document.body.childNodes))\n* //3 arguments已不推荐使用,请使用Rest参数\n* console.log((function(){return _.size(arguments)})('a',2,'b'))\n* //7\n* console.log(_.size('func.js'))\n*\n* @param collection\n* @returns 集合长度,对于null/undefined/WeakMap/WeakSet返回0\n*/\nfunction size(collection) {\n\tif (isNil(collection)) return 0;\n\tif (collection.length) return collection.length;\n\tif (isMap(collection) || isSet(collection)) return collection.size;\n\tif (isObject(collection)) return Object.keys(collection).length;\n\treturn 0;\n}\n//#endregion\n//#region src/array/findLastIndex.ts\n/**\n* 对集合内的所有元素进行断言并返回最后一个匹配的元素索引\n*\n* @example\n* //5 查询数组的索引\n* console.log(_.findLastIndex(['a','b','c',1,3,6],_.isNumber))\n* //2\n* console.log(_.findLastIndex([{a:1},{a:2},{a:3}],'a'))\n*\n* @param array 数组,非数组返回-1\n* @param predicate (value[,index[,array]]);断言\n* <br>当断言是函数时回调参数见定义\n* <br>其他类型请参考 {@link utils!iteratee}\n* @param fromIndex 从集合长度-1开始的起始索引。设置该参数可以减少实际遍历次数\n* @returns 最后一个匹配断言的元素索引或-1\n* @since 0.19.0\n*/\nfunction findLastIndex(array, predicate, fromIndex) {\n\tif (!Array.isArray(array)) return -1;\n\tlet rs = -1;\n\tlet fromIndexNum = fromIndex ?? size(array) - 1;\n\tconst itee = iteratee(predicate);\n\tfor (let i = fromIndexNum; i >= 0; i--) {\n\t\tconst v = array[i];\n\t\tif (itee(v, i, array)) {\n\t\t\trs = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/array/flat.ts\nvar MAX_DEPTH$2 = 100;\n/**\n* 按照指定的嵌套深度递归遍历数组,并将所有元素与子数组中的元素合并为一个新数组返回\n*\n* @example\n* //[1,2,3,4,5]\n* console.log(_.flat([1,[2,3],[4,5]]))\n* //[1,2,3,4,5,[6,7]]\n* console.log(_.flat([1,[2,3],[4,5,[6,7]]]))\n* //[1,2,3,[4]]\n* console.log(_.flat([1,[2,[3,[4]]]],2))\n* //[1,2,1,3,4]\n* console.log(_.flat(new Set([1,1,[2,[1,[3,4]]]]),Infinity))\n*\n* @param array 数组\n* @param depth 嵌套深度\n* @returns 扁平化后的新数组\n*/\nfunction flat(array, depth = 1) {\n\tif (array == null) return [];\n\tif (depth < 1) return Array.from(array);\n\tconst safeDepth = Math.min(depth, MAX_DEPTH$2);\n\tconst result = [];\n\tconst stack = [];\n\tconst inputArr = Array.from(array);\n\tfor (let i = inputArr.length - 1; i >= 0; i--) stack.push({\n\t\tval: inputArr[i],\n\t\tdepth: safeDepth\n\t});\n\twhile (stack.length > 0) {\n\t\tconst { val, depth: currentDepth } = stack.pop();\n\t\tif (Array.isArray(val)) {\n\t\t\tif (currentDepth > 0) for (let i = val.length - 1; i >= 0; i--) stack.push({\n\t\t\t\tval: val[i],\n\t\t\t\tdepth: currentDepth - 1\n\t\t\t});\n\t\t\telse result.push(val);\n\t\t} else if (isSet(val)) {\n\t\t\tif (currentDepth > 0) {\n\t\t\t\tconst childArr = Array.from(val);\n\t\t\t\tfor (let i = childArr.length - 1; i >= 0; i--) stack.push({\n\t\t\t\t\tval: childArr[i],\n\t\t\t\t\tdepth: currentDepth - 1\n\t\t\t\t});\n\t\t\t} else result.push(val);\n\t\t} else result.push(val);\n\t}\n\treturn result;\n}\n//#endregion\n//#region src/array/flatDeep.ts\n/**\n* 无限深度遍历数组,并将所有元素与子数组中的元素合并为一个新数组返回\n*\n* @example\n* //[1,2,1,3,4]\n* console.log(_.flatDeep(new Set([1,1,[2,[1,[3,4]]]])))\n* //[1,2,3,4]\n* console.log(_.flatDeep([1,[2,[3,[4]]]]))\n*\n* @param array 数组\n* @returns 扁平化后的新数组\n*/\nfunction flatDeep(array) {\n\treturn flat(array, Infinity);\n}\n//#endregion\n//#region src/is/isNumber.ts\n/**\n* 判断参数是否为数字类型值\n*\n* @example\n* //true\n* console.log(_.isNumber(1))\n* //true\n* console.log(_.isNumber(Number.MAX_VALUE))\n* //false\n* console.log(_.isNumber('1'))\n*\n* @param v\n* @returns\n*/\nfunction isNumber(v) {\n\treturn v instanceof Number || Object.prototype.toString.call(v) === \"[object Number]\";\n}\n//#endregion\n//#region src/array/insert.ts\n/**\n* 向数组中指定位置插入一个或多个元素并返回\n* \n* @effect 修改原数组\n*\n* @example\n* //[1, 2, Array(1), 'a', 3, 4]\n* let ary = [1,2,3,4];\n* _.insert(ary,2,[1],'a');\n* console.log(ary);\n* //[1, 2, 3, 4]\n* ary = [3,4];\n* _.insert(ary,0,1,2);\n* console.log(ary);\n* //func.js\n* console.log(_.insert('funcjs',4,'.').join(''));\n*\n* @param array 数组对象。如果非数组类型会自动转为数组\n* @param index 插入位置索引,0 - 列表长度\n* @param values 1-n个需要插入列表的值\n* @returns 插入值后的数组对象\n*/\nfunction insert(array, index, ...values) {\n\tconst rs = isArray(array) ? array : toArray(array);\n\tif (!isNumber(index) || index < 0) index = 0;\n\trs.splice(index, 0, ...values);\n\treturn rs;\n}\n//#endregion\n//#region src/array/intersect.ts\n/**\n* 对所有集合做交集并返回交集元素组成的新数组\n* <p>\n* 关于算法性能可以查看文章<a href=\"https://www.jianshu.com/p/aa131d573575\" target=\"_holyhigh\">《如何实现高性能集合操作(intersect)》</a>\n* </p>\n*\n* @example\n* //[2]\n* console.log(_.intersect([1,2,3],[2,3],[1,2]))\n* //[3]\n* console.log(_.intersect([1,1,2,2,3],[1,2,3,4,4,4],[3,3,3,3,3,3]))\n* //[{name: \"a\"}] 最后一个参数是函数时作为标识函数\n* console.log(_.intersect([{name:'a'},{name:'b'}],[{name:'a'}],v=>v.name))\n* //[]\n* console.log(_.intersect())\n* //[3] 第三个参数被忽略,然后求交集\n* console.log(_.intersect([1,2,3],[3],undefined))\n* //[1] \"2\"和2不相同,3和\"3\"不相同\n* console.log(_.intersect([1,2,3],[1,'2',3],[2,'3',1]))\n*\n* @param params (...arrays[,identifier(v)]) \n* arrays - 1-n个数组或arraylike对象,非arraylike参数会被忽略; \n* identifier - 标识函数,用来对每个元素返回唯一标识,标识相同的值会认为相等。使用<a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Same-value-zero_equality\">SameValueZero</a> 算法进行值比较。如果为空,直接使用值自身比较\n* @returns 交集元素组成的新数组\n*/\nfunction intersect(...params) {\n\tlet comparator;\n\tlet list = params;\n\tconst sl = params.length;\n\tif (sl > 2) {\n\t\tconst lp = params[sl - 1];\n\t\tif (isFunction(lp)) {\n\t\t\tcomparator = lp;\n\t\t\tlist = params.slice(0, sl - 1);\n\t\t}\n\t}\n\tlist = list.filter((v) => isArrayLike(v) || isArray(v));\n\tif (list.length < 1) return list;\n\tconst len = list.length;\n\tlist.sort((a, b) => a.length - b.length);\n\tconst kvMap = /* @__PURE__ */ new Map();\n\tlet idLength = 0;\n\tfor (let i = list[0].length; i--;) {\n\t\tconst v = list[0][i];\n\t\tconst id = comparator ? comparator(v) : v;\n\t\tif (!kvMap.get(id)) {\n\t\t\tkvMap.set(id, {\n\t\t\t\ti: 1,\n\t\t\t\tv\n\t\t\t});\n\t\t\tidLength++;\n\t\t}\n\t}\n\tfor (let j = 1; j < len; j++) {\n\t\tconst ary = list[j];\n\t\tconst localMap = /* @__PURE__ */ new Map();\n\t\tlet localMatchedCount = 0;\n\t\tfor (let i = 0; i < ary.length; i++) {\n\t\t\tconst v = ary[i];\n\t\t\tconst id = comparator ? comparator(v) : v;\n\t\t\tconst entry = kvMap.get(id);\n\t\t\tif (entry && !localMap.get(id)) {\n\t\t\t\tentry.i++;\n\t\t\t\tlocalMap.set(id, true);\n\t\t\t\tlocalMatchedCount++;\n\t\t\t\tif (localMatchedCount === idLength) break;\n\t\t\t}\n\t\t}\n\t}\n\tconst rs = [];\n\tkvMap.forEach((entry) => {\n\t\tif (entry.i === len) rs.push(entry.v);\n\t});\n\treturn rs;\n}\n//#endregion\n//#region src/array/join.ts\n/**\n* 把arrayLike中所有元素连接成字符串并返回。对于基本类型元素会直接转为字符值,对象类型会调用toString()方法\n*\n* @example\n* //'1/2/3/4'\n* console.log(_.join([1, 2, 3, 4], '/'))\n* //'1,2,3,4'\n* console.log(_.join([1, 2, 3, 4]))\n*\n* @param array 数组,非数组返回空字符串\n* @param separator 分隔符\n* @returns 拼接字符串\n*/\nfunction join(array, separator = \",\") {\n\tif (!Array.isArray(array)) return \"\";\n\treturn array.join(separator ?? \",\");\n}\n//#endregion\n//#region src/number/toNumber.ts\n/**\n* 转换任何对象为数字类型\n*\n* @example\n* //NaN\n* console.log(_.toNumber(null))\n* //1\n* console.log(_.toNumber('1'))\n* //NaN\n* console.log(_.toNumber([3,6,9]))\n* //-0\n* console.log(_.toNumber(-0))\n* //NaN\n* console.log(_.toNumber(NaN))\n* //NaN\n* console.log(_.toNumber('123a'))\n*\n* @param v 任何值\n* @returns 对于null/undefined会返回NaN\n*/\nfunction toNumber(v) {\n\tif (v === void 0 || v === null) return NaN;\n\treturn Number(v);\n}\n//#endregion\n//#region src/array/pop.ts\n/**\n* 删除数组末尾或指定索引的一个元素并返回被删除的元素\n* \n* @effect 修改原数组\n* @example\n* //3, [1, 2]\n* let ary = [1,2,3];\n* console.log(_.pop(ary),ary)\n* //{a: 1}, [{\"a\":2},{\"a\":3}]\n* ary = [{a:1},{a:2},{a:3}];\n* console.log(_.pop(ary,0),ary)\n*\n* @param array 数组对象。如果非数组类型会直接返回null\n* @param index 要删除元素的索引。默认删除最后一个元素\n* @returns 被删除的值或null\n*/\nfunction pop(array, index = -1) {\n\tindex = index ?? -1;\n\tlet rs = null;\n\tif (Array.isArray(array)) {\n\t\tconst i = toNumber(index);\n\t\tif (i > -1) {\n\t\t\trs = array.splice(i, 1);\n\t\t\tif (rs.length < 1) rs = null;\n\t\t\telse rs = rs[0];\n\t\t} else rs = array.pop() ?? null;\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/array/slice.ts\n/**\n* 对数组进行切片,并返回切片后的新数组,原数组不变。新数组内容是对原数组内容的浅拷贝\n*\n* @example\n* //[2,3,4]\n* console.log(_.slice([1,2,3,4,5],1,4))\n* //[2,3,4,5]\n* console.log(_.slice([1,2,3,4,5],1))\n*\n*\n* @param array 数组,非数组返回空数组\n* @param begin 切片起始下标,包含下标位置元素,默认0\n* @param end 切片结束下标,<b>不包含</b>下标位置元素\n* @returns 切片元素组成的新数组\n*/\nfunction slice(array, begin = 0, end) {\n\tif (!Array.isArray(array)) return [];\n\treturn array.slice(begin || 0, end);\n}\n//#endregion\n//#region src/collection/includes.ts\n/**\n* 判断集合中是否包含给定的值。使用<code>eq</code>函数进行等值判断。\n*\n* @example\n* //true\n* console.log(_.includes({a:1,b:2},2))\n* //false\n* console.log(_.includes([1,3,5,7,[2]],2))\n* //true\n* console.log(_.includes([1,3,5,7,[2]],3))\n* //false\n* console.log(_.includes([1,3,5,7,[2]],3,2))\n* //true\n* console.log(_.includes([0,null,undefined,NaN],NaN))\n* //true\n* console.log(_.includes('abcdefg','abc'))\n* //false\n* console.log(_.includes('abcdefg','abc',2))\n* //false\n* console.log(_.includes('aBcDeFg','abc'))\n*\n* @param collection 如果集合是map/object对象,则只对value进行比对\n* @param value\n* @param fromIndex 从集合的fromIndex 索引处开始查找。如果集合是map/object对象,无效\n* @returns 如果包含返回true否则返回false\n*/\nfunction includes(collection, value, fromIndex = 0) {\n\tlet rs = false;\n\tfromIndex = fromIndex || 0;\n\tif (isString(collection)) return collection.includes(value, fromIndex);\n\tif (isArrayLike(collection) && fromIndex > 0) collection = Array.isArray(collection) ? collection.slice(fromIndex) : slice(toArray(collection), fromIndex);\n\teach(collection, (v) => {\n\t\tif (eq$1(v, value)) {\n\t\t\trs = true;\n\t\t\treturn false;\n\t\t}\n\t});\n\treturn rs;\n}\n//#endregion\n//#region src/array/remove.ts\n/**\n* 删除数组中断言结果为true的元素并返回被删除的元素\n* @effect 修改原数组\n* @example\n* //[1, 3] [2, 4]\n* let ary = [1,2,3,4];\n* console.log(_.remove(ary,x=>x%2),ary)\n* //[2] [1,3]\n* ary = [{a:1},{a:2},{a:3}];\n* console.log(_.remove(ary,v=>v.a===2),ary)\n* //[3] [1,2]\n* ary = [{a:1},{a:2},{a:3}];\n* console.log(_.remove(ary,{a:3}),ary)\n*\n* @param array 数组对象,如果参数非数组直接返回\n* @param predicate (value[,index[,array]]);断言\n* <br>当断言是函数时回调参数见定义\n* <br>其他类型请参考 {@link utils!iteratee}\n* @returns 被删除的元素数组或空数组\n* @since 0.19.0\n*/\nfunction remove(array, predicate) {\n\tconst rs = [];\n\tif (!isArray(array)) return rs;\n\tconst itee = iteratee(predicate);\n\tlet i = 0;\n\tfor (let l = 0; l < array.length; l++) {\n\t\tconst item = array[l];\n\t\tif (itee(item, l, array)) rs.push(item);\n\t\telse array[i++] = item;\n\t}\n\tarray.length = i;\n\treturn rs;\n}\n//#endregion\n//#region src/array/pull.ts\n/**\n* 与without相同,但会修改原数组\n* @effect 修改原数组\n* @example\n* //[1, 1] true\n* let ary = [1,2,3,4,3,2,1];\n* let newAry = _.pull(ary,2,3,4)\n* console.log(newAry,ary === newAry)\n*\n* @param array 数组对象\n* @param values 需要删除的值\n* @returns 新数组\n* @since 0.19.0\n*/\nfunction pull(array, ...values) {\n\tremove(array, (item) => includes(values, item));\n\treturn array;\n}\n//#endregion\n//#region src/array/range.ts\n/**\n* 生成一个由(包含)start到(不包含)end的数字元素组成的数组。\n* 根据参数个数不同,分为三种签名\n* <pre><code class=\"language-javascript\">\n* _.range(end);\n* _.range(start,end);\n* _.range(start,end,step);\n* </code></pre>\n*\n* @example\n* //[0, 1, 2, 3, 4]\n* console.log(_.range(5))\n* //[0, -1, -2, -3, -4]\n* console.log(_.range(-5))\n* //[0, -0.5, -1, -1.5, -2, -2.5, -3, -3.5, -4, -4.5]\n* console.log(_.range(0,-5,0.5))\n* //[-5, -4, -3, -2, -1, 0]\n* console.log(_.range(-5,1))\n*\n* @param start 起始数\n* @param end 结束数\n* @param step 步长\n* @returns 数字数组\n*/\nfunction range(start = 0, end, step = 1) {\n\tlet startNum = 0;\n\tlet endNum;\n\tlet stepNum = 1;\n\tif (isUndefined(end)) endNum = start;\n\telse {\n\t\tstartNum = start;\n\t\tendNum = end;\n\t\tstepNum = Math.abs(step) || 1;\n\t}\n\tconst maxCount = Math.ceil(Math.abs(endNum - startNum) / stepNum);\n\tconst rs = [];\n\tif (endNum > startNum) for (let i = startNum; rs.length < maxCount && i < endNum; i += stepNum) rs.push(i);\n\telse if (endNum < startNum) for (let i = startNum; rs.length < maxCount && i > endNum; i -= stepNum) rs.push(i);\n\treturn rs;\n}\n//#endregion\n//#region src/array/reverse.ts\n/**\n* 对数组元素位置进行颠倒,返回改变后的数组。\n*\n* @example\n* //[3, 2, 1]\n* console.log(_.reverse([1, 2, 3]))\n*\n* @param array 数组,类数组或Set\n* @returns 颠倒后的新数组\n*/\nfunction reverse(array) {\n\treturn toArray(array).reverse();\n}\n//#endregion\n//#region src/array/sortedIndexBy.ts\n/**\n* 同<code>sortedIndex</code>,但支持自定义回调用来获取对比值\n* @example\n* //2\n* console.log(_.sortedIndexBy([{a:1},{a:2},{a:3}], {a:2.5},'a'))\n*\n* @param array 对象属性标识符数组\n* @param value 需要插入数组的值\n* @param itee (value)回调函数,返回排序对比值。默认 identity\n* @returns array索引\n* @since 1.0.0\n*/\nfunction sortedIndexBy(array, value, itee) {\n\tlet left = 0;\n\tlet right = size(array);\n\tlet index = 0;\n\tconst cb = iteratee(itee || identity);\n\tvalue = cb(value);\n\twhile (left < right) {\n\t\tconst mid = parseInt((left + right) / 2 + \"\");\n\t\tif (cb(array[mid]) < value) {\n\t\t\tleft = mid + 1;\n\t\t\tindex = left;\n\t\t} else right = mid;\n\t}\n\treturn index;\n}\n//#endregion\n//#region src/array/sortedIndex.ts\n/**\n* 使用二分法确定在array保持排序不变的情况下,value可以插入array的最小索引\n* @example\n* //1\n* console.log(_.sortedIndex([1,2,3],1.5))\n* //1\n* console.log(_.sortedIndex(['a', 'c'], 'b'))\n* //0\n* console.log(_.sortedIndex([{a:1},{a:2},{a:3}], {a:2.5}))\n*\n* @param array 对象属性标识符数组\n* @param value 需要插入数组的值\n* @returns array索引\n* @since 1.0.0\n*/\nfunction sortedIndex(array, value) {\n\treturn sortedIndexBy(array, value);\n}\n//#endregion\n//#region src/collection/map.ts\n/**\n* 返回一个新数组,该数组中的每个元素是调用一次callback函数后的返回值\n*\n* @example\n* const libs = [\n* {name:'func.js',platform:['web','nodejs'],tags:{utils:true},js:false},\n* {name:'juth2',platform:['web','java'],tags:{utils:false,middleware:true},js:true},\n* {name:'soya2d',platform:['web'],tags:{utils:true},js:true}\n* ];\n*\n* //[2,4,6]\n* console.log(_.map(new Set([1,2,3]),v => v*2))\n* //[1,2,3]\n* console.log(_.map({'1':'a','2':'b','3':'c'},(v,k)=>k))\n* //[true,false,false]\n* console.log(_.map([1,{a:1},[2,3]],v => _.isNumber(v)))\n* //[\"H\", \"O\", \"L\", \"Y\", \"H\", \"I\", \"G\", \"H\"]\n* console.log(_.map('holyhigh',v => String.fromCharCode(v.charCodeAt(0)-32)))\n* //[true,false,true]\n* console.log(_.map(libs,'tags.utils'))\n* //[\"func.js\", \"juth2\", \"soya2d\"]\n* console.log(_.map(libs,'name'))\n* //[1,2,3]\n* console.log(_.map({a:1,b:2,c:3}))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param iteratee (value[,index|key[,collection]]) 回调函数,返回值作为新数组元素。\n* 如果是字符串,表示返回集中的对象类型的元素的key值\n* @returns 映射值的新数组\n*/\nfunction map(collection, iteratee$4 = identity) {\n\tconst rs = [];\n\tconst cb = iteratee(iteratee$4);\n\teach(collection, (v, k, c) => {\n\t\tconst r = cb(v, k, c);\n\t\trs.push(r);\n\t});\n\treturn rs;\n}\n//#endregion\n//#region src/array/union.ts\n/**\n* 对所有集合做并集并返回并集元素组成的新数组。并集类似concat()但不允许重复值\n*\n* @example\n* //[1, 2, 3]\n* console.log(_.union([1,2,3],[2,3]))\n* //[1, 2, 3, \"1\", \"2\"]\n* console.log(_.union([1,2,3],['1','2']))\n* //[{name: \"a\"},{name: \"b\"}]\n* console.log(_.union([{name:'a'},{name:'b'}],[{name:'a'}],v=>v.name))\n* //[a/b/a] 没有标识函数无法去重\n* console.log(_.union([{name:'a'},{name:'b'}],[{name:'a'}]))\n* //[1, 2, 3, \"3\"] \"3\"和3不相等\n* console.log(_.union([1,2,3],[1,3],[2,'3',1]))\n*\n* @param params (...arrays[,identifier(v)]) \n* arrays - 1-n个数组或arraylike对象,非arraylike参数会被忽略; \n* identifier - 标识函数,用来对每个元素返回唯一标识,标识相同的值会认为相等。使用<a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Same-value-zero_equality\">SameValueZero</a> 算法进行值比较。如果为空,直接使用值自身比较\n* @returns 并集元素组成的新数组\n*/\nfunction union(...params) {\n\tlet comparator;\n\tlet list = params;\n\tconst sl = params.length;\n\tif (sl > 2 && isFunction(params[sl - 1])) {\n\t\tcomparator = params[sl - 1];\n\t\tlist = params.slice(0, sl - 1);\n\t}\n\tlist = list.filter((v) => isArrayLike(v) || isArray(v) || isSet(v));\n\tif (list.length < 1) return list;\n\tlet rs;\n\tif (comparator) {\n\t\tconst kvMap = /* @__PURE__ */ new Map();\n\t\tflat(list).forEach((v) => {\n\t\t\tconst id = comparator(v);\n\t\t\tif (!kvMap.get(id)) kvMap.set(id, v);\n\t\t});\n\t\trs = map(kvMap, (v) => v);\n\t} else rs = Array.from(new Set(flat(list)));\n\treturn rs;\n}\n//#endregion\n//#region src/array/uniq.ts\n/**\n* 对数组内的值进行去重\n* @example\n* // [1,2,4,\"a\",\"1\",null]\n* console.log(_.unique([1,2,2,4,4,'a','1','a',null,null]))\n*\n* @param array 数组,非数组返回空数组\n* @returns 转换后的新数组对象\n*/\nfunction uniq(array) {\n\tif (!Array.isArray(array)) return [];\n\treturn Array.from(new Set(array));\n}\n//#endregion\n//#region src/array/uniqBy.ts\n/**\n* 同<code>uniq</code>,但支持自定义筛选函数\n* @example\n* // [{\"a\":1},{\"a\":\"1\"},{\"a\":2},{\"a\":\"2\"}]\n* console.log(_.uniqBy([{a:1},{a:1},{a:'1'},{a:2},{a:'2'},{a:2}],'a'))\n* // [{\"a\":1},{\"a\":2}]\n* console.log(_.uniqBy([{a:1},{a:1},{a:'1'},{a:2},{a:'2'},{a:2}],v=>v.a>>0))\n*\n* @param array 数组\n* @param itee (value,index) 筛选函数,返回需要对比的值。默认identity\n* <br>当iteratee是函数时回调参数见定义\n* <br>其他类型请参考 {@link utils.iteratee}\n* @returns 去重后的新数组对象\n* @since 1.0.0\n*/\nfunction uniqBy(array, itee) {\n\tconst cb = iteratee(itee || identity);\n\tconst keyMap = /* @__PURE__ */ new Map();\n\tconst rs = [];\n\teach(array, (v, k) => {\n\t\tconst key = cb(v, k);\n\t\tif (keyMap.get(key)) return;\n\t\tkeyMap.set(key, 1);\n\t\trs.push(v);\n\t});\n\treturn rs;\n}\n//#endregion\n//#region src/array/unzip.ts\n/**\n* <code>zip</code>的反操作\n* @example\n* //[[1,2,undefined],['a','b','c']]\n* console.log(_.unzip([[1, 'a'],[2, 'b'],[undefined, 'c']]))\n* //[['a', 'b', 'c'], [1, 2, undefined],['1', undefined,undefined]]\n* console.log(_.unzip([['a', 1, '1'], ['b', 2],['c']]))\n*\n* @param array 包含若干分组的数组\n* @returns 重新分组后的新数组\n* @since 0.23.0\n*/\nfunction unzip(array) {\n\tconst rs = [];\n\tconst len = size(array);\n\teach(array, (group, colIndex) => {\n\t\teach(group, (el, rowIndex) => {\n\t\t\tlet row = rs[rowIndex];\n\t\t\tif (!row) row = rs[rowIndex] = new Array(len);\n\t\t\trow[colIndex] = el;\n\t\t});\n\t});\n\treturn rs;\n}\n//#endregion\n//#region src/collection/filter.ts\n/**\n* 返回一个新数组,数组内容由集合内所有断言结果为真的元素组成\n*\n* @example\n* const libs = [\n* {name:'func.js',platform:['web','nodejs'],tags:{utils:true},js:false},\n* {name:'juth2',platform:['web','java'],tags:{utils:false,middleware:true},js:true},\n* {name:'soya2d',platform:['web'],tags:{utils:true},js:true}\n* ];\n*\n* //[]\n* console.log(_.filter())\n* //[1,3]\n* console.log(_.filter([1,2,3,4],v=>v%2===1))\n* //[1]\n* console.log(_.filter(['a','b','c',1],_.isNumber))\n* //[1,2]\n* console.log(_.filter({a:1,b:2,c:'3'},_.isNumber))\n* //[f、s]\n* console.log(_.filter(libs,'tags.utils'))\n* //[j、s]\n* console.log(_.filter(libs,{js:true}))\n* //[] key不支持路径解析\n* console.log(_.filter(libs,{'platform[0]':'web'}))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param predicate (value[,index|key[,collection]]) 断言\n* <br>当断言是函数时回调参数见定义\n* <br>其他类型请参考 {@link utils!iteratee}\n* @returns 由通过断言的元素组成的新数组\n*/\nfunction filter(collection, predicate) {\n\tconst rs = [];\n\tconst callback = iteratee(predicate);\n\teach(collection, (v, k, c) => {\n\t\tif (callback(v, k, c)) rs.push(v);\n\t});\n\treturn rs;\n}\n//#endregion\n//#region src/array/without.ts\n/**\n* 返回删除所有values后的新数组。使用<code>eq</code>函数进行等值判断\n*\n* @example\n* //[1, 1]\n* console.log(_.without([1,2,3,4,3,2,1],2,3,4))\n*\n* @param array 数组对象\n* @param values 需要删除的值\n* @returns 新数组\n* @since 0.19.0\n*/\nfunction without(array, ...values) {\n\treturn filter(array, (item) => !includes(values, item));\n}\n//#endregion\n//#region src/array/zip.ts\n/**\n* 创建一个由指定数组arrays内元素重新分组后组成的二维数组,\n* 第一个子数组由每个数组内的第一个元素组成,第二个子数组由每个数组内的第二个元素组成,以此类推。\n* 子数组的数量由参数中数组内元素最多的数组决定。\n* @example\n* //[[1, 'a'],[2, 'b'],[undefined, 'c']]\n* console.log(_.zip([1,2],['a','b','c']))\n* //[['a', 1, '1'], ['b', 2, undefined],['c', undefined,undefined]]\n* console.log(_.zip(['a','b','c'],[1,2],['1']))\n*\n* @param arrays 1-n个数组\n* @returns 重新分组后的新数组\n* @since 0.23.0\n*/\nfunction zip(...arrays) {\n\tconst rs = [];\n\tconst size = arrays.length;\n\tarrays.forEach((ary, colIndex) => {\n\t\teach(ary, (el, i) => {\n\t\t\tlet group = rs[i];\n\t\t\tif (!group) group = rs[i] = new Array(size);\n\t\t\tgroup[colIndex] = el;\n\t\t});\n\t});\n\treturn rs;\n}\n//#endregion\n//#region src/array/zipObject.ts\n/**\n* 创建一个对象,属性名称与属性值分别来自两个数组\n* @example\n* //{a: 1, b: 2}\n* console.log(_.zipObject(['a','b'],[1,2,3]))\n*\n* @param keys 对象属性标识符数组\n* @param values 对象值数组\n* @returns 组合后的对象\n* @since 0.23.0\n*/\nfunction zipObject(keys, values) {\n\tconst rs = {};\n\teach(keys, (k, i) => {\n\t\trs[k] = get(values, i);\n\t});\n\treturn rs;\n}\n//#endregion\n//#region src/array/zipWith.ts\n/**\n* 与<code>zip</code>相同,但支持自定义组合逻辑\n* @example\n* //[[1, 3, 5], [2, 4, 6]]\n* console.log(_.zipWith([1,2],[3,4],[5,6]))\n* //[9, 12]\n* console.log(_.zipWith([1,2],[3,4],[5,6],_.sum))\n* //[3, 4]\n* console.log(_.zipWith([1,2],[3,4],[5,6],group=>_.avg(group)))\n*\n* @param params (...arrays[,iteratee(group)]) \n* arrays - 1-n个数组或arraylike对象,非arraylike参数会被忽略; \n* iteratee - 回调函数,返回组合后的分组值。默认使用<code>identity</code>函数\n* \n* @returns 重新分组后的新数组\n* @since 1.0.0\n*/\nfunction zipWith(...params) {\n\tlet itee = params[params.length - 1];\n\tconst arys = params;\n\tif (!isFunction(itee)) itee = identity;\n\telse pop(arys);\n\treturn map(zip(...arys), (group) => itee(group));\n}\n//#endregion\n//#region src/collection/countBy.ts\n/**\n* 创建一个统计对象,对象的key是iteratee返回的值,对应的值是相同key出现的次数\n* @example\n* //{true: 5, false: 4}\n* console.log(_.countBy([1,'a',3,'b',5,'c',7,'d',9],_.isNumber))\n* const users = [\n* {name:'zhangsan',sex:'m',age:33},\n* {name:'lisi',sex:'f',age:21},\n* {name:'wangwu',sex:'m',age:25},\n* {name:'zhaoliu',sex:'m',age:44},\n* ]\n* //{m: 3, f: 1} 性别分布统计\n* console.log(_.countBy(users,u=>u.sex))\n* //{20: 2, 30: 1, 40: 1} 年龄段分布统计\n* console.log(_.countBy(users,u=>(u.age/10>>0)*10))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param iteratee (value) 回调函数,返回统计key\n* @returns 统计对象\n* @since 1.0.0\n*/\nfunction countBy(collection, itee = identity) {\n\tconst stat = {};\n\tconst cb = iteratee(itee || identity);\n\teach(collection, (el) => {\n\t\tconst key = cb(el);\n\t\tif (stat[key] === void 0) stat[key] = 0;\n\t\tstat[key]++;\n\t});\n\treturn stat;\n}\n//#endregion\n//#region src/collection/eachRight.ts\n/**\n* 对集合元素进行顺序遍历,与 forEach 不同在于遍历顺序是从右到左\n* 注意,object类型无法保证遍历顺序\n*\n* @example\n* //3、2、1\n* _.eachRight(new Set([1,2,3]),console.log)\n* //c、b、a\n* _.eachRight({'1':'a','2':'b','3':'c'},console.log)\n* //[2,3]、{\"a\":1}、1\n* _.eachRight([1,{a:1},[2,3]],console.log)\n* //hgihyloh\n* _.eachRight('holyhigh',console.log)\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param callback (value[,index|key[,collection]]);回调函数,如果返回false会立即中断遍历\n*/\nfunction eachRight(collection, callback) {\n\tlet values;\n\tlet keys;\n\tif (isString(collection) || isArrayLike(collection)) {\n\t\tlet size = collection.length;\n\t\twhile (size--) if (callback(collection[size], size, collection, size) === false) return;\n\t} else if (isSet(collection)) {\n\t\tlet size = collection.size;\n\t\tvalues = Array.from(collection);\n\t\twhile (size--) if (callback(values[size], size, collection, size) === false) return;\n\t} else if (isMap(collection)) {\n\t\tlet size = collection.size;\n\t\tkeys = collection.keys();\n\t\tvalues = collection.values();\n\t\tkeys = Array.from(keys);\n\t\tvalues = Array.from(values);\n\t\twhile (size--) if (callback(values[size], keys[size], collection, size) === false) return;\n\t} else if (isObject(collection)) {\n\t\tkeys = Object.keys(collection);\n\t\tlet size = keys.length;\n\t\twhile (size--) {\n\t\t\tconst k = keys[size];\n\t\t\tif (callback(collection[k], k, collection, size) === false) return;\n\t\t}\n\t}\n}\n//#endregion\n//#region src/collection/every.ts\n/**\n* 对集合内的所有元素进行断言,直到第一个返回false的元素结束。如果所有元素断言都为真返回true\n*\n* @example\n* const libs = [\n* {name:'func.js',platform:['web','nodejs'],tags:{utils:true},js:true},\n* {name:'juth2',platform:['web','java'],tags:{utils:false,middleware:true},js:false},\n* {name:'soya2d',platform:['web'],tags:{utils:true},js:true}\n* ];\n*\n* //true\n* console.log(_.every([]))\n* //true\n* console.log(_.every([1,3,5],v=>v%2===1))\n* //false\n* console.log(_.every(['a','b','c',1],_.isNumber))\n* //false\n* console.log(_.every(libs,'tags.utils'))\n* //false\n* console.log(_.every(libs,{js:true}))\n* //false key不支持路径解析\n* console.log(_.every(libs,{'platform[0]':'web'}))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param predicate (value[,index|key[,collection]]) 断言\n* <br>当断言是函数时回调参数见定义\n* <br>其他类型请参考 {@link utils!iteratee}\n* @returns 全部通过返回true,否则false。对于一个空集合,会返回true\n*/\nfunction every(collection, predicate) {\n\tlet rs = true;\n\tconst callback = iteratee(predicate);\n\teach(collection, (v, k, c) => {\n\t\tif (!callback(v, k, c)) {\n\t\t\trs = false;\n\t\t\treturn false;\n\t\t}\n\t});\n\treturn rs;\n}\n//#endregion\n//#region src/collection/find.ts\n/**\n* 对集合内的所有元素进行断言并返回第一个匹配的元素\n*\n* @example\n* const libs = [\n* {name:'func.js',platform:['web','nodejs'],tags:{utils:true},js:false},\n* {name:'juth2',platform:['web','java'],tags:{utils:false,middleware:true},js:true},\n* {name:'soya2d',platform:['web'],tags:{utils:true},js:true}\n* ];\n*\n* //1\n* console.log(_.find(['a','b','c',1,3,6],_.isNumber))\n* //holyhigh\n* console.log(_.find({a:1,b:true,c:'holyhigh',d:'func.js'},_.isString))\n* //{f}\n* console.log(_.find(libs,'tags.utils'))\n* //{j}\n* console.log(_.find(libs,{js:true}))\n* //undefined key不支持路径解析\n* console.log(_.find(libs,{'tags.utils':false}))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param predicate (value[,index|key[,collection]]) 断言\n* <br>当断言是函数时回调参数见定义\n* <br>其他类型请参考 {@link utils!iteratee}\n* @returns 第一个匹配断言的元素或undefined\n*/\nfunction find(collection, predicate) {\n\tconst callback = iteratee(predicate);\n\tlet rs;\n\teach(collection, (v, k, c) => {\n\t\tif (callback(v, k, c)) {\n\t\t\trs = v;\n\t\t\treturn false;\n\t\t}\n\t});\n\treturn rs;\n}\n//#endregion\n//#region src/collection/findLast.ts\n/**\n* 对集合内的所有元素进行断言并返回最后一个匹配的元素\n*\n* @example\n* const libs = [\n* {name:'func.js',platform:['web','nodejs'],tags:{utils:false},js:false},\n* {name:'juth2',platform:['web','java'],tags:{utils:false,middleware:true},js:true},\n* {name:'soya2d',platform:['web'],tags:{utils:true},js:true}\n* ];\n*\n* //6\n* console.log(_.findLast(['a','b','c',1,3,6],_.isNumber))\n* //func.js\n* console.log(_.findLast({a:1,b:true,c:'holyhigh',d:'func.js'},_.isString))\n* //{s}\n* console.log(_.findLast(libs,'tags.utils'))\n* //{s}\n* console.log(_.findLast(libs,{js:true}))\n* //undefined key不支持路径解析\n* console.log(_.findLast(libs,{'tags.utils':false}))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param predicate (value[,index|key[,collection]]) 断言\n* <br>当断言是函数时回调参数见定义\n* <br>其他类型请参考 {@link utils!iteratee}\n* @returns 第一个匹配断言的元素或undefined\n*/\nfunction findLast(collection, predicate) {\n\tconst callback = iteratee(predicate);\n\tlet rs;\n\teachRight(collection, (v, k, c) => {\n\t\tif (callback(v, k, c)) {\n\t\t\trs = v;\n\t\t\treturn false;\n\t\t}\n\t});\n\treturn rs;\n}\n//#endregion\n//#region src/collection/first.ts\n/**\n* 获取数组中的第一个元素\n*\n* @example\n* //1\n* console.log(_.first([1,2,3]))\n* //\"1\"\n* console.log(_.first(new Set(['1',1])))\n*\n* @param array 数组\n* @returns 数组中第一个元素\n*/\nfunction first(array) {\n\treturn toArray(array)[0];\n}\n//#endregion\n//#region src/collection/flatMap.ts\n/**\n* 类似<code>map</code>,但会对返回值进行<code>flat</code>处理。\n* 除此之外,与map函数最大的不同在于返回值与元素的映射关系并不一定是一一对应,此时更像<code>filter</code>\n*\n* @example\n* //[1, 2, [3]]\n* console.log(_.flatMap([[1,2],[[3]]]))\n* //[3,5]\n* console.log(_.flatMap([[1,2],3,4,5],n=>n%2?n:[]))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param iteratee (value[,index|key[,collection]]) 回调函数,返回值作为新数组元素。\n* @param depth 嵌套深度\n* @returns 映射值的新数组\n* @since 1.0.0\n*/\nfunction flatMap(collection, itee = identity, depth = 1) {\n\treturn flat(map(collection, itee), depth || 1);\n}\n//#endregion\n//#region src/collection/flatMapDeep.ts\n/**\n* 同<code>flatMap</code>,但会递归元素进行扁平化处理\n*\n* @example\n* //[1, 2, 3]\n* console.log(_.flatMapDeep([[1,2],[[3]]]))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param iteratee (value[,index|key[,collection]]) 回调函数,返回值作为新数组元素。\n* @returns 映射值的新数组\n* @since 1.0.0\n*/\nfunction flatMapDeep(collection, iteratee = identity) {\n\treturn flatMap(collection, iteratee, Infinity);\n}\n//#endregion\n//#region src/collection/groupBy.ts\n/**\n* 创建一个统计对象,对象的key是iteratee返回的值,对应的值是由所有key对应值组成的数组\n* @example\n* //{true: [1, 3, 5, 7, 9], false: ['a', 'b', 'c', 'd']}\n* console.log(_.groupBy([1,'a',3,'b',5,'c',7,'d',9],_.isNumber))\n* const users = [\n* {name:'zhangsan',sex:'m',age:33},\n* {name:'lisi',sex:'f',age:21},\n* {name:'wangwu',sex:'m',age:25},\n* {name:'zhaoliu',sex:'m',age:44},\n* ]\n* //{m: [{...},{...},{...}], f: [{...}]} 性别分布统计\n* console.log(_.groupBy(users,u=>u.sex))\n* //{20: [{...},{...}], 30: [{...}], 40: [{...}]} 年龄段分布统计\n* console.log(_.groupBy(users,u=>(u.age/10>>0)*10))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param iteratee (value)回调函数,返回统计key\n* @returns 统计对象\n* @since 1.0.0\n*/\nfunction groupBy(collection, iteratee$3 = identity) {\n\tconst stat = {};\n\tconst cb = iteratee(iteratee$3 || identity);\n\teach(collection, (el) => {\n\t\tconst key = cb(el);\n\t\tif (stat[key] === void 0) stat[key] = [];\n\t\tstat[key].push(el);\n\t});\n\treturn stat;\n}\n//#endregion\n//#region src/collection/initial.ts\n/**\n* 返回除最后一个元素外的所有元素组成的新数组\n*\n* @example\n* //[1, 2]\n* console.log(_.initial([1, 2, 3]))\n*\n* @param array 数组\n* @returns 新数组\n* @since 0.19.0\n*/\nfunction initial(array) {\n\tlet ary = Array.isArray(array) ? array : toArray(array);\n\treturn ary.slice(0, ary.length - 1);\n}\n//#endregion\n//#region src/collection/keyBy.ts\n/**\n* 创建一个对象,对象的key是iteratee返回的值,对象的值是collection中最后一个key对应的值\n* @example\n* //{true: 9, false: 'd'}\n* console.log(_.keyBy([1,'a',3,'b',5,'c',7,'d',9],_.isNumber))g\n* const users = [\n* {name:'zhangsan',sex:'m',age:33},\n* {name:'lisi',sex:'f',age:21},\n* {name:'wangwu',sex:'m',age:25},\n* {name:'zhaoliu',sex:'m',age:44},\n* ]\n* //{m: {...}, f: {...}}\n* console.log(_.keyBy(users,u=>u.sex))\n* //{20: {...}, 30: {...}, 40: {...} }\n* console.log(_.keyBy(users,u=>(u.age/10>>0)*10))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param iteratee (value)回调函数,返回统计key\n* @returns 统计对象\n* @since 1.0.0\n*/\nfunction keyBy(collection, iteratee$2 = identity) {\n\tconst stat = {};\n\tconst cb = iteratee(iteratee$2 || identity);\n\teach(collection, (el) => {\n\t\tconst key = cb(el);\n\t\tstat[key] = el;\n\t});\n\treturn stat;\n}\n//#endregion\n//#region src/collection/last.ts\n/**\n* 获取数组中的最后一个元素\n*\n* @example\n* //3\n* console.log(_.last([1,2,3]))\n*\n* @param array 数组\n* @returns 数组中最后一个元素\n*/\nfunction last(array) {\n\tconst ary = toArray(array);\n\treturn ary[ary.length - 1];\n}\n//#endregion\n//#region src/collection/partition.ts\n/**\n* 类似<code>filter</code>函数,但返回固定长度为2的二维数组 - [[matched...],[mismatched...]]\n*\n* @example\n* const libs = [\n* {name:'func.js',platform:['web','nodejs'],tags:{utils:true},js:false},\n* {name:'juth2',platform:['web','java'],tags:{utils:false,middleware:true},js:true},\n* {name:'soya2d',platform:['web'],tags:{utils:true},js:true}\n* ];\n*\n* //[[func.js],[juth2,soya2d]]\n* console.log(_.partition(libs,{name:'func.js'}))\n*\n* const seq = [1,2,3,4,5,6];\n* //[[2, 4, 6],[1, 3, 5]]\n* console.log(_.partition(seq,n=>n%2===0))\n*\n* //[[1,3],[\"2\"]]\n* console.log(_.partition({a:1,b:'2',c:3},_.isNumber))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param predicate (value[,index|key[,collection]]) 断言\n* <br>当断言是函数时回调参数见定义\n* <br>其他类型请参考 {@link utils!iteratee}\n* @returns 由匹配列表,非匹配列表构成的二维数组\n* @since 0.17.0\n*/\nfunction partition(collection, predicate) {\n\tconst matched = [];\n\tconst mismatched = [];\n\tconst callback = iteratee(predicate);\n\teach(collection, (v, k, c) => {\n\t\tif (callback(v, k, c)) matched.push(v);\n\t\telse mismatched.push(v);\n\t});\n\treturn [matched, mismatched];\n}\n//#endregion\n//#region src/collection/reduce.ts\n/**\n* 对集合中的每个元素执行一次reducer函数,并将其结果汇总为单个值返回。\n* <p>\n* 如果没有提供initialValue,reduce 会从集合索引1开始执行 callback 方法。如果提供initialValue则从索引0开始。\n* </p>\n* <p>\n* 注意,对于Object类型的对象,如果未提供initialValue,则accumulator会是索引0元素的value,而不是key\n* </p>\n*\n* @example\n* //25\n* console.log(_.reduce([1,3,5,7,9],(a,v)=>a+v))\n* //35\n* console.log(_.reduce([1,3,5,7,9],(a,v)=>a+v,10))\n* //x-y-z\n* console.log(_.reduce({x:1,y:2,z:3},(a,v,k)=>a+'-'+k,'').substr(1))\n*\n* @param collection\n* @param callback (accumulator,value[,key|index[,collection]]);reducer函数\n* @param initialValue 第一次调用 callback函数时的第一个参数的值\n* @returns 汇总值\n*/\nfunction reduce(collection, callback, initialValue) {\n\tlet rs;\n\tif (isNil(initialValue)) rs = first(collection);\n\telse rs = callback(initialValue, first(collection), first(keys(collection)), collection);\n\teach(collection, (v, k, c) => {\n\t\trs = callback(rs, v, k, c);\n\t}, 1);\n\treturn rs;\n}\n//#endregion\n//#region src/collection/reject.ts\n/**\n* <code>filter</code>的反函数,数组内容由集合内所有断言结果为假的元素组成\n*\n* @example\n* //['a', 'b', 'c']\n* console.log(_.reject(['a','b','c',1],_.isNumber))\n* //['3']\n* console.log(_.reject({a:1,b:2,c:'3'},_.isNumber))\n* //[2,4]\n* console.log(_.reject([1,2,3,4],v=>v%2===1))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param predicate (value[,index|key[,collection]]) 断言\n* <br>当断言是函数时回调参数见定义\n* <br>其他类型请参考 {@link utils!iteratee}\n* @returns 由通过断言的元素组成的新数组\n* @since 1.0.0\n*/\nfunction reject(collection, predicate) {\n\tconst rs = [];\n\tconst callback = iteratee(predicate);\n\teach(collection, (v, k, c) => {\n\t\tif (!callback(v, k, c)) rs.push(v);\n\t});\n\treturn rs;\n}\n//#endregion\n//#region src/math/randi.ts\nfunction randi(min, max) {\n\tlet maxNum = max || min;\n\tif (max === void 0) min = 0;\n\tmaxNum >>= 0;\n\tmin >>= 0;\n\treturn Math.random() * (maxNum - min) + min >> 0;\n}\n//#endregion\n//#region src/collection/sample.ts\n/**\n* 返回对指定列表的唯一随机采样结果\n* @example\n* //随机值\n* console.log(_.sample([1,2,3,4,5,6,7,8,9,0]))\n* //随机值\n* console.log(_.sample({a:1,b:2,c:3,d:4,e:5}))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @returns 采样结果\n* @since 0.16.0\n*/\nfunction sample(collection) {\n\tconst ary = toArray(collection);\n\treturn ary[randi(ary.length)];\n}\n//#endregion\n//#region src/collection/sampleSize.ts\n/**\n* 返回对指定列表的指定数量随机采样结果\n* @example\n* //[随机值]\n* console.log(_.sampleSize([1,2,3,4,5,6,7,8,9,0]))\n* //[随机值1,随机值2]\n* console.log(_.sampleSize([{a:1},{b:2},{c:3},{d:4},{e:5}],2))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param count 采样数量\n* @returns 采样结果\n* @since 0.16.0\n*/\nfunction sampleSize(collection, count = 1) {\n\tcount = count ?? 1;\n\tconst ary = toArray(collection);\n\tconst seeds = range(0, ary.length);\n\tconst ks = [];\n\twhile (seeds.length > 0) {\n\t\tif (count-- < 1) break;\n\t\tconst i = pop(seeds, randi(seeds.length));\n\t\tif (i !== null) ks.push(i);\n\t}\n\treturn map(ks, (v) => ary[v]);\n}\n//#endregion\n//#region src/collection/shuffle.ts\n/**\n* 返回指定数组的一个随机乱序副本\n* @example\n* //[随机内容]\n* console.log(_.shuffle([1,2,3,4,5,6,7,8,9,0]))\n* //[随机内容]\n* console.log(_.shuffle([{a:1},{a:2},{a:3},{a:4},{a:5}]))\n* //[随机内容]\n* console.log(_.shuffle({a:1,b:2,c:3,d:4,e:5}))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @returns 乱序副本\n* @since 0.16.0\n*/\nfunction shuffle(collection) {\n\treturn sampleSize(collection, size(collection));\n}\n//#endregion\n//#region src/collection/some.ts\n/**\n* 对集合内的所有元素进行断言,直到第一个返回true的元素结束。\n*\n* @example\n* const libs = [\n* {name:'func.js',platform:['web','nodejs'],tags:{utils:true},js:true},\n* {name:'juth2',platform:['web','java'],tags:{utils:false,middleware:true},js:false},\n* {name:'soya2d',platform:['web'],tags:{utils:true},js:true}\n* ];\n*\n* //false\n* console.log(_.some([]))\n* //true\n* console.log(_.some([1,2,3,4],v=>v%2===1))\n* //true\n* console.log(_.some(['a','b','c',1],_.isNumber))\n* //true\n* console.log(_.some(libs,'tags.middleware'))\n* //true\n* console.log(_.some(libs,{js:true}))\n* //false key不支持路径解析\n* console.log(_.some(libs,{'tags.utils':false}))\n*\n* @param collection 任何可遍历的集合类型,比如arraylike / set / map / object / ...\n* @param predicate (value[,index|key[,collection]]) 断言\n* <br>当断言是函数时回调参数见定义\n* <br>其他类型请参考 {@link utils!iteratee}\n* @returns 只要有任意元素断言为真返回true,否则false。对于一个空集合,会返回false\n*/\nfunction some(collection, predicate) {\n\tlet rs = false;\n\tconst callback = iteratee(predicate || (() => true));\n\teach(collection, (v, k, c) => {\n\t\tif (callback(v, k, c)) {\n\t\t\trs = true;\n\t\t\treturn false;\n\t\t}\n\t});\n\treturn rs;\n}\n//#endregion\n//#region src/datetime/compareDate.ts\nvar TIME_MAP$1 = {\n\ts: 1e3,\n\tm: 6e4,\n\th: 36e5,\n\td: 864e5\n};\n/**\n* 比较两个日期,并返回由比较时间单位确定的相差时间。\n* <p>\n* 使用truncated对比算法 —— 小于指定时间单位的值会被视为相同,\n* 比如对比月,则两个日期的 日/时/分/秒 会被认为相同,以此类推。\n* </p>\n* 相差时间为正数表示date1日期晚于(大于)date2,负数相反,0表示时间/日期相同。\n* <p>\n* 注意,如果对比单位是 h/m/s,务必要保持格式一致,比如\n* \n* ```ts\n* //实际相差8小时\n* new Date('2020-01-01') \n* //vs\n* new Date('2020/01/01')\n* ```\n*\n* @example\n* //0\n* console.log(_.compareDate(new Date('2020/05/01'),'2020/5/1'))\n* //格式不一致,相差8小时\n* console.log(_.compareDate(new Date('2020-05-01'),'2020/5/1','h'))\n* //-59\n* console.log(_.compareDate(new Date('2019/01/01'),'2019/3/1'))\n*\n* @param date1 日期对象、时间戳或合法格式的日期时间字符串。\n* 对于字符串格式,可以时<a href=\"https://www.iso.org/iso-8601-date-and-time-format.html\">UTC格式</a>,或者\n* <a href=\"https://tools.ietf.org/html/rfc2822#section-3.3\">RFC2822</a>格式\n* @param date2 同date1\n* @param type 比较时间单位\n* <ul>\n* <li><code>y</code> 年</li>\n* <li><code>M</code> 月</li>\n* <li><code>d</code> 日</li>\n* <li><code>h</code> 时</li>\n* <li><code>m</code> 分</li>\n* <li><code>s</code> 秒</li>\n* </ul>\n* @returns 根据比较时间单位返回的比较值。正数为date1日期晚于(大于)date2,负数相反,0表示相同。\n*/\nfunction compareDate(date1, date2, type = \"d\") {\n\tconst d1 = new Date(date1);\n\tconst d2 = new Date(date2);\n\ttype = type || \"d\";\n\tif (type === \"y\") return d1.getFullYear() - d2.getFullYear();\n\telse if (type === \"M\") return (d1.getFullYear() - d2.getFullYear()) * 12 + (d1.getMonth() - d2.getMonth());\n\telse {\n\t\tswitch (type) {\n\t\t\tcase \"d\":\n\t\t\t\td1.setHours(0, 0, 0, 0);\n\t\t\t\td2.setHours(0, 0, 0, 0);\n\t\t\t\tbreak;\n\t\t\tcase \"h\":\n\t\t\t\td1.setHours(d1.getHours(), 0, 0, 0);\n\t\t\t\td2.setHours(d2.getHours(), 0, 0, 0);\n\t\t\t\tbreak;\n\t\t\tcase \"m\":\n\t\t\t\td1.setHours(d1.getHours(), d1.getMinutes(), 0, 0);\n\t\t\t\td2.setHours(d2.getHours(), d2.getMinutes(), 0, 0);\n\t\t}\n\t\treturn (d1.getTime() - d2.getTime()) / TIME_MAP$1[type];\n\t}\n}\n//#endregion\n//#region src/is/isDate.ts\n/**\n* 判断值是不是一个Date实例\n*\n* @example\n* //true\n* console.log(_.isDate(new Date()))\n* //false\n* console.log(_.isDate('2020/1/1'))\n*\n* @param v\n* @returns\n*/\nfunction isDate(v) {\n\treturn v instanceof Date || Object.prototype.toString.call(v) === \"[object Date]\";\n}\n//#endregion\n//#region src/string/toString.ts\n/**\n* 转换任何对象为字符串。如果对象本身为string类型的值/对象,则返回该对象的字符串形式。否则返回对象的toString()方法的返回值\n*\n* @example\n* //''\n* console.log(_.toString(null))\n* //1\n* console.log(_.toString(1))\n* //3,6,9\n* console.log(_.toString([3,6,9]))\n* //-0\n* console.log(_.toString(-0))\n* //[object Set]\n* console.log(_.toString(new Set([3,6,9])))\n* //{a:1}\n* console.log(_.toString({a:1,toString:()=>'{a:1}'}))\n*\n* @param v 任何值\n* @returns 对于null/undefined会返回空字符串\n*/\nfunction toString(v) {\n\tif (v == null) return \"\";\n\tif (v === 0 && 1 / v < 0) return \"-0\";\n\tconst type = typeof v;\n\tif (type === \"string\") return v;\n\tif (type === \"number\" || type === \"boolean\") return String(v);\n\tif (type === \"symbol\") return v.toString();\n\treturn v.toString ? v.toString() : Object.prototype.toString.call(v);\n}\n//#endregion\n//#region src/collection/sortBy.ts\n/**\n* 使用指定回调对集合结果进行升序排序。根据集合结果的第一个元素确定排序逻辑,内置排序逻辑包括\n* <ul>\n* <li>字符串</li>\n* <li>数字</li>\n* <li>日期</li>\n* </ul>\n*\n* @example\n* //不变\n* console.log(_.sortBy([{a:2},{a:1},{a:3}]))\n* //[{{a:1},{a:2},{a:3}] 通过iteratee把集合变为数字后排序\n* console.log(_.sortBy([{a:2},{a:1},{a:3}],'a'))\n* //['3/1/2019', '2020/1/1', '2020-3-1']\n* console.log(_.sortBy(['2020-3-1','2020/1/1','3/1/2019'],_.toDate))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param iteratee (value,key|index) 筛选函数,返回排序值\n* <br>当iteratee是函数时回调参数见定义\n* <br>其他类型请参考 {@link utils!iteratee}\n* @returns 排序后的数组\n* @since 1.0.0\n*/\nfunction sortBy(collection, iteratee$1 = identity) {\n\tif (size(collection) < 1) return [];\n\tconst cb = iteratee(iteratee$1 || identity);\n\tlet i = 0;\n\tconst list = map(collection, (v, k) => {\n\t\treturn {\n\t\t\tsrc: v,\n\t\t\tindex: i++,\n\t\t\tvalue: cb(v, k)\n\t\t};\n\t});\n\tconst comparator = getComparator(list[0].value);\n\tlist.sort((a, b) => !eq$1(a.value, b.value) ? comparator(a.value, b.value) : a.index - b.index);\n\tconst rs = new Array(list.length);\n\tfor (let j = 0; j < list.length; j++) rs[j] = list[j].src;\n\treturn rs;\n}\nvar compareNumAsc = (a, b) => {\n\tif (isNil(a) || !isNumber(a)) return 1;\n\tif (isNil(b) || !isNumber(b)) return -1;\n\treturn a - b;\n};\nvar compareStrAsc = (a, b) => {\n\tif (isNil(a)) return 1;\n\tif (isNil(b)) return -1;\n\treturn toString(a).localeCompare(toString(b));\n};\nvar compareDateAsc = (a, b) => {\n\tif (isNil(a)) return 1;\n\tif (isNil(b)) return -1;\n\treturn compareDate(a, b);\n};\nfunction getComparator(el) {\n\tlet comparator;\n\tif (isNumber(el)) comparator = compareNumAsc;\n\telse if (isDate(el)) comparator = compareDateAsc;\n\telse comparator = compareStrAsc;\n\treturn comparator;\n}\n//#endregion\n//#region src/collection/sort.ts\n/**\n* 对集合进行排序,并返回排序后的数组副本。\n*\n* @example\n* //字符排序 ['lao1', 'lao2', 'lao3']\n* console.log(_.sort(['lao1','lao3','lao2']))\n* //数字排序[7, 9, 80]\n* console.log(_.sort([9,80,7]))\n* //日期排序[\"3/1/2019\", \"2020/1/1\", Wed Apr 01 2020...]\n* console.log(_.sort([new Date(2020,3,1),'2020/1/1','3/1/2019']))\n* //第一个元素不是日期对象,需要转换\n* console.log(_.sort(_.map(['2020/1/1',new Date(2020,3,1),'3/1/2019'],v=>new Date(v))))\n* //对象排序\n* const users = [\n* {name:'zhangsan',age:53},\n* {name:'lisi',age:44},\n* {name:'wangwu',age:25},\n* {name:'zhaoliu',age:36}\n* ];\n* //[25,36,44,53]\n* console.log(_.sort(users,(a,b)=>a.age-b.age))\n* // 倒排\n* console.log(_.sort(users,(a,b)=>b.age-a.age))\n*\n* @param collection 任何可遍历的集合类型,比如array / arraylike / set / map / object / ...\n* @param comparator (a,b) 排序函数,如果为空使用sortBy逻辑\n* @returns 排序后的数组\n*/\nfunction sort(collection, comparator) {\n\tconst ary = toArray(collection);\n\tif (ary.length < 1) return ary;\n\tif (isFunction(comparator)) return ary.sort(comparator);\n\telse return sortBy(ary);\n}\n//#endregion\n//#region src/collection/tail.ts\n/**\n* 返回除第一个元素外的所有元素组成的新数组\n*\n* @example\n* //[2, 3]\n* console.log(_.tail([1, 2, 3]))\n*\n* @param array 数组\n* @returns 新数组\n*/\nfunction tail(array) {\n\treturn toArray(array).slice(1);\n}\n//#endregion\n//#region src/collection/take.ts\n/**\n* 从起始位置获取指定数量的元素并放入新数组后返回\n*\n* @example\n* //[1, 2, 3]\n* console.log(_.take([1, 2, 3, 4, 5],3))\n* //[1, 2, 3, 4, 5]\n* console.log(_.take([1, 2, 3, 4, 5]))\n*\n* @param array 数组\n* @param length 获取元素数量,默认数组长度\n* @returns 新数组\n*/\nfunction take(array, length) {\n\treturn toArray(array).slice(0, length);\n}\n//#endregion\n//#region src/collection/takeRight.ts\n/**\n* 从数组末尾位置获取指定数量的元素放入新数组并返回\n*\n* @example\n* //[3, 4, 5]\n* console.log(_.takeRight([1, 2, 3, 4, 5],3))\n* //[1, 2, 3, 4, 5]\n* console.log(_.takeRight([1, 2, 3, 4, 5]))\n*\n* @param array 数组\n* @param length\n* @returns 新数组\n* @since 1.0.0\n*/\nfunction takeRight(array, length) {\n\tconst rs = toArray(array);\n\tconst maxLength = rs.length;\n\treturn rs.slice(maxLength - (length || maxLength), maxLength);\n}\n//#endregion\n//#region src/datetime/addTime.ts\nvar TIME_MAP = {\n\ts: 1e3,\n\tm: 6e4,\n\th: 36e5,\n\td: 864e5\n};\n/**\n* 对日期时间进行量变处理\n*\n* @example\n* //2020/5/1 08:00:20\n* console.log(_.formatDate(_.addTime(new Date('2020-05-01'),20),'yyyy/MM/dd hh:mm:ss'))\n* //2020-04-11 08:00\n* console.log(_.formatDate(_.addTime(new Date('2020-05-01'),-20,'d')))\n* //2022-01-01 00:00\n* console.log(_.formatDate(_.addTime(new Date('2020-05-01 0:0'),20,'M')))\n*\n* @param date 原日期时间\n* @param amount 变化量,可以为负数\n* @param type 量变时间类型\n* <ul>\n* <li><code>y</code> 年</li>\n* <li><code>M</code> 月</li>\n* <li><code>d</code> 日</li>\n* <li><code>h</code> 时</li>\n* <li><code>m</code> 分</li>\n* <li><code>s</code> 秒</li>\n* </ul>\n* @returns 日期对象\n*/\nfunction addTime(date, amount, type = \"s\") {\n\ttype = type || \"s\";\n\tconst d = new Date(date);\n\tswitch (type) {\n\t\tcase \"y\":\n\t\t\td.setFullYear(d.getFullYear() + amount);\n\t\t\tbreak;\n\t\tcase \"M\":\n\t\t\td.setMonth(d.getMonth() + amount);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tlet times = 0;\n\t\t\ttimes = amount * TIME_MAP[type];\n\t\t\td.setTime(d.getTime() + times);\n\t}\n\treturn d;\n}\n//#endregion\n//#region src/is/isInteger.ts\n/**\n* 判断值是不是一个整数\n*\n* @example\n* //true\n* console.log(_.isInteger(-0))\n* //true\n* console.log(_.isInteger(5.0))\n* //false\n* console.log(_.isSafeInteger(5.000000000000001))\n* //true\n* console.log(_.isSafeInteger(5.0000000000000001))\n* //false\n* console.log(_.isInteger('5'))\n* //true\n* console.log(_.isInteger(Number.MAX_SAFE_INTEGER))\n* //true\n* console.log(_.isInteger(Number.MAX_VALUE))\n*\n* @param v\n* @returns\n*/\nfunction isInteger(v) {\n\treturn Number.isInteger(v);\n}\n//#endregion\n//#region src/string/padEnd.ts\n/**\n* 使用填充字符串填充原字符串达到指定长度。从原字符串末尾开始填充。\n*\n* @example\n* //100\n* console.log(_.padEnd('1',3,'0'))\n* //1-0-0-\n* console.log(_.padEnd('1',6,'-0'))\n* //1\n* console.log(_.padEnd('1',0,'-0'))\n*\n* @param str 原字符串\n* @param len 填充后的字符串长度,如果长度小于原字符串长度,返回原字符串\n* @param padString 填充字符串,如果填充后超出指定长度,会自动截取并保留左侧字符串\n* @returns 在原字符串末尾填充至指定长度后的字符串\n*/\nfunction padEnd(str, len, padString = \" \") {\n\tstr = toString(str);\n\tif (str.padEnd) return str.padEnd(len, padString);\n\tpadString = padString ?? \" \";\n\tconst diff = len - str.length;\n\tif (diff < 1) return str;\n\tlet fill = \"\";\n\tlet i = Math.ceil(diff / padString.length);\n\twhile (i--) fill += padString;\n\treturn str + fill.substring(0, diff);\n}\n//#endregion\n//#region src/datetime/toDate.ts\n/**\n* 通过指定参数得到日期对象。支持多种签名\n* \n* ```js\n* _.toDate(1320940800); //timestamp unix style\n* _.toDate(1320940800123); //timestamp javascript style\n* _.toDate([year,monthIndex,day]); //注意,monthIndex为0-based(0代表一月)\n* _.toDate([year,monthIndex,day,hour,min,sec]); //注意,monthIndex为0-based(0代表一月)\n* _.toDate(datetimeStr);\n* ```\n*\n* @example\n* //'2011/11/11 00:00:00'\n* console.log(_.toDate(1320940800).toLocaleString())\n* //'2011/11/11 00:01:39'\n* console.log(_.toDate(1320940899999).toLocaleString())\n* //'2022/12/12 00:00:00'\n* console.log(_.toDate([2022,11,12]).toLocaleString())\n* //'2022/12/12 12:12:12'\n* console.log(_.toDate([2022,11,12,12,12,12]).toLocaleString())\n* //'2022/2/2 00:00:00'\n* console.log(_.toDate('2022/2/2').toLocaleString())\n* //'2022/2/2 08:00:00'\n* console.log(_.toDate('2022-02-02').toLocaleString())\n*\n* @param value 转换参数\n*\n* @returns 转换后的日期。无效日期统一返回1970/1/1\n*/\nfunction toDate(value) {\n\tlet rs;\n\tif (isInteger(value)) {\n\t\tif (value < TIMESTAMP_MIN) value = toNumber(padEnd(value + \"\", 13, \"0\"));\n\t\telse if (value > TIMESTAMP_MAX) value = 0;\n\t\trs = new Date(value);\n\t} else if (isArray(value)) rs = new Date(value[0], value[1], value[2] || 1, value[3] || 0, value[4] || 0, value[5] || 0, value[6] || 0);\n\telse rs = new Date(value);\n\tif (rs.toDateString() === \"Invalid Date\") rs = /* @__PURE__ */ new Date(0);\n\treturn rs;\n}\nvar TIMESTAMP_MIN = 0xe8d4a51000;\nvar TIMESTAMP_MAX = 9999999999999;\n//#endregion\n//#region src/datetime/isLeapYear.ts\n/**\n* 指定日期是否是闰年\n* @param date 日期对象\n* @returns 闰年返回true\n*/\nfunction isLeapYear(date) {\n\tdate = toDate(date);\n\tconst year = date.getFullYear();\n\treturn year % 400 === 0 || year % 4 === 0;\n}\n//#endregion\n//#region src/datetime/getDayOfYear.ts\nvar DaysOfMonth = [\n\t31,\n\t0,\n\t31,\n\t30,\n\t31,\n\t30,\n\t31,\n\t31,\n\t30,\n\t31,\n\t30,\n\t31\n];\n/**\n* 获取指定日期在当前年中的天数并返回\n* @param date 日期对象\n* @returns 当前年中的第几天\n*/\nfunction getDayOfYear(date) {\n\tdate = toDate(date);\n\tconst leapYear = isLeapYear(date);\n\tconst month = date.getMonth();\n\tlet dates = date.getDate();\n\tfor (let i = 0; i < month; i++) {\n\t\tconst ds = DaysOfMonth[i] || (leapYear ? 29 : 28);\n\t\tdates += ds;\n\t}\n\treturn dates;\n}\n//#endregion\n//#region src/datetime/getWeekOfMonth.ts\n/**\n* 获取指定日期在当前月中的周数并返回\n* @param date 日期对象\n* @returns 当前月中的第几周\n*/\nfunction getWeekOfMonth(date) {\n\tdate = toDate(date);\n\tconst year = date.getFullYear();\n\tlet firstDayOfMonth = new Date(year, date.getMonth(), 1);\n\tlet extraWeek = 0;\n\tlet d = firstDayOfMonth.getDay();\n\tif (d === 0 || d > 5) extraWeek = 1;\n\treturn Math.ceil(date.getDate() / 7) + extraWeek;\n}\n//#endregion\n//#region src/datetime/getWeekOfYear.ts\n/**\n* 获取指定日期在当前年中的周数并返回\n* @param date 日期对象\n* @returns 当前年中的第几周\n*/\nfunction getWeekOfYear(date) {\n\tdate = toDate(date);\n\tconst year = date.getFullYear();\n\tlet firstDayOfYear = new Date(year, 0, 1);\n\tlet extraWeek = 0;\n\tlet d = firstDayOfYear.getDay();\n\tif (d === 0 || d > 5) extraWeek = 1;\n\treturn Math.ceil(getDayOfYear(date) / 7) + extraWeek;\n}\n//#endregion\n//#region src/datetime/formatDate.ts\nvar INVALID_DATE = \"\";\nvar SearchExp = /y{2,4}|M{1,3}|d{1,4}|h{1,2}|m{1,2}|s{1,2}|Q{1,2}|E{1,2}|W{1,2}|w{1,2}|H{1,2}|S|a/gm;\nvar pad0 = (str) => str.length > 1 ? str : \"0\" + str;\nvar pad00 = (str) => str.length > 2 ? str : str.length > 1 ? \"0\" + str : \"00\" + str;\nfunction compilePattern(pattern) {\n\tconst tokens = [];\n\tlet lastIndex = 0;\n\tlet match;\n\twhile ((match = SearchExp.exec(pattern)) !== null) {\n\t\tif (match.index > lastIndex) tokens.push({\n\t\t\ttype: \"literal\",\n\t\t\tvalue: pattern.slice(lastIndex, match.index)\n\t\t});\n\t\ttokens.push({\n\t\t\ttype: \"token\",\n\t\t\tvalue: match[0]\n\t\t});\n\t\tlastIndex = match.index + match[0].length;\n\t}\n\tif (lastIndex < pattern.length) tokens.push({\n\t\ttype: \"literal\",\n\t\tvalue: pattern.slice(lastIndex)\n\t});\n\treturn tokens;\n}\nfunction buildTokenFn(tag) {\n\tswitch (tag[0]) {\n\t\tcase \"y\": {\n\t\t\tconst isShort = tag === \"yy\";\n\t\t\treturn (date) => {\n\t\t\t\tconst year = date.getFullYear();\n\t\t\t\treturn isShort ? year % 100 + \"\" : year + \"\";\n\t\t\t};\n\t\t}\n\t\tcase \"M\":\n\t\t\tswitch (tag) {\n\t\t\t\tcase \"M\": return (date) => date.getMonth() + 1 + \"\";\n\t\t\t\tcase \"MM\": return (date) => pad0(date.getMonth() + 1 + \"\");\n\t\t\t\tcase \"MMM\": return (date, locale) => locale?.months[date.getMonth()] || tag;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"d\":\n\t\t\tswitch (tag) {\n\t\t\t\tcase \"d\": return (date) => date.getDate() + \"\";\n\t\t\t\tcase \"dd\": return (date) => pad0(date.getDate() + \"\");\n\t\t\t\tcase \"ddd\": return (date) => getDayOfYear(date) + \"\";\n\t\t\t\tcase \"dddd\": return (date) => pad00(getDayOfYear(date) + \"\");\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"a\": return (date, locale) => date.getHours() < 12 ? locale?.meridiems[0] : locale?.meridiems[1];\n\t\tcase \"h\": {\n\t\t\tconst isPadded = tag.length > 1;\n\t\t\treturn (date) => {\n\t\t\t\tlet val = date.getHours() % 12;\n\t\t\t\tif (val === 0) val = 12;\n\t\t\t\treturn isPadded ? pad0(val + \"\") : val + \"\";\n\t\t\t};\n\t\t}\n\t\tcase \"H\": {\n\t\t\tconst isPadded = tag.length > 1;\n\t\t\treturn (date) => isPadded ? pad0(date.getHours() + \"\") : date.getHours() + \"\";\n\t\t}\n\t\tcase \"m\": {\n\t\t\tconst isPadded = tag.length > 1;\n\t\t\treturn (date) => isPadded ? pad0(date.getMinutes() + \"\") : date.getMinutes() + \"\";\n\t\t}\n\t\tcase \"s\": {\n\t\t\tconst isPadded = tag.length > 1;\n\t\t\treturn (date) => isPadded ? pad0(date.getSeconds() + \"\") : date.getSeconds() + \"\";\n\t\t}\n\t\tcase \"Q\":\n\t\t\tswitch (tag) {\n\t\t\t\tcase \"Q\": return (date) => Math.ceil((date.getMonth() + 1) / 3) + \"\";\n\t\t\t\tcase \"QQ\": return (date, locale) => locale?.quarters[Math.ceil((date.getMonth() + 1) / 3) - 1] || tag;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"W\": {\n\t\t\tconst isPadded = tag.length > 1;\n\t\t\treturn (date) => {\n\t\t\t\tconst val = getWeekOfYear(date) + \"\";\n\t\t\t\treturn isPadded ? pad0(val) : val;\n\t\t\t};\n\t\t}\n\t\tcase \"w\":\n\t\t\tswitch (tag) {\n\t\t\t\tcase \"w\": return (date) => getWeekOfMonth(date) + \"\";\n\t\t\t\tcase \"ww\": return (date, locale) => locale?.weeks[getWeekOfMonth(date) - 1] || tag;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"E\":\n\t\t\tswitch (tag) {\n\t\t\t\tcase \"E\": return (date) => {\n\t\t\t\t\tlet dayOfWeek = date.getDay();\n\t\t\t\t\tdayOfWeek = dayOfWeek < 1 ? 7 : dayOfWeek;\n\t\t\t\t\treturn dayOfWeek + \"\";\n\t\t\t\t};\n\t\t\t\tcase \"EE\": return (date, locale) => {\n\t\t\t\t\tlet dayOfWeek = date.getDay();\n\t\t\t\t\tdayOfWeek = dayOfWeek < 1 ? 7 : dayOfWeek;\n\t\t\t\t\treturn locale?.days[dayOfWeek - 1] || tag;\n\t\t\t\t};\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"S\": return (date) => date.getMilliseconds() + \"\";\n\t}\n\treturn () => tag;\n}\n/**\n* 通过表达式格式化日期时间\n* \n* ```\n* yyyy-MM-dd hh:mm:ss => 2020-12-11 10:09:08\n* ```\n* \n* pattern解释:\n* \n* - `yy` 2位年 - 22\n* - `yyyy` 4位年 - 2022\n* - `M` 1位月(1-12)\n* - `MM` 2位月(01-12)\n* - `MMM` 月描述(一月 - 十二月)\n* - `d` 1位日(1-30/31/29/28)\n* - `dd` 2位日(01-30/31/29/28)\n* - `ddd` 一年中的日(1-365)\n* - `dddd` 一年中的日(001-365)\n* - `h` 1位小时(1-12)\n* - `hh` 2位小时(01-12)\n* - `H` 1位小时(0-23)\n* - `HH` 2位小时(00-23)\n* - `m` 1位分钟(0-59)\n* - `mm` 2位分钟(00-59)\n* - `s` 1位秒(0-59)\n* - `ss` 2位秒(00-59)\n* - `Q` 季度(1-4)\n* - `QQ` 季度描述(春-冬)\n* - `W` 一年中的周(1-53)\n* - `WW` 一年中的周(01-53)\n* - `w` 一月中的周(1-6)\n* - `ww` 一月中的周描述(第一周 - 第六周)\n* - `E` 星期(1-7)\n* - `EE` 星期描述(星期一 - 星期日)\n* - `S` 毫秒\n* - `a` AM/PM\n*\n* @example\n* //now time\n* console.log(_.formatDate(_.now(),'yyyy-MM-dd hh:mm'))\n* //2/1/2021\n* console.log(_.formatDate('2021-2-1','M/d/yyyy'))\n* //2/1/21\n* console.log(_.formatDate('2021-2-1','M/d/yy'))\n* //02/01/21\n* console.log(_.formatDate('2021-2-1','MM/dd/yy'))\n* //02/01/2021\n* console.log(_.formatDate('2021-2-1','MM/dd/yyyy'))\n* //21/02/01\n* console.log(_.formatDate('2021-2-1','yy/MM/dd'))\n* //2021-02-01\n* console.log(_.formatDate('2021-2-1','yyyy-MM-dd'))\n* //21-12-11 10:09:08\n* console.log(_.formatDate('2021-12-11T10:09:08','yy-MM-dd HH:mm:ss'))\n* //12/11/2020 1009\n* console.log(_.formatDate('2020-12-11 10:09:08','MM/dd/yyyy hhmm'))\n* //2020-12-11 08:00\n* console.log(_.formatDate(1607644800000))\n* //''\n* console.log(_.formatDate('13:02'))\n* //''\n* console.log(_.formatDate(null))\n* //现在时间:(20-12-11 10:09:08)\n* console.log(_.formatDate('2020-12-11 10:09:08','现在时间:(yy-MM-dd hh:mm:ss)'))\n*\n* @param val 需要格式化的值,可以是日期对象或时间字符串或日期毫秒数\n* @param pattern 格式化模式\n* @returns 格式化后的日期字符串,无效日期返回空字符串\n*/\nfunction formatDate(val, pattern = \"yyyy-MM-dd HH:mm:ss\") {\n\tpattern = pattern || \"yyyy-MM-dd HH:mm:ss\";\n\tconst tokens = compilePattern(pattern);\n\tconst parts = [];\n\tfor (const token of tokens) if (token.type === \"literal\") parts.push(token.value);\n\telse parts.push(buildTokenFn(token.value));\n\tif (!val) return INVALID_DATE;\n\tlet date;\n\tif (typeof val === \"string\" || typeof val === \"number\") date = toDate(val);\n\telse date = val;\n\tif (date.toString().indexOf(\"Invalid\") > -1) return INVALID_DATE;\n\tconst locale = Locale[Lang];\n\tlet result = \"\";\n\tfor (const part of parts) if (typeof part === \"string\") result += part;\n\telse result += part(date, locale);\n\treturn result;\n}\nvar Locale = { \"zh-CN\": {\n\tquarters: [\n\t\t\"一季度\",\n\t\t\"二季度\",\n\t\t\"三季度\",\n\t\t\"四季度\"\n\t],\n\tmonths: /* @__PURE__ */ [\n\t\t\"一\",\n\t\t\"二\",\n\t\t\"三\",\n\t\t\"四\",\n\t\t\"五\",\n\t\t\"六\",\n\t\t\"七\",\n\t\t\"八\",\n\t\t\"九\",\n\t\t\"十\",\n\t\t\"十一\",\n\t\t\"十二\"\n\t].map((v) => v + \"月\"),\n\tweeks: /* @__PURE__ */ [\n\t\t\"一\",\n\t\t\"二\",\n\t\t\"三\",\n\t\t\"四\",\n\t\t\"五\",\n\t\t\"六\"\n\t].map((v) => \"第\" + v + \"周\"),\n\tdays: /* @__PURE__ */ [\n\t\t\"一\",\n\t\t\"二\",\n\t\t\"三\",\n\t\t\"四\",\n\t\t\"五\",\n\t\t\"六\",\n\t\t\"日\"\n\t].map((v) => \"星期\" + v),\n\tmeridiems: [\"AM\", \"PM\"]\n} };\nvar Lang = /* @__PURE__ */ getDefaultLang();\nfunction getDefaultLang() {\n\treturn globalThis.navigator?.language || \"zh-CN\";\n}\n/**\n* 设置不同locale的配置\n* @param lang 语言标记,默认跟随系统\n* @param {object} options 格式化选项\n* @param options.quarters 季度描述,默认\"一 - 四季度\"\n* @param options.months 月度描述,默认\"一 - 十二月\"\n* @param options.weeks 一月中的周描述,默认\"第一 - 六周\"\n* @param options.days 星期描述,默认\"星期一 - 日\"\n* @param options.meridiems 上午/下午描述,默认\"AM/PM\"\n*/\nfunction locale(lang, options) {\n\tlet locale = Locale[lang];\n\tif (!locale) locale = Locale[lang] = {\n\t\tquarters: [],\n\t\tmonths: [],\n\t\tweeks: [],\n\t\tdays: [],\n\t\tmeridiems: []\n\t};\n\tif (options?.quarters) locale.quarters = options?.quarters;\n\tif (options?.months) locale.months = options?.months;\n\tif (options?.weeks) locale.weeks = options?.weeks;\n\tif (options?.days) locale.days = options?.days;\n\tif (options?.meridiems) locale.meridiems = options?.meridiems;\n}\n/**\n* 可以设置当前格式化使用的语言\n* @param lang 语言标记,默认跟随系统\n*/\nfunction lang(lang) {\n\tLang = lang;\n}\nvar formatDateApi = /* @__PURE__ */ Object.assign(formatDate, {\n\tlocale,\n\tlang\n});\n//#endregion\n//#region src/datetime/isSameDay.ts\n/**\n* 比较两个日期是否为同一天\n* @example\n* //true\n* console.log(_.isSameDay(new Date('2020-05-01'),'2020/5/1'))\n* //false\n* console.log(_.isSameDay(new Date('2020-05-01 23:59:59.999'),'2020/5/2 0:0:0.000'))\n*\n* @param date1 日期对象或合法格式的日期时间字符串\n* @param date2 同date1\n* @returns\n*/\nfunction isSameDay(date1, date2) {\n\treturn new Date(date1).setHours(0, 0, 0, 0) === new Date(date2).setHours(0, 0, 0, 0);\n}\n//#endregion\n//#region src/datetime/now.ts\n/**\n* 返回13位日期毫秒数,表示从1970 年 1 月 1 日 00:00:00 (UTC)起到当前时间\n*\n* @example\n* //now time\n* console.log(_.now())\n*\n* @returns 带毫秒数的时间戳\n*/\nfunction now() {\n\treturn Date.now();\n}\n//#endregion\n//#region src/function/after.ts\n/**\n* 创建一个包含指定函数逻辑且内置计数的包装函数并返回。\n* 该函数每调用一次计数会减一,直到计数为0后生效。可用于异步结果汇总时只调用一次的场景\n*\n* @example\n* //undefined, undefined, 'data saved'\n* let saveTip = _.after(()=>'data saved',2);\n* console.log(saveTip(),saveTip(),saveTip())\n*\n* @param fn 需要调用的函数\n* @param count 计数\n* @returns 包装后的函数\n*/\nfunction after(fn, count = 0) {\n\tconst proxy = fn;\n\tlet i = count || 0;\n\tlet rtn;\n\treturn ((...args) => {\n\t\tif (i === 0) rtn = proxy(...args);\n\t\tif (i > 0) i--;\n\t\treturn rtn;\n\t});\n}\n//#endregion\n//#region src/function/alt.ts\n/**\n* 传递v为参数执行interceptor1函数,如果该函数返回值未定义(undefined)则执行interceptor2函数,并返回函数返回值。\n* 用于函数链中的分支操作\n* @example\n* //false\n* console.log(_.alt(9,v=>false,v=>20))\n*\n* @param v\n* @param interceptor1 (v)\n* @param interceptor2 (v)\n* @returns 函数返回值\n*/\nfunction alt(v, interceptor1, interceptor2) {\n\tlet rs = interceptor1(v);\n\tif (rs === void 0) rs = interceptor2(v);\n\treturn rs;\n}\n//#endregion\n//#region src/function/partial.ts\nvar PLACEHOLDER = void 0;\n/**\n* 创建一个新的函数,该函数会调用fn,并传入指定的部分参数。\n* \n* `partial()`常用来创建函数模板或扩展核心函数,比如\n* \n* ```js\n* let delay2 = _.partial(setTimeout,undefined,2000);\n* delay2(()=>\\{console.log('2秒后调用')\\})\n* ```\n*\n* @example\n* //2748\n* let hax2num = _.partial(parseInt,undefined,16);\n* console.log(hax2num('abc'))\n* //9\n* let square = _.partial(Math.pow,undefined,2);\n* console.log(square(3))\n* //¥12,345.00元\n* let formatYuan = _.partial(_.formatNumber,undefined,'¥,000.00元');\n* console.log(formatYuan(12345))\n* //[func.js] hi...\n* let log = _.partial((...args)=>args.join(' '),'[func.js][',undefined,']',undefined);\n* console.log(log('info','hi...'))\n*\n* @param fn 需要调用的函数\n* @param args 参数可以使用undefined作为占位符,以此来确定不同的实参位置\n* @returns 部分应用后的新函数\n*/\nfunction partial(fn, ...args) {\n\treturn ((...params) => {\n\t\tlet p = 0;\n\t\tconst applyArgs = args.map((v) => v === PLACEHOLDER ? params[p++] : v);\n\t\tif (params.length > p) for (let i = p; i < params.length; i++) applyArgs.push(params[i]);\n\t\treturn fn(...applyArgs);\n\t});\n}\n//#endregion\n//#region src/function/bind.ts\n/**\n* 创建一个新的函数,并且绑定函数的this上下文。默认参数部分同<code>partial()</code>\n*\n* @example\n* const obj = {\n* text:'Func.js',\n* click:function(a,b,c){console.log('welcome to '+this.text,a,b,c)},\n* blur:function(){console.log('bye '+this.text)}\n* }\n* //自动填充参数\n* let click = _.bind(obj.click,obj,'a',undefined,'c');\n* click('hi')\n* //1秒后执行,无参数\n* setTimeout(click,1000)\n*\n* @param fn 需要调用的函数\n* @param thisArg fn函数内this所指向的值\n* @param args 参数可以使用undefined作为占位符,以此来确定不同的实参位置\n* @returns 绑定thisArg的新函数\n* @since 0.17.0\n*/\nfunction bind(fn, thisArg, ...args) {\n\treturn partial((fn || (() => {})).bind(thisArg), ...args);\n}\n//#endregion\n//#region src/object/set.ts\n/**\n* 通过path设置对象属性值。如果路径不存在则创建,索引会创建数组,属性会创建对象\n* <div class=\"alert alert-secondary\">\n该函数会修改源对象\n</div>\n\n@example\n* //{\"a\":1,\"b\":{\"c\":[undefined,{\"x\":10}]}}\n* console.log(_.set({a:1},'b.c.1.x',10))\n*\n* @param obj 需要设置属性值的对象,如果obj不是对象(isObject返回false),直接返回obj\n* @param path 属性路径,可以是索引数字,字符串key,或者多级属性数组\n* @param value 任何值\n* @returns obj 修改后的源对象\n* @since 0.16.0\n*/\nfunction set(obj, path, value) {\n\tif (!isObject(obj)) return obj;\n\tconst chain = toPath(path);\n\tlet target = obj;\n\tfor (let i = 0; i < chain.length; i++) {\n\t\tconst seg = chain[i];\n\t\tconst nextSeg = chain[i + 1];\n\t\tlet tmp = target[seg];\n\t\tif (nextSeg) {\n\t\t\tlet next = !tmp ? isNaN(parseInt(nextSeg)) ? {} : [] : tmp;\n\t\t\tif (!tmp) tmp = target[seg] = next;\n\t\t} else {\n\t\t\ttarget[seg] = value;\n\t\t\tbreak;\n\t\t}\n\t\ttarget = tmp;\n\t}\n\treturn obj;\n}\n//#endregion\n//#region src/function/bindAll.ts\n/**\n* 批量绑定对象内的函数属性,将这些函数的this上下文指向绑定对象。经常用于模型中的函数用于外部场景,比如setTimeout/事件绑定等\n*\n* @example\n* const obj = {\n* text:'Func.js',\n* click:function(a,b,c){console.log('welcome to '+this.text,a,b,c)},\n* click2:function(){console.log('hi '+this.text)}\n* }\n* //自动填充参数\n* _.bindAll(obj,'click',['click2']);\n* //1秒后执行,无参数\n* setTimeout(obj.click,1000)\n* //事件\n* top.onclick = obj.click2\n*\n* @param object 绑定对象\n* @param methodNames 属性名或path\n* @returns 绑定对象\n* @since 0.17.0\n*/\nfunction bindAll(object, ...methodNames) {\n\teach(flatDeep(methodNames), (path) => {\n\t\tset(object, path, get(object, path).bind(object));\n\t});\n\treturn object;\n}\n//#endregion\n//#region src/function/call.ts\n/**\n* 通过给定参数调用fn并返回执行结果\n*\n* @example\n* //自动填充参数\n* _.call(fn,1,2);\n* //事件\n* _.call(fn,1,2);\n*\n* @param fn 需要执行的函数\n* @param args 可变参数\n* @returns 执行结果。如果函数无效或无返回值返回undefined\n* @since 1.0.0\n*/\nfunction call(fn, ...args) {\n\tif (!isFunction(fn)) return void 0;\n\treturn fn(...args);\n}\n//#endregion\n//#region src/function/compose.ts\n/**\n* 创建一个新的函数,该函数的参数会传递给第一个<code>fns</code>函数来计算结果,而结果又是第二个fns函数的参数,以此类推,\n* 直到所有函数执行完成。常用于封装不同的可重用函数模块组成新的函数或实现惰性计算,比如\n*\n* <pre><code class=\"language-javascript\">\n* let checkName = _.compose(_.trim,v=>v.length>6);\n* checkName(' holyhigh') //=> true\n* checkName(' ') //=> false\n* </code></pre>\n*\n* @example\n* // Holyhigh\n* let formatName = _.compose(_.lowerCase,_.capitalize);\n* console.log(formatName('HOLYHIGH'))\n*\n* @param fns 多个函数\n* @returns 组合后的入口函数\n*/\nfunction compose(...fns) {\n\treturn (function(...args) {\n\t\tlet rs = fns[0](...args);\n\t\tfor (let i = 1; i < fns.length; i++) if (isFunction(fns[i])) rs = fns[i](rs);\n\t\treturn rs;\n\t});\n}\n//#endregion\n//#region src/function/debounce.ts\n/**\n* 创建一个包含指定函数逻辑的防抖函数并返回。在防抖函数执行后的下一次调用会在 `wait` 间隔结束后执行,如果等待期间调用函数则会重置wait时间。\n* 对于一些需要等待过程停止后执行的场景非常有用,如输入结束时的查询、窗口resize后的计算等等\n*\n* 返回的防抖函数额外带有 `cancel()`,用于丢弃尚未执行的排队调用。\n* 典型场景:宿主(组件/组件库)卸载时清除已排队的回调,避免回调迟到执行时访问已销毁的实例。\n*\n* @example\n* //2\n* let log = _.debounce(console.log);\n* console.log(log(1),log(2))\n*\n* @example\n* //取消排队中的调用\n* let save = _.debounce(doSave, 300)\n* save(data)\n* save.cancel() //doSave 不会被触发\n*\n* @param fn 需要调用的函数\n* @param wait 抖动间隔,ms\n* @param immediate 立即执行一次,默认false\n* @returns 包装后的防抖函数(含 `cancel()`)\n* @since 1.4.0\n*/\nfunction debounce(fn, wait, immediate = false) {\n\tlet timer = null;\n\tlet lastThis = null;\n\tlet lastArgs = null;\n\tfunction invoke() {\n\t\ttimer = null;\n\t\tif (lastArgs === null) return;\n\t\tlet args = lastArgs;\n\t\tlet self = lastThis;\n\t\tlastArgs = lastThis = null;\n\t\tfn.apply(self, args);\n\t}\n\tconst debounced = function(...args) {\n\t\tlastThis = this;\n\t\tlastArgs = args;\n\t\tconst callNow = immediate && timer === null;\n\t\tclearTimeout(timer);\n\t\ttimer = setTimeout(function() {\n\t\t\ttimer = null;\n\t\t\tif (immediate) lastThis = lastArgs = null;\n\t\t\telse invoke();\n\t\t}, wait);\n\t\tif (callNow) {\n\t\t\tconst a = lastArgs;\n\t\t\tconst s = lastThis;\n\t\t\tlastThis = lastArgs = null;\n\t\t\tfn.apply(s, a);\n\t\t}\n\t};\n\tdebounced.cancel = function() {\n\t\tif (timer !== null) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = null;\n\t\t}\n\t\tlastThis = lastArgs = null;\n\t};\n\treturn debounced;\n}\n//#endregion\n//#region src/function/delay.ts\n/**\n* 启动计时器,并在倒计时为0后调用函数。\n* 内部使用setTimeout进行倒计时,如需中断延迟可以使用clearTimeout函数。*注意,该函数并不提供防抖逻辑*\n*\n* @example\n* //1000ms 后显示some text !\n* _.delay(console.log,1000,'some text','!');\n*\n* @param fn 需要调用的函数\n* @param wait 倒计时。单位ms\n* @param args 传入定时函数的参数\n* @returns 计时器id\n*/\nfunction delay(fn, wait = 0, ...args) {\n\treturn setTimeout(() => {\n\t\tfn(...args);\n\t}, wait || 0);\n}\n//#endregion\n//#region src/function/fval.ts\n/**\n* 类似eval,对表达式进行求值并返回结果。不同于eval,fval()执行在严格模式下\n* \n* > 注意,如果页面设置了<a href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP\">CSP</a>可能会导致该函数失效\n* \n* @example\n* //5\n* console.log(_.fval('3+2'));\n* //{name:\"func.js\"}\n* console.log(_.fval(\"{name:'func.js'}\"));\n* //0\n* console.log(_.fval('1+x-b',{x:2,b:3}))\n*\n* @param expression 计算表达式\n* @param args 可选参数对象\n* @param context 可选上下文\n* @returns 表达式计算结果\n*/\nfunction fval(expression, args, context) {\n\tconst ks = args ? keys(args) : [];\n\tconst val = args ? values(args) : [];\n\treturn Function(...ks, \"\\\"use strict\\\";return \" + expression).call(context, ...val);\n}\n//#endregion\n//#region src/function/once.ts\n/**\n* 创建一个包含指定函数逻辑的包装函数并返回。该函数仅执行一次\n*\n* @example\n* //2748, undefined\n* let parseInt2 = _.once(parseInt);\n* console.log(parseInt2('abc',16),parseInt2('abc',16))\n*\n* @param fn 需要调用的函数\n* @returns 包装后的函数\n*/\nfunction once(fn) {\n\tlet proxy = fn;\n\treturn ((...args) => {\n\t\tlet rtn;\n\t\tif (proxy) {\n\t\t\tlet m = proxy;\n\t\t\tproxy = null;\n\t\t\trtn = m(...args);\n\t\t}\n\t\treturn rtn;\n\t});\n}\n//#endregion\n//#region src/function/tap.ts\n/**\n* 传递v为参数执行interceptor函数,然后返回v。常用于函数链的过程调试,比如在filter后执行日志操作\n* <p>\n* 注意,一旦函数链执行了shortcut fusion,tap函数的执行会延迟到一个数组推导完成后执行\n* </p>\n*\n* @example\n* //shortut fusion中的tap只保留最后一个\n* _([1,2,3,4])\n* .map(v=>v*3).tap(v=>console.log(v))//被覆盖\n* .filter(v=>v%2===0).tap(v=>console.log(v))//会延迟,并输出结果[6,12]\n* .join('-')\n* .value()\n*\n* @param v\n* @param interceptor (v);如果v是引用值,改变v将影响后续函数流\n* @returns v\n*/\nfunction tap(v, interceptor) {\n\tinterceptor(v);\n\treturn v;\n}\n//#endregion\n//#region src/function/throttle.ts\n/**\n* 创建一个包含指定函数逻辑的节流函数并返回。每当节流函数执行后都会等待`wait`间隔归零才可再次调用,等待期间调用函数无效。\n* 对于一些需要降低执行频率的场景非常有用,如onmousemove、onscroll等事件中\n*\n* @example\n* //每隔1秒输出当前时间\n* let log = _.throttle(console.log,1000);\n* setInterval(()=>log(new Date().toTimeString()),100)\n*\n* @param fn 需要调用的函数\n* @param wait 抖动间隔,ms\n* @param options 执行选项\n* @param options.leading 首次是否执行,默认true\n* @param options.trailing 最后一次是否执行,默认true\n* @returns 包装后的函数\n* @since 1.4.0\n*/\nfunction throttle(fn, wait, options) {\n\tlet proxy = fn;\n\tlet lastExec = 0;\n\tlet timer = null;\n\tlet timeoutArgs;\n\tlet timeoutContext;\n\toptions = options || {\n\t\tleading: true,\n\t\ttrailing: true\n\t};\n\toptions.leading = options.leading === void 0 ? true : options.leading;\n\toptions.trailing = options.trailing === void 0 ? true : options.trailing;\n\tfunction timeout() {\n\t\tif (options?.trailing) {\n\t\t\tfor (const arg of timeoutArgs) if (EventTargetMap.has(arg)) {\n\t\t\t\tlet targets = EventTargetMap.get(arg);\n\t\t\t\tlet ks = Object.keys(targets);\n\t\t\t\tfor (const k of ks) Object.defineProperty(arg, k, {\n\t\t\t\t\tvalue: targets[k],\n\t\t\t\t\twritable: false,\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: false\n\t\t\t\t});\n\t\t\t\tEventTargetMap.delete(arg);\n\t\t\t}\n\t\t\tproxy.apply(timeoutContext, timeoutArgs);\n\t\t}\n\t\tlastExec = Date.now();\n\t\ttimeoutArgs = timer = null;\n\t}\n\treturn (function(...args) {\n\t\ttimeoutArgs = args.map((arg) => {\n\t\t\tif (arg instanceof globalThis.Event) EventTargetMap.set(arg, {\n\t\t\t\tcurrentTarget: arg.currentTarget,\n\t\t\t\tfromElement: Reflect.get(arg, \"fromElement\"),\n\t\t\t\trelatedTarget: Reflect.get(arg, \"relatedTarget\"),\n\t\t\t\ttarget: arg.target,\n\t\t\t\ttoElement: Reflect.get(arg, \"toElement\")\n\t\t\t});\n\t\t\treturn arg;\n\t\t});\n\t\ttimeoutContext = this;\n\t\tlet now = Date.now();\n\t\tlet remaining = wait - (now - lastExec);\n\t\tif (remaining <= 0) {\n\t\t\tif (timer) {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\ttimeoutArgs = timer = null;\n\t\t\t}\n\t\t\tif (options?.leading) {\n\t\t\t\tproxy.apply(this, args);\n\t\t\t\tlastExec = now;\n\t\t\t} else if (options?.trailing) timer = setTimeout(timeout, wait);\n\t\t\telse lastExec = now;\n\t\t} else if (!timer) timer = setTimeout(timeout, remaining);\n\t});\n}\nvar EventTargetMap = /* @__PURE__ */ new WeakMap();\n//#endregion\n//#region src/is/isAlnum.ts\n/**\n* 判断参数是否全部为字母或数字字符串\n*\n* @example\n* //true\n* console.log(_.isAlnum('123'))\n* //true\n* console.log(_.isAlnum('123abc'))\n* //false\n* console.log(_.isAlnum(1))\n*\n* @param v\n* @returns \n* @since 1.15.0\n*/\nfunction isAlnum(v) {\n\treturn typeof v === \"string\" && v.length > 0 && /^[\\p{L}0-9]+$/u.test(v);\n}\n//#endregion\n//#region src/is/isAlpha.ts\n/**\n* 判断参数是否全部为字母,含国际字母表\n*\n* @example\n* //true\n* console.log(_.isAlpha('𰻞𰻞mian'))\n* //false\n* console.log(_.isAlpha(1))\n*\n* @param v\n* @returns \n* @since 1.15.0\n*/\nfunction isAlpha(v) {\n\treturn typeof v === \"string\" && v.length > 0 && /^\\p{L}+$/u.test(v);\n}\n//#endregion\n//#region src/is/isBlank.ts\n/**\n* 对字符串进行trim后进行验证。如果非字符串,转为字符串后进行验证\n* @example\n* //true\n* console.log(_.isBlank(' '))\n* //true\n* console.log(_.isBlank(null))\n* //false\n* console.log(_.isBlank({}))\n* //false\n* console.log(_.isBlank(' 1'))\n*\n* @param v 字符串\n* @returns 如果字符串是null/undefined/\\t \\n \\f \\r或trim后长度为0,返回true\n* @since 0.16.0\n*/\nfunction isBlank(v) {\n\tif (v === null || v === void 0) return true;\n\tconst t = typeof v;\n\tif (t === \"number\" || t === \"boolean\" || t === \"function\") return false;\n\tif (Array.isArray(v)) {\n\t\tconst n = v.length;\n\t\tif (n === 0) return true;\n\t\tif (n === 1) return isBlank(v[0]);\n\t\treturn false;\n\t}\n\tif (typeof v === \"string\") {\n\t\tif (v.length === 0) return true;\n\t\tconst c0 = v.charCodeAt(0);\n\t\tif (c0 > 32 && c0 < 127) return false;\n\t\treturn v.trim().length === 0;\n\t}\n\treturn (v + \"\").trim().length === 0;\n}\n//#endregion\n//#region src/is/isBoolean.ts\n/**\n* 判断值是不是一个布尔值\n*\n* @example\n* //true\n* console.log(_.isBoolean(false))\n* //false\n* console.log(_.isBoolean('true'))\n* //false\n* console.log(_.isBoolean(1))\n*\n* @param v\n* @returns\n*/\nfunction isBoolean(v) {\n\treturn v instanceof Boolean || Object.prototype.toString.call(v) === \"[object Boolean]\";\n}\n//#endregion\n//#region src/is/isCustomElement.ts\n/**\n* 判断值是不是自定义Element\n*\n* @example\n* //false\n* console.log(_.isCustomElement(document.body))\n* //true\n* console.log(_.isCustomElement(document.body.querySelector('l-ele')))\n*\n* @param v\n* @returns\n* @since 1.14.0\n*/\nfunction isCustomElement(v) {\n\treturn typeof v === \"object\" && v instanceof (HTMLElement || Object) && (v.shadowRoot instanceof ShadowRoot || !!customElements.get(v.tagName.toLowerCase()) || v.tagName.split(\"-\").length > 1);\n}\n//#endregion\n//#region src/is/isDefined.ts\n/**\n* isUndefined()的反向验证函数,在需要验证是否变量存在的场景下非常有用\n* @example\n* //true\n* console.log(_.isDefined(null))\n* //false\n* console.log(_.isDefined(undefined))\n*\n* @param v\n* @returns\n*/\nfunction isDefined(v) {\n\treturn v !== void 0;\n}\n//#endregion\n//#region src/is/isElement.ts\n/**\n* 判断值是不是Element的实例\n*\n* @example\n* //true\n* console.log(_.isElement(document.body))\n* //false\n* console.log(_.isElement(document))\n*\n* @param v\n* @returns\n* @since 1.0.0\n*/\nfunction isElement(v) {\n\treturn typeof v === \"object\" && v instanceof (globalThis.Element || Object);\n}\n//#endregion\n//#region src/is/isEmpty.ts\n/**\n* 判断参数是否为空,包括`null/undefined/空字符串/0/[]/{}`都表示空\n* \n* 注意:相比isBlank,isEmpty只判断字符串长度是否为0\n*\n* @example\n* //true\n* console.log(_.isEmpty(null))\n* //true\n* console.log(_.isEmpty([]))\n* //false\n* console.log(_.isEmpty({x:1}))\n*\n* @param v\n* @returns\n*/\nfunction isEmpty(v) {\n\tif (null === v) return true;\n\tif (void 0 === v) return true;\n\tif (\"\" === v) return true;\n\tif (0 === v) return true;\n\tif (isArrayLike(v) && v.length < 1) return true;\n\tif (v instanceof Map) return v.size < 1;\n\tif (v instanceof Set) return v.size < 1;\n\tif (v instanceof Object && Object.keys(v).length < 1) return true;\n\treturn false;\n}\n//#endregion\n//#region src/is/isRegExp.ts\n/**\n* 判断值是不是一个正则对象\n*\n* @example\n* //true\n* console.log(_.isRegExp(new RegExp))\n* //true\n* console.log(_.isRegExp(/1/))\n*\n* @param v\n* @returns\n* @since 0.19.0\n*/\nfunction isRegExp(v) {\n\treturn v instanceof RegExp || Object.prototype.toString.call(v) === \"[object RegExp]\";\n}\n//#endregion\n//#region src/is/isEqualWith.ts\nvar MAX_DEPTH$1 = 128;\nfunction isEqualWithInternal(a, b, comparator, depth, visited) {\n\tif (depth > MAX_DEPTH$1) return true;\n\tlet cptor = comparator;\n\tif (!isObject(a) || !isObject(b)) return (cptor || eq$1)(a, b);\n\tif (isDate(a) && isDate(b)) return cptor ? cptor(a, b) : a.getTime() === b.getTime();\n\tif (isRegExp(a) && isRegExp(b)) return cptor ? cptor(a, b) : a.toString() === b.toString();\n\tconst aKeys = Object.keys(a);\n\tif (aKeys.length !== Object.keys(b).length) return false;\n\tif (isElement(a) && isElement(b)) {\n\t\tif (a.tagName && b.tagName) {\n\t\t\tif (a.tagName.toLowerCase() !== b.tagName.toLowerCase()) return false;\n\t\t\tif (a.id !== b.id) return false;\n\t\t\tconst classListA = a.classList;\n\t\t\tconst classListB = b.classList;\n\t\t\tif (classListA && classListB) {\n\t\t\t\tif (classListA.length !== classListB.length) return false;\n\t\t\t\tfor (let i = 0; i < classListA.length; i++) if (classListA[i] !== classListB[i]) return false;\n\t\t\t}\n\t\t\treturn cptor ? cptor(a, b) : true;\n\t\t}\n\t}\n\tif (isFunction(a) && isFunction(b)) return cptor ? cptor(a, b) : a.name === b.name;\n\tconst pairKey = a;\n\tlet bMap = visited.get(pairKey);\n\tif (!bMap) {\n\t\tbMap = /* @__PURE__ */ new WeakMap();\n\t\tvisited.set(pairKey, bMap);\n\t} else if (bMap.has(b)) return true;\n\tbMap.set(b, true);\n\tconst nextDepth = depth + 1;\n\tfor (let i = aKeys.length; i--;) {\n\t\tconst k = aKeys[i];\n\t\tif (!Object.prototype.hasOwnProperty.call(b, k)) return false;\n\t\tconst v1 = a[k];\n\t\tconst v2 = b[k];\n\t\tif (!isEqualWithInternal(v1, v2, cptor, nextDepth, visited)) return false;\n\t}\n\treturn true;\n}\n/**\n* 同<code>isEqual</code>,但支持自定义比较器。如果未指定比较器则使用内置逻辑处理 \n* 内置逻辑: \n* - 如果是日期使用getTime对比\n* - 如果是正则使用toString对比\n* - 如果是元素节点使用tagName+id+class对比\n* - 如果是函数使用name对比\n* @example\n* //true\n* console.log(_.isEqualWith([new Date('2010-2-1'),'abcd'],['2010/2/1','Abcd'],(av,bv)=>_.isDate(av)?av.toLocaleDateString() == bv:_.test(av,bv,'i')))\n*\n* @param a\n* @param b\n* @param [comparator] 比较器,参数(v1,v2),返回true表示匹配。如果返回undefined使用对应内置比较器处理\n* @param _depth 内部递归深度计数器\n* @returns\n* @since 1.0.0\n*/\nfunction isEqualWith(a, b, comparator, _depth = 0) {\n\treturn isEqualWithInternal(a, b, comparator, _depth, /* @__PURE__ */ new WeakMap());\n}\n//#endregion\n//#region src/is/isEqual.ts\n/**\n* 判断两个值是否相等,对于非基本类型会进行深度比较,可以比较日期/正则/数组/对象等\n*\n* @example\n* //false\n* console.log(_.isEqual(1,'1'))\n* //true,false\n* let o = {a:1,b:[2,{c:['3','x']}]}\n* let oo = {a:1,b:[2,{c:['3','x']}]}\n* console.log(_.isEqual(o,oo),o == oo)\n* //true\n* console.log(_.isEqual([new Date('2010-2-1'),/12/],[new Date(1264953600000),new RegExp('12')]))\n* //false\n* console.log(_.isEqual([new Date('2010-2-1'),'abcd'],['2010/2/1','Abcd']))\n*\n* @param a\n* @param b\n* @returns\n* @since 1.0.0\n*/\nfunction isEqual(a, b) {\n\treturn isEqualWith(a, b);\n}\n//#endregion\n//#region src/is/isError.ts\n/**\n* 判断值是不是异常对象\n*\n* @example\n* //true\n* console.log(_.isError(new TypeError))\n* //false\n* console.log(_.isError(Error))\n* //true\n* try{a=b}catch(e){console.log(_.isError(e))}\n*\n* @param v\n* @returns\n* @since 1.0.0\n*/\nfunction isError(v) {\n\treturn v instanceof Error || Object.prototype.toString.call(v) === \"[object Error]\";\n}\n//#endregion\n//#region src/is/isFinite.ts\n/**\n* 判断值是不是有限数字\n*\n* @example\n* //false\n* console.log(_.isFinite('0'))\n* //true\n* console.log(_.isFinite(0))\n* //true\n* console.log(_.isFinite(Number.MAX_VALUE))\n* //true\n* console.log(_.isFinite(99999999999999999999999999999999999999999999999999999999999999999999999))\n* //false\n* console.log(_.isFinite(Infinity))\n*\n* @param v\n* @returns\n* @since 1.0.0\n*/\nfunction isFinite(v) {\n\treturn Number.isFinite(v);\n}\n//#endregion\n//#region src/is/isLowerCaseChar.ts\n/**\n* 判断参数是否为小写字母\n* @example\n* //false\n* console.log(_.isLowerCaseChar('A'))\n* //true\n* console.log(_.isLowerCaseChar('a'))\n* //false\n* console.log(_.isLowerCaseChar(null))\n*\n* @param v\n* @returns\n* @since 1.13.0\n*/\nfunction isLowerCaseChar(v) {\n\tif (v === null || v === void 0 || Number.isNaN(v)) return false;\n\tconst code = (v + \"\").charCodeAt(0);\n\treturn code >= 97 && code <= 122;\n}\n//#endregion\n//#region src/is/isNaN.ts\n/**\n* 判断值是否NaN本身。与全局isNaN函数相比,只有NaN值本身才会返回true\n* <p>\n* isNaN(undefined) => true <br>\n* _.isNaN(undefined) => false\n* </p>\n*\n* @example\n* //true\n* console.log(_.isNaN(NaN))\n* //false\n* console.log(_.isNaN(null))\n* //false\n* console.log(_.isNaN(undefined))\n*\n* @param v\n* @returns\n*/\nfunction isNaN$1(v) {\n\treturn Number.isNaN(v);\n}\n//#endregion\n//#region src/is/isNative.ts\n/**\n* 判断参数是否为本地函数\n*\n* @example\n* //true\n* console.log(_.isNative(Array))\n* //false\n* console.log(_.isNative(()=>{}))\n*\n* @param v\n* @returns\n*/\nfunction isNative(v) {\n\treturn typeof v === \"function\" && /native code/.test(v.toString());\n}\n//#endregion\n//#region src/is/isNull.ts\n/**\n* 判断参数是否为null\n*\n* @example\n* //true\n* console.log(_.isNull(null))\n* //false\n* console.log(_.isNull(undefined))\n*\n* @param v\n* @returns\n*/\nfunction isNull(v) {\n\treturn null === v;\n}\n//#endregion\n//#region src/is/isNumeric.ts\n/**\n* 判断参数是否为数字或数字字符串。不能判断BigInt\n*\n* @example\n* //true\n* console.log(_.isNumeric(1))\n* //true\n* console.log(_.isNumeric('-1.1'))\n* //false\n* console.log(_.isNumber('-1.1a'))\n*\n* @param v\n* @returns\n*/\nfunction isNumeric(v) {\n\tif ((v + \"\").length < 1) return false;\n\tif (isNil(v)) return false;\n\tif (Number.isNaN(v)) return false;\n\tif (isNumber(v)) return true;\n\treturn /^-?[0-9]*\\.?[0-9]+$/.test(v + \"\");\n}\n//#endregion\n//#region src/is/isPlainObject.ts\n/**\n* 判断值是不是一个朴素对象,即通过Object创建的对象\n*\n* @example\n* //false\n* console.log(_.isPlainObject(1))\n* //false\n* console.log(_.isPlainObject(new String()))\n* //true\n* console.log(_.isPlainObject({}))\n* //false\n* console.log(_.isPlainObject(null))\n* //true\n* console.log(_.isPlainObject(new Object))\n* function Obj(){}\n* //false\n* console.log(_.isPlainObject(new Obj))\n*\n* @param v value\n* @returns 是否朴素对象\n* @since 0.19.0\n*/\nfunction isPlainObject(v) {\n\treturn isObject(v) && v.constructor === Object.prototype.constructor;\n}\n//#endregion\n//#region src/types.ts\nvar PRIMITIVE_TYPES = [\n\t\"string\",\n\t\"number\",\n\t\"bigint\",\n\t\"boolean\",\n\t\"undefined\",\n\t\"symbol\"\n];\n//#endregion\n//#region src/is/isPrimitive.ts\n/**\n* 判断参数是否为原始类型\n*\n* @example\n* //true\n* console.log(_.isPrimitive(1))\n* //true\n* console.log(_.isPrimitive(null)\n* //false\n* console.log(_.isPrimitive(new String()))\n* //true\n* console.log(_.isPrimitive(123n)\n*\n* @param v\n* @returns\n*/\nfunction isPrimitive(v) {\n\treturn null === v || PRIMITIVE_TYPES.indexOf(typeof v) > -1;\n}\n//#endregion\n//#region src/is/isSafeInteger.ts\n/**\n* 判断值是不是一个安全整数\n*\n* @example\n* //true\n* console.log(_.isSafeInteger(-0))\n* //true\n* console.log(_.isSafeInteger(5.0))\n* //false\n* console.log(_.isSafeInteger(5.000000000000001))\n* //true\n* console.log(_.isSafeInteger(5.0000000000000001))\n* //false\n* console.log(_.isSafeInteger('5'))\n* //true\n* console.log(_.isSafeInteger(Number.MAX_SAFE_INTEGER))\n* //false\n* console.log(_.isSafeInteger(Number.MAX_VALUE))\n*\n* @param v\n* @returns\n*/\nfunction isSafeInteger(v) {\n\treturn Number.isSafeInteger(v);\n}\n//#endregion\n//#region src/is/isSymbol.ts\n/**\n* 判断值是不是Symbol\n*\n* @example\n* //true\n* console.log(_.isSymbol(Symbol()))\n*\n* @param v\n* @returns\n* @since 1.0.0\n*/\nfunction isSymbol(v) {\n\treturn typeof v === \"symbol\";\n}\n//#endregion\n//#region src/is/isUpperCaseChar.ts\n/**\n* 判断参数是否为大写字母\n* @example\n* //true\n* console.log(_.isUpperCaseChar('A'))\n* //false\n* console.log(_.isUpperCaseChar(null))\n*\n* @param v\n* @returns\n* @since 1.13.0\n*/\nfunction isUpperCaseChar(v) {\n\tif (v === null || v === void 0 || Number.isNaN(v)) return false;\n\tconst code = (v + \"\").charCodeAt(0);\n\treturn code >= 65 && code <= 90;\n}\n//#endregion\n//#region src/is/isWeakMap.ts\n/**\n* 判断值是不是一个WeakMap对象\n*\n* @example\n* //true\n* console.log(_.isWeakMap(new WeakMap))\n* //false\n* console.log(_.isWeakMap(new Map))\n*\n* @param v\n* @returns\n*/\nfunction isWeakMap(v) {\n\treturn v instanceof WeakMap || Object.prototype.toString.call(v) === \"[object WeakMap]\";\n}\n//#endregion\n//#region src/is/isWeakSet.ts\n/**\n* 判断值是不是一个WeakSet对象\n*\n* @example\n* //true\n* console.log(_.isWeakSet(new WeakSet))\n* //false\n* console.log(_.isWeakSet(new Set))\n*\n* @param v\n* @returns\n*/\nfunction isWeakSet(v) {\n\treturn v instanceof WeakSet || Object.prototype.toString.call(v) === \"[object WeakSet]\";\n}\n//#endregion\n//#region src/math/add.ts\n/**\n* a + b\n* @example\n* //3\n* console.log(_.add(1,2))\n* //1\n* console.log(_.add(1,null))\n* //NaN\n* console.log(_.add(1,NaN))\n* \n* @param a \n* @param b \n* @returns a+b\n* @since 1.0.0\n*/\nfunction add(a, b) {\n\ta = isNil(a) ? 0 : a;\n\tb = isNil(b) ? 0 : b;\n\treturn a + b;\n}\n//#endregion\n//#region src/math/divide.ts\n/**\n* a / b\n* @example\n* //0.5\n* console.log(_.divide(1,2))\n* //Infinity\n* console.log(_.divide(1,null))\n* //NaN\n* console.log(_.divide(1,NaN))\n* \n* @param a \n* @param b \n* @returns a/b\n* @since 1.0.0\n*/\nfunction divide(a, b) {\n\ta = isNil(a) ? 0 : a;\n\tb = isNil(b) ? 0 : b;\n\treturn a / b;\n}\n//#endregion\n//#region src/math/max.ts\n/**\n* 返回给定数字序列中最大的一个。忽略NaN,null,undefined\n* @example\n* //7\n* console.log(_.max([2,3,1,NaN,7,4,null]))\n* //6\n* console.log(_.max([4,5,6,'x','y']))\n* //Infinity\n* console.log(_.max([4,5,6,Infinity]))\n*\n* @param values 数字/字符数组/Set\n* @returns\n* @since 1.0.0\n*/\nfunction max(values) {\n\tif (!isArray(values) && !isSet(values)) return NaN;\n\tconst items = isArray(values) ? values : Array.from(values);\n\tlet rs;\n\tfor (let i = 0; i < items.length; i++) {\n\t\tconst v = items[i];\n\t\tif (!isNumeric(v)) continue;\n\t\tconst n = Number(v);\n\t\tif (rs === void 0 || n > rs) rs = n;\n\t}\n\treturn rs === void 0 ? NaN : rs;\n}\n//#endregion\n//#region src/math/mean.ts\n/**\n* 对多个数字或数字列表计算平均值并返回结果\n* @example\n* //2.5\n* console.log(_.mean([1,2,'3',4]))\n* //NaN\n* console.log(_.mean([1,'2',3,'a',4]))\n* //2\n* console.log(_.mean([1,'2',3,null,4]))\n*\n* @param values 数字/字符数组/Set\n* @returns mean value\n* @since 1.0.0\n*/\nfunction mean(values) {\n\tif (!isArray(values) && !isSet(values)) return NaN;\n\tlet total = 0;\n\tlet len = 0;\n\tconst items = isArray(values) ? values : Array.from(values);\n\tfor (let i = 0; i < items.length; i++) {\n\t\tconst v = items[i];\n\t\tlen++;\n\t\tif (isNil(v)) continue;\n\t\tif (isNumeric(v)) total += Number(v);\n\t\telse return NaN;\n\t}\n\treturn total / len;\n}\n//#endregion\n//#region src/math/median.ts\n/**\n* 对多个数字或数字列表计算中间值并返回结果\n* @example\n* //2.5\n* console.log(_.median([1,2,'3',4]))\n* //2\n* console.log(_.median([1,'2',3]))\n* //1\n* console.log(_.median([1,'2',-3]))\n*\n* @param values 数字/字符数组/Set\n* @returns median value\n* @since 1.12.0\n*/\nfunction median(values) {\n\tif (!isArray(values) && !isSet(values)) return NaN;\n\tlet sortNumbers = [];\n\tif (isArray(values)) for (let i = 0; i < values.length; i++) {\n\t\tconst v = values[i];\n\t\tif (isNumeric(v)) sortNumbers.push(Number(v));\n\t}\n\telse values.forEach((v) => {\n\t\tif (isNumeric(v)) sortNumbers.push(Number(v));\n\t});\n\tsortNumbers.sort((a, b) => a - b);\n\tlet rs;\n\tif (sortNumbers.length % 2 === 0) {\n\t\tlet i = sortNumbers.length / 2 - 1;\n\t\trs = (sortNumbers[i] + sortNumbers[i + 1]) / 2;\n\t} else rs = sortNumbers[Math.ceil(sortNumbers.length / 2) - 1];\n\treturn rs;\n}\n//#endregion\n//#region src/math/min.ts\n/**\n* 返回给定数字序列中最小的一个。忽略NaN,null,undefined\n* @example\n* //-1\n* console.log(_.min([2,3,1,7,'-1']))\n* //0\n* console.log(_.min([4,3,6,0,'x','y']))\n* //-Infinity\n* console.log(_.min([-Infinity,-9999,0,null]))\n* @param values 数字/字符数组/Set\n* @returns 如果参数不是数组/Set,返回NaN\n* @since 1.0.0\n*/\nfunction min(values) {\n\tif (!isArray(values) && !isSet(values)) return NaN;\n\tconst items = isArray(values) ? values : Array.from(values);\n\tlet rs;\n\tfor (let i = 0; i < items.length; i++) {\n\t\tconst v = items[i];\n\t\tif (!isNumeric(v)) continue;\n\t\tconst n = Number(v);\n\t\tif (rs === void 0 || n < rs) rs = n;\n\t}\n\treturn rs === void 0 ? NaN : rs;\n}\n//#endregion\n//#region src/math/minmax.ts\n/**\n* 返回min/max如果value超出范围\n* @example\n* //1\n* console.log(_.minmax([1,10,0]))\n* //6\n* console.log(_.minmax([4,8,6]))\n*\n* @param min\n* @param max\n* @param value\n* @returns\n*/\nfunction minmax(min, max, value) {\n\tif (value < min) return min;\n\tif (value > max) return max;\n\treturn value;\n}\n//#endregion\n//#region src/math/multiply.ts\n/**\n* a * b\n* @example\n* //2\n* console.log(_.multiply(1,2))\n* //0\n* console.log(_.multiply(1,null))\n* //NaN\n* console.log(_.multiply(1,NaN))\n* \n* @param a \n* @param b \n* @returns a*b\n* @since 1.0.0\n*/\nfunction multiply(a, b) {\n\ta = isNil(a) ? 0 : a;\n\tb = isNil(b) ? 0 : b;\n\treturn a * b;\n}\n//#endregion\n//#region src/math/randf.ts\nfunction randf(min, max) {\n\tif (max === void 0) {\n\t\tif (!min) return Math.random();\n\t\tmax = min;\n\t\tmin = 0;\n\t}\n\tmax = parseFloat(max + \"\") || 0;\n\tmin = parseFloat(min + \"\") || 0;\n\treturn Math.random() * (max - min) + min;\n}\n//#endregion\n//#region src/math/subtract.ts\n/**\n* a - b\n* @example\n* //-1\n* console.log(_.subtract(1,2))\n* //1\n* console.log(_.subtract(1,null))\n* //NaN\n* console.log(_.subtract(1,NaN))\n* \n* @param a \n* @param b \n* @returns a - b\n* @since 1.0.0\n*/\nfunction subtract(a, b) {\n\ta = isNil(a) ? 0 : a;\n\tb = isNil(b) ? 0 : b;\n\treturn a - b;\n}\n//#endregion\n//#region src/math/sum.ts\n/**\n* 对字符/数字数组/Set进行求和并返回结果\n* - 对nil值,自动转为0\n* - 对NaN值,返回NaN\n* - 对Infinity值,返回Infinity\n* \n* @example\n* //10\n* console.log(_.sum([1,'2',3,4]))\n* //10\n* console.log(_.sum([1,'2',3,4,null,undefined]))\n* //NaN\n* console.log(_.sum([NaN,'2',3,4]))\n* //Infinity\n* console.log(_.sum([Infinity,'2',3,4]))\n* //6\n* console.log(_.sum(new Set([1,2,3])))\n*\n* @param values 数字/字符数组/Set\n* @since 1.0.0\n* @returns\n*/\nfunction sum(values) {\n\tif (!isArray(values) && !isSet(values)) return NaN;\n\tlet total = 0;\n\tconst items = isArray(values) ? values : Array.from(values);\n\tfor (let i = 0; i < items.length; i++) {\n\t\tconst v = items[i];\n\t\tif (Number.isNaN(v)) return NaN;\n\t\tif (isNumeric(v)) total += Number(v);\n\t}\n\treturn total;\n}\n//#endregion\n//#region src/number/formatNumber.ts\nvar SUB_PATTERN_EXP = /^(?<pos>.+)((?<!\\\\=);)(?<neg>.+)$/;\nvar PATTERN_EXP = /(?<integer>[0,#]+)(?:\\.(?<fraction>[0#]+))?(?<suffix>[%\\u2030E])?/;\n/**\n* 通过表达式格式化数字\n* \n* ``` \n* #,##0.00 => 1,234.00\n* \n* #,##0.00;(#,##0.00) => 1,234.00 / (1,234.00)\n* ```\n* \n* pattern解释:\n* \n* - `0` 如果对应位置上没有数字,则用零代替。用于整数位时在位数不足时补0,用于小数位时,如果超长会截取限位并四舍五入;如果位数不足则补0\n* - `#` 如果对应位置上没有数字,不显示。用于整数位时在位数不足时原样显示,用于小数位时,如果超长会截取限位并四舍五入;如果位数不足原样显示\n* - `.` 小数分隔符,只能出现一个\n* - `,` 分组符号,如果出现多个分组符号,以最右侧为准\n* - `%` 后缀符号,数字乘100,并追加%\n* - `\\u2030` 后缀符号,数字乘1000,并追加‰\n* - `E` 后缀符号,转为科学计数法格式\n* - `;` 正/负数子模式分隔符\n*\n* @example\n* //小数位截取时会自动四舍五入\n* console.log(_.formatNumber(123.678,'0.00'))\n* //在整数位中,0不能出现在#左侧;在小数位中,0不能出现在#右侧。\n* console.log(_.formatNumber(12.1,'0##.#0')) //格式错误,返回原值\n* //当有分组出现时,0只会影响短于表达式的数字\n* console.log(_.formatNumber(12.1,',000.00'))//012.10\n* console.log(_.formatNumber(1234.1,',000.00'))//1,234.10\n* //非表达式字符会原样保留\n* console.log(_.formatNumber(1234.1,'¥,000.00元'))//¥1,234.10元\n* //转为科学计数法\n* console.log(_.formatNumber(-0.01234,'##.0000E'))//-1.2340e-2\n* //#号在小数位中会限位,整数位中不会\n* console.log(_.formatNumber(123.456,'#.##'))//123.46\n*\n* @param v 需要格式化的值,可以是数字或字符串类型\n* @param pattern 格式化模式\n*\n* @returns 格式化后的字符串或原始值字符串(如果格式无效时)或特殊值(Infinity\\u221E、NaN\\uFFFD)\n*/\nfunction formatNumber(v, pattern = \"#,##0.00\") {\n\tif (v === Infinity) return \"∞\";\n\tif (v === -Infinity) return \"-∞\";\n\tif (Number.isNaN(v)) return \"�\";\n\tlet num = parseFloat(v + \"\");\n\tif (isNaN(num)) return v + \"\";\n\tlet posPattern = pattern;\n\tlet negPattern = \"\";\n\tconst subPatterns = pattern.match(SUB_PATTERN_EXP);\n\tif (subPatterns && subPatterns.groups) {\n\t\tposPattern = subPatterns.groups.pos;\n\t\tnegPattern = subPatterns.groups.neg;\n\t}\n\tconst useNeg = num < 0 && !!negPattern;\n\treturn makeFormatter(useNeg ? negPattern : posPattern, v, useNeg)(v);\n}\nfunction makeFormatter(pattern, v, isNeg = false) {\n\tconst match = pattern.match(PATTERN_EXP);\n\tif (match == null) return (v) => v + \"\";\n\tlet integerPtn = match.groups?.integer || \"\";\n\tconst fractionPtn = match.groups?.fraction || \"\";\n\tlet suffix = match.groups?.suffix || \"\";\n\tif (!integerPtn || integerPtn.indexOf(\"0#\") > -1 || fractionPtn.indexOf(\"#0\") > -1) return (v) => v + \"\";\n\tconst ptnPart = match[0];\n\tconst endsPart = pattern.split(ptnPart);\n\tconst rnd = true;\n\tconst isPercentage = suffix === \"%\";\n\tconst isPermillage = suffix === \"‰\";\n\tconst isScientific = suffix === \"E\";\n\tconst groupMatch = integerPtn.match(/,[#0]+$/);\n\tlet groupLen = -1;\n\tlet groupReg = null;\n\tif (groupMatch) {\n\t\tgroupLen = groupMatch[0].substring(1).length;\n\t\tintegerPtn = integerPtn.replace(/^.*,(?=[^,])/, \"\");\n\t\tgroupReg = new RegExp(\"\\\\B(?=(\\\\d{\" + groupLen + \"})+$)\", \"g\");\n\t}\n\tlet zeroizeLen = integerPtn.indexOf(\"0\");\n\tif (zeroizeLen > -1) zeroizeLen = integerPtn.length - zeroizeLen;\n\tlet fixedLen = Math.max(fractionPtn.lastIndexOf(\"0\"), fractionPtn.lastIndexOf(\"#\"));\n\tif (fixedLen > -1) fixedLen += 1;\n\treturn (val) => {\n\t\tconst num = parseFloat(val + \"\");\n\t\tlet number = num;\n\t\tlet exponent = 0;\n\t\tif (isPercentage) number = number * 100;\n\t\telse if (isPermillage) number = number * 1e3;\n\t\telse if (isScientific) {\n\t\t\tconst pair = (number + \"\").split(\".\");\n\t\t\tif (number >= 1) exponent = pair[0].length - 1;\n\t\t\telse if (number < 1) {\n\t\t\t\tconst fraStr = pair[1];\n\t\t\t\texponent = fraStr.replace(/^0+/, \"\").length - fraStr.length - 1;\n\t\t\t}\n\t\t\tnumber = number / 10 ** exponent;\n\t\t}\n\t\tconst numStr = number + \"\";\n\t\tlet integer = parseInt(numStr);\n\t\tconst fraction = numStr.split(\".\")[1] || \"\";\n\t\tlet dStr = \"\";\n\t\tif (fractionPtn) {\n\t\t\tif (fraction.length >= fixedLen) {\n\t\t\t\tdStr = parseFloat(\"0.\" + fraction).toFixed(fixedLen);\n\t\t\t\tif (dStr[0] === \"1\") integer += 1;\n\t\t\t\tdStr = dStr.substring(1);\n\t\t\t} else dStr = \".\" + fractionPtn.replace(/[0#]/g, (tag, i) => {\n\t\t\t\tconst l = fraction[i];\n\t\t\t\treturn l == void 0 ? tag === \"0\" ? \"0\" : \"\" : l;\n\t\t\t});\n\t\t\tif (dStr.length < 2) dStr = \"\";\n\t\t} else {\n\t\t\tlet carry = 0;\n\t\t\tif (fraction && rnd) carry = Math.round(parseFloat(\"0.\" + fraction));\n\t\t\tinteger += carry;\n\t\t}\n\t\tlet iStr = integer + \"\";\n\t\tlet sym = num < 0 ? \"-\" : \"\";\n\t\tif (iStr[0] === \"-\" || iStr[0] === \"+\") {\n\t\t\tsym = iStr[0];\n\t\t\tiStr = iStr.substring(1);\n\t\t}\n\t\tif (groupReg && iStr.length > groupLen) {\n\t\t\tgroupReg.lastIndex = 0;\n\t\t\tiStr = iStr.replace(groupReg, \",\");\n\t\t} else if (iStr.length < integerPtn.length) {\n\t\t\tconst integerPtnLen = integerPtn.length;\n\t\t\tconst iStrLen = iStr.length;\n\t\t\tiStr = integerPtn.replace(/[0#]/g, (tag, i) => {\n\t\t\t\tif (integerPtnLen - i > iStrLen) return tag === \"0\" ? \"0\" : \"\";\n\t\t\t\tconst l = iStr[iStrLen - (integerPtnLen - i)];\n\t\t\t\treturn l == void 0 ? tag === \"0\" ? \"0\" : \"\" : l;\n\t\t\t});\n\t\t}\n\t\tif (isScientific) suffix = \"E\" + exponent;\n\t\tlet rs = (isNeg ? \"\" : sym) + iStr + dStr + suffix;\n\t\treturn (endsPart[0] || \"\") + rs + (endsPart[1] || \"\");\n\t};\n}\n//#endregion\n//#region src/number/gt.ts\n/**\n* 判断a是否大于b\n*\n* @example\n* //true\n* console.log(_.gt(2,1))\n* //false\n* console.log(_.gt(5,'5'))\n*\n* @param a\n* @param b\n* @returns\n* @since 1.0.0\n*/\nfunction gt(a, b) {\n\treturn toNumber(a) > toNumber(b);\n}\n//#endregion\n//#region src/number/gte.ts\n/**\n* 判断a是否大于等于b\n*\n* @example\n* //true\n* console.log(_.gte(2,1))\n* //true\n* console.log(_.gte(5,'5'))\n* //false\n* console.log(_.gte(5,'b'))\n*\n* @param a\n* @param b\n* @returns\n* @since 1.0.0\n*/\nfunction gte(a, b) {\n\treturn toNumber(a) >= toNumber(b);\n}\n//#endregion\n//#region src/number/lt.ts\n/**\n* 判断a是否小于b\n*\n* @example\n* //true\n* console.log(_.lt(1,2))\n* //false\n* console.log(_.lt(5,'5'))\n*\n* @param a\n* @param b\n* @returns\n* @since 1.0.0\n*/\nfunction lt(a, b) {\n\treturn toNumber(a) < toNumber(b);\n}\n//#endregion\n//#region src/number/inRange.ts\nfunction inRange(v, start = 0, end) {\n\tstart = start || 0;\n\tif (end === void 0) {\n\t\tend = start;\n\t\tstart = 0;\n\t}\n\tif (start > end) {\n\t\tconst tmp = end;\n\t\tend = start;\n\t\tstart = tmp;\n\t}\n\treturn gte(v, start) && lt(v, end);\n}\n//#endregion\n//#region src/number/lte.ts\n/**\n* 判断a是否小于等于b\n*\n* @example\n* //true\n* console.log(_.lte(1,2))\n* //true\n* console.log(_.lte(5,'5'))\n* //false\n* console.log(_.lte(5,'b'))\n*\n* @param a\n* @param b\n* @returns\n* @since 1.0.0\n*/\nfunction lte(a, b) {\n\treturn toNumber(a) <= toNumber(b);\n}\n//#endregion\n//#region src/number/toInteger.ts\n/**\n* 转换整数。小数部分会直接丢弃\n*\n* @example\n* //9\n* console.log(_.toInteger(9.99))\n* //12\n* console.log(_.toInteger('12.34'))\n* //0\n* console.log(_.toInteger(null))\n* //0\n* console.log(_.toInteger(new Error))\n*\n* @param v\n* @returns\n* @since 1.0.0\n*/\nfunction toInteger(v) {\n\tif (v === null || v === void 0) return 0;\n\treturn parseInt(v);\n}\n//#endregion\n//#region src/_checkTarget.ts\nfunction checkTarget(target) {\n\tif (target === null || target === void 0) return {};\n\tif (!isObject(target)) return new target.constructor(target);\n\tif (!Object.isExtensible(target) || Object.isFrozen(target) || Object.isSealed(target)) return target;\n}\n//#endregion\n//#region src/_eachSources.ts\nfunction eachSources(target, sources, handler, afterHandler) {\n\tfor (let s = 0; s < sources.length; s++) {\n\t\tconst src = sources[s];\n\t\tif (!isObject(src)) continue;\n\t\tconst ks = Object.keys(src);\n\t\tfor (let i = 0; i < ks.length; i++) {\n\t\t\tconst k = ks[i];\n\t\t\tlet v = src[k];\n\t\t\tif (handler) v = handler(src[k], target[k], k, src, target);\n\t\t\tafterHandler(v, src[k], target[k], k, src, target);\n\t\t}\n\t}\n}\n//#endregion\n//#region src/object/assignWith.ts\n/**\n* 与<code>assign</code>相同,但支持自定义处理器\n* \n* > 该函数会修改目标对象\n* \n* @example\n* //{x: 1, y: '3y', z: null}\n* console.log(_.assignWith({x:1},{y:3,z:4},(sv,tv,k)=>k=='z'?null:sv+k))\n*\n* @param target 目标对象\n* @param sources 源对象,可变参数。最后一个参数为函数时,签名为(src[k],target[k],k,src,target) 自定义赋值处理器,返回赋予target[k]的值\n* @returns 返回target\n*/\nfunction assignWith(target, ...sources) {\n\tconst rs = checkTarget(target);\n\tif (rs) return rs;\n\tlet src = sources;\n\tconst sl = sources.length;\n\tlet handler = src[sl - 1];\n\tif (!handler || !handler.call) handler = identity;\n\telse src = src.slice(0, sl - 1);\n\teachSources(target, src, handler, (v, sv, tv, k, s, t) => {\n\t\tt[k] = v;\n\t});\n\treturn target;\n}\n//#endregion\n//#region src/object/assign.ts\n/**\n* 将一个或多个源对象的可枚举属性值分配到目标对象。如果源对象有多个,则按照从左到右的顺序依次对target赋值,相同属性会被覆盖\n* \n* > 该函数会修改目标对象\n* \n* <ul>\n* <li>当目标对象是null/undefined时,返回空对象</li>\n* <li>当目标对象是基本类型时,返回对应的包装对象</li>\n* <li>当目标对象是不可扩展/冻结/封闭状态时,返回目标对象</li>\n* </ul>\n* @example\n* //{x:1,y:3}\n* console.log(_.assign({x:1},{y:3}))\n*\n* @param target 目标对象\n* @param sources 源对象\n* @returns 返回target\n*/\nfunction assign(target, ...sources) {\n\treturn assignWith(target, ...sources, identity);\n}\n//#endregion\n//#region src/_cloneBuiltInObject.ts\nfunction cloneBuiltInObject(obj) {\n\tlet rs = null;\n\tif (isDate(obj)) rs = new Date(obj.getTime());\n\telse if (isBoolean(obj)) rs = new Boolean(obj.valueOf());\n\telse if (isString(obj)) rs = new String(obj);\n\telse if (isRegExp(obj)) rs = new RegExp(obj);\n\telse if (isNumber(obj)) rs = new Number(obj);\n\telse if (isSet(obj)) rs = new Set(obj);\n\telse if (isMap(obj)) rs = new Map(obj);\n\treturn rs;\n}\n//#endregion\n//#region src/object/cloneWith.ts\n/**\n* 浅层复制对象,支持赋值处理器\n* 如果obj是基本类型,返回原值\n* 如果obj是函数类型,返回原值\n* 如果obj是元素类型,返回原值\n*\n* 只复制对象的自身可枚举属性\n*\n* @example\n* //{x: 1, y: 2, z: null}\n* console.log(_.cloneWith({x:1,y:2,z:3},(v,k)=>k=='z'?null:v))\n* //null\n* console.log(_.cloneWith(null))\n*\n* @param obj \n* @param handler (value,key) 自定义赋值处理器,返回赋予新对象[k]的值。默认 `identity`\n* @param skip (value,key) (value,key) 返回true 跳过clone该属性\n* @returns 被复制的新对象\n*/\nfunction cloneWith(obj, handler, skip = (value, key) => false) {\n\tif (!isObject(obj)) return obj;\n\tif (isFunction(obj)) return obj;\n\tif (isElement(obj)) return obj;\n\tlet copy = cloneBuiltInObject(obj);\n\tif (copy !== null) return copy;\n\tcopy = new obj.constructor();\n\tObject.keys(obj).forEach((p) => {\n\t\tif (skip(obj[p], p)) return;\n\t\tlet newProp = (handler || identity)(obj[p], p);\n\t\ttry {\n\t\t\tcopy[p] = newProp;\n\t\t} catch (e) {}\n\t});\n\treturn copy;\n}\n//#endregion\n//#region src/object/clone.ts\n/**\n* 浅层复制对象\n* 如果是基本类型,返回原值\n* 如果是函数类型,返回原值\n* 只复制对象的自身可枚举属性\n*\n* @example\n* //null\n* console.log(_.clone(null))\n*\n* @param obj\n* @returns 被复制的新对象\n*/\nfunction clone(obj) {\n\treturn cloneWith(obj, identity);\n}\n//#endregion\n//#region src/object/cloneDeepWith.ts\n/**\n* 完整复制对象,可以保持被复制属性的原有类型。支持赋值处理器\n*\n* 如果obj是基本类型,返回原值\n* 如果obj是函数类型,返回原值\n* 如果obj是元素类型,返回原值\n* 只复制对象的自身可枚举属性\n*\n* @example\n* //true\n* console.log(_.cloneDeepWith({d:new Date}).d instanceof Date)\n*\n* @param obj\n* @param handler (value,key,obj) 自定义赋值处理器,返回赋予新对象[k]的值,当返回对象且返回值与被复制值相同引用则跳过深度复制。默认 `clone`\n* @param skip (value,key) 返回true 跳过clone该属性\n* @returns 被复制的新对象\n*/\nfunction cloneDeepWith(obj, handler, skip = (value, key) => false) {\n\tif (!isObject(obj)) return obj;\n\tif (isFunction(obj)) return obj;\n\tif (isElement(obj)) return obj;\n\tlet copy = cloneBuiltInObject(obj);\n\tif (copy !== null) return copy;\n\tcopy = new obj.constructor();\n\tObject.keys(obj).forEach((p) => {\n\t\tif (skip(obj[p], p)) return;\n\t\tlet newProp = (handler || clone)(obj[p], p, obj);\n\t\tif (isObject(newProp) && newProp !== obj[p]) newProp = cloneDeepWith(newProp, handler);\n\t\ttry {\n\t\t\tcopy[p] = newProp;\n\t\t} catch (e) {}\n\t});\n\treturn copy;\n}\n//#endregion\n//#region src/object/cloneDeep.ts\n/**\n* 完整复制对象,可以保持被复制属性的原有类型\n*\n* 如果obj是基本类型,返回原值\n* 如果obj是函数类型,返回原值\n* 只复制对象的自身可枚举属性\n*\n* @example\n* //true\n* console.log(_.cloneDeep({d:new Date}).d instanceof Date)\n*\n* @param obj\n* @returns 被复制的新对象\n*/\nfunction cloneDeep(obj) {\n\treturn cloneDeepWith(obj, clone);\n}\n//#endregion\n//#region src/object/defaults.ts\n/**\n* 将一个或多个源对象的可枚举属性值分配到目标对象中属性值为undefined的属性上。\n* 如果源对象有多个,则按照从左到右的顺序依次对target赋值,相同属性会被忽略\n* \n* > 该函数会修改目标对象\n* \n* - 当目标对象是null/undefined时,返回空对象\n* - 当目标对象是基本类型时,返回对应的包装对象\n* - 当目标对象是不可扩展/冻结/封闭状态时,返回目标对象\n* \n* @example\n* //{a: 1, b: 2, c: 3}\n* console.log(_.defaults({a:1},{b:2},{c:3,b:1,a:2}))\n*\n* @param target 目标对象\n* @param sources 1-n个源对象\n* @returns 返回target\n* @since 0.21.0\n*/\nfunction defaults(target, ...sources) {\n\tconst rs = checkTarget(target);\n\tif (rs) return rs;\n\teachSources(target, sources, null, (v, sv, tv, k, s, t) => {\n\t\tif (t[k] === void 0) t[k] = v;\n\t});\n\treturn target;\n}\n//#endregion\n//#region src/object/defaultsDeep.ts\n/**\n* 与<code>defaults</code>相同,但会递归对象属性\n* \n* > 该函数会修改目标对象\n* \n* @example\n* //{a: {x: 1, y: 2, z: 3}, b: 2}\n* console.log(_.defaultsDeep({a:{x:1}},{b:2},{a:{x:3,y:2}},{a:{z:3,x:4}}))\n*\n* @param target 目标对象\n* @param sources 1-n个源对象\n* @returns 返回target\n* @since 0.21.0\n*/\nfunction defaultsDeep(target, ...sources) {\n\tconst rs = checkTarget(target);\n\tif (rs) return rs;\n\teachSources(target, sources, null, (v, sv, tv, k, s, t) => {\n\t\tif (tv === void 0) t[k] = v;\n\t\telse if (isObject(tv) && !isFunction(tv)) defaultsDeep(tv, sv);\n\t});\n\treturn target;\n}\n//#endregion\n//#region src/object/eq.ts\n/**\n* 判断两个值是否相等。使用<a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Same-value-zero_equality\">SameValueZero</a>\n* 算法进行值比较。\n*\n* @example\n* //true\n* console.log(_.eq(NaN,NaN))\n* //false\n* console.log(_.eq(1,'1'))\n*\n* @param a\n* @param b\n* @returns\n* @since 1.0.0\n*/\nfunction eq(a, b) {\n\treturn eq$1(a, b);\n}\n//#endregion\n//#region src/object/findKey.ts\n/**\n* 对`object`内的所有属性进行断言并返回第一个匹配的属性key\n*\n* @example\n* const libs = {\n* 'func.js':{platform:['web','nodejs'],tags:{utils:true}},\n* 'juth2':{platform:['web','java'],tags:{utils:false,middleware:true}},\n* 'soya2d':{platform:['web'],tags:{utils:true}}\n* }\n*\n* //func.js 查询对象的key\n* console.log(_.findKey(libs,'tags.utils'))\n* //juth2\n* console.log(_.findKey(libs,{'tags.utils':false}))\n* //tags\n* console.log(_.findKey(libs['soya2d'],'utils'))\n* //2\n* console.log(_.findKey([{a:1,b:2},{c:2},{d:3}],'d'))\n*\n* @param object 所有集合对象array / arrayLike / map / object / ...\n* @param predicate (value[,index|key[,collection]]) 断言\n* <br>当断言是函数时回调参数见定义\n* <br>其他类型请参考 {@link utils!iteratee}\n* @returns 第一个匹配断言的元素的key或undefined\n*/\nfunction findKey(object, predicate) {\n\tconst callback = iteratee(predicate);\n\tlet rs;\n\tfor (let k in object) {\n\t\tlet v = object[k];\n\t\tif (callback(v, k, object)) {\n\t\t\trs = k;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/object/fromPairs.ts\n/**\n* <code>toPairs</code>反函数,创建一个由键值对数组组成的对象\n*\n* @example\n* //{a:1,b:2,c:3}\n* console.log(_.fromPairs([['a', 1], ['b', 2], ['c', 3]]))\n*\n* @param pairs 键值对数组\n* @returns 对象\n*/\nfunction fromPairs(pairs) {\n\tconst rs = {};\n\tfor (let k in pairs) {\n\t\tlet pair = pairs[k];\n\t\trs[pair[0]] = pair[1];\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/object/functions.ts\n/**\n* 返回对象中的函数属性key数组\n* @example\n* const funcs = {\n* a(){},\n* b(){}\n* };\n* //[a,b]\n* console.log(_.functions(funcs))\n* //[....]\n* console.log(_.functions(_))\n*\n* @param obj\n* @returns 函数名数组\n* @since 0.18.0\n*/\nfunction functions(obj) {\n\tlet rs = [];\n\tlet ks = Object.keys(obj);\n\tfor (const k of ks) {\n\t\tlet descr = Object.getOwnPropertyDescriptor(obj, k);\n\t\tif (!descr) continue;\n\t\tif (isFunction(descr.value)) rs.push(k);\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/object/has.ts\n/**\n* 检查指定key是否存在于指定的obj中(不含prototype中)\n*\n* @example\n* //true\n* console.log(_.has({a:12},'a'))\n*\n* @param obj\n* @param key\n* @returns 如果key存在返回true\n*/\nfunction has(obj, key) {\n\treturn obj && obj.hasOwnProperty && obj.hasOwnProperty(key);\n}\n//#endregion\n//#region src/object/keysIn.ts\n/**\n* 返回对象/Map的所有key数组\n* 包括对象原型链中的属性key\n*\n* @example\n* let f = new Function(\"this.a=1;this.b=2;\");\n* f.prototype.c = 3;\n* //[a,b,c]\n* console.log(_.keysIn(new f()))\n*\n* @param obj\n* @returns key数组\n*/\nfunction keysIn(obj) {\n\tif (isMap(obj)) return Array.from(obj.keys());\n\tconst rs = [];\n\tfor (const k in obj) if (k) rs.push(k);\n\treturn rs;\n}\n//#endregion\n//#region src/_noop.ts\n/**\n* 永远返回undefined\n* @example\n* //undefined\n* console.log(_.noop('func'))\n* //undefined\n* console.log(_.noop())\n*\n* @returns undefined\n* @since 0.16.0\n*/\nfunction noop(..._args) {}\n//#endregion\n//#region src/object/mergeWith.ts\n/**\n* 与<code>merge</code>相同,但支持自定义处理器\n* \n* > 该函数会修改目标对象\n*\n* @example\n* //{x: 2, y: {a: 2, b: 4, c: 3, d: 27}}\n* console.log(_.mergeWith({x:1,y:{a:1,b:2,c:3}},{x:2,y:{a:2,d:3}},{y:{b:4}},(sv,tv,k)=>k=='d'?sv*9:undefined))\n*\n* @param target 目标对象\n* @param sources (...src[,handler(src[k],target[k],k,src,target,chain)]) \n* src - 1-n个源对象; \n* handler - 自定义赋值处理器,返回赋予target[k]的值。默认使用<code>noop</code>\n* @returns 返回target\n* @since 0.22.0\n*/\nfunction mergeWith(target, ...sources) {\n\tconst rs = checkTarget(target);\n\tif (rs) return rs;\n\tlet src = sources;\n\tconst sl = src.length;\n\tlet handler = src[sl - 1];\n\tif (!isFunction(handler)) handler = noop;\n\telse src = src.slice(0, sl - 1);\n\twalkSources(target, src, handler, []);\n\treturn target;\n}\nfunction walkSources(target, src, handler, stack) {\n\teachSources(target, src, null, (v, sv, tv, k, s, t) => {\n\t\tconst path = concat(stack, k);\n\t\tv = handler(sv, tv, k, s, t, path);\n\t\tif (v !== void 0) t[k] = v;\n\t\telse if (isObject(tv) && !isFunction(tv)) walkSources(tv, [sv], handler, path);\n\t\telse t[k] = sv;\n\t});\n}\n//#endregion\n//#region src/object/merge.ts\n/**\n* 类似<code>assign</code>,但会递归源对象的属性合并到目标对象。\n* <br>如果目标对象属性值存在,但对应源对象的属性值为undefined,跳过合并操作。\n* 支持自定义处理器,如果处理器返回值为undefined,启用默认合并。\n* 该函数在对可选配置项与默认配置项进行合并时非常有用\n*\n* > 该函数会修改目标对象\n*\n* - 当目标对象是null/undefined时,返回空对象\n* - 当目标对象是基本类型时,返回对应的包装对象\n* - 当目标对象是不可扩展/冻结/封闭状态时,返回目标对象\n*\n* @example\n* //{x: 0, y: {a: 1, b: 2, c: 3, d: 4}}\n* console.log(_.merge({x:1,y:{a:1,b:2}},{x:2,y:{c:5,d:4}},{x:0,y:{c:3}}))\n* //[{x: 0, y: {a: 1, b: 2, c: 3, d: 4}}]\n* console.log(_.merge([{x:1,y:{a:1,b:2}}],[{x:2,y:{c:5,d:4}}],[{x:0,y:{c:3}}]))\n*\n* @param target 目标对象\n* @param sources 1-n个源对象\n* @returns 返回target\n* @since 0.22.0\n*/\nfunction merge(target, ...sources) {\n\treturn mergeWith(target, ...sources, noop);\n}\n//#endregion\n//#region src/object/omitBy.ts\n/**\n* 同<code>omit</code>,但支持断言函数进行剔除\n* @example\n* //{c: '3'}\n* console.log(_.omitBy({a:1,b:2,c:'3'},_.isNumber))\n*\n* @param obj 选取对象\n* @param predicate (v,k)断言函数\n* @returns 对象子集\n* @since 0.23.0\n*/\nfunction omitBy(obj, predicate) {\n\tconst rs = {};\n\tif (obj === null || obj === void 0) return rs;\n\tconst ks = Object.keys(obj);\n\tfor (let i = 0; i < ks.length; i++) {\n\t\tconst k = ks[i];\n\t\tconst v = obj[k];\n\t\tif (!(predicate || identity)(v, k)) rs[k] = v;\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/object/omit.ts\n/**\n* 创建一个剔除指定属性的对象子集并返回。与pick()刚好相反\n* @example\n* //{a: 1, c: '3'}\n* console.log(_.omit({a:1,b:2,c:'3'},'b'))\n* //{a: 1}\n* console.log(_.omit({a:1,b:2,c:'3'},'b','c'))\n* //{c: '3'}\n* console.log(_.omit({a:1,b:2,c:'3'},['b','a']))\n*\n* @param obj 选取对象\n* @param props 属性集合\n* @returns 对象子集\n* @since 0.16.0\n*/\nfunction omit(obj, ...props) {\n\tconst keys = flatDeep(props);\n\treturn omitBy(obj, (v, k) => {\n\t\treturn keys.includes(k);\n\t});\n}\n//#endregion\n//#region src/object/parseJSON.ts\n/**\n* 解析标准/非标准JSON字符串\n* 如果str非字符串类型,返回原值\n* 如果str是无效JSON字符串,返回原值\n* \n* @example\n* //{a:1,b:2,c:'3'}\n* console.log(_.parseJSON(\"{a:1,b:2,c:'3'}\"))\n* //{a:1,b:2,c:'3\"'}\n* console.log(_.parseJSON(`[{\"a\":1,\"b\":2,\"c\":\"3\\\\\"\"}]`))\n* //true\n* console.log(_.parseJSON('true'))\n* //12\n* console.log(_.parseJSON('12'))\n* \n*\n* @param str JSON字符串\n* @param ignore 如果为true,当值为 NaN/Infinity 时忽略该属性,否则返回值对应字符串。默认false\n* @returns 解析后的对象或空对象\n* @since 1.9.0\n*/\nfunction parseJSON(str, ignore = false) {\n\tif (!isString(str)) return str;\n\tlet s = (str + \"\").replace(/:\\s*(['`])(.*)\\1(?=\\s*[},])/gm, \":\\\"$2\\\"\").replace(/([{,])\\s*(['`])?([\\p{L}0-9_$]+)\\2?\\s*:/gmu, \"$1\\\"$3\\\":\").replace(/([\\[,])(['`])(.*)\\2(?=\\s*[,\\]])/gm, \"$1\\\"$3\\\"\");\n\ts = ignore ? s.replace(/[{,]\\s*\"[a-zA-Z0-9_$]+\"\\s*:\\s*([-+]?NaN|[-+]?Infinity)\\s*/gm, \"\") : s.replace(/:\\s*([-+]?NaN|[-+]?Infinity)\\s*([,}])/gm, \":\\\"$1\\\"$2\");\n\tlet rs;\n\ttry {\n\t\trs = JSON.parse(s);\n\t} catch (e) {\n\t\trs = str;\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/object/pickBy.ts\n/**\n* 同<code>pick</code>,但支持断言函数进行选取\n* @example\n* //{a: 1, b: 2}\n* console.log(_.pickBy({a:1,b:2,c:'3'},_.isNumber))\n*\n* @param obj 选取对象\n* @param predicate (v,k)断言函数\n* @returns 对象子集\n* @since 0.23.0\n*/\nfunction pickBy(obj, predicate) {\n\tconst rs = {};\n\tif (obj === null || obj === void 0) return rs;\n\tconst ks = Object.keys(obj);\n\tfor (let i = 0; i < ks.length; i++) {\n\t\tconst k = ks[i];\n\t\tconst v = obj[k];\n\t\tif ((predicate || identity)(v, k)) rs[k] = v;\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/object/pick.ts\n/**\n* 创建一个指定属性的对象子集并返回\n* @example\n* //{b: 2}\n* console.log(_.pick({a:1,b:2,c:'3'},'b'))\n* //{b: 2,c:'3'}\n* console.log(_.pick({a:1,b:2,c:'3'},'b','c'))\n* //{a: 1, b: 2}\n* console.log(_.pick({a:1,b:2,c:'3'},['b','a']))\n*\n* @param obj 选取对象\n* @param props 属性集合\n* @returns 对象子集\n* @since 0.16.0\n*/\nfunction pick(obj, ...props) {\n\tconst keys = flatDeep(props);\n\treturn pickBy(obj, (v, k) => {\n\t\treturn includes(keys, k);\n\t});\n}\n//#endregion\n//#region src/object/toObject.ts\n/**\n* 解析传递参数并返回一个根据参数值创建的Object实例。\n* 支持数组对、k/v对、对象、混合方式等创建\n* 是 toPairs 的反函数\n*\n* @example\n* //{a:1,b:2}\n* console.log(_.toObject('a',1,'b',2))\n* //如果参数没有成对匹配,最后一个属性值则为undefined\n* //{a:1,b:2,c:undefined}\n* console.log(_.toObject('a',1,'b',2,'c'))\n* //{a:1,b:4,c:3} 重复属性会覆盖\n* console.log(_.toObject(['a',1,'b',2],['c',3],['b',4]))\n* //{a:1,b:2} 对象类型返回clone\n* console.log(_.toObject({a:1,b:2}))\n* //{1:now time,a:{}} 混合方式\n* console.log(_.toObject([1,new Date],'a',{}))\n*\n* @param vals 对象创建参数,可以是一个数组/对象或者多个成对匹配的基本类型或者多个不定的数组/对象\n* @returns 如果没有参数返回空对象\n*/\nfunction toObject(...vals) {\n\tif (vals.length === 0) return {};\n\tconst rs = {};\n\tconst pairs = [];\n\tlet key = null;\n\tvals.forEach((v) => {\n\t\tif (isArray(v)) {\n\t\t\tconst tmp = toObject(...v);\n\t\t\tassign(rs, tmp);\n\t\t} else if (isMap(v)) v.forEach((val, k) => {\n\t\t\trs[k] = val;\n\t\t});\n\t\telse if (isObject(v)) {\n\t\t\tif (key) {\n\t\t\t\tpairs.push(key, v);\n\t\t\t\tkey = null;\n\t\t\t} else assign(rs, v);\n\t\t} else if (key) {\n\t\t\tpairs.push(key, v);\n\t\t\tkey = null;\n\t\t} else key = v;\n\t});\n\tif (key) pairs.push(key);\n\tif (pairs.length > 0) for (let i = 0; i < pairs.length; i += 2) rs[pairs[i]] = pairs[i + 1];\n\treturn rs;\n}\n//#endregion\n//#region src/object/toPairs.ts\n/**\n* 返回指定对象的所有[key,value]组成的二维数组\n*\n* @example\n* //[['a', 1], ['b', 2], ['c', 3]]\n* console.log(_.toPairs({a:1,b:2,c:3}))\n*\n* @param obj\n* @returns 二维数组\n*/\nfunction toPairs(obj) {\n\tconst rs = [];\n\tfor (let k in obj) {\n\t\tlet v = obj[k];\n\t\trs.push([k, v]);\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/object/unset.ts\n/**\n* 删除obj上path路径对应属性\n* @param obj 需要设置属性值的对象,如果obj不是对象(isObject返回false),直接返回obj\n* @param path 属性路径,可以是索引数字,字符串key,或者多级属性数组\n* @since 1.0.0\n* @returns 成功返回true,失败或路径不存在返回false\n*/\nfunction unset(obj, path) {\n\tif (!isObject(obj)) return obj;\n\tconst chain = toPath(path);\n\tlet target = obj;\n\tfor (let i = 0; i < chain.length; i++) {\n\t\tconst seg = chain[i];\n\t\tconst nextSeg = chain[i + 1];\n\t\tlet tmp = target[seg];\n\t\tif (nextSeg) tmp = target[seg] = !tmp ? isNaN(parseInt(nextSeg)) ? {} : [] : tmp;\n\t\telse return delete target[seg];\n\t\ttarget = tmp;\n\t}\n\treturn false;\n}\n//#endregion\n//#region src/object/valuesIn.ts\n/**\n* 返回对象/Map的所有value数组\n* 包括原型链中的属性\n*\n* @example\n* let f = new Function(\"this.a=1;this.b=2;\");\n* f.prototype.c = 3;\n* //[1,2,3]\n* console.log(_.valuesIn(new f()))\n*\n* @param obj\n* @returns 值列表\n*/\nfunction valuesIn(obj) {\n\tif (isMap(obj)) return Array.from(obj.values());\n\treturn keysIn(obj).map((k) => obj[k]);\n}\n//#endregion\n//#region src/string/lowerFirst.ts\n/**\n* 转换字符串第一个字符为小写并返回\n*\n* @example\n* //'fIRST'\n* console.log(_.lowerFirst('FIRST'))//mixCase\n* //'love loves to love Love'\n* console.log(_.lowerFirst('Love loves to love Love'))//spaces\n*\n* @param str\n* @returns 返回新字符串\n*/\nfunction lowerFirst(str) {\n\tstr = toString(str);\n\tif (str.length < 1) return str;\n\treturn str[0].toLowerCase() + str.substring(1);\n}\n//#endregion\n//#region src/string/pascalCase.ts\n/**\n* 返回帕斯卡风格的字符串\n*\n* @example\n* //'LoveLovesToLoveLove'\n* console.log(_.pascalCase('Love loves to love Love'))//spaces\n* //'ABC'\n* console.log(_.pascalCase('a B-c'))//mixCase\n* //'GetMyUrl'\n* console.log(_.pascalCase('getMyURL'))//camelCase\n* //'AbCdEf'\n* console.log(_.pascalCase('AB_CD_EF'))//snakeCase\n* //'ABcDEfGhXy'\n* console.log(_.pascalCase('aBc D__EF_GH----XY_'))//mixCase\n*\n* @param str\n* @returns 返回新字符串\n*/\nfunction pascalCase(str) {\n\tlet rs = \"\";\n\tstr = toString(str);\n\tlet prevType = 0;\n\tfor (let i = 0; i < str.length; i++) {\n\t\tlet s = str[i];\n\t\tif (isLowerCaseChar(s) || isNumeric(s)) {\n\t\t\tif (prevType === 3 || prevType === 0) s = s.toUpperCase();\n\t\t\trs += s;\n\t\t\tprevType = 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (s === \" \" || s === \"-\" || s === \"_\") {\n\t\t\tif (prevType === 3) continue;\n\t\t\tprevType = 3;\n\t\t\tcontinue;\n\t\t}\n\t\tif (isUpperCaseChar(s)) {\n\t\t\tif (prevType === 2) s = s.toLowerCase();\n\t\t\trs += s;\n\t\t\tprevType = 2;\n\t\t}\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/string/camelCase.ts\n/**\n* 返回驼峰风格的字符串\n*\n* @example\n* //'aBC'\n* console.log(_.camelCase('a-b c'))//mixCase\n* //'loveLovesToLoveLove'\n* console.log(_.camelCase('Love loves to love Love'))//spaces\n* //'aBC'\n* console.log(_.camelCase('a B-c'))//camelCase\n* //'getMyUrl'\n* console.log(_.camelCase('getMyURL'))//camelCase\n*\n* @param str\n* @returns 返回新字符串\n*/\nfunction camelCase(str) {\n\treturn lowerFirst(pascalCase(toString(str)));\n}\n//#endregion\n//#region src/string/capitalize.ts\n/**\n* 把字符串的首字母大写,如果首字母不是ascii中的a-z则返回原值\n*\n* @example\n* //Abc\n* console.log(_.capitalize('abc'))\n* //''\n* console.log(_.capitalize(null))\n* //1\n* console.log(_.capitalize(1))\n*\n*\n* @param str 字符串\n* @returns 对于null/undefined会返回空字符串\n*/\nfunction capitalize(str) {\n\tstr = toString(str);\n\tif (str.length < 1) return str;\n\treturn str[0].toUpperCase() + toString(str.substring(1)).toLowerCase();\n}\n//#endregion\n//#region src/string/endsWith.ts\n/**\n* 验证字符串是否以查询子字符串结尾\n*\n* @example\n* //true\n* console.log(_.endsWith('func.js','js'))\n* //true\n* console.log(_.endsWith('func.js','c',4))\n*\n* @param str\n* @param searchStr 查询字符串\n* @param position 索引\n* @returns 如果以查询子字符串开头返回true,否则返回false\n*/\nfunction endsWith(str, searchStr, position) {\n\treturn toString(str).endsWith(searchStr, position);\n}\n//#endregion\n//#region src/string/escapeRegExp.ts\n/**\n* 转义正则字符串中的特殊字符,包括 '\\', '$', '(', ')', '*', '+', '.', '[', ']', '?', '^', '\\{', '\\}', '|'\n*\n* @example\n* //\\^\\[func\\.js\\] \\+ \\{crud-vue\\} = \\.\\*\\?\\$\n* console.log(_.escapeRegExp('^[func.js] + {crud-vue} = .*?$'))\n*\n* @param str 需要转义的字符串\n* @returns 转义后的新字符串\n* @since 1.0.0\n*/\nfunction escapeRegExp(str) {\n\tlet rs = \"\";\n\tstr = toString(str);\n\tfor (let i = 0; i < str.length; i++) {\n\t\tlet s = str[i];\n\t\tconst code = s.charCodeAt(0);\n\t\tif (code === 36 || code === 46 || code === 63 || code >= 40 && code <= 43 || code >= 91 && code <= 94 || code >= 123 && code <= 125) s = \"\\\\\" + s;\n\t\trs += s;\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/string/indexOf.ts\n/**\n* 查找指定值在字符串中首次出现的位置索引\n*\n* @example\n* //10\n* console.log(_.indexOf('cyberfunc.js','js'))\n* //10\n* console.log(_.indexOf('cyberfunc.js','js',5))\n*\n* @param str\n* @param search 指定字符串\n* @param fromIndex 起始索引\n* @returns 第一个匹配搜索字符串的位置索引或-1\n*/\nfunction indexOf(str, search, fromIndex = 0) {\n\tstr = toString(str);\n\treturn str.indexOf(search, fromIndex || 0);\n}\n//#endregion\n//#region src/string/kebabCase.ts\n/**\n* 返回短横线风格的字符串\n*\n* @example\n* //'a-b-c'\n* console.log(_.kebabCase('a_b_c'))//snakeCase\n* //'webkit-perspective-origin-x'\n* console.log(_.kebabCase('webkitPerspectiveOriginX'))//camelCase\n* //'a-b-c'\n* console.log(_.kebabCase('a B-c'))//mixCase\n* //'get-my-url'\n* console.log(_.kebabCase('getMyURL'))//camelCase\n*\n* @param str\n* @returns 返回新字符串\n*/\nfunction kebabCase(str) {\n\tlet rs = \"\";\n\tstr = toString(str);\n\tlet prevType = 0;\n\tlet lastPos = str.length - 1;\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst s = str[i];\n\t\tif (isLowerCaseChar(s) || isNumeric(s)) {\n\t\t\trs += s;\n\t\t\tprevType = 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (s === \" \" || s === \"-\" || s === \"_\") {\n\t\t\tif (prevType === 3 || i === lastPos) continue;\n\t\t\trs += \"-\";\n\t\t\tprevType = 3;\n\t\t\tcontinue;\n\t\t}\n\t\tif (isUpperCaseChar(s)) {\n\t\t\tif (prevType === 1) rs += \"-\";\n\t\t\trs += s.toLowerCase();\n\t\t\tprevType = 2;\n\t\t}\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/string/lastIndexOf.ts\n/**\n* 查找指定值在字符串中最后出现的位置索引\n*\n* @example\n* //10\n* console.log(_.lastIndexOf('cyberfunc.js','js'))\n* //-1\n* console.log(_.lastIndexOf('cyberfunc.js','js',5))\n*\n* @param str\n* @param search 指定字符串\n* @param fromIndex 起始索引,从起始索引位置向左查找指定字符串\n* @returns 最后一个匹配搜索字符串的位置索引或-1\n*/\nfunction lastIndexOf(str, search, fromIndex = Infinity) {\n\tstr = toString(str);\n\treturn str.lastIndexOf(search, fromIndex ?? Infinity);\n}\n//#endregion\n//#region src/string/lowerCase.ts\n/**\n* 返回所有字母是小写格式的字符串\n*\n* @example\n* //''\n* console.log(_.lowerCase())\n* //'func.js'\n* console.log(_.lowerCase('FUNC.JS'))\n*\n* @param str\n* @returns 返回新字符串\n*/\nfunction lowerCase(str) {\n\treturn toString(str).toLowerCase();\n}\n//#endregion\n//#region src/string/padStart.ts\n/**\n* 使用填充字符串填充原字符串达到指定长度。从原字符串起始开始填充。\n*\n* @example\n* //001\n* console.log(_.padStart('1',3,'0'))\n*\n* @param str 原字符串。如果非字符串则会自动转换成字符串\n* @param len 填充后的字符串长度,如果长度小于原字符串长度,返回原字符串\n* @param padString 填充字符串,如果填充后超出指定长度,会自动截取并保留右侧字符串\n* @returns 在原字符串起始填充至指定长度后的字符串\n*/\nfunction padStart(str, len, padString = \" \") {\n\tstr = toString(str);\n\tif (str.padStart) return str.padStart(len, padString);\n\tpadString = padString ?? \" \";\n\tconst diff = len - str.length;\n\tif (diff < 1) return str;\n\tlet fill = \"\";\n\tlet i = Math.ceil(diff / padString.length);\n\twhile (i--) fill += padString;\n\treturn fill.substring(fill.length - diff, fill.length) + str;\n}\n//#endregion\n//#region src/string/padZ.ts\n/**\n* 使用字符0填充原字符串达到指定长度。从原字符串起始位置开始填充。\n*\n* @example\n* //001\n* console.log(_.padZ('1',3))\n*\n* @param str 原字符串\n* @param len 填充后的字符串长度\n* @returns 填充后的字符串\n*/\nfunction padZ(str, len) {\n\treturn padStart(str, len, \"0\");\n}\n//#endregion\n//#region src/string/repeat.ts\n/**\n* 创建一个以原字符串为模板,重复指定次数的新字符串\n*\n* @example\n* //funcfuncfunc\n* console.log(_.repeat('func',3))\n*\n* @param str 原字符串\n* @param count 重复次数\n* @returns 对于null/undefined会返回空字符串\n*/\nfunction repeat(str, count) {\n\tstr = toString(str);\n\tcount = Number.isFinite(count) ? count : 0;\n\tif (count < 1) return \"\";\n\tif (str.repeat) return str.repeat(count);\n\tlet i = count;\n\tlet rs = \"\";\n\twhile (i--) rs += str;\n\treturn rs;\n}\n//#endregion\n//#region src/string/replace.ts\n/**\n* 使用<code>replaceValue</code>替换<code>str</code>中的首个<code>searchValue</code>部分\n*\n* @example\n* //'func-js'\n* console.log(_.replace('func.js','.','-'))\n* //''\n* console.log(_.replace(null,'.','-'))\n* //'kelikeli'\n* console.log(_.replace('geligeli',/ge/g,'ke'))\n* //'geligeli'\n* console.log(_.replace('kelikeli',/ke/g,()=>'ge'))\n*\n* @param str 字符串。非字符串值会自动转换成字符串\n* @param searchValue 查找内容,正则或者字符串\n* @param replaceValue 替换内容,字符串或处理函数。函数的返回值将用于替换\n* @returns 替换后的新字符串\n*/\nfunction replace(str, searchValue, replaceValue) {\n\treturn toString(str).replace(searchValue, replaceValue);\n}\n//#endregion\n//#region src/string/replaceAll.ts\n/**\n* 使用<code>replaceValue</code>替换<code>str</code>中的所有<code>searchValue</code>部分\n*\n* @example\n* //'a-b-c'\n* console.log(_.replaceAll('a.b.c','.','-'))\n* //''\n* console.log(_.replaceAll(null,'.','-'))\n* //'kelikeli'\n* console.log(_.replaceAll('geligeli',/ge/,'ke'))\n* //'geligeli'\n* console.log(_.replaceAll('kelikeli',/ke/g,()=>'ge'))\n*\n* @param str 字符串。非字符串值会自动转换成字符串\n* @param searchValue 查找内容,正则或者字符串。非global模式的正则对象会自动转为global模式\n* @param replaceValue 替换内容,字符串或处理函数。函数的返回值将用于替换\n* @returns 替换后的新字符串\n* @since 1.0.0\n*/\nfunction getGlobalRegExp(source) {\n\treturn new RegExp(source, \"g\");\n}\nfunction replaceAll(str, searchValue, replaceValue) {\n\tlet searchExp;\n\tlet strRs = toString(str);\n\tif (isRegExp(searchValue)) {\n\t\tsearchExp = searchValue.global ? searchValue : new RegExp(searchValue, searchValue.flags + \"g\");\n\t\treturn strRs.replace(searchExp, replaceValue);\n\t} else if (isString(searchValue)) {\n\t\tsearchExp = getGlobalRegExp(escapeRegExp(searchValue));\n\t\treturn strRs.replace(searchExp, replaceValue);\n\t} else if (isObject(searchValue)) {\n\t\tconst ks = Object.keys(searchValue);\n\t\tfor (let i = ks.length; i--;) {\n\t\t\tconst k = ks[i];\n\t\t\tconst v = searchValue[k];\n\t\t\tsearchExp = getGlobalRegExp(escapeRegExp(k));\n\t\t\tstrRs = strRs.replace(searchExp, v);\n\t\t}\n\t\treturn strRs;\n\t}\n\treturn str;\n}\n//#endregion\n//#region src/string/snakeCase.ts\n/**\n* 返回下划线风格的字符串\n*\n* @example\n* //'a_b_c'\n* console.log(_.snakeCase('a-b c'))//mixCase\n* //'love_loves_to_love_love'\n* console.log(_.snakeCase('Love loves to love Love'))//spaces\n* //'a_b_c'\n* console.log(_.snakeCase('a B-c'))//camelCase\n* //'get_my_url'\n* console.log(_.snakeCase('getMyURL'))//camelCase\n*\n* @param str\n* @returns 返回新字符串\n*/\nfunction snakeCase(str) {\n\tlet rs = \"\";\n\tstr = toString(str);\n\tlet prevType = 0;\n\tlet lastPos = str.length - 1;\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst s = str[i];\n\t\tif (isLowerCaseChar(s) || isNumeric(s)) {\n\t\t\trs += s;\n\t\t\tprevType = 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (s === \" \" || s === \"-\" || s === \"_\") {\n\t\t\tif (prevType === 3 || i === lastPos) continue;\n\t\t\trs += \"_\";\n\t\t\tprevType = 3;\n\t\t\tcontinue;\n\t\t}\n\t\tif (isUpperCaseChar(s)) {\n\t\t\tif (prevType === 1) rs += \"_\";\n\t\t\trs += s.toLowerCase();\n\t\t\tprevType = 2;\n\t\t}\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/string/split.ts\n/**\n* 使用分隔符将字符串分割为多段数组\n*\n* @example\n* //[\"func\", \"js\"]\n* console.log(_.split('func.js','.'))\n* //[\"func\"]\n* console.log(_.split('func.js','.',1))\n*\n* @param str 原字符串。如果非字符串则会自动转换成字符串\n* @param separator 分隔符\n* @param limit 限制返回的结果数量,为空返回所有结果\n* @returns 分割后的数组\n*/\nfunction split(str, separator, limit) {\n\treturn toString(str).split(separator, limit);\n}\n//#endregion\n//#region src/string/startsWith.ts\n/**\n* 验证字符串是否以查询子字符串开头\n*\n* @example\n* //true\n* console.log(_.startsWith('func.js','func'))\n* //false\n* console.log(_.startsWith('func.js','func',3))\n* //true\n* console.log(_.startsWith('func.js','c',3))\n*\n* @param str\n* @param searchStr 查询字符串\n* @param position 索引\n* @returns 如果以查询子字符串开头返回true,否则返回false\n*/\nfunction startsWith(str, searchStr, position = 0) {\n\tif (typeof str === \"string\") return str.startsWith(searchStr, position);\n\treturn toString(str).startsWith(searchStr, position);\n}\n//#endregion\n//#region src/string/substring.ts\n/**\n* 对字符串进行截取,返回从起始索引到结束索引间的新字符串。\n*\n* @example\n* //\"34567\"\n* console.log(_.substring('12345678',2,7))\n* //\"345678\"\n* console.log(_.substring('12345678',2))\n* //\"\"\n* console.log(_.substring())\n*\n* @param str 需要截取的字符串,如果非字符串对象会进行字符化处理。基本类型会直接转为字符值,对象类型会调用toString()方法\n* @param indexStart 起始索引,包含\n* @param indexEnd 结束索引,不包含\n* @returns\n*/\nfunction substring(str, indexStart = 0, indexEnd) {\n\tstr = toString(str);\n\tindexStart = indexStart || 0;\n\treturn str.substring(indexStart, indexEnd);\n}\n//#endregion\n//#region src/string/test.ts\n/**\n* 检测字符串是否与指定的正则匹配\n*\n* @example\n* //true 忽略大小写包含判断\n* console.log(_.test('func.js','Func','i'))\n* //true 忽略大小写相等判断\n* console.log(_.test('func.js',/^FUNC\\.js$/i))\n* //false\n* console.log(_.test('func.js',/FUNC/))\n*\n* @param str\n* @param pattern 指定正则。如果非正则类型会自动转换为正则再进行匹配\n* @param flags 如果pattern参数不是正则类型,会使用该标记作为正则构造的第二个参数\n* @returns 匹配返回true\n* @since 0.19.0\n*/\nfunction test(str, pattern, flags) {\n\tif (isRegExp(pattern)) {\n\t\tpattern.lastIndex = 0;\n\t\treturn pattern.test(str);\n\t}\n\treturn new RegExp(pattern.replace(/([+/\\\\()\\[\\].{}])/gm, \"\\\\$1\"), flags).test(str);\n}\n//#endregion\n//#region src/string/toFixed.ts\n/**\n* 截取数字小数位。用来修复原生toFixed函数的bug\n*\n* @example\n* //14.05\n* console.log(_.toFixed(14.049,2))\n* //-15\n* console.log(_.toFixed(-14.6))\n* //14.0001\n* console.log(_.toFixed(14.00005,4))\n* //0.101\n* console.log(_.toFixed(0.1009,3))\n* //2.47\n* console.log(_.toFixed(2.465,2))\n* //2.46 原生\n* console.log((2.465).toFixed(2))\n*\n* @param v 数字或数字字符串\n* @param scale 小数位长度\n* @returns 截取后的字符串\n*/\nfunction toFixed(v, scale = 0) {\n\tscale = scale || 0;\n\tconst num = parseFloat(v + \"\");\n\tif (isNaN(num)) return v;\n\tlet numStr = num + \"\";\n\tif (numStr.includes(\"e\")) {\n\t\tlet [coefficient, power] = numStr.split(\"e\");\n\t\tlet p = parseInt(power);\n\t\tlet cn = coefficient.replace(\".\", \"\");\n\t\tnumStr = p < 0 ? `0.${\"0\".repeat(-p - 1)}${cn}` : `${cn}${\"0\".repeat(p - cn.length + 1)}`;\n\t}\n\tconst isNeg = num < 0 ? -1 : 1;\n\tconst tmp = numStr.split(\".\");\n\tconst frac = tmp[1] || \"\";\n\tconst diff = scale - frac.length;\n\tlet rs = \"\";\n\tif (diff > 0) {\n\t\tlet z = padEnd(frac, scale, \"0\");\n\t\tz = z ? \".\" + z : z;\n\t\trs = tmp[0] + z;\n\t} else if (diff === 0) rs = numStr;\n\telse {\n\t\tlet integ = parseInt(tmp[0]);\n\t\tconst i = frac.length + diff;\n\t\tconst round = frac.substring(i);\n\t\tlet keep = frac.substring(0, i);\n\t\tlet startZ = false;\n\t\tif (keep[0] === \"0\" && keep.length > 1) {\n\t\t\tkeep = 1 + keep.substring(1);\n\t\t\tstartZ = true;\n\t\t}\n\t\tlet n = Math.round(parseFloat(keep + \".\" + round));\n\t\tlet nStr = keep || n > 0 ? n + \"\" : \"\";\n\t\tconst strN = keep || n > 0 ? n + \"\" : \"\";\n\t\tif (n > 0 && strN.length > keep.length) {\n\t\t\tinteg += 1 * isNeg;\n\t\t\tnStr = strN.substring(1);\n\t\t}\n\t\tif (startZ) nStr = parseInt(strN[0]) - 1 + strN.substring(1);\n\t\tnStr = nStr !== \"\" && keep.length > 0 ? \".\" + nStr : nStr;\n\t\trs = integ + nStr + \"\";\n\t\tif (isNeg < 0 && rs[0] !== \"-\") rs = \"-\" + rs;\n\t}\n\treturn rs;\n}\n//#endregion\n//#region src/string/trim.ts\n/**\n* 从字符串的两端删除空白字符。\n*\n* @example\n* //holyhigh\n* console.log(_.trim(' holyhigh '))\n*\n* @param str\n* @returns 对于null/undefined会返回空字符串\n*/\nfunction trim(str) {\n\tstr = toString(str);\n\treturn str.trim();\n}\n//#endregion\n//#region src/string/trimEnd.ts\n/**\n* 从字符串末尾删除空白字符。\n*\n* @example\n* //' holyhigh'\n* console.log(_.trimEnd(' holyhigh '))\n*\n* @param str\n* @returns 对于null/undefined会返回空字符串\n*/\nfunction trimEnd(str) {\n\tstr = toString(str);\n\tif (str.trimEnd) return str.trimEnd();\n\treturn str.replace(/\\s*$/, \"\");\n}\n//#endregion\n//#region src/string/trimStart.ts\n/**\n* 从字符串起始位置删除空白字符。\n*\n* @example\n* //'holyhigh '\n* console.log(_.trimStart(' holyhigh '))\n*\n* @param str\n* @returns 对于null/undefined会返回空字符串\n*/\nfunction trimStart(str) {\n\tstr = toString(str);\n\tif (str.trimStart) return str.trimStart();\n\treturn str.replace(/^\\s*/, \"\");\n}\n//#endregion\n//#region src/string/truncate.ts\n/**\n* 对超过指定长度的字符串进行截取并在末尾追加代替字符\n*\n* @example\n* //func...\n* console.log(_.truncate('func.js',4))\n* //func...\n* console.log(_.truncate('func.js',6,{separator:/\\.\\w+/g}))\n* //func.js.com...\n* console.log(_.truncate('func.js.com.cn',13,{separator:'.'}))\n* //func.js\n* console.log(_.truncate('func.js',10))\n* //fun!!!\n* console.log(_.truncate('func.js',3,{omission:'!!!'}))\n*\n* @param str\n* @param len 最大长度。如果长度大于<code>str</code>长度,直接返回str\n* @param options 可选项\n* @param options.omission 替代字符,默认 '...'\n* @param options.separator 截断符。如果截取后的字符串中包含截断符,则最终只会返回截断符之前的内容\n* @returns 返回新字符串\n* @since 1.0.0\n*/\nfunction truncate(str, len, options) {\n\tstr = toString(str);\n\tif (str.length <= len) return str;\n\tif (!isObject(options)) options = { omission: \"...\" };\n\toptions.omission = options.omission || \"...\";\n\tstr = str.substring(0, len);\n\tif (options.separator) {\n\t\tlet separator;\n\t\tconst rawSeparator = options.separator;\n\t\tif (!isObject(rawSeparator)) separator = new RegExp(escapeRegExp(rawSeparator), \"g\");\n\t\telse if (!rawSeparator.global) separator = new RegExp(rawSeparator.source, rawSeparator.flags + \"g\");\n\t\telse separator = rawSeparator;\n\t\tseparator.lastIndex = 0;\n\t\tlet rs;\n\t\tlet tmp;\n\t\twhile ((tmp = separator.exec(str)) !== null) rs = tmp;\n\t\tif (rs) str = str.substring(0, rs.index);\n\t}\n\treturn str + options.omission;\n}\n//#endregion\n//#region src/string/upperCase.ts\n/**\n* 返回所有字母是大写格式的字符串\n*\n* @example\n* //''\n* console.log(_.upperCase())\n* //'FUNC.JS'\n* console.log(_.upperCase('func.js'))\n*\n* @param str\n* @returns 返回新字符串\n*/\nfunction upperCase(str) {\n\treturn toString(str).toUpperCase();\n}\n//#endregion\n//#region src/string/upperFirst.ts\n/**\n* 转换字符串第一个字符为大写并返回\n*\n* @example\n* //'First'\n* console.log(_.upperFirst('first'))//mixCase\n* //'GetMyURL'\n* console.log(_.upperFirst('getMyURL'))//camelCase\n*\n* @param str\n* @returns 返回新字符串\n*/\nfunction upperFirst(str) {\n\tstr = toString(str);\n\tif (str.length < 1) return str;\n\treturn str[0].toUpperCase() + str.substring(1);\n}\n//#endregion\n//#region src/template/template.ts\n/**\n* 模板函数\n*\n* @packageDocumentation\n*/\n/**\n*\n* @author holyhigh\n*/\n/**\n* 使用MTL(Myfx Template Language)编译字符串模板,并返回编译后的render函数\n*\n* ### 一个MTL模板由如下部分组成:\n* - **文本** 原样内容输出\n* - **注释** `[%-- 注释 --%]` 仅在模板中显示,编译后不存在也不会输出\n* - **插值** `[%= 插值内容 %]` 输出表达式的结果,支持js语法\n* - **混入** `[%@名称 {参数} %]` 可以混入模板片段。被混入的片段具有独立作用域,可以通过JSON格式的对象传递参数给片段\n* - **语句** `[% _.each(xxxx... %]` 原生js语句\n*\n* @example\n* let render = _.template(\"1 [%= a %] 3\");\n* //1 4 3\n* console.log(render({a:4}))\n*\n* render = _.template(\"1 [% print(_.range(2,5)) %] 5\");\n* //1 2,3,4 5\n* console.log(render())\n*\n* render = _.template(\"[%-- 注释1 --%] [%@mix {x:5}%] [%-- 注释2 --%]\",{\n* mixins:{\n* mix:'<div>[%= x %]</div>'\n* }\n* });\n* //<div>5</div>\n* console.log(render())\n*\n* @param string 模板字符串\n* @param options MTL参数\n* @param options.delimiters 分隔符,默认 ['[%' , '%]']\n* @param options.mixins 混入对象。\\{名称:模板字符串\\}\n* @param options.globals 全局变量对象,可以在任意位置引用。模板内置的全局对象有两个:`print(content)`函数、`_` 对象,Myfx的命名空间\n* @param options.stripWhite 是否剔除空白,默认false。剔除发生在编译期间,渲染时不会受到影响。剔除规则:如果一行只有一个MTL注释或语句,则该行所占空白会被移除。\n* @returns 编译后的执行函数。该函数需要传递一个对象类型的参数作为运行时参数\n* @since 1.0.0\n*/\nfunction template(string, options) {\n\tlet delimiters = map(options?.delimiters || templateSettings.delimiters, (d) => {\n\t\treturn map(replace(d, /\\//gim, \"\"), (l) => {\n\t\t\treturn includes(ESCAPES, l) ? \"\\\\\" + l : l;\n\t\t}).join(\"\");\n\t});\n\tif (!options) options = {\n\t\tdelimiters,\n\t\tglobals: {},\n\t\tmixins: void 0,\n\t\tstripWhite: false\n\t};\n\tconst mixins = options.mixins;\n\tconst stripWhite = options.stripWhite || false;\n\tconst splitExp = getSplitExp(delimiters);\n\tsplitExp.lastIndex = 0;\n\treturn compile(parse(string, splitExp, mixins, stripWhite, delimiters), options);\n}\nvar ESCAPES = [\n\t\"[\",\n\t\"]\",\n\t\"{\",\n\t\"}\",\n\t\"$\"\n];\nfunction getSplitExp(delimiters) {\n\tconst comment = delimiters[0] + templateSettings.comment + delimiters[1];\n\tconst interpolate = delimiters[0] + templateSettings.interpolate + delimiters[1];\n\tconst evaluate = delimiters[0] + templateSettings.evaluate + delimiters[1];\n\tconst mixin = delimiters[0] + templateSettings.mixin + delimiters[1];\n\treturn new RegExp(`(?:${comment})|(?:${mixin})|(?:${interpolate})|(?:${evaluate})`, \"mg\");\n}\nfunction getModReg(delimiter) {\n\treturn new RegExp(delimiter);\n}\n/**\n* 模板设置对象\n*/\nvar templateSettings = {\n\t/**\n\t* @defaultValue ['[%', '%]']\n\t*/\n\tdelimiters: [\"[%\", \"%]\"],\n\tinterpolate: \"=([\\\\s\\\\S]+?)\",\n\tcomment: \"--[\\\\s\\\\S]+?--\",\n\tmixin: \"@([a-zA-Z_$][\\\\w_$]*)([\\\\s\\\\S]+?)\",\n\tevaluate: \"([\\\\s\\\\S]+?)\"\n};\nfunction parse(str, splitExp, mixins, stripWhite, delimiters) {\n\tlet indicator = 0;\n\tlet lastSegLength = 0;\n\tconst fullStack = [];\n\tlet prevText = null;\n\twhile (true) {\n\t\tconst rs = splitExp.exec(str);\n\t\tif (rs == null) break;\n\t\telse {\n\t\t\tlet text = str.substring(indicator + lastSegLength, rs.index);\n\t\t\tif (prevText) {\n\t\t\t\tif (stripWhite) {\n\t\t\t\t\tconst stripStart = prevText.replace(/\\n\\s*$/, \"\\n\");\n\t\t\t\t\tconst stripEnd = text.replace(/^\\s*\\n/, \"\");\n\t\t\t\t\tif (stripStart.length !== prevText.length && stripEnd.length !== text.length) text = stripEnd;\n\t\t\t\t}\n\t\t\t}\n\t\t\tprevText = text;\n\t\t\tindicator = rs.index;\n\t\t\tif (text) {\n\t\t\t\tconst node = getText(text);\n\t\t\t\tfullStack.push(node);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst node2 = parseNode(rs, mixins, delimiters);\n\t\t\t\tfullStack.push(node2);\n\t\t\t} catch (error) {\n\t\t\t\tconst tipInfo = map(takeRight(fullStack, 5), \"source\").join(\"\") + rs[0];\n\t\t\t\tlet tipIndicator = \"^\".repeat(rs[0].length);\n\t\t\t\tconst tipLineStartIndex = lastIndexOf(substring(str, 0, rs.index), \"\\n\") + 1;\n\t\t\t\ttipIndicator = padStart(tipIndicator, rs.index - tipLineStartIndex + tipIndicator.length, \" \");\n\t\t\t\tconst reason = error instanceof Error ? error.message : String(error);\n\t\t\t\tthrow new SyntaxError(\"Invalid template syntax near: \" + tipInfo + \"\\n\" + tipIndicator + \"\\n\" + reason);\n\t\t\t}\n\t\t\tlastSegLength = rs[0].length;\n\t\t}\n\t}\n\tconst lastText = str.substring(indicator + lastSegLength);\n\tif (lastText) {\n\t\tconst node = getText(lastText);\n\t\tfullStack.push(node);\n\t}\n\treturn fullStack;\n}\nfunction getText(str) {\n\treturn {\n\t\ttext: true,\n\t\tsource: str\n\t};\n}\nfunction parseNode(rs, mixins, delimiters) {\n\tconst parts = compact(rs);\n\tconst src = parts[0];\n\tswitch (src.replace(getModReg(delimiters[0]), \"\")[0]) {\n\t\tcase \"-\": return {\n\t\t\tcomment: true,\n\t\t\tsource: src\n\t\t};\n\t\tcase \"=\": return {\n\t\t\tinterpolate: true,\n\t\t\tsource: src,\n\t\t\texpression: parts[1]\n\t\t};\n\t\tcase \"@\":\n\t\t\tconst mixin = parts[1];\n\t\t\tif (!mixins || !mixins[mixin]) throw new SyntaxError(`The mixin '${mixin}' does not exist, check if the options.mixins has been set`);\n\t\t\tlet paramters = trim(parts[2]);\n\t\t\tif (paramters) {\n\t\t\t\tconst matcher = paramters.match(/\\{(?:,?[a-zA-Z_$][a-zA-Z0-9_$]*(?::.*?)?)+\\}/gm);\n\t\t\t\tif (!matcher) throw new SyntaxError(`Invalid mixin paramters '${parts[2]}', must be JSON form`);\n\t\t\t\tparamters = matcher[0];\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tmixin: true,\n\t\t\t\tsource: src,\n\t\t\t\ttmpl: mixins[mixin],\n\t\t\t\tparamters\n\t\t\t};\n\t\tdefault: return {\n\t\t\tevaluate: true,\n\t\t\tsource: src,\n\t\t\texpression: parts[1]\n\t\t};\n\t}\n}\nfunction compile(tokens, options) {\n\tlet funcStr = \"\";\n\teach(tokens, (token) => {\n\t\tif (token.comment) return;\n\t\tif (token.text) funcStr += \"\\nprint(`\" + token.source + \"`);\";\n\t\telse if (token.interpolate) funcStr += `\\nprint(${token.expression});`;\n\t\telse if (token.evaluate) funcStr += \"\\n\" + token.expression;\n\t\telse if (token.mixin) funcStr += `\\nprint(_.template(${JSON.stringify(token.tmpl)},$options)(${token.paramters}));`;\n\t});\n\treturn (obj) => {\n\t\tlet declarations = keys(obj).join(\",\");\n\t\tif (declarations) declarations = \"{\" + declarations + \"}\";\n\t\tlet globalKeys = [];\n\t\tlet globalValues = [];\n\t\tconst paramAry = unzip(toPairs(options.globals));\n\t\tif (size(paramAry) > 0) {\n\t\t\tglobalKeys = paramAry[0];\n\t\t\tglobalValues = paramAry[1];\n\t\t}\n\t\tif (!globalKeys.includes(\"_\")) {\n\t\t\tglobalKeys.push(\"_\");\n\t\t\tglobalValues.push(myfx);\n\t\t}\n\t\treturn new Function(...globalKeys, \"$options\", `return function(${declarations}){\n const textQ=[];\n const print=(str)=>{\n textQ.push(str)\n };` + funcStr + \";return textQ.join(\\\"\\\")}\")(...globalValues, options)(obj);\n\t};\n}\nvar templateApi = /* @__PURE__ */ Object.assign(template, { settings: templateSettings });\n//#endregion\n//#region src/tree/arrayToTree.ts\n/**\n* 使用高性能算法,将array结构数据变为tree结构数据。*注意,会修改原始数据*\n* @example\n* //生成测试数据\n* function addChildren(count,parent){\n* const data = [];\n* const pid = parent?parent.id:null;\n* const parentName = parent?parent.name+'-':'';\n* _.each(_.range(0,count),i=>{\n* const sortNo = _.randi(0,count);\n* data.push({id:_.alphaId(),pid,name:parentName+i,sortNo})\n* });\n* return data;\n* }\n*\n* function genTree(depth,parents,data){\n* _.each(parents,r=>{\n* const children = addChildren(_.randi(1,4),r);\n* if(depth-1>0){\n* genTree(depth-1,children,data);\n* }\n* _.append(data,...children);\n* });\n* }\n*\n* const roots = addChildren(2);\n* const data = [];\n* genTree(2,roots,data);\n* _.insert(data,0,...roots);\n*\n* const tree = _.arrayToTree(data,'id','pid',{attrMap:{text:'name'}});\n* _.walkTree(tree,(parentNode,node,chain)=>console.log('node',node.text,'sortNo',node.sortNo,'chain',_.map(chain,n=>n.name)));\n*\n*\n* @param array 原始数据集。如果非Array类型,返回空数组\n* @param idKey id标识\n* @param pidKey 父id标识\n* @param options 自定义选项\n* @param options.rootParentValue 根节点的parentValue,用于识别根节点。默认null\n* @param options.childrenKey 包含子节点容器的key。默认'children'\n* @param options.attrMap 转换tree节点时的属性映射,如\\{text:'name'\\}表示把array中一条记录的name属性映射为tree节点的text属性\n* @param options.sortKey 如果指定排序字段,则会在转换tree时自动排序。字段值可以是数字或字符等可直接进行比较的类型。性能高于转换后再排序\n* @returns 返回转换好的顶级节点数组或空数组\n* @since 1.0.0\n*/\nfunction arrayToTree(array, idKey = \"id\", pidKey = \"pid\", options = {\n\tchildrenKey: \"children\",\n\trootParentValue: null,\n\tattrMap: void 0,\n\tsortKey: \"\"\n}) {\n\tif (!isArray(array)) return [];\n\tconst pk = pidKey || \"pid\";\n\tconst attrMap = options.attrMap;\n\tconst hasAttrMap = !!attrMap && isObject(attrMap);\n\tconst rootParentValue = get(options, \"rootParentValue\", null);\n\tconst childrenKey = options.childrenKey || \"children\";\n\tconst sortKey = options.sortKey;\n\tconst hasSortKey = !!sortKey;\n\tconst roots = [];\n\tconst nodeMap = {};\n\tconst sortMap = {};\n\tconst initParentMap = {};\n\tarray.forEach((record) => {\n\t\tconst nodeId = record[idKey || \"id\"];\n\t\tnodeMap[nodeId] = record;\n\t\tif (hasSortKey) {\n\t\t\tconst sortNo = record[sortKey];\n\t\t\tsortMap[nodeId] = [sortNo, sortNo];\n\t\t}\n\t\tif (record[pk] === rootParentValue) {\n\t\t\tif (hasAttrMap) each(attrMap, (v, k) => record[k] = record[v]);\n\t\t\troots.push(record);\n\t\t}\n\t});\n\tarray.forEach((record) => {\n\t\tconst parentId = record[pk];\n\t\tconst parentNode = nodeMap[parentId];\n\t\tif (parentNode) {\n\t\t\tlet children = parentNode[childrenKey];\n\t\t\tif (!initParentMap[parentId]) {\n\t\t\t\tchildren = parentNode[childrenKey] = [];\n\t\t\t\tinitParentMap[parentId] = true;\n\t\t\t}\n\t\t\tif (hasAttrMap) each(attrMap, (v, k) => record[k] = record[v]);\n\t\t\tif (hasSortKey) {\n\t\t\t\tconst [min, max] = sortMap[parentId];\n\t\t\t\tconst sortNo = record[sortKey];\n\t\t\t\tif (sortNo <= min) {\n\t\t\t\t\tchildren.unshift(record);\n\t\t\t\t\tsortMap[parentId][0] = sortNo;\n\t\t\t\t} else if (sortNo >= max) {\n\t\t\t\t\tchildren.push(record);\n\t\t\t\t\tsortMap[parentId][1] = sortNo;\n\t\t\t\t} else {\n\t\t\t\t\tconst i = sortedIndexBy(children, { [sortKey]: sortNo }, sortKey);\n\t\t\t\t\tchildren.splice(i, 0, record);\n\t\t\t\t}\n\t\t\t} else children.push(record);\n\t\t}\n\t});\n\treturn hasSortKey ? sortBy(roots, sortKey) : roots;\n}\n//#endregion\n//#region src/tree/closest.ts\n/**\n* 根据指定的node及parentKey属性,查找最近的祖先节点\n* @param node Element节点或普通对象节点\n* @param predicate (node,times,cancel)断言函数,如果返回true表示节点匹配。或调用cancel中断查找\n* @param parentKey 父节点引用属性名\n* @param composed 是否跨越web组件边界查找,默认为false\n* @returns 断言为true的最近一个祖先节点\n* @since 1.0.0\n*/\nfunction closest(node, predicate, parentKey, composed = false) {\n\tlet p = node;\n\tlet t = null;\n\tlet k = true;\n\tlet i = 0;\n\twhile (k && p) {\n\t\tif (composed && p instanceof ShadowRoot) p = p.host;\n\t\tif (predicate(p, i++, () => {\n\t\t\tk = false;\n\t\t})) {\n\t\t\tt = p;\n\t\t\tbreak;\n\t\t}\n\t\tp = p[parentKey];\n\t}\n\treturn t;\n}\n//#endregion\n//#region src/tree/walkTree.ts\nvar MAX_DEPTH = 128;\n/**\n* 以给定节点为根遍历所有子孙节点。深度优先\n* @example\n* //生成测试数据\n* function addChildren(count,parent){\n* const data = [];\n* const pid = parent?parent.id:null;\n* const parentName = parent?parent.name+'-':'';\n* _.each(_.range(0,count),i=>{\n* const sortNo = _.randi(0,count);\n* data.push({id:_.alphaId(),pid,name:parentName+i,sortNo})\n* });\n* return data;\n* }\n*\n* function genTree(depth,parents,data){\n* _.each(parents,r=>{\n* const children = addChildren(_.randi(1,4),r);\n* if(depth-1>0){\n* genTree(depth-1,children,data);\n* }\n* _.append(data,...children);\n* });\n* }\n*\n* const roots = addChildren(2);\n* const data = [];\n* genTree(2,roots,data);\n* _.insert(data,0,...roots);\n* const tree = _.arrayToTree(data,'id','pid',{sortKey:'sortNo'});\n*\n* _.walkTree(tree,(node,parentNode,chain)=>console.log('node',node.name,'sortNo',node.sortNo,'chain',_.map(chain,n=>n.name)))\n*\n* @param treeNodes 一组节点或一个节点\n* @param callback (node,parentNode,chain,level,index)回调函数,如果返回false则中断遍历,如果返回-1则停止分支遍历\n* @param options 自定义选项\n* @param options.childrenKey 包含子节点容器的key。默认'children'\n* @since 1.0.0\n*/\nfunction walkTree(treeNodes, callback, options) {\n\t_walkTree(treeNodes, callback, options);\n}\nfunction _walkTree(treeNodes, callback, options, ...rest) {\n\tif (!isObject(treeNodes)) return;\n\toptions = options || {};\n\tconst parentNode = rest[0];\n\tconst chain = rest[1] || [];\n\tconst childrenKey = options.childrenKey || \"children\";\n\tconst data = isArrayLike(treeNodes) ? treeNodes : [treeNodes];\n\tfor (let i = 0; i < data.length; i++) {\n\t\tconst node = data[i];\n\t\tconst rs = callback(node, parentNode, chain, chain.length, i);\n\t\tif (rs === false) return false;\n\t\tif (rs === -1) continue;\n\t\tif (!isEmpty(node[childrenKey])) {\n\t\t\tif (chain.length >= MAX_DEPTH) continue;\n\t\t\tchain.push(node);\n\t\t\tconst childRs = _walkTree(node[childrenKey], callback, options, node, chain);\n\t\t\tchain.pop();\n\t\t\tif (childRs === false) return;\n\t\t}\n\t}\n}\n//#endregion\n//#region src/tree/filterTree.ts\n/**\n* 类似<code>findTreeNodes</code>,但会返回包含所有父节点的节点副本数组,已做去重处理。\n* 结果集可用于重新构建tree\n* @example\n* //生成测试数据\n* function addChildren(count,parent){\n* const data = [];\n* const pid = parent?parent.id:null;\n* const parentName = parent?parent.name+'-':'';\n* _.each(_.range(0,count),i=>{\n* const sortNo = _.randi(1,4);\n* data.push({id:_.alphaId(),pid,name:parentName+i,sortNo})\n* });\n* return data;\n* }\n*\n* function genTree(depth,parents,data){\n* _.each(parents,r=>{\n* const children = addChildren(_.randi(1,4),r);\n* if(depth-1>0){\n* genTree(depth-1,children,data);\n* }\n* _.append(data,...children);\n* });\n* }\n*\n* const roots = addChildren(2);\n* const data = [];\n* genTree(2,roots,data);\n* _.insert(data,0,...roots);\n* const tree = _.arrayToTree(data,'id','pid',{sortKey:'sortNo'});\n*\n* _.each(_.filterTree(tree,node=>node.sortNo>1),node=>console.log(_.omit(node,'children','id','pid')))\n*\n*\n* @param treeNodes 一组节点或一个节点\n* @param predicate (node,parentNode,chain,level) 断言\n* <br>当断言是函数时回调参数见定义\n* <br>其他类型请参考 {@link utils!iteratee}\n* @param options 自定义选项\n* @param options.childrenKey 包含子节点容器的key。默认'children'\n* @returns 找到的符合条件的所有节点副本或空数组\n* @since 1.0.0\n*/\nfunction filterTree(treeNodes, predicate, options = { childrenKey: \"children\" }) {\n\tconst callback = iteratee(predicate);\n\tconst childrenKey = options.childrenKey || \"children\";\n\tlet nodes = [];\n\twalkTree(treeNodes, (n, p, c, l) => {\n\t\tif (callback(n, p, c, l)) {\n\t\t\tc.forEach((node) => {\n\t\t\t\tif (!includes(nodes, node)) nodes.push(node);\n\t\t\t});\n\t\t\tnodes.push(n);\n\t\t}\n\t}, options);\n\tnodes = map(nodes, (item) => cloneWith(item, (v, k) => k === childrenKey ? null : v));\n\treturn nodes;\n}\n//#endregion\n//#region src/tree/findTreeNode.ts\nfunction findTreeNode(treeNodes, predicate, options) {\n\tconst callback = iteratee(predicate);\n\tlet node;\n\twalkTree(treeNodes, (n, p, c, l, i) => {\n\t\tif (callback(n, p, c, l, i)) {\n\t\t\tnode = n;\n\t\t\treturn false;\n\t\t}\n\t}, options);\n\treturn node;\n}\n//#endregion\n//#region src/tree/findTreeNodes.ts\nfunction findTreeNodes(treeNodes, predicate, options) {\n\tconst callback = iteratee(predicate);\n\tconst nodes = [];\n\twalkTree(treeNodes, (n, p, c, l, i) => {\n\t\tif (callback(n, p, c, l, i)) nodes.push(n);\n\t}, options);\n\treturn nodes;\n}\n//#endregion\n//#region src/tree/sortTree.ts\n/**\n* 对给定节点及所有子孙节点(同级)排序\n* @example\n* //生成测试数据\n* function addChildren(count,parent){\n* const data = [];\n* const pid = parent?parent.id:null;\n* const parentName = parent?parent.name+'-':'';\n* _.each(_.range(0,count),i=>{\n* const sortNo = _.randi(0,9);\n* data.push({id:_.alphaId(),pid,name:parentName+i,sortNo})\n* });\n* return data;\n* }\n*\n* function genTree(depth,parents,data){\n* _.each(parents,r=>{\n* const children = addChildren(_.randi(1,4),r);\n* if(depth-1>0){\n* genTree(depth-1,children,data);\n* }\n* _.append(data,...children);\n* });\n* }\n*\n* const roots = addChildren(1);\n* const data = [];\n* genTree(2,roots,data);\n* _.insert(data,0,...roots);\n* let tree = _.arrayToTree(data,'id','pid');\n*\n* console.log('Before sort---------------');\n* _.walkTree(_.cloneDeep(tree),(parentNode,node,chain)=>console.log('node',node.name,'sortNo',node.sortNo))\n* _.sortTree(tree,(a,b)=>a.sortNo - b.sortNo);\n* console.log('After sort---------------');\n* _.walkTree(tree,(parentNode,node,chain)=>console.log('node',node.name,'sortNo',node.sortNo))\n*\n* @param treeNodes 一组节点或一个节点\n* @param comparator (a,b) 排序函数\n* @param options 自定义选项\n* @param options.childrenKey 包含子节点容器的key。默认'children'\n*\n* @since 1.0.0\n*/\nfunction sortTree(treeNodes, comparator, options = { childrenKey: \"children\" }) {\n\tconst childrenKey = options.childrenKey || \"children\";\n\tconst data = isArray(treeNodes) ? treeNodes : [treeNodes];\n\tdata.sort((a, b) => comparator(a, b));\n\tdata.forEach((node) => {\n\t\tif (!isEmpty(node[childrenKey])) sortTree(node[childrenKey], comparator);\n\t});\n}\n//#endregion\n//#region src/utils/alphaId.ts\nvar ALPHABET = /* @__PURE__ */ \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\".split(\"\");\n/**\n* 生成一个指定长度的alphaId并返回。id内容由随机字母表字符组成\n* @example\n* // urN-k0mpetBwboeQ\n* console.log(_.alphaId())\n* // Ii6cPyfw-Ql5YC8OIhVwH1lpGY9x\n* console.log(_.alphaId(28))\n*\n* @param len id长度\n* @returns alphaId\n* @since 1.0.0\n*/\nfunction alphaId(len = 16) {\n\tconst bytes = globalThis.crypto.getRandomValues(new Uint8Array(len || 16));\n\tlet rs = \"\";\n\tfor (let i = 0; i < bytes.length; i++) rs += ALPHABET[bytes[i] % ALPHABET.length];\n\treturn rs;\n}\n//#endregion\n//#region src/utils/defaultTo.ts\n/**\n* 如果v是null/undefined/NaN中的一个,返回defaultValue\n* @example\n* //\"x\"\n* console.log(_.defaultTo(null,'x'))\n* //0\n* console.log(_.defaultTo(0,'y'))\n*\n* @param v 任何值\n* @param defaultValue 任何值\n* @returns v或defaultValue\n* @since 0.16.0\n*/\nfunction defaultTo(v, defaultValue) {\n\tif (v === null || v === void 0 || Number.isNaN(v)) return defaultValue;\n\treturn v;\n}\n//#endregion\n//#region src/utils/identity.ts\nvar identity_default = identity;\n//#endregion\n//#region src/utils/iteratee.ts\nvar iteratee_default = iteratee;\n//#endregion\n//#region src/utils/mixin.ts\n/**\n* 为 myfx 扩展额外函数,扩展后的函数同样具有函数链访问能力\n*\n* @example\n* //增加扩展\n* _.mixin({\n* select:_.get,\n* from:_.chain,\n* where:_.filter,\n* top:_.first\n* });\n*\n* const libs = [\n* {name:'myfx',platform:['web','nodejs'],tags:{utils:true},js:true},\n* {name:'juth2',platform:['web','java'],tags:{utils:false,middleware:true},js:false},\n* {name:'soya2d',platform:['web'],tags:{utils:true},js:true}\n* ];\n* //查询utils是true的第一行数据的name值\n* console.log(_.from(libs).where({tags:{utils:true}}).top().select('name').value())\n*\n* @param obj 扩展的函数声明\n*/\nfunction mixin(target, obj) {\n\tfunctions(obj).forEach((fnName) => {\n\t\tconst fn = obj[fnName];\n\t\tif (target.prototype && target.prototype.constructor.name === \"FuncChain\") target.prototype[\"_\" + fnName] = function(...rest) {\n\t\t\tthis._chain.push({\n\t\t\t\tfn,\n\t\t\t\tparams: rest\n\t\t\t});\n\t\t\treturn this;\n\t\t};\n\t\telse target[\"_\" + fnName] = fn;\n\t});\n}\n//#endregion\n//#region src/utils/noop.ts\nvar noop_default = noop;\n//#endregion\n//#region src/utils/snowflakeId.ts\n/**\n* 生成一个64bit整数的雪花id并返回,具体格式如下:\n* <code>\n* 0 - timestamp - nodeId - sequence<br>\n* 0 - [0000000000 0000000000 0000000000 0000000000 0] - [0000000000] - [000000000000]\n* </code>\n* 可用于客户端生成可跟踪统计的id,如定制终端\n* @example\n* // 343155438738309188\n* console.log(_.snowflakeId(123))\n* // 78249955004317758\n* console.log(_.snowflakeId(456,new Date(2022,1,1).getTime()))\n*\n* @param nodeId 节点id,10bit整数\n* @param epoch 时间起点,用于计算相对时间戳\n* @returns snowflakeId 由于js精度问题,直接返回字符串而不是number,如果nodeId为空返回 '0000000000000000000'\n* @since 1.0.0\n*/\nfunction snowflakeId(nodeId, epoch = 15804864e5) {\n\tepoch = epoch || 15804864e5;\n\tif (isNil(nodeId)) return \"0000000000000000000\";\n\tlet nowTime = Date.now();\n\tif (lastTimeStamp === nowTime) {\n\t\tsequence += randi(1, 9);\n\t\tif (sequence > 4095) {\n\t\t\tnowTime = _getNextTime(lastTimeStamp);\n\t\t\tsequence = randi(0, 99);\n\t\t}\n\t} else sequence = randi(0, 99);\n\tlastTimeStamp = nowTime;\n\tconst timeOffset = (nowTime - epoch).toString(2);\n\tconst nodeBits = padEnd((nodeId % 1023).toString(2) + \"\", 10, \"0\");\n\tconst seq = padZ(sequence.toString(2) + \"\", 12);\n\treturn BigInt(`0b${timeOffset}${nodeBits}${seq}`).toString();\n}\nvar lastTimeStamp = -1;\nvar sequence = 0;\nvar _getNextTime = (lastTime) => {\n\tlet t = Date.now();\n\twhile (t <= lastTime) t = Date.now();\n\treturn t;\n};\n//#endregion\n//#region src/utils/times.ts\n/**\n* 调用iteratee函数n次,并将历次调用的返回值数组作为结果返回\n* @example\n* //['0',...,'4']\n* console.log(_.times(5,String))\n* //[[0],[1]]\n* console.log(_.times(2,_.toArray))\n*\n* @param n 迭代次数\n* @param iteratee 每次迭代调用函数\n* @returns 返回值数组\n* @since 0.17.0\n*/\nfunction times(n, iteratee) {\n\treturn range(n).map(iteratee);\n}\n//#endregion\n//#region src/utils/uniqueId.ts\n/**\n* 返回一个全局的整数id,序号从0开始。可以用于前端列表编号等用途\n*\n* @example\n* //func_0\n* console.log(_.uniqueId('func'))\n* //1\n* console.log(_.uniqueId())\n*\n* @param prefix id前缀\n* @returns 唯一id\n* @since 0.16.0\n*/\nfunction uniqueId(prefix) {\n\treturn (prefix !== void 0 ? prefix + \"_\" : \"\") + seed++;\n}\nvar seed = 0;\n//#endregion\n//#region src/utils/uuid.ts\nvar VARIANTS = [\n\t\"8\",\n\t\"9\",\n\t\"a\",\n\t\"b\"\n];\n/**\n* 生成一个32/36个字符组件的随机uuid(v4)并返回\n* @example\n* // ddfd73a5-62ac-4412-ad2b-fd495f766caf\n* console.log(_.uuid(true))\n* // ddfd73a562ac4412ad2bfd495f766caf\n* console.log(_.uuid())\n*\n* @param delimiter 是否生成分隔符\n* @returns uuid\n* @since 1.0.0\n*/\nfunction uuid(delimiter) {\n\tlet uuid = \"\";\n\tif (globalThis.crypto && globalThis.crypto.randomUUID) uuid = globalThis.crypto.randomUUID();\n\telse {\n\t\tconst r32 = Math.random();\n\t\tconst r16 = Math.random();\n\t\tconst p1Num = Math.floor(r32 * 4026531839) + 268435456;\n\t\tconst p1 = p1Num.toString(16);\n\t\tconst p2Num = Math.floor(r16 * 61439) + 4096;\n\t\tconst p2 = p2Num.toString(16);\n\t\tconst p3 = substring((p2Num << 1).toString(16), 0, 3);\n\t\tconst p4 = substring((p2Num >> 1).toString(16), 0, 3);\n\t\tlet p5 = Date.now().toString(16);\n\t\tp5 = substring((p1Num >> 1).toString(16), 0, 6) + substring(p5, p5.length - 6, p5.length);\n\t\tuuid = p1 + \"-\" + p2 + \"-4\" + p3 + \"-\" + VARIANTS[randi(0, 3)] + p4 + \"-\" + p5;\n\t}\n\treturn delimiter ? uuid : uuid.replace(/-/g, \"\");\n}\n//#endregion\n//#region src/chain.ts\n/**\n* chain 函数集\n*/\nvar ChainFx = class {\n\tappend(...values) {\n\t\treturn get(FuncChain.prototype, \"_append\").call(this, ...arguments);\n\t}\n\tchunk(size = 1) {\n\t\treturn get(FuncChain.prototype, \"_chunk\").call(this, ...arguments);\n\t}\n\tcompact() {\n\t\treturn get(FuncChain.prototype, \"_compact\").call(this, ...arguments);\n\t}\n\tconcat() {\n\t\treturn get(FuncChain.prototype, \"_concat\").call(this, ...arguments);\n\t}\n\texcept() {\n\t\treturn get(FuncChain.prototype, \"_except\").call(this, ...arguments);\n\t}\n\tfill(value, start = 0, end) {\n\t\treturn get(FuncChain.prototype, \"_fill\").call(this, ...arguments);\n\t}\n\tfindIndex(predicate, fromIndex) {\n\t\treturn get(FuncChain.prototype, \"_findIndex\").call(this, ...arguments);\n\t}\n\tfindLastIndex(predicate, fromIndex) {\n\t\treturn get(FuncChain.prototype, \"_findLastIndex\").call(this, ...arguments);\n\t}\n\tflat(depth = 1) {\n\t\treturn get(FuncChain.prototype, \"_flat\").call(this, ...arguments);\n\t}\n\tflatDeep() {\n\t\treturn get(FuncChain.prototype, \"_flatDeep\").call(this, ...arguments);\n\t}\n\tinsert(index, ...values) {\n\t\treturn get(FuncChain.prototype, \"_insert\").call(this, ...arguments);\n\t}\n\tintersect() {\n\t\treturn get(FuncChain.prototype, \"_intersect\").call(this, ...arguments);\n\t}\n\tjoin(separator = \",\") {\n\t\treturn get(FuncChain.prototype, \"_join\").call(this, ...arguments);\n\t}\n\tpop(index = -1) {\n\t\treturn get(FuncChain.prototype, \"_pop\").call(this, ...arguments);\n\t}\n\tpull(...values) {\n\t\treturn get(FuncChain.prototype, \"_pull\").call(this, ...arguments);\n\t}\n\trange(end, step = 1) {\n\t\treturn get(FuncChain.prototype, \"_range\").call(this, ...arguments);\n\t}\n\tremove(predicate) {\n\t\treturn get(FuncChain.prototype, \"_remove\").call(this, ...arguments);\n\t}\n\treverse() {\n\t\treturn get(FuncChain.prototype, \"_reverse\").call(this, ...arguments);\n\t}\n\tslice(begin = 0, end) {\n\t\treturn get(FuncChain.prototype, \"_slice\").call(this, ...arguments);\n\t}\n\tsortedIndex(value) {\n\t\treturn get(FuncChain.prototype, \"_sortedIndex\").call(this, ...arguments);\n\t}\n\tsortedIndexBy(value, itee) {\n\t\treturn get(FuncChain.prototype, \"_sortedIndexBy\").call(this, ...arguments);\n\t}\n\tunion() {\n\t\treturn get(FuncChain.prototype, \"_union\").call(this, ...arguments);\n\t}\n\tuniq() {\n\t\treturn get(FuncChain.prototype, \"_uniq\").call(this, ...arguments);\n\t}\n\tuniqBy(itee) {\n\t\treturn get(FuncChain.prototype, \"_uniqBy\").call(this, ...arguments);\n\t}\n\tunzip() {\n\t\treturn get(FuncChain.prototype, \"_unzip\").call(this, ...arguments);\n\t}\n\twithout(...values) {\n\t\treturn get(FuncChain.prototype, \"_without\").call(this, ...arguments);\n\t}\n\tzip() {\n\t\treturn get(FuncChain.prototype, \"_zip\").call(this, ...arguments);\n\t}\n\tzipObject(values) {\n\t\treturn get(FuncChain.prototype, \"_zipObject\").call(this, ...arguments);\n\t}\n\tzipWith() {\n\t\treturn get(FuncChain.prototype, \"_zipWith\").call(this, ...arguments);\n\t}\n\tcountBy(itee = identity_default) {\n\t\treturn get(FuncChain.prototype, \"_countBy\").call(this, ...arguments);\n\t}\n\tevery(predicate) {\n\t\treturn get(FuncChain.prototype, \"_every\").call(this, ...arguments);\n\t}\n\tfilter(predicate) {\n\t\treturn get(FuncChain.prototype, \"_filter\").call(this, ...arguments);\n\t}\n\tfind(predicate) {\n\t\treturn get(FuncChain.prototype, \"_find\").call(this, ...arguments);\n\t}\n\tfindLast(predicate) {\n\t\treturn get(FuncChain.prototype, \"_findLast\").call(this, ...arguments);\n\t}\n\tfirst() {\n\t\treturn get(FuncChain.prototype, \"_first\").call(this, ...arguments);\n\t}\n\tflatMap(itee = identity_default, depth = 1) {\n\t\treturn get(FuncChain.prototype, \"_flatMap\").call(this, ...arguments);\n\t}\n\tflatMapDeep(iteratee = identity_default) {\n\t\treturn get(FuncChain.prototype, \"_flatMapDeep\").call(this, ...arguments);\n\t}\n\tgroupBy(iteratee = identity_default) {\n\t\treturn get(FuncChain.prototype, \"_groupBy\").call(this, ...arguments);\n\t}\n\tincludes(value, fromIndex = 0) {\n\t\treturn get(FuncChain.prototype, \"_includes\").call(this, ...arguments);\n\t}\n\tinitial() {\n\t\treturn get(FuncChain.prototype, \"_initial\").call(this, ...arguments);\n\t}\n\tkeyBy(iteratee = identity_default) {\n\t\treturn get(FuncChain.prototype, \"_keyBy\").call(this, ...arguments);\n\t}\n\tlast() {\n\t\treturn get(FuncChain.prototype, \"_last\").call(this, ...arguments);\n\t}\n\tmap(iteratee = identity_default) {\n\t\treturn get(FuncChain.prototype, \"_map\").call(this, ...arguments);\n\t}\n\tpartition(predicate) {\n\t\treturn get(FuncChain.prototype, \"_partition\").call(this, ...arguments);\n\t}\n\treduce(callback, initialValue) {\n\t\treturn get(FuncChain.prototype, \"_reduce\").call(this, ...arguments);\n\t}\n\treject(predicate) {\n\t\treturn get(FuncChain.prototype, \"_reject\").call(this, ...arguments);\n\t}\n\tsample() {\n\t\treturn get(FuncChain.prototype, \"_sample\").call(this, ...arguments);\n\t}\n\tsampleSize(count = 1) {\n\t\treturn get(FuncChain.prototype, \"_sampleSize\").call(this, ...arguments);\n\t}\n\tshuffle() {\n\t\treturn get(FuncChain.prototype, \"_shuffle\").call(this, ...arguments);\n\t}\n\tsize() {\n\t\treturn get(FuncChain.prototype, \"_size\").call(this, ...arguments);\n\t}\n\tsome(predicate) {\n\t\treturn get(FuncChain.prototype, \"_some\").call(this, ...arguments);\n\t}\n\tsort(comparator) {\n\t\treturn get(FuncChain.prototype, \"_sort\").call(this, ...arguments);\n\t}\n\tsortBy(iteratee = identity_default) {\n\t\treturn get(FuncChain.prototype, \"_sortBy\").call(this, ...arguments);\n\t}\n\ttail() {\n\t\treturn get(FuncChain.prototype, \"_tail\").call(this, ...arguments);\n\t}\n\ttake(length) {\n\t\treturn get(FuncChain.prototype, \"_take\").call(this, ...arguments);\n\t}\n\ttakeRight(length) {\n\t\treturn get(FuncChain.prototype, \"_takeRight\").call(this, ...arguments);\n\t}\n\ttoArray() {\n\t\treturn get(FuncChain.prototype, \"_toArray\").call(this, ...arguments);\n\t}\n\taddTime(amount, type = \"s\") {\n\t\treturn get(FuncChain.prototype, \"_addTime\").call(this, ...arguments);\n\t}\n\tcompareDate(date2, type = \"d\") {\n\t\treturn get(FuncChain.prototype, \"_compareDate\").call(this, ...arguments);\n\t}\n\tformatDate(pattern = \"yyyy-MM-dd HH:mm:ss\") {\n\t\treturn get(FuncChain.prototype, \"_formatDate\").call(this, ...arguments);\n\t}\n\tgetDayOfYear() {\n\t\treturn get(FuncChain.prototype, \"_getDayOfYear\").call(this, ...arguments);\n\t}\n\tgetWeekOfMonth() {\n\t\treturn get(FuncChain.prototype, \"_getWeekOfMonth\").call(this, ...arguments);\n\t}\n\tgetWeekOfYear() {\n\t\treturn get(FuncChain.prototype, \"_getWeekOfYear\").call(this, ...arguments);\n\t}\n\tisLeapYear() {\n\t\treturn get(FuncChain.prototype, \"_isLeapYear\").call(this, ...arguments);\n\t}\n\tisSameDay(date2) {\n\t\treturn get(FuncChain.prototype, \"_isSameDay\").call(this, ...arguments);\n\t}\n\tnow() {\n\t\treturn get(FuncChain.prototype, \"_now\").call(this, ...arguments);\n\t}\n\ttoDate() {\n\t\treturn get(FuncChain.prototype, \"_toDate\").call(this, ...arguments);\n\t}\n\tafter(count = 0) {\n\t\treturn get(FuncChain.prototype, \"_after\").call(this, ...arguments);\n\t}\n\talt(interceptor1, interceptor2) {\n\t\treturn get(FuncChain.prototype, \"_alt\").call(this, ...arguments);\n\t}\n\tbind(thisArg, ...args) {\n\t\treturn get(FuncChain.prototype, \"_bind\").call(this, ...arguments);\n\t}\n\tbindAll(...methodNames) {\n\t\treturn get(FuncChain.prototype, \"_bindAll\").call(this, ...arguments);\n\t}\n\tcall(...args) {\n\t\treturn get(FuncChain.prototype, \"_call\").call(this, ...arguments);\n\t}\n\tcompose() {\n\t\treturn get(FuncChain.prototype, \"_compose\").call(this, ...arguments);\n\t}\n\tdebounce(wait, immediate = false) {\n\t\treturn get(FuncChain.prototype, \"_debounce\").call(this, ...arguments);\n\t}\n\tdelay(wait = 0, ...args) {\n\t\treturn get(FuncChain.prototype, \"_delay\").call(this, ...arguments);\n\t}\n\tfval(args, context) {\n\t\treturn get(FuncChain.prototype, \"_fval\").call(this, ...arguments);\n\t}\n\tonce() {\n\t\treturn get(FuncChain.prototype, \"_once\").call(this, ...arguments);\n\t}\n\tpartial(...args) {\n\t\treturn get(FuncChain.prototype, \"_partial\").call(this, ...arguments);\n\t}\n\ttap(interceptor) {\n\t\treturn get(FuncChain.prototype, \"_tap\").call(this, ...arguments);\n\t}\n\tthrottle(wait, options) {\n\t\treturn get(FuncChain.prototype, \"_throttle\").call(this, ...arguments);\n\t}\n\tisAlnum() {\n\t\treturn get(FuncChain.prototype, \"_isAlnum\").call(this, ...arguments);\n\t}\n\tisAlpha() {\n\t\treturn get(FuncChain.prototype, \"_isAlpha\").call(this, ...arguments);\n\t}\n\tisArray() {\n\t\treturn get(FuncChain.prototype, \"_isArray\").call(this, ...arguments);\n\t}\n\tisArrayLike() {\n\t\treturn get(FuncChain.prototype, \"_isArrayLike\").call(this, ...arguments);\n\t}\n\tisBlank() {\n\t\treturn get(FuncChain.prototype, \"_isBlank\").call(this, ...arguments);\n\t}\n\tisBoolean() {\n\t\treturn get(FuncChain.prototype, \"_isBoolean\").call(this, ...arguments);\n\t}\n\tisCustomElement() {\n\t\treturn get(FuncChain.prototype, \"_isCustomElement\").call(this, ...arguments);\n\t}\n\tisDate() {\n\t\treturn get(FuncChain.prototype, \"_isDate\").call(this, ...arguments);\n\t}\n\tisDefined() {\n\t\treturn get(FuncChain.prototype, \"_isDefined\").call(this, ...arguments);\n\t}\n\tisElement() {\n\t\treturn get(FuncChain.prototype, \"_isElement\").call(this, ...arguments);\n\t}\n\tisEmpty() {\n\t\treturn get(FuncChain.prototype, \"_isEmpty\").call(this, ...arguments);\n\t}\n\tisEqual(b) {\n\t\treturn get(FuncChain.prototype, \"_isEqual\").call(this, ...arguments);\n\t}\n\tisEqualWith(b, comparator, _depth = 0) {\n\t\treturn get(FuncChain.prototype, \"_isEqualWith\").call(this, ...arguments);\n\t}\n\tisError() {\n\t\treturn get(FuncChain.prototype, \"_isError\").call(this, ...arguments);\n\t}\n\tisFinite() {\n\t\treturn get(FuncChain.prototype, \"_isFinite\").call(this, ...arguments);\n\t}\n\tisFunction() {\n\t\treturn get(FuncChain.prototype, \"_isFunction\").call(this, ...arguments);\n\t}\n\tisInteger() {\n\t\treturn get(FuncChain.prototype, \"_isInteger\").call(this, ...arguments);\n\t}\n\tisIterator() {\n\t\treturn get(FuncChain.prototype, \"_isIterator\").call(this, ...arguments);\n\t}\n\tisLowerCaseChar() {\n\t\treturn get(FuncChain.prototype, \"_isLowerCaseChar\").call(this, ...arguments);\n\t}\n\tisMap() {\n\t\treturn get(FuncChain.prototype, \"_isMap\").call(this, ...arguments);\n\t}\n\tisMatch(props) {\n\t\treturn get(FuncChain.prototype, \"_isMatch\").call(this, ...arguments);\n\t}\n\tisMatchWith(props, comparator) {\n\t\treturn get(FuncChain.prototype, \"_isMatchWith\").call(this, ...arguments);\n\t}\n\tisNaN() {\n\t\treturn get(FuncChain.prototype, \"_isNaN\").call(this, ...arguments);\n\t}\n\tisNative() {\n\t\treturn get(FuncChain.prototype, \"_isNative\").call(this, ...arguments);\n\t}\n\tisNil() {\n\t\treturn get(FuncChain.prototype, \"_isNil\").call(this, ...arguments);\n\t}\n\tisNode() {\n\t\treturn get(FuncChain.prototype, \"_isNode\").call(this, ...arguments);\n\t}\n\tisNull() {\n\t\treturn get(FuncChain.prototype, \"_isNull\").call(this, ...arguments);\n\t}\n\tisNumber() {\n\t\treturn get(FuncChain.prototype, \"_isNumber\").call(this, ...arguments);\n\t}\n\tisNumeric() {\n\t\treturn get(FuncChain.prototype, \"_isNumeric\").call(this, ...arguments);\n\t}\n\tisObject() {\n\t\treturn get(FuncChain.prototype, \"_isObject\").call(this, ...arguments);\n\t}\n\tisPlainObject() {\n\t\treturn get(FuncChain.prototype, \"_isPlainObject\").call(this, ...arguments);\n\t}\n\tisPrimitive() {\n\t\treturn get(FuncChain.prototype, \"_isPrimitive\").call(this, ...arguments);\n\t}\n\tisRegExp() {\n\t\treturn get(FuncChain.prototype, \"_isRegExp\").call(this, ...arguments);\n\t}\n\tisSafeInteger() {\n\t\treturn get(FuncChain.prototype, \"_isSafeInteger\").call(this, ...arguments);\n\t}\n\tisSet() {\n\t\treturn get(FuncChain.prototype, \"_isSet\").call(this, ...arguments);\n\t}\n\tisString() {\n\t\treturn get(FuncChain.prototype, \"_isString\").call(this, ...arguments);\n\t}\n\tisSymbol() {\n\t\treturn get(FuncChain.prototype, \"_isSymbol\").call(this, ...arguments);\n\t}\n\tisUndefined() {\n\t\treturn get(FuncChain.prototype, \"_isUndefined\").call(this, ...arguments);\n\t}\n\tisUpperCaseChar() {\n\t\treturn get(FuncChain.prototype, \"_isUpperCaseChar\").call(this, ...arguments);\n\t}\n\tisWeakMap() {\n\t\treturn get(FuncChain.prototype, \"_isWeakMap\").call(this, ...arguments);\n\t}\n\tisWeakSet() {\n\t\treturn get(FuncChain.prototype, \"_isWeakSet\").call(this, ...arguments);\n\t}\n\tadd(b) {\n\t\treturn get(FuncChain.prototype, \"_add\").call(this, ...arguments);\n\t}\n\tdivide(b) {\n\t\treturn get(FuncChain.prototype, \"_divide\").call(this, ...arguments);\n\t}\n\tmax() {\n\t\treturn get(FuncChain.prototype, \"_max\").call(this, ...arguments);\n\t}\n\tmean() {\n\t\treturn get(FuncChain.prototype, \"_mean\").call(this, ...arguments);\n\t}\n\tmedian() {\n\t\treturn get(FuncChain.prototype, \"_median\").call(this, ...arguments);\n\t}\n\tmin() {\n\t\treturn get(FuncChain.prototype, \"_min\").call(this, ...arguments);\n\t}\n\tminmax(max, value) {\n\t\treturn get(FuncChain.prototype, \"_minmax\").call(this, ...arguments);\n\t}\n\tmultiply(b) {\n\t\treturn get(FuncChain.prototype, \"_multiply\").call(this, ...arguments);\n\t}\n\trandf(max) {\n\t\treturn get(FuncChain.prototype, \"_randf\").call(this, ...arguments);\n\t}\n\trandi(max) {\n\t\treturn get(FuncChain.prototype, \"_randi\").call(this, ...arguments);\n\t}\n\tsubtract(b) {\n\t\treturn get(FuncChain.prototype, \"_subtract\").call(this, ...arguments);\n\t}\n\tsum() {\n\t\treturn get(FuncChain.prototype, \"_sum\").call(this, ...arguments);\n\t}\n\tformatNumber(pattern = \"#,##0.00\") {\n\t\treturn get(FuncChain.prototype, \"_formatNumber\").call(this, ...arguments);\n\t}\n\tgt(b) {\n\t\treturn get(FuncChain.prototype, \"_gt\").call(this, ...arguments);\n\t}\n\tgte(b) {\n\t\treturn get(FuncChain.prototype, \"_gte\").call(this, ...arguments);\n\t}\n\tinRange(start = 0, end) {\n\t\treturn get(FuncChain.prototype, \"_inRange\").call(this, ...arguments);\n\t}\n\tlt(b) {\n\t\treturn get(FuncChain.prototype, \"_lt\").call(this, ...arguments);\n\t}\n\tlte(b) {\n\t\treturn get(FuncChain.prototype, \"_lte\").call(this, ...arguments);\n\t}\n\ttoInteger() {\n\t\treturn get(FuncChain.prototype, \"_toInteger\").call(this, ...arguments);\n\t}\n\ttoNumber() {\n\t\treturn get(FuncChain.prototype, \"_toNumber\").call(this, ...arguments);\n\t}\n\tassign(...sources) {\n\t\treturn get(FuncChain.prototype, \"_assign\").call(this, ...arguments);\n\t}\n\tassignWith(...sources) {\n\t\treturn get(FuncChain.prototype, \"_assignWith\").call(this, ...arguments);\n\t}\n\tclone() {\n\t\treturn get(FuncChain.prototype, \"_clone\").call(this, ...arguments);\n\t}\n\tcloneDeep() {\n\t\treturn get(FuncChain.prototype, \"_cloneDeep\").call(this, ...arguments);\n\t}\n\tcloneDeepWith(handler, skip = (value, key) => false) {\n\t\treturn get(FuncChain.prototype, \"_cloneDeepWith\").call(this, ...arguments);\n\t}\n\tcloneWith(handler, skip = (value, key) => false) {\n\t\treturn get(FuncChain.prototype, \"_cloneWith\").call(this, ...arguments);\n\t}\n\tdefaults(...sources) {\n\t\treturn get(FuncChain.prototype, \"_defaults\").call(this, ...arguments);\n\t}\n\tdefaultsDeep(...sources) {\n\t\treturn get(FuncChain.prototype, \"_defaultsDeep\").call(this, ...arguments);\n\t}\n\teq(b) {\n\t\treturn get(FuncChain.prototype, \"_eq\").call(this, ...arguments);\n\t}\n\tfindKey(predicate) {\n\t\treturn get(FuncChain.prototype, \"_findKey\").call(this, ...arguments);\n\t}\n\tfromPairs() {\n\t\treturn get(FuncChain.prototype, \"_fromPairs\").call(this, ...arguments);\n\t}\n\tfunctions() {\n\t\treturn get(FuncChain.prototype, \"_functions\").call(this, ...arguments);\n\t}\n\tget(path, defaultValue) {\n\t\treturn get(FuncChain.prototype, \"_get\").call(this, ...arguments);\n\t}\n\thas(key) {\n\t\treturn get(FuncChain.prototype, \"_has\").call(this, ...arguments);\n\t}\n\tkeys() {\n\t\treturn get(FuncChain.prototype, \"_keys\").call(this, ...arguments);\n\t}\n\tkeysIn() {\n\t\treturn get(FuncChain.prototype, \"_keysIn\").call(this, ...arguments);\n\t}\n\tmerge(...sources) {\n\t\treturn get(FuncChain.prototype, \"_merge\").call(this, ...arguments);\n\t}\n\tmergeWith(...sources) {\n\t\treturn get(FuncChain.prototype, \"_mergeWith\").call(this, ...arguments);\n\t}\n\tomit(...props) {\n\t\treturn get(FuncChain.prototype, \"_omit\").call(this, ...arguments);\n\t}\n\tomitBy(predicate) {\n\t\treturn get(FuncChain.prototype, \"_omitBy\").call(this, ...arguments);\n\t}\n\tparseJSON(ignore = false) {\n\t\treturn get(FuncChain.prototype, \"_parseJSON\").call(this, ...arguments);\n\t}\n\tpick(...props) {\n\t\treturn get(FuncChain.prototype, \"_pick\").call(this, ...arguments);\n\t}\n\tpickBy(predicate) {\n\t\treturn get(FuncChain.prototype, \"_pickBy\").call(this, ...arguments);\n\t}\n\tprop() {\n\t\treturn get(FuncChain.prototype, \"_prop\").call(this, ...arguments);\n\t}\n\tset(path, value) {\n\t\treturn get(FuncChain.prototype, \"_set\").call(this, ...arguments);\n\t}\n\ttoObject() {\n\t\treturn get(FuncChain.prototype, \"_toObject\").call(this, ...arguments);\n\t}\n\ttoPairs() {\n\t\treturn get(FuncChain.prototype, \"_toPairs\").call(this, ...arguments);\n\t}\n\tunset(path) {\n\t\treturn get(FuncChain.prototype, \"_unset\").call(this, ...arguments);\n\t}\n\tvalues() {\n\t\treturn get(FuncChain.prototype, \"_values\").call(this, ...arguments);\n\t}\n\tvaluesIn() {\n\t\treturn get(FuncChain.prototype, \"_valuesIn\").call(this, ...arguments);\n\t}\n\tcamelCase() {\n\t\treturn get(FuncChain.prototype, \"_camelCase\").call(this, ...arguments);\n\t}\n\tcapitalize() {\n\t\treturn get(FuncChain.prototype, \"_capitalize\").call(this, ...arguments);\n\t}\n\tendsWith(searchStr, position) {\n\t\treturn get(FuncChain.prototype, \"_endsWith\").call(this, ...arguments);\n\t}\n\tescapeRegExp() {\n\t\treturn get(FuncChain.prototype, \"_escapeRegExp\").call(this, ...arguments);\n\t}\n\tindexOf(search, fromIndex = 0) {\n\t\treturn get(FuncChain.prototype, \"_indexOf\").call(this, ...arguments);\n\t}\n\tkebabCase() {\n\t\treturn get(FuncChain.prototype, \"_kebabCase\").call(this, ...arguments);\n\t}\n\tlastIndexOf(search, fromIndex = Infinity) {\n\t\treturn get(FuncChain.prototype, \"_lastIndexOf\").call(this, ...arguments);\n\t}\n\tlowerCase() {\n\t\treturn get(FuncChain.prototype, \"_lowerCase\").call(this, ...arguments);\n\t}\n\tlowerFirst() {\n\t\treturn get(FuncChain.prototype, \"_lowerFirst\").call(this, ...arguments);\n\t}\n\tpadEnd(len, padString = \" \") {\n\t\treturn get(FuncChain.prototype, \"_padEnd\").call(this, ...arguments);\n\t}\n\tpadStart(len, padString = \" \") {\n\t\treturn get(FuncChain.prototype, \"_padStart\").call(this, ...arguments);\n\t}\n\tpadZ(len) {\n\t\treturn get(FuncChain.prototype, \"_padZ\").call(this, ...arguments);\n\t}\n\tpascalCase() {\n\t\treturn get(FuncChain.prototype, \"_pascalCase\").call(this, ...arguments);\n\t}\n\trepeat(count) {\n\t\treturn get(FuncChain.prototype, \"_repeat\").call(this, ...arguments);\n\t}\n\treplace(searchValue, replaceValue) {\n\t\treturn get(FuncChain.prototype, \"_replace\").call(this, ...arguments);\n\t}\n\treplaceAll(searchValue, replaceValue) {\n\t\treturn get(FuncChain.prototype, \"_replaceAll\").call(this, ...arguments);\n\t}\n\tsnakeCase() {\n\t\treturn get(FuncChain.prototype, \"_snakeCase\").call(this, ...arguments);\n\t}\n\tsplit(separator, limit) {\n\t\treturn get(FuncChain.prototype, \"_split\").call(this, ...arguments);\n\t}\n\tstartsWith(searchStr, position = 0) {\n\t\treturn get(FuncChain.prototype, \"_startsWith\").call(this, ...arguments);\n\t}\n\tsubstring(indexStart = 0, indexEnd) {\n\t\treturn get(FuncChain.prototype, \"_substring\").call(this, ...arguments);\n\t}\n\ttest(pattern, flags) {\n\t\treturn get(FuncChain.prototype, \"_test\").call(this, ...arguments);\n\t}\n\ttoFixed(scale = 0) {\n\t\treturn get(FuncChain.prototype, \"_toFixed\").call(this, ...arguments);\n\t}\n\ttoString() {\n\t\treturn get(FuncChain.prototype, \"_toString\").call(this, ...arguments);\n\t}\n\ttrim() {\n\t\treturn get(FuncChain.prototype, \"_trim\").call(this, ...arguments);\n\t}\n\ttrimEnd() {\n\t\treturn get(FuncChain.prototype, \"_trimEnd\").call(this, ...arguments);\n\t}\n\ttrimStart() {\n\t\treturn get(FuncChain.prototype, \"_trimStart\").call(this, ...arguments);\n\t}\n\ttruncate(len, options) {\n\t\treturn get(FuncChain.prototype, \"_truncate\").call(this, ...arguments);\n\t}\n\tupperCase() {\n\t\treturn get(FuncChain.prototype, \"_upperCase\").call(this, ...arguments);\n\t}\n\tupperFirst() {\n\t\treturn get(FuncChain.prototype, \"_upperFirst\").call(this, ...arguments);\n\t}\n\tarrayToTree(idKey = \"id\", pidKey = \"pid\", options = {\n\t\tchildrenKey: \"children\",\n\t\trootParentValue: null,\n\t\tattrMap: void 0,\n\t\tsortKey: \"\"\n\t}) {\n\t\treturn get(FuncChain.prototype, \"_arrayToTree\").call(this, ...arguments);\n\t}\n\tclosest(predicate, parentKey, composed = false) {\n\t\treturn get(FuncChain.prototype, \"_closest\").call(this, ...arguments);\n\t}\n\tfilterTree(predicate, options = { childrenKey: \"children\" }) {\n\t\treturn get(FuncChain.prototype, \"_filterTree\").call(this, ...arguments);\n\t}\n\tfindTreeNode(predicate, options) {\n\t\treturn get(FuncChain.prototype, \"_findTreeNode\").call(this, ...arguments);\n\t}\n\tfindTreeNodes(predicate, options) {\n\t\treturn get(FuncChain.prototype, \"_findTreeNodes\").call(this, ...arguments);\n\t}\n\talphaId() {\n\t\treturn get(FuncChain.prototype, \"_alphaId\").call(this, ...arguments);\n\t}\n\tdefaultTo(defaultValue) {\n\t\treturn get(FuncChain.prototype, \"_defaultTo\").call(this, ...arguments);\n\t}\n\tmatcher() {\n\t\treturn get(FuncChain.prototype, \"_matcher\").call(this, ...arguments);\n\t}\n\tsnowflakeId(epoch = 15804864e5) {\n\t\treturn get(FuncChain.prototype, \"_snowflakeId\").call(this, ...arguments);\n\t}\n\ttimes(iteratee) {\n\t\treturn get(FuncChain.prototype, \"_times\").call(this, ...arguments);\n\t}\n\tuniqueId() {\n\t\treturn get(FuncChain.prototype, \"_uniqueId\").call(this, ...arguments);\n\t}\n\tuuid() {\n\t\treturn get(FuncChain.prototype, \"_uuid\").call(this, ...arguments);\n\t}\n};\n/**\n* 用于定义FuncChain对象并构造函数链\n* 注意,该类仅用于内部构造函数链\n*/\nvar FuncChain = class extends ChainFx {\n\t/**\n\t* @internal \n\t*/\n\tconstructor(v) {\n\t\tsuper();\n\t\tthis._wrappedValue = v;\n\t\tthis._chain = [];\n\t}\n\t/**\n\t* 惰性计算。执行函数链并返回计算结果\n\t* @example\n\t* //2-4\n\t* console.log(_([1,2,3,4]).map(v=>v+1).filter(v=>v%2===0).take(2).join('-').value())\n\t* //[1,2,2,1]\n\t* console.log(_([\"{a:1,b:2}\",\"{a:2,b:1}\"]).map((v) => _.fval(v)).map(v=>[v.a,v.b]).join().value())\n\t* //[1,2,3,4]\n\t* console.log(_([1,2,3,4]).value())\n\t*\n\t* @returns 执行函数链返回的值\n\t*/\n\tvalue() {\n\t\tlet comprehension = isArrayLike(this._wrappedValue) ? createComprehension() : null;\n\t\tconst maxChainIndex = this._chain.length - 1;\n\t\treturn this._chain.reduce((acc, v, i) => {\n\t\t\tconst params = [acc, ...v.params];\n\t\t\tif (comprehension) {\n\t\t\t\tlet rs;\n\t\t\t\tconst sig = buildComprehension(comprehension, v.fn, v.params);\n\t\t\t\tif (sig > 0 || !sig && maxChainIndex === i) {\n\t\t\t\t\trs = execComprehension(comprehension, acc);\n\t\t\t\t\tif (comprehension.tap) comprehension.tap(rs);\n\t\t\t\t\tcomprehension = null;\n\t\t\t\t}\n\t\t\t\tif (sig > 1) comprehension = createComprehension(v.fn, v.params);\n\t\t\t\tif (rs) return sig !== 1 ? rs : v.fn(...[rs, ...v.params]);\n\t\t\t\treturn acc;\n\t\t\t}\n\t\t\tif (isComprehensionRoot(v.fn.name)) {\n\t\t\t\tcomprehension = createComprehension();\n\t\t\t\treturn v.fn(...[acc, ...v.params]);\n\t\t\t}\n\t\t\treturn v.fn(...params);\n\t\t}, this._wrappedValue);\n\t}\n};\nfunction isComprehensionRoot(name) {\n\treturn name === split.name || name === toArray.name || name === range.name;\n}\nfunction createComprehension(fn, params) {\n\tconst comprehension = {\n\t\tforEachRight: false,\n\t\tgoalSettings: [],\n\t\trange: [],\n\t\treverse: false,\n\t\tcount: void 0,\n\t\ttap: void 0,\n\t\treturnEl: false\n\t};\n\tif (fn && params) buildComprehension(comprehension, fn, params);\n\treturn comprehension;\n}\nfunction buildComprehension(comprehension, fn, params) {\n\tconst fnName = fn.name;\n\tswitch (fnName) {\n\t\tcase map.name:\n\t\tcase filter.name:\n\t\t\tif (size(comprehension.range) > 0 || isDefined(comprehension.count)) return 2;\n\t\t\tlet fn = params[0];\n\t\t\tif (!isFunction(fn)) fn = iteratee_default(params[0]);\n\t\t\tcomprehension.goalSettings.push({\n\t\t\t\ttype: fnName,\n\t\t\t\tfn\n\t\t\t});\n\t\t\tbreak;\n\t\tcase reverse.name:\n\t\t\tif (size(comprehension.range) < 1) comprehension.forEachRight = !comprehension.forEachRight;\n\t\t\telse comprehension.reverse = !comprehension.reverse;\n\t\t\tbreak;\n\t\tcase slice.name:\n\t\t\tif (size(comprehension.range) > 0) return 2;\n\t\t\tcomprehension.range[0] = params[0];\n\t\t\tcomprehension.range[1] = params[1];\n\t\t\tbreak;\n\t\tcase tail.name:\n\t\t\tif (size(comprehension.range) > 0) return 2;\n\t\t\tcomprehension.range[0] = 1;\n\t\t\tcomprehension.range[1] = params[1];\n\t\t\tbreak;\n\t\tcase take.name:\n\t\t\tif (isUndefined(comprehension.count) || params[0] < comprehension.count) comprehension.count = params[0];\n\t\t\tbreak;\n\t\tcase first.name:\n\t\t\tif (isUndefined(comprehension.count) || 1 < comprehension.count) {\n\t\t\t\tcomprehension.count = 1;\n\t\t\t\tcomprehension.returnEl = true;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase last.name:\n\t\t\tcomprehension.count = 1;\n\t\t\tcomprehension.returnEl = true;\n\t\t\tcomprehension.forEachRight = true;\n\t\t\tbreak;\n\t\tcase tap.name:\n\t\t\tcomprehension.tap = params[0];\n\t\t\tbreak;\n\t\tdefault: return 1;\n\t}\n\treturn 0;\n}\nfunction execComprehension(comprehension, collection) {\n\tconst targets = [];\n\tlet targetIndex = 0;\n\tif (!comprehension.count && comprehension.range.length > 0) comprehension.count = comprehension.range[1] - comprehension.range[0];\n\tconst isReverse = comprehension.reverse;\n\tconst count = comprehension.count;\n\tconst gs = comprehension.goalSettings;\n\tconst gsLen = gs.length;\n\tconst range = comprehension.range;\n\tconst hasRange = range.length > 0;\n\t(comprehension.forEachRight ? eachRight : each)(collection, (v, k) => {\n\t\tlet t = v;\n\t\tfor (let i = 0; i < gsLen; i++) {\n\t\t\tconst setting = gs[i];\n\t\t\tif (setting.type === map.name) t = setting.fn(t, k);\n\t\t\telse if (setting.type === filter.name) {\n\t\t\t\tif (!setting.fn(t, k)) return;\n\t\t\t}\n\t\t}\n\t\tif (hasRange && targetIndex++ < range[0]) return;\n\t\tif (hasRange && targetIndex > range[1]) return false;\n\t\tif (targets.length === count) return false;\n\t\tif (isReverse) targets.unshift(t);\n\t\telse targets.push(t);\n\t});\n\tif (targets.length === 1 && comprehension.returnEl) return targets[0];\n\treturn targets;\n}\n//#endregion\n//#region src/index.ts\nvar VERSION = \"2.0.0-beta.2\";\n/**\n* 显式开启myfx的函数链,返回一个包裹了参数v的myfx链式对象。函数链可以链接Myfx提供的所有函数,如\n<p>\n* 函数链使用惰性计算 —— 直到显示调用value()方法时,函数链才会进行计算并返回结果\n</p>\n```js\n_.chain([1,2,3,4]).map(v=>v+1).filter(v=>v%2===0).take(2).join('-').value()\n```\n\n* 函数链与直接调用方法的区别不仅在于可以链式调用,更在于函数链是基于惰性求值的。\n* 上式中必须通过显式调用`value()`方法才能获取结果,\n* 而只有在`value()`方法调用时整个函数链才进行求值。\n*\n*\n* 惰性求值允许FuncChain实现捷径融合(shortcut fusion) —— 一项基于已有函数对数组循环次数进行大幅减少以提升性能的优化技术。\n* 下面的例子演示了原生函数链和Myfx函数链的性能差异\n* @example\n* let ary = _.range(20000000);\nconsole.time('native');\nlet c = 0;\nlet a = ary.map((v)=>{\nc++;\nreturn v+1;\n}).filter((v) => {\nc++;\nreturn v%2==0;\n})\n.reverse()\n.slice(1, 4)\nconsole.timeEnd('native');\nconsole.log(a, c, '次');//大约600ms左右,循环 40000000 次\n\n//Myfx\nary = _.range(20000000);\nconsole.time('Myfx');\nlet x = 0;\nlet targets = _(ary)\n.map((v) => {\nx++;\nreturn v+1;\n})\n.filter((v) => {\nx++;\nreturn v%2==0;\n})\n.reverse()\n.slice(1, 4)\n.value();\nconsole.timeEnd('Myfx');\nconsole.log(targets, x, '次');//大约0.5ms左右,循环 18 次\n*\n* @param v\n* @returns Myfx对象\n*/\nfunction chain(v) {\n\tensureChainMixin();\n\treturn v instanceof FuncChain ? v : new FuncChain(v);\n}\nvar api = {\n\tappend,\n\tchunk,\n\tcompact,\n\tconcat,\n\texcept,\n\tfill,\n\tfindIndex,\n\tfindLastIndex,\n\tflat,\n\tflatDeep,\n\tinsert,\n\tintersect,\n\tjoin,\n\tpop,\n\tpull,\n\trange,\n\tremove,\n\treverse,\n\tslice,\n\tsortedIndex,\n\tsortedIndexBy,\n\tunion,\n\tuniq,\n\tuniqBy,\n\tunzip,\n\twithout,\n\tzip,\n\tzipObject,\n\tzipWith,\n\tcountBy,\n\teach,\n\teachRight,\n\tevery,\n\tfilter,\n\tfind,\n\tfindLast,\n\tfirst,\n\tflatMap,\n\tflatMapDeep,\n\tgroupBy,\n\tincludes,\n\tinitial,\n\tkeyBy,\n\tlast,\n\tmap,\n\tpartition,\n\treduce,\n\treject,\n\tsample,\n\tsampleSize,\n\tshuffle,\n\tsize,\n\tsome,\n\tsort,\n\tsortBy,\n\ttail,\n\ttake,\n\ttakeRight,\n\ttoArray,\n\taddTime,\n\tcompareDate,\n\tformatDate: formatDateApi,\n\tgetDayOfYear,\n\tgetWeekOfMonth,\n\tgetWeekOfYear,\n\tisLeapYear,\n\tisSameDay,\n\tnow,\n\ttoDate,\n\tafter,\n\talt,\n\tbind,\n\tbindAll,\n\tcall,\n\tcompose,\n\tdebounce,\n\tdelay,\n\tfval,\n\tonce,\n\tpartial,\n\ttap,\n\tthrottle,\n\tisAlnum,\n\tisAlpha,\n\tisArray,\n\tisArrayLike,\n\tisBlank,\n\tisBoolean,\n\tisCustomElement,\n\tisDate,\n\tisDefined,\n\tisElement,\n\tisEmpty,\n\tisEqual,\n\tisEqualWith,\n\tisError,\n\tisFinite,\n\tisFunction,\n\tisInteger,\n\tisIterator,\n\tisLowerCaseChar,\n\tisMap,\n\tisMatch,\n\tisMatchWith,\n\tisNaN: isNaN$1,\n\tisNative,\n\tisNil,\n\tisNode,\n\tisNull,\n\tisNumber,\n\tisNumeric,\n\tisObject,\n\tisPlainObject,\n\tisPrimitive,\n\tisRegExp,\n\tisSafeInteger,\n\tisSet,\n\tisString,\n\tisSymbol,\n\tisUndefined,\n\tisUpperCaseChar,\n\tisWeakMap,\n\tisWeakSet,\n\tadd,\n\tdivide,\n\tmax,\n\tmean,\n\tmedian,\n\tmin,\n\tminmax,\n\tmultiply,\n\trandf,\n\trandi,\n\tsubtract,\n\tsum,\n\tformatNumber,\n\tgt,\n\tgte,\n\tinRange,\n\tlt,\n\tlte,\n\ttoInteger,\n\ttoNumber,\n\tassign,\n\tassignWith,\n\tclone,\n\tcloneDeep,\n\tcloneDeepWith,\n\tcloneWith,\n\tdefaults,\n\tdefaultsDeep,\n\teq,\n\tfindKey,\n\tfromPairs,\n\tfunctions,\n\tget,\n\thas,\n\tkeys,\n\tkeysIn,\n\tmerge,\n\tmergeWith,\n\tomit,\n\tomitBy,\n\tparseJSON,\n\tpick,\n\tpickBy,\n\tprop,\n\tset,\n\ttoObject,\n\ttoPairs,\n\tunset,\n\tvalues,\n\tvaluesIn,\n\tcamelCase,\n\tcapitalize,\n\tendsWith,\n\tescapeRegExp,\n\tindexOf,\n\tkebabCase,\n\tlastIndexOf,\n\tlowerCase,\n\tlowerFirst,\n\tpadEnd,\n\tpadStart,\n\tpadZ,\n\tpascalCase,\n\trepeat,\n\treplace,\n\treplaceAll,\n\tsnakeCase,\n\tsplit,\n\tstartsWith,\n\tsubstring,\n\ttest,\n\ttoFixed,\n\ttoString,\n\ttrim,\n\ttrimEnd,\n\ttrimStart,\n\ttruncate,\n\tupperCase,\n\tupperFirst,\n\ttemplate: templateApi,\n\tarrayToTree,\n\tclosest,\n\tfilterTree,\n\tfindTreeNode,\n\tfindTreeNodes,\n\tsortTree,\n\twalkTree,\n\talphaId,\n\tdefaultTo,\n\tidentity: identity_default,\n\titeratee: iteratee_default,\n\tmatcher,\n\tmixin,\n\tnoop: noop_default,\n\tsnowflakeId,\n\ttimes,\n\ttoPath: toPath_default,\n\tuniqueId,\n\tuuid\n};\nvar chainMixinReady = false;\n/**\n* 惰性把 api 中的全部函数挂载到 FuncChain 原型上(函数链能力)\n*/\nfunction ensureChainMixin() {\n\tif (chainMixinReady) return;\n\tchainMixinReady = true;\n\tmixin(FuncChain, { ...api });\n}\n/**\n* 构造默认导出的完整 API 对象\n*/\nvar myfx = /* @__PURE__ */ createMyfxApi();\nfunction createMyfxApi() {\n\treturn {\n\t\tVERSION,\n\t\tchain,\n\t\t...api\n\t};\n}\n//#endregion\nexport { VERSION, add, addTime, after, alphaId, alt, append, arrayToTree, assign, assignWith, bind, bindAll, call, camelCase, capitalize, chain, chunk, clone, cloneDeep, cloneDeepWith, cloneWith, closest, compact, compareDate, compose, concat, countBy, debounce, myfx as default, defaultTo, defaults, defaultsDeep, delay, divide, each, eachRight, endsWith, eq, escapeRegExp, every, except, fill, filter, filterTree, find, findIndex, findKey, findLast, findLastIndex, findTreeNode, findTreeNodes, first, flat, flatDeep, flatMap, flatMapDeep, formatDateApi as formatDate, formatNumber, fromPairs, functions, fval, get, getDayOfYear, getWeekOfMonth, getWeekOfYear, groupBy, gt, gte, has, identity_default as identity, inRange, includes, indexOf, initial, insert, intersect, isAlnum, isAlpha, isArray, isArrayLike, isBlank, isBoolean, isCustomElement, isDate, isDefined, isElement, isEmpty, isEqual, isEqualWith, isError, isFinite, isFunction, isInteger, isIterator, isLeapYear, isLowerCaseChar, isMap, isMatch, isMatchWith, isNaN$1 as isNaN, isNative, isNil, isNode, isNull, isNumber, isNumeric, isObject, isPlainObject, isPrimitive, isRegExp, isSafeInteger, isSameDay, isSet, isString, isSymbol, isUndefined, isUpperCaseChar, isWeakMap, isWeakSet, iteratee_default as iteratee, join, kebabCase, keyBy, keys, keysIn, last, lastIndexOf, lowerCase, lowerFirst, lt, lte, map, matcher, max, mean, median, merge, mergeWith, min, minmax, mixin, multiply, noop_default as noop, now, omit, omitBy, once, padEnd, padStart, padZ, parseJSON, partial, partition, pascalCase, pick, pickBy, pop, prop, pull, randf, randi, range, reduce, reject, remove, repeat, replace, replaceAll, reverse, sample, sampleSize, set, shuffle, size, slice, snakeCase, snowflakeId, some, sort, sortBy, sortTree, sortedIndex, sortedIndexBy, split, startsWith, substring, subtract, sum, tail, take, takeRight, tap, templateApi as template, test, throttle, times, toArray, toDate, toFixed, toInteger, toNumber, toObject, toPairs, toPath_default as toPath, toString, trim, trimEnd, trimStart, truncate, union, uniq, uniqBy, uniqueId, unset, unzip, upperCase, upperFirst, uuid, values, valuesIn, walkTree, without, zip, zipObject, zipWith };\n","/**\n * innerHTML 快路径序列化(模板树 → HTML 串)。\n *\n * 生成的 buildTemplate 改为:`template.innerHTML = \"<html>\"` 一次性建树,\n * 再由通用 split/collect walk 编号(见 template-dom.ts 的 WALK)。\n * 纯编译期逻辑;DOM 契约与 createElement 路径等价是硬前提——\n * 任何 HTML 树构造会重构/搬迁/丢弃的结构都必须走回退路径。\n *\n * 等价性来源(与 createElement 路径逐项对照):\n * - 文本:序列化转义 `&`/`<`(script/style 不转义)→ 解析期实体解码 → 还原原文;\n * `\\r` 会被预处理归一为 `\\n` → 含 CR 的文本/属性一律回退。\n * - 属性:静态属性按源顺序写入 → setAttribute 同序同值;动态/事件/ref/slot-props\n * 属性不写入(不 setAttribute)。属性值源码禁实体(parse 约束)→ 转义往返无损。\n * - 注释:原样往返(会破坏往返的写法回退);注释不计 nodeSn(walk 跳过)。\n * - nodeSn:walk 按文档序(元素先入列再入子)编号,与 codegen 的\n * emitElement/emitText 序号严格一致——这是回退判定保守的根本原因。\n */\nimport { PLACEHOLDER, VOID_TAGS, type TAttr, type TElement, type TNode } from '../analyze/template-tree'\n\n/** HTML 树构造会重构/搬迁/丢弃的标签——出现即回退 createElement 路径。 */\nconst HARD_UNSAFE = new Set([\n // 表格族:隐式 tbody/colgroup 包装、foster parenting\n 'table', 'tbody', 'thead', 'tfoot', 'tr', 'td', 'th', 'col', 'colgroup', 'caption',\n // 模板内容搬进 .content;noscript 受 scripting 标志影响\n 'template', 'noscript',\n // 文档级上下文标签\n 'html', 'head', 'body', 'frameset', 'frame', 'plaintext',\n // xmp 内容按纯文本解析(元素子级会变文本)\n 'xmp',\n])\n\n/** `<p>` 的起始标签会隐式关闭 p 的元素集合(HTML \"in body\" 规则)。 */\nconst P_BLOCK_CLOSE = new Set([\n 'address', 'article', 'aside', 'blockquote', 'center', 'details', 'dialog', 'dir',\n 'div', 'dl', 'dt', 'dd', 'fieldset', 'figcaption', 'figure', 'footer', 'form',\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hgroup', 'hr', 'li', 'main',\n 'menu', 'nav', 'ol', 'p', 'pre', 'section', 'summary', 'table', 'ul', 'xmp',\n 'listing', 'plaintext',\n])\n\n/** li/dd/dt 起始标签回溯时的终止集(special 但非 div/p/address → 直接插入,安全)。 */\nconst CHAIN_SAFE_STOP = new Set([\n 'html', 'body', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl',\n 'pre', 'listing', 'blockquote', 'fieldset', 'table', 'button', 'hr', 'xmp',\n 'article', 'aside', 'details', 'dialog', 'dir', 'footer', 'header', 'hgroup',\n 'main', 'menu', 'nav', 'section', 'figure', 'figcaption', 'center', 'plaintext',\n])\n\n/** script/style/textarea/title:子级必须纯文本(元素/注释子级会被解析成文本)。 */\nconst RAWTEXT_TAGS = new Set(['script', 'style', 'textarea', 'title'])\n\n/** select 在 \"in select\" 模式下会忽略的元素子级(除白名单外)。 */\nconst SELECT_CHILDREN_OK = new Set(['option', 'optgroup', 'hr', 'script'])\n\nconst H_SET = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6'])\n\nconst TOKEN_RE = new RegExp(`${PLACEHOLDER}(\\\\d+)`)\n\nfunction hasVar(s: string): boolean {\n TOKEN_RE.lastIndex = 0\n return TOKEN_RE.test(s)\n}\n\n/**\n * 模板树能否安全走 innerHTML 路径(保守判定:任何不确定 → false 回退)。\n */\nexport function canUseInnerHTML(root: TNode[]): boolean {\n return checkNodes(root, [])\n}\n\nfunction checkNodes(nodes: TNode[], chain: TElement[]): boolean {\n for (const nd of nodes) {\n if (nd.type === 'text') {\n if (nd.raw.includes('\\r')) return false\n continue\n }\n if (nd.type === 'comment') {\n if (nd.text.includes('\\r')) return false\n if (nd.text.includes('--') || nd.text.startsWith('>') || nd.text.startsWith('->') || nd.text.endsWith('-')) {\n return false\n }\n continue\n }\n if (!checkElement(nd, chain)) return false\n }\n return true\n}\n\nfunction checkElement(el: TElement, chain: TElement[]): boolean {\n const t = el.tag.toLowerCase()\n if (HARD_UNSAFE.has(t)) return false\n if (!/^[a-zA-Z]/.test(el.tag)) return false\n // HTML 上下文专属(foreign content 无隐式闭合/adoption agency)\n if (t === 'image' && el.ns === 'html') return false\n\n for (const a of el.attrs) {\n if (a.value != null && a.value.includes('\\r')) return false\n }\n\n // rawtext/RCDATA:子级必须纯文本;textarea 首行 \\n 被解析器剥离\n if (RAWTEXT_TAGS.has(t)) {\n for (const c of el.children) {\n if (c.type !== 'text') return false\n if (c.raw.includes('\\r')) return false\n }\n if (t === 'textarea' && el.children[0]?.type === 'text' && el.children[0].raw.startsWith('\\n')) {\n return false\n }\n return checkNodes(el.children, [...chain, el])\n }\n\n // pre/listing 首行 \\n 被解析器剥离(createElement 不会)\n if ((t === 'pre' || t === 'listing') && el.children[0]?.type === 'text' && el.children[0].raw.startsWith('\\n')) {\n return false\n }\n\n if (el.ns === 'html') {\n // 祖先链禁令:a/form/button 嵌套自身、h* 嵌套 h*(adoption agency / 隐式闭合)\n if (t === 'a' || t === 'form' || t === 'button') {\n for (const p of chain) if (p.ns === 'html' && p.tag.toLowerCase() === t) return false\n }\n if (H_SET.has(t)) {\n for (const p of chain) if (p.ns === 'html' && H_SET.has(p.tag.toLowerCase())) return false\n }\n\n // li/dd/dt 起始标签的隐式闭合回溯(祖先链上命中同族 → 重构)\n if (t === 'li' && chainHits(chain, new Set(['li']))) return false\n if ((t === 'dd' || t === 'dt') && chainHits(chain, new Set(['dd', 'dt']))) return false\n\n // option/optgroup 嵌套:内层成为兄弟(option 内容仅纯文本)\n if (t === 'option' || t === 'optgroup') {\n for (const c of el.children) {\n if (c.type === 'element') {\n if (t === 'option') return false\n const ct = c.tag.toLowerCase()\n if (ct !== 'option' && ct !== 'optgroup') return false\n }\n }\n const parent = chain.length ? chain[chain.length - 1] : null\n if (parent && parent.ns === 'html') {\n const pt = parent.tag.toLowerCase()\n if (t === 'option' && pt === 'option') return false\n if (t === 'optgroup' && pt === 'optgroup') return false\n }\n }\n\n // p 子树含会关闭 p 的元素 → 隐式闭合重构\n if (t === 'p' && subtreeHas(el.children, P_BLOCK_CLOSE)) return false\n\n // select 子级白名单(其余在 \"in select\" 模式下被直接忽略)\n if (t === 'select') {\n for (const c of el.children) {\n if (c.type === 'element' && !SELECT_CHILDREN_OK.has(c.tag.toLowerCase())) return false\n if (c.type === 'comment') return false\n }\n }\n }\n\n return checkNodes(el.children, [...chain, el])\n}\n\n/**\n * li/dd/dt 起始标签的回溯判定(祖先链由外到内):从最近祖先向上,\n * 命中目标 → true(重构,不安全);命中终止集 → false(直接插入,安全);到根 → false。\n */\nfunction chainHits(chain: TElement[], targets: Set<string>): boolean {\n for (let i = chain.length - 1; i >= 0; i--) {\n const el = chain[i]\n if (el.ns !== 'html') continue\n const t = el.tag.toLowerCase()\n if (targets.has(t)) return true\n if (CHAIN_SAFE_STOP.has(t)) return false\n }\n return false\n}\n\nfunction subtreeHas(nodes: TNode[], set: Set<string>): boolean {\n for (const nd of nodes) {\n if (nd.type === 'element' && nd.ns === 'html') {\n if (set.has(nd.tag.toLowerCase())) return true\n if (subtreeHas(nd.children, set)) return true\n }\n }\n return false\n}\n\n/** 序列化可写入 HTML 的静态属性(与 emitAttr 静态分支同口径)。 */\nfunction seriableAttr(a: TAttr): boolean {\n const name = a.name\n if (name === 'slot-props' || name === 'ref') return false\n if (name[0] === '.' || name[0] === '?' || name[0] === '*' || name[0] === '@') return false\n if (hasVar(name)) return false\n if (a.value != null && hasVar(a.value)) return false\n return true\n}\n\nfunction escText(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;')\n}\n\nfunction escAttr(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\"/g, '&quot;')\n}\n\n\n/** script/style 文本不转义(rawtext 内不可能含 `<`——源解析器在此截断)。 */\nfunction isRawtextTag(tag: string): boolean {\n const t = tag.toLowerCase()\n return t === 'script' || t === 'style'\n}\n\n/**\n * 模板树 → innerHTML 串。仅在 canUseInnerHTML(root) 为 true 时调用。\n * 属性按源顺序输出(DOM attr 插入序一致);动态属性省略(不写)。\n */\nexport function serializeTemplateHTML(root: TNode[]): string {\n let out = ''\n for (const nd of root) out += serNode(nd, null)\n return out\n}\n\nfunction serNode(nd: TNode, parent: TElement | null): string {\n if (nd.type === 'text') {\n return parent && isRawtextTag(parent.tag) ? nd.raw : escText(nd.raw)\n }\n if (nd.type === 'comment') return `<!--${nd.text}-->`\n return serElement(nd)\n}\n\nfunction serElement(el: TElement): string {\n let attrs = ''\n for (const a of el.attrs) {\n if (!seriableAttr(a)) continue\n attrs += a.value == null ? ` ${a.name}` : ` ${a.name}=\"${escAttr(a.value)}\"`\n }\n const open = `<${el.tag}${attrs}>`\n if (VOID_TAGS.has(el.tag.toLowerCase())) return open\n let inner = ''\n for (const c of el.children) inner += serNode(c, el)\n return `${open}${inner}</${el.tag}>`\n}\n","/**\n * buildTemplate codegen:模板节点树 IR → 生成的 DOM 构建函数源码。\n *\n * 生成物形态(docs/TEMPLATE-CODEGEN.md §2)——两条路径:\n *\n * 1. **innerHTML 快路径(默认,canUseInnerHTML 判定)**:\n * 编译期把树序列化为 HTML 串(template-html.ts),运行时\n * `template.innerHTML = \"...\"` 一次性建树,再由通用 walk 文档序收集 nodes\n * 并对变量文本做 split(对齐 emitText 的 trim/丢空语义)。body 只含\n * ee/tc 行 + walk + ups 字面量——无逐点 createElement。\n * 2. **createElement 路径(风险树回退 / forceCreate)**:\n * `const d = document; const f = d.createDocumentFragment(); ...`\n * 逐点 createElement / createTextNode / appendChild / ee[sn] = [...]。\n *\n * 两路径的 nodeSn 编号、ups、emptyEvents、nodes 顺序完全一致(契约不变)。\n *\n * - **零依赖**:只用 document 全局与字面量,不 import compelem 内部类。\n * - 以普通函数生成,运行时以 `buildTemplate.call(首实例)` 调用 —— `this` 用于\n * 首实例求值(首实例冻结语义)。\n * - nodeSn 由生成器在输出树上按文档序静态编号(元素 + 文本;注释不计号,\n * 即 SHOW_ELEMENT|SHOW_TEXT 过滤)。\n * - `nodes` 与 nodeSn 同步 push(创建即入列,父先于子),运行时可 O(1) 取\n * `nodes[sn]`,免去 cloneNode + collectNodes 回扫。\n * - `ups` 为 body 末尾一次性字面量(免逐点 `ups.push` 调用)。\n * - varIndex 为 upm 序。\n */\nimport { COMpelem_DIRECTIVES } from '../analyze/render-body'\nimport type { TemplateVarInfo } from '../analyze/template-extract'\nimport {\n PLACEHOLDER,\n SVG_NS,\n splitParts,\n type TAttr,\n type TElement,\n type TNode,\n type TVarPart,\n} from '../analyze/template-tree'\nimport { camelCase, kebabCase, snakeCase } from 'myfx'\nimport { canUseInnerHTML, serializeTemplateHTML } from './template-html'\n\nconst J = JSON.stringify\nconst BUILTIN_DIRECTIVES = COMpelem_DIRECTIVES\n\nexport interface CodegenOptions {\n className: string\n /** 已注册 CompElem 标签(小写)—— SLOT 判定与 prop 位置校验 */\n knownTags: Set<string>\n /** 强制 createElement 路径(默认走 innerHTML 快路径,风险树自动回退) */\n forceCreate?: boolean\n}\n\nexport interface CodegenResult {\n /** 生成函数源码(`function() {...}`);errors 非空时为 null */\n code: string | null\n errors: string[]\n /** 与 ups.push 序一致的描述符数组(供 pointEffects codegen 消费);errors 非空时为 undefined */\n ups?: UpOut[]\n /** nodeSn → 节点名(元素为 tag、文本为 '#text'),与运行时 nodes 数组同序;errors 非空时为 undefined */\n nodeNames?: string[]\n /** 构建路径:html = template.innerHTML 一次性建树;create = 逐点 createElement(风险回退) */\n mode?: 'create' | 'html'\n}\n\nconst NAME_TOKEN_RE = new RegExp(`^${PLACEHOLDER}(\\\\d+)$`)\n\n/** 生成的 UpdatePoint 描述符(与运行时 UpdatePointMeta 字段同构)。 */\nexport interface UpOut {\n varIndex: number\n nodeSn: number\n slotNodeSn?: number\n /**\n * 本 up 在 `ups` 数组里的下标 —— **运行时需要**。\n *\n * `renderTemplate` 是按「node × 该 node 的 upms」遍历的,不是线性扫 `ups`,\n * 所以要拿到某个 up 在 `fx`(与 ups 1:1 的工厂数组)里的位置,必须显式带索引。\n * Q2 若把元数据整体挂到工厂上,这个字段会被 `ups: [{ pe }]` 的精简形态取代。\n */\n ux?: number\n attrName?: string\n attrTmpl?: string\n isPureTmpl?: boolean\n isText?: boolean\n isDirective?: boolean\n directiveType?: string\n /** 指令真名(forEach/ifTrue/show/...)。directiveType 只是锚点类型(text|slot),\n * 不能用来判断指令种类——之前 render-effect 正是因此把所有结构指令都判成未知。 */\n directiveName?: string\n isProp?: boolean\n isToggleProp?: boolean\n isEvent?: boolean\n isRef?: boolean\n isRefAttr?: boolean\n /** TAG 指令的 this 链全前缀路径(运行时 varChain 空时回退) */\n directiveVarChain?: string[]\n}\n\ninterface Ctx {\n L: string[]\n nodeSn: number\n varIndex: number\n tmp: number\n slotStack: number[]\n errors: string[]\n vars: TemplateVarInfo[]\n opts: CodegenOptions\n /** 与 ups.push 同序的描述符收集(供 pointEffects codegen) */\n ups: UpOut[]\n /** nodeSn → 节点名(下标 = sn,与 nodes 数组同序) */\n nodeNames: string[]\n /** innerHTML 快路径(序列化进 HTML 串,body 只发射 ee/tc 行与 walk) */\n html: boolean\n /**\n * nodeSn → 从 fragment 根到该节点的 childNodes 下标链(编译期静态计算)。\n *\n * html 与 create 两条建树路径的**最终** DOM 结构一致,故路径唯一:html 快路径的\n * 文本占位符拆分(walkSplitText)产出的分段数,与 emitText 的 nodeSn 分配严格一一对应。\n * 只有 `needed` 集合里的路径会进产物(其余编译期丢弃,避免产物膨胀)。\n */\n paths: Map<number, number[]>\n /**\n * 运行时 renderTemplate 需**逐点访问**的 nodeSn(A+B):有 up 的节点、有 emptyEvents\n * 的节点、CompElem / `<slot>` 结构节点、被 up 引用的 slotNodeSn。\n * 产物里发射为同序的 `updateSns` + `updatePaths`;运行时只遍历它,免去对全部节点做\n * `upmMap[nodeSn]` 查表,也免去对整棵克隆树 collectNodes 回扫。\n */\n needed: Set<number>\n}\n\nfunction err(ctx: Ctx, msg: string) {\n ctx.errors.push(`[${ctx.opts.className}] ${msg}`)\n}\n\nfunction lowerName(ctx: Ctx, el: TElement, name: string): string {\n return el.ns === 'html' ? name.toLowerCase() : name\n}\n\nfunction varPartsOf(a: TAttr): TVarPart[] {\n return a.parts.filter((p): p is TVarPart => p.type === 'var')\n}\n\n/** attrTmpl:token 保留 Template 序编号(编号无语义影响)。 */\nfunction attrTmplOf(a: TAttr): string {\n return a.parts.map(p => (p.type === 'static' ? p.text : PLACEHOLDER + p.index)).join('')\n}\n\nexport function generateBuildTemplate(\n root: TNode[],\n vars: TemplateVarInfo[],\n opts: CodegenOptions,\n): CodegenResult {\n const html = !opts.forceCreate && canUseInnerHTML(root)\n const ctx: Ctx = {\n L: [],\n nodeSn: 0,\n varIndex: 0,\n tmp: 0,\n slotStack: [],\n errors: [],\n vars,\n opts,\n ups: [],\n nodeNames: [],\n html,\n paths: new Map(),\n needed: new Set(),\n }\n\n const rootPath: number[] = []\n const rootSib = { i: 0 }\n for (const nd of root) emitNode(ctx, nd, 'f', rootPath, rootSib)\n\n if (ctx.errors.length) return { code: null, errors: ctx.errors }\n\n // U3:ups 收集完毕后一次性字面量折叠\n const upsFields = ctx.ups.map(serializeUp)\n // A+B:按「需访问的 nodeSn 升序」发射 updateSns + 同序 updatePaths(运行时 resolvePath 解析)。\n const sns = [...ctx.needed].sort((a, b) => a - b)\n const updateSnsField = `const updateSns = [${sns.join(', ')}];`\n const updatePathsField = `const updatePaths = [${sns.map(sn => `[${(ctx.paths.get(sn) ?? []).join(', ')}]`).join(', ')}];`\n const bodyLines = [...ctx.L]\n if (html) bodyLines.push(...WALK_LINES)\n bodyLines.push(`const ups = [${upsFields.join(', ')}];`)\n bodyLines.push(updateSnsField)\n bodyLines.push(updatePathsField)\n const body = bodyLines.map(l => ' ' + l).join('\\n')\n //U6:document 别名提升到函数头(每实例一次,节点创建免全局对象属性链查找)\n const ret = ` return { fragment: f, ups: ups, emptyEvents: ee, nodes: nodes, updateSns: updateSns, updatePaths: updatePaths };\\n}`\n const code = html\n ? `function() {\n const d = document;\n const t = d.createElement('template');\n t.innerHTML = ${J(serializeTemplateHTML(root))};\n const f = t.content;\n const ee = {};\n const nodes = [];\n${body}\n${ret}`\n : `function() {\n const d = document;\n const f = d.createDocumentFragment();\n const ee = {};\n const nodes = [];\n${body}\n${ret}`\n return { code, errors: [], ups: ctx.ups, nodeNames: ctx.nodeNames, mode: html ? 'html' : 'create' }\n}\n\n/**\n * innerHTML 快路径的文本拆分 + 文档序收集。\n *\n * 这段约 1.2 KB 的自包含 walk 若**逐模板内联**生成(主模板 + 每个子模板各一份),\n * 是产物体积最大的单项浪费(实测 10 组件 × 3 子模板 = 20 份完全相同、minifier 无法去重的\n * 函数体,合计占产物 34.5%)。故提到运行时 `render.ts` 的 `walkSplitText`,\n * 产物只剩一行调用。\n *\n * `buildTemplate` / `subViews[id].buildTemplate` 均以 `.call(component)` 调用,\n * 故 `this` 恒为组件实例,用实例方法 `_ceWalkSplit` 转发,产物无需引入自由标识符。\n *\n * ⚠️ 位置敏感:walk 必须排在 `ups` 字面量折叠之前、且 push 序与编译期分配的 `nodeSn`\n * 严格一一对应(这是 `canUseInnerHTML` 保守性的依据)。改动请勿调整调用位置。\n */\nconst WALK_LINES: string[] = ['this._ceWalkSplit(f, nodes);']\n\n// ---------- 节点发射 ----------\n\nfunction emitNode(ctx: Ctx, nd: TNode, parentVar: string, parentPath: number[], sib: { i: number }) {\n if (nd.type === 'element') emitElement(ctx, nd, parentVar, parentPath, sib)\n else if (nd.type === 'text') emitText(ctx, nd, parentVar, parentPath, sib)\n else emitComment(ctx, nd, parentVar, parentPath, sib)\n}\n\nfunction emitComment(ctx: Ctx, nd: { type: 'comment'; text: string }, parentVar: string, _parentPath: number[], sib: { i: number }) {\n // 注释不计 nodeSn、不入 nodes(按元素/文本过滤),但**占一个 childNodes 位**\n // (html 串里保留 → 解析后仍在原位;create 路径同样 appendChild 一个注释节点)\n sib.i++\n // html 模式:注释已序列化进 HTML 串,无需创建行(parentVar 未用)\n if (ctx.html) return\n ctx.L.push(`${parentVar}.appendChild(d.createComment(${J(nd.text)}));`)\n}\n\nfunction emitElement(ctx: Ctx, el: TElement, parentVar: string, parentPath: number[], sib: { i: number }) {\n const idx = sib.i\n sib.i = idx + 1\n const sn = ctx.nodeSn++\n ctx.nodeNames.push(el.tag)\n const myPath = parentPath.concat(idx)\n ctx.paths.set(sn, myPath)\n\n // isCompElemNode 判定先于属性处理 → CompElem 自身的属性 up 也带 slotNodeSn(=自身 nodeSn)\n const isComp = ctx.opts.knownTags.has(el.tag.toLowerCase())\n if (isComp) ctx.slotStack.push(sn)\n // B:CompElem / <slot> 需在渲染期注册 wrapper / 绑定插槽 —— 即使该节点没有任何 up。\n // 自定义元素名必含 `-`(customElements.define 的硬约束),故 `-` 判定独立于 knownTags,\n // 覆盖「未被编译器登记但运行时已注册」的跨包标签;多余命中由运行时的 isCompElemNode 过滤。\n if (isComp || el.tag.indexOf('-') >= 0 || el.tag.toLowerCase() === 'slot') ctx.needed.add(sn)\n\n const childSib = { i: 0 }\n if (ctx.html) {\n // 元素已在 HTML 串中:只走编号/属性 up 收集,不发射创建与 append 行\n for (const a of el.attrs) emitAttr(ctx, el, a, sn, '')\n for (const c of el.children) emitNode(ctx, c, parentVar, myPath, childSib)\n if (isComp) ctx.slotStack.pop()\n return\n }\n\n const v = `n${ctx.tmp++}`\n const create =\n el.ns === 'svg'\n ? `d.createElementNS(${J(SVG_NS)}, ${J(el.tag)})`\n : `d.createElement(${J(el.tag)})`\n ctx.L.push(`const ${v} = ${create};`)\n ctx.L.push(`nodes.push(${v});`)\n\n for (const a of el.attrs) emitAttr(ctx, el, a, sn, v)\n\n ctx.L.push(`${parentVar}.appendChild(${v});`)\n\n for (const c of el.children) emitNode(ctx, c, v, myPath, childSib)\n if (isComp) ctx.slotStack.pop()\n}\n\nfunction emitText(ctx: Ctx, nd: { type: 'text'; raw: string; parts: any[] }, parentVar: string, parentPath: number[], sib: { i: number }) {\n const hasVar = nd.parts.some((p: any) => p.type === 'var')\n\n // 无插值:原样保留(含纯空白;parts<2 → 原样保留但占号)\n if (!hasVar) {\n const sn = ctx.nodeSn++\n ctx.nodeNames.push('#text')\n ctx.paths.set(sn, parentPath.concat(sib.i++))\n if (ctx.html) return\n const v = `n${ctx.tmp++}`\n ctx.L.push(`const ${v} = d.createTextNode(${J(nd.raw)});`)\n ctx.L.push(`nodes.push(${v});`)\n ctx.L.push(`${parentVar}.appendChild(${v});`)\n return\n }\n\n // 有插值:整体 trim 后分裂(静态片段 trim、空白片段丢弃、占位符为空文本节点)。\n // 每个分段占一个 childNodes 位;分段数与运行时 walkSplitText 严格一致(见 canUseInnerHTML 契约)。\n const whole = nd.raw.trim()\n const parts = splitParts(whole)\n\n for (const p of parts) {\n if (p.type === 'static') {\n const t = p.text.trim()\n if (!t) continue\n const sn = ctx.nodeSn++\n ctx.nodeNames.push('#text')\n ctx.paths.set(sn, parentPath.concat(sib.i++))\n if (ctx.html) continue\n const v = `n${ctx.tmp++}`\n ctx.L.push(`const ${v} = d.createTextNode(${J(t)});`)\n ctx.L.push(`nodes.push(${v});`)\n ctx.L.push(`${parentVar}.appendChild(${v});`)\n continue\n }\n // 占位符\n const sn = ctx.nodeSn++\n ctx.nodeNames.push('#text')\n ctx.paths.set(sn, parentPath.concat(sib.i++))\n if (!ctx.html) {\n const v = `n${ctx.tmp++}`\n ctx.L.push(`const ${v} = d.createTextNode('');`)\n ctx.L.push(`nodes.push(${v});`)\n ctx.L.push(`${parentVar}.appendChild(${v});`)\n }\n const info = ctx.vars[p.index]\n if (!info) {\n err(ctx, `插值槽 #${p.index} 未声明(内部错误)`)\n continue\n }\n const up: UpOut = { varIndex: ctx.varIndex++, nodeSn: sn, isText: true }\n if (info.isDirectiveCall) {\n up.isDirective = true\n // directiveType 必须与运行时 EnterPointType 枚举值一致(小写)\n up.directiveType = ctx.slotStack.length ? 'slot' : 'text'\n // 指令真名单独记录:directiveType 只是锚点类型,render-effect 需要真名来分派\n up.directiveName = info.directiveName\n if (ctx.slotStack.length) up.slotNodeSn = ctx.slotStack[ctx.slotStack.length - 1]\n }\n pushUp(ctx, up)\n }\n}\n\n// ---------- 属性发射(判定顺序见 CODEGEN §3.2) ----------\n\nfunction emitAttr(ctx: Ctx, el: TElement, a: TAttr, sn: number, elVar: string) {\n const name = a.name\n const vps = varPartsOf(a)\n\n // 1. 标签位指令(属性名整体为占位符)\n const tok = NAME_TOKEN_RE.exec(name)\n if (tok) {\n const info = ctx.vars[+tok[1]]\n if (!info) { err(ctx, `插值槽 #${tok[1]} 未声明`); return }\n if (!info.isDirectiveCall) {\n // 自定义指令(directive() 工厂产物):callee 是模块绑定的函数调用,extract 已记 moduleBindingName。\n // 若连模块绑定都不是(如表达式非直接 Identifier 调用),按字面量形态兜底放行 identifier(...)。\n if (!info.moduleBindingName && !/^[A-Za-z_$][\\w$]*\\s*\\(/.test(info.exprSource.trim())) {\n err(ctx, `标签位插值 \\${${info.exprSource}} 必须是指令调用(bind/show/classes/styles/model 等),` +\n `否则运行时 varIndex 将错位`)\n return\n }\n }\n const up: UpOut = { varIndex: ctx.varIndex++, nodeSn: sn, isDirective: true, directiveType: 'tag' }\n // directiveName 是 render-effect 判分派/结构性的唯一依据,缺了它 TAG 位指令会退化成\n // `rc._execDir(\"\", …)`,且在**子模板**里 isStructural 判定恒假 → 该点不生成任何语句。\n if (info.directiveName) up.directiveName = info.directiveName\n else if (info.moduleBindingName) up.directiveName = info.moduleBindingName\n if (info.directiveVarChain && info.directiveVarChain.length) up.directiveVarChain = info.directiveVarChain\n if (ctx.slotStack.length) up.slotNodeSn = ctx.slotStack[ctx.slotStack.length - 1]\n pushUp(ctx, up)\n return\n }\n\n // 2. slot-props:内部保留属性,忽略\n if (name === 'slot-props') {\n if (vps.length) err(ctx, `slot-props 不允许插值`)\n return\n }\n\n // 3. 事件\n if (name[0] === '@') {\n if (vps.length === 1) {\n const info = ctx.vars[vps[0].index]\n if (info?.isDirectiveCall) {\n err(ctx, `事件 ${name} 的插值不应是指令调用`)\n return\n }\n const up: UpOut = { varIndex: ctx.varIndex++, nodeSn: sn, isEvent: true, attrName: lowerName(ctx, el, name.slice(1)) }\n pushUp(ctx, up)\n return\n }\n if (vps.length === 0) {\n if ((a.value ?? '').trim() === '') {\n const ev = lowerName(ctx, el, name.slice(1))\n ctx.L.push(`(${eeGet(ctx, sn)}).push(${J(ev)});`)\n return\n }\n err(ctx, `事件 ${name} 的静态值会被丢弃(legacy 行为),请绑定函数`)\n return\n }\n err(ctx, `事件 ${name} 的值最多一个插值`)\n return\n }\n\n // 4. ref\n if (name === 'ref') {\n if (vps.length === 1) {\n const up: UpOut = { varIndex: ctx.varIndex++, nodeSn: sn, isRef: true }\n pushUp(ctx, up)\n return\n }\n err(ctx, `静态 ref=\"${a.value ?? ''}\" 会被 legacy 静默丢弃;请使用 createRef 绑定`)\n return\n }\n\n // 5. 尾点属性(propPerfix,跨框架兼容):不产生 up、不消耗槽\n if (name.endsWith('.')) {\n if (vps.length) err(ctx, `尾点属性 ${name} 的插值在 legacy 中不消耗槽位(会引发 varIndex 错位),不支持`)\n return\n }\n\n // 6. 带插值的属性\n if (vps.length === 1) {\n const info = ctx.vars[vps[0].index]\n // 仅拒绝内置指令误用在属性值位;自定义指令/普通模块函数调用(map/format 等)是合法值表达式\n if (info?.isDirectiveCall && info.directiveName && BUILTIN_DIRECTIVES.has(info.directiveName)) {\n err(ctx, `属性 ${name} 的插值 \\${${info.exprSource}} 是指令调用,但该位置只接受值;指令应写在标签位 <el \\${...}>`)\n return\n }\n const up: UpOut = { varIndex: ctx.varIndex++, nodeSn: sn }\n if (ctx.slotStack.length) up.slotNodeSn = ctx.slotStack[ctx.slotStack.length - 1]\n if (name[0] === '.') {\n // prop:目标必须是已注册 CompElem(或 <slot>)\n if (!ctx.opts.knownTags.has(el.tag.toLowerCase()) && el.tag.toLowerCase() !== 'slot') {\n err(ctx, `Prop ${name} 只能设置在 CompElem 或 <slot> 上(<${el.tag}> 未注册)`)\n }\n up.isProp = true\n up.attrName = name.slice(1)\n } else if (name[0] === '?') {\n up.isToggleProp = true\n up.attrName = lowerName(ctx, el, name.slice(1))\n } else if (name[0] === '*') {\n // refAttr:*name[:camel|:kebab|:snake]\n const spec = lowerName(ctx, el, name.slice(1))\n const colon = spec.indexOf(':')\n const refName = colon < 0 ? spec : spec.slice(0, colon)\n const fmt = colon < 0 ? '' : spec.slice(colon + 1)\n let converted = refName\n if (fmt === 'camel') converted = camelCase(refName)\n else if (fmt === 'kebab') converted = kebabCase(refName)\n else if (fmt === 'snake') converted = snakeCase(refName)\n else if (fmt !== '') err(ctx, `*${name.slice(1)} 的格式后缀仅支持 :camel/:kebab/:snake,收到 ':${fmt}'`)\n up.isRefAttr = true\n up.attrName = converted\n } else {\n up.attrName = lowerName(ctx, el, name)\n up.attrTmpl = attrTmplOf(a)\n // isPureTmpl:value === PLACEHOLDER + varIndex(upm 序严格相等)\n up.isPureTmpl = a.parts.length === 1 && vps[0].index === up.varIndex\n }\n pushUp(ctx, up)\n return\n }\n if (vps.length > 1) {\n err(ctx, `属性 ${name} 的值最多一个插值`)\n return\n }\n\n // 7. 纯静态属性\n if (name[0] === '.' || name[0] === '?' || name[0] === '*') {\n err(ctx, `前缀属性 ${name} 不允许静态值(无插值);legacy 中该属性会被原样残留在 DOM`)\n return\n }\n // html 模式:静态属性已序列化进 HTML 串(不产生创建期 setAttribute 行)\n if (ctx.html) return\n ctx.L.push(`${elVar}.setAttribute(${J(el.ns === 'html' ? name.toLowerCase() : name)}, ${J(a.value ?? '')});`)\n}\n\nfunction eeGet(ctx: Ctx, sn: number): string {\n // B:空事件写法(`@ev` 无值)的节点没有任何 up,但渲染期需注册 noop 监听 → 必须进 updateSns 表。\n ctx.needed.add(sn)\n return `ee[${sn}] ?? (ee[${sn}] = [])`\n}\n\nfunction pushUp(ctx: Ctx, up: UpOut) {\n up.ux = ctx.ups.length\n ctx.ups.push(up)\n // B:有 up 的节点(及其 slotNodeSn 锚点)必须在运行时被逐点访问。\n ctx.needed.add(up.nodeSn)\n if (up.slotNodeSn !== undefined && up.slotNodeSn > -1) ctx.needed.add(up.slotNodeSn)\n}\n\n/**\n * **仅供编译期消费、运行时从不读取**的 up 字段 —— 不写进 `ups` 字面量。\n *\n * `directiveName`:render-effect 靠它区分结构指令 / 判 show/classes/… 形态,但那是在\n * codegen 阶段读 `UpOut` 对象本身(同一进程内),产物里的 `ups` 用不到 ——\n * compelem 运行时对 `directiveName` 的引用数为 **0**。\n *\n * 该键名长且**不会被 minifier 压缩**(对象字面量键在产物里是数据)。\n *\n * 注:`isPureTmpl` 同样是运行时未读字段,但它属于 `ups` 的既有形状契约\n * (template-codegen-e2e 的 A7/A8/C3/H4 断言它),此处保留。\n */\nconst CODEGEN_ONLY_UP_KEYS = new Set(['directiveName'])\n\n/**\n * 单个 up 描述符 → 对象字面量源码。\n *\n * **`ux` / `varIndex` 恒等于该条目在 `ups` 数组里的下标**(`ux` 由 `pushUp` 写\n * `ctx.ups.length`,`varIndex` 由 `ctx.varIndex++`,两者与 push 严格配对),因此\n * 这两个字段是纯冗余 —— 全量实测 145/145 条成立。省掉它们可减产物约 4%。\n *\n * **自守卫**:只在 `=== idx` 时才省,一旦哪天不变量被破坏(例如将来出现不经过\n * `pushUp` 的 ups 路径),就显式写出,不会静默错位。运行期\n * `hydrateBuiltTemplate` 按下标回填,对**显式带值**的产物同样兼容。\n */\nfunction serializeUp(up: UpOut, idx: number): string {\n const fields = Object.entries(up)\n .filter(([k, v]) => {\n if (v === undefined || CODEGEN_ONLY_UP_KEYS.has(k)) return false\n // 恒等于下标的两个字段:剔除(renderTemplate 用 `fx[upm.ux]`、\n // UpdatePoint 构造用 `upm.varIndex`,两者都在 hydrate 时由下标补齐)\n if (k === 'ux') return up.ux !== idx\n if (k === 'varIndex') return up.varIndex !== idx\n return true\n })\n .map(([k, v]) => `${k}: ${typeof v === 'number' ? v : J(v)}`)\n return `{ ${fields.join(', ')} }`\n}\n","/**\n * buildVars codegen:主模板插值表达式 → 运行时静态取值函数。\n *\n * 生成物形态(docs/TEMPLATE-CODEGEN.md §2 补充):\n *\n * function(__comp) { return [expr0, expr2, ...] }\n *\n * - 与 buildTemplate 的 varIndex 空间严格对齐。\n * - 表达式源码原样复制(module 作用域标识符、指令调用在组件源文件内可解析),\n * 仅做 `this` → `__comp` 改写(含字符串/模板字面量上下文感知的扫描)。\n * - 自由标识符校验:表达式内的自由标识符必须是模块绑定 / compelem 导入 /\n * 安全全局,否则返回 errors(组件不可编译)——\n * render() 局部变量无法在注入的静态函数作用域内解析。\n */\nimport { keyName, parse } from '../utils/oxc'\nimport { IMPURE_GLOBALS as IMPURE_GLOBAL_SET, KNOWN_GLOBALS } from '../utils/globals'\nimport type { ComponentAnalysis } from '../types'\nimport { TS_SYNTAX_RE, type MainTemplate } from '../analyze/template-extract'\nimport { COMpelem_DIRECTIVES } from '../analyze/render-body'\nimport {\n applySubIdWraps,\n partitionDirectiveArgs,\n stripTs,\n type SubCandidate,\n} from '../analyze/template-subs'\n\nexport interface BuildVarsResult {\n code: string | null\n errors: string[]\n /**\n * 表达式中用到的 `super.METHOD` 名集合:调用点已改写为\n * `__comp.__ce_s_METHOD(...)`,需在 class 体注入同名转发方法\n * (保留 home-object 的 super 绑定,供静态取值函数调用)。\n */\n superHelpers?: string[]\n /**\n * 自由标识符(解析成功但 filterFree 拒绝时)——供 C1 判断是否可闭包提升到父级。\n * 仅在 `code == null` 且因自由标识符失败时填充。\n */\n freeIds?: string[]\n /** C1:已闭包提升为回调实例 __bv(不写入 subs[]) */\n lifted?: boolean\n /**\n * 表达式脏依赖映射——根名 → 取值函数输出数组下标;特殊键 `''` 为\n * **常脏**下标(含动态 this / 未知 getter / 方法或 super 调用 / 不纯自由标识符\n * (Date/console/document/window/globalThis)/ 无法解析的表达式),任一视图\n * 更新都重算。与 guarded codegen 配对:取值函数只对 dirty 内下标求值,\n * 其余槽位返回占位值(区间扫描不读)。仅 verbose 依赖清单展示使用。\n */\n viewDepVarIndices?: Record<string, number[]>\n}\n\n/** generateBuildVars/generateSubBuildVars 可选项:C1 闭包提升 extras + 祖先形参白名单。 */\nexport interface BuildVarsOptions {\n /** subId → Object.assign 追加属性(`, __bv: function...`),由 applySubIdWraps 消费 */\n extras?: ReadonlyMap<number, string>\n /**\n * subId → 模块级 carrier 常量名(自洽子模板)。有 extras 的候选不消费它\n * (必须逐次新建才能捕获祖先形参);无 extras 时直接引用常量,\n * 省掉每次更新重跑 fx 工厂里的 `Object.assign` + 新建闭包。\n */\n carriers?: ReadonlyMap<number, string>\n /** 额外允许的自由标识符(C1:祖先回调形参,生成 __bv 时闭包捕获) */\n extraAllowed?: ReadonlySet<string>\n /**\n * U2:自由标识符校验结果缓存(同一 compileFile 内 comp 相同,fnRaw → free 集合)。\n * C1 两阶段会对同一子模板多次调用 generateSubBuildVars(初试/提升/regen),\n * 免重复 hash + walk。仅 freeIdentifiersInFn 消费;调用方只读返回集合。\n */\n freeCache?: Map<string, Set<string> | null>\n /**\n * verbose 依赖展示(DepSummary 的根名→var 映射)才需要 per-var 链分类:\n * 子模板路径每插值多一次字符串 parse,默认关闭(该映射仅 verbose/CE_DEPS_DEBUG 展示用)。\n */\n depsDisplay?: boolean\n}\n\n/** 允许的自由标识符白名单(表达式求值环境 = 模块作用域 + __comp 参数)。\n * 与 analyze/render-body 的 D3 判定**共用同一份**(utils/globals.ts):\n * 两处各持一份会导致 Map/Set/queueMicrotask 等通过 D3 却在 filterFree 被拒,\n * 且报错信息误称其为「render() 局部标识符」。 */\nconst SAFE_GLOBALS = KNOWN_GLOBALS\n\n/**\n * SAFE_GLOBALS 中**不纯**的子集:值依赖外部状态/时钟,脏依赖映射无法静态归因\n * → 引用它们的表达式整体归入常脏(任一视图更新都重算,与全量求值行为一致)。\n */\nconst IMPURE_GLOBALS = IMPURE_GLOBAL_SET\n\n// ---------- this 改写(字符串/模板字面量上下文感知) ----------\n\n/**\n * 把表达式源码中的 `this` 全部改写为 `thisName`(默认 `__comp`)。\n * 引号串与模板字面量内容不改写;模板字面量内的 `${...}` 表达式属于 JS 上下文,\n * 其中的 this 一并改写(子视图模板经 tmplFn.call(component) 求值,语义等价)。\n * 返回 null 表示改写后引号不配对(不可能出现在合法 JS 中,防御性返回)。\n *\n * `thisName`:buildVars 的形参名是 `__comp`;per-point effect 的形参是 `rc`,\n * 内联表达式时传 `'rc'`(同一份扫描逻辑,两个调用点)。\n */\nexport function rewriteThis(src: string, thisName = '__comp'): string | null {\n let out = ''\n // 上下文栈:'code | \"'\" | '\"' | '`'。模板内 `${` 压入 code(带独立花括号深度)。\n const stack: Array<{ t: string; brace?: number }> = [{ t: 'code', brace: 0 }]\n let i = 0\n const n = src.length\n while (i < n) {\n const top = stack[stack.length - 1]\n const c = src[i]\n if (top.t === 'sq' || top.t === 'dq' || top.t === \"'\" || top.t === '\"') {\n if (c === '\\\\') {\n out += src.slice(i, i + 2)\n i += 2\n continue\n }\n if (top.t === c) {\n stack.pop()\n }\n out += c\n i++\n continue\n }\n if (top.t === 'tpl' || top.t === '`') {\n if (c === '\\\\') {\n out += src.slice(i, i + 2)\n i += 2\n continue\n }\n if (c === '`') {\n stack.pop()\n out += c\n i++\n continue\n }\n if (c === '$' && src[i + 1] === '{') {\n stack.push({ t: 'code', brace: 0 })\n out += '${'\n i += 2\n continue\n }\n out += c\n i++\n continue\n }\n // code 上下文\n if (c === \"'\" || c === '\"' || c === '`') {\n stack.push({ t: c })\n out += c\n i++\n continue\n }\n if (c === '{') {\n top.brace = (top.brace ?? 0) + 1\n out += c\n i++\n continue\n }\n if (c === '}') {\n if ((top.brace ?? 0) === 0 && stack.length > 1) {\n // 回到外层模板字面量\n stack.pop()\n out += c\n i++\n continue\n }\n top.brace = (top.brace ?? 0) - 1\n out += c\n i++\n continue\n }\n if (c === 't' && src.startsWith('this', i)) {\n const prev = i > 0 ? src[i - 1] : ''\n const next = i + 4 < n ? src[i + 4] : ''\n const isWord = (ch: string) => /[A-Za-z0-9_$]/.test(ch)\n if (!isWord(prev) && !isWord(next)) {\n out += thisName\n i += 4\n continue\n }\n }\n out += c\n i++\n }\n if (stack.length !== 1) return null\n return out\n}\n\n/**\n * 把表达式中的 `super.METHOD` 改写为 `__comp.__ce_s_METHOD`,\n * 并把 METHOD 收集进 helpers(供 class 体注入 `__ce_s_METHOD(...args){ return super.METHOD(...args) }`)。\n * 仅处理方法调用形态 `super.name(...)` / 方法引用;`super` 本身保留在\n * 原始 render() 内(本函数只用于抽出的静态表达式)。\n */\nexport function rewriteSuper(src: string, helpers: Set<string>): string {\n return src.replace(/\\bsuper\\.([A-Za-z_$][\\w$]*)\\s*(?=\\()/g, (_m, name: string) => {\n helpers.add(name)\n return `__comp.__ce_s_${name}`\n })\n}\n\n// ---------- 自由标识符校验(oxc AST 精确解析) ----------\n\n/** 表达式 this 链分类收集——roots 命中响应式字段的根名;uncertain 放弃静态分类。 */\ninterface ChainOut {\n roots: Set<string>\n uncertain: boolean\n}\n\n/**\n * 从 MemberExpression 沿非计算成员上溯分类:\n * - this 链且根 ∈ comp.fields → roots.add(根)(changed 键首段命中即重算,祖先键必达 ✓)\n * - this 链但根 ∉ fields(跨文件基类 prop/state/computed、方法、普通 getter)→ roots.add(根)\n * 同时 uncertain(内部依赖未知 → 常脏保底):按名建键让 viewDepVarIndices/依赖清单可见,\n * 常脏保证槽位每次更新都重求值(脏集是并集)\n * - `this[expr]` 动态访问 / `super.X` → uncertain\n * - 局部/形参/自由标识符起始 → 不记录(依赖已由产生它的表达式侧覆盖)\n * 从链中段与完整链各上溯一次仅造成 roots 重复(Set 去重),无副作用。\n */\nfunction classifyThisChain(node: any, out: ChainOut, comp?: ComponentAnalysis): void {\n const chain: string[] = []\n let cur: any = node\n while (cur && (cur.type === 'MemberExpression' || cur.type === 'OptionalMemberExpression')) {\n if (cur.computed) break\n const name = keyName(cur.property)\n if (!name) break\n chain.unshift(name)\n cur = cur.object\n }\n if (cur?.type === 'ThisExpression') {\n if (!chain.length) return // 裸 `this` 无依赖\n if (comp?.fields?.get(chain[0])) out.roots.add(chain[0])\n else {\n out.roots.add(chain[0])\n out.uncertain = true\n }\n } else if (cur?.type === 'Super') {\n out.uncertain = true\n } else if (node.object?.type === 'ThisExpression' && node.computed) {\n out.uncertain = true // this[expr]\n }\n}\n\n/**\n * 解析表达式并收集自由标识符(不在任何函数参数/局部声明、且非属性访问位置的)。\n * 解析失败返回 null(调用方放弃注入)。\n *\n * @param comp 提供 compelem 指令识别:模板回调实参整棵跳过(其自由标识符由子模板\n * freeIdentifiersInFn 单独校验),避免把回调闭包误报为主表达式依赖。\n * @param chainOut 可选——同时分类收集 this 链根名(与自由标识符同一次解析)。\n */\nfunction freeIdentifiers(expr: string, comp?: ComponentAnalysis, chainOut?: ChainOut): Set<string> | null {\n let ret: any\n try {\n const parsed = parse(`(function(){ return (${expr}) })`, 'buildvars-check.js')\n const fnBody = parsed.program?.body?.[0]?.expression?.body\n ret = Array.isArray(fnBody?.body)\n ? fnBody.body.find((s: any) => s?.type === 'ReturnStatement')?.argument\n : fnBody?.argument\n } catch {\n return null\n }\n if (!ret) return null\n return collectFreeWalk(ret, comp, chainOut)\n}\n\n/**\n * U2:对模块 AST 中已解析的表达式节点直接收集(免 wrapper 重复 parse)。\n *\n * 语义等价性:wrapper 是无参空环境函数,walk 从 ReturnStatement.argument 起步,\n * wrapper 本身不贡献任何作用域——直接以同一初始 scope walk 模块节点逐字一致。\n * `wrapperRisky` 命中(await/yield 等会让非 async wrapper parse 失败、而模块侧\n * 合法的构造)时回退字符串路径(含 parse 失败 → null)。\n *\n * @param exprSource 该节点的原始源码切片——风险回退路径用\n */\nfunction freeIdentifiersFromNode(\n node: any,\n exprSource: string,\n comp?: ComponentAnalysis,\n chainOut?: ChainOut,\n): Set<string> | null {\n if (!node || typeof node.type !== 'string' || wrapperRisky(node)) {\n return freeIdentifiers(exprSource, comp, chainOut)\n }\n return collectFreeWalk(node, comp, chainOut)\n}\n\n/**\n * 检测「wrapper parse 会失败、但模块 AST 合法」的构造:非嵌套函数内的\n * await/yield(wrapper 非 async/非 generator)。嵌套函数内部不下钻——\n * 其 await/yield 在两侧均合法(wrapper 亦然)。宁可多判:多判只回退\n * 字符串路径(行为不变),漏判会改变行为。\n */\nfunction wrapperRisky(node: any): boolean {\n let risky = false\n const visit = (n: any): void => {\n if (!n || typeof n.type !== 'string' || risky) return\n const t = n.type\n if (t === 'AwaitExpression' || t === 'YieldExpression') {\n risky = true\n return\n }\n if (\n t === 'FunctionExpression' ||\n t === 'FunctionDeclaration' ||\n t === 'ArrowFunctionExpression' ||\n t === 'MethodDefinition'\n ) {\n return\n }\n for (const k of Object.keys(n)) {\n if (k === 'type' || k === 'start' || k === 'end' || k === 'parent') continue\n const v = n[k]\n if (Array.isArray(v)) {\n for (const c of v) {\n visit(c)\n if (risky) return\n }\n } else if (v && typeof v === 'object' && typeof v.type === 'string') {\n visit(v)\n if (risky) return\n }\n }\n }\n visit(node)\n return risky\n}\n\n/** 自由标识符/this 链收集的共享 walk 体(string 解析路径与 node 直行走同一实现)。 */\nfunction collectFreeWalk(ret: any, comp?: ComponentAnalysis, chainOut?: ChainOut): Set<string> {\n const free = new Set<string>()\n const scopes: Set<string>[] = [new Set()]\n\n const inScope = (name: string) => scopes.some((s) => s.has(name))\n\n const collectParams = (fn: any): Set<string> => {\n const s = new Set<string>()\n for (const p of fn.params ?? []) addPatternNames(p, s)\n return s\n }\n const addPatternNames = (pat: any, s: Set<string>) => {\n if (!pat) return\n switch (pat.type) {\n case 'Identifier':\n s.add(pat.name)\n break\n case 'ObjectPattern':\n for (const p of pat.properties ?? []) {\n if (p.type === 'RestElement') addPatternNames(p.argument, s)\n else addPatternNames(p.value ?? p.key, s)\n }\n break\n case 'ArrayPattern':\n for (const el of pat.elements ?? []) addPatternNames(el, s)\n break\n case 'AssignmentPattern':\n addPatternNames(pat.left, s)\n break\n case 'RestElement':\n addPatternNames(pat.argument, s)\n break\n }\n }\n\n /** 解构默认值表达式求值(绑定名本身由 addPatternNames 入作用域)。 */\n const walkPatternDefaults = (pat: any): void => {\n if (!pat) return\n switch (pat.type) {\n case 'AssignmentPattern':\n walkPatternDefaults(pat.left)\n walk(pat.right, false)\n break\n case 'ObjectPattern':\n for (const p of pat.properties ?? []) {\n if (p.type === 'RestElement') walkPatternDefaults(p.argument)\n else walkPatternDefaults(p.value ?? p.key)\n }\n break\n case 'ArrayPattern':\n for (const el of pat.elements ?? []) walkPatternDefaults(el)\n break\n case 'RestElement':\n walkPatternDefaults(pat.argument)\n break\n }\n }\n\n const isDirectiveCallee = (node: any): string | null => {\n if (!comp) return null\n if (node.type !== 'CallExpression' || node.callee?.type !== 'Identifier') return null\n const imported = comp.compelemImports.get(node.callee.name)\n if (imported && COMpelem_DIRECTIVES.has(imported)) return imported\n // 自定义指令(moduleBindings 内的模块级函数调用)\n if (comp.moduleBindings?.has(node.callee.name)) return node.callee.name\n return null\n }\n\n const walk = (node: any, isPropPos: boolean): void => {\n if (!node || typeof node.type !== 'string') return\n switch (node.type) {\n case 'Identifier':\n if (!isPropPos && !inScope(node.name)) free.add(node.name)\n return\n case 'ThisExpression':\n case 'Super':\n return\n case 'MemberExpression':\n if (chainOut) classifyThisChain(node, chainOut, comp)\n walk(node.object, false)\n walk(node.property, !node.computed)\n return\n case 'Property':\n walk(node.key, !node.computed)\n walk(node.value, false)\n return\n case 'FunctionExpression':\n case 'FunctionDeclaration':\n case 'ArrowFunctionExpression': {\n const s = collectParams(node)\n // 参数默认值在参数作用域内求值\n for (const p of node.params ?? []) walkIn(p, s)\n scopes.push(s)\n walk(node.body, false)\n scopes.pop()\n return\n }\n case 'CatchClause': {\n const s = new Set<string>()\n if (node.param) addPatternNames(node.param, s)\n scopes.push(s)\n walk(node.body, false)\n scopes.pop()\n return\n }\n case 'VariableDeclaration': {\n const scope = scopes[scopes.length - 1]\n for (const d of node.declarations ?? []) {\n addPatternNames(d.id, scope)\n walkPatternDefaults(d.id)\n walk(d.init, false)\n }\n return\n }\n case 'CallExpression': {\n const directive = isDirectiveCallee(node)\n if (directive) {\n const args: any[] = node.arguments ?? []\n const flags = partitionDirectiveArgs(directive, args)\n walk(node.callee, true)\n args.forEach((arg, i) => {\n const isTmpl = flags[i]\n const isFn =\n arg && (arg.type === 'ArrowFunctionExpression' || arg.type === 'FunctionExpression')\n if (isTmpl && isFn) return\n walk(arg, false)\n })\n return\n }\n break\n }\n }\n for (const k of Object.keys(node)) {\n if (k === 'type' || k === 'start' || k === 'end' || k === 'parent') continue\n const v = (node as any)[k]\n if (Array.isArray(v)) for (const c of v) walk(c, false)\n else if (v && typeof v === 'object' && typeof v.type === 'string') walk(v, false)\n }\n }\n const walkIn = (node: any, s: Set<string>) => {\n scopes.push(s)\n walk(node, false)\n scopes.pop()\n }\n\n walk(ret, false)\n return free\n}\n\n/**\n * 对完整子模板函数源码做自由标识符校验(params/prelude 入 scope 后检查 exprs)。\n * U2:`cache`(同一 compileFile 内 comp 恒定)命中时免重复 hash+walk——C1 两阶段\n * 对同一 fnRaw 多次调用(初试/提升/regen)全部命中。缓存与返回值互不共享可变引用。\n */\nfunction freeIdentifiersInFn(\n fnSrc: string,\n comp: ComponentAnalysis,\n cache?: Map<string, Set<string> | null>,\n): Set<string> | null {\n if (!cache) return freeIdentifiers(fnSrc, comp)\n const hit = cache.get(fnSrc)\n if (hit !== undefined) return hit === null ? null : new Set(hit)\n const r = freeIdentifiers(fnSrc, comp)\n cache.set(fnSrc, r === null ? null : new Set(r))\n return r\n}\n\nfunction filterFree(\n free: Set<string> | null,\n comp: ComponentAnalysis,\n label: string,\n extraAllowed?: ReadonlySet<string>,\n): string[] | null {\n if (free == null) return [`${label} 无法解析为 AST,放弃 buildVars 注入`]\n for (const name of free) {\n if (comp.moduleBindings.has(name) || comp.compelemImports.has(name) || SAFE_GLOBALS.has(name))\n continue\n if (extraAllowed?.has(name)) continue\n return [\n `${label} 引用了 render() 局部标识符 '${name}',无法在静态 buildVars 作用域内解析`,\n ]\n }\n return null\n}\n\n/** filterFree 失败时收集未通过的名字(C1 闭包提升判定用)。 */\nfunction collectRejectedFree(\n free: Set<string> | null,\n comp: ComponentAnalysis,\n): string[] {\n if (!free) return []\n const out: string[] = []\n for (const name of free) {\n if (comp.moduleBindings.has(name) || comp.compelemImports.has(name) || SAFE_GLOBALS.has(name))\n continue\n out.push(name)\n }\n return out\n}\n\n/**\n * 生成 buildVars 函数源码。任一插值无法安全静态化 → 返回 errors(调用方放弃注入)。\n *\n * @param source 原始源文件全文(子模板 wraps 用;缺省时跳过 wraps)\n * @param candidates 子模板候选(与 source 配对)\n */\nexport function generateBuildVars(\n tmpl: MainTemplate,\n comp: ComponentAnalysis,\n source?: string,\n candidates?: SubCandidate[],\n opts?: BuildVarsOptions,\n): BuildVarsResult {\n const exprs: string[] = []\n const superHelpers = new Set<string>()\n const hasWraps = source != null && !!candidates?.length\n const extras = opts?.extras\n // 根名/'' → 输出下标脏映射;'' 收集常脏(uncertain/不纯)表达式\n const biMap: Record<string, number[]> = {}\n const alwaysDirty: number[] = []\n for (const v of tmpl.vars) {\n const label = `插值 #${v.index}`\n // 顺序:raw free-check(跳过模板回调)→ wraps → stripTs → TS 复检 → super 改写 → this 改写\n const chainOut: ChainOut = { roots: new Set(), uncertain: false }\n // U2:模块 AST 节点直达(免 wrapper 重 parse);节点缺失(手工构造 vars)回退字符串路径\n const free = v.node\n ? freeIdentifiersFromNode(v.node, v.exprSource, comp, chainOut)\n : freeIdentifiers(v.exprSource, comp, chainOut)\n const freeErr = filterFree(free, comp, label, opts?.extraAllowed)\n if (freeErr) {\n return { code: null, errors: freeErr, freeIds: collectRejectedFree(free, comp) }\n }\n // 自由标识符纯度——不纯全局(Date.now/document/window 等)→ 常脏\n let impureFree = false\n if (free) {\n for (const name of free) {\n if (IMPURE_GLOBALS.has(name)) {\n impureFree = true\n break\n }\n }\n }\n\n let src = v.exprSource\n if (hasWraps && typeof v.start === 'number' && typeof v.end === 'number') {\n src = applySubIdWraps(v.start, v.end, source!, candidates!, extras, opts?.carriers)\n }\n src = stripTs(src)\n if (TS_SYNTAX_RE.test(src)) {\n return { code: null, errors: [`${label} 含 TS 专有语法(as/satisfies/非空断言),放弃注入`] }\n }\n src = rewriteSuper(src, superHelpers)\n const rw = rewriteThis(src)\n if (rw == null) {\n return { code: null, errors: [`${label} 的 this 改写失败(引号上下文异常)`] }\n }\n const outIdx = exprs.length\n if (chainOut.uncertain || impureFree) {\n alwaysDirty.push(outIdx)\n }\n // 按名映射与常脏**双写**(脏集是并集,行为不变):uncertain 表达式里的已知/未声明根\n // 同样建键 → 依赖清单能按变量展示其槽位与 updater('' 常脏仅作保底)。\n if (chainOut.roots.size) {\n for (const r of chainOut.roots) {\n let arr = biMap[r]\n if (!arr) biMap[r] = arr = []\n arr.push(outIdx)\n }\n }\n exprs.push(rw)\n }\n // guarded codegen——取值函数只对 __d 内下标求值,干净槽位返回占位 0\n // (区间扫描不读);无 __d 即全量求值。\n const guarded = exprs.map((e, i) => `__d&&!__d.has(${i})?0:${e}`)\n const code = `function(__comp, __d) { return [${guarded.join(', ')}] }`\n if (alwaysDirty.length) biMap[''] = alwaysDirty\n const hasBi = Object.keys(biMap).length > 0\n return {\n code,\n errors: [],\n superHelpers: superHelpers.size ? [...superHelpers] : [],\n viewDepVarIndices: hasBi ? biMap : undefined,\n }\n}\n\n/**\n * 生成子模板 buildVars:`function(__comp, ...params) { prelude; return [exprs] }`。\n * prelude 与 exprs 均做 wraps(嵌套回调标 __subId)→ stripTs → TS 复检 → this 改写。\n */\nexport function generateSubBuildVars(\n cand: SubCandidate,\n source: string,\n comp: ComponentAnalysis,\n allCandidates: readonly SubCandidate[],\n opts?: BuildVarsOptions,\n): BuildVarsResult {\n const label = `子模板 sub#${cand.subId}`\n const paramsCode = cand.params.length ? `, ${cand.params.join(', ')}` : ''\n const superHelpers = new Set<string>()\n const extras = opts?.extras\n\n // ---- raw free-check(wraps 前,带指令模板回调跳过)----\n const rawPrelude = cand.preludeSrc\n const rawExprs = cand.vars.map((v) => v.exprSource)\n // prelude 与 return 之间必须有换行:prelude 可能以 `!`(非空断言)结尾,\n // 同行 `return` 不会触发 ASI,直接语法错误。\n const fnRaw = `function(__comp${paramsCode}) { ${rawPrelude}\\nreturn [${rawExprs.join(', ')}] }`\n const free = freeIdentifiersInFn(fnRaw, comp, opts?.freeCache)\n const freeErr = filterFree(free, comp, label, opts?.extraAllowed)\n if (freeErr) {\n return { code: null, errors: freeErr, freeIds: collectRejectedFree(free, comp) }\n }\n\n // ---- prelude:wraps → stripTs → TS 复检 → super 改写 ----\n let preludeOut = ''\n if (rawPrelude) {\n preludeOut = applySubIdWraps(cand.preludeStart, cand.preludeEnd, source, allCandidates, extras, opts?.carriers)\n preludeOut = stripTs(preludeOut)\n if (TS_SYNTAX_RE.test(preludeOut)) {\n return { code: null, errors: [`${label} prelude 含 TS 专有语法,放弃注入`] }\n }\n preludeOut = rewriteSuper(preludeOut, superHelpers)\n }\n\n // ---- exprs ----\n // 展示用根名分类:子模板取值函数恒全量求值,此映射仅供依赖清单的更新映射展示\n // —— 默认跳过(省每插值一次字符串 parse + 链分类),仅 depsDisplay(verbose)时计算\n const depsDisplay = opts?.depsDisplay === true\n const biMap: Record<string, number[]> = {}\n const alwaysDirty: number[] = []\n const exprsOut: string[] = []\n for (const v of cand.vars) {\n let src =\n typeof v.start === 'number' && typeof v.end === 'number'\n ? applySubIdWraps(v.start, v.end, source, allCandidates, extras, opts?.carriers)\n : v.exprSource\n let chainOut: ChainOut | null = depsDisplay ? { roots: new Set(), uncertain: false } : null\n if (chainOut) freeIdentifiers(src, comp, chainOut)\n src = stripTs(src)\n if (TS_SYNTAX_RE.test(src)) {\n return { code: null, errors: [`${label} 插值 #${v.index} 含 TS 专有语法,放弃注入`] }\n }\n src = rewriteSuper(src, superHelpers)\n const rw = rewriteThis(src)\n if (rw == null) {\n return { code: null, errors: [`${label} 插值 #${v.index} 的 this 改写失败`] }\n }\n exprsOut.push(rw)\n if (chainOut) {\n const outIdx = exprsOut.length - 1\n if (chainOut.uncertain) alwaysDirty.push(outIdx)\n // 与主 buildVars 同构:按名映射与常脏双写(sub 运行时恒全量求值,纯展示)\n if (chainOut.roots.size) {\n for (const r of chainOut.roots) {\n let arr = biMap[r]\n if (!arr) biMap[r] = arr = []\n arr.push(outIdx)\n }\n }\n }\n }\n if (alwaysDirty.length) biMap[''] = alwaysDirty\n\n const code = `function(__comp${paramsCode}) { ${preludeOut}\\nreturn [${exprsOut.join(', ')}] }`\n return {\n code,\n errors: [],\n superHelpers: superHelpers.size ? [...superHelpers] : [],\n viewDepVarIndices: depsDisplay && Object.keys(biMap).length ? biMap : undefined,\n }\n}\n","/**\r\n* per-point effect codegen:UpOut 描述符 → effect 工厂函数源码。\r\n *\r\n * 主模板:每个更新点一个工厂 `(rc, nodes) => effectFn`,读 `rc.__s[root].value`。\r\n * 子模板:整个子模板**合并成一个**工厂 `(rc, nodes, get, dep) => effectFn`,\r\n * 内部逐点守卫写 DOM(见 generateSubRenderEffect)。\r\n *\r\n * 守卫一律写作 `值 !== 旧值 || rc.__f`:`rc.__f` 是 CompElem 的强制刷新标志,\r\n * 由 `forceUpdate()` 在重跑本组件全部 view effect 期间置位 —— 纯信号模型下\r\n * 值未变就没有别的强制重渲染通道,靠它让各点重新落盘。常态下它只是一个布尔\r\n * 字段读取,`||` 短路后无额外开销。\r\n *\r\n * **写入步一律 emit 成 `rc._wXxx(...)` 调用,不内联函数体。**\r\n * `_t2s` 的转换逻辑、`if (t !== n.textContent)` 这类幂等守卫、`setAttribute` 的\r\n * 字符串拼接,全部由 CompElem 上的 `_wText/_wAttr/_wAttrT/_wClass/_wStyle/_wShow`\r\n * 承担(render.ts 的解释路径共用同一批实现)。产物里每个点因此只留「取哪个信号、\r\n * 写哪个节点、什么形态」三个信息,逻辑单点可改 —— 内联时同一段逻辑要按点数复制,\r\n * 且静态路径与解释路径会各自漂移出不同语义。\r\n * 抽象的**边界**就在守卫处:每个点仍各自订阅各自那一个根信号、取值仍内联\r\n * `rc.__s.<k>.value`,per-point 粒度与内联取值都不受影响;`_wXxx` 调用只发生在\r\n * 值真的变了之后。\r\n */\r\nimport type { UpOut } from './template-dom'\r\nimport { applySubIdWraps, stripTs, type SubCandidate } from '../analyze/template-subs'\r\nimport { TS_SYNTAX_RE } from '../analyze/template-extract'\r\nimport { rewriteSuper, rewriteThis } from './build-vars'\r\n\r\nconst J = JSON.stringify\r\n\r\nexport interface RenderEffectGen {\r\n /** `pointEffects:` 右侧完整数组表达式(只有「会随信号变化」的点) */\r\n arrayExpr: string\r\n /**\r\n * `fx:` 右侧完整数组表达式 —— 与 `ups` **逐项 1:1**。\r\n *\r\n * 每个工厂签名统一为 `(rc, nodes, get) => …`,按点的种类返回不同的东西:\r\n * - 值点(text / attr / prop / toggle):返回 effect 函数\r\n * - 指令点:返回 `DirectiveInstance`(供 renderTemplate 首屏执行)\r\n * - 事件 / ref / refAttr 点:返回 handler / `createRef()` 对象 / 属性值\r\n *\r\n * 事件与 ref 点没有 effect(不订阅任何信号),但仍在 fx 占位,\r\n * 从而 pointEffects 与 ups 保持 1:1、可按下标互查(ups 用 `ux` 直接索引 fx)。\r\n */\r\n fxExpr: string\r\n /**\r\n * 产物里是否出现了 `get(varIndex)` 回退路径。\r\n *\r\n * 这是**编译期硬报错信号**:compile.ts 看到 `usedGet` 即写入 `tmplErrors`,\r\n * 随后抛 `StaticAnalysisError`。主模板每个更新点都必须把表达式内联进 fx /\r\n * pointEffects 工厂;出现回退说明该表达式含无法静态化的语法(render() 局部\r\n * 标识符 / TS 专有残留),应在构建期暴露。\r\n */\r\n usedGet: boolean\r\n /**\r\n * 本次 emit 用到的**模块级**写入器名(`wText` / `wAttr` / `wClass` …)。\r\n *\r\n * compile.ts 据此把名字并进 compelem 的 helper import —— 只注入实际用到的,\r\n * 产物里不会出现「import 了但没用」的写入器。\r\n */\r\n writers: WriterSet\r\n}\r\n\r\n/** 纯 `this.a` / `this.a.b` 链:可安全改写成 `rc.__s.a.value[.b]` */\r\nconst THIS_CHAIN_RE = /^this((?:\\.[A-Za-z_$][\\w$]*)+)$/\r\n\r\n/**\r\n * varIndex → 读取表达式。\r\n *\r\n * 两级策略(见 signalExprFor / inlineExprFor):\r\n * 1. 纯 `this.a` / `this.a.b` 链(`THIS_CHAIN_RE`)→ 内联 `rc.__s.a.value[.b]`。\r\n * 值与根信号**严格同一**,可直接建链,省掉一次访问器调用。\r\n * 2. 其余一切(算术 / 三元 / 比较 / 方法调用 / 混合模板属性…)→ 把原始表达式\r\n * 内联进 effect 体(`this`→`rc`);无法内联时退回 `get(varIndex)`,\r\n * 由 `usedGet` 触发构建期报错。\r\n *\r\n * 决不能按 `varIndexToRoot` 内联**裸根信号**(`rc.__s.<root>.value`):\r\n * `varIndexToRoot` 只说明「该 var **依赖**此根信号」,并不说明「该 var 的**值**\r\n * 就是此根信号」—— 于是 `${this.n > 0 ? 'pos' : 'neg'}` 会把数字写进文本节点\r\n * (正确值是 `'pos'`),`${this.a + this.b}` 还会把 `b` 整个从依赖里丢掉。\r\n */\r\n/**\r\n * 内联所需的额外上下文。缺任何一项都退化为「只做 this 改写、不套 wraps」。\r\n */\r\nexport interface InlineCtx {\r\n /** 完整源文件文本(wraps 靠绝对偏移切片) */\r\n source?: string\r\n /** 子模板候选(`applySubIdWraps` 据此定位要包 `__subId` 的回调) */\r\n candidates?: readonly SubCandidate[]\r\n /** C1 闭包提升的附加属性片段(`, __bv: function(...){}`) */\r\n extras?: ReadonlyMap<number, string>\r\n /** subId → 模块级 carrier 常量名(自洽子模板,省每次更新的 Object.assign + 闭包) */\r\n carriers?: ReadonlyMap<number, string>\r\n /** varIndex → 源码绝对区间 [start, end) */\r\n ranges?: Map<number, [number, number]>\r\n /** 收集表达式里的 `super.METHOD`(供类体注入 `__ce_s_*` 转发方法) */\r\n superHelpers?: Set<string>\r\n}\r\n\r\n/**\r\n * 把一个 var 的原始表达式**内联**进 effect 工厂(`this` → `rc`)。\r\n *\r\n * 管线(顺序不能换):`applySubIdWraps` → `stripTs` → TS 专有语法复检 →\r\n * `rewriteSuper` → `rewriteThis`。\r\n *\r\n * 为什么指令点也能内联:`applySubIdWraps` 是纯文本拼接,只依赖\r\n * `source` / `candidates` / `extras`。若因反引号拒绝内联,指令点的 `__subId` 会丢失,\r\n * `resolveSubTemplateMeta` 返回 undefined 的 tmplM,运行时直接崩。\r\n *\r\n * 失败返回 null(引号上下文异常 / TS 语法残留),调用方退回 `get(varIndex)`\r\n * 并由 `usedGet` 触发构建期报错。\r\n */\r\nexport function inlineExprFor(\r\n varIndex: number,\r\n varIndexToExpr?: Map<number, string>,\r\n ctx?: InlineCtx,\r\n): string | null {\r\n let src = varIndexToExpr?.get(varIndex)\r\n const range = ctx?.ranges?.get(varIndex)\r\n if (typeof range?.[0] === 'number' && ctx?.source) {\r\n src = applySubIdWraps(range[0], range[1], ctx.source, ctx.candidates ?? [], ctx.extras, ctx.carriers)\r\n }\r\n if (src == null) return null\r\n src = stripTs(src)\r\n if (TS_SYNTAX_RE.test(src)) return null\r\n if (ctx?.superHelpers) src = rewriteSuper(src, ctx.superHelpers)\r\n return rewriteThis(src, 'rc')\r\n}\r\n\r\nexport function signalExprFor(\r\n varIndex: number,\r\n varIndexToExpr?: Map<number, string>,\r\n signalKeys?: Set<string>,\r\n): string {\r\n const expr = varIndexToExpr?.get(varIndex)\r\n if (expr && signalKeys) {\r\n const m = THIS_CHAIN_RE.exec(expr.trim())\r\n if (m) {\r\n // m[1] 以 '.' 开头(\".a.b\"),先去掉再切分,否则 root 会变成空串\r\n const segs = m[1].slice(1).split('.')\r\n // ⚠️ 根必须是**真信号键**。`__s` 只装 @prop/@state/@computed 的键\r\n // (field-extract 注入的 fieldInits)+ 框架自带的 `slots`;普通实例字段、\r\n // `@query` 查询属性都不在其中。对它们内联出 `rc.__s.x.value` 会在\r\n // effect 首次执行时抛 `Cannot read properties of undefined (reading 'value')`,\r\n // 且因 field-extract 视其为「保守收录」而无任何降级/诊断。\r\n // 非信号根一律退回 `get(i)`,由访问器按真实语义取值。\r\n if (segs.length && segs[0] && signalKeys.has(segs[0])) {\r\n const root = segs[0]\r\n const rest = segs.slice(1)\r\n return `rc.__s.${root}.value${rest.map((s) => '.' + s).join('')}`\r\n }\r\n }\r\n }\r\n return `get(${varIndex})`\r\n}\r\n\r\n/** 单个更新点拆成「取值 / 守卫 / 写」三段,供主模板与子模板两种装配方式复用。 */\r\ninterface Point {\r\n /** 取值表达式(主模板:根信号;子模板:get(i) 或 get(i)[1][0]) */\r\n value: string\r\n /** 与旧值比较的表达式,形如 `nv !== ov` / `a3 !== ov[3]` */\r\n guard: string\r\n /** 写 DOM 的语句串(引用 `${val}` 与 `${node}`) */\r\n write: (val: string, node: string) => string\r\n /** 节点表达式;null 表示该点不需要节点(无) */\r\n node: string | null\r\n /** 旧值赋值语句 */\r\n store: (val: string, old: string) => string\r\n}\r\n\r\n/**\r\n * 产物写入器的 emit 名(compelem 运行时**模块级**函数)。\r\n *\r\n * **为什么 emit 成自由函数调用而不是 `rc._wXxx(...)`**:这些写入器不碰 ES 私有\r\n * 字段(需要的状态早已下沉到 `CompElemHelper` / `UpdatePointMeta` / 公开字段),\r\n * 做成实例方法只会在 `CompElem` 的公开类型面上多出一批「产物专用」的成员(作者的\r\n * 类型提示里挨着 `_execDir`),而产物本来就是在类体**之外**调用它们 —— 每次调用还\r\n * 多一次属性查找。emit 成 `wText(n, v)` 后作者的组件类型面上一个写入器都不剩,\r\n * 产物也更短。\r\n *\r\n * 需要实例参数的(`wProp`/`wCssVars`/`execDir`)由 emit 点显式传 `rc`。\r\n */\r\nconst RC_INTERNAL = {\r\n /** 结构指令分派(模块级,首参 rc:按节点反查 `__dirNodeMap` 上的 UpdatePoint) */\r\n execDir: 'execDir',\r\n /** 写函数名(模块级) */\r\n wText: 'wText',\r\n wAttr: 'wAttr',\r\n wAttrT: 'wAttrT',\r\n wClass: 'wClass',\r\n wStyle: 'wStyle',\r\n wShow: 'wShow',\r\n /** prop / toggle 点:模块级,首参是宿主 rc(slot 分支要写宿主 slot 映射) */\r\n wProp: 'wProp',\r\n wToggleProp: 'wToggleProp',\r\n /** cssVars 宿主镜像:模块级,首参是宿主 rc */\r\n wCssVars: 'wCssVars',\r\n /** directive 分派辅助:模块级,首参是宿主 rc */\r\n updateDir: 'updateDir',\r\n} as const\r\n\r\n/** 本次生成实际 emit 到的模块级写入器名(并集后由 compile.ts 走 compelem import 注入) */\r\nexport type WriterSet = Set<string>\r\n\r\n/**\r\n * 生成主模板的 per-point effect 工厂数组。\r\n * @param ups 更新点描述符\r\n * @param varIndexToExpr varIndex → 该 var 的原始表达式(判纯 `this` 链,决定能否内联)\r\n */\r\nexport function generateRenderEffect(\r\n ups: UpOut[],\r\n varIndexToExpr?: Map<number, string>,\r\n signalKeys?: Set<string>,\r\n inlineCtx?: InlineCtx,\r\n): RenderEffectGen {\r\n // 两类点分开装配:\r\n //\r\n // A. 能内联成 `rc.__s.<k>.value` 的点 —— 值与根信号严格同一,**每点一个工厂**。\r\n // 这是 per-point 粒度的核心:只订阅自己那一个信号,改 A 不唤醒 B。\r\n // B. 复杂表达式点(算术/三元/方法调用/模块级函数)—— **把表达式内联进 effect 体**\r\n // (`this`→`rc`)。\r\n //\r\n // 内联后不再有 get 的缓存分桶问题,慢点与快点一样可以一点一个工厂;\r\n // 改写失败时仍退回 `get(varIndex)`,那种情况并入末尾的合并工厂。\r\n const fast: string[] = []\r\n const slow: string[] = []\r\n /** fx:与 ups 1:1 的工厂数组(见 RenderEffectGen.fxExpr) */\r\n const fx: string[] = []\r\n /** 是否退回过 get(vi)(见 RenderEffectGen.usedGet) */\r\n let usedGet = false\r\n /** 本次 emit 到的模块级写入器名(供 compile.ts 注入 import) */\r\n const writers: WriterSet = new Set()\r\n const ictx: InlineCtx | undefined = inlineCtx\r\n let n = 0\r\n const nodeOf = (up: UpOut) => `nodes[${up.nodeSn}]`\r\n const dirKindOf = (up: UpOut) => (up.directiveName || '') === 'ifTrue' ? 'ifElse' : up.directiveName || ''\r\n for (const up of ups) {\r\n // 占位点(event/ref/refAttr)不读任何信号 → **不注册 effect**,但仍要在 fx 里\r\n // 占位保持 1:1(事件 handler / ref 对象 / refAttr 值由 fx 交给 renderTemplate)。\r\n if (up.isEvent || up.isRef || up.isRefAttr) {\r\n const inst = inlineExprFor(up.varIndex, varIndexToExpr, ictx)\r\n fx.push(inst ? `(rc) => (${inst})` : `(rc, nodes, get) => get(${up.varIndex})`)\r\n if (!inst) usedGet = true\r\n continue\r\n }\r\n // 指令点(含 TAG 位 show/classes/styles/bind/model):var 的值是 DirectiveInstance\r\n // 而非内层信号,必须交回运行时按指令语义执行 —— 内联写法会把内层信号当值用。\r\n // fx[i] 返回 DirectiveInstance 供 renderTemplate 首屏执行;updates 里另有一个\r\n // `execDir` effect 负责后续变更 —— 一个点两处,这是「只 emit 不写本地」之外的\r\n // 又一处「工厂要同时满足首屏与更新」的需求,故 pointEffects 仍是 fx 的真子集。\r\n if (up.isDirective) {\r\n const inst = inlineExprFor(up.varIndex, varIndexToExpr, ictx)\r\n const val = inst ?? `get(${up.varIndex})`\r\n if (!inst) usedGet = true\r\n writers.add(RC_INTERNAL.execDir)\r\n // 第 5 实参传完整 DirectiveInstance:同一元素可叠多个 TAG 指令(classes+styles+show),\r\n // __dirNodeMap 按 node 反查会互相覆盖,运行时据实例的 diFn 挑回正确的 UpdatePoint\r\n const f = `(rc, nodes, get) => { let ov; return () => { const a = (${val}); if (a[1][0] !== ov || rc.__f) { ${RC_INTERNAL.execDir}(rc, ${J(dirKindOf(up))}, ${nodeOf(up)}, a[1][0], ov, a); ov = a[1][0] } } }`\r\n fast.push(f)\r\n // fx 返回 DirectiveInstance 供 renderTemplate 首屏执行(与 pointEffects 共用工厂源码)\r\n fx.push(`(rc) => (${val})`)\r\n continue\r\n }\r\n const value = signalExprFor(up.varIndex, varIndexToExpr, signalKeys)\r\n // ⚠️ 只在 signalExprFor 退回 `get(vi)` 时才需要内联。若它已经给出\r\n // `rc.__s.<k>.value`,就必须用那个 —— 访问器 `rc.a` 只差一次调用,但\r\n // signalExprFor 里那道根信号校验(普通实例字段 / @query 不在 __s 里,\r\n // 内联出 __s 会抛 undefined.value)就不能生效了。\r\n // 顺带省掉一次源码切片与改写(内联不是廉价的)。\r\n const usesGet = value.startsWith('get(')\r\n const inlined = usesGet ? inlineExprFor(up.varIndex, varIndexToExpr, ictx) : null\r\n const canInline = inlined != null\r\n const isSlow = usesGet && !canInline\r\n // 退回 get(vi) 时**必须**置位:用于触发构建期报错,漏置位会产出含未解析\r\n // get(vi) 的产物 —— 运行期落到 stub 返回 undefined,表现为该点静默不更新。\r\n if (isSlow) usedGet = true\r\n const src = canInline ? inlined! : value\r\n const local = isSlow ? `a${n}` : 'nv'\r\n const old = isSlow ? `ov[${n}]` : 'ov'\r\n const p = buildPoint(up, local, old, writers)\r\n if (p === undefined) {\r\n // buildPoint 拆不出静态形态 → 该点无 effect,但 fx 仍要占位保持 1:1\r\n fx.push(`() => undefined`)\r\n n++\r\n continue\r\n }\r\n const factory = `(rc, nodes, get) => { let ov; return () => { const nv = ${src}; if (${p.guard} || rc.__f) { ${p.write('nv', p.node!)}; ${p.store('nv', 'ov')} } } }`\r\n // prop 点:fx 必须返回**值**而不是 effect 工厂。\r\n //\r\n // 原因在 renderTemplate:子组件首帧还是 wrapper(见\r\n // ComponentUninitializedWrapperComponentMap),此时 `_setProp` 写不进去 ——\r\n // 值只认 `addUninitializedSubComponentProp` 的 props 通道。所以 prop 初值必须\r\n // 在 renderTemplate 当场就有值;effect 那次求值只负责之后的变更。\r\n // 代价是首帧把表达式算两遍(fx 一次、effect 首 run 一次):prop 点都是跨组件\r\n // 边界那一跳,本就不是热路径,而漏掉初值的症状是「子组件停在默认值」,很难查。\r\n if (up.isProp) {\r\n fast.push(factory)\r\n fx.push(`(rc, nodes, get) => (${src})`)\r\n } else {\r\n // 去重:值点工厂在 pointEffects 与 fx 各 emit 一份相同源码,minifier 无法\r\n // 去重数组字面量里的函数体。pointEffects 存 fx 下标(运行时按 typeof 解引用),\r\n // 工厂源码只 emit 一份,effect 注入块体积近半。\r\n const fxIdx = fx.length\r\n fx.push(factory)\r\n fast.push(String(fxIdx))\r\n }\r\n n++\r\n }\r\n if (slow.length) {\r\n const packed = `(rc, nodes, get) => { const ov = []; return () => { ${slow.join(' ')} } }`\r\n fast.push(packed)\r\n }\r\n return {\r\n arrayExpr: `[${fast.join(',')}]`,\r\n fxExpr: `[${fx.join(',')}]`,\r\n usedGet,\r\n writers,\r\n }\r\n}\r\n\r\n/**\r\n * 子模板内联器。产出一个「varIndex → 已内联取值表达式」+ prelude 的构造器。\r\n *\r\n * 管线与 `generateSubBuildVars` **逐字同构**(顺序都不能换):\r\n * `applySubIdWraps` → `stripTs` → TS 专有语法复检 → `rewriteSuper` → `rewriteThis('rc')`。\r\n * `this` 改写目标为 `rc`(另一条取值函数生成路径改写为 `__comp`,两者须同构)。\r\n *\r\n * 为什么 prelude 不做 `rewriteThis`:与 `generateSubBuildVars` 保持一致(那边 prelude\r\n * 只做 wraps/stripTs/复检/rewriteSuper)。prelude 出现 `this` 时两条路径同样不解析,\r\n * 属既有语义,不在此处单方面改变。\r\n */\r\nexport function buildSubInliner(\r\n cand: SubCandidate,\r\n source: string,\r\n candidates: readonly SubCandidate[],\r\n extras: ReadonlyMap<number, string> | undefined,\r\n carriers: ReadonlyMap<number, string> | undefined,\r\n superHelpers: Set<string>,\r\n): { val: (vi: number) => string | null; prelude: string | null } {\r\n const byIndex = new Map<number, { start?: number; end?: number; exprSource: string }>()\r\n for (const v of cand.vars) byIndex.set(v.index, v as any)\r\n const val = (vi: number): string | null => {\r\n const v = byIndex.get(vi)\r\n if (!v) return null\r\n let src: string | null =\r\n typeof v.start === 'number' && typeof v.end === 'number'\r\n ? applySubIdWraps(v.start, v.end, source, candidates, extras, carriers)\r\n : v.exprSource\r\n if (src == null) return null\r\n src = stripTs(src)\r\n if (TS_SYNTAX_RE.test(src)) return null\r\n src = rewriteSuper(src, superHelpers)\r\n return rewriteThis(src, 'rc')\r\n }\r\n let prelude: string | null = ''\r\n if (cand.preludeSrc) {\r\n let out = applySubIdWraps(cand.preludeStart, cand.preludeEnd, source, candidates, extras, carriers)\r\n out = stripTs(out)\r\n prelude = TS_SYNTAX_RE.test(out) ? null : rewriteSuper(out, superHelpers)\r\n }\r\n return { val, prelude }\r\n}\r\n\r\n/** 结构指令点语句(内联取值版)。与 get 版 dirStmt 语义一致,只是 value 由调用方给出。 */\r\nfunction dirStmtVal(up: UpOut, a: string, value: string, old: string, writers: WriterSet): string {\r\n const kind = up.directiveName || ''\r\n const dirKind = kind === 'ifTrue' ? 'ifElse' : kind\r\n const node = `nodes[${up.nodeSn}]`\r\n writers.add(RC_INTERNAL.execDir)\r\n return (\r\n `const ${a} = ${value}; ` +\r\n `if (${a}[1][0] !== ${old} || rc.__f) { ${RC_INTERNAL.execDir}(rc, ${J(dirKind)}, ${node}, ${a}[1][0], ${old}, ${a}); ${old} = ${a}[1][0] }`\r\n )\r\n}\r\n\r\n/**\r\n * **自洽子模板**的 effect/fx 生成(把取值表达式内联进工厂,不产 `get(vi)`)。\r\n *\r\n * - 自洽子模板(表达式只引用自身形参 + `this` + 模块名)→ 本函数,内联。\r\n * - 跨层子模板(表达式引用祖先回调形参,如 `row[c]`)→ 顶层工厂无法解析,走 `__fx`\r\n * 闭包路径(在祖先作用域物化,见 compile.ts)。\r\n *\r\n * 工厂签名 `(rc, nodes, get, dep<params>)`:前四个是运行时统一形参,`<params>` 为回调\r\n * 原始形参(运行时按 (v,k,i) 位置传参)。\r\n * 自洽子模板下 `get`/`dep` 不被读,保留只为与运行时调用点保持位置稳定。\r\n *\r\n * fx 与 ups **逐项 1:1**:指令点返回 DirectiveInstance,prop 点返回值,事件/ref 点位;\r\n * 值点只在 fx 占位(`undefined`),其值由合并 effect 的首次 run 写入(deferValueFill)。\r\n */\r\nexport function generateSubInlinedEffect(\r\n ups: UpOut[],\r\n inlineVal: (vi: number) => string | null,\r\n prelude: string,\r\n paramsCode: string,\r\n): RenderEffectGen {\r\n const stmts: string[] = []\r\n const fx: string[] = []\r\n let usedGet = false\r\n const writers: WriterSet = new Set()\r\n let n = 0\r\n const fxSig = `(rc, nodes, get, dep${paramsCode})`\r\n // 合并 effect 工厂额外多一个**外部传入**的旧值槽数组 ov:工厂在 effect 体**每轮**被\r\n // 调用(item 实参读 cell.value → 订阅 + 当前值),ov 必须跨轮持久,由运行时提供。\r\n const peSig = `(rc, nodes, get, dep, ov${paramsCode})`\r\n for (const up of ups) {\r\n if (up.isEvent || up.isRef || up.isRefAttr) {\r\n const inst = inlineVal(up.varIndex)\r\n if (inst == null) {\r\n usedGet = true\r\n fx.push('() => undefined')\r\n } else fx.push(`${fxSig} => (${inst})`)\r\n continue\r\n }\r\n const inlined = inlineVal(up.varIndex)\r\n if (inlined == null) usedGet = true\r\n const value = inlined ?? `get(${up.varIndex})`\r\n if (up.isDirective) {\r\n fx.push(inlined == null ? '() => undefined' : `${fxSig} => (${value})`)\r\n if (inlined != null) stmts.push(dirStmtVal(up, `a${n}`, value, `ov[${n}]`, writers))\r\n n++\r\n continue\r\n }\r\n if (up.isProp) fx.push(inlined == null ? '() => undefined' : `${fxSig} => (${value})`)\r\n // 值点:fx 占位;值由合并 effect 首次 run 写入\r\n else fx.push('() => undefined')\r\n if (inlined == null) {\r\n n++\r\n continue\r\n }\r\n const p = buildPoint(up, `a${n}`, `ov[${n}]`, writers)\r\n if (p === undefined) {\r\n n++\r\n continue\r\n }\r\n stmts.push(\r\n `const a${n} = ${value}; if (${p.guard} || rc.__f) { ${p.write(`a${n}`, p.node!)}; ${p.store(\r\n `a${n}`,\r\n `ov[${n}]`,\r\n )} }`,\r\n )\r\n n++\r\n }\r\n const pe = stmts.length\r\n ? `[${peSig} => () => { ${prelude ? prelude + '\\n' : ''}${stmts.join(' ')} }]`\r\n : '[]'\r\n return { arrayExpr: pe, fxExpr: `[${fx.join(',')}]`, usedGet, writers }\r\n}\r\n\r\n/**\r\n * 把一个 UpOut 拆成「守卫 + 写」;形态无法静态化时返回 undefined(该点不生成 effect)。\r\n * @param value 取值表达式\r\n * @param old 旧值记号:主模板为闭包标量 `ov`,子模板为该点槽位 `ov[n]`\r\n */\r\nfunction buildPoint(up: UpOut, value: string, old: string, writers: WriterSet): Point | undefined {\r\n const node = `nodes[${up.nodeSn}]`\r\n const store = (v: string, o: string) => `${o} = ${v}`\r\n\r\n // directive:结构指令交给 _execDir 走 reconcile。\r\n // 模块级写入器(纯 DOM 写,emit 成自由函数调用;见 RC_INTERNAL 上方说明)\r\n const w = (name: string, write: (v: string, nd: string) => string) => {\r\n writers.add(name)\r\n return write\r\n }\r\n // 第 4 参是「上一次的条件/集合」:主模板是闭包标量 `ov`,子模板必须传**该点的槽位**\r\n // `ov[n]` —— 传整个数组会让 ifElse 拿到恒真的数组,分支判定全错(展开失效)。\r\n if (up.isDirective) {\r\n // 注意:up.directiveType 只是锚点类型('text' | 'slot'),不是指令种类。\r\n // 必须拿 directiveName 比对:早前误用 directiveType,导致所有结构指令\r\n // 判不出形态 → 该点不生成 effect → 组件完全不响应式。\r\n const kind = up.directiveName || ''\r\n if (kind === 'forEach' || kind === 'ifTrue' || kind === 'ifElse' || kind === 'when' || up.directiveType === 'slot') {\r\n const dirKind = kind === 'ifTrue' ? 'ifElse' : kind\r\n return {\r\n value,\r\n guard: `${value} !== ${old}`,\r\n node,\r\n write: w(RC_INTERNAL.execDir, (v, nd) => `${RC_INTERNAL.execDir}(rc, ${J(dirKind)}, ${nd}, ${v}, ${old})`),\r\n store,\r\n }\r\n }\r\n if (kind === 'show') {\r\n return { value, guard: `!!${value} !== ${old}`, node, write: w(RC_INTERNAL.wShow, (v, nd) => `${RC_INTERNAL.wShow}(${nd}, ${v})`), store }\r\n }\r\n if (kind === 'bind' || kind === 'model') {\r\n return {\r\n value,\r\n guard: `${value} !== ${old}`,\r\n node,\r\n write: w(RC_INTERNAL.wProp, (v, nd) => `${RC_INTERNAL.wProp}(rc, ${nd}, 'value', ${v})`),\r\n store,\r\n }\r\n }\r\n if (kind === 'classes') {\r\n return { value, guard: `${value} !== ${old}`, node, write: w(RC_INTERNAL.wClass, (v, nd) => `${RC_INTERNAL.wClass}(${nd}, ${v})`), store }\r\n }\r\n if (kind === 'styles') {\r\n return { value, guard: `${value} !== ${old}`, node, write: w(RC_INTERNAL.wStyle, (v, nd) => `${RC_INTERNAL.wStyle}(${nd}, ${v})`), store }\r\n }\r\n return undefined // 未知 directive 类型 → 回退\r\n }\r\n\r\n if (up.isText) {\r\n return {\r\n value,\r\n guard: `${value} !== ${old}`,\r\n node,\r\n write: w(RC_INTERNAL.wText, (v, nd) => `${RC_INTERNAL.wText}(${nd}, ${v})`),\r\n store,\r\n }\r\n }\r\n if (up.isToggleProp) {\r\n const attr = J(up.attrName!)\r\n return {\r\n value,\r\n guard: `(!!${value}) !== ${old}`,\r\n node,\r\n write: w(RC_INTERNAL.wToggleProp, (v, nd) => `${RC_INTERNAL.wToggleProp}(${nd}, ${attr}, !!${v})`),\r\n store,\r\n }\r\n }\r\n if (up.isProp) {\r\n const attr = J(up.attrName!)\r\n return {\r\n value,\r\n guard: `${value} !== ${old}`,\r\n node,\r\n write: w(RC_INTERNAL.wProp, (v, nd) => `${RC_INTERNAL.wProp}(rc, ${nd}, ${attr}, ${v})`),\r\n store,\r\n }\r\n }\r\n if (up.attrName != null) {\r\n // attr(含纯插值与混合模板)\r\n const name = J(up.attrName)\r\n const tmpl = up.attrTmpl\r\n const isPure = !!up.isPureTmpl || !tmpl || /^⟬Ċ⟭\\d+$/.test(tmpl)\r\n if (isPure) {\r\n return { value, guard: `${value} !== ${old}`, node, write: w(RC_INTERNAL.wAttr, (v, nd) => `${RC_INTERNAL.wAttr}(${nd}, ${name}, ${v})`), store }\r\n }\r\n // 混合模板:切分 pre/post\r\n const m = tmpl!.match(/⟬Ċ⟭(\\d+)/)\r\n if (m) {\r\n const idx = tmpl!.indexOf(m[0])\r\n const pre = J(tmpl!.slice(0, idx))\r\n const post = J(tmpl!.slice(idx + m[0].length))\r\n return {\r\n value,\r\n guard: `${value} !== ${old}`,\r\n node,\r\n write: w(RC_INTERNAL.wAttrT, (v, nd) => `${RC_INTERNAL.wAttrT}(${nd}, ${name}, ${pre}, ${post}, ${v})`),\r\n store,\r\n }\r\n }\r\n return undefined\r\n }\r\n return undefined\r\n}\r\n","/**\n * 编译器主流程:单文件 → 注入 `__ce_static__` 后的源码。\n */\nimport type { CompilerOptions, ComponentAnalysis } from './types'\nimport { DEBUG_DIV } from './types'\nimport { parse } from './utils/oxc'\nimport { analyzeFile, collectLocalClasses, collectModuleBindings, isCompelemSource, isMyfxSource } from './analyze/component'\nimport { analyzeRender } from './analyze/render-body'\nimport { decideDegrade, StaticAnalysisError } from './analyze/degrade'\nimport { checkConventions, collectModuleConsts, collectStringConsts } from './analyze/conventions'\nimport { extractMainTemplate, TemplateExtractError } from './analyze/template-extract'\nimport { collectSubCandidates, SubExtractError, enclosingCandidates, paramBaseNames } from './analyze/template-subs'\nimport { extractCssDeps, extractComputedDeps } from './analyze/deps-extract'\nimport { parseTemplateTree, buildTemplateHTML, TemplateParseError } from './analyze/template-tree'\nimport { checkTemplateRules } from './analyze/template-rules'\nimport { extractWatchers, generateWatchEffects, type WatchEntry } from './analyze/watch-extract'\nimport { extractFieldAccessors, RUNTIME_HELPERS } from './analyze/field-extract'\nimport { extractMethodDecos } from './analyze/method-deco-extract'\nimport { generateBuildTemplate, type UpOut } from './codegen/template-dom'\nimport { generateBuildVars, generateSubBuildVars, type BuildVarsOptions } from './codegen/build-vars'\nimport { generateRenderEffect, generateSubInlinedEffect, buildSubInliner } from './codegen/render-effect'\nimport { buildStaticLiteral, emitFamily, injectInto, planCtorInsert, type CtorInsertPlan } from './codegen/inject'\n\n/** 静态编译完成后的组件依赖清单(`options.verbose` 时打印;结构化字段供工具/survey 消费)。 */\nexport interface DepSummary {\n kind: 'normal' | 'noView' | 'skipInjection'\n /** 主视图响应式依赖(仅 verbose 依赖清单展示,不注入产物) */\n viewDeps: string[]\n /** cssVars getter 依赖;undefined = 未提取到 */\n cssDeps?: string[]\n /** @computed getter 依赖;undefined = 未提取到(该类全部 key 由运行时全根兜底) */\n computedDeps?: Record<string, string[]>\n /** 结构指令子视图依赖(subId → 路径);undefined = 未提取到 */\n subViewDeps?: Record<number, string[]>\n /** @watch 编译期解析产物(sources 即监视依赖) */\n watchers?: Array<{ name: string; sources: string[] }>\n /** 主视图更新映射:每根变量 → 取值槽位 → 更新点下标 → DOM 点位(normal 组件且 verbose 展示时) */\n varMap?: VarMapEntry[]\n /** 子视图更新映射:subId → 每根路径的槽位/updater/DOM */\n subVarMap?: Record<number, VarMapEntry[]>\n}\n\nexport interface CompileResult {\n code: string\n map: any\n /** 本次编译的诊断信息(组件级) */\n diagnostics: Array<{\n className: string\n degraded: boolean\n reason: string | null\n viewDeps: number\n /** 硬性违规(D7 嵌套模板),需在构建期暴露给用户 */\n errors: Array<{ start: number; end: number; exprStart: number; exprEnd: number; message: string }>\n /** 约定错误(emit/@prop/@computed/@csscope 静态校验),与降级无关 */\n conventionErrors: Array<{ start: number; end: number; message: string }>\n /** 静态依赖清单(每组件无条件填充;options.verbose 时输出人类可读格式) */\n deps?: DepSummary\n }>\n /** 是否发生了源码改动 */\n changed: boolean\n /** 本次编译从源码删除的 span(装饰器/字段成员/静态准入组件的 render 体,原始偏移;供最小侵入校验还原比对) */\n removals?: Array<{ start: number; end: number }>\n /** 本次编译新增的源码片段(注入的 import 片段 / 构造体写入语句;供最小侵入校验剥离) */\n additions?: string[]\n}\n\n/** 单个根变量的更新映射(依赖清单展示):根 → 取值槽位 → 更新点下标 → DOM 点位。 */\nexport interface VarMapEntry {\n /** 根名(`''` = 常脏:动态 this / 不纯 / 未分类表达式) */\n root: string\n /** 根类别:已知字段 kind / 自有 getter / 自有方法 / 跨文件未声明(基类 prop、state、@computed 等) */\n kind?: 'prop' | 'state' | 'computed' | 'getter' | 'method' | 'unknown'\n /** 该根驱动的取值槽位下标(脏集,仅对脏槽求值) */\n vars: number[]\n /** 消费这些槽位的更新点:updater = ups 数组下标(与 ups 同序),dom = 节点名 + 点位 */\n updates: Array<{ updater: number; dom: string }>\n}\n\n/** 编译期更新映射(debug 依赖清单展示用,注入产物中不出现)。 */\ninterface UpdateMeta {\n varMap?: VarMapEntry[]\n subVarMap?: Record<number, VarMapEntry[]>\n}\n\n/** up 描述符 → 人可读 DOM 点位:`<span class>` / `<ce-button @click>` / `#text [dir:text]`。 */\nfunction domLabel(up: UpOut, nodeNames: string[] | undefined): string {\n const node = (nodeNames && nodeNames[up.nodeSn]) || `#${up.nodeSn}`\n if (up.isEvent) return `<${node} @${up.attrName}>`\n if (up.isRef) return `<${node} ref>`\n if (up.isProp) return `<${node} .${up.attrName}>`\n if (up.isToggleProp) return `<${node} ?${up.attrName}>`\n if (up.isRefAttr) return `<${node} *${up.attrName}>`\n if (up.isDirective) {\n return up.directiveType === 'tag' ? `<${node} [dir]>` : `${node} [dir:${up.directiveType}]`\n }\n if (up.isText) return node\n if (up.attrName) return `<${node} ${up.attrName}>`\n return `<${node}>`\n}\n\n/** biMap + ups → 每根变量的 vars/updater/DOM 映射(无 biMap 或无更新点返回 undefined)。 */\nfunction makeVarMap(\n comp: ComponentAnalysis,\n biMap: Record<string, number[]> | undefined,\n ups: UpOut[] | undefined,\n nodeNames: string[] | undefined,\n): VarMapEntry[] | undefined {\n if (!biMap || !ups?.length) return undefined\n const entries: VarMapEntry[] = []\n for (const root of Object.keys(biMap)) {\n const vars = biMap[root]\n const varSet = new Set(vars)\n const updates: VarMapEntry['updates'] = []\n for (let i = 0; i < ups.length; i++) {\n if (varSet.has(ups[i].varIndex)) updates.push({ updater: i, dom: domLabel(ups[i], nodeNames) })\n }\n const kind: VarMapEntry['kind'] =\n root === ''\n ? undefined\n : comp.fields.get(root)?.kind ??\n (comp.ownGetters.has(root) ? 'getter' : comp.ownMethods.has(root) ? 'method' : 'unknown')\n entries.push({ root, kind, vars, updates })\n }\n return entries\n}\n\n/**\n * 默认的参与编译判定:`.ts` 且源码里出现 `extends CompElem` 或 `@tag`。\n *\n * 额外放行**家族装饰器**形态:mixin 文件(`export function mix(B) { class M extends B { @prop … } }`)\n * 既不含 `extends CompElem` 也不含 `@tag`(`@tag` 挂在具体组件上),但必须参与编译,\n * 否则其中的 `@prop/@state/@computed` 不会被剥离、注入的 `__ce_static__` 缺失,\n * 而运行时这几个装饰器是 no-op ⇒ 属性静默退化成普通实例字段。\n * 精确性由 `collectMixinClasses` 的「顶层函数体内 + 带 compelem 家族装饰器」把关,\n * 这里放宽只是让文件进入管线。\n *\n * ⚠️ 保持只收 `.ts`:IIFE 打包产物(`.js`)里指令名不在 scope,放宽会触发 D3 误报。\n */\nexport function defaultInclude(id: string, code: string): boolean {\n const clean = id.split('?')[0]\n if (!/\\.tsx?$/.test(clean)) return false\n if (clean.endsWith('.d.ts')) return false\n if (clean.includes('node_modules')) return false\n if (code.includes('extends CompElem') || /@tag\\s*\\(/.test(code)) return true\n return /@(prop|state|computed|query|queryAll)\\b/.test(code)\n}\n\n/** 构建组件依赖清单(4 处 diagnostics.push 统一入口)。 */\nfunction buildDeps(\n kind: DepSummary['kind'],\n ra: { viewDeps: string[] },\n cssDeps: string[] | undefined,\n computedDeps: Record<string, string[]> | undefined,\n subViewDeps: Record<number, string[]> | undefined,\n watchEntries: WatchEntry[] | undefined,\n meta?: UpdateMeta,\n): DepSummary {\n const deps: DepSummary = { kind, viewDeps: ra.viewDeps }\n if (cssDeps !== undefined) deps.cssDeps = cssDeps\n if (computedDeps !== undefined) deps.computedDeps = computedDeps\n if (subViewDeps !== undefined && Object.keys(subViewDeps).length) deps.subViewDeps = subViewDeps\n if (watchEntries?.length) deps.watchers = watchEntries.map((w) => ({ name: w.name, sources: w.sources }))\n if (meta?.varMap) deps.varMap = meta.varMap\n if (meta?.subVarMap && Object.keys(meta.subVarMap).length) deps.subVarMap = meta.subVarMap\n return deps\n}\n\n/** 根类别 → 展示标签。 */\nconst KIND_LABEL: Record<string, string> = {\n prop: 'prop',\n state: 'state',\n computed: 'computed',\n getter: 'getter',\n method: 'method',\n unknown: '跨文件/未声明',\n}\n\n/** 一行一个根变量:`'x' (kind) vars[槽位] → up[下标] → DOM 点位`。 */\nfunction formatVarLines(entries: VarMapEntry[], indent: string): string[] {\n return entries.map((e) => {\n const label = e.root === '' ? `'' (常脏)` : `'${e.root}' (${KIND_LABEL[e.kind ?? 'unknown'] ?? e.kind})`\n const vars = `vars[${e.vars.join(',')}]`\n const ups = e.updates.length\n ? `up[${e.updates.map((u) => u.updater).join(',')}] → ${e.updates.map((u) => u.dom).join(', ')}`\n : '—'\n return `${indent}${label} ${vars} → ${ups}`\n })\n}\n\n/** deps → 人类可读多行文本(单次 console.log,便于测试拦截)。 */\nfunction formatDeps(id: string, d: CompileResult['diagnostics'][number]): string {\n const deps = d.deps!\n const tag = deps.kind === 'skipInjection' ? 'skipInjection(继承父类)' : deps.kind\n const head = `[compelem/compiler] ${id} :: ${d.className} 依赖清单 [${tag}]${d.degraded ? ` 降级(${d.reason ?? '?'})` : ''}`\n const lines = [head]\n lines.push(` viewDeps(${deps.viewDeps.length}): ${JSON.stringify(deps.viewDeps)}`)\n // 主视图更新映射:每变量 → 取值槽位 → 更新点下标 → DOM 点位\n if (deps.varMap) {\n lines.push(' updates:')\n lines.push(...formatVarLines(deps.varMap, ' '))\n } else if (deps.kind === 'normal') {\n lines.push(' updates: —')\n }\n lines.push(` cssDeps: ${deps.cssDeps !== undefined ? JSON.stringify(deps.cssDeps) : '—'}`)\n lines.push(` computedDeps: ${deps.computedDeps !== undefined ? JSON.stringify(deps.computedDeps) : '—'}`)\n if (deps.subViewDeps) lines.push(` subViewDeps: ${JSON.stringify(deps.subViewDeps)}`)\n if (deps.subVarMap) {\n for (const subId of Object.keys(deps.subVarMap)) {\n lines.push(` sub#${subId} updates:`)\n lines.push(...formatVarLines(deps.subVarMap[Number(subId)], ' '))\n }\n }\n if (deps.watchers) lines.push(` watchers: ${JSON.stringify(deps.watchers)}`)\n return lines.join('\\n')\n}\n\n/** 编译单个文件。不会抛出:解析失败时原样返回。 */\nexport function compileFile(code: string, id: string, options: CompilerOptions = {}): CompileResult {\n const include = options.include ?? defaultInclude\n if (!include(id, code)) return { code, map: null, diagnostics: [], changed: false }\n\n // verbose 依赖展示开关(显式 options.verbose 或环境变量 CE_DEPS_DEBUG):\n // 开启时才做 per-var 根名分类(DepSummary 映射),关闭时省去该开销\n const envDebug = typeof process !== 'undefined' ? process.env?.CE_DEPS_DEBUG : undefined\n const depsDisplay = options.verbose === true || (envDebug !== undefined && envDebug !== '' && envDebug !== '0')\n\n let parsed\n try {\n parsed = parse(code, id)\n } catch {\n return { code, map: null, diagnostics: [], changed: false }\n }\n\n const comps = analyzeFile(code, id, parsed)\n if (!comps.length) return { code, map: null, diagnostics: [], changed: false }\n\n const edits: Array<{\n comp: ComponentAnalysis\n literal: string\n removals?: Array<{ start: number; end: number }>\n /** prop/state 初始值 → 构造体写入(字段已整体删除) */\n fieldInits?: Array<{ name: string; initText: string; computed?: boolean }>\n /** 构造体插入点计划(无初始值时缺省) */\n ctor?: CtorInsertPlan\n /** 方法装饰器(@debounced/@throttled/@onced)构造体注入语句 */\n methodDecoCtor?: string\n /** 方法装饰器 destroy 注入语句 */\n methodDecoDestroy?: string\n /** 本组件访问器所需的运行时函数(已定名)——文件级 import 注入取并集 */\n helpers?: string[]\n /** 本组件方法装饰器所需的 myfx 函数(debounce/throttle/once)——走 myfx 通道注入 */\n myfxHelpers?: string[]\n }> = []\n // per-point 写入器:emit 成 compelem 的模块级自由函数(`render/write.ts`),而不是\n // `rc._wText(...)` 实例方法 —— 作者的组件类型面上不留任何内部 writer。\n // 收集文件内实际用到的名字,随 compelem helper 通道做文件级 import 注入。\n const writers = new Set<string>()\n const diagnostics: CompileResult['diagnostics'] = []\n // render 体清空候选(静态准入组件的 render 是死代码)。全文件任一组件抽取的表达式\n // 以 super.render() 取基类视图时(superHelpers 含 render → 注入 __ce_s_render 转发),\n // 基类 render 体是运行时依赖 → 该候选整体不生效(保守:文件内全保留)。\n const renderStrips: Array<{ edit: (typeof edits)[number]; start: number; end: number }> = []\n let sawRenderForward = false\n\n // 标签注册表:同文件 @tag + options.knownTags(跨文件由 vite 插件累积注入,见 TEMPLATE-CODEGEN.md §4)\n const fileTags = new Set<string>()\n for (const c of comps) if (c.tagName) fileTags.add(c.tagName.toLowerCase())\n if (options.knownTags) for (const t of options.knownTags) fileTags.add(t.toLowerCase())\n // 已知的 HTML 原生标签(非组件),供 .prop 目标校验时区分「原生标签误用」与「跨文件组件未知」\n // 这里不穷举原生标签——校验逻辑是:有连字符但不在 knownTags → 错误;无连字符 → 原生标签错误;\n\n // 约定检查上下文(emit 校验 / @prop / @computed / @csscope 目标检查)\n const convCtx = {\n localClasses: collectLocalClasses(parsed),\n stringConsts: collectStringConsts(parsed.program),\n moduleConsts: collectModuleConsts(parsed.program),\n importedLocals: new Set(parsed.imports.keys()),\n code,\n }\n\n // 运行时函数(RUNTIME_HELPERS)的模块定名:默认原名,与模块既有绑定冲突时\n // 改用 __ce_ 前缀别名(文件级统一,访问器与 import 注入共用)\n const moduleBindings = collectModuleBindings(parsed)\n const helperBindings: Record<string, string> = {}\n for (const canon of RUNTIME_HELPERS) {\n if (!moduleBindings.has(canon)) continue\n let alias = '__ce_' + canon\n let n = 1\n while (moduleBindings.has(alias)) alias = `__ce${n++}_${canon}`\n helperBindings[canon] = alias\n }\n\n // 文件级累加器:类名 → 该类实际生成的访问器行。供 extractFieldAccessors 剔除\n // 「同文件祖先已提供、且逐字节相同」的行(子类重新声明同名 prop/state/computed\n // 只为覆盖默认值时,访问器与祖先完全相同)。同文件内 super 必须先于子类声明\n // (否则运行时 TDZ),故单趟前向即可;祖先若因族级 all-or-nothing 失败则没有条目,\n // 此时不剔除 —— 最坏只是多留一行死代码。\n // 必须建在**组件循环之外**:每个组件一份 Map 等于完全不共享。\n const inheritedAccessors = new Map<string, string[]>()\n /**\n * 文件级 carrier 常量声明(模块级 `const __ce_tN = Object.assign(function(){}, {__subId: N})`)。\n * 子视图回调体是死代码(运行时只读 __subId/__fx/__bv,DOM 来自 subs[N].buildTemplate),\n * 而原包装写在 fx 工厂体内 —— 每次更新都要重跑一次 Object.assign + 新建闭包。\n * 自洽子模板(无 extras)的 carrier 提到模块级,更新路径变为单次绑定读取。\n */\n const carrierDecls: string[] = []\n let carrierSeq = 0\n\n for (const comp of comps) {\n // 约定检查独立于降级判定:降级组件同样检查(这些错误运行时也报,只是更晚)\n let conventionErrors = checkConventions(comp, convCtx)\n\n // @watch 编译期解析(watch 前移):解析成功 → 删装饰器 + 注入 watchers;\n // 有 E-WATCH-ARG → 整体放弃(不删不注),运行时装饰器路径兜底。\n // watch 前移产物与模板加速字段不同:与降级无关,必须注入。\n const watchRes = extractWatchers(comp, code, convCtx)\n conventionErrors.push(...watchRes.errors)\n let watchEffectsCode: string | undefined\n let watchRemovals: Array<{ start: number; end: number }> = []\n if (!watchRes.errors.length && watchRes.entries.length) {\n watchRemovals = watchRes.removals\n watchEffectsCode = generateWatchEffects(watchRes.entries)\n // watch 回调 emit 成 `untrack(() => this.m(...))`(作者方法体对 codegen 是\n // 黑盒,只能在调用点整体关闭依赖收集,否则方法体里的读会被误收成本 watch 的\n // 依赖)。`untrack` 是 compelem 的模块级函数 —— 走同一条 compelem 注入通道。\n if (watchEffectsCode.includes('untrack(')) writers.add('untrack')\n }\n\n // 五族访问器前移(@prop/@state/@computed/@query/@queryAll):逐族 all-or-nothing,\n // 与 @watch 同构(装饰器删除 + 访问器/元数据注入)。任一成员不可静态解析 →\n // E-XXX-ARG / E-DECO-COEXIST 报错(error 级阻断;@prop 运行时已无定义路径)。\n // skipInjection 类照常参与——其注入字面量在下方以\n // `...父类.__ce_static__` spread 继承视图字段 + own 家族覆盖。\n const fieldRes = extractFieldAccessors(comp, code, convCtx, helperBindings, inheritedAccessors)\n conventionErrors.push(...fieldRes.errors)\n\n // 方法装饰器前移(@debounced/@throttled/@onced):直接生成构造体直线注入语句\n // (`this.onScroll = throttle(this.onScroll, 100)` 形态),**不引入计划表**。\n // 与五族同规格:逐族 all-or-nothing,失败即 E 码阻断。装饰器只删前缀、方法体保留。\n const mdRes = extractMethodDecos(comp, code, convCtx)\n conventionErrors.push(...mdRes.errors)\n const mdHelpers = mdRes.runtimeHelpers.map((n) => helperBindings[n] ?? n)\n\n const allRemovals: Array<{ start: number; end: number }> = [\n ...watchRemovals,\n ...fieldRes.removals,\n ...mdRes.removals,\n ]\n const fieldCodes = {\n props: fieldRes.propsCode,\n states: fieldRes.statesCode,\n computedGetters: fieldRes.computedCode,\n accessors: fieldRes.accessors || undefined,\n }\n // prop/state 初始值构造写入 + 访问器所需运行时函数(并集供文件级 import 注入)\n // ⚠️ 构造体插入点条件:**fieldInits 或 methodDecoCtor 任一非空**就要算 ——\n // 只有方法装饰器、没有 prop/state 的组件(如 `@onced init(){}` 裸组件)同样必须注入。\n const needCtor = fieldRes.fieldInits.length > 0 || !!mdRes.ctorStmts\n const ctorPlan = needCtor\n ? planCtorInsert(comp, comp.cls ?? convCtx.localClasses.get(comp.className), code)\n : undefined\n const fieldHelpers = fieldRes.runtimeHelpers.map((n) => helperBindings[n] ?? n)\n const fieldExtras = {\n fieldInits: fieldRes.fieldInits.length ? fieldRes.fieldInits : undefined,\n ctor: ctorPlan ?? undefined,\n // 方法装饰器需要构造体插入点(无 fieldInits 时也可能需要)——单独算一份\n methodDecoCtor: mdRes.ctorStmts || undefined,\n methodDecoDestroy: mdRes.destroyStmts || undefined,\n // 五族访问器要的是 **compelem** 的运行时函数;per-point 写入器(`wText`/`wAttr`…)\n // 同样是 compelem 的模块级自由函数 —— 走同一通道,文件级取并集。\n //\n // ⚠️ 用 **getter** 而非快照:`writers` 要到后面的模板 codegen 才被填上\n // (generateRenderEffect / generateSubInlinedEffect 跑完才有名字),而本对象\n // 在 noView / skipInjection 分支是**提前** spread 走的。取快照会永远拿到空集\n // → 产物 emit 了 `wText(...)` 却没有 import → 运行期 ReferenceError。\n // getter 在 `...fieldExtras` 展开(即 edits.push)时才求值,那时 codegen 已完成。\n get helpers() {\n const all = [...fieldHelpers, ...writers]\n return all.length ? [...new Set(all)] : undefined\n },\n // 方法装饰器前移要的是 **myfx** 的 debounce/throttle/once —— 走 myfx 通道,\n // 不塞进 compelem 的 import(compelem 不为它们开出口)。\n myfxHelpers: mdHelpers.length ? [...mdHelpers] : undefined,\n }\n\n // U5:单 walk——analyzeRender 顺带收集主模板 h`` 节点(免 extractMainTemplate 重扫)\n const mainHits: any[] = []\n const ra = analyzeRender(comp, { mainHits })\n const decision = decideDegrade(comp, ra)\n\n // ---- cssDeps / computedDeps 静态提取(候选4/候选3,与降级无关,始终尝试)----\n const cssDeps = extractCssDeps(comp, convCtx.localClasses)\n const computedDeps = extractComputedDeps(comp, convCtx.localClasses)\n let cssEffectCode: string | undefined\n if (cssDeps && cssDeps.length) {\n const signalReads = cssDeps.map(d => `rc.__s.${d}.value`).join(', ')\n // cssDeps 是已知信号根的扁平数组:逐元素 Object.is 比较,免去每次触发\n // 两侧各一次 JSON.stringify(序列化整个依赖数组)\n // `wCssVars` 是 compelem 的模块级自由函数(首参 rc):作者可见的 CompElem\n // 类型面上不留这批「产物专用」成员。\n writers.add('wCssVars')\n cssEffectCode = `(rc) => { let ov; return () => { const nv = [${signalReads}]; let changed = ov === undefined; if (!changed) { for (let i = 0; i < nv.length; i++) { if (!Object.is(nv[i], ov[i])) { changed = true; break } } } if (changed) { wCssVars(rc); ov = nv } } }`\n }\n // subViewDeps:ra.subViewDeps 的 key 是回调 start 偏移,需映射为 subId\n // (collectSubCandidates 在 codegen 分支内执行;非降级且有主模板时才有 subId)\n // 仅用于 debug 依赖清单输出(不注入 __ce_static__)\n let subViewDepsRec: Record<number, string[]> | undefined\n\n // ---- 无视图组件(noView):无 render / render 返回 null / 继承链终点 CompElem ----\n if (comp.noView) {\n edits.push({\n comp,\n literal: buildStaticLiteral({ noView: true }, { ...fieldCodes }),\n removals: allRemovals,\n ...fieldExtras,\n })\n diagnostics.push({\n className: comp.className,\n degraded: false,\n reason: null,\n viewDeps: 0,\n errors: [],\n conventionErrors,\n deps: buildDeps('noView', ra, cssDeps, computedDeps, subViewDepsRec, watchRes.entries),\n })\n continue\n }\n\n // ---- 跳过注入(同文件继承链上有 render 的祖先,继承其 __ce_static__)----\n if (comp.skipInjection) {\n // 五族前移照常参与(必须注入访问器/元数据),watchEffects 同前。\n // 视图字段整体 spread 继承祖先(buildTemplate/subs/…——本类无 render,\n // 视图即祖先的视图)。视图字段是**整体继承**语义(own 一律覆盖,不参与合并);\n // 家族字段则相反 —— 必须逐张表浅替换叠加,见 inject.ts emitFamily。\n const hasOwnField =\n !!fieldRes.accessors ||\n fieldRes.propsCode !== undefined ||\n fieldRes.statesCode !== undefined ||\n fieldRes.computedCode !== undefined\n if (hasOwnField || watchEffectsCode) {\n // super 表达式改由 emitFamily 内部的 `Reflect.getPrototypeOf(this)` 解析:\n // 原先 `code.slice(superNode.start, superNode.end)` 重放 extends 子句源码,\n // 遇到 `extends Mixin(CompElem)` 会**二次调用 mixin 工厂**取到另一个类。\n const mk = (label: string, body: string) => `${DEBUG_DIV} ${label}\\n${body}`\n const parts = [\n mk('inherits', `...Reflect.getPrototypeOf(this).__ce_static__`),\n mk('props', `props: ${emitFamily('props', fieldRes.propsCode)}`),\n mk('states', `states: ${emitFamily('states', fieldRes.statesCode)}`),\n mk('computedGetters', `computedGetters: ${emitFamily('computedGetters', fieldRes.computedCode)}`),\n ]\n // watchEffects 必须注入:@watch 装饰器已随 watchRemovals 被删,不注入即彻底丢失\n if (watchEffectsCode) parts.push(mk('watchEffects', `watchEffects: ${watchEffectsCode}`))\n // 本分支(继承链上有 render 祖先 ⇒ skipInjection)与 `codegen/inject.ts` 同为\n // 注入路径,同样不注入 `diag`:降级信息只经 `compileResult.diagnostics` 出口\n // (`degraded` / `reason` / `errors`),产物里不留该字段。\n //\n // ⚠️ `version` 必须保留:运行时据它判定产物准入\n // (`CompElem.ts` 中 `ceStatic.version >= 3` 校验)。\n edits.push({\n comp,\n literal:\n `static __ce_static__ = {\\n${parts.join(',\\n')}\\n};\\n` + (fieldRes.accessors || ''),\n removals: allRemovals,\n ...fieldExtras,\n })\n }\n diagnostics.push({\n className: comp.className,\n // decideDegrade 命中即抛 ⇒ 能走到这里必为通过。\n degraded: false,\n reason: null,\n viewDeps: ra.viewDeps.length,\n errors: decision.errors.map((e) => ({\n start: e.start,\n end: e.end,\n exprStart: e.exprStart,\n exprEnd: e.exprEnd,\n message: e.message,\n })),\n conventionErrors,\n deps: buildDeps('skipInjection', ra, cssDeps, computedDeps, subViewDepsRec, watchRes.entries),\n })\n continue\n }\n\n const opts = {\n buildVars: !options.disable?.buildVars,\n }\n\n // ---- 模板诊断(约定错误 E-*)无条件执行 ----\n // extractMainTemplate → parseTemplateTree → checkTemplateRules 始终运行,\n // 与静态分析结论正交,必须报告。\n // codegen(generateBuildTemplate/generateBuildVars)仍条件化:降级组件不生成构建产物。\n let buildTemplateCode: string | undefined\n let subsCode: string | undefined\n let pointEffectsCode: string | undefined\n let fxCode: string | undefined\n let tmplErrors: string[] = []\n let superHelpers: string[] = []\n let mainTmpl: ReturnType<typeof extractMainTemplate> = null\n // 依赖清单更新映射素材:主模板 ups/节点名 + 每根/子模板的 vars→updater→DOM 映射\n let mainUps: UpOut[] | undefined\n let mainNodeNames: string[] | undefined\n let updateMeta: UpdateMeta = {}\n try {\n mainTmpl = extractMainTemplate(comp, code, mainHits)\n if (mainTmpl) {\n const tree = parseTemplateTree(\n buildTemplateHTML(mainTmpl.strings),\n mainTmpl.vars.length,\n )\n // 模板层约定规则(.prop 须插值 / 事件须函数 / ref 须 createRef / 指令位置 / .prop 目标)\n conventionErrors.push(...checkTemplateRules(tree, mainTmpl, comp, convCtx, fileTags))\n\n // codegen:恒执行(compelem 不允许降级 —— decideDegrade 命中即抛)\n {\n const gen = generateBuildTemplate(tree.root, mainTmpl.vars, {\n className: comp.className,\n knownTags: fileTags,\n })\n if (gen.errors.length) tmplErrors = gen.errors\n else buildTemplateCode = gen.code ?? undefined\n if (!gen.errors.length) {\n mainUps = gen.ups\n mainNodeNames = gen.nodeNames\n }\n // 静态取值函数:与 buildTemplate 的 varIndex 空间对齐。\n // 任一插值无法安全静态化(render() 局部标识符 / this 改写失败)→ buildTemplate\n // 一并放弃。\n if (buildTemplateCode) {\n // 先收集子模板候选(失败→整组件报错),再生成主取值函数(带 wraps)\n let subCandidates: ReturnType<typeof collectSubCandidates> = []\n let c1SubBvMap: Map<number, ReturnType<typeof generateSubBuildVars>> | undefined\n let c1Extras: Map<number, string> | undefined\n let c1Carriers: Map<number, string> | undefined\n let c1BvOpts: BuildVarsOptions | undefined\n // U2:本文件内自由标识符校验缓存(comp 恒定,C1 多阶段复用同一 fnRaw 结果)\n const freeCache: Map<string, Set<string> | null> = new Map()\n try {\n subCandidates = collectSubCandidates(comp, code)\n } catch (e) {\n tmplErrors = [\n e instanceof SubExtractError || e instanceof TemplateExtractError\n ? e.message\n : String(e),\n ]\n }\n if (!tmplErrors.length && buildTemplateCode) {\n // 两阶段:先试全部子模板取值函数;失败且 free ⊆ 祖先形参 → 生成 __bv 闭包 extras\n const subBvMap = new Map<number, ReturnType<typeof generateSubBuildVars>>()\n const extras = new Map<number, string>()\n /** subId → 模块级 carrier 常量名(自洽子模板;填充见 liftPlan 定稿后) */\n const carriers = new Map<number, string>()\n const liftPlan: Array<{\n cand: (typeof subCandidates)[number]\n allowed: Set<string>\n r: ReturnType<typeof generateSubBuildVars>\n }> = []\n if (subCandidates.length) {\n for (const cand of subCandidates) {\n subBvMap.set(cand.subId, generateSubBuildVars(cand, code, comp, subCandidates, { freeCache, depsDisplay }))\n }\n for (const cand of subCandidates) {\n const r = subBvMap.get(cand.subId)!\n if (r.code || !r.freeIds?.length) continue\n const ancestors = enclosingCandidates(cand, subCandidates)\n const allowed = new Set<string>()\n for (const a of ancestors) for (const n of paramBaseNames(a.params)) allowed.add(n)\n if (!r.freeIds.every((id) => allowed.has(id))) continue\n liftPlan.push({ cand, allowed, r })\n }\n // 深优先(start 降序):先处理内层,其 __fx 才能被外层内联时带上\n liftPlan.sort((a, b) => b.cand.start - a.cand.start)\n\n // carrier 常量(自洽子模板):模块级一次创建,更新路径零分配。\n // 必须在 liftPlan 定稿**之后**填 —— liftPlan 里的候选会拿到\n // `__fx`(闭包捕获祖先形参,必须逐次新建载体),不能共享常量;\n // 提升失败时它既无 extras 也无 carrier,回落原回调源码形态。\n const liftedIds = new Set(liftPlan.map((x) => x.cand.subId))\n for (const cand of subCandidates) {\n if (liftedIds.has(cand.subId)) continue\n const name = `__ce_t${carrierSeq++}`\n carriers.set(cand.subId, name)\n carrierDecls.push(\n `const ${name} = Object.assign(function(){}, {__subId: ${cand.subId}});`,\n )\n }\n\n for (const { cand, allowed, r } of liftPlan) {\n const lifted = generateSubBuildVars(cand, code, comp, subCandidates, {\n extraAllowed: allowed,\n extras,\n freeCache,\n depsDisplay,\n })\n if (lifted.code) {\n // 跨层子模板也内联 —— 生成内联 fx + 合并 pointEffects,\n // 作为 __fx 挂在**本子回调对象字面量**上(该字面量在祖先回调体内创建,\n // 祖先 effect 每轮重跑 ⇒ 闭包捕获的祖先形参天然新鲜,无需 __bv 快照)。\n // 自由标识符校验仍由上面的 generateSubBuildVars(extraAllowed) 负责。\n let liftGen: ReturnType<typeof generateBuildTemplate> | undefined\n try {\n const liftTree = parseTemplateTree(\n buildTemplateHTML(cand.strings),\n cand.vars.length,\n )\n liftGen = generateBuildTemplate(liftTree.root, cand.vars, {\n className: comp.className,\n knownTags: fileTags,\n })\n } catch {\n liftGen = undefined\n }\n if (liftGen && !liftGen.errors.length) {\n const liftSupers = new Set<string>()\n const inliner = buildSubInliner(cand, code, subCandidates, extras, carriers, liftSupers)\n const subParams = cand.params.length ? `, ${cand.params.join(', ')}` : ''\n const subRe = generateSubInlinedEffect(\n liftGen.ups ?? [],\n inliner.val,\n inliner.prelude ?? '',\n subParams,\n )\n if (!subRe.usedGet && inliner.prelude != null) {\n for (const w of subRe.writers) writers.add(w)\n extras.set(cand.subId, `, __fx: { fx: ${subRe.fxExpr}, pe: ${subRe.arrayExpr} }`)\n for (const s of liftSupers) if (!superHelpers.includes(s)) superHelpers.push(s)\n if (lifted.superHelpers?.length) {\n for (const s of lifted.superHelpers) if (!superHelpers.includes(s)) superHelpers.push(s)\n }\n r.code = null\n r.errors = []\n r.freeIds = undefined\n r.lifted = true\n r.viewDepVarIndices = lifted.viewDepVarIndices\n }\n }\n }\n }\n // extras 就绪后重生成未提升且可能包住提升子节点的父级取值函数\n if (extras.size) {\n for (const cand of subCandidates) {\n const r = subBvMap.get(cand.subId)!\n if (!r.code) continue\n const regen = generateSubBuildVars(cand, code, comp, subCandidates, { extras, freeCache, depsDisplay })\n if (regen.code) {\n r.code = regen.code\n r.errors = []\n r.superHelpers = regen.superHelpers\n r.viewDepVarIndices = regen.viewDepVarIndices\n }\n }\n }\n }\n\n // `__bv` 闭包提升(C1)在 extras 上追加条目 ⇒ 该候选载体必须逐次新建。\n // liftPlan 之外、到这里才被加 `__bv` 的候选要把已有 carrier 常量撤掉。\n for (const subId of extras.keys()) carriers.delete(subId)\n const bvOpts: BuildVarsOptions = { extras, freeCache, depsDisplay, carriers }\n const bv = generateBuildVars(mainTmpl, comp, code, subCandidates, bvOpts)\n if (bv.code) {\n // `bv.code` 本身不注入产物:主模板的每个点都已把表达式内联进\n // fx / pointEffects 工厂。保留本函数调用是因为它还提供三样东西:\n // ① `bv.errors` —— 门禁(自由标识符 / TS 语法 ⇒ 不可编译)\n // ② `bv.superHelpers` —— 表达式里的 super.METHOD 转发方法\n // ③ `bv.viewDepVarIndices` —— verbose 依赖清单的根名→var 映射\n if (bv.superHelpers?.length) superHelpers.push(...bv.superHelpers)\n if (mainUps?.length) {\n // varIndex → 该 var 自己的表达式:保留 `this.metrics.length` 这类成员访问,\n // 否则 effect 只会读 `rc.__s.metrics.value`(整个数组),\n // 文本点就会渲染成 [object Object],[object Object],…\n const varIndexToExpr = new Map<number, string>()\n for (const v of mainTmpl.vars) varIndexToExpr.set(v.index, v.exprSource)\n // `__s` 的真实键集 = 本组件(含继承链)已建信号的字段 + 框架自带 slots。\n // 只有这些键才允许内联成 `rc.__s.<k>.value`,见 signalExprFor 的说明。\n const signalKeys = new Set<string>(comp.fields.keys())\n signalKeys.add('slots')\n // 内联上下文:让 effect / fx 工厂直接内联表达式(含 __subId wraps)。\n // - ranges:varIndex → 源码绝对区间,applySubIdWraps 靠偏移切片\n // - superHelpers:内联表达式里的 super.METHOD 与子模板汇流到同一集合,\n // 否则类体会漏注入 `__ce_s_METHOD` 转发方法(Expression is not defined)\n const varIndexToRange = new Map<number, [number, number]>()\n for (const v of mainTmpl.vars) {\n if (typeof v.start === 'number' && typeof v.end === 'number') {\n varIndexToRange.set(v.index, [v.start, v.end])\n }\n }\n const fxSuperHelpers = new Set<string>()\n const re = generateRenderEffect(mainUps, varIndexToExpr, signalKeys, {\n source: code,\n candidates: subCandidates,\n extras,\n carriers,\n ranges: varIndexToRange,\n // rewriteSuper 要 Set;产出入 Set 再并回外层数组\n superHelpers: fxSuperHelpers,\n })\n for (const w of re.writers) writers.add(w)\n pointEffectsCode = re.arrayExpr\n fxCode = re.fxExpr\n // 主模板产物**不允许**出现 get(varIndex) 回退 —— 每个更新点都必须把\n // 表达式内联进 fx / pointEffects 工厂:出现回退即说明表达式含无法静态化\n // 语法(render() 局部标识符 / TS 专有残留),应在构建期硬报错,让作者\n // 修模板或改写法。\n if (re.usedGet) {\n tmplErrors = [\n '主模板存在无法内联进 effect 工厂的插值表达式(出现 get(varIndex) 回退):' +\n '静态路径要求所有更新点内联取值,请检查该表达式是否引用了 render() 局部标识符或 TS 专有语法。',\n ]\n }\n for (const s of fxSuperHelpers) if (!superHelpers.includes(s)) superHelpers.push(s)\n\n }\n const vm = makeVarMap(comp, bv.viewDepVarIndices, mainUps, mainNodeNames)\n if (vm) updateMeta.varMap = vm\n } else {\n buildTemplateCode = undefined\n tmplErrors = bv.errors\n }\n c1SubBvMap = subBvMap\n c1Extras = extras\n c1Carriers = carriers\n c1BvOpts = bvOpts\n } else if (tmplErrors.length) {\n buildTemplateCode = undefined\n }\n // 子模板 codegen:任一失败 → 整组件降级(清空主产物)\n if (!tmplErrors.length && buildTemplateCode && subCandidates.length) {\n const entries: string[] = []\n for (const cand of subCandidates) {\n try {\n const subTree = parseTemplateTree(\n buildTemplateHTML(cand.strings),\n cand.vars.length,\n )\n const subGen = generateBuildTemplate(subTree.root, cand.vars, {\n className: comp.className,\n knownTags: fileTags,\n })\n if (subGen.errors.length) {\n tmplErrors = subGen.errors.map((m) => `sub#${cand.subId}: ${m}`)\n break\n }\n const subBv =\n c1SubBvMap?.get(cand.subId) ??\n generateSubBuildVars(cand, code, comp, subCandidates, c1BvOpts)\n\n const subVm = makeVarMap(comp, subBv.viewDepVarIndices, subGen.ups, subGen.nodeNames)\n if (subVm) {\n if (!updateMeta.subVarMap) updateMeta.subVarMap = {}\n updateMeta.subVarMap[cand.subId] = subVm\n }\n if (subBv.code) {\n // **自洽子模板** → 内联 fx。\n // 表达式只引用自身形参 + this + 模块名,顶层工厂可直接内联取值,\n // 运行时无需 get 回退。跨层子模板(引用祖先形参,如 `row[c]`)\n // 走下面的已提升分支(回调实例上的 __fx)。\n const subSupers = new Set<string>()\n const inliner = buildSubInliner(cand, code, subCandidates, c1Extras, c1Carriers, subSupers)\n const subParams = cand.params.length ? `, ${cand.params.join(', ')}` : ''\n const subRe = generateSubInlinedEffect(\n subGen.ups ?? [],\n inliner.val,\n inliner.prelude ?? '',\n subParams,\n )\n if (subRe.usedGet || inliner.prelude == null) {\n tmplErrors = [\n `sub#${cand.subId}: 子模板存在无法内联进 effect 工厂的插值表达式(get(varIndex) 回退)`,\n ]\n break\n }\n for (const s of subSupers) if (!superHelpers.includes(s)) superHelpers.push(s)\n for (const w of subRe.writers) writers.add(w)\n entries.push(\n `${cand.subId}: { buildTemplate: ${subGen.code}, pointEffects: ${subRe.arrayExpr}, fx: ${subRe.fxExpr} }`,\n )\n } else if (subBv.lifted || (typeof c1Extras !== 'undefined' && c1Extras.has(cand.subId))) {\n // 跨层子模板已内联为回调实例上的 __fx(fx + 合并 pointEffects),\n // subs 只留 buildTemplate 作 DOM 克隆源;取值/effect 全部由 __fx 提供。\n entries.push(`${cand.subId}: { buildTemplate: ${subGen.code} }`)\n } else {\n // 取值表达式无法内联进 effect 工厂(自由标识符既不在自身形参、\n // 也不在任何祖先回调形参里)→ **构建期报错**:静态路径不执行\n // render(),闭包作用域未必存在这些名字。\n tmplErrors = [\n `sub#${cand.subId}: 插值表达式无法内联进 effect 工厂,引用了无法解析的自由标识符 '${(subBv.freeIds ?? []).join(\n \"', '\",\n )}'`,\n ]\n break\n }\n } catch (e) {\n tmplErrors = [\n `sub#${cand.subId}: ${\n e instanceof SubExtractError || e instanceof TemplateExtractError\n ? e.message\n : String(e)\n }`,\n ]\n break\n }\n }\n if (tmplErrors.length) {\n buildTemplateCode = undefined\n } else if (entries.length) {\n subsCode = `{ ${entries.join(', ')} }`\n // subViewDeps:start → subId 映射后进入依赖清单\n if (ra.subViewDeps.size) {\n const startToSubId = new Map(subCandidates.map((c) => [c.start, c.subId]))\n const rec: Record<number, string[]> = {}\n let hasAny = false\n for (const [start, deps] of ra.subViewDeps) {\n const subId = startToSubId.get(start)\n if (subId !== undefined && deps.length) {\n rec[subId] = deps\n hasAny = true\n }\n }\n if (hasAny) {\n subViewDepsRec = rec\n }\n }\n }\n }\n }\n }\n }\n } catch (e) {\n tmplErrors = [e instanceof TemplateParseError || e instanceof TemplateExtractError || e instanceof SubExtractError ? e.message : String(e)]\n // 解析错误同样不可编译:tmplErrors 非空 ⇒ 下方降级判定会把它变成诊断错误。\n }\n if (tmplErrors.length) {\n // 模板 codegen 失败 ⇒ **编译报错,不降级**:降级产物在运行时的表现是\n // 组件静默渲染成空白,比构建失败难查得多。\n throw new StaticAnalysisError(comp.className, tmplErrors)\n }\n\n // render() 存在但无主模板(顶层 return 全为 null/undefined 字面量)→ noView\n if (!mainTmpl && comp.hasRender && !tmplErrors.length) {\n // 检查 render 体的顶层 return 是否全为 null/undefined 字面量\n const rets = comp.renderBody\n ? (Array.isArray(comp.renderBody) ? comp.renderBody : [comp.renderBody])\n : []\n const topRets = rets.filter((s: any) => s?.type === 'ReturnStatement')\n const allNull =\n topRets.length > 0 &&\n topRets.every((r: any) => {\n const arg = r.argument\n if (!arg) return true // return; (无值)视为 null\n if (arg.type === 'Literal' && (arg.value === null || arg.value === undefined)) return true\n if (arg.type === 'Identifier' && (arg.name === 'null' || arg.name === 'undefined')) return true\n if (arg.type === 'UnaryExpression' && arg.operator === 'void') return true\n return false\n })\n if (allNull) {\n edits.push({\n comp,\n literal: buildStaticLiteral({ noView: true }, {\n ...fieldCodes,\n }),\n removals: allRemovals,\n ...fieldExtras,\n })\n diagnostics.push({\n className: comp.className,\n degraded: false,\n reason: null,\n viewDeps: 0,\n errors: [],\n conventionErrors,\n deps: buildDeps('noView', ra, cssDeps, computedDeps, subViewDepsRec, watchRes.entries),\n })\n continue\n }\n }\n\n // 静态路径准入(运行时唯一渲染路径 = buildTemplate 在字面量里)\n // → render() 成死代码:体清空为 `render(): Template {}`(走 removals,剥离测试恒等)。\n // 「未准入」只剩 noView 一种,走上面 noView 的早退分支,不会流到这里。\n //\n // ⚠️ 判据就是「静态路径产出了 buildTemplate」。\n // 也**不能用 pointEffectsCode 代替** —— 无 view 点的组件它为 undefined,\n // 会让本该走静态路径的组件忽然保留 render 体(会导致 subs 的 __subId 丢失)。\n const stripRender =\n !!buildTemplateCode &&\n comp.renderBodyStart >= 0 &&\n comp.renderBodyEnd > comp.renderBodyStart\n const edit: (typeof edits)[number] = {\n comp,\n literal: buildStaticLiteral(opts, {\n pointEffects: pointEffectsCode,\n fx: fxCode,\n watchEffects: watchEffectsCode,\n cssEffect: cssEffectCode,\n buildTemplate: buildTemplateCode,\n subViews: subsCode,\n superHelpers: superHelpers.length ? [...new Set(superHelpers)] : undefined,\n ...fieldCodes,\n }),\n removals: allRemovals,\n ...fieldExtras,\n }\n edits.push(edit)\n if (stripRender) renderStrips.push({ edit, start: comp.renderBodyStart, end: comp.renderBodyEnd })\n if (superHelpers.includes('render')) sawRenderForward = true\n diagnostics.push({\n className: comp.className,\n // 能走到这里说明 decideDegrade 与模板 codegen 都已通过 ⇒ 恒为false。\n degraded: false,\n reason: null,\n viewDeps: ra.viewDeps.length,\n errors: decision.errors.map((e) => ({\n start: e.start,\n end: e.end,\n exprStart: e.exprStart,\n exprEnd: e.exprEnd,\n message: e.message,\n })),\n conventionErrors,\n deps: buildDeps('normal', ra, cssDeps, computedDeps, subViewDepsRec, watchRes.entries, updateMeta),\n })\n }\n\n // render 体清空(问题④):静态准入组件的 render 无运行时消费;super.render 转发存在时保留。\n if (!sawRenderForward) {\n for (const rs of renderStrips) rs.edit.removals = [...(rs.edit.removals ?? []), { start: rs.start, end: rs.end }]\n }\n\n // 访问器所需运行时函数:文件级并集 → 扩展已有 compelem import(或新增独立 import 行)\n const helperNeeds = new Set<string>()\n const myfxNeeds = new Set<string>()\n for (const e of edits) {\n for (const hlp of e.helpers ?? []) helperNeeds.add(hlp)\n for (const hlp of e.myfxHelpers ?? []) myfxNeeds.add(hlp)\n }\n let helperImport: { decl: any; source: string } | undefined\n let myfxImport: { decl: any; source: string } | undefined\n let helpersAnchor: number | undefined\n if (helperNeeds.size || myfxNeeds.size) {\n for (const node of parsed.program.body ?? []) {\n if (node.type !== 'ImportDeclaration') continue\n if (helpersAnchor === undefined) helpersAnchor = node.start\n const src = node.source?.value\n if (typeof src === 'string') {\n if (!helperImport && isCompelemSource(src)) helperImport = { decl: node, source: src }\n else if (!myfxImport && isMyfxSource(src)) myfxImport = { decl: node, source: src }\n }\n if (helperImport && myfxImport) break\n }\n // 无 import 时锚在首语句起点(前导注释之后)\n if (helpersAnchor === undefined) helpersAnchor = parsed.program.body?.[0]?.start ?? 0\n }\n\n // carrier 常量的模块级插入点:最后一个 import 声明之后(无 import 则首语句之前)\n let topLevelAnchor: number | undefined\n if (carrierDecls.length) {\n let lastImportEnd: number | undefined\n for (const node of parsed.program.body ?? []) {\n if (node.type === 'ImportDeclaration') lastImportEnd = node.end\n }\n topLevelAnchor =\n lastImportEnd ?? parsed.program.body?.[0]?.start ?? 0\n }\n\n const { code: out, map, injected, additions } = injectInto(code, edits, id, {\n helpers: helperNeeds.size ? [...helperNeeds] : undefined,\n helperImport,\n myfxHelpers: myfxNeeds.size ? [...myfxNeeds] : undefined,\n myfxImport,\n helpersAnchor,\n topLevel: carrierDecls.length ? carrierDecls.join('\\n') : undefined,\n topLevelAnchor,\n })\n // verbose 依赖清单打印(depsDisplay 判定同上,已在 compileFile 入口计算)\n if (depsDisplay) {\n for (const d of diagnostics) if (d.deps) console.log(formatDeps(id, d))\n }\n return {\n code: out,\n map,\n diagnostics,\n changed: injected.length > 0,\n removals: edits.flatMap((e) => e.removals ?? []),\n additions,\n }\n}\n\nexport { analyzeRender, analyzeFile, decideDegrade }\n","/**\n * Vite / Rolldown 插件入口。\n *\n * 用法(vite.config.ts):\n * ```ts\n * import { compelemCompiler } from '@compelem/compiler/vite'\n * export default defineConfig({ plugins: [compelemCompiler()] })\n * ```\n *\n * 通过 `enforce: 'pre'` + `transform` 钩子工作:在 TS→JS 转换之前拿到 `.ts` 源码,\n * 注入 `static __ce_static__` 后交回后续插件链。\n */\nimport type { CompilerOptions } from './types'\nimport { compileFile } from './compile'\nimport { hash32 } from './utils/oxc'\nimport { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\n/** 极简的结构化插件类型,避免硬依赖 vite 的 types(peer 里 vite 是可选的)。 */\ninterface MinimalPlugin {\n name: string\n enforce?: 'pre' | 'post'\n transform?: (code: string, id: string) => { code: string; map: any } | null | undefined\n configResolved?: (config: any) => void\n buildStart?: (this: any) => void | Promise<void>\n}\n\nconst TAG_RE = /@tag\\(\\s*['\"]([^'\"]+)['\"]/g\n\n/** 递归收集 root 下 .ts/.tsx 的 @tag 名(跨文件标签注册表,TEMPLATE-CODEGEN.md §4)。 */\nfunction scanKnownTags(root: string, out: Set<string>, depth = 0): void {\n if (depth > 20) return\n let entries\n try {\n entries = readdirSync(root, { withFileTypes: true })\n } catch {\n return\n }\n for (const e of entries) {\n if (e.name === 'node_modules' || e.name.startsWith('.')) continue\n const p = join(root, e.name)\n if (e.isDirectory()) {\n scanKnownTags(p, out, depth + 1)\n } else if (/\\.tsx?$/.test(e.name) && !e.name.endsWith('.d.ts')) {\n try {\n const code = readFileSync(p, 'utf-8')\n TAG_RE.lastIndex = 0\n let m\n while ((m = TAG_RE.exec(code))) out.add(m[1].toLowerCase())\n } catch {\n /* 忽略读失败 */\n }\n }\n }\n}\n\nexport interface VitePluginOptions extends CompilerOptions {\n /** 是否输出每个文件的编译诊断 */\n verbose?: boolean\n /**\n * D7(模板内直接嵌套模板)命中的处理力度。\n * - `'warn'`(默认):仅控制台提示 D7 消息\n * - `'error'`:直接阻断构建,用于 CI 强制把关\n * - `'silent'`:不提示\n */\n d7?: 'warn' | 'error' | 'silent'\n /**\n * 约定错误(E-*:emit 未声明/非字面量、@prop 缺 type/命名/赋值、@computed 非 getter、\n * @csscope 非 static getter)的处理力度。默认 `'error'` —— 约定违规直接阻断构建。\n */\n conventions?: 'error' | 'warn' | 'silent'\n\n // compelem 不允许降级。基于 signal 模型的架构**必须**依赖编译器编译后执行,\n // 静态分析推不出正确依赖(D 系列)时唯一的正确做法是**报错**,而不是产出\n // 「运行时静默不渲染 / 渲染错」的降级产物。规则不对 ⇒ 编译报错,没有可调力度。\n\n /**\n * 调试用:把编译产物写到源文件同级(`foo.ts` → `foo.js`),便于直接查看\n * 注入后的 `__ce_static__` / buildTemplate / pointEffects / fx。\n * 仅对真实文件生效(跳过 `?v=` 之类的虚拟 id),且只在编译确有改动时写。\n */\n emitJs?: boolean\n /**\n * 调试编译产物用:令 sourcemap 以上游注入后的 TS 为 0 级原�? * 这样 DevTools 直接显示编译后代码(含 `__ce_static__` / buildTemplate / fx),\n * 在这些区域打的断点能命中。代价:跳过「编译后代码 → 原始模板」的映射,\n * 栈帧行号指向注入后的 TS 而非用户源码里的模板位置。默认 `false`。\n */\n debugSourceMap?: boolean\n}\n\n/** 惰性构建换行偏移索引(升序;仅在有诊断时付费一次)。 */\nfunction newlineIndex(code: string): Int32Array {\n const arr: number[] = []\n for (let i = 0; i < code.length; i++) if (code.charCodeAt(i) === 10) arr.push(i)\n return Int32Array.from(arr)\n}\n\n/** 把源码偏移换算成 `行:列`(1 起算);带换行索引时走二分(O(log n))。 */\nfunction offsetToLineCol(code: string, offset: number, nl?: Int32Array): string {\n if (!nl) {\n let line = 1\n let lastNl = -1\n for (let i = 0; i < offset && i < code.length; i++) {\n if (code.charCodeAt(i) === 10) {\n line++\n lastNl = i\n }\n }\n return `${line}:${offset - lastNl}`\n }\n //二分:count = 换行下标中严格小于 offset 的个数\n let lo = 0, hi = nl.length\n while (lo < hi) {\n const mid = (lo + hi) >> 1\n if (nl[mid] < offset) lo = mid + 1\n else hi = mid\n }\n const lastNl = lo > 0 ? nl[lo - 1] : -1\n return `${lo + 1}:${offset - lastNl}`\n}\n\n/** 收集全部诊断违规(D7 或约定错误),带上 id / 行列信息。 */\nfunction collectErrors(\n res: ReturnType<typeof compileFile>,\n code: string,\n id: string,\n root: string,\n kind: 'd7' | 'conventions',\n): string[] {\n const out: string[] = []\n const rel = id.startsWith(root) ? id.replace(/\\\\/g, '/').slice(root.replace(/\\\\/g, '/').length + 1) : id\n let nl: Int32Array | undefined\n for (const d of res.diagnostics) {\n const list =\n kind === 'd7'\n ? d.errors.map((e) => ({ offset: e.exprStart, message: e.message }))\n : (d as any).conventionErrors?.map((e: any) => ({ offset: e.start, message: e.message })) ?? []\n for (const e of list) {\n nl ??= newlineIndex(code)\n const at = offsetToLineCol(code, e.offset, nl)\n out.push(`${rel}:${at} [${d.className}] ${e.message}`)\n }\n }\n return out\n}\n\n/** 按 mode 上报违规(error 阻断构建 / warn 控制台 / silent 忽略)。 */\nfunction reportErrors(msgs: string[], mode: 'warn' | 'error' | 'silent', head: string, thisArg: any) {\n if (mode === 'silent' || !msgs.length) return\n const text = head + '\\n ' + msgs.join('\\n ')\n if (mode === 'error') {\n const err = thisArg?.error?.bind(thisArg)\n if (err) err(new Error(text))\n else throw new Error(text)\n } else {\n console.warn(text)\n }\n}\n\n/** compelem 编译期优化插件。 */\nexport function compelemCompiler(options: VitePluginOptions = {}): MinimalPlugin {\n let root = process.cwd()\n const d7Mode = options.d7 ?? 'warn'\n const convMode = options.conventions ?? 'error'\n const knownTags = new Set<string>()\n if (options.knownTags) for (const t of options.knownTags) knownTags.add(t.toLowerCase())\n let scanned = false\n // U4:transform 结果缓存(key = id + 源码哈希 + knownTags 版本)。\n // compileFile 对 (code,id,options) 纯函数(无 console/全局副作用),诊断随 res 缓存;\n // knownTags 只增不减 → size 即单调版本号(本文件 TAG_RE 扫描先跑后取 key,幂等)。\n // FIFO 上限防 dev 长会话内存增长;命中仍走全部 reporting(每次 transform 都要报)。\n const transformCache = new Map<string, ReturnType<typeof compileFile>>()\n const TRANSFORM_CACHE_MAX = 512\n\n return {\n name: 'compelem:compiler',\n enforce: 'pre',\n\n configResolved(config: any) {\n root = config?.root ?? root\n },\n\n buildStart() {\n // 启动时全量预扫 @tag,填充跨文件标签注册表(编译顺序无关)\n if (scanned) return\n scanned = true\n scanKnownTags(root, knownTags)\n },\n\n transform(code: string, id: string) {\n // 惰性兜底:buildStart 未触发(如纯 API 调用)时按需扫描\n if (!scanned) {\n scanned = true\n scanKnownTags(root, knownTags)\n }\n // 本文件新出现的 @tag 立即并入(预扫后新增的热更场景;Set 幂等)\n TAG_RE.lastIndex = 0\n let tm\n while ((tm = TAG_RE.exec(code))) knownTags.add(tm[1].toLowerCase())\n\n const cacheKey = id + '\\0' + hash32(code) + '\\0' + knownTags.size\n let res = transformCache.get(cacheKey)\n if (!res) {\n res = compileFile(code, id, {\n ...options,\n knownTags: options.knownTags\n ? new Set([...knownTags, ...[...options.knownTags].map((t) => t.toLowerCase())])\n : knownTags,\n })\n if (transformCache.size >= TRANSFORM_CACHE_MAX) {\n const oldest = transformCache.keys().next().value\n if (oldest !== undefined) transformCache.delete(oldest)\n }\n transformCache.set(cacheKey, res)\n }\n\n // D7 是独立于「是否注入」的写法约束,没发生源码改动也要检查\n if (d7Mode !== 'silent') {\n const msgs = collectErrors(res, code, id, root, 'd7')\n reportErrors(msgs, d7Mode, `[compelem/compiler] 检测到 ${msgs.length} 处禁止写法:`, this)\n }\n\n // 约定错误:独立于降级判定,默认直接阻断构建\n if (convMode !== 'silent') {\n const msgs = collectErrors(res, code, id, root, 'conventions')\n reportErrors(msgs, convMode, `[compelem/compiler] 检测到 ${msgs.length} 处约定错误:`, this)\n }\n\n // D 系列命中 = 静态分析无法保证正确性 ⇒ **一律编译报错,无降级路径**。\n // compelem 的架构前提就是「必须经编译器编译后执行」,所以这里没有\n // warn/silent 档位:规则不对就不是能跑的代码,必须让用户在构建期看到。\n const degraded = res.diagnostics.filter((d) => d.degraded)\n if (degraded.length) {\n const root2 = root.replace(/\\\\/g, '/')\n const msgs = degraded.map((d) => {\n const rel = id.startsWith(root)\n ? id.replace(/\\\\/g, '/').slice(root2.length + 1)\n : id\n return `${rel} [${d.className}] 静态分析未通过:${d.reason ?? '未知原因'}`\n })\n reportErrors(\n msgs,\n 'error',\n `[compelem/compiler] 检测到 ${msgs.length} 个未通过静态分析的组件(compelem 不支持降级,必须修):`,\n this,\n )\n }\n\n if (!res.changed) return null\n\n // 调试:把编译产物落到源文件同级(foo.ts → foo.js)\n if (options.emitJs) emitCompiledJs(id, res.code, root)\n\n if (options.verbose) {\n const rel = id.startsWith(root) ? id.slice(root.length + 1) : id\n for (const d of res.diagnostics) {\n const state = d.degraded ? `降级(${d.reason})` : `编译(${d.viewDeps} deps)`\n console.log(`[compelem/compiler] ${rel} :: ${d.className} → ${state}`)\n }\n }\n return { code: res.code, map: options.debugSourceMap ? null : res.map }\n },\n }\n}\n\n/**\n * 把编译产物写到源文件同级:`foo.ts` → `foo.js`。\n * 写失败只告警不抛:产物是调试便利,不该让 dev server 起不来。\n */\nfunction emitCompiledJs(id: string, code: string, root: string): void {\n // 跳过虚拟模块:带 ?v= / \\0 的不是磁盘路径\n if (id.includes('\\0') || id.includes('?')) return\n if (!/\\.tsx?$/.test(id)) return\n try {\n const out = id.replace(/\\.tsx?$/, '.js')\n const prev = existsSync(out) ? readFileSync(out, 'utf-8') : null\n if (prev === code) return\n writeFileSync(out, code, 'utf-8')\n const rel = id.startsWith(root) ? id.slice(root.length + 1) : id\n console.log(`[compelem/compiler] emit → ${out.replace(root, '.')}${prev === null ? '' : ' (updated)'}`)\n void rel\n } catch (e) {\n console.warn(`[compelem/compiler] emitJs 写入失败:${id} → ${String(e)}`)\n }\n}\n\nexport default compelemCompiler\n"],"x_google_ignoreList":[0,1,2,3,22],"mappings":"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"}