{"version":3,"file":"watch.mjs","sources":["../../../../src/node/webpack/watch.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\nimport webpackDevMiddleware from 'webpack-dev-middleware';\nimport webpackHotMiddleware from 'webpack-hot-middleware';\nimport { webpack } from 'webpack';\nimport type { Core } from '@strapi/types';\nimport type { BuildContext } from '../create-build-context';\nimport { mergeConfigWithUserConfig, resolveDevelopmentConfig } from './config';\n\ninterface WebpackWatcher {\n  close(): Promise<void>;\n}\n\nconst watch = async (ctx: BuildContext): Promise<WebpackWatcher> => {\n  const config = await resolveDevelopmentConfig(ctx);\n  const finalConfig = await mergeConfigWithUserConfig(config, ctx);\n\n  ctx.logger.debug('Final webpack config:', os.EOL, finalConfig);\n\n  return new Promise<WebpackWatcher>((res) => {\n    const compiler = webpack(finalConfig);\n\n    const devMiddleware = webpackDevMiddleware(compiler);\n\n    const hotMiddleware = webpackHotMiddleware(compiler, {\n      log: false,\n      path: '/__webpack_hmr',\n    });\n\n    ctx.strapi.server.app.use((ctx, next) => {\n      return new Promise((resolve, reject) => {\n        hotMiddleware(ctx.req, ctx.res, (err) => {\n          if (err) reject(err);\n          else resolve(next());\n        });\n      });\n    });\n\n    ctx.strapi.server.app.use((context, next) => {\n      // wait for webpack-dev-middleware to signal that the build is ready\n      const ready = new Promise((resolve) => {\n        devMiddleware.waitUntilValid(() => {\n          resolve(true);\n        });\n      });\n      // tell webpack-dev-middleware to handle the request\n      const init = new Promise((resolve) => {\n        devMiddleware(\n          context.req,\n          {\n            // @ts-expect-error ignored\n            end(content) {\n              // eslint-disable-next-line no-param-reassign\n              context.body = content;\n              resolve(true);\n            },\n            getHeader: context.get.bind(context),\n            // @ts-expect-error ignored\n            setHeader: context.set.bind(context),\n            locals: context.state,\n          },\n          () => resolve(next())\n        );\n      });\n\n      return Promise.all([ready, init]);\n    });\n\n    const serveAdmin: Core.MiddlewareHandler = async (ctx, next) => {\n      await next();\n\n      if (devMiddleware.context.outputFileSystem.createReadStream) {\n        if (ctx.method !== 'HEAD' && ctx.method !== 'GET') {\n          return;\n        }\n\n        if (ctx.body != null || ctx.status !== 404) {\n          return;\n        }\n\n        // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\n        const filename = path.resolve(finalConfig.output?.path!, 'index.html');\n        ctx.type = 'html';\n        ctx.body = devMiddleware.context.outputFileSystem.createReadStream(filename);\n      }\n    };\n\n    ctx.strapi.server.routes([\n      {\n        method: 'GET',\n        path: `${ctx.adminPath}/:path*`,\n        handler: serveAdmin,\n        config: { auth: false },\n      },\n    ]);\n\n    devMiddleware.waitUntilValid(() => {\n      res({\n        async close() {\n          await Promise.all([\n            promisify(devMiddleware.close.bind(devMiddleware))(),\n            hotMiddleware.close(),\n            promisify(compiler.close.bind(compiler))(),\n          ]);\n        },\n      });\n    });\n  });\n};\n\nexport { watch };\nexport type { WebpackWatcher };\n"],"names":["watch","ctx","config","resolveDevelopmentConfig","finalConfig","mergeConfigWithUserConfig","logger","debug","os","EOL","Promise","res","compiler","webpack","devMiddleware","webpackDevMiddleware","hotMiddleware","webpackHotMiddleware","log","path","strapi","server","app","use","next","resolve","reject","req","err","context","ready","waitUntilValid","init","end","content","body","getHeader","get","bind","setHeader","set","locals","state","all","serveAdmin","outputFileSystem","createReadStream","method","status","filename","output","type","routes","adminPath","handler","auth","close","promisify"],"mappings":"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"}