{"version":3,"file":"generator.mjs","sources":["../../src/generator/generator.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { OpenAPIV3_1 } from 'openapi-types';\n\nimport type { Assembler } from '../assemblers';\nimport type { DocumentContextFactory } from '../context';\nimport type { PostProcessor } from '../post-processor';\nimport type { PreProcessor } from '../pre-processor';\nimport type { RouteCollector } from '../routes';\nimport type { DocumentContext } from '../types';\n\nimport type { GeneratorOptions, GeneratorOutput } from './types';\n\nimport { createDebugger } from '../utils';\n\nconst debug = createDebugger('generator');\n\nexport interface OpenAPIGeneratorConfig {\n  preProcessors?: PreProcessor[];\n  assemblers?: Assembler.Document[];\n  postProcessors?: PostProcessor[];\n}\n\nexport class OpenAPIGenerator {\n  // Config\n  private readonly _assemblers: Assembler.Document[];\n\n  private readonly _preProcessors: PreProcessor[];\n\n  private readonly _postProcessors: PostProcessor[];\n\n  // Dependencies\n  private readonly _strapi: Core.Strapi;\n\n  private readonly _routeCollector: RouteCollector;\n\n  // Factories\n  private readonly _contextFactory: DocumentContextFactory;\n\n  constructor(\n    // Config\n    config: OpenAPIGeneratorConfig,\n\n    // Dependencies\n    strapi: Core.Strapi,\n    routeCollector: RouteCollector,\n\n    // Factories\n    contextFactory: DocumentContextFactory\n  ) {\n    // Config\n    this._assemblers = config.assemblers ?? [];\n    this._preProcessors = config.preProcessors ?? [];\n    this._postProcessors = config.postProcessors ?? [];\n\n    // Dependencies\n    this._strapi = strapi;\n    this._routeCollector = routeCollector;\n\n    // Factories\n    this._contextFactory = contextFactory;\n  }\n\n  generate(_options?: GeneratorOptions): GeneratorOutput {\n    debug('generating a new OpenAPI document with the following options: %O', _options);\n\n    const context = this._initContext(this._strapi);\n\n    this\n      // Init timers\n      ._bootstrap(context)\n      // Run registered pre-processors\n      ._preProcess(context)\n      // Run registered section assemblers\n      ._assemble(context)\n      // Run registered post-processors\n      ._postProcess(context)\n      // Clean up and set necessary properties\n      ._finalize(context);\n\n    const { data, stats } = context.output;\n\n    return { document: data as OpenAPIV3_1.Document, durationMs: stats.time.elapsedTime };\n  }\n\n  private _initContext(strapi: Core.Strapi): DocumentContext {\n    debug('collecting registered routes...');\n    const routes = this._routeCollector.collect();\n\n    debug('creating the initial document generation context...');\n    return this._contextFactory.create({ strapi, routes });\n  }\n\n  private _bootstrap(context: DocumentContext) {\n    const { timer } = context;\n\n    timer.reset();\n\n    const startedAt = timer.start();\n\n    debug('started generation: %o', new Date(startedAt).toISOString());\n\n    return this;\n  }\n\n  private _finalize(context: DocumentContext) {\n    const { timer, output } = context;\n\n    output.stats.time = timer.stop();\n\n    const { endTime, elapsedTime } = output.stats.time;\n\n    debug('completed generation: %O (elapsed: %Oms)', new Date(endTime).toISOString(), elapsedTime);\n\n    return this;\n  }\n\n  private _preProcess(context: DocumentContext) {\n    for (const preProcessor of this._preProcessors) {\n      debug('running pre-processor: %s...', preProcessor.constructor.name);\n\n      preProcessor.preProcess(context);\n    }\n\n    return this;\n  }\n\n  private _assemble(context: DocumentContext) {\n    for (const assembler of this._assemblers) {\n      debug('running assembler: %s...', assembler.constructor.name);\n\n      assembler.assemble(context);\n    }\n\n    return this;\n  }\n\n  private _postProcess(context: DocumentContext) {\n    for (const postProcessor of this._postProcessors) {\n      debug('running post-processor: %s...', postProcessor.constructor.name);\n\n      postProcessor.postProcess(context);\n    }\n\n    return this;\n  }\n}\n"],"names":["debug","createDebugger","OpenAPIGenerator","generate","_options","context","_initContext","_strapi","_bootstrap","_preProcess","_assemble","_postProcess","_finalize","data","stats","output","document","durationMs","time","elapsedTime","strapi","routes","_routeCollector","collect","_contextFactory","create","timer","reset","startedAt","start","Date","toISOString","stop","endTime","preProcessor","_preProcessors","name","preProcess","assembler","_assemblers","assemble","postProcessor","_postProcessors","postProcess","config","routeCollector","contextFactory","assemblers","preProcessors","postProcessors"],"mappings":"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"}