isthmus-cli 0.5.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 (146) hide show
  1. package/README.ko.md +170 -45
  2. package/README.md +178 -36
  3. package/Skills/isthmus/SKILL.md +104 -5
  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 +20 -2
  9. package/dist/cli/command-support.js +38 -9
  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/impact-command.d.ts +5 -0
  22. package/dist/cli/impact-command.js +111 -0
  23. package/dist/cli/impact-command.js.map +1 -0
  24. package/dist/cli/init-command.d.ts +11 -0
  25. package/dist/cli/init-command.js +115 -0
  26. package/dist/cli/init-command.js.map +1 -0
  27. package/dist/cli/main.js +67 -1
  28. package/dist/cli/main.js.map +1 -1
  29. package/dist/cli/mcp-server.d.ts +16 -0
  30. package/dist/cli/mcp-server.js +534 -0
  31. package/dist/cli/mcp-server.js.map +1 -0
  32. package/dist/cli/preflight-command.d.ts +5 -0
  33. package/dist/cli/preflight-command.js +83 -0
  34. package/dist/cli/preflight-command.js.map +1 -0
  35. package/dist/cli/query-command.js +13 -6
  36. package/dist/cli/query-command.js.map +1 -1
  37. package/dist/cli/retentions-command.js +14 -7
  38. package/dist/cli/retentions-command.js.map +1 -1
  39. package/dist/cli/runtime-command.d.ts +5 -0
  40. package/dist/cli/runtime-command.js +42 -0
  41. package/dist/cli/runtime-command.js.map +1 -0
  42. package/dist/cli/runtime-json-reader.d.ts +12 -0
  43. package/dist/cli/runtime-json-reader.js +37 -0
  44. package/dist/cli/runtime-json-reader.js.map +1 -0
  45. package/dist/cli/serve-command.d.ts +13 -0
  46. package/dist/cli/serve-command.js +43 -0
  47. package/dist/cli/serve-command.js.map +1 -0
  48. package/dist/exchange/capture-config.d.ts +18 -0
  49. package/dist/exchange/capture-config.js +100 -0
  50. package/dist/exchange/capture-config.js.map +1 -0
  51. package/dist/exchange/impact-selection.d.ts +13 -0
  52. package/dist/exchange/impact-selection.js +35 -0
  53. package/dist/exchange/impact-selection.js.map +1 -0
  54. package/dist/exchange/kartograph-impact.d.ts +4 -0
  55. package/dist/exchange/kartograph-impact.js +169 -0
  56. package/dist/exchange/kartograph-impact.js.map +1 -0
  57. package/dist/exchange/messages.d.ts +36 -0
  58. package/dist/exchange/messages.js +96 -0
  59. package/dist/exchange/messages.js.map +1 -0
  60. package/dist/exchange/parse.d.ts +69 -0
  61. package/dist/exchange/parse.js +127 -20
  62. package/dist/exchange/parse.js.map +1 -1
  63. package/dist/exchange/preflight-context.d.ts +71 -0
  64. package/dist/exchange/preflight-context.js +317 -0
  65. package/dist/exchange/preflight-context.js.map +1 -0
  66. package/dist/exchange/producer-impact.d.ts +17 -0
  67. package/dist/exchange/producer-impact.js +226 -0
  68. package/dist/exchange/producer-impact.js.map +1 -0
  69. package/dist/exchange/runtime.d.ts +69 -0
  70. package/dist/exchange/runtime.js +160 -0
  71. package/dist/exchange/runtime.js.map +1 -0
  72. package/dist/extract/js-document.d.ts +22 -0
  73. package/dist/extract/js-document.js +230 -0
  74. package/dist/extract/js-document.js.map +1 -0
  75. package/dist/extract/js-scan.d.ts +93 -0
  76. package/dist/extract/js-scan.js +1205 -0
  77. package/dist/extract/js-scan.js.map +1 -0
  78. package/dist/extract/lexer.d.ts +26 -0
  79. package/dist/extract/lexer.js +316 -0
  80. package/dist/extract/lexer.js.map +1 -0
  81. package/dist/join/join.d.ts +66 -1
  82. package/dist/join/join.js +171 -1
  83. package/dist/join/join.js.map +1 -1
  84. package/dist/join/message-address.d.ts +7 -0
  85. package/dist/join/message-address.js +37 -0
  86. package/dist/join/message-address.js.map +1 -0
  87. package/dist/join/messages.d.ts +26 -0
  88. package/dist/join/messages.js +87 -0
  89. package/dist/join/messages.js.map +1 -0
  90. package/dist/report/check-report.d.ts +20 -3
  91. package/dist/report/check-report.js +240 -8
  92. package/dist/report/check-report.js.map +1 -1
  93. package/dist/report/codequality.d.ts +45 -0
  94. package/dist/report/codequality.js +74 -0
  95. package/dist/report/codequality.js.map +1 -0
  96. package/dist/report/diff.d.ts +25 -3
  97. package/dist/report/diff.js +91 -10
  98. package/dist/report/diff.js.map +1 -1
  99. package/dist/report/graph.d.ts +10 -4
  100. package/dist/report/graph.js +60 -6
  101. package/dist/report/graph.js.map +1 -1
  102. package/dist/report/impact.d.ts +62 -0
  103. package/dist/report/impact.js +168 -0
  104. package/dist/report/impact.js.map +1 -0
  105. package/dist/report/preflight-runtime.d.ts +42 -0
  106. package/dist/report/preflight-runtime.js +193 -0
  107. package/dist/report/preflight-runtime.js.map +1 -0
  108. package/dist/report/preflight-view.d.ts +146 -0
  109. package/dist/report/preflight-view.js +216 -0
  110. package/dist/report/preflight-view.js.map +1 -0
  111. package/dist/report/preflight.d.ts +104 -0
  112. package/dist/report/preflight.js +331 -0
  113. package/dist/report/preflight.js.map +1 -0
  114. package/dist/report/query.d.ts +11 -4
  115. package/dist/report/query.js +84 -17
  116. package/dist/report/query.js.map +1 -1
  117. package/dist/report/retentions.d.ts +17 -5
  118. package/dist/report/retentions.js +85 -8
  119. package/dist/report/retentions.js.map +1 -1
  120. package/dist/report/rules.d.ts +16 -0
  121. package/dist/report/rules.js +30 -0
  122. package/dist/report/rules.js.map +1 -0
  123. package/dist/report/runtime-impact.d.ts +38 -0
  124. package/dist/report/runtime-impact.js +94 -0
  125. package/dist/report/runtime-impact.js.map +1 -0
  126. package/dist/report/runtime.d.ts +54 -0
  127. package/dist/report/runtime.js +137 -0
  128. package/dist/report/runtime.js.map +1 -0
  129. package/dist/report/sarif.d.ts +2 -8
  130. package/dist/report/sarif.js +2 -10
  131. package/dist/report/sarif.js.map +1 -1
  132. package/dist/report/sorted-json.d.ts +1 -1
  133. package/dist/report/sorted-json.js +2 -2
  134. package/dist/report/sorted-json.js.map +1 -1
  135. package/docs/BRIDGE-EVENTS.md +87 -0
  136. package/docs/BRIDGE-MESSAGES.md +117 -0
  137. package/docs/GRAPH-EXCHANGE.md +382 -0
  138. package/docs/IMPACT.md +96 -0
  139. package/docs/MCP.md +62 -0
  140. package/docs/PREFLIGHT.md +311 -0
  141. package/docs/RUNTIME.md +172 -0
  142. package/docs/TOOLCHAIN.md +101 -0
  143. package/package.json +14 -2
  144. package/scripts/build-preflight-toolchain.mjs +186 -0
  145. package/scripts/capture-preflight.mjs +380 -0
  146. package/scripts/run-child.mjs +17 -0
@@ -3,6 +3,9 @@ export const MAX_LIMITATION_SCOPES = 1_000;
3
3
  export const MAX_SCOPED_CHANNELS = 10_000;
4
4
  /** 한 생산 문서가 담을 수 있는 최대 사실 수다. */
5
5
  export const MAX_FACTS_PER_DOCUMENT = 100_000;
6
+ /** handler 분기 근거의 원시 상한이다. */
7
+ export const MAX_SCOPE_DEPENDENCIES_PER_FACT = 10_000;
8
+ export const MAX_SCOPE_DEPENDENCIES_PER_DOCUMENT = 1_000_000;
6
9
  /** 외부 교환 문서가 v1 계약을 어겼음을 나타낸다. */
7
10
  export class BridgeFactsValidationError extends Error {
8
11
  /** 입력 내용을 노출하지 않는 안전한 메시지를 보존한다. */
@@ -59,6 +62,8 @@ function normalizeFact(fact) {
59
62
  kind: fact.kind,
60
63
  channel: fact.channel,
61
64
  ...(fact.method === undefined ? {} : { method: fact.method }),
65
+ ...(fact.mechanism === undefined ? {} : { mechanism: fact.mechanism }),
66
+ ...(fact.optional === undefined ? {} : { optional: fact.optional }),
62
67
  dynamic: fact.dynamic,
63
68
  location: {
64
69
  path: fact.location.path,
@@ -67,6 +72,7 @@ function normalizeFact(fact) {
67
72
  },
68
73
  ...symbol,
69
74
  ...(fact.sourceLanguage === undefined ? {} : { sourceLanguage: fact.sourceLanguage }),
75
+ ...(fact.handlerScope === undefined ? {} : normalizeScopeEvidence(fact.handlerScope, fact.dependencies ?? [])),
70
76
  };
71
77
  }
72
78
  /** 문서 수준 필드가 v1 타입과 허용값을 따르는지 검증한다. */
@@ -86,10 +92,21 @@ function validateDocumentMetadata(document) {
86
92
  if (document.facts.length > MAX_FACTS_PER_DOCUMENT) {
87
93
  fail(`Facts exceed the ${MAX_FACTS_PER_DOCUMENT} item limit.`);
88
94
  }
89
- document.facts.forEach((fact, index) => validateFact(fact, index, document.platform));
95
+ let scopeDependencies = 0;
96
+ const consumeScopeDependencies = (count) => {
97
+ scopeDependencies += count;
98
+ if (scopeDependencies > MAX_SCOPE_DEPENDENCIES_PER_DOCUMENT) {
99
+ fail('Scope dependency budget exceeded.');
100
+ }
101
+ };
102
+ document.facts.forEach((fact, index) => validateFact(fact, index, document.platform, consumeScopeDependencies));
90
103
  if ((document.target === null) !== (document.facts.length === 0)) {
91
104
  fail('Target must be set exactly when facts are present.');
92
105
  }
106
+ const mechanismIndex = document.facts.findIndex((fact) => isJsonObject(fact) && fact.mechanism !== undefined);
107
+ if (document.target !== 'react-native' && mechanismIndex >= 0) {
108
+ fail(`Mechanism requires the react-native target at fact index ${mechanismIndex}.`);
109
+ }
93
110
  if (!isStringArray(document.limitations))
94
111
  fail('Limitations must be strings.');
95
112
  validateLimitationScopes(document.limitationScopes, document.limitations.length);
@@ -127,14 +144,11 @@ function validateLimitationScopes(value, limitationCount) {
127
144
  }
128
145
  }
129
146
  /** 사실 하나의 조인 키와 증거 필드를 검증한다. */
130
- function validateFact(value, index, platform) {
147
+ function validateFact(value, index, platform, consumeScopeDependencies) {
131
148
  if (!isJsonObject(value))
132
149
  fail(`Fact at index ${index} must be a JSON object.`);
133
150
  if (!bridgeFactKinds.has(value.kind))
134
151
  fail(`Invalid fact kind at index ${index}.`);
135
- if (!supportedBridgeFactKinds.has(value.kind)) {
136
- fail(`Fact kind is reserved but not supported by this isthmus version at index ${index}.`);
137
- }
138
152
  if (!isFactKindForPlatform(platform, value.kind)) {
139
153
  fail(`Fact kind is not valid for platform at index ${index}.`);
140
154
  }
@@ -149,15 +163,98 @@ function validateFact(value, index, platform) {
149
163
  if (methodFactKinds.has(value.kind) && !isSafeNonEmptyString(value.method)) {
150
164
  fail(`Method fact at index ${index} requires a method name.`);
151
165
  }
166
+ if (value.mechanism !== undefined &&
167
+ (!mechanismFactKinds.has(value.kind) || !bridgeMechanisms.has(value.mechanism))) {
168
+ fail(`Invalid fact mechanism at index ${index}.`);
169
+ }
170
+ // optional은 존재 자체가 증거인 표식이다 — `false`도 허용 값이 아니다.
171
+ if (value.optional !== undefined &&
172
+ (value.kind !== 'module-import' || value.optional !== true)) {
173
+ fail(`Invalid fact optional flag at index ${index}.`);
174
+ }
152
175
  if (typeof value.dynamic !== 'boolean')
153
176
  fail(`Invalid dynamic flag at index ${index}.`);
154
177
  validateLocation(value.location, index);
155
178
  validateSymbol(value.symbol, index);
156
- if (value.sourceLanguage !== undefined && (value.sourceLanguage !== 'objective-c' || platform !== 'swift' ||
157
- !/\.(?:m|mm)$/u.test(value.location.path) ||
158
- (value.symbol !== undefined && value.symbol.usr !== undefined &&
159
- !value.symbol.usr?.startsWith('c:'))))
160
- fail(`Invalid source language at index ${index}.`);
179
+ validateSourceLanguage(value.sourceLanguage, platform, value.location, value.symbol, index);
180
+ if (value.handlerScope !== undefined || value.dependencies !== undefined) {
181
+ if (value.kind !== 'method-handle' || value.sourceLanguage !== undefined) {
182
+ fail(`Scope evidence requires a native method handler at index ${index}.`);
183
+ }
184
+ validateScopeEvidence(value, value.location, value.symbol, index, consumeScopeDependencies);
185
+ }
186
+ }
187
+ /**
188
+ * v1 `method-handle`과 v2 handler 사실이 공유하는 분기 근거 필드를 검증한다.
189
+ *
190
+ * `handlerScope`는 감싸는 핸들러 선언 안에서 이 사실로 귀속한 분기 범위고,
191
+ * `dependencies`의 `scope`가 그 안(`handler`)인지 공유 부분(`registration`)인지
192
+ * 구분한다. 두 필드는 함께만 올 수 있다.
193
+ */
194
+ export function validateScopeEvidence(fact, location, symbol, index, consumeScopeDependencies) {
195
+ if (!isJsonObject(fact.handlerScope))
196
+ fail(`Invalid handler scope at index ${index}.`);
197
+ validateLocation(fact.handlerScope.start, index);
198
+ validateLocation(fact.handlerScope.end, index);
199
+ const start = fact.handlerScope.start;
200
+ const end = fact.handlerScope.end;
201
+ if (typeof fact.handlerScope.complete !== 'boolean' || start.path !== location.path ||
202
+ end.path !== location.path || comparePositions(start, end) > 0 ||
203
+ (fact.handlerScope.complete === true && symbol?.usr === undefined)) {
204
+ fail(`Invalid handler scope at index ${index}.`);
205
+ }
206
+ if (!Array.isArray(fact.dependencies) || fact.dependencies.length > MAX_SCOPE_DEPENDENCIES_PER_FACT) {
207
+ fail(`Invalid handler dependencies at index ${index}.`);
208
+ }
209
+ consumeScopeDependencies(fact.dependencies.length);
210
+ for (const input of fact.dependencies) {
211
+ if (!isJsonObject(input) ||
212
+ (input.kind !== 'call' && input.kind !== 'reference') ||
213
+ (input.scope !== 'handler' && input.scope !== 'registration')) {
214
+ fail(`Invalid handler dependency at index ${index}.`);
215
+ }
216
+ validateLocation(input.location, index);
217
+ const at = input.location;
218
+ const inside = comparePositions(start, at) <= 0 && comparePositions(at, end) <= 0;
219
+ if (at.path !== location.path || inside !== (input.scope === 'handler')) {
220
+ fail(`Handler dependency is outside its declared scope at index ${index}.`);
221
+ }
222
+ validateIndexedSymbol(input.symbol, index);
223
+ if (input.dispatchTargets !== undefined) {
224
+ if (!Array.isArray(input.dispatchTargets) || input.dispatchTargets.length > MAX_SCOPE_DEPENDENCIES_PER_FACT) {
225
+ fail(`Invalid handler dispatch targets at index ${index}.`);
226
+ }
227
+ consumeScopeDependencies(input.dispatchTargets.length);
228
+ for (const target of input.dispatchTargets)
229
+ validateIndexedSymbol(target, index);
230
+ }
231
+ }
232
+ }
233
+ /** 분기 근거 의존의 대상은 인덱스로 확인된 심볼이라 USR이 필수다. */
234
+ function validateIndexedSymbol(value, index) {
235
+ if (!isJsonObject(value) || !isSafeNonEmptyString(value.qualifiedName) || !isSafeNonEmptyString(value.usr)) {
236
+ fail(`Invalid handler dependency symbol at index ${index}.`);
237
+ }
238
+ }
239
+ /** 검증된 분기 근거를 계약 필드만 남긴 사본으로 만든다. */
240
+ export function normalizeScopeEvidence(handlerScope, dependencies) {
241
+ const copy = (at) => ({ path: at.path, line: at.line, column: at.column });
242
+ return {
243
+ handlerScope: { start: copy(handlerScope.start), end: copy(handlerScope.end), complete: handlerScope.complete },
244
+ dependencies: dependencies.map((dependency) => ({
245
+ kind: dependency.kind, scope: dependency.scope, location: copy(dependency.location),
246
+ symbol: { qualifiedName: dependency.symbol.qualifiedName, usr: dependency.symbol.usr },
247
+ ...(dependency.dispatchTargets === undefined ? {} : {
248
+ dispatchTargets: dependency.dispatchTargets.map((target) => ({
249
+ qualifiedName: target.qualifiedName, usr: target.usr,
250
+ })),
251
+ }),
252
+ })),
253
+ };
254
+ }
255
+ /** 같은 파일 안의 두 위치를 줄·열 순으로 비교한다. */
256
+ function comparePositions(left, right) {
257
+ return left.line - right.line || left.column - right.column;
161
258
  }
162
259
  /** 호출 측과 수신 측 플랫폼이 생산할 수 있는 fact 종류인지 확인한다. */
163
260
  function isFactKindForPlatform(platform, kind) {
@@ -190,7 +287,7 @@ function hasUnpairedSurrogate(value) {
190
287
  return value.toWellFormed() !== value;
191
288
  }
192
289
  /** 사실 위치가 상대 경로와 1부터 시작하는 줄·열을 갖는지 검증한다. */
193
- function validateLocation(value, index) {
290
+ export function validateLocation(value, index) {
194
291
  if (!isJsonObject(value) ||
195
292
  !isProjectRelativePath(value.path) ||
196
293
  !isPositiveInteger(value.line) ||
@@ -199,7 +296,7 @@ function validateLocation(value, index) {
199
296
  }
200
297
  }
201
298
  /** 절대·상위 경로와 제어 문자를 제외한 프로젝트 상대 경로인지 확인한다. */
202
- function isProjectRelativePath(value) {
299
+ export function isProjectRelativePath(value) {
203
300
  if (!isNonEmptyString(value))
204
301
  return false;
205
302
  if (/^(?:[/\\]|[A-Za-z]:)/u.test(value))
@@ -210,7 +307,7 @@ function isProjectRelativePath(value) {
210
307
  return !value.split(/[/\\]/u).includes('..');
211
308
  }
212
309
  /** 선택 symbol의 이름과 USR이 비어 있지 않은지 검증한다. */
213
- function validateSymbol(value, index) {
310
+ export function validateSymbol(value, index) {
214
311
  if (value === undefined)
215
312
  return;
216
313
  if (!isJsonObject(value) ||
@@ -219,6 +316,14 @@ function validateSymbol(value, index) {
219
316
  fail(`Invalid fact symbol at index ${index}.`);
220
317
  }
221
318
  }
319
+ /** 교환 계약별 파서가 Objective-C 출처·경로·실제 Clang 신원 규칙을 공유한다. */
320
+ export function validateSourceLanguage(value, platform, location, symbol, index) {
321
+ if (value !== undefined && (value !== 'objective-c' || platform !== 'swift' ||
322
+ !/\.(?:m|mm)$/u.test(location.path) ||
323
+ (symbol?.usr !== undefined && !symbol.usr.startsWith('c:')))) {
324
+ fail(`Invalid source language at index ${index}.`);
325
+ }
326
+ }
222
327
  /** 생산 도구 이름과 버전이 비어 있지 않은지 검증한다. */
223
328
  function validateTool(value) {
224
329
  if (!isJsonObject(value) ||
@@ -291,13 +396,6 @@ const bridgeFactKinds = new Set([
291
396
  'component-export',
292
397
  'component-require',
293
398
  ]);
294
- /** 0.1 조인과 보고가 실제로 처리하는 사실 종류다. */
295
- const supportedBridgeFactKinds = new Set([
296
- 'channel-create',
297
- 'channel-register',
298
- 'method-invoke',
299
- 'method-handle',
300
- ]);
301
399
  const callerFactKinds = new Set([
302
400
  'channel-create',
303
401
  'method-invoke',
@@ -312,6 +410,15 @@ const receiverFactKinds = new Set([
312
410
  ]);
313
411
  /** method 필드가 필수인 사실 종류다. */
314
412
  const methodFactKinds = new Set(['method-invoke', 'method-handle']);
413
+ /** mechanism 필드가 허용되는 이름 경계 사실 종류다. */
414
+ const mechanismFactKinds = new Set([
415
+ 'module-import',
416
+ 'module-export',
417
+ 'component-require',
418
+ 'component-export',
419
+ ]);
420
+ /** mechanism 필드의 허용 값이다. 생략은 `core`로 읽는다. */
421
+ const bridgeMechanisms = new Set(['core', 'expo']);
315
422
  const timestampPattern = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/u;
316
423
  const controlCharacterPattern = /[\u0000-\u001f\u007f-\u009f\u2028\u2029]/u;
317
424
  /** 배열과 null을 제외한 JSON 객체인지 확인한다. isthmus 소유 문서 검증도 재사용한다. */
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/exchange/parse.ts"],"names":[],"mappings":"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","sourcesContent":["/** bridge-facts 생산 플랫폼이다. */\nexport type BridgePlatform = 'dart' | 'swift' | 'kotlin' | 'js';\n\n/** 언어 경계를 잇는 메커니즘이다. */\nexport type BridgeTarget = 'flutter' | 'react-native' | 'capacitor';\n\n/** Swift 플랫폼 문서에 실린 Objective-C 구현을 Swift 보존 대상과 구분한다. */\nexport type BridgeSourceLanguage = 'objective-c';\n\n/** 특정 한계 전체의 영향을 포함하는 채널 집합. 일부 발견 목록이 아니다. */\nexport interface BridgeLimitationScope {\n readonly limitationIndex: number;\n readonly channels: readonly string[];\n}\n\n/** 확장 메타데이터가 입력 자원 상한을 우회하지 못하게 한다. */\nexport const MAX_LIMITATION_SCOPES = 1_000;\nexport const MAX_SCOPED_CHANNELS = 10_000;\n\n/** 교환 형식의 사실 종류다. */\nexport type BridgeFactKind =\n | 'channel-create'\n | 'channel-register'\n | 'method-invoke'\n | 'method-handle'\n | 'module-export'\n | 'module-import'\n | 'component-export'\n | 'component-require';\n\n/** 한 생산 문서가 담을 수 있는 최대 사실 수다. */\nexport const MAX_FACTS_PER_DOCUMENT = 100_000;\n\n/** 사실의 프로젝트 상대 소스 위치다. */\nexport interface BridgeLocation {\n readonly path: string;\n readonly line: number;\n readonly column: number;\n}\n\n/** 사실을 감싸는 언어별 선언 식별자다. */\nexport interface BridgeSymbol {\n readonly qualifiedName: string;\n readonly usr?: string;\n}\n\n/** 생산 도구 하나가 관찰한 언어 경계 사실이다. */\nexport interface BridgeFact {\n readonly kind: BridgeFactKind;\n readonly channel: string | null;\n readonly method?: string;\n readonly dynamic: boolean;\n readonly location: BridgeLocation;\n readonly symbol?: BridgeSymbol;\n readonly sourceLanguage?: BridgeSourceLanguage;\n}\n\n/** bridge-facts 버전 1 문서다. */\nexport interface BridgeFactsDocument {\n readonly format: 'bridge-facts';\n readonly version: 1;\n readonly tool: Readonly<{ name: string; version: string }>;\n readonly generatedAt: string;\n readonly platform: BridgePlatform;\n readonly target: BridgeTarget | null;\n readonly project: string;\n readonly facts: readonly BridgeFact[];\n readonly limitations: readonly string[];\n readonly limitationScopes?: readonly BridgeLimitationScope[];\n}\n\n/** 외부 교환 문서가 v1 계약을 어겼음을 나타낸다. */\nexport class BridgeFactsValidationError extends Error {\n /** 입력 내용을 노출하지 않는 안전한 메시지를 보존한다. */\n constructor(message: string) {\n super(message);\n this.name = 'BridgeFactsValidationError';\n }\n}\n\n/** 신뢰하지 않는 JSON 값을 검증된 bridge-facts v1 문서로 바꾼다. */\nexport function parseBridgeFactsDocument(input: unknown): BridgeFactsDocument {\n if (!isJsonObject(input)) {\n throw new BridgeFactsValidationError(\n 'Bridge facts must be a JSON object.',\n );\n }\n if (input.format !== 'bridge-facts') {\n throw new BridgeFactsValidationError('Expected format \"bridge-facts\".');\n }\n if (input.version !== 1) {\n throw new BridgeFactsValidationError(\n 'Unsupported bridge-facts version; expected version 1.',\n );\n }\n validateDocumentMetadata(input);\n return normalizeDocument(input);\n}\n\n/** 검증된 입력에서 v1 허용 필드만 복사해 신뢰 경계 밖 데이터를 제거한다. */\nfunction normalizeDocument(document: BridgeFactsDocument): BridgeFactsDocument {\n return {\n format: 'bridge-facts',\n version: 1,\n tool: { name: document.tool.name, version: document.tool.version },\n generatedAt: document.generatedAt,\n platform: document.platform,\n target: document.target,\n project: document.project,\n facts: document.facts.map(normalizeFact),\n limitations: [...document.limitations],\n ...(document.limitationScopes === undefined ? {} : {\n limitationScopes: document.limitationScopes.map((scope) => ({\n limitationIndex: scope.limitationIndex,\n channels: [...new Set(scope.channels)].sort(),\n })).sort((a, b) => a.limitationIndex - b.limitationIndex),\n }),\n };\n}\n\n/** 사실과 중첩 위치·심볼에서 계약 필드만 보존한다. */\nfunction normalizeFact(fact: BridgeFact): BridgeFact {\n const symbol = fact.symbol === undefined\n ? {}\n : {\n symbol: {\n qualifiedName: fact.symbol.qualifiedName,\n ...(fact.symbol.usr === undefined ? {} : { usr: fact.symbol.usr }),\n },\n };\n return {\n kind: fact.kind,\n channel: fact.channel,\n ...(fact.method === undefined ? {} : { method: fact.method }),\n dynamic: fact.dynamic,\n location: {\n path: fact.location.path,\n line: fact.location.line,\n column: fact.location.column,\n },\n ...symbol,\n ...(fact.sourceLanguage === undefined ? {} : { sourceLanguage: fact.sourceLanguage }),\n };\n}\n\n/** 문서 수준 필드가 v1 타입과 허용값을 따르는지 검증한다. */\nfunction validateDocumentMetadata(\n document: Record<string, unknown>,\n): asserts document is Record<string, unknown> & BridgeFactsDocument {\n validateTool(document.tool);\n if (!isBridgeTimestamp(document.generatedAt)) fail('Invalid generatedAt timestamp.');\n if (!bridgePlatforms.has(document.platform)) fail('Unsupported bridge platform.');\n if (document.target !== null && !bridgeTargets.has(document.target)) {\n fail('Unsupported bridge target.');\n }\n if (!isSafeNonEmptyString(document.project)) fail('Invalid project path.');\n if (!Array.isArray(document.facts)) fail('Facts must be an array.');\n if (document.facts.length > MAX_FACTS_PER_DOCUMENT) {\n fail(`Facts exceed the ${MAX_FACTS_PER_DOCUMENT} item limit.`);\n }\n document.facts.forEach((fact, index) =>\n validateFact(fact, index, document.platform),\n );\n if ((document.target === null) !== (document.facts.length === 0)) {\n fail('Target must be set exactly when facts are present.');\n }\n if (!isStringArray(document.limitations)) fail('Limitations must be strings.');\n validateLimitationScopes(document.limitationScopes, document.limitations.length);\n const hasUnattributedHandler = document.facts.some(\n (fact) =>\n isJsonObject(fact) &&\n fact.kind === 'method-handle' &&\n fact.channel === null,\n );\n if (\n hasUnattributedHandler &&\n !document.limitations.some((message) =>\n message.startsWith('unattributed-method-handles:'))\n ) {\n fail('Unattributed method handles require a limitation.');\n }\n}\n\n/** 잘못된 범위를 무시하면 거짓 error가 생기므로 입력 단계에서 명시적으로 거부한다. */\nfunction validateLimitationScopes(value: unknown, limitationCount: number): void {\n if (value === undefined) return;\n if (!Array.isArray(value) || value.length > MAX_LIMITATION_SCOPES) {\n fail('Invalid limitation scopes array.');\n }\n const indices = new Set<number>();\n let channelCount = 0;\n for (const entry of value) {\n if (!isJsonObject(entry) || !Number.isSafeInteger(entry.limitationIndex) ||\n typeof entry.limitationIndex !== 'number' || entry.limitationIndex < 0 ||\n entry.limitationIndex >= limitationCount || indices.has(entry.limitationIndex)) {\n fail('Invalid or duplicate limitation scope index.');\n }\n if (!Array.isArray(entry.channels) || entry.channels.length === 0 ||\n !entry.channels.every(isSafeNonEmptyString)) {\n fail('Limitation scope channels must be non-empty safe strings.');\n }\n channelCount += entry.channels.length;\n if (channelCount > MAX_SCOPED_CHANNELS) fail('Too many scoped channels.');\n indices.add(entry.limitationIndex);\n }\n}\n\n/** 사실 하나의 조인 키와 증거 필드를 검증한다. */\nfunction validateFact(value: unknown, index: number, platform: unknown): void {\n if (!isJsonObject(value)) fail(`Fact at index ${index} must be a JSON object.`);\n if (!bridgeFactKinds.has(value.kind)) fail(`Invalid fact kind at index ${index}.`);\n if (!supportedBridgeFactKinds.has(value.kind)) {\n fail(`Fact kind is reserved but not supported by this isthmus version at index ${index}.`);\n }\n if (!isFactKindForPlatform(platform, value.kind)) {\n fail(`Fact kind is not valid for platform at index ${index}.`);\n }\n if (!methodFactKinds.has(value.kind) && value.method !== undefined) {\n fail(`Unexpected method at index ${index}.`);\n }\n if (\n value.channel === null\n ? value.kind !== 'method-handle'\n : !isSafeNonEmptyString(value.channel)\n ) {\n fail(`Invalid fact channel at index ${index}.`);\n }\n if (methodFactKinds.has(value.kind) && !isSafeNonEmptyString(value.method)) {\n fail(`Method fact at index ${index} requires a method name.`);\n }\n if (typeof value.dynamic !== 'boolean') fail(`Invalid dynamic flag at index ${index}.`);\n validateLocation(value.location, index);\n validateSymbol(value.symbol, index);\n if (value.sourceLanguage !== undefined && (\n value.sourceLanguage !== 'objective-c' || platform !== 'swift' ||\n !/\\.(?:m|mm)$/u.test((value.location as BridgeLocation).path) ||\n (value.symbol !== undefined && (value.symbol as BridgeSymbol).usr !== undefined &&\n !(value.symbol as BridgeSymbol).usr?.startsWith('c:'))\n )) fail(`Invalid source language at index ${index}.`);\n}\n\n/** 호출 측과 수신 측 플랫폼이 생산할 수 있는 fact 종류인지 확인한다. */\nfunction isFactKindForPlatform(platform: unknown, kind: unknown): boolean {\n return isCallerPlatform(platform)\n ? callerFactKinds.has(kind)\n : receiverFactKinds.has(kind);\n}\n\n/** 브리지 호출 측 사실을 생산하는 플랫폼인지 확인한다. */\nexport function isCallerPlatform(platform: unknown): platform is 'dart' | 'js' {\n return platform === 'dart' || platform === 'js';\n}\n\n/** 브리지 수신 측 사실을 생산하는 플랫폼인지 확인한다. */\nexport function isReceiverPlatform(\n platform: unknown,\n): platform is 'swift' | 'kotlin' {\n return platform === 'swift' || platform === 'kotlin';\n}\n\n/** 값이 계약이 정한 브리지 메커니즘 이름인지 확인한다. */\nexport function isBridgeTarget(value: unknown): value is BridgeTarget {\n return bridgeTargets.has(value);\n}\n\n/** 조인 키를 깨뜨리는 제어 문자가 없는 비어 있지 않은 문자열인지 확인한다. */\nexport function isSafeNonEmptyString(value: unknown): value is string {\n return isNonEmptyString(value) && !controlCharacterPattern.test(value) &&\n !hasUnpairedSurrogate(value);\n}\n\n/** 유효한 UTF-16 문자열인지, 즉 짝 없는 서러게이트가 없는지 확인한다. */\nfunction hasUnpairedSurrogate(value: string): boolean {\n // 아스트랄 문자(이모지 등)는 유효한 서러게이트 쌍이므로 그대로 통과한다.\n // 짝 없는 서러게이트는 어떤 인코딩의 파일에도 존재할 수 없어 JSON 이스케이프로만\n // 들어오며, URI 인코딩이 실패하는 등 소비 경로마다 깨진다.\n return value.toWellFormed() !== value;\n}\n\n/** 사실 위치가 상대 경로와 1부터 시작하는 줄·열을 갖는지 검증한다. */\nfunction validateLocation(value: unknown, index: number): void {\n if (\n !isJsonObject(value) ||\n !isProjectRelativePath(value.path) ||\n !isPositiveInteger(value.line) ||\n !isPositiveInteger(value.column)\n ) {\n fail(`Invalid fact location at index ${index}.`);\n }\n}\n\n/** 절대·상위 경로와 제어 문자를 제외한 프로젝트 상대 경로인지 확인한다. */\nfunction isProjectRelativePath(value: unknown): value is string {\n if (!isNonEmptyString(value)) return false;\n if (/^(?:[/\\\\]|[A-Za-z]:)/u.test(value)) return false;\n if (controlCharacterPattern.test(value) || hasUnpairedSurrogate(value)) {\n return false;\n }\n return !value.split(/[/\\\\]/u).includes('..');\n}\n\n/** 선택 symbol의 이름과 USR이 비어 있지 않은지 검증한다. */\nfunction validateSymbol(value: unknown, index: number): void {\n if (value === undefined) return;\n if (\n !isJsonObject(value) ||\n !isSafeNonEmptyString(value.qualifiedName) ||\n (value.usr !== undefined && !isSafeNonEmptyString(value.usr))\n ) {\n fail(`Invalid fact symbol at index ${index}.`);\n }\n}\n\n/** 생산 도구 이름과 버전이 비어 있지 않은지 검증한다. */\nfunction validateTool(value: unknown): void {\n if (\n !isJsonObject(value) ||\n !isSafeNonEmptyString(value.name) ||\n !isSafeNonEmptyString(value.version)\n ) {\n fail('Invalid tool metadata.');\n }\n}\n\n/** ISO 계열 생성 시각으로 해석할 수 있는지 확인한다. */\nexport function isBridgeTimestamp(value: unknown): value is string {\n if (typeof value !== 'string') return false;\n const match = timestampPattern.exec(value);\n if (match === null || Number.isNaN(Date.parse(value))) return false;\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n const hour = Number(match[4]);\n const minute = Number(match[5]);\n const second = Number(match[6]);\n return (\n month >= 1 &&\n month <= 12 &&\n day >= 1 &&\n day <= daysInMonth(year, month) &&\n hour <= 23 &&\n minute <= 59 &&\n second <= 59\n );\n}\n\n/** 윤년을 포함한 주어진 달의 실제 일수를 반환한다. */\nfunction daysInMonth(year: number, month: number): number {\n if (month === 2) {\n const isLeapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n return isLeapYear ? 29 : 28;\n }\n return [4, 6, 9, 11].includes(month) ? 30 : 31;\n}\n\n/** 공백만 있지 않은 문자열인지 확인한다. */\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n/** 모든 원소가 문자열인 배열인지 확인한다. */\nfunction isStringArray(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((item) => typeof item === 'string');\n}\n\n/** 1부터 시작하는 정수인지 확인한다. */\nfunction isPositiveInteger(value: unknown): value is number {\n return Number.isSafeInteger(value) && Number(value) >= 1;\n}\n\n/** 입력 값을 포함하지 않는 검증 오류를 던진다. */\nfunction fail(message: string): never {\n throw new BridgeFactsValidationError(message);\n}\n\n/** 지원하는 생산 플랫폼 집합이다. */\nconst bridgePlatforms = new Set<unknown>(['dart', 'swift', 'kotlin', 'js']);\n\n/** 지원하는 브리지 메커니즘 집합이다. */\nconst bridgeTargets = new Set<unknown>([\n 'flutter',\n 'react-native',\n 'capacitor',\n]);\n\n/** 버전 1이 정의한 사실 종류 집합이다. */\nconst bridgeFactKinds = new Set<unknown>([\n 'channel-create',\n 'channel-register',\n 'method-invoke',\n 'method-handle',\n 'module-export',\n 'module-import',\n 'component-export',\n 'component-require',\n]);\n\n/** 0.1 조인과 보고가 실제로 처리하는 사실 종류다. */\nconst supportedBridgeFactKinds = new Set<unknown>([\n 'channel-create',\n 'channel-register',\n 'method-invoke',\n 'method-handle',\n]);\n\nconst callerFactKinds = new Set<unknown>([\n 'channel-create',\n 'method-invoke',\n 'module-import',\n 'component-require',\n]);\nconst receiverFactKinds = new Set<unknown>([\n 'channel-register',\n 'method-handle',\n 'module-export',\n 'component-export',\n]);\n\n/** method 필드가 필수인 사실 종류다. */\nconst methodFactKinds = new Set<unknown>(['method-invoke', 'method-handle']);\n\nconst timestampPattern =\n /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$/u;\nconst controlCharacterPattern = /[\\u0000-\\u001f\\u007f-\\u009f\\u2028\\u2029]/u;\n\n/** 배열과 null을 제외한 JSON 객체인지 확인한다. isthmus 소유 문서 검증도 재사용한다. */\nexport function isJsonObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"]}
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/exchange/parse.ts"],"names":[],"mappings":"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","sourcesContent":["/** bridge-facts 생산 플랫폼이다. */\nexport type BridgePlatform = 'dart' | 'swift' | 'kotlin' | 'js';\n\n/** 언어 경계를 잇는 메커니즘이다. */\nexport type BridgeTarget = 'flutter' | 'react-native' | 'capacitor';\n\n/**\n * 같은 target 안에서 사실이 통과하는 구체적인 해석 경로다.\n *\n * `react-native` 문서 안에서 코어 RN 경로와 Expo Modules 경로가 공존한다.\n * 생략된 사실은 `core`로 읽는다 — v1 이전 문서가 모두 코어 RN만 기술했기\n * 때문이다. 이 필드는 이름 경계 사실 네 종류에만 허용된다.\n */\nexport type BridgeMechanism = 'core' | 'expo';\n\n/** Swift 플랫폼 문서에 실린 Objective-C 구현을 Swift 보존 대상과 구분한다. */\nexport type BridgeSourceLanguage = 'objective-c';\n\n/** 특정 한계 전체의 영향을 포함하는 채널 집합. 일부 발견 목록이 아니다. */\nexport interface BridgeLimitationScope {\n readonly limitationIndex: number;\n readonly channels: readonly string[];\n}\n\n/** 확장 메타데이터가 입력 자원 상한을 우회하지 못하게 한다. */\nexport const MAX_LIMITATION_SCOPES = 1_000;\nexport const MAX_SCOPED_CHANNELS = 10_000;\n\n/** 교환 형식의 사실 종류다. */\nexport type BridgeFactKind =\n | 'channel-create'\n | 'channel-register'\n | 'method-invoke'\n | 'method-handle'\n | 'module-export'\n | 'module-import'\n | 'component-export'\n | 'component-require';\n\n/** 한 생산 문서가 담을 수 있는 최대 사실 수다. */\nexport const MAX_FACTS_PER_DOCUMENT = 100_000;\n\n/** 사실의 프로젝트 상대 소스 위치다. */\nexport interface BridgeLocation {\n readonly path: string;\n readonly line: number;\n readonly column: number;\n}\n\n/** 사실을 감싸는 언어별 선언 식별자다. */\nexport interface BridgeSymbol {\n readonly qualifiedName: string;\n readonly usr?: string;\n}\n\n/** producer가 관찰한 사용 관계를 귀속한 실제 native handler 분기 범위다. */\nexport interface BridgeHandlerScope {\n readonly start: BridgeLocation;\n readonly end: BridgeLocation;\n readonly complete: boolean;\n}\n\n/** 실제 참조 위치와 대상, index의 overrides로 확인한 dispatch 후보를 보존한다. */\nexport interface BridgeHandlerDependency {\n readonly kind: 'call' | 'reference';\n readonly scope: 'handler' | 'registration';\n readonly location: BridgeLocation;\n readonly symbol: BridgeSymbol & { readonly usr: string };\n readonly dispatchTargets?: readonly (BridgeSymbol & { readonly usr: string })[];\n}\n\n/** handler 분기 근거의 원시 상한이다. */\nexport const MAX_SCOPE_DEPENDENCIES_PER_FACT = 10_000;\nexport const MAX_SCOPE_DEPENDENCIES_PER_DOCUMENT = 1_000_000;\n\n/** 생산 도구 하나가 관찰한 언어 경계 사실이다. */\nexport interface BridgeFact {\n readonly kind: BridgeFactKind;\n readonly channel: string | null;\n readonly method?: string;\n /**\n * `react-native` target의 이름 경계 사실이 속한 해석 경로다.\n *\n * 생략은 `core`다. Expo의 `requireNativeModule`은 TurboModule 폴백이\n * 있어 호출 측 `expo`가 양쪽 mechanism의 export와 조인되지만,\n * `requireNativeViewManager`에는 그런 폴백이 없다 — 조인 규칙은\n * GRAPH-EXCHANGE.md가 정한다.\n */\n readonly mechanism?: BridgeMechanism;\n /**\n * 호출 측 API가 모듈 부재를 허용한다는 증거다.\n *\n * `requireOptionalNativeModule`·`TurboModuleRegistry.get` 계열은 부재 시\n * 던지지 않고 `null`을 돌려주므로, 이 표시가 있는 `module-import`의 미수출은\n * 크래시가 아니라 호출자가 감당하는 관찰이다. `module-import`에만 올 수 있다.\n */\n readonly optional?: boolean;\n readonly dynamic: boolean;\n readonly location: BridgeLocation;\n readonly symbol?: BridgeSymbol;\n readonly sourceLanguage?: BridgeSourceLanguage;\n readonly handlerScope?: BridgeHandlerScope;\n readonly dependencies?: readonly BridgeHandlerDependency[];\n}\n\n/** bridge-facts 버전 1 문서다. */\nexport interface BridgeFactsDocument {\n readonly format: 'bridge-facts';\n readonly version: 1;\n readonly tool: Readonly<{ name: string; version: string }>;\n readonly generatedAt: string;\n readonly platform: BridgePlatform;\n readonly target: BridgeTarget | null;\n readonly project: string;\n readonly facts: readonly BridgeFact[];\n readonly limitations: readonly string[];\n readonly limitationScopes?: readonly BridgeLimitationScope[];\n}\n\n/** 외부 교환 문서가 v1 계약을 어겼음을 나타낸다. */\nexport class BridgeFactsValidationError extends Error {\n /** 입력 내용을 노출하지 않는 안전한 메시지를 보존한다. */\n constructor(message: string) {\n super(message);\n this.name = 'BridgeFactsValidationError';\n }\n}\n\n/** 신뢰하지 않는 JSON 값을 검증된 bridge-facts v1 문서로 바꾼다. */\nexport function parseBridgeFactsDocument(input: unknown): BridgeFactsDocument {\n if (!isJsonObject(input)) {\n throw new BridgeFactsValidationError(\n 'Bridge facts must be a JSON object.',\n );\n }\n if (input.format !== 'bridge-facts') {\n throw new BridgeFactsValidationError('Expected format \"bridge-facts\".');\n }\n if (input.version !== 1) {\n throw new BridgeFactsValidationError(\n 'Unsupported bridge-facts version; expected version 1.',\n );\n }\n validateDocumentMetadata(input);\n return normalizeDocument(input);\n}\n\n/** 검증된 입력에서 v1 허용 필드만 복사해 신뢰 경계 밖 데이터를 제거한다. */\nfunction normalizeDocument(document: BridgeFactsDocument): BridgeFactsDocument {\n return {\n format: 'bridge-facts',\n version: 1,\n tool: { name: document.tool.name, version: document.tool.version },\n generatedAt: document.generatedAt,\n platform: document.platform,\n target: document.target,\n project: document.project,\n facts: document.facts.map(normalizeFact),\n limitations: [...document.limitations],\n ...(document.limitationScopes === undefined ? {} : {\n limitationScopes: document.limitationScopes.map((scope) => ({\n limitationIndex: scope.limitationIndex,\n channels: [...new Set(scope.channels)].sort(),\n })).sort((a, b) => a.limitationIndex - b.limitationIndex),\n }),\n };\n}\n\n/** 사실과 중첩 위치·심볼에서 계약 필드만 보존한다. */\nfunction normalizeFact(fact: BridgeFact): BridgeFact {\n const symbol = fact.symbol === undefined\n ? {}\n : {\n symbol: {\n qualifiedName: fact.symbol.qualifiedName,\n ...(fact.symbol.usr === undefined ? {} : { usr: fact.symbol.usr }),\n },\n };\n return {\n kind: fact.kind,\n channel: fact.channel,\n ...(fact.method === undefined ? {} : { method: fact.method }),\n ...(fact.mechanism === undefined ? {} : { mechanism: fact.mechanism }),\n ...(fact.optional === undefined ? {} : { optional: fact.optional }),\n dynamic: fact.dynamic,\n location: {\n path: fact.location.path,\n line: fact.location.line,\n column: fact.location.column,\n },\n ...symbol,\n ...(fact.sourceLanguage === undefined ? {} : { sourceLanguage: fact.sourceLanguage }),\n ...(fact.handlerScope === undefined ? {} : normalizeScopeEvidence(fact.handlerScope, fact.dependencies ?? [])),\n };\n}\n\n/** 문서 수준 필드가 v1 타입과 허용값을 따르는지 검증한다. */\nfunction validateDocumentMetadata(\n document: Record<string, unknown>,\n): asserts document is Record<string, unknown> & BridgeFactsDocument {\n validateTool(document.tool);\n if (!isBridgeTimestamp(document.generatedAt)) fail('Invalid generatedAt timestamp.');\n if (!bridgePlatforms.has(document.platform)) fail('Unsupported bridge platform.');\n if (document.target !== null && !bridgeTargets.has(document.target)) {\n fail('Unsupported bridge target.');\n }\n if (!isSafeNonEmptyString(document.project)) fail('Invalid project path.');\n if (!Array.isArray(document.facts)) fail('Facts must be an array.');\n if (document.facts.length > MAX_FACTS_PER_DOCUMENT) {\n fail(`Facts exceed the ${MAX_FACTS_PER_DOCUMENT} item limit.`);\n }\n let scopeDependencies = 0;\n const consumeScopeDependencies = (count: number): void => {\n scopeDependencies += count;\n if (scopeDependencies > MAX_SCOPE_DEPENDENCIES_PER_DOCUMENT) {\n fail('Scope dependency budget exceeded.');\n }\n };\n document.facts.forEach((fact, index) =>\n validateFact(fact, index, document.platform, consumeScopeDependencies),\n );\n if ((document.target === null) !== (document.facts.length === 0)) {\n fail('Target must be set exactly when facts are present.');\n }\n const mechanismIndex = document.facts.findIndex(\n (fact) => isJsonObject(fact) && fact.mechanism !== undefined,\n );\n if (document.target !== 'react-native' && mechanismIndex >= 0) {\n fail(`Mechanism requires the react-native target at fact index ${mechanismIndex}.`);\n }\n if (!isStringArray(document.limitations)) fail('Limitations must be strings.');\n validateLimitationScopes(document.limitationScopes, document.limitations.length);\n const hasUnattributedHandler = document.facts.some(\n (fact) =>\n isJsonObject(fact) &&\n fact.kind === 'method-handle' &&\n fact.channel === null,\n );\n if (\n hasUnattributedHandler &&\n !document.limitations.some((message) =>\n message.startsWith('unattributed-method-handles:'))\n ) {\n fail('Unattributed method handles require a limitation.');\n }\n}\n\n/** 잘못된 범위를 무시하면 거짓 error가 생기므로 입력 단계에서 명시적으로 거부한다. */\nfunction validateLimitationScopes(value: unknown, limitationCount: number): void {\n if (value === undefined) return;\n if (!Array.isArray(value) || value.length > MAX_LIMITATION_SCOPES) {\n fail('Invalid limitation scopes array.');\n }\n const indices = new Set<number>();\n let channelCount = 0;\n for (const entry of value) {\n if (!isJsonObject(entry) || !Number.isSafeInteger(entry.limitationIndex) ||\n typeof entry.limitationIndex !== 'number' || entry.limitationIndex < 0 ||\n entry.limitationIndex >= limitationCount || indices.has(entry.limitationIndex)) {\n fail('Invalid or duplicate limitation scope index.');\n }\n if (!Array.isArray(entry.channels) || entry.channels.length === 0 ||\n !entry.channels.every(isSafeNonEmptyString)) {\n fail('Limitation scope channels must be non-empty safe strings.');\n }\n channelCount += entry.channels.length;\n if (channelCount > MAX_SCOPED_CHANNELS) fail('Too many scoped channels.');\n indices.add(entry.limitationIndex);\n }\n}\n\n/** 사실 하나의 조인 키와 증거 필드를 검증한다. */\nfunction validateFact(value: unknown, index: number, platform: unknown,\n consumeScopeDependencies: (count: number) => void): void {\n if (!isJsonObject(value)) fail(`Fact at index ${index} must be a JSON object.`);\n if (!bridgeFactKinds.has(value.kind)) fail(`Invalid fact kind at index ${index}.`);\n if (!isFactKindForPlatform(platform, value.kind)) {\n fail(`Fact kind is not valid for platform at index ${index}.`);\n }\n if (!methodFactKinds.has(value.kind) && value.method !== undefined) {\n fail(`Unexpected method at index ${index}.`);\n }\n if (\n value.channel === null\n ? value.kind !== 'method-handle'\n : !isSafeNonEmptyString(value.channel)\n ) {\n fail(`Invalid fact channel at index ${index}.`);\n }\n if (methodFactKinds.has(value.kind) && !isSafeNonEmptyString(value.method)) {\n fail(`Method fact at index ${index} requires a method name.`);\n }\n if (value.mechanism !== undefined &&\n (!mechanismFactKinds.has(value.kind) || !bridgeMechanisms.has(value.mechanism))) {\n fail(`Invalid fact mechanism at index ${index}.`);\n }\n // optional은 존재 자체가 증거인 표식이다 — `false`도 허용 값이 아니다.\n if (value.optional !== undefined &&\n (value.kind !== 'module-import' || value.optional !== true)) {\n fail(`Invalid fact optional flag at index ${index}.`);\n }\n if (typeof value.dynamic !== 'boolean') fail(`Invalid dynamic flag at index ${index}.`);\n validateLocation(value.location, index);\n validateSymbol(value.symbol, index);\n validateSourceLanguage(value.sourceLanguage, platform, value.location as BridgeLocation, value.symbol as BridgeSymbol | undefined, index);\n if (value.handlerScope !== undefined || value.dependencies !== undefined) {\n if (value.kind !== 'method-handle' || value.sourceLanguage !== undefined) {\n fail(`Scope evidence requires a native method handler at index ${index}.`);\n }\n validateScopeEvidence(value, value.location as BridgeLocation,\n value.symbol as BridgeSymbol | undefined, index, consumeScopeDependencies);\n }\n}\n\n/**\n * v1 `method-handle`과 v2 handler 사실이 공유하는 분기 근거 필드를 검증한다.\n *\n * `handlerScope`는 감싸는 핸들러 선언 안에서 이 사실로 귀속한 분기 범위고,\n * `dependencies`의 `scope`가 그 안(`handler`)인지 공유 부분(`registration`)인지\n * 구분한다. 두 필드는 함께만 올 수 있다.\n */\nexport function validateScopeEvidence(\n fact: Record<string, unknown>,\n location: BridgeLocation,\n symbol: BridgeSymbol | undefined,\n index: number,\n consumeScopeDependencies: (count: number) => void,\n): void {\n if (!isJsonObject(fact.handlerScope)) fail(`Invalid handler scope at index ${index}.`);\n validateLocation(fact.handlerScope.start, index);\n validateLocation(fact.handlerScope.end, index);\n const start = fact.handlerScope.start as BridgeLocation;\n const end = fact.handlerScope.end as BridgeLocation;\n if (typeof fact.handlerScope.complete !== 'boolean' || start.path !== location.path ||\n end.path !== location.path || comparePositions(start, end) > 0 ||\n (fact.handlerScope.complete === true && symbol?.usr === undefined)) {\n fail(`Invalid handler scope at index ${index}.`);\n }\n if (!Array.isArray(fact.dependencies) || fact.dependencies.length > MAX_SCOPE_DEPENDENCIES_PER_FACT) {\n fail(`Invalid handler dependencies at index ${index}.`);\n }\n consumeScopeDependencies(fact.dependencies.length);\n for (const input of fact.dependencies) {\n if (!isJsonObject(input) ||\n (input.kind !== 'call' && input.kind !== 'reference') ||\n (input.scope !== 'handler' && input.scope !== 'registration')) {\n fail(`Invalid handler dependency at index ${index}.`);\n }\n validateLocation(input.location, index);\n const at = input.location as BridgeLocation;\n const inside = comparePositions(start, at) <= 0 && comparePositions(at, end) <= 0;\n if (at.path !== location.path || inside !== (input.scope === 'handler')) {\n fail(`Handler dependency is outside its declared scope at index ${index}.`);\n }\n validateIndexedSymbol(input.symbol, index);\n if (input.dispatchTargets !== undefined) {\n if (!Array.isArray(input.dispatchTargets) || input.dispatchTargets.length > MAX_SCOPE_DEPENDENCIES_PER_FACT) {\n fail(`Invalid handler dispatch targets at index ${index}.`);\n }\n consumeScopeDependencies(input.dispatchTargets.length);\n for (const target of input.dispatchTargets) validateIndexedSymbol(target, index);\n }\n }\n}\n\n/** 분기 근거 의존의 대상은 인덱스로 확인된 심볼이라 USR이 필수다. */\nfunction validateIndexedSymbol(value: unknown, index: number): void {\n if (!isJsonObject(value) || !isSafeNonEmptyString(value.qualifiedName) || !isSafeNonEmptyString(value.usr)) {\n fail(`Invalid handler dependency symbol at index ${index}.`);\n }\n}\n\n/** 검증된 분기 근거를 계약 필드만 남긴 사본으로 만든다. */\nexport function normalizeScopeEvidence(\n handlerScope: BridgeHandlerScope,\n dependencies: readonly BridgeHandlerDependency[],\n): { handlerScope: BridgeHandlerScope; dependencies: BridgeHandlerDependency[] } {\n const copy = (at: BridgeLocation): BridgeLocation => ({ path: at.path, line: at.line, column: at.column });\n return {\n handlerScope: { start: copy(handlerScope.start), end: copy(handlerScope.end), complete: handlerScope.complete },\n dependencies: dependencies.map((dependency) => ({\n kind: dependency.kind, scope: dependency.scope, location: copy(dependency.location),\n symbol: { qualifiedName: dependency.symbol.qualifiedName, usr: dependency.symbol.usr },\n ...(dependency.dispatchTargets === undefined ? {} : {\n dispatchTargets: dependency.dispatchTargets.map((target) => ({\n qualifiedName: target.qualifiedName, usr: target.usr,\n })),\n }),\n })),\n };\n}\n\n/** 같은 파일 안의 두 위치를 줄·열 순으로 비교한다. */\nfunction comparePositions(left: BridgeLocation, right: BridgeLocation): number {\n return left.line - right.line || left.column - right.column;\n}\n\n/** 호출 측과 수신 측 플랫폼이 생산할 수 있는 fact 종류인지 확인한다. */\nfunction isFactKindForPlatform(platform: unknown, kind: unknown): boolean {\n return isCallerPlatform(platform)\n ? callerFactKinds.has(kind)\n : receiverFactKinds.has(kind);\n}\n\n/** 브리지 호출 측 사실을 생산하는 플랫폼인지 확인한다. */\nexport function isCallerPlatform(platform: unknown): platform is 'dart' | 'js' {\n return platform === 'dart' || platform === 'js';\n}\n\n/** 브리지 수신 측 사실을 생산하는 플랫폼인지 확인한다. */\nexport function isReceiverPlatform(\n platform: unknown,\n): platform is 'swift' | 'kotlin' {\n return platform === 'swift' || platform === 'kotlin';\n}\n\n/** 값이 계약이 정한 브리지 메커니즘 이름인지 확인한다. */\nexport function isBridgeTarget(value: unknown): value is BridgeTarget {\n return bridgeTargets.has(value);\n}\n\n/** 조인 키를 깨뜨리는 제어 문자가 없는 비어 있지 않은 문자열인지 확인한다. */\nexport function isSafeNonEmptyString(value: unknown): value is string {\n return isNonEmptyString(value) && !controlCharacterPattern.test(value) &&\n !hasUnpairedSurrogate(value);\n}\n\n/** 유효한 UTF-16 문자열인지, 즉 짝 없는 서러게이트가 없는지 확인한다. */\nfunction hasUnpairedSurrogate(value: string): boolean {\n // 아스트랄 문자(이모지 등)는 유효한 서러게이트 쌍이므로 그대로 통과한다.\n // 짝 없는 서러게이트는 어떤 인코딩의 파일에도 존재할 수 없어 JSON 이스케이프로만\n // 들어오며, URI 인코딩이 실패하는 등 소비 경로마다 깨진다.\n return value.toWellFormed() !== value;\n}\n\n/** 사실 위치가 상대 경로와 1부터 시작하는 줄·열을 갖는지 검증한다. */\nexport function validateLocation(value: unknown, index: number): void {\n if (\n !isJsonObject(value) ||\n !isProjectRelativePath(value.path) ||\n !isPositiveInteger(value.line) ||\n !isPositiveInteger(value.column)\n ) {\n fail(`Invalid fact location at index ${index}.`);\n }\n}\n\n/** 절대·상위 경로와 제어 문자를 제외한 프로젝트 상대 경로인지 확인한다. */\nexport function isProjectRelativePath(value: unknown): value is string {\n if (!isNonEmptyString(value)) return false;\n if (/^(?:[/\\\\]|[A-Za-z]:)/u.test(value)) return false;\n if (controlCharacterPattern.test(value) || hasUnpairedSurrogate(value)) {\n return false;\n }\n return !value.split(/[/\\\\]/u).includes('..');\n}\n\n/** 선택 symbol의 이름과 USR이 비어 있지 않은지 검증한다. */\nexport function validateSymbol(value: unknown, index: number): void {\n if (value === undefined) return;\n if (\n !isJsonObject(value) ||\n !isSafeNonEmptyString(value.qualifiedName) ||\n (value.usr !== undefined && !isSafeNonEmptyString(value.usr))\n ) {\n fail(`Invalid fact symbol at index ${index}.`);\n }\n}\n\n/** 교환 계약별 파서가 Objective-C 출처·경로·실제 Clang 신원 규칙을 공유한다. */\nexport function validateSourceLanguage(value: unknown, platform: unknown, location: BridgeLocation,\n symbol: BridgeSymbol | undefined, index: number): void {\n if (value !== undefined && (value !== 'objective-c' || platform !== 'swift' ||\n !/\\.(?:m|mm)$/u.test(location.path) ||\n (symbol?.usr !== undefined && !symbol.usr.startsWith('c:')))) {\n fail(`Invalid source language at index ${index}.`);\n }\n}\n\n/** 생산 도구 이름과 버전이 비어 있지 않은지 검증한다. */\nfunction validateTool(value: unknown): void {\n if (\n !isJsonObject(value) ||\n !isSafeNonEmptyString(value.name) ||\n !isSafeNonEmptyString(value.version)\n ) {\n fail('Invalid tool metadata.');\n }\n}\n\n/** ISO 계열 생성 시각으로 해석할 수 있는지 확인한다. */\nexport function isBridgeTimestamp(value: unknown): value is string {\n if (typeof value !== 'string') return false;\n const match = timestampPattern.exec(value);\n if (match === null || Number.isNaN(Date.parse(value))) return false;\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n const hour = Number(match[4]);\n const minute = Number(match[5]);\n const second = Number(match[6]);\n return (\n month >= 1 &&\n month <= 12 &&\n day >= 1 &&\n day <= daysInMonth(year, month) &&\n hour <= 23 &&\n minute <= 59 &&\n second <= 59\n );\n}\n\n/** 윤년을 포함한 주어진 달의 실제 일수를 반환한다. */\nfunction daysInMonth(year: number, month: number): number {\n if (month === 2) {\n const isLeapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n return isLeapYear ? 29 : 28;\n }\n return [4, 6, 9, 11].includes(month) ? 30 : 31;\n}\n\n/** 공백만 있지 않은 문자열인지 확인한다. */\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n/** 모든 원소가 문자열인 배열인지 확인한다. */\nfunction isStringArray(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((item) => typeof item === 'string');\n}\n\n/** 1부터 시작하는 정수인지 확인한다. */\nfunction isPositiveInteger(value: unknown): value is number {\n return Number.isSafeInteger(value) && Number(value) >= 1;\n}\n\n/** 입력 값을 포함하지 않는 검증 오류를 던진다. */\nfunction fail(message: string): never {\n throw new BridgeFactsValidationError(message);\n}\n\n/** 지원하는 생산 플랫폼 집합이다. */\nconst bridgePlatforms = new Set<unknown>(['dart', 'swift', 'kotlin', 'js']);\n\n/** 지원하는 브리지 메커니즘 집합이다. */\nconst bridgeTargets = new Set<unknown>([\n 'flutter',\n 'react-native',\n 'capacitor',\n]);\n\n/** 버전 1이 정의한 사실 종류 집합이다. */\nconst bridgeFactKinds = new Set<unknown>([\n 'channel-create',\n 'channel-register',\n 'method-invoke',\n 'method-handle',\n 'module-export',\n 'module-import',\n 'component-export',\n 'component-require',\n]);\n\nconst callerFactKinds = new Set<unknown>([\n 'channel-create',\n 'method-invoke',\n 'module-import',\n 'component-require',\n]);\nconst receiverFactKinds = new Set<unknown>([\n 'channel-register',\n 'method-handle',\n 'module-export',\n 'component-export',\n]);\n\n/** method 필드가 필수인 사실 종류다. */\nconst methodFactKinds = new Set<unknown>(['method-invoke', 'method-handle']);\n\n/** mechanism 필드가 허용되는 이름 경계 사실 종류다. */\nconst mechanismFactKinds = new Set<unknown>([\n 'module-import',\n 'module-export',\n 'component-require',\n 'component-export',\n]);\n\n/** mechanism 필드의 허용 값이다. 생략은 `core`로 읽는다. */\nconst bridgeMechanisms = new Set<unknown>(['core', 'expo']);\n\nconst timestampPattern =\n /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$/u;\nconst controlCharacterPattern = /[\\u0000-\\u001f\\u007f-\\u009f\\u2028\\u2029]/u;\n\n/** 배열과 null을 제외한 JSON 객체인지 확인한다. isthmus 소유 문서 검증도 재사용한다. */\nexport function isJsonObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"]}
@@ -0,0 +1,71 @@
1
+ import type { BridgeFactsDocument, BridgeLocation } from './parse.ts';
2
+ import type { ImpactSelection } from './impact-selection.ts';
3
+ import type { BridgeMessageDocument } from './messages.ts';
4
+ /** 영향 분석에서 사용하는, 생산자가 증명한 심볼 식별자다. */
5
+ export interface ImpactSymbol {
6
+ readonly id: string;
7
+ readonly qualifiedName: string;
8
+ readonly kind?: string;
9
+ readonly location?: Readonly<{
10
+ path: string;
11
+ line?: number;
12
+ column?: number;
13
+ }>;
14
+ }
15
+ /** 한 언어 producer가 한 선택에 대해 관찰한 영향 범위다. */
16
+ export interface LanguageImpact {
17
+ readonly id: string;
18
+ readonly platform: 'dart' | 'swift' | 'kotlin';
19
+ readonly tool: Readonly<{
20
+ name: string;
21
+ version: string;
22
+ }>;
23
+ readonly requested: ImpactSelection;
24
+ readonly trigger?: string;
25
+ readonly roots: readonly ImpactSymbol[];
26
+ readonly affected: readonly {
27
+ readonly symbol: ImpactSymbol;
28
+ readonly via: string;
29
+ readonly depth: number;
30
+ readonly relationships: readonly string[];
31
+ }[];
32
+ readonly limitations: readonly string[];
33
+ readonly truncated: boolean;
34
+ }
35
+ /** Dart fact와 query symbol을 추측 없이 연결하는 호출자 근거다. */
36
+ export interface CallerBinding {
37
+ readonly platform: 'dart';
38
+ readonly location: BridgeLocation;
39
+ readonly requested: string;
40
+ readonly symbol: ImpactSymbol;
41
+ }
42
+ /** 변경 사전 점검이 재사용할 입력·분석·호출자 근거를 묶은 문서다. */
43
+ export interface PreflightContext {
44
+ readonly format: 'isthmus-preflight-context';
45
+ readonly version: 1;
46
+ readonly project: string;
47
+ readonly revision: string;
48
+ readonly selection: Readonly<{
49
+ readonly dart?: ImpactSelection;
50
+ readonly swift?: ImpactSelection;
51
+ readonly kotlin?: ImpactSelection;
52
+ }>;
53
+ readonly bridges: readonly BridgeFactsDocument[];
54
+ readonly messages?: readonly BridgeMessageDocument[];
55
+ readonly bindings: readonly CallerBinding[];
56
+ readonly analyses: readonly LanguageImpact[];
57
+ readonly limitations: readonly string[];
58
+ }
59
+ /** preflight 입력이 계약을 어겼음을 나타내며 원문 데이터를 오류에 넣지 않는다. */
60
+ export declare class PreflightValidationError extends Error {
61
+ constructor(message: string);
62
+ }
63
+ export declare const MAX_PREFLIGHT_ANALYSES = 256;
64
+ export declare const MAX_PREFLIGHT_GRAPH_ITEMS = 50000;
65
+ export declare const MAX_PREFLIGHT_BINDINGS = 100000;
66
+ export declare const MAX_PREFLIGHT_DEPTH = 128;
67
+ export declare const MAX_PREFLIGHT_RELATIONSHIPS = 32;
68
+ /** 신뢰하지 않는 JSON을 정규화된 preflight-context v1으로 검증한다. */
69
+ export declare function parsePreflightContext(input: unknown): PreflightContext;
70
+ /** producer adapter가 만든 분석도 context parser와 같은 그래프 규칙을 사용하게 한다. */
71
+ export declare function validateLanguageImpact(input: unknown): LanguageImpact;