"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _utils = require("./utils");

var _LocaleChunkAssetsStore = require("./LocaleChunkAssetsStore");

/* eslint-disable max-classes-per-file */
const pluginName = 'I18nKeysIdentifier';
/**
 * this plugin search the i18 keys and make it as I18nDependency.
 * how it works?
 *  this plugin get jsResourceI18nKeys in constructor.
 *  we walk thought the js files AST
 *      if any string literal in that AST is in jsResourceI18nKeys then  we consider that string as I18n key
 *  after the walk of AST we get some I18n keys
 *  then we make it as I18nDependency.
 */

class I18nKeysIdentifer {
  constructor({
    jsResourceI18nKeys
  }) {
    this.jsResourceI18nKeys = jsResourceI18nKeys;
    this.store = new _LocaleChunkAssetsStore.LocaleChunkAssetsStore();
  }

  apply(compiler) {
    // const { splitChunks } = compiler.options.optimization;
    // if (splitChunks) {
    //   if (splitChunks.defaultSizeTypes.includes('...')) {
    //     splitChunks.defaultSizeTypes.push(MODULE_TYPE);
    //   }
    // }
    compiler.hooks.thisCompilation.tap(pluginName, compilation => {
      this.store.updateCompilation(compilation);
      (0, _LocaleChunkAssetsStore.setLocaleChunkAssetsStore)(compilation, this.store);
    });
    compiler.hooks.normalModuleFactory.tap(pluginName, factory => {
      // handler for parser
      const handler = parser => {
        parser.hooks.program.tap(pluginName, (ast, comments) => {
          const {
            module
          } = parser.state; //

          if (!(module && /\.jsx?$/.test(module.resource))) {
            return;
          } // i18n grep proper contract regex


          let i18nKeys = (0, _utils.collectI18nKeysfromAST)(ast, this.jsResourceI18nKeys);
          i18nKeys = i18nKeys.concat( // i18n grep proper contract regex
          (0, _utils.collectI18nKeysfromComments)(comments, this.jsResourceI18nKeys));

          if (i18nKeys.length) {
            // console.log('i18nKeys.length', module.resource, i18nKeys);
            this.store.updateModuleI18nKeys(module.resource, i18nKeys);
          }
        });
      }; // this below  hook was tapped for collect I18n Key from files and add as Dependency
      // const factory = params.normalModuleFactory;


      factory.hooks.parser.for('javascript/auto').tap(pluginName, handler);
      factory.hooks.parser.for('javascript/dynamic').tap(pluginName, handler);
    });
  }

}

exports.default = I18nKeysIdentifer;