{"version":3,"sources":["../src/shaking-orphaned-components.ts","../src/shaking.ts","../src/utils/is-valid-method.ts"],"sourcesContent":["import * as R from 'ramda'\nimport { OpenAPIV3, OpenAPIV3_1 } from '@scalar/openapi-types'\nimport { OpenapiReferenceParser } from '@opendoc/openapi-reference-parser'\nimport { ShakingOptions } from './types/shaking-options'\n\n\nexport function openapiShakingOrphanedComponents<T extends OpenAPIV3.Document | OpenAPIV3_1.Document>(document: T, options: ShakingOptions = {}): T {\n  const dependencies = new OpenapiReferenceParser(document, options).parse()\n\n  const refs = R.unnest(Object.values(dependencies.paths || {})\n    .map((pathObj) => R.unnest(Object.values(pathObj || {})\n      .map((op) => op.dependencies)),\n    ))\n\n  const exists = refs\n    .map((ref) => ref.match(/#\\/components\\/(.+?)\\/(.+)/))\n    .filter((matched): matched is RegExpMatchArray => !!matched)\n    .map((matched) => ({\n      scopeName: matched[1],\n      componentName: matched[2],\n    }))\n\n  const isExist = (scopeName: string, componentName: string): boolean => exists.some(\n    (item) => item.scopeName === scopeName &&\n    item.componentName === componentName,\n  )\n\n  let doc = document\n\n  for (const scopeName in document.components) {\n    if (!document.components[scopeName]) continue\n\n    for (const componentName in document.components[scopeName]) {\n      if (!document.components[scopeName][componentName]) continue\n\n      if (!isExist(scopeName, componentName)) {\n        doc = R.dissocPath(['components', scopeName, componentName], doc)\n      }\n    }\n\n    if (R.isEmpty(R.path(['components', scopeName], doc))) {\n      doc = R.dissocPath(['components', scopeName], doc)\n    }\n  }\n\n  return doc\n}\n","import * as R from 'ramda'\nimport { OpenAPIV3 } from '@scalar/openapi-types'\nimport { ShakingFilter, ShakingFilterSync } from './types/shaking-filter'\nimport { isValidMethod } from './utils/is-valid-method'\nimport { openapiShakingOrphanedComponents } from './shaking-orphaned-components'\nimport { ShakingOptions } from './types/shaking-options'\n\n\nexport async function openapiShaking<T extends OpenAPIV3.Document>(document: Readonly<T>, filter: ShakingFilter, options: ShakingOptions = {}): Promise<T> {\n  let doc = document\n\n  const pairs = await Promise.all(\n    Object.entries(document.paths || {}).map(async ([path, methods]): Promise<[string, unknown] | undefined> => {\n      if (!methods) return [path, methods]\n\n      const pairs = await Promise.all(\n        Object.entries(methods || {})\n          .map(async ([method, operation]): Promise<[string, unknown] | undefined> => {\n            if (!isValidMethod(method)) return [method, operation]\n\n            if (await filter(path, method, operation as OpenAPIV3.OperationObject)) {\n              return [method, operation]\n            }\n          }),\n      )\n\n      const pairsWithoutNil = pairs.filter(R.isNotNil) as [string, unknown][]\n      if (!pairsWithoutNil.length) return undefined\n\n      return [\n        path,\n        R.fromPairs(pairsWithoutNil) as OpenAPIV3.PathItemObject,\n      ]\n    }),\n  )\n\n  const paths = R.fromPairs(pairs.filter(R.isNotNil)) as unknown as T['paths']\n\n  doc = R.assoc('paths', paths, doc) as T\n  return openapiShakingOrphanedComponents(doc, options)\n}\n\nexport function openapiShakingSync(document: Readonly<OpenAPIV3.Document>, filter: ShakingFilterSync, options: ShakingOptions = {}): OpenAPIV3.Document {\n  let doc = document\n\n  for (const path in document.paths) {\n    for (const method in document.paths[path]) {\n      if (!isValidMethod(method)) continue\n\n      const operation = R.path(['paths', path, method], document) as (OpenAPIV3.OperationObject | undefined)\n      if (!operation) continue\n\n      if (!filter(path, method, operation)) {\n        doc = R.dissocPath(['paths', path, method], doc)\n      }\n    }\n\n    if (R.isEmpty(R.path(['paths', path], doc))) {\n      doc = R.dissocPath(['paths', path], doc)\n    }\n  }\n\n  return openapiShakingOrphanedComponents(doc, options)\n}\n","import { OpenAPIV3 } from '@scalar/openapi-types'\n\n\nexport function isValidMethod(method: unknown): method is OpenAPIV3.HttpMethods {\n  if (typeof method !== 'string') return false\n  return ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace', 'connect'].includes(method)\n}\n"],"mappings":"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","names":["R","path","pairs"]}