npm package: @nsmp/groovy-webpack-plugin
Description: Webpack plugin for pack groovy scripts in xml file
Author: kegorov@naumen.ru
Latest version: 3.2.1

# GroovyWebpackPlugin
GroovyWebpackPlugin - это плагин для `webpack`, который предназначен для сборки скриптовых модулей с расширением `.groovy` в один `xml` файл.

Плагин представляет собой класс GroovyWebpackPlugin, который в качестве единственного аргумента конструктора принимает объект настроек `options`:

```javascript
	/**
	 * Итоговый xml файл будет создан в директории результирующей сборки, в соответствии с вашей конфигурацией webpack.
	 *
	 * Рекомендуется назвать итоговый файл:
	 * - 'privateModules.xml', если в нём будут собраны модули, необходимые для работы с данными;
	 * - 'openModules.xml', если в нём будут собраны модули, необходимые для настройки ВП.

	 * Флаг editBySuperusers рекомендуется:
	 * - установить в false, для модулей работы с данными;
	 * - установить в true, для модулей работы с настройками.

	 * Флаг viewBySuperusers рекомендуется:
	 * - установить в true, для модулей любого вида, за исключением ситуаций, когда их нужно скрыть.
	
	 * Флаг restAllowed рекомендуется:
	 * - установить в false, для модулей работы с данными (если обращения идут через модуль настроек);
	 * - установить в true, для модулей работы с настройками.
	
	 * Массив replacers позволяет заменить какие-либо вхождения в модулях. Например, это может быть полезно для
	 * уточнения пространства имен, при выпуске версии. В таком случае настройка может выглядеть так:
	 * - replacers: [{search: 'package ru.modules.ea', replacer: 'package ru.modules.ea_v_1_0_0'}]
	 * - replacers: [{search: new RegExp('^.* ru\.*\.ea$', 'gm'), replacer: 'package ru.modules.ea_v_1_0_0',}]
	 * Если в качестве search передан string, то будет изменено первое найденное вхождение в каждом модуле.

	 * @param {Object} options - объект настройки
	 * @param {boolean} [options.editBySuperusers=false] - доступность скриптовых модулей для редактирования суперпользователем
	 * @param {string} options.output - путь до файла и его имя с расширением xml, напр.: 'privateModules.xml'
	 * @param {string[]} options.paths - массив строк, представляющих пути до директорий с модулями или пути до модулей
	 * @param {Array<{search: string|RegExp, replacer: string}>} [options.replacers=[]] - массив объектов для замены строк
	 * @param {boolean} [options.viewBySuperusers=true] - доступность скриптовых модулей для просмотра суперпользователем
	 * @param {boolean} [options.restAllowed=true] - доступность скриптовых модулей для вызова через REST
	 */
	constructor (options) {
	/* ... */
	}
``` 

## Установка:
```bash
npm i @nsmp/groovy-webpack-plugin --save-dev
```

## Использование
> Пример структуры проекта `app`
```
 ./app/
 _ _ ./dist/ 
 _ _ ./rest/ 
 _ _ _ _ ./modules/ 
 _ _ _ _ _ _ ./eaEmail.groovy 
 _ _ _ _ _ _ ./eaUtils.groovy 
 _ _ _ _ _ _ ./eaSettings.groovy 
 _ _ _ _ _ _ ./eaData/ 
 _ _ _ _ _ _ _ _ ./data1.groovy
 _ _ _ _ _ _ _ _ ./data2.groovy
 _ _ ./webpack 
 _ _ _ _ ./webpack.config.js
```

### Пример содержимого файла `./webpack.config.js`, в котором пути указаны относительно корня проекта (директории содержащей файл `.package.json`)
```js
const GroovyWebpackPlugin = require('groovy-webpack-plugin');

module.exports = {
	/* ... webpack config */
	plugins: [
		new GroovyWebpackPlugin({
			output: 'privateModules.xml',
			paths: [
				'./rest/modules/eaData/',
				'./rest/modules/eaEmail.groovy',
				'./rest/modules/eaUtils.groovy',
			],
			editBySuperusers: false 
		}),

		new GroovyWebpackPlugin({
			output: 'openModules.xml',
			paths: ['./rest/modules/eaSettings.groovy'],
			editBySuperusers: true
		})
	],
	/* ... */
}
```

### Пример содержимого файла `./webpack.config.js`, в котором пути указаны относительно директории, где вызван `GroovyWebpackPlugin`
```js
const GroovyWebpackPlugin = require('groovy-webpack-plugin');
const path = require('path');


module.exports = {
	/* ... webpack config */
	plugins: [
		new GroovyWebpackPlugin({
			editBySuperusers: false,
			output: 'privateModules.xml',
			paths: [
				path.resolve(__dirname, '../rest/modules/eaData/'),
				path.resolve(__dirname, '../rest/modules/eaEmail.groovy'),
				path.resolve(__dirname, '../rest/modules/eaUtils.groovy'),
			],
			replacers: [{search: 'package ru.modules.ea', replacer: 'package ru.modules.ea_v_1_0_0'}]
		}),
		new GroovyWebpackPlugin({
			editBySuperusers: true,
			output: 'openModules.xml',
			paths: [path.resolve(__dirname, '../rest/modules/eaSettings.groovy')],
			replacers: [{search: new RegExp('^.* ru\.*\.ea$', 'gm'), replacer: 'package ru.modules.ea_v_1_0_0'}]
		})
	],
	/* ... */
}
```

### Пример использования GWP в качестве задачи или shell-скрипта, вне контекста Webpack, относительно корня проекта `app` (если плагин установлен в качестве зависимости)

```shell script
node -e "
const GroovyWebpackPlugin = require('groovy-webpack-plugin');

new GroovyWebpackPlugin({
        editBySuperusers: true,
        output: 'privateModules.xml',
        paths: [
                './test/rest/modules/eaData/',
                './test/rest/modules/eaEmail.groovy',
                './test/rest/modules/eaUtils.groovy'
        ]
}).generateFileContent();"
```