{"id":13563287,"url":"https://github.com/gwuhaolin/web-webpack-plugin","last_synced_at":"2025-04-04T18:09:27.259Z","repository":{"id":45140262,"uuid":"70217064","full_name":"gwuhaolin/web-webpack-plugin","owner":"gwuhaolin","description":"alternative for html-webpack-plugin","archived":false,"fork":false,"pushed_at":"2023-06-25T07:21:41.000Z","size":867,"stargazers_count":330,"open_issues_count":14,"forks_count":43,"subscribers_count":14,"default_branch":"master","last_synced_at":"2024-10-30T06:58:34.251Z","etag":null,"topics":["html","html-template","webpack","webpack-plugin"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gwuhaolin.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2016-10-07T05:06:15.000Z","updated_at":"2024-10-28T03:21:35.000Z","dependencies_parsed_at":"2024-01-14T04:45:56.084Z","dependency_job_id":"d2fe8234-6a4e-41a1-8440-bc8240ffed7e","html_url":"https://github.com/gwuhaolin/web-webpack-plugin","commit_stats":{"total_commits":219,"total_committers":4,"mean_commits":54.75,"dds":0.2648401826484018,"last_synced_commit":"a8db09a98fc893a803b5d807e9a3a344c8c8bbdb"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwuhaolin%2Fweb-webpack-plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwuhaolin%2Fweb-webpack-plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwuhaolin%2Fweb-webpack-plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gwuhaolin%2Fweb-webpack-plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gwuhaolin","download_url":"https://codeload.github.com/gwuhaolin/web-webpack-plugin/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247226215,"owners_count":20904465,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["html","html-template","webpack","webpack-plugin"],"created_at":"2024-08-01T13:01:17.356Z","updated_at":"2025-04-04T18:09:27.237Z","avatar_url":"https://github.com/gwuhaolin.png","language":"JavaScript","readme":"[![Npm Package](https://img.shields.io/npm/v/web-webpack-plugin.svg?style=flat-square)](https://www.npmjs.com/package/web-webpack-plugin)\n[![Build Status](https://img.shields.io/travis/gwuhaolin/web-webpack-plugin.svg?style=flat-square)](https://travis-ci.org/gwuhaolin/web-webpack-plugin)\n[![Npm Downloads](http://img.shields.io/npm/dm/web-webpack-plugin.svg?style=flat-square)](https://www.npmjs.com/package/web-webpack-plugin)\n[![Dependency Status](https://david-dm.org/gwuhaolin/web-webpack-plugin.svg?style=flat-square)](https://npmjs.org/package/web-webpack-plugin)\n\n# web-webpack-plugin\n\n### [中文文档](https://github.com/gwuhaolin/web-webpack-plugin/blob/master/readme_zh.md)\n\n---\n\n想全面学习 Webpack？试试它：\n\n\u003cp align='center'\u003e\n  \u003ca href='http://webpack.wuhaolin.cn/'\u003e\n    \u003cimg src='http://p0.meituan.net/scarlett/df16c51ffb95186df6f75d8c0e22b965842464.png' width='306px' height='411px'/\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## [在线阅读全书](http://webpack.wuhaolin.cn/)\n\nA good alternatives for [html-webpack-plugin](https://github.com/jantimon/html-webpack-plugin), can make webpack use HTML as entry and handle multi pages.\n\n# Install\n\n```bash\nnpm i web-webpack-plugin --save-dev\n```\n\n```js\nconst { WebPlugin, AutoWebPlugin } = require('web-webpack-plugin');\n```\n\n# Feature\n\n## output html file [demo](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/out-html)\n\n**webpack config**\n\n```js\nmodule.exports = {\n\tentry: {\n\t\tA: './a',\n\t\tB: './b',\n\t},\n\tplugins: [\n\t\tnew WebPlugin({\n\t\t\t// file name or full path for output file, required.\n\t\t\t// pay attention not to duplication of name,as is will cover other file\n\t\t\tfilename: 'index.html',\n\t\t\t// this html's requires entry,must be an array.dependent resource will inject into html use the order entry in array.\n\t\t\trequires: ['A', 'B'],\n\t\t}),\n\t],\n};\n```\n\nwill output an file named `index.html`,this file will auto load js file generated by webpack form entry `A` and `B`,the out html as below:\n\n**output html**\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n  \u003cmeta charset=\"UTF-8\"\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cscript src=\"A.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"B.js\"\u003e\u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n**output directory**\n\n```\n├── A.js\n├── B.js\n└── index.html\n```\n\n## use html template [demo](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/use-template)\n\n**webpack config**\n\n```js\nmodule.exports = {\n\tentry: {\n\t\tA: './a',\n\t\tB: './b',\n\t},\n\tplugins: [\n\t\tnew WebPlugin({\n\t\t\tfilename: 'index.html',\n\t\t\t// html template file path（full path relative to webpack.config.js）\n\t\t\ttemplate: './template.html',\n\t\t\trequires: ['A', 'B'],\n\t\t}),\n\t],\n};\n```\n\n**html template**\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"zh-cn\"\u003e\n\u003chead\u003e\n  \u003cmeta charset=\"UTF-8\"\u003e\n  \u003c!--load a chunk file config and output in webpack--\u003e\n  \u003cscript src=\"B\"\u003e\u003c/script\u003e\n  \u003c!--load a local reset style file direct without local var webpack--\u003e\n  \u003clink rel=\"stylesheet\" href=\"./reset.min.css?_inline\"\u003e\n  \u003c!--load a local google analyze file direct without local var webpack--\u003e\n  \u003cscript src=\"./google-analyze.js\"\u003e\u003c/script\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003c!--SCRIPT--\u003e\n\u003cfooter\u003eweb-webpack-plugin\u003c/footer\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n* use `\u003cscript src=\"B\"\u003e\u003c/script\u003e` in html template to load required entry, the `B` in `src=\"B\"` means entry name config in `webpack.config.js`\n* comment `\u003c!--SCRIPT--\u003e` means a inject position ,except for resource load by `\u003cscript src\u003e\u003c/script\u003e` left required resource config in `WebPlugin's requires option`. if there has no `\u003c!--SCRIPT--\u003e` in html template left required script will be inject ad end of `body` tag.\n\n**output html**\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"zh-cn\"\u003e\n\u003chead\u003e\n  \u003cmeta charset=\"UTF-8\"\u003e\n  \u003c!--load a chunk file config and output in webpack--\u003e\n  \u003cscript src=\"B.js\"\u003e\u003c/script\u003e\n  \u003c!--load a local reset style file direct without local var webpack--\u003e\n  \u003cstyle\u003ebody {\n    background-color: rebeccapurple;\n  }\u003c/style\u003e\n  \u003c!--load a local google analyze file direct without local var webpack--\u003e\n  \u003cscript src=\"google-analyze.js\"\u003e\u003c/script\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cscript src=\"A.js\"\u003e\u003c/script\u003e\n\u003cfooter\u003eweb-webpack-plugin\u003c/footer\u003e\n\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n## config resource attribute [demo](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/config-resource)\n\nevery resource required by html,it can config some attribute as below:\n\n* `_dist` only load in production environment\n* `_dev` only load in dev environment\n* `_inline` inline resource content info html,inline script and css\n* `_ie` resource only required IE browser,to achieve by `[if IE]\u003eresource\u003c![endif]` comment\n\nthere has two way to config resource attribute:\n\n### config in html template\n\n**webpack config**\n\n```js\nmodule.exports = {\n\tentry: {\n\t\t'ie-polyfill': './ie-polyfill',\n\t\tinline: './inline',\n\t\tdev: './dev',\n\t\tgoogleAnalytics: './google-analytics',\n\t},\n\tplugins: [\n\t\tnew WebPlugin({\n\t\t\tfilename: 'index.html',\n\t\t\ttemplate: './template.html',\n\t\t}),\n\t],\n};\n```\n\n**html template**\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"zh-cn\"\u003e\n\u003chead\u003e\n  \u003cmeta charset=\"UTF-8\"\u003e\n  \u003cscript src=\"inline?_inline\"\u003e\u003c/script\u003e\n  \u003cscript src=\"ie-polyfill?_ie\"\u003e\u003c/script\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cscript src=\"dev?_dev\"\u003e\u003c/script\u003e\n\u003c!--load a local google analyze file direct without local var webpack--\u003e\n\u003cscript async src=\"./google-analytics.js?_dist\"\u003e\u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n[output html file](https://github.com/gwuhaolin/web-webpack-plugin/blob/master/demo/config-resource/dist-template/index.html)\n\n### config in `webpack.config.js`\n\n**webpack config**\n\n```js\nmodule.exports = {\n\tplugins: [\n\t\tnew WebPlugin({\n\t\t\tfilename: 'index.html',\n\t\t\trequires: {\n\t\t\t\t'ie-polyfill': {\n\t\t\t\t\t_ie: true,\n\t\t\t\t},\n\t\t\t\tinline: {\n\t\t\t\t\t_inline: true,\n\t\t\t\t\t_dist: true,\n\t\t\t\t},\n\t\t\t\tdev: {\n\t\t\t\t\t_dev: true,\n\t\t\t\t},\n\t\t\t\t//load a local google analyze file direct without local var webpack\n\t\t\t\t'./google-analytics.js': {\n\t\t\t\t\t_dist: true,\n\t\t\t\t},\n\t\t\t},\n\t\t}),\n\t],\n};\n```\n\n[output html file](https://github.com/gwuhaolin/web-webpack-plugin/blob/master/demo/config-resource/dist-js/index.html)\n\n### inject attr for HTML tag [demo](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/config-html-attribute)\n\nother attribute in config without name start with **\\_** will be treat as attribute for HTML tag in output HTML file. e.g if a script resource with query `?crossorigin=anonymous` will lead to output HTML be `\u003cscript src=\"B.js\" crossorigin=\"anonymous\"\u003e\u003c/script\u003e`.\n\n## auto detect html entry [demo](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/auto-plugin)\n\n`AutoWebPlugin` plugin can find all page entry in an directory, then auto config an `WebPlugin` for every page to output an html file, you can use it as below:\n\n**webpack config**\n\n```js\nconst autoPlugin = new AutoWebPlugin(\n\t// the directory hold all pages\n\t'./src/pages',\n\t{\n\t\t// all props below is not required\n\n\t\t// {string,function}\n\t\t// the template file path used by all pages\n\t\t// if typeof template ===string: template config is html template file full path\n\t\t// if typeof template ===function: template config is function(pageName)=\u003enewFullPath ,ask user for detail\n\t\ttemplate: './src/template.html',\n\n\t\t// { function(pageName,templateFullPath)=\u003ehtmlString }\n\t\t// if provide AutoWebPlugin will use Compiler to compile org template file to html content before used it in WebPlugin\n\t\ttemplateCompiler: (pageName, templateFullPath) =\u003e '',\n\n\t\t// {string,function}\n\t\t// get WebPlugin template's string content, high priority than template\n\t\t// typeof===string: template config is html template file string content\n\t\t// typeof===function: template config is function,ask user for detail\n\t\ttemplateContent: `\u003c!DOCTYPE html\u003e....`,\n\n\t\t// {string,function}\n\t\t// javascript main file for current page,if it is null will use index.js in current page directory as main file\n\t\t// typeof entry===string: entry config is entry file full path\n\t\t// typeof entry===function: entry config is function(pageName)=\u003enewFullPath ,ask user for detail\n\t\tentry: null,\n\n\t\t// {function}\n\t\t// get WebPlugin output filename,default filename is pageName\n\t\t// set filename as function(pageName)=\u003efilename to add custom logic\n\t\tfilename: null,\n\n\t\t// {Array} pre append to all page's entry\n\t\tpreEntrys: ['./path/to/file1.js'],\n\n\t\t// {Array} post append to all page's entry\n\t\tpostEntrys: ['./path/to/file2.js'],\n\n\t\t// {string} publicPath for css file,for js file will use webpack.publicPath\n\t\tstylePublicPath: null,\n\n\t\t// page name list will not ignore by AutoWebPlugin(Not output html file for this page name)\n\t\tignorePages: ['pageName'],\n\n\t\t// whether output a pagemap.json file which contain all pages has been resolved with AutoWebPlugin in this way:\n\t\t// {\"page name\": \"page url\",}\n\t\toutputPagemap: true,\n\t}\n);\n\nmodule.exports = {\n\t// AutoWebPlugin will generate a entry for every page find in the directory hold all pages\n\t// autoPlugin.entry({}) used to pass entrys find by AutoWebPlugin to webpack config\n\tentry: autoPlugin.entry({\n\t\tyouAdditionalEntryName: 'you additional entry path',\n\t}),\n};\n```\n\n**src directory**\n\n```\n── src\n│   ├── home\n│   │   └── index.js\n│   ├── ie_polyfill.js\n│   ├── login\n│   │   └── index.js\n│   ├── polyfill.js\n│   ├── signup\n│   │   └── index.js\n│   └── template.html\n```\n\n**output directory**\n\n```\n├── dist\n│   ├── common.js\n│   ├── home.html\n│   ├── home.js\n│   ├── ie_polyfill.js\n│   ├── login.html\n│   ├── login.js\n│   ├── polyfill.js\n│   ├── signup.html\n│   └── signup.js\n```\n\n`AutoWebPlugin` find all page `home login signup` directory in `./src/`,for this three page `home login signup`:\n\n* will use `index.js` as main file add three chunk `home login signup`\n* output three html file `home.html login.html signup.html`\n* auto inject resource required by ever page. e.g(inject home chunk to home.html)\n\nAutoWebPlugin find all page `home login signup` in dir `./src/` then:\n\n* use index.js as entry for every page to make a chunk named `chunk home login signup`\n* output html files for every page `home.html login.html signup.html`\n* auto inject resource required by every page（e.g home.html will inject home chunk）\n\n### ignorePages attribute\n\n`ignorePages` page name list will not ignore by AutoWebPlugin(Not output html file for this page name),type is array of string.\n\n### template attribute\n\n`template` if template is a string , i will regard it as file path for html template（full path relative to webpack.config.js）\nIn the complex case,You can set the template to a function, as follows using the current page directory index.html file as the current page template file\n\n**webpack config**\n\n```js\nnew AutoWebPlugin('./src/', {\n\t// Template files used by all pages\n\ttemplate: (pageName) =\u003e {\n\t\treturn path.resolve('./src', pageName, 'index.html');\n\t},\n});\n```\n\n### entry attribute\n\nThe entry property is similar to template, and also supports callback functions for complex situations. But if the entry is empty to use the current page directory `index.jsx?` As the entrance\n\n## config publicPath [demo](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/public-path)\n\n## load css [demo](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/extract-css)\n\nThe resource for each entry may contain css code.\nIf you want to extract the css code to load alone rather than sneaking into the js where you need to load\n[extract-text-webpack-plugin](https://github.com/webpack/extract-text-webpack-plugin)\nSeparated css code, the rest of the things to me, I will automatically deal with the same as the above js css\n\n**webpack config**\n\n```js\n// webpack.config.js\nmodule.exports = {\n\tmodule: {\n\t\tloaders: [\n\t\t\t{\n\t\t\t\ttest: /\\.css$/,\n\t\t\t\tloader: ExtractTextPlugin.extract({\n\t\t\t\t\tfallbackLoader: 'style-loader',\n\t\t\t\t\tloader: 'css-loader',\n\t\t\t\t}),\n\t\t\t},\n\t\t],\n\t},\n\tentry: {\n\t\t1: './1',\n\t\t2: './2',\n\t\t3: './3',\n\t\t4: './4',\n\t},\n\tplugins: [\n\t\tnew ExtractTextPlugin('[name].css'),\n\t\tnew WebPlugin({\n\t\t\tfilename: 'index.html',\n\t\t\ttemplate: './template.html',\n\t\t\trequires: ['1', '2', '3', '4'],\n\t\t}),\n\t],\n};\n```\n\n**html template**\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"zh-cn\"\u003e\n\u003chead\u003e\n  \u003cmeta charset=\"UTF-8\"\u003e\n  \u003clink rel=\"stylesheet\" href=\"1\"\u003e\n  \u003clink rel=\"stylesheet\" href=\"2?_inline\"\u003e\n  \u003clink rel=\"stylesheet\" href=\"3?_ie\"\u003e\n  \u003cscript src=\"1\"\u003e\u003c/script\u003e\n  \u003c!--STYLE--\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cscript src=\"2\"\u003e\u003c/script\u003e\n\u003c!--SCRIPT--\u003e\n\u003cfooter\u003efooter\u003c/footer\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n**output html**\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"zh-cn\"\u003e\n\u003chead\u003e\n  \u003cmeta charset=\"UTF-8\"\u003e\n  \u003clink rel=\"stylesheet\" href=\"1.css\"\u003e\n  \u003cstyle\u003e\n  /**2.css**/\n  body {\n    background-color: rebeccapurple;\n  }\u003c/style\u003e\n  \u003c!--[if IE]\u003e\n  \u003clink rel=\"stylesheet\" href=\"3.css\"\u003e\n  \u003c![endif]--\u003e\n  \u003cscript src=\"1.js\"\u003e\u003c/script\u003e\n  \u003clink rel=\"stylesheet\" href=\"4.css\"\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cscript src=\"2.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"3.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"4.js\"\u003e\u003c/script\u003e\n\u003cfooter\u003efooter\u003c/footer\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n**output directory**\n\n```\n├── 1.css\n├── 1.js\n├── 2.css\n├── 2.js\n├── 3.css\n├── 3.js\n├── 4.css\n├── 4.js\n└── index.html\n```\n\n## minify output html [demo](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/minify-html)\n\n`WebPlugin` and `AutoWebPlugin` support `htmlMinify` options to minify output html use the following rules:\n\n* if `htmlMinify` is set - if `htmlMinify` is `true`, builtin html minify function will used to minify output html(minify HTML only，not CSS or JS) - if `htmlMinify` is `false`, builtin html pretty function will used to output human read friendly html - if `htmlMinify` is a `function`,use this function `function(orgHTMLString)=\u003eminifyHTMLString` to minify html\n* if `htmlMinify` is missing(`undefined`) - if environment is `production`, builtin html minify function will used to minify output html(minify HTML only，not CSS or JS)\n\n  * if environment is not `production`, builtin html pretty function will used to output human read friendly html\n\n# Distinguish the environment\n\nThis plugin takes into account both **development** environment and **production** environment. And only if `process.env.NODE_ENV = production` current environment is **production** environment, others are considered to be development environment.\n`webpack -p` will use DefinePlugin define `NODE_ENV=production`。\n\n# In practice\n\n* [redemo](https://github.com/gwuhaolin/redemo) elegant react demo component\n* [stickylist](https://github.com/gwuhaolin/stickylist) react sticky header listview component\n* [resume](https://github.com/gwuhaolin/resume) my resume\n* [remd](https://github.com/gwuhaolin/remd) fast react markdown component\n* [use template compiler to pre-translate template](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/use-template-complier)\n* [webpack 原理与实战](https://github.com/gwuhaolin/blog/issues/4)\n* [webpack2 终极优化](https://github.com/gwuhaolin/blog/issues/2)\n* [使用模版引擎预处理模版](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/use-template-complier)\n* [使用 HTML 模版配置资源注入到 HTML](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/use-template)\n* [给 HTML 标签注入属性](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/config-html-attribute)\n* [在 webpack 里直接通过 JS 配置资源注入到 HTML](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/config-resource)\n* [管理多个单页应用](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/auto-plugin)\n* [从 JS 中提取出 CSS](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/extract-css)\n* [直接注入本地文件](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/load-local-file)\n* [设置 PublicPath](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/public-path)\n* [编辑 HTML 模版时，监听模式下会自动编译和刷新](https://github.com/gwuhaolin/web-webpack-plugin/tree/master/demo/watch-template)\n","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgwuhaolin%2Fweb-webpack-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgwuhaolin%2Fweb-webpack-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgwuhaolin%2Fweb-webpack-plugin/lists"}