(
schema: Record<string, unknown>,
rootDefinitionNames: Iterable<string> = ["SessionEvent"]
)
| 1281 | } |
| 1282 | |
| 1283 | export function collectReachableDefinitionNames( |
| 1284 | schema: Record<string, unknown>, |
| 1285 | rootDefinitionNames: Iterable<string> = ["SessionEvent"] |
| 1286 | ): Set<string> { |
| 1287 | const definitions = collectDefinitions(schema); |
| 1288 | const reachable = new Set<string>(); |
| 1289 | const visiting = new Set<string>(); |
| 1290 | |
| 1291 | const visitDefinition = (name: string): void => { |
| 1292 | if (reachable.has(name) || visiting.has(name)) return; |
| 1293 | const definition = definitions[name]; |
| 1294 | if (definition === undefined) return; |
| 1295 | |
| 1296 | visiting.add(name); |
| 1297 | reachable.add(name); |
| 1298 | visitSchema(definition); |
| 1299 | visiting.delete(name); |
| 1300 | }; |
| 1301 | |
| 1302 | const visitSchema = (value: unknown): void => { |
| 1303 | if (!value || typeof value !== "object") return; |
| 1304 | if (Array.isArray(value)) { |
| 1305 | for (const item of value) visitSchema(item); |
| 1306 | return; |
| 1307 | } |
| 1308 | |
| 1309 | const record = value as Record<string, unknown>; |
| 1310 | if (typeof record.$ref === "string") { |
| 1311 | const localRef = parseLocalDefinitionRef(record.$ref); |
| 1312 | if (localRef) visitDefinition(localRef); |
| 1313 | } |
| 1314 | for (const child of Object.values(record)) visitSchema(child); |
| 1315 | }; |
| 1316 | |
| 1317 | for (const rootName of rootDefinitionNames) { |
| 1318 | visitDefinition(rootName); |
| 1319 | } |
| 1320 | |
| 1321 | return reachable; |
| 1322 | } |
| 1323 | |
| 1324 | export function collectSchemaReferencedDefinitionNames( |
| 1325 | schemas: Iterable<JSONSchema7 | null | undefined>, |
no test coverage detected
searching dependent graphs…