isthmus-cli 0.6.0 → 0.7.0

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.
Files changed (99) hide show
  1. package/README.ko.md +135 -31
  2. package/README.md +134 -16
  3. package/Skills/isthmus/SKILL.md +17 -7
  4. package/compatibility.json +10 -0
  5. package/dist/cli/check-command.d.ts +2 -2
  6. package/dist/cli/check-command.js +22 -9
  7. package/dist/cli/check-command.js.map +1 -1
  8. package/dist/cli/command-support.d.ts +19 -1
  9. package/dist/cli/command-support.js +37 -8
  10. package/dist/cli/command-support.js.map +1 -1
  11. package/dist/cli/diff-command.js +4 -3
  12. package/dist/cli/diff-command.js.map +1 -1
  13. package/dist/cli/doctor-command.d.ts +11 -0
  14. package/dist/cli/doctor-command.js +128 -0
  15. package/dist/cli/doctor-command.js.map +1 -0
  16. package/dist/cli/extract-js-command.d.ts +33 -0
  17. package/dist/cli/extract-js-command.js +233 -0
  18. package/dist/cli/extract-js-command.js.map +1 -0
  19. package/dist/cli/graph-command.js +13 -6
  20. package/dist/cli/graph-command.js.map +1 -1
  21. package/dist/cli/init-command.d.ts +11 -0
  22. package/dist/cli/init-command.js +115 -0
  23. package/dist/cli/init-command.js.map +1 -0
  24. package/dist/cli/main.js +52 -1
  25. package/dist/cli/main.js.map +1 -1
  26. package/dist/cli/mcp-server.d.ts +16 -0
  27. package/dist/cli/mcp-server.js +534 -0
  28. package/dist/cli/mcp-server.js.map +1 -0
  29. package/dist/cli/query-command.js +13 -6
  30. package/dist/cli/query-command.js.map +1 -1
  31. package/dist/cli/retentions-command.js +14 -7
  32. package/dist/cli/retentions-command.js.map +1 -1
  33. package/dist/cli/serve-command.d.ts +13 -0
  34. package/dist/cli/serve-command.js +43 -0
  35. package/dist/cli/serve-command.js.map +1 -0
  36. package/dist/exchange/capture-config.d.ts +18 -0
  37. package/dist/exchange/capture-config.js +100 -0
  38. package/dist/exchange/capture-config.js.map +1 -0
  39. package/dist/exchange/messages.d.ts +9 -24
  40. package/dist/exchange/messages.js +25 -55
  41. package/dist/exchange/messages.js.map +1 -1
  42. package/dist/exchange/parse.d.ts +61 -0
  43. package/dist/exchange/parse.js +115 -12
  44. package/dist/exchange/parse.js.map +1 -1
  45. package/dist/extract/js-document.d.ts +22 -0
  46. package/dist/extract/js-document.js +230 -0
  47. package/dist/extract/js-document.js.map +1 -0
  48. package/dist/extract/js-scan.d.ts +93 -0
  49. package/dist/extract/js-scan.js +1205 -0
  50. package/dist/extract/js-scan.js.map +1 -0
  51. package/dist/extract/lexer.d.ts +26 -0
  52. package/dist/extract/lexer.js +316 -0
  53. package/dist/extract/lexer.js.map +1 -0
  54. package/dist/join/join.d.ts +66 -1
  55. package/dist/join/join.js +171 -1
  56. package/dist/join/join.js.map +1 -1
  57. package/dist/join/messages.d.ts +7 -4
  58. package/dist/join/messages.js +15 -8
  59. package/dist/join/messages.js.map +1 -1
  60. package/dist/report/check-report.d.ts +20 -3
  61. package/dist/report/check-report.js +240 -8
  62. package/dist/report/check-report.js.map +1 -1
  63. package/dist/report/codequality.d.ts +45 -0
  64. package/dist/report/codequality.js +74 -0
  65. package/dist/report/codequality.js.map +1 -0
  66. package/dist/report/diff.d.ts +25 -3
  67. package/dist/report/diff.js +91 -11
  68. package/dist/report/diff.js.map +1 -1
  69. package/dist/report/graph.d.ts +10 -4
  70. package/dist/report/graph.js +60 -6
  71. package/dist/report/graph.js.map +1 -1
  72. package/dist/report/preflight-view.js +28 -1
  73. package/dist/report/preflight-view.js.map +1 -1
  74. package/dist/report/preflight.d.ts +4 -4
  75. package/dist/report/preflight.js +81 -46
  76. package/dist/report/preflight.js.map +1 -1
  77. package/dist/report/query.d.ts +11 -4
  78. package/dist/report/query.js +84 -17
  79. package/dist/report/query.js.map +1 -1
  80. package/dist/report/retentions.d.ts +17 -5
  81. package/dist/report/retentions.js +85 -8
  82. package/dist/report/retentions.js.map +1 -1
  83. package/dist/report/rules.d.ts +16 -0
  84. package/dist/report/rules.js +30 -0
  85. package/dist/report/rules.js.map +1 -0
  86. package/dist/report/sarif.d.ts +2 -8
  87. package/dist/report/sarif.js +2 -10
  88. package/dist/report/sarif.js.map +1 -1
  89. package/docs/BRIDGE-EVENTS.md +87 -0
  90. package/docs/BRIDGE-MESSAGES.md +23 -8
  91. package/docs/GRAPH-EXCHANGE.md +141 -14
  92. package/docs/IMPACT.md +1 -1
  93. package/docs/MCP.md +62 -0
  94. package/docs/PREFLIGHT.md +24 -8
  95. package/docs/RUNTIME.md +2 -2
  96. package/docs/TOOLCHAIN.md +5 -5
  97. package/package.json +5 -2
  98. package/scripts/capture-preflight.mjs +32 -44
  99. package/scripts/run-child.mjs +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js-scan.js","sourceRoot":"","sources":["../../src/extract/js-scan.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * extract-js의 파일 한 개 스캐너다.\n *\n * 토큰 열 위에서 코어 RN과 Expo Modules의 브리지 호출 형태를 찾는다.\n * 모듈·컴포넌트 이름 경계 사실은 즉시 확정하고, 멤버 호출(`M.foo()`)은\n * 바인딩 정보와 함께 문서 조립 단계로 넘겨 같은 파일·가져오기 해석을 거친다.\n *\n * 이 스캐너는 이름을 정적으로 확정할 수 있는 형태만 fact로 낸다. 비리터럴\n * 인자는 `dynamic: true`에 원문 표현식을 실어 한계 계수에 맡긴다.\n */\n\nimport type { BridgeFact, BridgeMechanism } from '../exchange/parse.ts';\nimport { isSafeNonEmptyString } from '../exchange/parse.ts';\nimport type { JsToken } from './lexer.ts';\nimport { tokenizeJsSource } from './lexer.ts';\n\n/** `requireNativeModule` 계열 — 모듈을 부르는 호출 측 API 이름이다. */\nconst moduleImportCalls = new Set([\n 'requireNativeModule',\n 'requireOptionalNativeModule',\n]);\n\n/** 모듈 부재를 허용하는 호출 측 API다 — 부재 시 던지지 않고 `null`을 돌려준다. */\nconst optionalModuleCalls = new Set(['requireOptionalNativeModule']);\n\n/** TurboModuleRegistry의 이름 인자를 받는 조회 메서드다. */\nconst turboRegistryMethods = new Set(['get', 'getEnforcing', 'getNullable']);\n\n/** 부재 시 `null`을 돌려주는 레지스트리 조회다 — `getEnforcing`만 던진다. */\nconst optionalRegistryMethods = new Set(['get', 'getNullable']);\n\n/** 컴포넌트를 요구하는 호출 측 API 이름이다. */\nconst componentRequireCalls = new Set([\n 'requireNativeComponent',\n 'codegenNativeComponent',\n 'requireNativeViewManager',\n]);\n\n/**\n * Expo SDK(`expo`·`expo-modules-core`)에만 있는 호출 측 API 이름이다.\n * 코어 RN에는 같은 이름의 진입점이 없어 이름 자체가 Expo 증거다.\n */\nconst expoApiCalls = new Set([\n 'requireNativeModule',\n 'requireOptionalNativeModule',\n 'requireNativeViewManager',\n]);\n\n/** Expo API를 실어 나르는 패키지 specifier다. */\nconst expoSpecifierPattern = /^expo(?:-modules-core)?(?:\\/|$)/u;\n\n/** 스캔이 모은 한 파일의 결과다. */\nexport interface JsFileScan {\n /** 이미 확정된 경계·메서드 사실이다. location은 토큰 위치로 호출자가 채운다. */\n readonly facts: readonly ScannedFact[];\n /**\n * 베이스가 로컬·import 식별자인 멤버 호출 후보다. 문서 단계에서 바인딩을\n * 해석해 메서드 호출 사실로 바꾼다.\n */\n readonly memberCalls: readonly ScannedMemberCall[];\n /** 같은 파일에서 식별자가 가리키는 모듈·컴포넌트 이름이다. */\n readonly bindings: ReadonlyMap<string, BoundName>;\n /** 한 단계 문자열 상수(`const X = 'lit'` / 백틱)다. */\n readonly constStrings: ReadonlyMap<string, string>;\n /** `import X from 'spec'` 바인딩이다. 문서 단계에서 파일 해석을 거친다. */\n readonly imports: readonly ScannedImport[];\n /** 다른 파일이 이 파일의 export를 해석하는 데 쓰는 이름 지도다. */\n readonly exports: ScannedExports;\n /** 생산자 limitation에 쓰는 원시 계수다. */\n readonly counts: JsScanCounts;\n}\n\n/** 스캔이 세는 한계 분류다. */\nexport interface JsScanCounts {\n readonly dynamicModuleNames: number;\n readonly dynamicComponentNames: number;\n readonly dynamicMethodNames: number;\n}\n\n/** 위치 정보가 붙기 전의 사실 골격이다. */\nexport interface ScannedFact {\n readonly kind: BridgeFact['kind'];\n readonly channel: string;\n readonly method?: string;\n readonly mechanism?: BridgeMechanism;\n /** 호출 API가 모듈 부재를 허용한다(`null` 반환)는 module-import 증거다. */\n readonly optional?: boolean;\n readonly dynamic: boolean;\n readonly token: JsToken;\n}\n\n/** 바인딩이 확정된 이름인지 원문 표현식인지 구분한다. */\nexport type BoundName =\n | { readonly name: string }\n | { readonly dynamicExpression: string };\n\n/** `ident.method(...)` 또는 `ident[expr](...)` 호출 후보다. */\nexport interface ScannedMemberCall {\n /** 베이스 식별자다. */\n readonly ident: string;\n /** 리터럴이면 메서드명, 아니면 원문 표현식이다. */\n readonly method: string;\n readonly dynamicMethod: boolean;\n readonly token: JsToken;\n}\n\n/** 한 파일의 import 바인딩이다. */\nexport interface ScannedImport {\n readonly localName: string;\n readonly specifier: string;\n /** default export 해석인지 named export 해석인지 구분한다. */\n readonly exportedName: string | 'default';\n readonly token: JsToken;\n}\n\n/** 이 파일이 외부에보내는 모듈 바인딩이다. */\nexport interface ScannedExports {\n readonly defaultName?: BoundName;\n readonly named: ReadonlyMap<string, BoundName>;\n /**\n * `export { A as B } from 'spec'`·`export { default as X } from 'spec'`의\n * 배럴 재수출이다. 키는 이 파일이보내는 이름, 값은 원본 specifier다.\n */\n readonly reexported: ReadonlyMap<string, {\n readonly specifier: string;\n readonly exportedName: string | 'default';\n }>;\n}\n\ninterface ScanContext {\n readonly source: string;\n readonly tokens: readonly JsToken[];\n readonly facts: ScannedFact[];\n readonly memberCalls: ScannedMemberCall[];\n readonly bindings: Map<string, BoundName>;\n readonly constStrings: Map<string, string>;\n readonly imports: ScannedImport[];\n readonly namedExports: Map<string, BoundName>;\n readonly reexports: Map<string, {\n specifier: string;\n exportedName: string | 'default';\n }>;\n readonly counts: {\n dynamicModuleNames: number;\n dynamicComponentNames: number;\n dynamicMethodNames: number;\n };\n /**\n * 매개변수가 가리는 토큰 구간이다. `function f(M) {…}`·`f(M) {…}`·\n * `(M) => {…}` 형태의 `{…}` 본문 구간과 매개변수 이름을 담는다 — 파일\n * 전역 바인딩 지도는 스코프를 모르기 때문에 이 구간 안에서는 같은 이름의\n * 바인딩을 적용하지 않는다.\n */\n readonly paramShadows: readonly ParamShadow[];\n /**\n * 이 파일이 선언한 로컬 이름이다(`function`·`class`·`const` 등).\n * Expo API와 동명인 이름이 로컬에 선언됐으면 그 호출은 Expo API가 아니므로\n * mechanism 표시를 억제한다 — 스코프를 구분하지 않고 넓게 억제한다.\n */\n readonly localNames: Set<string>;\n /**\n * `const X = require('spec')`·`const {X} = require('spec')`의 이름별\n * specifier다. CJS 구조 분해로 가져온 Expo API를 import와 같은 규칙으로\n * 판정한다.\n */\n readonly requireSpecifiers: Map<string, string>;\n readonly unstableAliasNames: ReadonlySet<string>;\n defaultExport?: BoundName;\n}\n\n/** 매개변수 이름이 가리는 토큰 구간(토큰 인덱스, 끝은 배타적)이다. */\ninterface ParamShadow {\n readonly from: number;\n readonly to: number;\n readonly names: ReadonlySet<string>;\n}\n\n/** 한 소스 텍스트를 스캔해 사실 후보·바인딩·계수를 모은다. */\nexport function scanJsSource(source: string): JsFileScan {\n const tokens = tokenizeJsSource(source);\n const context: ScanContext = {\n source,\n tokens,\n facts: [],\n memberCalls: [],\n bindings: new Map(),\n constStrings: new Map(),\n imports: [],\n namedExports: new Map(),\n reexports: new Map(),\n counts: {\n dynamicModuleNames: 0,\n dynamicComponentNames: 0,\n dynamicMethodNames: 0,\n },\n paramShadows: collectParamShadows(tokens),\n localNames: new Set(),\n requireSpecifiers: new Map(),\n unstableAliasNames: new Set(tokens.filter((token, index) =>\n token.kind === 'identifier' && tokens[index - 1]?.text !== 'as' &&\n (!['(', '<'].includes(tokens[index + 1]?.text ?? '') ||\n ['function', '*'].includes(tokens[index - 1]?.text ?? '')))\n .map((token) => token.text)),\n };\n collectBindings(context);\n collectCalls(context);\n return {\n facts: context.facts,\n memberCalls: context.memberCalls,\n bindings: context.bindings,\n constStrings: context.constStrings,\n imports: context.imports,\n exports: {\n ...(context.defaultExport === undefined\n ? {}\n : { defaultName: context.defaultExport }),\n named: context.namedExports,\n reexported: context.reexports,\n },\n counts: context.counts,\n };\n}\n\n/**\n * 첫 번째 순회: 바인딩·상수·import·export를 모은다.\n *\n * 호출 해석보다 선언 수집을 먼저 끝내야 선언보다 앞선 호출 위치도 같은\n * 바인딩으로 해석된다(TDZ 오류 코드는 실행 시 죽으므로 정적 탐지엔 무해하다).\n */\nfunction collectBindings(context: ScanContext): void {\n const { tokens } = context;\n for (let index = 0; index < tokens.length; index++) {\n const token = tokens[index]!;\n if (token.kind === 'keyword' && token.text === 'import') {\n index = collectImport(context, index);\n continue;\n }\n if (token.kind === 'keyword' && token.text === 'export') {\n index = collectExport(context, index);\n continue;\n }\n if (\n token.kind === 'keyword' &&\n (token.text === 'const' || token.text === 'let' || token.text === 'var')\n ) {\n index = collectDeclaration(context, index);\n continue;\n }\n // `function NAME`·`class NAME` 선언 — 본문도 계속 스캔한다.\n if (token.kind === 'keyword' &&\n (token.text === 'function' || token.text === 'class')) {\n let cursor = index + 1;\n if (tokens[cursor]?.text === '*') cursor++;\n const name = tokens[cursor];\n if (name !== undefined &&\n (name.kind === 'identifier' || name.kind === 'keyword')) {\n context.localNames.add(name.text);\n }\n continue;\n }\n // 모듈 객체의 재대입은 바인딩을 무효화한다 — 해석 이름이 바뀌었을 수 있다.\n // `obj.prop = v`의 prop은 로컬 바인딩이 아니라 속성명이므로 제외한다.\n if (token.kind === 'identifier' && tokens[index + 1]?.text === '=' &&\n tokens[index - 1]?.text !== '.' && tokens[index - 1]?.text !== '?.') {\n context.bindings.delete(token.text);\n context.constStrings.delete(token.text);\n }\n // CommonJS `module.exports = <expr>`는 default export와 같다.\n if (\n token.kind === 'identifier' && token.text === 'module' &&\n tokens[index + 1]?.text === '.' &&\n tokens[index + 2]?.text === 'exports' &&\n tokens[index + 3]?.text === '='\n ) {\n const bound = readModuleExpression(context, index + 4);\n if (bound !== undefined && endsExpression(tokens, bound.endIndex)) {\n context.defaultExport = bound.value;\n index = bound.endIndex;\n }\n continue;\n }\n // `exports.X = <expr>`는 named export다.\n if (\n token.kind === 'identifier' && token.text === 'exports' &&\n tokens[index + 1]?.text === '.' &&\n tokens[index + 2]?.kind === 'identifier' &&\n tokens[index + 3]?.text === '='\n ) {\n const bound = readModuleExpression(context, index + 4);\n if (bound !== undefined && endsExpression(tokens, bound.endIndex)) {\n context.namedExports.set(tokens[index + 2]!.text, bound.value);\n index = bound.endIndex;\n }\n }\n }\n}\n\n/** `import ... from 'spec'` 절의 로컬 바인딩을 기록한다. */\nfunction collectImport(context: ScanContext, start: number): number {\n const { tokens } = context;\n let index = start + 1;\n const clause: { name: string; exported: string | 'default' }[] = [];\n while (index < tokens.length) {\n const token = tokens[index]!;\n // `import type ...`는 문 전체가 타입 전용 — 런타임 바인딩이 아니다.\n // 키워드만 건너뛰면 절 이름이 그대로 수집되므로 specifier까지 건너뛴다.\n if (token.text === 'type' && index === start + 1) {\n let cursor = index + 1;\n while (cursor < tokens.length &&\n tokens[cursor]!.kind !== 'string' && tokens[cursor]!.text !== ';') {\n cursor++;\n }\n return cursor;\n }\n // `import { type A, B }`의 인라인 타입 지정은 그 이름만 바인딩에서 뺀다.\n if (token.text === 'type' &&\n inBraceClause(tokens, start + 1, index)) {\n const after = tokens[index + 1];\n if ((after?.kind === 'identifier' || after?.kind === 'keyword') &&\n after.text !== 'as') {\n index += 2;\n continue;\n }\n }\n if (token.kind === 'string') {\n // `import 'spec'` 부작용 전용이거나 절 뒤의 specifier다.\n if (clause.length > 0) return recordImport(context, clause, token, index);\n return index;\n }\n if (token.text === 'from') {\n const specifier = tokens[index + 1];\n return specifier?.kind === 'string'\n ? recordImport(context, clause, specifier, index + 1)\n : index;\n }\n if (token.text === 'as') {\n const alias = tokens[index + 1];\n const last = clause.at(-1);\n if (last !== undefined &&\n (alias?.kind === 'identifier' || alias?.kind === 'keyword')) {\n clause[clause.length - 1] = { name: alias.text, exported: last.exported };\n }\n index += 2;\n continue;\n }\n if (token.kind === 'identifier' || token.kind === 'keyword') {\n // 중괄호 안이면 named export, 아니면 default다.\n clause.push({\n name: token.text,\n exported: inBraceClause(tokens, start + 1, index)\n ? token.text\n : 'default',\n });\n index++;\n continue;\n }\n index++;\n }\n return index;\n}\n\n/** 수집한 import 절을 specifier와 함께 기록한다. */\nfunction recordImport(\n context: ScanContext,\n clause: readonly { name: string; exported: string | 'default' }[],\n specifier: JsToken,\n endIndex: number,\n): number {\n for (const entry of clause) {\n context.imports.push({\n localName: entry.name,\n specifier: specifier.value ?? specifier.text,\n exportedName: entry.exported,\n token: specifier,\n });\n }\n return endIndex;\n}\n\n/** 토큰이 `{` 절 안에 있는지 판정한다(named import 구분용). */\nfunction inBraceClause(\n tokens: readonly JsToken[],\n from: number,\n to: number,\n): boolean {\n let depth = 0;\n for (let index = from; index < to; index++) {\n if (tokens[index]!.text === '{') depth++;\n if (tokens[index]!.text === '}') depth--;\n }\n return depth > 0;\n}\n\n/** `export` 뒤의 default·named 모듈 바인딩을 수집한다. */\nfunction collectExport(context: ScanContext, start: number): number {\n const { tokens } = context;\n const next = tokens[start + 1];\n if (next === undefined) return start;\n if (next.kind === 'keyword' && next.text === 'default') {\n const bound = readModuleExpression(context, start + 2);\n if (bound !== undefined && endsExpression(tokens, bound.endIndex)) {\n context.defaultExport = bound.value;\n return bound.endIndex;\n }\n // `export default M` — 로컬 바인딩을 거치는 형태다.\n const ident = tokens[start + 2];\n if (ident?.kind === 'identifier') {\n const resolved = context.bindings.get(ident.text);\n if (resolved !== undefined) context.defaultExport = resolved;\n return start + 2;\n }\n return start + 1;\n }\n if (next.kind === 'keyword' &&\n (next.text === 'const' || next.text === 'let' || next.text === 'var')) {\n // `export const X = <moduleExpr>` — 이 선언이 새로 만든 바인딩만 named export다.\n const before = new Set(context.bindings.keys());\n const declEnd = collectDeclaration(context, start + 1);\n for (const name of context.bindings.keys()) {\n if (!before.has(name)) {\n context.namedExports.set(name, context.bindings.get(name)!);\n }\n }\n return declEnd;\n }\n if (next.text === '{') {\n // `export { A, B as C }`(로컬)와 `export { A as B } from 'spec'`(배럴) 둘 다다.\n const close = findMatching(tokens, start + 1, '{', '}');\n if (close === undefined) return start;\n const pairs: { source: string; exported: string }[] = [];\n for (let index = start + 2; index < close; index++) {\n const token = tokens[index]!;\n if (token.kind === 'identifier' || token.kind === 'keyword') {\n if (token.text === 'as') {\n const alias = tokens[index + 1];\n const last = pairs.at(-1);\n if (alias !== undefined &&\n (alias.kind === 'identifier' || alias.kind === 'keyword') &&\n last !== undefined) {\n pairs[pairs.length - 1] = { source: last.source, exported: alias.text };\n index++;\n }\n continue;\n }\n pairs.push({ source: token.text, exported: token.text });\n }\n }\n // `from 'spec'`이 뒤따르면 배럴 재수출이다.\n const from = tokens[close + 1];\n const specifier = tokens[close + 2];\n if (from?.text === 'from' && specifier?.kind === 'string') {\n for (const pair of pairs) {\n context.reexports.set(pair.exported, {\n specifier: specifier.value ?? specifier.text,\n exportedName: pair.source === 'default' ? 'default' : pair.source,\n });\n }\n return close + 2;\n }\n for (const pair of pairs) {\n const bound = context.bindings.get(pair.source);\n if (bound !== undefined) context.namedExports.set(pair.exported, bound);\n }\n return close;\n }\n return start;\n}\n\n/**\n * `const/let/var` 선언의 바인딩을 수집한다 — 식별자와 구조 분해 둘 다.\n *\n * 선언자는 선언 키워드 직후나 같은 깊이의 `,` 뒤에만 온다 — 이 조건이 없으면\n * 세미콜론 없는 코드에서 뒤 문장의 `state.handler = Cam` 같은 대입이\n * 선언자로 오인돼 바인딩이 파일 전역으로 새어 나간다.\n */\nfunction collectDeclaration(context: ScanContext, start: number): number {\n const { tokens } = context;\n let index = start + 1;\n // 선언자의 `,`는 깊이 0에만 온다 — `f(x, y = z)` 인자 안의 `,`는 무관하다.\n let depth = 0;\n while (index < tokens.length) {\n const token = tokens[index]!;\n if (token.text === ';' && depth === 0) return index;\n if (token.text === '(' || token.text === '[') {\n depth++;\n index++;\n continue;\n }\n if (token.text === ')' || token.text === ']') {\n depth--;\n index++;\n continue;\n }\n if (token.kind === 'identifier') {\n const declarator = index === start + 1 ||\n (depth === 0 && tokens[index - 1]?.text === ',');\n // 바인딩이 풀리든 안 풀리든 선언된 이름이다 — Expo API와 동명인\n // 로컬 선언이면 그 호출은 Expo API가 아니므로 mechanism 표시를 뺀다.\n if (declarator) context.localNames.add(token.text);\n let cursor = index + 1;\n // `const M: TurboModule = …`의 타입 주석은 건너뛰고 `=`를 찾는다.\n if (declarator && tokens[cursor]?.text === ':') {\n cursor = skipTypeAnnotation(tokens, cursor + 1);\n }\n if (declarator && tokens[cursor]?.text === '=') {\n // `const X = require('spec')…`의 specifier를 기록한다.\n const required = readRequireSpecifier(tokens, cursor + 1);\n if (required !== undefined) {\n context.requireSpecifiers.set(token.text, required);\n }\n const bound = readModuleExpression(context, cursor + 1);\n if (bound !== undefined && endsExpression(tokens, bound.endIndex)) {\n context.bindings.set(token.text, bound.value);\n // 초기값 식 내부의 괄호는 depth에 반영되지 않았으니 마지막 토큰까지\n // 건너뛴다 — `)`를 다시 처리하면 depth가 음수로 내려간다.\n index = bound.endIndex + 1;\n continue;\n }\n const literal = readLiteralExpression(context, cursor + 1);\n if (literal !== undefined && endsExpression(tokens, literal.endIndex)) {\n context.constStrings.set(token.text, literal.value);\n index = literal.endIndex + 1;\n continue;\n }\n }\n index++;\n continue;\n }\n if (token.text === '{') {\n const close = findMatching(tokens, index, '{', '}');\n if (close === undefined) return index;\n // `const { A, ... } = NativeModules`인지 확인한다.\n const source = tokens[close + 2];\n const isNativeModules = tokens[close + 1]?.text === '=' &&\n source?.kind === 'identifier' && source.text === 'NativeModules';\n if (isNativeModules) {\n collectDestructuredBindings(context, index, close);\n index = close + 1;\n continue;\n }\n // 그 외 원천의 구조 분해도 로컬 이름을 선언한다 — `require('spec')`\n // 원천이면 이름별 specifier까지 남겨 mechanism 판정에 쓴다.\n const required = tokens[close + 1]?.text === '='\n ? readRequireSpecifier(tokens, close + 2)\n : undefined;\n recordDestructuredLocals(context, index, close, required);\n index = close + 1;\n continue;\n }\n index++;\n }\n return index;\n}\n\n/**\n * 초기값 식이 `endIndex`에서 끝나는지 확인한다.\n *\n * `'Hel' + 'lo'`처럼 리터럴 뒤에 식이 계속되면 첫 토큰만 바인딩해 잘못된\n * 정적 이름이 되므로, 같은 줄에서는 `,`·`;`·닫는 괄호만 끝으로 인정한다.\n * 줄이 바뀌면 ASI로 문장이 끝날 수 있지만 `[`·`(`·이항 연산자 등은 여전히\n * 식을 이으므로 계속 토큰 집합에 있으면 끝이 아니다.\n */\nfunction endsExpression(\n tokens: readonly JsToken[],\n endIndex: number,\n): boolean {\n const next = tokens[endIndex + 1];\n if (next === undefined) return true;\n const sameLineEnd = next.text === ',' || next.text === ';' ||\n next.text === ')' || next.text === ']' || next.text === '}';\n if (next.line === tokens[endIndex]!.line) return sameLineEnd;\n return !expressionContinuations.has(next.text);\n}\n\n/** 줄이 바뀌어도 앞 식을 잇는 토큰이다 — ASI로 끝나지 않는 연속부다. */\nconst expressionContinuations = new Set([\n '.', '?.', '(', '[', '`', '?', ':',\n '+', '-', '*', '/', '%', '**', '&', '|', '^', '<', '>', '=',\n '&&', '||', '??', '=>', '==', '===', '!=', '!==', '<=', '>=',\n 'instanceof', 'in', 'as',\n]);\n\n/**\n * 타입 주석 구간을 건너뛰어 `=`·`,`·`;` 위치를 돌려준다.\n *\n * 타입 안의 `=`(예: 제네릭 기본값 `<T = X>`)는 괄호 깊이 안에 있으므로\n * 깊이 0의 `=`·`,`·`;`에서 멈춘다.\n */\nfunction skipTypeAnnotation(\n tokens: readonly JsToken[],\n start: number,\n): number {\n let depth = 0;\n let index = start;\n while (index < tokens.length) {\n const text = tokens[index]!.text;\n if (text === '(' || text === '[' || text === '{' || text === '<') {\n depth++;\n } else if (text === ')' || text === ']' || text === '}' || text === '>') {\n depth--;\n if (depth < 0) return index;\n } else if (depth === 0 &&\n (text === '=' || text === ',' || text === ';')) {\n return index;\n }\n index++;\n }\n return index;\n}\n\n/**\n * `NativeModules` 구조 분해의 각 속성을 module-import로 확정하고 바인딩한다.\n * `...rest`는 이름을 열거할 수 없어 원문을 실은 동적 사실로 남긴다.\n */\nfunction collectDestructuredBindings(\n context: ScanContext,\n open: number,\n close: number,\n): void {\n const { tokens } = context;\n for (let index = open + 1; index < close; index++) {\n const token = tokens[index]!;\n if (token.text === ',') continue;\n if (token.text === '...') {\n // open·close는 토큰 인덱스다 — 문자 오프셋으로 환산해 원문을 뗀다.\n const begin = tokens[open]!.offset;\n const end = tokens[close]!.offset + tokens[close]!.text.length;\n context.facts.push({\n kind: 'module-import',\n channel: sanitizeExpression(context.source.slice(begin, end)),\n dynamic: true,\n token,\n });\n context.counts.dynamicModuleNames++;\n break;\n }\n if (token.kind === 'identifier' || token.kind === 'keyword') {\n const name = token.text;\n let localName = name;\n let cursor = index;\n // `A: alias` 형태와 기본값 `A = expr`를 구분한다.\n if (tokens[index + 1]?.text === ':') {\n const alias = tokens[index + 2];\n if (alias?.kind === 'identifier' || alias?.kind === 'keyword') {\n localName = alias.text;\n cursor = index + 2;\n }\n }\n while (cursor < close && tokens[cursor]!.text !== ',') cursor++;\n index = cursor - 1;\n context.facts.push({\n kind: 'module-import',\n channel: name,\n dynamic: false,\n token,\n });\n context.bindings.set(localName, { name });\n context.localNames.add(localName);\n }\n }\n}\n\n/**\n * `require('spec')`의 specifier를 읽는다 — `require` 리터럴 호출만 본다.\n * `require('spec').member`처럼 뒤에 멤버 접근이 붙어도 specifier는 같다.\n */\nfunction readRequireSpecifier(\n tokens: readonly JsToken[],\n start: number,\n): string | undefined {\n if (tokens[start]?.kind !== 'identifier' ||\n tokens[start]!.text !== 'require' ||\n tokens[start + 1]?.text !== '(') {\n return undefined;\n }\n const specifier = tokens[start + 2];\n if (specifier?.kind !== 'string' || specifier.value === undefined ||\n tokens[start + 3]?.text !== ')') {\n return undefined;\n }\n return specifier.value;\n}\n\n/**\n * `const { A, B: alias, ...rest } = <expr>` 구조 분해의 로컬 이름을 기록한다.\n * 원천이 `require('spec')`이면 이름별 specifier도 남긴다 — CJS로 가져온\n * Expo API를 ES import와 같은 규칙으로 판정하기 위해서다.\n */\nfunction recordDestructuredLocals(\n context: ScanContext,\n open: number,\n close: number,\n specifier: string | undefined,\n): void {\n const { tokens } = context;\n for (let index = open + 1; index < close; index++) {\n const token = tokens[index]!;\n if (token.kind !== 'identifier' && token.kind !== 'keyword') continue;\n let localName = token.text;\n // `A: alias`의 로컬 이름은 alias다 — 속성명은 선언되지 않는다.\n if (tokens[index + 1]?.text === ':') {\n const alias = tokens[index + 2];\n if (alias?.kind === 'identifier' || alias?.kind === 'keyword') {\n localName = alias.text;\n }\n }\n context.localNames.add(localName);\n if (specifier !== undefined) {\n context.requireSpecifiers.set(localName, specifier);\n }\n // 기본값·중첩 패턴까지 포함해 다음 `,`까지 건너뛴다.\n let cursor = index + 1;\n while (cursor < close && tokens[cursor]!.text !== ',') cursor++;\n index = cursor - 1;\n }\n}\n\n/**\n * 위치 `start`에서 모듈 식(`NativeModules.N`, `TurboModuleRegistry.get*('N')`,\n * `requireNativeModule('N')` 등)을 읽어 이름·동적 표현식을 돌려준다.\n */\nfunction readModuleExpression(\n context: ScanContext,\n start: number,\n): { readonly value: BoundName; readonly endIndex: number } | undefined {\n const { tokens } = context;\n const token = tokens[start];\n if (token === undefined) return undefined;\n if (token.kind === 'identifier' && token.text === 'NativeModules') {\n const next = tokens[start + 1];\n if (next?.text === '.' || next?.text === '?.') {\n const name = tokens[start + 2];\n if (name?.kind === 'identifier' || name?.kind === 'keyword') {\n return { value: { name: name.text }, endIndex: start + 2 };\n }\n return undefined;\n }\n if (next?.text === '[') {\n const arg = readArgument(context, start + 2);\n if (arg === undefined) return undefined;\n // endIndex는 식 전체의 끝 — `NativeModules['X'].foo`의 `.foo`까지\n // 바인딩하면 속성값을 모듈로 오인한다.\n const close = findMatching(tokens, start + 1, '[', ']');\n return {\n value: arg.value === undefined\n ? { dynamicExpression: arg.expression }\n : { name: arg.value },\n endIndex: close ?? arg.endIndex,\n };\n }\n return undefined;\n }\n if (token.kind === 'identifier' && token.text === 'TurboModuleRegistry') {\n if (tokens[start + 1]?.text !== '.') return undefined;\n const method = tokens[start + 2];\n if (!turboRegistryMethods.has(method?.text ?? '')) return undefined;\n const call = readNamedCall(context, start + 3);\n return call === undefined\n ? undefined\n : { value: call.value, endIndex: call.endIndex };\n }\n const isExpoModuleAlias = token.kind === 'identifier' &&\n !isShadowed(context, token.text, start) &&\n !context.unstableAliasNames.has(token.text) &&\n context.imports.some((entry) => entry.localName === token.text &&\n moduleImportCalls.has(entry.exportedName) &&\n expoSpecifierPattern.test(entry.specifier));\n if (moduleImportCalls.has(token.text) || componentRequireCalls.has(token.text) ||\n isExpoModuleAlias) {\n const call = readNamedCall(context, start + 1);\n return call === undefined\n ? undefined\n : { value: call.value, endIndex: call.endIndex };\n }\n // 바인딩된 식별자의 추적(`const N = M`)은 한 단계만 허용한다.\n // 같은 이름의 매개변수가 가리는 구간 안에서는 파일 바인딩을 적용하지 않는다.\n if (token.kind === 'identifier' && !isShadowed(context, token.text, start)) {\n const bound = context.bindings.get(token.text);\n return bound === undefined\n ? undefined\n : { value: bound, endIndex: start };\n }\n return undefined;\n}\n\n/**\n * 호출의 첫 인자 이름을 읽는다 — `ident(` 또는 `ident<T>(` 다음의 첫 인자.\n * 이름이 문자열 리터럴이거나 한 단계 상수면 값을, 아니면 원문 표현식을 돌려준다.\n */\nfunction readNamedCall(\n context: ScanContext,\n start: number,\n): { readonly value: BoundName; readonly endIndex: number } | undefined {\n const { tokens } = context;\n let index = start;\n if (tokens[index]?.text === '<') {\n const close = skipTypeArguments(tokens, index);\n if (close === undefined) return undefined;\n index = close + 1;\n }\n if (tokens[index]?.text !== '(') return undefined;\n const arg = readArgument(context, index + 1);\n if (arg === undefined) return undefined;\n // endIndex는 호출의 닫는 `)` — `f('A').x`를 `f('A')`까지만 읽은 것처럼\n // 끝내면 `.x` 속성 접근이 모듈 바인딩으로 오인된다.\n const close = findMatching(tokens, index, '(', ')');\n return {\n value: arg.value === undefined\n ? { dynamicExpression: arg.expression }\n : { name: arg.value },\n endIndex: close ?? arg.endIndex,\n };\n}\n\n/** 한 단계 문자열 리터럴(`'lit'`·보간 없는 백틱)만 읽는다. */\nfunction readLiteralExpression(\n context: ScanContext,\n start: number,\n): { readonly value: string; readonly endIndex: number } | undefined {\n const token = context.tokens[start];\n if ((token?.kind === 'string' || token?.kind === 'template') &&\n token.value !== undefined) {\n return { value: token.value, endIndex: start };\n }\n return undefined;\n}\n\n/** 호출 인자의 첫 표현식을 읽는다. */\nfunction readArgument(\n context: ScanContext,\n start: number,\n): {\n readonly value?: string;\n readonly expression: string;\n readonly endIndex: number;\n} | undefined {\n const { tokens } = context;\n const token = tokens[start];\n if (token === undefined || token.text === ')' || token.text === ',') {\n return undefined;\n }\n const end = tokens[start + 1];\n // `]`는 `NativeModules['N']`·`M['m']()`의 인자 종결이다 — 빠뜨리면\n // 리터럴이 다토큰 표현식으로 읽혀 동적으로 오분류된다.\n const singleToken = end === undefined ||\n end.text === ',' || end.text === ')' || end.text === ']';\n // 한 단계 상수 추적 — `const X = 'lit'` 같은 파일 선언만 본다.\n if (token.kind === 'identifier' && singleToken) {\n const literal = isShadowed(context, token.text, start)\n ? undefined\n : context.constStrings.get(token.text);\n return literal === undefined || !isSafeNonEmptyString(literal)\n ? { expression: sanitizeExpression(token.text), endIndex: start }\n : { value: literal, expression: token.text, endIndex: start };\n }\n if (singleToken &&\n (token.kind === 'string' || token.kind === 'template') &&\n token.value !== undefined) {\n // 계약이 허용하지 않는 이름(빈 값·제어 문자·짝 없는 서러게이트)은 정적\n // 사실이 될 수 없다 — 원문을 실은 동적 사실로 내려 증거를 보존한다.\n return isSafeNonEmptyString(token.value)\n ? { value: token.value, expression: token.text, endIndex: start }\n : { expression: sanitizeExpression(token.text), endIndex: start };\n }\n // 그 외 표현식은 닫는 `)`나 같은 깊이의 `,`까지 원문을 보존한다.\n let depth = 0;\n let index = start;\n while (index < tokens.length) {\n const current = tokens[index]!;\n if (current.text === '(' || current.text === '[' || current.text === '{') {\n depth++;\n } else if (\n current.text === ')' || current.text === ']' || current.text === '}'\n ) {\n if (depth === 0) break;\n depth--;\n } else if (current.text === ',' && depth === 0) {\n break;\n }\n index++;\n }\n const last = tokens[index - 1];\n if (last === undefined || index === start) return undefined;\n return {\n expression: sanitizeExpression(\n context.source.slice(token.offset, last.offset + last.text.length),\n ),\n endIndex: index - 1,\n };\n}\n\n/** `<...>` 타입 인수 구간을 건너뛰어 닫는 `>`의 인덱스를 돌려준다. */\nfunction skipTypeArguments(\n tokens: readonly JsToken[],\n start: number,\n): number | undefined {\n let depth = 0;\n for (let index = start; index < tokens.length; index++) {\n const text = tokens[index]!.text;\n if (text === '<') depth++;\n else if (text === '>') {\n depth--;\n if (depth === 0) return index;\n } else if (depth === 0) {\n return undefined;\n }\n }\n return undefined;\n}\n\n/** 두 번째 순회: 브리지 API 호출·멤버 호출을 사실로 모은다. */\nfunction collectCalls(context: ScanContext): void {\n const { tokens } = context;\n for (let index = 0; index < tokens.length; index++) {\n const token = tokens[index]!;\n if (token.kind !== 'identifier') continue;\n if (token.text === 'NativeModules') {\n index = collectNativeModulesAccess(context, index);\n continue;\n }\n if (token.text === 'TurboModuleRegistry') {\n index = collectRegistryCall(context, index);\n continue;\n }\n // `function NAME(...)`·`function* NAME(...)`의 선언부는 호출이 아니다 —\n // 이름 기반 탐지가 선언 자리를 경계 호출로 오인하지 않게 뺀다.\n const declarationSite = tokens[index - 1]?.text === 'function' ||\n (tokens[index - 1]?.text === '*' &&\n tokens[index - 2]?.text === 'function');\n if (declarationSite) continue;\n if (moduleImportCalls.has(token.text)) {\n index = collectBoundaryCall(context, index, 'module-import', token.text);\n continue;\n }\n if (componentRequireCalls.has(token.text)) {\n index = collectBoundaryCall(context, index, 'component-require', token.text);\n continue;\n }\n // `import { api as alias }`로 들어온 경계 API — 사실의 mechanism 판정은\n // 로컬 별칭이 아니라 원본 export 이름을 기준으로 한다. 같은 이름의\n // 매개변수가 가리는 구간에서는 import 바인딩이 적용되지 않는다.\n const aliasedApi = isShadowed(context, token.text, index)\n ? undefined\n : boundaryAliasOf(context, token.text);\n if (aliasedApi !== undefined && boundaryCallOpens(context, index)) {\n index = collectBoundaryCall(\n context, index,\n moduleImportCalls.has(aliasedApi) ? 'module-import' : 'component-require',\n aliasedApi);\n continue;\n }\n const next = tokens[index + 1];\n if (next?.text === '.' || next?.text === '?.' || next?.text === '[') {\n index = collectBoundMemberCall(context, index);\n }\n }\n}\n\n/**\n * `NativeModules.N` 멤버 접근과 뒤따르는 메서드 호출을 처리한다.\n * 레지스트리 자체가 값으로 쓰이는 베어 `NativeModules`는 어느 모듈인지\n * 알 수 없어 원문을 실은 동적 사실로 남긴다.\n */\nfunction collectNativeModulesAccess(\n context: ScanContext,\n start: number,\n): number {\n const { tokens } = context;\n const member = tokens[start + 1];\n if (member?.text === '.' || member?.text === '?.') {\n const name = tokens[start + 2];\n if (name?.kind !== 'identifier' && name?.kind !== 'keyword') return start;\n context.facts.push({\n kind: 'module-import',\n channel: name.text,\n dynamic: false,\n token: name,\n });\n return collectChainedCall(context, { name: name.text }, start + 2)\n ?? start + 2;\n }\n if (member?.text === '[') {\n const arg = readArgument(context, start + 2);\n if (arg === undefined) return start;\n const bound: BoundName = arg.value === undefined\n ? { dynamicExpression: arg.expression }\n : { name: arg.value };\n const dynamic = arg.value === undefined;\n if (dynamic) context.counts.dynamicModuleNames++;\n context.facts.push({\n kind: 'module-import',\n channel: boundChannel(bound),\n dynamic,\n token: member,\n });\n const close = findMatching(tokens, start + 1, '[', ']');\n if (close === undefined) return arg.endIndex;\n return collectChainedCall(context, bound, close) ?? close;\n }\n // 앞 토큰이 `.`·키워드면 큰 식의 일부다 — 베어 접근만 세어 중복을 피한다.\n const previous = tokens[start - 1];\n // `const { A } = NativeModules`의 레지스트리는 구조 분해 원천이다 —\n // 각 이름이 이미 module-import를 냈으므로 베어 사실을 추가하지 않는다.\n const destructured = previous?.text === '=' &&\n tokens[start - 2]?.text === '}';\n if (previous !== undefined && previous.text !== '.' &&\n previous.text !== '?.' && !destructured) {\n context.facts.push({\n kind: 'module-import',\n channel: 'NativeModules',\n dynamic: true,\n token: tokens[start]!,\n });\n context.counts.dynamicModuleNames++;\n }\n return start;\n}\n\n/** `TurboModuleRegistry.get*('N')` 호출과 뒤따르는 메서드 호출을 처리한다. */\nfunction collectRegistryCall(context: ScanContext, start: number): number {\n const { tokens } = context;\n if (tokens[start + 1]?.text !== '.') return start;\n const method = tokens[start + 2];\n if (method === undefined || !turboRegistryMethods.has(method.text)) {\n return start;\n }\n // skipTypeArguments는 닫는 `>`의 위치를 주므로 `(`는 그 다음 토큰이다.\n let open = start + 3;\n if (tokens[open]?.text === '<') {\n const closeAngle = skipTypeArguments(tokens, open);\n if (closeAngle === undefined) return start;\n open = closeAngle + 1;\n }\n if (tokens[open]?.text !== '(') return start;\n const arg = readArgument(context, open + 1);\n if (arg === undefined) return start;\n const dynamic = arg.value === undefined;\n if (dynamic) context.counts.dynamicModuleNames++;\n const bound: BoundName = dynamic\n ? { dynamicExpression: arg.expression }\n : { name: arg.value! };\n context.facts.push({\n kind: 'module-import',\n channel: boundChannel(bound),\n ...(optionalRegistryMethods.has(method.text) ? { optional: true } : {}),\n dynamic,\n token: method,\n });\n const close = findMatching(tokens, open, '(', ')');\n if (close === undefined) return arg.endIndex;\n return collectChainedCall(context, bound, close) ?? close;\n}\n\n/**\n * 식별자가 `import { api as local }`로 들어온 경계 API 별칭이면 원본 export\n * 이름을 돌려준다 — 별칭 호출의 mechanism은 원본 이름 기준으로 판정한다.\n */\nfunction boundaryAliasOf(\n context: ScanContext,\n localName: string,\n): string | undefined {\n for (const entry of context.imports) {\n if (entry.localName === localName &&\n (moduleImportCalls.has(entry.exportedName) ||\n componentRequireCalls.has(entry.exportedName))) {\n return entry.exportedName;\n }\n }\n return undefined;\n}\n\n/** 식별자 뒤가 호출(`(` 또는 타입 인수 뒤 `(`)인지 본다. */\nfunction boundaryCallOpens(context: ScanContext, start: number): boolean {\n const { tokens } = context;\n let open = start + 1;\n if (tokens[open]?.text === '<') {\n const close = skipTypeArguments(tokens, open);\n if (close === undefined) return false;\n open = close + 1;\n }\n return tokens[open]?.text === '(';\n}\n\n/** `requireNativeModule('N')` 등 단독 호출의 경계 사실과 메서드 호출을 처리한다. */\nfunction collectBoundaryCall(\n context: ScanContext,\n start: number,\n kind: 'module-import' | 'component-require',\n apiName: string,\n): number {\n const { tokens } = context;\n let open = start + 1;\n if (tokens[open]?.text === '<') {\n const closeAngle = skipTypeArguments(tokens, open);\n if (closeAngle === undefined) return start;\n open = closeAngle + 1;\n }\n if (tokens[open]?.text !== '(') return start;\n const arg = readArgument(context, open + 1);\n if (arg === undefined) return start;\n const dynamic = arg.value === undefined;\n if (dynamic) {\n if (kind === 'module-import') context.counts.dynamicModuleNames++;\n else context.counts.dynamicComponentNames++;\n }\n const bound: BoundName = dynamic\n ? { dynamicExpression: arg.expression }\n : { name: arg.value! };\n const mechanism = mechanismOf(context, apiName, tokens[start]!.text, start);\n context.facts.push({\n kind,\n channel: boundChannel(bound),\n ...(mechanism === undefined ? {} : { mechanism }),\n ...(optionalModuleCalls.has(apiName) ? { optional: true } : {}),\n dynamic,\n token: tokens[start]!,\n });\n if (kind !== 'module-import') return arg.endIndex;\n const close = findMatching(tokens, open, '(', ')');\n if (close === undefined) return arg.endIndex;\n return collectChainedCall(context, bound, close) ?? close;\n}\n\n/**\n * 단독 호출의 해석 경로(mechanism)를 정한다.\n *\n * `requireNativeModule`·`requireOptionalNativeModule`·`requireNativeViewManager`는\n * Expo SDK에만 있는 공개 API다 — Expo 패키지 import·CJS `require`로\n * 확인되거나 어떤 가져오기·로컬 선언도 없이 호출되면 `expo`로 표시한다.\n * 같은 이름이 로컬에 선언됐거나(같은 파일 래퍼·쉼) Expo가 아닌 specifier에서\n * 가져온 동명 래퍼면 어느 경로로 해석되는지 알 수 없어 mechanism을 생략해\n * 추측하지 않는다 — 틀린 `expo` 표시는 조인을 끊거나 거짓 매치를 만든다.\n */\nfunction mechanismOf(\n context: ScanContext,\n apiName: string,\n localName: string,\n start: number,\n): 'expo' | undefined {\n if (!expoApiCalls.has(apiName)) return undefined;\n // 같은 이름의 매개변수가 가리는 구간에서는 import·require·선언 해석이\n // 이 호출에 적용되지 않는다 — mechanism을 생략해 추측하지 않는다.\n if (isShadowed(context, localName, start)) return undefined;\n const specifiers = context.imports\n .filter((entry) => entry.localName === localName)\n .map((entry) => entry.specifier);\n if (specifiers.length > 0) {\n return specifiers.some((specifier) => expoSpecifierPattern.test(specifier))\n ? 'expo'\n : undefined;\n }\n const required = context.requireSpecifiers.get(localName);\n if (required !== undefined) {\n return expoSpecifierPattern.test(required) ? 'expo' : undefined;\n }\n if (context.localNames.has(localName)) return undefined;\n return 'expo';\n}\n\n/**\n * `<moduleExpr>.method(...)` 연속 호출을 method-invoke 사실로 기록한다.\n * 베이스는 이미 확정된 모듈 식이라 식별자 해석을 거치지 않는다.\n */\nfunction collectChainedCall(\n context: ScanContext,\n bound: BoundName,\n endIndex: number,\n): number | undefined {\n const { tokens } = context;\n const dot = tokens[endIndex + 1];\n if (dot?.text !== '.' && dot?.text !== '?.') return undefined;\n const method = tokens[endIndex + 2];\n if (method === undefined) return endIndex;\n if (method.kind === 'identifier' || method.kind === 'keyword') {\n // `NativeModules.N.m` 참조만 있고 호출이 없으면 사실이 아니다.\n return isCallAt(tokens, endIndex + 3)\n ? recordDirectMethodCall(context, bound, method, false, endIndex + 3)\n : endIndex + 2;\n }\n if (method.text === '[') {\n const arg = readArgument(context, endIndex + 3);\n if (arg === undefined) return endIndex + 2;\n const bracketClose = findMatching(tokens, endIndex + 2, '[', ']');\n if (bracketClose === undefined || !isCallAt(tokens, bracketClose + 1)) {\n return arg.endIndex;\n }\n const dynamicMethod = arg.value === undefined;\n if (dynamicMethod) context.counts.dynamicMethodNames++;\n return recordDirectMethodCall(\n context,\n bound,\n method,\n dynamicMethod,\n bracketClose + 1,\n dynamicMethod ? arg.expression : arg.value!,\n );\n }\n return endIndex;\n}\n\n/** 확정된 모듈 식 위의 메서드 호출을 사실로 기록한다. */\nfunction recordDirectMethodCall(\n context: ScanContext,\n bound: BoundName,\n token: JsToken,\n dynamicMethod: boolean,\n callIndex: number,\n methodText?: string,\n): number {\n const name = 'name' in bound ? bound.name : bound.dynamicExpression;\n const dynamic = !('name' in bound);\n context.facts.push({\n kind: 'method-invoke',\n channel: name,\n method: methodText ?? token.text,\n dynamic: dynamic || dynamicMethod,\n token,\n });\n return callIndex;\n}\n\n/**\n * 바인딩 식별자의 `M.foo()`·`M[expr]()` 멤버 호출을 후보로 기록한다.\n * 로컬 바인딩이나 import 바인딩이 없는 식별자는 모듈 근거가 없어 건너뛴다.\n */\nfunction collectBoundMemberCall(context: ScanContext, start: number): number {\n const { tokens } = context;\n const token = tokens[start]!;\n const bound = !isShadowed(context, token.text, start) &&\n (context.bindings.has(token.text) ||\n context.imports.some((entry) => entry.localName === token.text));\n const accessor = tokens[start + 1];\n // `M[expr]()` — 대괄호 접근은 식별자 바로 뒤에 온다.\n if (accessor?.text === '[') {\n const arg = readArgument(context, start + 2);\n if (arg === undefined) return start;\n const bracketClose = findMatching(tokens, start + 1, '[', ']');\n const called = bracketClose !== undefined &&\n isCallAt(tokens, bracketClose + 1);\n if (bound && called) {\n const dynamicMethod = arg.value === undefined;\n if (dynamicMethod) context.counts.dynamicMethodNames++;\n context.memberCalls.push({\n ident: token.text,\n method: dynamicMethod ? arg.expression : arg.value!,\n dynamicMethod,\n token: accessor,\n });\n }\n return arg.endIndex;\n }\n // accessor는 `.`·`?.` — 뒤는 메서드 식별자 또는 `M?.[expr]`의 `[`다.\n const method = tokens[start + 2];\n if (method === undefined) return start;\n if (method.kind === 'identifier' || method.kind === 'keyword') {\n if (!isCallAt(tokens, start + 3)) return start + 2;\n if (bound) {\n context.memberCalls.push({\n ident: token.text,\n method: method.text,\n dynamicMethod: false,\n token: method,\n });\n }\n return start + 2;\n }\n if (method.text === '[') {\n const arg = readArgument(context, start + 3);\n if (arg === undefined) return start;\n const bracketClose = findMatching(tokens, start + 2, '[', ']');\n const called = bracketClose !== undefined && isCallAt(tokens, bracketClose + 1);\n if (bound && called) {\n const dynamicMethod = arg.value === undefined;\n if (dynamicMethod) context.counts.dynamicMethodNames++;\n context.memberCalls.push({\n ident: token.text,\n method: dynamicMethod ? arg.expression : arg.value!,\n dynamicMethod,\n token: method,\n });\n }\n return arg.endIndex;\n }\n return start;\n}\n\n/** `(` 또는 `<T>(`로 시작하는 호출인지 확인한다. */\nfunction isCallAt(tokens: readonly JsToken[], start: number): boolean {\n const token = tokens[start];\n if (token?.text === '(') return true;\n if (token?.text !== '<') return false;\n const close = skipTypeArguments(tokens, start);\n return close !== undefined && tokens[close + 1]?.text === '(';\n}\n\n/** BoundName을 사실의 channel 문자열로 바꾼다. */\nfunction boundChannel(bound: BoundName): string {\n return 'name' in bound ? bound.name : bound.dynamicExpression;\n}\n\n/**\n * 매개변수가 파일 전역 바인딩을 가리는 본문 구간을 모은다.\n *\n * 인식하는 형태는 `function f(M) {…}`·`f(M) {…}`(메서드 약칭)·`(M) => {…}`·\n * `M => {…}`다. `foo(x) {…}`처럼 호출 뒤 블록이 오는 문장도 매개변수 목록으로\n * 보이지만, 그 경우의 과도한 가림은 사실을 놓칠 뿐 거짓 사실을 만들지 않는다.\n * 본문이 `{`로 시작하지 않는 화살표(`M => M.x()`)는 끝을 알 수 없어 건너뛴다.\n */\nfunction collectParamShadows(tokens: readonly JsToken[]): ParamShadow[] {\n const shadows: ParamShadow[] = [];\n for (let index = 0; index < tokens.length; index++) {\n const token = tokens[index]!;\n // `M => {…}` 단일 매개변수 화살표다.\n if ((token.kind === 'identifier' || token.kind === 'keyword') &&\n tokens[index + 1]?.text === '=>' && tokens[index + 2]?.text === '{') {\n const close = findMatching(tokens, index + 2, '{', '}');\n if (close !== undefined) {\n shadows.push({\n from: index + 2,\n to: close + 1,\n names: new Set([token.text]),\n });\n index = close;\n }\n continue;\n }\n if (token.text !== '(') continue;\n const previous = tokens[index - 1];\n // `function f(…)`·`function (…)`의 매개변수 목록이다.\n let isParams = previous?.text === 'function' ||\n (previous?.kind === 'identifier' &&\n tokens[index - 2]?.text === 'function');\n const close = findMatching(tokens, index, '(', ')');\n if (close === undefined) continue;\n if (!isParams) {\n const afterClose = tokens[close + 1];\n isParams = afterClose?.text === '=>' ||\n // `f(M) {…}` 메서드 약칭 — `(` 앞이 식별자일 때만 본다.\n // `if (M) {…}` 같은 키워드 조건절은 매개변수가 아니다.\n (previous?.kind === 'identifier' && afterClose?.text === '{');\n }\n if (!isParams) continue;\n let bodyIndex = close + 1;\n if (tokens[bodyIndex]?.text === '=>') bodyIndex++;\n if (tokens[bodyIndex]?.text !== '{') continue;\n const bodyClose = findMatching(tokens, bodyIndex, '{', '}');\n if (bodyClose === undefined) continue;\n const names = new Set<string>();\n for (let cursor = index + 1; cursor < close; cursor++) {\n const param = tokens[cursor]!;\n if (param.kind === 'identifier' || param.kind === 'keyword') {\n names.add(param.text);\n }\n }\n shadows.push({ from: bodyIndex, to: bodyClose + 1, names });\n index = close;\n }\n return shadows;\n}\n\n/** 위치 `index`의 `name`이 매개변수에 가려졌는지 판정한다. */\nfunction isShadowed(\n context: ScanContext,\n name: string,\n index: number,\n): boolean {\n return context.paramShadows.some(\n (shadow) =>\n index >= shadow.from && index < shadow.to && shadow.names.has(name),\n );\n}\n\n/** 짝 맞는 괄호 토큰을 찾는다. */\nfunction findMatching(\n tokens: readonly JsToken[],\n open: number,\n openText: string,\n closeText: string,\n): number | undefined {\n let depth = 0;\n for (let index = open; index < tokens.length; index++) {\n const text = tokens[index]!.text;\n if (text === openText) depth++;\n else if (text === closeText) {\n depth--;\n if (depth === 0) return index;\n }\n }\n return undefined;\n}\n\n/**\n * 동적 표현식의 원문을 계약 필드가 허용하는 안전한 문자열로 바꾼다.\n *\n * 제어 문자는 공백으로 접고 길이를 제한해 원문 표현이 키 파싱을 깨지 않게 한다.\n */\nexport function sanitizeExpression(expression: string): string {\n const cleaned = expression\n .replace(/[\\u0000-\\u001F\\u007F-\\u009F]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n return cleaned.length > 200 ? `${cleaned.slice(0, 197)}...` : cleaned;\n}\n"]}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * extract-js의 무의존 JS/TS 토크나이저다.
3
+ *
4
+ * 목적은 정적 브리지 호출 탐지이므로 완전한 문법이 아니라 브리지 API 인식에
5
+ * 필요한 토큰 종류만 구분한다. 주석·공백은 건너뛰고, 문자열 리터럴은 해석된
6
+ * 값을, 보간이 있는 템플릿은 값 없는 template 토큰으로 남긴다.
7
+ */
8
+ /** 토큰의 어휘 종류다. */
9
+ export type JsTokenKind = 'identifier' | 'keyword' | 'string' | 'template' | 'number' | 'punct' | 'other';
10
+ /** 소스 텍스트의 한 어휘다. line·column은 1부터 센다. */
11
+ export interface JsToken {
12
+ readonly kind: JsTokenKind;
13
+ /** 소스에 있던 원문이다. */
14
+ readonly text: string;
15
+ /**
16
+ * 리터럴로 확정된 문자열 값이다. string과 보간 없는 template에만 있다 —
17
+ * `dynamic: false` 사실의 이름 후보로만 쓸 수 있다.
18
+ */
19
+ readonly value?: string;
20
+ /** 소스 시작점부터의 문자 오프셋이다. */
21
+ readonly offset: number;
22
+ readonly line: number;
23
+ readonly column: number;
24
+ }
25
+ /** 소스를 토큰 열로 바꾼다. 해석 불가 구간도 위치를 보존한 채 other로 남긴다. */
26
+ export declare function tokenizeJsSource(source: string): JsToken[];
@@ -0,0 +1,316 @@
1
+ /**
2
+ * extract-js의 무의존 JS/TS 토크나이저다.
3
+ *
4
+ * 목적은 정적 브리지 호출 탐지이므로 완전한 문법이 아니라 브리지 API 인식에
5
+ * 필요한 토큰 종류만 구분한다. 주석·공백은 건너뛰고, 문자열 리터럴은 해석된
6
+ * 값을, 보간이 있는 템플릿은 값 없는 template 토큰으로 남긴다.
7
+ */
8
+ const keywords = new Set([
9
+ 'await', 'async', 'break', 'case', 'catch', 'class', 'const', 'continue',
10
+ 'debugger', 'default', 'delete', 'do', 'else', 'export', 'extends', 'finally',
11
+ 'for', 'function', 'if', 'import', 'in', 'instanceof', 'let', 'new', 'of',
12
+ 'return', 'static', 'switch', 'throw', 'try', 'typeof', 'var', 'void',
13
+ 'while', 'yield', 'from', 'as', 'get', 'set',
14
+ ]);
15
+ /**
16
+ * 한 토큰으로 묶는 복합 구두점이다 — 긴 것부터 앞에 둬야 `===`가 `=`+`==`로
17
+ * 쪼개지지 않는다. 비교 연산이 `=`로 보이면 스캐너가 대입으로 오인해 살아 있는
18
+ * 바인딩을 지우므로 비교·대입·증감 연산자 전부를 포함한다.
19
+ */
20
+ const multiCharPuncts = [
21
+ '>>>=',
22
+ '===', '!==', '>>>', '**=', '<<=', '>>=', '&&=', '||=', '??=',
23
+ '=>', '?.', '==', '!=', '<=', '>=', '&&', '||', '??', '++', '--',
24
+ '+=', '-=', '*=', '/=', '%=', '&=', '|=', '^=', '**', '<<', '>>',
25
+ '...',
26
+ ];
27
+ /**
28
+ * 정규식 리터럴이 시작될 수 있는 위치인지 추정한다.
29
+ *
30
+ * JS 문법상 나눗셈과 정규식은 앞 토큰으로만 구분된다 — 식별자·숫자·문자열·
31
+ * `)`·`]`·`}` 뒤의 `/`는 나눗셈이다. 잘못 판정하면 `/` 이후가 문자열로 삼켜져
32
+ * 위치가 어긋나므로 보수적으로 나눗셈 쪽으로 본다.
33
+ */
34
+ function isRegexPosition(previous) {
35
+ if (previous === undefined)
36
+ return true;
37
+ if (previous.kind === 'identifier' || previous.kind === 'number' ||
38
+ previous.kind === 'string' || previous.kind === 'template') {
39
+ return false;
40
+ }
41
+ if (previous.kind === 'punct' &&
42
+ (previous.text === ')' || previous.text === ']' || previous.text === '}' ||
43
+ // `count++ / total`의 `/`는 나눗셈이다 — 증감 뒤를 정규식 위치로 보면
44
+ // 뒤 텍스트가 통째로 삼켜진다.
45
+ previous.text === '++' || previous.text === '--')) {
46
+ return false;
47
+ }
48
+ return true;
49
+ }
50
+ /** 소스를 토큰 열로 바꾼다. 해석 불가 구간도 위치를 보존한 채 other로 남긴다. */
51
+ export function tokenizeJsSource(source) {
52
+ const tokens = [];
53
+ let index = 0;
54
+ let line = 1;
55
+ let lineStart = 0;
56
+ const push = (kind, start, startLine, startColumn, value) => {
57
+ tokens.push({
58
+ kind,
59
+ text: source.slice(start, index),
60
+ ...(value === undefined ? {} : { value }),
61
+ offset: start,
62
+ line: startLine,
63
+ column: startColumn,
64
+ });
65
+ };
66
+ const advance = (end) => {
67
+ while (index < end) {
68
+ if (source[index] === '\n') {
69
+ line++;
70
+ lineStart = index + 1;
71
+ }
72
+ index++;
73
+ }
74
+ };
75
+ while (index < source.length) {
76
+ const start = index;
77
+ const startLine = line;
78
+ const startColumn = index - lineStart + 1;
79
+ const char = source[index];
80
+ if (char === ' ' || char === '\t' || char === '\r' || char === '\n') {
81
+ advance(index + 1);
82
+ continue;
83
+ }
84
+ if (char === '/' && source[index + 1] === '/') {
85
+ while (index < source.length && source[index] !== '\n')
86
+ index++;
87
+ continue;
88
+ }
89
+ if (char === '/' && source[index + 1] === '*') {
90
+ const close = source.indexOf('*/', index + 2);
91
+ advance(close === -1 ? source.length : close + 2);
92
+ continue;
93
+ }
94
+ if (char === '/' && isRegexPosition(tokens.at(-1))) {
95
+ // 정규식 본문을 훑는다. 문자 클래스 안의 `/`는 종료가 아니다.
96
+ let cursor = index + 1;
97
+ let inClass = false;
98
+ while (cursor < source.length) {
99
+ const c = source[cursor];
100
+ if (c === '\\')
101
+ cursor += 2;
102
+ else if (c === '[') {
103
+ inClass = true;
104
+ cursor++;
105
+ }
106
+ else if (c === ']') {
107
+ inClass = false;
108
+ cursor++;
109
+ }
110
+ else if (c === '/' && !inClass) {
111
+ cursor++;
112
+ break;
113
+ }
114
+ else if (c === '\n')
115
+ break;
116
+ else
117
+ cursor++;
118
+ }
119
+ advance(cursor);
120
+ push('other', start, startLine, startColumn);
121
+ continue;
122
+ }
123
+ if (char === '\'' || char === '"') {
124
+ const value = readQuoted(source, index, char);
125
+ advance(value.end);
126
+ if (value.closed)
127
+ push('string', start, startLine, startColumn, value.text);
128
+ else
129
+ push('other', start, startLine, startColumn);
130
+ continue;
131
+ }
132
+ if (char === '`') {
133
+ const template = readTemplate(source, index);
134
+ advance(template.end);
135
+ push('template', start, startLine, startColumn, template.value);
136
+ continue;
137
+ }
138
+ if (isIdentifierStart(char)) {
139
+ while (index < source.length && isIdentifierPart(source[index]))
140
+ index++;
141
+ const text = source.slice(start, index);
142
+ push(keywords.has(text) ? 'keyword' : 'identifier', start, startLine, startColumn);
143
+ continue;
144
+ }
145
+ if (char >= '0' && char <= '9') {
146
+ while (index < source.length &&
147
+ /[A-Za-z0-9_.xXbBoO]/.test(source[index]))
148
+ index++;
149
+ push('number', start, startLine, startColumn);
150
+ continue;
151
+ }
152
+ const multi = multiCharPuncts.find((punct) => source.startsWith(punct, index));
153
+ if (multi !== undefined) {
154
+ advance(index + multi.length);
155
+ push('punct', start, startLine, startColumn);
156
+ continue;
157
+ }
158
+ if (isPunct(char)) {
159
+ index++;
160
+ push('punct', start, startLine, startColumn);
161
+ continue;
162
+ }
163
+ index++;
164
+ push('other', start, startLine, startColumn);
165
+ }
166
+ return tokens;
167
+ }
168
+ /** 식별자 시작 문자다. */
169
+ function isIdentifierStart(char) {
170
+ return /[A-Za-z_$]/.test(char);
171
+ }
172
+ /** 식별자 후속 문자다. */
173
+ function isIdentifierPart(char) {
174
+ return /[A-Za-z0-9_$]/.test(char);
175
+ }
176
+ /** 단일 문자로 읽는 구두점이다. */
177
+ function isPunct(char) {
178
+ return /[()[\]{}<>:;,.=!&|?+\-*%^~@#]/.test(char);
179
+ }
180
+ /** 따옴표 문자열을 읽어 해석된 값과 끝 위치를 돌려준다. */
181
+ function readQuoted(source, start, quote) {
182
+ let cursor = start + 1;
183
+ let text = '';
184
+ while (cursor < source.length) {
185
+ const char = source[cursor];
186
+ if (char === '\\') {
187
+ const escaped = cookEscape(source, cursor);
188
+ text += escaped.text;
189
+ cursor = escaped.end;
190
+ continue;
191
+ }
192
+ if (char === quote)
193
+ return { end: cursor + 1, closed: true, text };
194
+ if (char === '\n')
195
+ return { end: cursor, closed: false, text };
196
+ text += char;
197
+ cursor++;
198
+ }
199
+ return { end: cursor, closed: false, text };
200
+ }
201
+ /**
202
+ * 백틱 템플릿을 읽는다.
203
+ *
204
+ * 보간 `${...}`이 있으면 이름을 정적으로 확정할 수 없으므로 value를 두지
205
+ * 않는다. 중첩 템플릿·중괄호 깊이를 세어 종료 백틱을 정확히 찾는다.
206
+ */
207
+ function readTemplate(source, start) {
208
+ let cursor = start + 1;
209
+ let interpolated = false;
210
+ let text = '';
211
+ while (cursor < source.length) {
212
+ const char = source[cursor];
213
+ if (char === '\\') {
214
+ const escaped = cookEscape(source, cursor);
215
+ text += escaped.text;
216
+ cursor = escaped.end;
217
+ continue;
218
+ }
219
+ if (char === '`') {
220
+ return { end: cursor + 1, ...(interpolated ? {} : { value: text }) };
221
+ }
222
+ if (char === '$' && source[cursor + 1] === '{') {
223
+ interpolated = true;
224
+ cursor = skipInterpolation(source, cursor + 2);
225
+ continue;
226
+ }
227
+ text += char;
228
+ cursor++;
229
+ }
230
+ return { end: cursor, ...(interpolated ? {} : { value: text }) };
231
+ }
232
+ /** `${` 뒤의 보간 본문을 중괄호 균형으로 건너뛰어 닫는 `}` 다음을 돌려준다. */
233
+ function skipInterpolation(source, start) {
234
+ let depth = 1;
235
+ let cursor = start;
236
+ while (cursor < source.length && depth > 0) {
237
+ const char = source[cursor];
238
+ if (char === '{')
239
+ depth++;
240
+ else if (char === '}')
241
+ depth--;
242
+ else if (char === '\'' || char === '"' || char === '`') {
243
+ cursor = skipStringLike(source, cursor, char);
244
+ continue;
245
+ }
246
+ // 보간 안의 주석도 중괄호 깊이에 섞이면 안 된다.
247
+ else if (char === '/' && source[cursor + 1] === '/') {
248
+ while (cursor < source.length && source[cursor] !== '\n')
249
+ cursor++;
250
+ continue;
251
+ }
252
+ else if (char === '/' && source[cursor + 1] === '*') {
253
+ const close = source.indexOf('*/', cursor + 2);
254
+ cursor = close === -1 ? source.length : close + 2;
255
+ continue;
256
+ }
257
+ cursor++;
258
+ }
259
+ return cursor;
260
+ }
261
+ /** 보간 안의 문자열 계열 리터럴을 통째로 건너뛴다. */
262
+ function skipStringLike(source, start, quote) {
263
+ let cursor = start + 1;
264
+ while (cursor < source.length) {
265
+ const char = source[cursor];
266
+ if (char === '\\') {
267
+ cursor += 2;
268
+ continue;
269
+ }
270
+ if (quote === '`' && char === '$' && source[cursor + 1] === '{') {
271
+ cursor = skipInterpolation(source, cursor + 2);
272
+ continue;
273
+ }
274
+ if (char === quote)
275
+ return cursor + 1;
276
+ cursor++;
277
+ }
278
+ return cursor;
279
+ }
280
+ /** 이스케이프 시퀀스 하나를 해석한다. 알 수 없는 형태는 원문 그대로 둔다. */
281
+ function cookEscape(source, start) {
282
+ const char = source[start + 1];
283
+ if (char === undefined)
284
+ return { end: start + 1, text: '' };
285
+ const simple = {
286
+ n: '\n', r: '\r', t: '\t', b: '\b', f: '\f', v: '\v', '0': '\0',
287
+ };
288
+ const mapped = simple[char];
289
+ if (mapped !== undefined)
290
+ return { end: start + 2, text: mapped };
291
+ if (char === 'x') {
292
+ const digits = source.slice(start + 2, start + 4);
293
+ if (/^[0-9A-Fa-f]{2}$/.test(digits)) {
294
+ return { end: start + 4, text: String.fromCharCode(parseInt(digits, 16)) };
295
+ }
296
+ }
297
+ if (char === 'u') {
298
+ const braced = source[start + 2] === '{'
299
+ ? source.slice(start + 3, source.indexOf('}', start + 3))
300
+ : source.slice(start + 2, start + 6);
301
+ if (/^[0-9A-Fa-f]+$/.test(braced)) {
302
+ const code = parseInt(braced, 16);
303
+ if (code <= 0x10FFFF) {
304
+ return {
305
+ end: source[start + 2] === '{'
306
+ ? source.indexOf('}', start + 3) + 1
307
+ : start + 6,
308
+ text: String.fromCodePoint(code),
309
+ };
310
+ }
311
+ }
312
+ }
313
+ // 알려지지 않은 이스케이프는 문자 그대로다(ES에서 '\'는 사라진다).
314
+ return { end: start + 2, text: char };
315
+ }
316
+ //# sourceMappingURL=lexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.js","sourceRoot":"","sources":["../../src/extract/lexer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * extract-js의 무의존 JS/TS 토크나이저다.\n *\n * 목적은 정적 브리지 호출 탐지이므로 완전한 문법이 아니라 브리지 API 인식에\n * 필요한 토큰 종류만 구분한다. 주석·공백은 건너뛰고, 문자열 리터럴은 해석된\n * 값을, 보간이 있는 템플릿은 값 없는 template 토큰으로 남긴다.\n */\n\n/** 토큰의 어휘 종류다. */\nexport type JsTokenKind =\n | 'identifier'\n | 'keyword'\n | 'string'\n | 'template'\n | 'number'\n | 'punct'\n | 'other';\n\n/** 소스 텍스트의 한 어휘다. line·column은 1부터 센다. */\nexport interface JsToken {\n readonly kind: JsTokenKind;\n /** 소스에 있던 원문이다. */\n readonly text: string;\n /**\n * 리터럴로 확정된 문자열 값이다. string과 보간 없는 template에만 있다 —\n * `dynamic: false` 사실의 이름 후보로만 쓸 수 있다.\n */\n readonly value?: string;\n /** 소스 시작점부터의 문자 오프셋이다. */\n readonly offset: number;\n readonly line: number;\n readonly column: number;\n}\n\nconst keywords = new Set([\n 'await', 'async', 'break', 'case', 'catch', 'class', 'const', 'continue',\n 'debugger', 'default', 'delete', 'do', 'else', 'export', 'extends', 'finally',\n 'for', 'function', 'if', 'import', 'in', 'instanceof', 'let', 'new', 'of',\n 'return', 'static', 'switch', 'throw', 'try', 'typeof', 'var', 'void',\n 'while', 'yield', 'from', 'as', 'get', 'set',\n]);\n\n/**\n * 한 토큰으로 묶는 복합 구두점이다 — 긴 것부터 앞에 둬야 `===`가 `=`+`==`로\n * 쪼개지지 않는다. 비교 연산이 `=`로 보이면 스캐너가 대입으로 오인해 살아 있는\n * 바인딩을 지우므로 비교·대입·증감 연산자 전부를 포함한다.\n */\nconst multiCharPuncts = [\n '>>>=',\n '===', '!==', '>>>', '**=', '<<=', '>>=', '&&=', '||=', '??=',\n '=>', '?.', '==', '!=', '<=', '>=', '&&', '||', '??', '++', '--',\n '+=', '-=', '*=', '/=', '%=', '&=', '|=', '^=', '**', '<<', '>>',\n '...',\n];\n\n/**\n * 정규식 리터럴이 시작될 수 있는 위치인지 추정한다.\n *\n * JS 문법상 나눗셈과 정규식은 앞 토큰으로만 구분된다 — 식별자·숫자·문자열·\n * `)`·`]`·`}` 뒤의 `/`는 나눗셈이다. 잘못 판정하면 `/` 이후가 문자열로 삼켜져\n * 위치가 어긋나므로 보수적으로 나눗셈 쪽으로 본다.\n */\nfunction isRegexPosition(previous: JsToken | undefined): boolean {\n if (previous === undefined) return true;\n if (previous.kind === 'identifier' || previous.kind === 'number' ||\n previous.kind === 'string' || previous.kind === 'template') {\n return false;\n }\n if (previous.kind === 'punct' &&\n (previous.text === ')' || previous.text === ']' || previous.text === '}' ||\n // `count++ / total`의 `/`는 나눗셈이다 — 증감 뒤를 정규식 위치로 보면\n // 뒤 텍스트가 통째로 삼켜진다.\n previous.text === '++' || previous.text === '--')) {\n return false;\n }\n return true;\n}\n\n/** 소스를 토큰 열로 바꾼다. 해석 불가 구간도 위치를 보존한 채 other로 남긴다. */\nexport function tokenizeJsSource(source: string): JsToken[] {\n const tokens: JsToken[] = [];\n let index = 0;\n let line = 1;\n let lineStart = 0;\n const push = (kind: JsTokenKind, start: number, startLine: number,\n startColumn: number, value?: string): void => {\n tokens.push({\n kind,\n text: source.slice(start, index),\n ...(value === undefined ? {} : { value }),\n offset: start,\n line: startLine,\n column: startColumn,\n });\n };\n const advance = (end: number): void => {\n while (index < end) {\n if (source[index] === '\\n') {\n line++;\n lineStart = index + 1;\n }\n index++;\n }\n };\n while (index < source.length) {\n const start = index;\n const startLine = line;\n const startColumn = index - lineStart + 1;\n const char = source[index]!;\n if (char === ' ' || char === '\\t' || char === '\\r' || char === '\\n') {\n advance(index + 1);\n continue;\n }\n if (char === '/' && source[index + 1] === '/') {\n while (index < source.length && source[index] !== '\\n') index++;\n continue;\n }\n if (char === '/' && source[index + 1] === '*') {\n const close = source.indexOf('*/', index + 2);\n advance(close === -1 ? source.length : close + 2);\n continue;\n }\n if (char === '/' && isRegexPosition(tokens.at(-1))) {\n // 정규식 본문을 훑는다. 문자 클래스 안의 `/`는 종료가 아니다.\n let cursor = index + 1;\n let inClass = false;\n while (cursor < source.length) {\n const c = source[cursor]!;\n if (c === '\\\\') cursor += 2;\n else if (c === '[') { inClass = true; cursor++; }\n else if (c === ']') { inClass = false; cursor++; }\n else if (c === '/' && !inClass) { cursor++; break; }\n else if (c === '\\n') break;\n else cursor++;\n }\n advance(cursor);\n push('other', start, startLine, startColumn);\n continue;\n }\n if (char === '\\'' || char === '\"') {\n const value = readQuoted(source, index, char);\n advance(value.end);\n if (value.closed) push('string', start, startLine, startColumn, value.text);\n else push('other', start, startLine, startColumn);\n continue;\n }\n if (char === '`') {\n const template = readTemplate(source, index);\n advance(template.end);\n push('template', start, startLine, startColumn, template.value);\n continue;\n }\n if (isIdentifierStart(char)) {\n while (index < source.length && isIdentifierPart(source[index]!)) index++;\n const text = source.slice(start, index);\n push(keywords.has(text) ? 'keyword' : 'identifier',\n start, startLine, startColumn);\n continue;\n }\n if (char >= '0' && char <= '9') {\n while (index < source.length &&\n /[A-Za-z0-9_.xXbBoO]/.test(source[index]!)) index++;\n push('number', start, startLine, startColumn);\n continue;\n }\n const multi = multiCharPuncts.find((punct) => source.startsWith(punct, index));\n if (multi !== undefined) {\n advance(index + multi.length);\n push('punct', start, startLine, startColumn);\n continue;\n }\n if (isPunct(char)) {\n index++;\n push('punct', start, startLine, startColumn);\n continue;\n }\n index++;\n push('other', start, startLine, startColumn);\n }\n return tokens;\n}\n\n/** 식별자 시작 문자다. */\nfunction isIdentifierStart(char: string): boolean {\n return /[A-Za-z_$]/.test(char);\n}\n\n/** 식별자 후속 문자다. */\nfunction isIdentifierPart(char: string): boolean {\n return /[A-Za-z0-9_$]/.test(char);\n}\n\n/** 단일 문자로 읽는 구두점이다. */\nfunction isPunct(char: string): boolean {\n return /[()[\\]{}<>:;,.=!&|?+\\-*%^~@#]/.test(char);\n}\n\n/** 따옴표 문자열을 읽어 해석된 값과 끝 위치를 돌려준다. */\nfunction readQuoted(\n source: string,\n start: number,\n quote: string,\n): { readonly end: number; readonly closed: boolean; readonly text: string } {\n let cursor = start + 1;\n let text = '';\n while (cursor < source.length) {\n const char = source[cursor]!;\n if (char === '\\\\') {\n const escaped = cookEscape(source, cursor);\n text += escaped.text;\n cursor = escaped.end;\n continue;\n }\n if (char === quote) return { end: cursor + 1, closed: true, text };\n if (char === '\\n') return { end: cursor, closed: false, text };\n text += char;\n cursor++;\n }\n return { end: cursor, closed: false, text };\n}\n\n/**\n * 백틱 템플릿을 읽는다.\n *\n * 보간 `${...}`이 있으면 이름을 정적으로 확정할 수 없으므로 value를 두지\n * 않는다. 중첩 템플릿·중괄호 깊이를 세어 종료 백틱을 정확히 찾는다.\n */\nfunction readTemplate(\n source: string,\n start: number,\n): { readonly end: number; readonly value?: string } {\n let cursor = start + 1;\n let interpolated = false;\n let text = '';\n while (cursor < source.length) {\n const char = source[cursor]!;\n if (char === '\\\\') {\n const escaped = cookEscape(source, cursor);\n text += escaped.text;\n cursor = escaped.end;\n continue;\n }\n if (char === '`') {\n return { end: cursor + 1, ...(interpolated ? {} : { value: text }) };\n }\n if (char === '$' && source[cursor + 1] === '{') {\n interpolated = true;\n cursor = skipInterpolation(source, cursor + 2);\n continue;\n }\n text += char;\n cursor++;\n }\n return { end: cursor, ...(interpolated ? {} : { value: text }) };\n}\n\n/** `${` 뒤의 보간 본문을 중괄호 균형으로 건너뛰어 닫는 `}` 다음을 돌려준다. */\nfunction skipInterpolation(source: string, start: number): number {\n let depth = 1;\n let cursor = start;\n while (cursor < source.length && depth > 0) {\n const char = source[cursor]!;\n if (char === '{') depth++;\n else if (char === '}') depth--;\n else if (char === '\\'' || char === '\"' || char === '`') {\n cursor = skipStringLike(source, cursor, char);\n continue;\n }\n // 보간 안의 주석도 중괄호 깊이에 섞이면 안 된다.\n else if (char === '/' && source[cursor + 1] === '/') {\n while (cursor < source.length && source[cursor] !== '\\n') cursor++;\n continue;\n }\n else if (char === '/' && source[cursor + 1] === '*') {\n const close = source.indexOf('*/', cursor + 2);\n cursor = close === -1 ? source.length : close + 2;\n continue;\n }\n cursor++;\n }\n return cursor;\n}\n\n/** 보간 안의 문자열 계열 리터럴을 통째로 건너뛴다. */\nfunction skipStringLike(source: string, start: number, quote: string): number {\n let cursor = start + 1;\n while (cursor < source.length) {\n const char = source[cursor]!;\n if (char === '\\\\') { cursor += 2; continue; }\n if (quote === '`' && char === '$' && source[cursor + 1] === '{') {\n cursor = skipInterpolation(source, cursor + 2);\n continue;\n }\n if (char === quote) return cursor + 1;\n cursor++;\n }\n return cursor;\n}\n\n/** 이스케이프 시퀀스 하나를 해석한다. 알 수 없는 형태는 원문 그대로 둔다. */\nfunction cookEscape(\n source: string,\n start: number,\n): { readonly end: number; readonly text: string } {\n const char = source[start + 1];\n if (char === undefined) return { end: start + 1, text: '' };\n const simple: Record<string, string> = {\n n: '\\n', r: '\\r', t: '\\t', b: '\\b', f: '\\f', v: '\\v', '0': '\\0',\n };\n const mapped = simple[char];\n if (mapped !== undefined) return { end: start + 2, text: mapped };\n if (char === 'x') {\n const digits = source.slice(start + 2, start + 4);\n if (/^[0-9A-Fa-f]{2}$/.test(digits)) {\n return { end: start + 4, text: String.fromCharCode(parseInt(digits, 16)) };\n }\n }\n if (char === 'u') {\n const braced = source[start + 2] === '{'\n ? source.slice(start + 3, source.indexOf('}', start + 3))\n : source.slice(start + 2, start + 6);\n if (/^[0-9A-Fa-f]+$/.test(braced)) {\n const code = parseInt(braced, 16);\n if (code <= 0x10FFFF) {\n return {\n end: source[start + 2] === '{'\n ? source.indexOf('}', start + 3) + 1\n : start + 6,\n text: String.fromCodePoint(code),\n };\n }\n }\n }\n // 알려지지 않은 이스케이프는 문자 그대로다(ES에서 '\\'는 사라진다).\n return { end: start + 2, text: char };\n}\n"]}