{"version":3,"file":"beastcss-webpack-plugin.cjs","sources":["../src/Plugin.ts"],"sourcesContent":["import path from 'path';\nimport Beastcss from 'beastcss';\nimport { validate } from 'schema-utils';\nimport { Compilation, Compiler, sources } from 'webpack';\nimport HtmlWebpackPlugin from 'html-webpack-plugin';\n\nimport type { JSONSchema7 } from 'schema-utils/declarations/ValidationError';\n\nimport schema from './schema.json';\n\nexport default class BeastcssWebpackPlugin extends Beastcss {\n  private compilation!: Compilation;\n\n  private hasCustomFs = false;\n\n  private hasCustomLogger = false;\n\n  constructor(\n    options?: Partial<Omit<Beastcss.Options, 'path' | 'publicPath'>>\n  ) {\n    validate(schema as JSONSchema7, options || {}, {\n      name: BeastcssWebpackPlugin.name,\n      baseDataPath: 'options',\n    });\n\n    super(options);\n\n    if (options && options.fs) {\n      this.hasCustomFs = true;\n    }\n\n    if (options && options.logger) {\n      this.hasCustomLogger = true;\n    }\n  }\n\n  /**\n   * Apply the plugin\n   */\n  public apply(compiler: Compiler): void {\n    // if no logger option was passed, fallback to webpack infrastructure logger\n    if (!this.hasCustomLogger) {\n      const logger = compiler.getInfrastructureLogger(\n        BeastcssWebpackPlugin.name\n      );\n\n      (\n        Object.keys(this.opts.logger) as (keyof Beastcss.Options['logger'])[]\n      ).forEach((level) => {\n        this.opts.logger[level] = (msg, processId) =>\n          logger[level](`${processId ? `[${processId}] ` : ''}${msg}`);\n      });\n\n      this.setVerbosity();\n    }\n\n    this.run(compiler);\n  }\n\n  protected async getStylesheetSource(stylesheetPath: string) {\n    if (this.cachedStylesheetsSource.has(stylesheetPath)) {\n      return this.cachedStylesheetsSource.get(stylesheetPath);\n    }\n\n    const asset = this.compilation.getAsset(path.basename(stylesheetPath));\n\n    if (asset && asset.source) {\n      this.cachedStylesheetsSource.set(\n        stylesheetPath,\n        Promise.resolve({\n          content: asset.source.buffer(),\n          size: asset.source.size(),\n        })\n      );\n\n      return this.cachedStylesheetsSource.get(stylesheetPath);\n    }\n\n    return super.getStylesheetSource(stylesheetPath);\n  }\n\n  protected async getAdditionalStylesheets() {\n    const { default: micromatch } = await import('micromatch');\n\n    const additionalStylesheets: Beastcss.ExternalStylesheet[] = [];\n\n    micromatch(\n      Object.keys(this.compilation.assets),\n      this.opts.additionalStylesheets,\n      {\n        cwd: this.opts.path,\n        basename: true,\n      }\n    ).forEach((match: string) => {\n      if (this.isExcluded(match)) {\n        this.opts.logger.debug(\n          `Excluded additional stylesheet \"${match}\".`,\n          this.processId\n        );\n\n        return;\n      }\n\n      additionalStylesheets.push({\n        path: this.getStylesheetPath(match),\n        filename: path.basename(match),\n      });\n    });\n\n    additionalStylesheets.push(...(await super.getAdditionalStylesheets()));\n\n    return additionalStylesheets;\n  }\n\n  protected async updateExternalStylesheet(\n    stylesheetPath: string,\n    css: string\n  ) {\n    const filename = path.basename(stylesheetPath);\n\n    if (this.compilation.assets[filename]) {\n      this.compilation.updateAsset(filename, new sources.RawSource(css));\n    } else {\n      await super.updateExternalStylesheet(stylesheetPath, css);\n    }\n  }\n\n  protected async removeExternalStylesheet(stylesheetPath: string) {\n    const filename = path.basename(stylesheetPath);\n\n    if (this.compilation.assets[filename]) {\n      this.compilation.deleteAsset(filename);\n    } else {\n      await super.removeExternalStylesheet(stylesheetPath);\n    }\n  }\n\n  private run(compiler: Compiler) {\n    const { name } = BeastcssWebpackPlugin;\n\n    // if no fs option was passed, fallback to webpack output filesystem\n    if (!this.hasCustomFs) {\n      compiler.hooks.beforeRun.tap(name, (compilerBeforeRun) => {\n        this.fs = Beastcss.createFsAdapter(\n          compilerBeforeRun.outputFileSystem as unknown as Beastcss.FSLike\n        );\n      });\n    }\n\n    compiler.hooks.afterEmit.tap(name, () => this.clear());\n\n    compiler.hooks.thisCompilation.tap(name, (compilation) => {\n      this.compilation = compilation;\n\n      this.opts.path = compilation.outputOptions.path as string;\n\n      this.opts.publicPath = compilation.getPath(\n        compilation.outputOptions.publicPath as NonNullable<\n          Compilation['outputOptions']['publicPath']\n        >\n      );\n\n      const hasHtmlWebpackPlugin = compiler.options.plugins.some(\n        ({ constructor }) => constructor.name === HtmlWebpackPlugin.name\n      );\n\n      HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapPromise(\n        name,\n        async (htmlPluginData) => {\n          const html = await this.process(\n            htmlPluginData.html,\n            htmlPluginData.outputName\n          );\n\n          htmlPluginData.html = html;\n\n          return htmlPluginData;\n        }\n      );\n\n      compilation.hooks.processAssets.tapPromise(\n        {\n          name,\n          stage: Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE,\n        },\n        async (assets) => {\n          const htmlAssets = this.getHtmlAssets(assets);\n\n          if (htmlAssets.length === 0 && !hasHtmlWebpackPlugin) {\n            this.opts.logger.warn(\n              'Unable to find any HTML asset.',\n              this.processId\n            );\n          }\n\n          await Promise.all(\n            htmlAssets.map(async (asset) => {\n              const html = await this.process(asset.html, asset.name);\n\n              this.compilation.updateAsset(\n                asset.name,\n                new sources.RawSource(html)\n              );\n            })\n          );\n        }\n      );\n\n      if (this.opts.pruneSource) {\n        compilation.hooks.processAssets.tapPromise(\n          {\n            name,\n            stage:\n              // html-webpack-plugin uses PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE\n              Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE + 100,\n          },\n          async () => {\n            await this.pruneSources();\n          }\n        );\n      }\n    });\n  }\n\n  private getHtmlAssets(assets: Compilation['assets']) {\n    const htmlAssets: { name: string; html: string }[] = [];\n\n    Object.entries(assets).forEach(([pathname, source]) => {\n      if (pathname.match(/\\.html$/)) {\n        const html = source.source().toString();\n\n        if (html.length === 0) {\n          this.opts.logger.warn(\n            `Empty HTML asset \"${pathname}\".`,\n            this.processId\n          );\n        }\n\n        htmlAssets.push({\n          name: pathname,\n          html,\n        });\n      }\n    });\n\n    return htmlAssets;\n  }\n}\n"],"names":["validate","sources","Compilation"],"mappings":"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"}