[
  {
    "path": ".gitattributes",
    "content": "# this file has broken newlines, and we want it to stay this way\nbroken_newlines.tpl.html binary\n"
  },
  {
    "path": ".github/workflows/semgrep.yml",
    "content": "on:\n  pull_request: {}\n  push:\n    branches:\n    - main\n    - master\n    paths:\n    - .github/workflows/semgrep.yml\n  schedule:\n  - cron: '0 0 * * 0'\nname: Semgrep\njobs:\n  semgrep:\n    name: Scan\n    runs-on: ubuntu-20.04\n    env:\n      SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}\n    container:\n      image: returntocorp/semgrep\n    steps:\n    - uses: actions/checkout@v3\n    - run: semgrep ci\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\nnpm-debug.log\ntmp\ncoverage\n"
  },
  {
    "path": ".jshintrc",
    "content": "{\n  \"curly\": true,\n  \"eqeqeq\": true,\n  \"immed\": true,\n  \"latedef\": true,\n  \"newcap\": true,\n  \"noarg\": true,\n  \"sub\": true,\n  \"undef\": true,\n  \"boss\": true,\n  \"eqnull\": true,\n  \"node\": true,\n  \"es5\": true\n}\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nsudo: false\nnode_js:\n  - 10\n  - 11\n  - 12\n  - 13\n  - 14\n  - 15\ninstall:\n  - npm install\nbefore_script:\n  - npm install grunt-cli istanbul\nscript:\n  - ./node_modules/.bin/istanbul cover ./node_modules/.bin/grunt test\n  - ./node_modules/.bin/grunt coveralls\n"
  },
  {
    "path": "Gruntfile.js",
    "content": "/*\n * grunt-html2js\n * https://github.com/rquadling/grunt-html2js\n *\n * Copyright (c) 2013 Karl Goldstein\n * Copyright (c) 2017 Richard Quadling\n *\n * Licensed under the MIT license.\n */\n\n'use strict';\n\nmodule.exports = function (grunt) {\n\n  // Project configuration.\n  grunt.initConfig({\n    coveralls: {\n      // Options relevant to all targets\n      options: {\n        // When true, grunt-coveralls will only print a warning rather than\n        // an error, to prevent CI builds from failing unnecessarily (e.g. if\n        // coveralls.io is down). Optional, defaults to false.\n        force: false\n      },\n\n      html2js: {\n        // LCOV coverage file (can be string, glob or array)\n        src: 'coverage/lcov.info',\n        options: {\n          // Any options for just this target\n        }\n      }\n    },\n\n    jshint: {\n      options: {\n        jshintrc: '.jshintrc'\n      },\n      all: [\n        'Gruntfile.js',\n        'tasks/*.js',\n        '<%= nodeunit.tests %>'\n      ]\n    },\n\n    // Before generating any new files, remove any previously-created files.\n    clean: {\n      tests: ['tmp']\n    },\n\n    // Configuration to be run (and then tested).\n    // See https://github.com/gruntjs/grunt/wiki/Configuring-tasks\n    // for configuration options that need to be tested\n    html2js: {\n      amd_module: {\n        options: {\n          amd: true,\n          quoteChar: '\\''\n        },\n        src: ['test/fixtures/one.tpl.html', 'test/fixtures/two.tpl.html'],\n        dest: 'tmp/amd_module.js'\n      },\n      amd_module_custom_prefix: {\n        options: {\n          amd: true,\n          amdPrefixString: 'define([\\'ng\\'], function(angular){'\n        },\n        src: ['test/fixtures/one.tpl.html', 'test/fixtures/two.tpl.html'],\n        dest: 'tmp/amd_module_custom_prefix.js'\n      },\n      amd_module_custom_suffix: {\n        options: {\n          amd: true,\n          amdSuffixString: '}); //Custom!'\n        },\n        src: ['test/fixtures/one.tpl.html', 'test/fixtures/two.tpl.html'],\n        dest: 'tmp/amd_module_custom_suffix.js'\n      },\n      broken_newlines: {\n        src: ['test/fixtures/broken_newlines.tpl.html'],\n        dest: 'tmp/broken_newlines.js'\n      },\n      coffee: {\n        options: {\n          target: 'coffee'\n        },\n        src: ['test/fixtures/one.tpl.html', 'test/fixtures/two.tpl.html'],\n        dest: 'tmp/coffee.coffee'\n      },\n      compact_format_custom_options: {\n        options: {\n          base: 'test',\n          module: 'my-custom-template-module'\n        },\n        src: ['test/fixtures/one.tpl.html', 'test/fixtures/two.tpl.html'],\n        dest: 'tmp/compact_format_custom_options.js'\n      },\n      compact_format_default_options: {\n        src: ['test/fixtures/one.tpl.html', 'test/fixtures/two.tpl.html'],\n        dest: 'tmp/compact_format_default_options.js'\n      },\n      custom_attribute_collapsed: {\n        src: ['test/fixtures/custom_attribute_collapse.tpl.html'],\n        dest: 'tmp/custom_attribute_collapsed.js',\n        options: {\n          htmlmin: {\n            customAttrCollapse: /my-[a-z]*/\n          }\n        }\n      },\n      custom_attribute_not_collapsed: {\n        src: ['test/fixtures/custom_attribute_collapse.tpl.html'],\n        dest: 'tmp/custom_attribute_not_collapsed.js'\n      },\n      double_quotes: {\n        src: ['test/fixtures/four.tpl.html'],\n        dest: 'tmp/double_quotes.js'\n      },\n      empty_attribute: {\n        src: ['test/fixtures/empty_attribute.tpl.html'],\n        dest: 'tmp/empty_attribute.js'\n      },\n      empty_module: {\n        src: [],\n        dest: 'tmp/empty_module.js'\n      },\n      existing_module: {\n        options: {\n          singleModule: true,\n          existingModule: true\n        },\n        src: ['test/fixtures/one.tpl.html', 'test/fixtures/three.tpl.html'],\n        dest: 'tmp/existing_module.js'\n      },\n      file_footer: {\n        options: {\n          fileFooterString: '/* Module End */\\n'\n        },\n        src: ['test/fixtures/three.tpl.html'],\n        dest: 'tmp/file_footer.js'\n      },\n      file_header: {\n        options: {\n          fileHeaderString: '/* Module Start */\\n'\n        },\n        src: ['test/fixtures/three.tpl.html'],\n        dest: 'tmp/file_header.js'\n      },\n      file_header_footer: {\n        options: {\n          fileHeaderString: '/* Module Start */\\n',\n          fileFooterString: '/* Module End */\\n'\n        },\n        src: ['test/fixtures/three.tpl.html'],\n        dest: 'tmp/file_header_footer.js'\n      },\n      files_array_custom_options: {\n        options: {\n          base: 'test',\n          module: 'my-custom-template-module'\n        },\n        files: [\n          {\n            dest: 'tmp/files_array_custom_options_1.js',\n            src: ['test/fixtures/one.tpl.html'],\n            module: 'my-custom-templates'\n          },\n          {\n            dest: 'tmp/files_array_custom_options_2.js',\n            src: ['test/fixtures/two.tpl.html'],\n            module: 'my-custom-templates'\n          }\n        ]\n      },\n      files_array_default_options: {\n        files: [\n          {\n            dest: 'tmp/files_array_default_options_1.js',\n            src: ['test/fixtures/one.tpl.html']\n          },\n          {\n            dest: 'tmp/files_array_default_options_2.js',\n            src: ['test/fixtures/two.tpl.html']\n          }\n        ]\n      },\n      files_object_custom_options: {\n        options: {\n          base: 'test',\n          module: 'my-custom-template-module'\n        },\n        files: {\n          'tmp/files_object_custom_options_1.js': ['test/fixtures/one.tpl.html'],\n          'tmp/files_object_custom_options_2.js': ['test/fixtures/two.tpl.html']\n        }\n      },\n      files_object_default_options: {\n        files: {\n          'tmp/files_object_default_options_1.js': ['test/fixtures/one.tpl.html'],\n          'tmp/files_object_default_options_2.js': ['test/fixtures/two.tpl.html']\n        }\n      },\n      htmlmin: {\n        options: {\n          htmlmin: {\n            collapseBooleanAttributes: true,\n            collapseWhitespace: true,\n            removeAttributeQuotes: true,\n            removeComments: true,\n            removeEmptyAttributes: true,\n            removeRedundantAttributes: true,\n            removeScriptTypeAttributes: true,\n            removeStyleLinkTypeAttributes: true\n          }\n        },\n        src: ['test/fixtures/five.tpl.html'],\n        dest: 'tmp/htmlmin.js'\n      },\n      issue_26_withCollapseWhitespaceFalseDefaultQuotes: {\n        options: {\n          htmlmin: {\n            collapseWhitespace: false\n          }\n        },\n        src: ['test/fixtures/issue_26.tpl.html'],\n        dest: 'tmp/issue_26_withCollapseWhitespaceFalseDefaultQuotes.js'\n      },\n      issue_26_withCollapseWhitespaceFalseDoubleQuotes: {\n        options: {\n          htmlmin: {\n            collapseWhitespace: false\n          },\n          quoteChar: '\"'\n        },\n        src: ['test/fixtures/issue_26.tpl.html'],\n        dest: 'tmp/issue_26_withCollapseWhitespaceFalseDoubleQuotes.js'\n      },\n      issue_26_withCollapseWhitespaceFalseSingleQuotes: {\n        options: {\n          htmlmin: {\n            collapseWhitespace: false\n          },\n          quoteChar: '\\''\n        },\n        src: ['test/fixtures/issue_26.tpl.html'],\n        dest: 'tmp/issue_26_withCollapseWhitespaceFalseSingleQuotes.js'\n      },\n      issue_26_withCollapseWhitespaceTrueDefaultQuotes: {\n        options: {\n          htmlmin: {\n            collapseWhitespace: false\n          }\n        },\n        src: ['test/fixtures/issue_26.tpl.html'],\n        dest: 'tmp/issue_26_withCollapseWhitespaceTrueDefaultQuotes.js'\n      },\n      issue_26_withCollapseWhitespaceTrueDoubleQuotes: {\n        options: {\n          htmlmin: {\n            collapseWhitespace: false\n          },\n          quoteChar: '\"'\n        },\n        src: ['test/fixtures/issue_26.tpl.html'],\n        dest: 'tmp/issue_26_withCollapseWhitespaceTrueDoubleQuotes.js'\n      },\n      issue_26_withCollapseWhitespaceTrueSingleQuotes: {\n        options: {\n          htmlmin: {\n            collapseWhitespace: false\n          },\n          quoteChar: '\\''\n        },\n        src: ['test/fixtures/issue_26.tpl.html'],\n        dest: 'tmp/issue_26_withCollapseWhitespaceTrueSingleQuotes.js'\n      },\n      issue_26_withoutCollapseWhitespaceDefaultQuotes: {\n        src: ['test/fixtures/issue_26.tpl.html'],\n        dest: 'tmp/issue_26_withoutCollapseWhitespaceDefaultQuotes.js'\n      },\n      issue_26_withoutCollapseWhitespaceDoubleQuotes: {\n        options: {\n          quoteChar: '\"'\n        },\n        src: ['test/fixtures/issue_26.tpl.html'],\n        dest: 'tmp/issue_26_withoutCollapseWhitespaceDoubleQuotes.js'\n      },\n      issue_26_withoutCollapseWhitespaceSingleQuotes: {\n        options: {\n          quoteChar: '\\''\n        },\n        src: ['test/fixtures/issue_26.tpl.html'],\n        dest: 'tmp/issue_26_withoutCollapseWhitespaceSingleQuotes.js'\n      },\n      issue_76_missingSourceFile: {\n        nonull: true,\n        src: 'test/fixtures/issue_76_missing.tpl.html',\n        dest: 'tmp/issue_76_missingSourceFile.js'\n      },\n      issue_76_missingSourceFiles: {\n        nonull: true,\n        src: ['test/fixtures/issue_76_missing_1.tpl.html', 'test/fixtures/issue_76_missing_2.tpl.html'],\n        dest: 'tmp/issue_76_missingSourceFiles.js'\n      },\n      issue_76_missingSourceFilesFirst: {\n        nonull: true,\n        src: ['test/fixtures/issue_76_missing_1.tpl.html', 'test/fixtures/one.tpl.html'],\n        dest: 'tmp/issue_76_missingSourceFilesFirst.js'\n      },\n      issue_76_missingSourceFilesLast: {\n        nonull: true,\n        src: ['test/fixtures/one.tpl.html', 'test/fixtures/issue_76_missing_1.tpl.html'],\n        dest: 'tmp/issue_76_missingSourceFilesLast.js'\n      },\n      issue_76_missingSourceFilesMiddle: {\n        nonull: true,\n        src: ['test/fixtures/one.tpl.html', 'test/fixtures/issue_76_missing_1.tpl.html', 'test/fixtures/two.tpl.html'],\n        dest: 'tmp/issue_76_missingSourceFilesMiddle.js'\n      },\n      module_as_function: {\n        options: {\n          module: function (file) {\n            return 'NAME_FROM_FUNCTION';\n          }\n        },\n        src: ['test/fixtures/one.tpl.html', 'test/fixtures/two.tpl.html'],\n        dest: 'tmp/module_as_function.js'\n      },\n      multi_lines: {\n        src: ['test/fixtures/three.tpl.html'],\n        dest: 'tmp/multi_lines.js'\n      },\n      multi_lines_4space: {\n        options: {\n          indentString: '    '\n        },\n        src: ['test/fixtures/three.tpl.html'],\n        dest: 'tmp/multi_lines_4spaces.js'\n      },\n      multi_lines_tabs: {\n        options: {\n          indentString: '\\t'\n        },\n        src: ['test/fixtures/three.tpl.html'],\n        dest: 'tmp/multi_lines_tabs.js'\n      },\n      process_all_pug: {\n        options: {\n          pug: {},\n          watch: true\n        },\n        src: ['test/fixtures/*.pug'],\n        dest: 'tmp/process_all_pug.js'\n      },\n      process_function: {\n        options: {\n          process: function (html, filePath) {\n            html = html.replace('(ONE)', '1');\n            html = html.replace('(TWO)', '2');\n            html = html.replace('(THREE)', '3');\n            return html;\n          }\n        },\n        src: ['test/fixtures/process_function.tpl.html'],\n        dest: 'tmp/process_function.js'\n      },\n      process_pug: {\n        src: ['test/fixtures/process_pug.pug'],\n        dest: 'tmp/process_pug.js'\n      },\n      process_pug_custom: {\n        options: {\n          pug: {doctype: 'html'}\n        },\n        src: ['test/fixtures/process_pug_custom.pug'],\n        dest: 'tmp/process_pug_custom.js'\n      },\n      process_pug_with_include: {\n        options: {\n          pug: {}\n        },\n        src: ['test/fixtures/process_pug_with_include.pug'],\n        dest: 'tmp/process_pug_with_include.js'\n      },\n      process_template: {\n        testMessages: {\n          title: 'Main Title',\n          subtitle: 'Subtitle with {{ interpolation }}'\n        },\n        options: {\n          process: true\n        },\n        src: ['test/fixtures/process_template.tpl.html'],\n        dest: 'tmp/process_template.js'\n      },\n      regex_in_template: {\n        src: ['test/fixtures/pattern.tpl.html'],\n        dest: 'tmp/regex_in_template.js'\n      },\n      rename: {\n        options: {\n          rename: function (moduleName) {\n            return moduleName.replace('.html', '');\n          }\n        },\n        src: ['test/fixtures/one.tpl.html', 'test/fixtures/two.tpl.html'],\n        dest: 'tmp/rename.js'\n      },\n      single_module: {\n        options: {\n          singleModule: true\n        },\n        src: ['test/fixtures/one.tpl.html', 'test/fixtures/three.tpl.html'],\n        dest: 'tmp/single_module.js'\n      },\n      single_module_strict: {\n        options: {\n          singleModule: true,\n          useStrict: true\n        },\n        src: ['test/fixtures/one.tpl.html', 'test/fixtures/three.tpl.html'],\n        dest: 'tmp/single_module_strict.js'\n      },\n      single_module_coffee: {\n        options: {\n          singleModule: true,\n          target: 'coffee'\n        },\n        src: ['test/fixtures/one.tpl.html', 'test/fixtures/three.tpl.html'],\n        dest: 'tmp/single_module.coffee'\n      },\n      single_quotes: {\n        options: {\n          quoteChar: '\\''\n        },\n        src: ['test/fixtures/four.tpl.html'],\n        dest: 'tmp/single_quotes.js'\n      },\n      strict_mode: {\n        options: {\n          useStrict: true\n        },\n        src: ['test/fixtures/one.tpl.html'],\n        dest: 'tmp/strict_mode.js'\n      },\n      template_path_in_comment: {\n        options: {\n          templatePathInComment: true\n        },\n        src: ['test/fixtures/three.tpl.html'],\n        dest: 'tmp/template_path_in_comment.js'\n      }\n    },\n\n    // Unit tests.\n    nodeunit: {\n      tests: ['test/*_test.js']\n    }\n  });\n\n  // Actually load this plugin's task(s).\n  grunt.loadTasks('tasks');\n\n  // These plugins provide necessary tasks.\n  require('load-grunt-tasks')(grunt);\n\n  grunt.loadNpmTasks('grunt-coveralls');\n  grunt.loadNpmTasks('grunt-contrib-jshint');\n  grunt.loadNpmTasks('grunt-contrib-nodeunit');\n\n  // Whenever the \"test\" task is run, first clean the \"tmp\" dir, then run this\n  // plugin's task(s), then test the result.\n  grunt.registerTask('test', ['clean', 'html2js', 'nodeunit']);\n\n  // By default, lint and run all tests.\n  grunt.registerTask('default', ['jshint', 'test']);\n\n};\n"
  },
  {
    "path": "LICENSE-MIT",
    "content": "Copyright (c) 2013 Karl Goldstein\nCopyright (c) 2017-2021 Richard Quadling\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "[![Travis](https://img.shields.io/travis/rquadling/grunt-html2js.svg?style=plastic)](https://travis-ci.org/rquadling/grunt-html2js)\n[![Coveralls](https://img.shields.io/coveralls/rquadling/grunt-html2js.svg?style=plastic)](https://coveralls.io/github/rquadling/grunt-html2js)\n[![NPM](https://img.shields.io/npm/v/grunt-html2js.svg?style=plastic)](https://www.npmjs.com/package/grunt-html2js)\n[![NPM](https://img.shields.io/npm/dw/grunt-html2js.svg?style=plastic)](https://www.npmjs.com/package/grunt-html2js)\n[![NPM](https://img.shields.io/npm/dm/grunt-html2js.svg?style=plastic)](https://www.npmjs.com/package/grunt-html2js)\n[![NPM](https://img.shields.io/npm/dy/grunt-html2js.svg?style=plastic)](https://www.npmjs.com/package/grunt-html2js)\n[![NPM](https://img.shields.io/npm/dt/grunt-html2js.svg?style=plastic)](https://www.npmjs.com/package/grunt-html2js)\n\n# grunt-html2js\n\nConverts AngularJS templates to JavaScript\n\n## Getting Started\nThis plugin requires Grunt v1 or later\n\nIf you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started)\nguide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins.\nOnce you're familiar with that process, you may install this plugin with this command:\n\n```shell\nnpm install grunt-html2js --save-dev\n```\n\nOnce the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:\n\n```js\ngrunt.loadNpmTasks('grunt-html2js');\n```\n\n## The \"html2js\" task\n\n### Overview\n\nAngular-JS normally loads templates lazily from the server as you reference them in your application (via `ng-include`, routing\nconfiguration or other mechanism).  Angular caches the source code for each template so that subsequent references do not require\nanother server request.  However, if your application is divided into many small components, then the initial loading process may\ninvolve an unacceptably large number of additional server requests.\n\nThis plugin converts a group of templates to JavaScript and assembles them into an Angular module that primes the cache directly\nwhen the module is loaded.  You can concatenate this module with your main application code so that Angular does not need to make\nany additional server requests to initialize the application.\n\nNote that this plugin does *not* compile the templates.  It simply caches the template source code.\n\n### Setup\n\nBy default, this plugin assumes you are following the naming conventions and build pipeline of the [angular-app](https://github.com/angular-app/angular-app)\ndemo application.\n\nIn your project's Gruntfile, add a section named `html2js` to the data object passed into `grunt.initConfig()`.\n\nThis simplest configuration will assemble all templates in your src tree into a module named `templates-main`, and write the\nJavaScript source for the module to `tmp/template.js`:\n\n```js\ngrunt.initConfig({\n  html2js: {\n    options: {\n      // custom options, see below\n    },\n    main: {\n      src: ['src/**/*.tpl.html'],\n      dest: 'tmp/templates.js'\n    },\n  },\n})\n```\n\nAssuming you concatenate the resulting file with the rest of your application code, you can then specify the module as a\ndependency in your code:\n\n```\nangular.module('main', ['templates-main'])\n  .config(['$routeProvider', function ($routeProvider) {\n    $routeProvider.when('/somepath', {\n      templateUrl:'some/template.tpl.html',\n```\n\nNote that you should use relative paths to specify the template URL, to\nmatch the keys by which the template source is cached.\n\n### Gotchas\n\nThe `dest` property must be a string.  If it is an array, Grunt will fail when attempting to write the bundle file.\n\n### Options\n\n#### options.base\nType: `String`\nDefault value: `'src'`\n\nThe prefix relative to the project directory that should be stripped from each template path to produce a module identifier for\nthe template.  For example, a template located at `src/projects/projects.tpl.html` would be identified as just\n`projects/projects.tpl.html`.\n\n#### options.target\nType: `String`\nDefault value: `'js'`\n\nLanguage of the output file. Possible values: `'coffee'`, `'js'`.\n\n#### options.module\nType: `String` or `Function`\nDefault value: `templates-TARGET`\n\nThe name of the parent Angular module for each set of templates.  Defaults to the task target prefixed by `templates-`.\n\nThe value of this argument can be a string or a function.  The function should expect the module file path and grunt task name\nas arguments, and it should return the name to use for the parent Angular module.\n\nIf no bundle module is desired, set this to false.\n\n#### options.rename\nType: `Function`\nDefault value: `none`\n\nA function that takes in the module identifier and returns the renamed module identifier to use instead for the template. For\nexample, a template located at `src/projects/projects.tpl.html` would be identified as `/src/projects/projects.tpl` with a\nrename function defined as:\n\n```\nfunction (moduleName) {\n  return '/' + moduleName.replace('.html', '');\n}\n```\n\n#### options.quoteChar\nType: `Character`\nDefault value: `\"`\n\nStrings are quoted with double-quotes by default.  However, for projects\nthat want strict single quote-only usage, you can specify:\n\n```\noptions: { quoteChar: '\\'' }\n```\n\nto use single quotes, or any other odd quoting character you want\n\n#### options.indentString\nType: `String`\nDefault value: `  `\n\nBy default a 2-space indent is used for the generated code. However,\nyou can specify alternate indenting via:\n\n```\noptions: { indentString: '    ' }\n```\n\nto get, for example, 4-space indents. Same goes for tabs or any other\nindent system you want to use.\n\n#### options.fileHeaderString:\nType: `String`\nDefault value: ``\n\nIf specified, this string  will get written at the top of the output\nTemplate.js file. As an example, jshint directives such as\n/* global angular: false */ can be put at the head of the file.\n\n#### options.fileFooterString:\nType: `String`\nDefault value: ``\n\nIf specified, this string  will get written at the end of the output\nfile.  May be used in conjunction with `fileHeaderString` to wrap\nthe output.\n\n#### options.useStrict:\nType: `Boolean`\nDefault value: ``\n\nIf set true, each module in JavaScript will have 'use strict'; written at the top of the\nmodule.  Useful for global strict jshint settings.\n\n```\noptions: { useStrict: true }\n```\n\n#### options.htmlmin:\nType: `Object`\nDefault value: {}\n\nMinifies HTML using [html-minifier](https://github.com/kangax/html-minifier).\n\n```\noptions: {\n  htmlmin: {\n    collapseBooleanAttributes: true,\n    collapseWhitespace: true,\n    removeAttributeQuotes: true,\n    removeComments: true,\n    removeEmptyAttributes: true,\n    removeRedundantAttributes: true,\n    removeScriptTypeAttributes: true,\n    removeStyleLinkTypeAttributes: true\n  }\n}\n```\n\nIn addition, the `customAttrCollapse` option is supported, allowing you to supply a regex that\nis used to match attribute names in which multiple whitespace will be collapsed to a single space.\n\n#### options.process:\nType: `Object` or `Boolean` or `Function`\nDefault value: `false`\n\nPerforms arbitrary processing on the template as part of the compilation process.\n\nOption value can be one of:\n\n1. a function that accepts `content` and `filepath` as arguments, and returns the transformed content\n2. an object that is passed as the second options argument to `grunt.template.process` (with the file content as the first\n   argument)\n3. `true` to call `grunt.template.process` with the content and no options\n\n#### options.singleModule\nType: `Boolean`\nDefault value: `false`\n\nIf set to true, will create a single wrapping module with a run block, instead of an individual module for each template file.\nRequires that the `module` option is not falsy.\n\n#### options.existingModule\nType: `Boolean`\nDefault value: `false`\n\nIf set to true, will use an existing module with the name from `module`, instead of creating a new module. Requires that\n`singleModule` is not falsy.\n\n#### options.watch\nType: `Boolean`\nDefault value: `false`\n\nIf set to true and used in conjunction with a long running/keep-alive process such as grunt-contrib-watch html2js will watch src\nfiles for changes and regenerate output to dest. It uses an internal cache so only the file that changes needs to be\nre-compliled. Useful for development process particularly if you have lots of pug templates. It is very similar to\ngrunt-browserify's watch.\n\n```\noptions: {\n  pug: {},\n  watch: true\n}\n```\n\nN.B. If using grunt-watch you do not need to run the html2js task again on src changes as it watches internally for these. All\nyou need to do is watch the destination file and live reload on change.\n\n#### options.amd\nType: `Boolean`\nDefault value: `false`\n\nIf set to true, will wrap output in a define block so it is compatible with AMD module loaders such as RequireJS without\nrequiring you to shim the module.\n\n#### options.amdPrefixString\nType: `String`\nDefault value: `define(['angular'], function(angular){\\n`\n\nWhen `options.amd` is set to true, this is what will be prepended to the module to make it compatible with AMD module loaders.\nAlong with `amdSuffixString`, these two options should allow you to customize the way your AMD module is created.\n\n#### options.amdSuffixString\nType: `String`\nDefault Value: `});`\n\nWhen `options.amd` is set to true, this is what will be postpended to the module to make it compatible with AMD module loaders.\nAlong with `amdPrefixString`, these two options should allow you to customize the way your AMD module is created.\n\n### Pug support\n\n#### options.pug\n\nIf template filename ends with `.pug` the task will automatically render file's content using [Pug](https://github.com/pugjs/pug)\nthen compile into JS.\n\nOptions can be passed to Pug within a `pug` property in the plugin options.\n\n```\noptions: {\n  pug: {\n    //this prevents auto expansion of empty arguments\n    //e.g. \"div(ui-view)\" becomes \"<div ui-view></div>\"\n    //     instead of \"<div ui-view=\"ui-view\"></div>\"\n    doctype: \"html\"\n  }\n}\n```\n\n#### options.templatePathInComment:\nType: `Boolean`\nDefault value: `false`\n\nIf specified, adds an HTML comment containing the template file path as a comment at the start of each template.\n\n### Usage Examples\n\nSee the `Gruntfile.js` in the project source code for various configuration examples.\n\n## Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed\nfunctionality. Lint and test your code using [Grunt](http://gruntjs.com/).\n\n## Release History\n\n0.1.1 Build module even if templates do not exist yet\n\n0.1.2 Preserve line feeds in templates to avoid breaking &lt;pre>-formatted text\n\n0.1.3 Add option to set the `module` option to null to disable creation of bundle module\n\n0.1.4 Add rename option\n\n0.1.5 Add config options for quoteChar, indentString and fileHeaderString (thanks @jonathana)\n\n0.1.6 Add support for CoffeeScript (thanks @srigi)\n\n0.1.7 Escape backslashes in template source (issue #11, thanks @JoakimBe)\n\n0.1.8 Add fileFooterString option (issue #13, thanks @duro)\n\n0.1.9 Add useStrict option (pull request #15, thanks @marcoose)\n\n0.2.0 Add htmlmin option (pull request #16, thanks @buberdds)\n\n0.2.1 Fix dependencies for htmlmin (pull request #17, vielen dank @mlegenhausen)\n\n0.2.2 Fix counter of converted files (pull request #18, thanks @srigi)\n\n0.2.3 Add option to interpret 'module' as function (pull request #20, thanks @CodingGorilla)\n\n0.2.4 Add `process` option (pull request #24, thanks @scottrippey)\n\n0.2.5 Add task name as argument to function variant of module option (pull request #37, thanks @lukovnikov)\n\n0.2.6 Add support for auto-detecting Jade templates as input (thanks @bahmutov)\n\n0.2.7 Add singleModule module for placing all templates in a single module (PR #43, thanks @janeklb)\n\n0.2.8 Allow passing option to Jade templates (PR #46, thanks @NickClark)\n\n0.2.9 Support relative file names for Jade templates (PR #48, thanks @dvonlehman)\n\n0.3.0 Allow use strict in single mode (PR #58, thanks @mfeckie)\n\n0.3.1 Add watch feature (PR #67, thanks @startswithaj)\n\n0.3.2 Update to stable chokidar (PR #68, thanks @paulmillr)\n\n0.3.3 Fix dependency on jade (PR #72, thanks @mathewleon)\n\n0.3.4 Add existingModule option (PR #75, thanks @Jandalf)\n\n0.3.5 Adds options to support AMD modules (PR #75, thanks @Southpaw17)\n\n0.3.6 Updates peer dependencies for Grunt 1.0 (PR #81)\n\n0.3.7 Fix dependencies for htmlmin\n\nAs of 0.3.7, this package is now administered by Richard Quadling who gives a big \"Thank you\" to Karl for his hard work.\n\n0.3.8 Fix broken newlines (\\r\\r\\n)\n\n0.4.0 Added ability to render pug templates. Maintains Backwards compatibility. (#83)\n      Marked support for jade templates as deprecated. Support will be removed in 0.5.0\n\n0.4.1 Added ability to add an HTML comment to the templates (#9/#10)\n\n0.4.2 Empty modules not generated if no source files located (#55)\n\n0.5.0 Introduce Travis CI for unit tests and code coverage.\n      Removed support for Jade.\n      Added badges.\n      Reformatted code and README.md.\n\n0.5.1 Fix options.quoteChar usage for module header (#64)\n\n0.6.0 Upgraded dependencies to latest versions.`npm audit` shows 0 vulnerabilities.\n\n0.7.0 Upgraded dependencies to latest versions.`npm audit` shows 0 vulnerabilities.\n\n0.8.0 Upgraded dependencies to latest versions.`npm audit` shows 0 vulnerabilities.\n\n0.9.0 Removed `istanbul` as a dependency as it is only used during testing. \n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"grunt-html2js\",\n  \"description\": \"Compiles AngularJS templates to JavaScript\",\n  \"version\": \"0.9.0\",\n  \"homepage\": \"https://github.com/rquadling/grunt-html2js\",\n  \"author\": {\n    \"name\": \"Karl Goldstein\",\n    \"email\": \"karl.goldstein@gmail.com\"\n  },\n  \"contributors\": [\n    {\n      \"name\": \"Richard Quadling\",\n      \"email\": \"RQuadling@GMail.com\"\n    }\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/rquadling/grunt-html2js.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/rquadling/grunt-html2js/issues\"\n  },\n  \"license\": \"SEE LICENSE IN LICENSE-MIT\",\n  \"main\": \"Gruntfile.js\",\n  \"engines\": {\n    \"node\": \">= 0.10.0\"\n  },\n  \"scripts\": {\n    \"test\": \"grunt test\"\n  },\n  \"devDependencies\": {\n    \"grunt\": \"^1.5.3\",\n    \"grunt-contrib-clean\": \"^2.0.1\",\n    \"grunt-contrib-jshint\": \"^3.2.0\",\n    \"grunt-contrib-nodeunit\": \"^4\",\n    \"grunt-coveralls\": \"^2\",\n    \"load-grunt-tasks\": \"^5\",\n    \"minimist\": \"^1.2.7\"\n  },\n  \"peerDependencies\": {\n    \"grunt\": \">=0.4.0\"\n  },\n  \"optionalDependencies\": {\n    \"pug\": \"^3\"\n  },\n  \"keywords\": [\n    \"gruntplugin\"\n  ],\n  \"dependencies\": {\n    \"chokidar\": \"^3.5.3\",\n    \"grunt-cli\": \"^1.3.2\",\n    \"html-minifier\": \"^4\",\n    \"minimist\": \"^1.2.7\"\n  }\n}\n"
  },
  {
    "path": "tasks/html2js.js",
    "content": "/*\n * grunt-html2js\n * https://github.com/rquadling/grunt-html2js\n *\n * Copyright (c) 2013 Karl Goldstein\n * Copyright (c) 2017 Richard Quadling\n *\n * Licensed under the MIT license.\n */\n\n'use strict';\n\nmodule.exports = function (grunt) {\n\n  var path = require('path');\n  var minify = require('html-minifier').minify;\n\n  var escapeContent = function (content, quoteChar, indentString, pathToAddAsComment) {\n    content = (pathToAddAsComment ? '<!-- template: ' + pathToAddAsComment + ' -->\\n' : '') + content;\n    var bsRegexp = new RegExp('\\\\\\\\', 'g');\n    var quoteRegexp = new RegExp('\\\\' + quoteChar, 'g');\n    var nlReplace = '\\\\n' + quoteChar + ' +\\n' + indentString + indentString + quoteChar;\n    return content.replace(bsRegexp, '\\\\\\\\').replace(quoteRegexp, '\\\\' + quoteChar).replace(/\\r*\\n/g, nlReplace);\n  };\n\n  // convert Windows file separator URL path separator\n  var normalizePath = function (p) {\n    if (path.sep !== '/') {\n      p = p.replace(/\\\\/g, '/');\n    }\n    return p;\n  };\n\n  // Warn on and remove invalid source files (if nonull was set).\n  var existsFilter = function (filepath) {\n    if (!grunt.file.exists(filepath)) {\n      grunt.log.warn('Source file \"' + filepath + '\" not found.');\n      return false;\n    } else {\n      return true;\n    }\n  };\n\n  function isPugTemplate (filepath) {\n    var pugExtension = /\\.pug$/;\n    return pugExtension.test(filepath);\n  }\n\n  // return template content\n  var getContent = function (filepath, options) {\n    var content = grunt.file.read(filepath);\n    if (isPugTemplate(filepath)) {\n      var pug = require('pug');\n      options.pug.filename = filepath;\n      content = pug.render(content, options.pug);\n    }\n\n    // Process files as templates if requested.\n    var process = options.process;\n    if (typeof process === 'function') {\n      content = process(content, filepath);\n    } else if (process) {\n      if (process === true) {\n        process = {};\n      }\n      content = grunt.template.process(content, process);\n    }\n\n    if (Object.keys(options.htmlmin).length) {\n      try {\n        content = minify(content, options.htmlmin);\n      } catch (err) {\n        grunt.warn(filepath + '\\n' + err);\n      }\n    }\n\n    // trim leading whitespace\n    content = content.replace(/(^\\s*)/g, '');\n\n    return escapeContent(content, options.quoteChar, options.indentString, options.templatePathInComment ? filepath : '');\n  };\n\n  // compile a template to an angular module\n  var compileTemplate = function (moduleName, filepath, options) {\n    var quoteChar = options.quoteChar;\n    var indentString = options.indentString;\n    var withModule = !options.singleModule;\n    var content = getContent(filepath, options);\n    var doubleIndent = indentString + indentString;\n    var strict = (options.useStrict) ? indentString + quoteChar + 'use strict' + quoteChar + ';\\n' : '';\n    var compiled = '';\n\n    if (withModule) {\n      compiled += 'angular.module(' + quoteChar + moduleName +\n        quoteChar + ', []).run([' + quoteChar + '$templateCache' + quoteChar + ', function($templateCache) {\\n' + strict;\n    }\n\n    compiled += indentString + '$templateCache.put(' + quoteChar + moduleName + quoteChar +\n      ',\\n' + doubleIndent + quoteChar + content + quoteChar + ');';\n\n    if (withModule) {\n      compiled += '\\n}]);\\n';\n    }\n\n    return compiled;\n  };\n\n  // compile a template to an angular module\n  var compileCoffeeTemplate = function (moduleName, filepath, options) {\n    var quoteChar = options.quoteChar;\n    var indentString = options.indentString;\n    var withModule = !options.singleModule;\n    var content = getContent(filepath, options);\n    var doubleIndent = indentString + indentString;\n    var compiled = '';\n\n    if (withModule) {\n      compiled += 'angular.module(' + quoteChar + moduleName +\n        quoteChar + ', []).run([' + quoteChar + '$templateCache' + quoteChar + ', ($templateCache) ->\\n';\n    }\n\n    compiled += indentString + '$templateCache.put(' + quoteChar + moduleName + quoteChar +\n      ',\\n' + doubleIndent + quoteChar + content + quoteChar + ')';\n\n    if (withModule) {\n      compiled += '\\n])\\n';\n    }\n\n    return compiled;\n  };\n\n  grunt.registerMultiTask('html2js', 'Compiles Angular-JS templates to JavaScript.', function () {\n\n    var options = this.options({\n      base: 'src',\n      module: 'templates-' + this.target,\n      quoteChar: '\"',\n      fileHeaderString: '',\n      fileFooterString: '',\n      indentString: '  ',\n      target: 'js',\n      htmlmin: {},\n      process: false,\n      pug: {pretty: true},\n      singleModule: false,\n      existingModule: false,\n      watch: false,\n      amd: false,\n      amdPrefixString: 'define([\\'angular\\'], function(angular){',\n      amdSuffixString: '});',\n      templatePathInComment: false\n    });\n\n    var counter = 0;\n    var target = this.target;\n    var fileCache = {};\n    var watcher = null;\n\n    // generate a separate module\n    function generateModule (f) {\n\n      // f.dest must be a string or write will fail\n      var moduleNames = [];\n      var filePaths = f.src.filter(existsFilter);\n\n      if (options.watch) {\n        watcher.add(filePaths);\n      }\n\n      var modules = filePaths.map(function (filepath) {\n\n        var moduleName = normalizePath(path.relative(options.base, filepath));\n        if (grunt.util.kindOf(options.rename) === 'function') {\n          moduleName = options.rename(moduleName);\n        }\n        moduleNames.push(options.quoteChar + moduleName + options.quoteChar);\n\n        var compiled;\n\n        if (options.watch && (compiled = fileCache[filepath])) {\n          // return compiled file contents from cache\n          return compiled;\n        }\n\n        if (options.target === 'js') {\n          compiled = compileTemplate(moduleName, filepath, options);\n        } else if (options.target === 'coffee') {\n          compiled = compileCoffeeTemplate(moduleName, filepath, options);\n        } else {\n          grunt.fail.fatal('Unknown target \"' + options.target + '\" specified');\n        }\n\n        if (options.watch) {\n          // store compiled file contents in cache\n          fileCache[filepath] = compiled;\n        }\n\n        return compiled;\n      });\n\n      // don't generate empty modules\n      if (!modules.length) {\n        return;\n      }\n\n      counter += modules.length;\n      modules = modules.join('\\n');\n\n      var fileHeader = options.fileHeaderString !== '' ? options.fileHeaderString + '\\n' : '';\n      var fileFooter = options.fileFooterString !== '' ? options.fileFooterString + '\\n' : '';\n      var bundle = '';\n      var targetModule = f.module || options.module;\n      var indentString = options.indentString;\n      var quoteChar = options.quoteChar;\n      var strict = (options.useStrict) ? indentString + quoteChar + 'use strict' + quoteChar + ';\\n' : '';\n      var amdPrefix = '';\n      var amdSuffix = '';\n      // If options.module is a function, use that to get the targetModule\n      if (grunt.util.kindOf(targetModule) === 'function') {\n        targetModule = targetModule(f, target);\n      }\n\n      if (options.amd) {\n        amdPrefix = options.amdPrefixString;\n        amdSuffix = options.amdSuffixString;\n      }\n\n      if (!targetModule && options.singleModule) {\n        throw new Error('When using singleModule: true be sure to specify a (target) module');\n      }\n\n      if (options.existingModule && !options.singleModule) {\n        throw new Error('When using existingModule: true be sure to set singleModule: true');\n      }\n\n      if (options.singleModule) {\n        var moduleSuffix = options.existingModule ? '' : ', []';\n        if (options.target === 'js') {\n          bundle = 'angular.module(' + quoteChar + targetModule + quoteChar + moduleSuffix + ').run([' + quoteChar + '$templateCache' + quoteChar + ', function($templateCache) {\\n' + strict;\n          modules += '\\n}]);\\n';\n        } else if (options.target === 'coffee') {\n          bundle = 'angular.module(' + quoteChar + targetModule + quoteChar + moduleSuffix + ').run([' + quoteChar + '$templateCache' + quoteChar + ', ($templateCache) ->\\n';\n          modules += '\\n])\\n';\n        }\n      } else if (targetModule) {\n        //Allow a 'no targetModule if module is null' option\n        bundle = 'angular.module(' + quoteChar + targetModule + quoteChar + ', [' + moduleNames.join(', ') + '])';\n        if (options.target === 'js') {\n          bundle += ';';\n        }\n\n        bundle += '\\n\\n';\n      }\n      grunt.file.write(f.dest, grunt.util.normalizelf(fileHeader + amdPrefix + bundle + modules + amdSuffix + fileFooter));\n    }\n\n    if (options.watch) {\n      var files = this.files;\n      var chokidar = require('chokidar');\n\n      watcher = chokidar.watch().on('change', function (filepath) {\n        // invalidate cache\n        fileCache[filepath] = null;\n        // regenerateModules\n        files.forEach(generateModule);\n      });\n    }\n\n    this.files.forEach(generateModule);\n\n    //Just have one output, so if we are making thirty files it only does one line\n    grunt.log.writeln('Successfully converted ' + ('' + counter).green +\n      ' html templates to ' + options.target + '.');\n  });\n};\n"
  },
  {
    "path": "test/expected/amd_module.js",
    "content": "define(['angular'], function(angular){angular.module('templates-amd_module', ['../test/fixtures/one.tpl.html', '../test/fixtures/two.tpl.html']);\n\nangular.module('../test/fixtures/one.tpl.html', []).run(['$templateCache', function($templateCache) {\n  $templateCache.put('../test/fixtures/one.tpl.html',\n    '1 2 3');\n}]);\n\nangular.module('../test/fixtures/two.tpl.html', []).run(['$templateCache', function($templateCache) {\n  $templateCache.put('../test/fixtures/two.tpl.html',\n    'Testing');\n}]);\n});"
  },
  {
    "path": "test/expected/amd_module_custom_prefix.js",
    "content": "define(['ng'], function(angular){angular.module(\"templates-amd_module_custom_prefix\", [\"../test/fixtures/one.tpl.html\", \"../test/fixtures/two.tpl.html\"]);\n\nangular.module(\"../test/fixtures/one.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/one.tpl.html\",\n    \"1 2 3\");\n}]);\n\nangular.module(\"../test/fixtures/two.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/two.tpl.html\",\n    \"Testing\");\n}]);\n});"
  },
  {
    "path": "test/expected/amd_module_custom_suffix.js",
    "content": "define(['angular'], function(angular){angular.module(\"templates-amd_module_custom_suffix\", [\"../test/fixtures/one.tpl.html\", \"../test/fixtures/two.tpl.html\"]);\n\nangular.module(\"../test/fixtures/one.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/one.tpl.html\",\n    \"1 2 3\");\n}]);\n\nangular.module(\"../test/fixtures/two.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/two.tpl.html\",\n    \"Testing\");\n}]);\n}); //Custom!"
  },
  {
    "path": "test/expected/broken_newlines.js",
    "content": "angular.module(\"templates-broken_newlines\", [\"../test/fixtures/broken_newlines.tpl.html\"]);\n\nangular.module(\"../test/fixtures/broken_newlines.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/broken_newlines.tpl.html\",\n    \"abc\\n\" +\n    \"def\");\n}]);\n"
  },
  {
    "path": "test/expected/coffee.coffee",
    "content": "angular.module(\"templates-coffee\", [\"../test/fixtures/one.tpl.html\", \"../test/fixtures/two.tpl.html\"])\n\nangular.module(\"../test/fixtures/one.tpl.html\", []).run([\"$templateCache\", ($templateCache) ->\n  $templateCache.put(\"../test/fixtures/one.tpl.html\",\n    \"1 2 3\")\n])\n\nangular.module(\"../test/fixtures/two.tpl.html\", []).run([\"$templateCache\", ($templateCache) ->\n  $templateCache.put(\"../test/fixtures/two.tpl.html\",\n    \"Testing\")\n])\n"
  },
  {
    "path": "test/expected/compact_format_custom_options.js",
    "content": "angular.module(\"my-custom-template-module\", [\"fixtures/one.tpl.html\", \"fixtures/two.tpl.html\"]);\n\nangular.module(\"fixtures/one.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"fixtures/one.tpl.html\",\n    \"1 2 3\");\n}]);\n\nangular.module(\"fixtures/two.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"fixtures/two.tpl.html\",\n    \"Testing\");\n}]);\n"
  },
  {
    "path": "test/expected/compact_format_default_options.js",
    "content": "angular.module(\"templates-compact_format_default_options\", [\"../test/fixtures/one.tpl.html\", \"../test/fixtures/two.tpl.html\"]);\n\nangular.module(\"../test/fixtures/one.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/one.tpl.html\",\n    \"1 2 3\");\n}]);\n\nangular.module(\"../test/fixtures/two.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/two.tpl.html\",\n    \"Testing\");\n}]);\n"
  },
  {
    "path": "test/expected/custom_attribute_collapsed.js",
    "content": "angular.module(\"templates-custom_attribute_collapsed\", [\"../test/fixtures/custom_attribute_collapse.tpl.html\"]);\n\nangular.module(\"../test/fixtures/custom_attribute_collapse.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/custom_attribute_collapse.tpl.html\",\n    \"<div my-style=\\\"background-color: red;font-size: large;\\\"></div>\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/custom_attribute_not_collapsed.js",
    "content": "angular.module(\"templates-custom_attribute_not_collapsed\", [\"../test/fixtures/custom_attribute_collapse.tpl.html\"]);\n\nangular.module(\"../test/fixtures/custom_attribute_collapse.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/custom_attribute_collapse.tpl.html\",\n    \"<div\\n\" +\n    \"        my-style=\\\"\\n\" +\n    \"            background-color: red;\\n\" +\n    \"            font-size: large;\\\"\\n\" +\n    \"></div>\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/double_quotes.js",
    "content": "angular.module(\"templates-double_quotes\", [\"../test/fixtures/four.tpl.html\"]);\n\nangular.module(\"../test/fixtures/four.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/four.tpl.html\",\n    \"This data is \\\"in quotes\\\"\\n\" +\n    \"And this data is 'in single quotes'\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/empty_attribute.js",
    "content": "angular.module(\"templates-empty_attribute\", [\"../test/fixtures/empty_attribute.tpl.html\"]);\n\nangular.module(\"../test/fixtures/empty_attribute.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/empty_attribute.tpl.html\",\n    \"<div ui-view></div>\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/existing_module.js",
    "content": "angular.module(\"templates-existing_module\").run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/one.tpl.html\",\n    \"1 2 3\");\n  $templateCache.put(\"../test/fixtures/three.tpl.html\",\n    \"Multiple\\n\" +\n    \"Lines\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/file_footer.js",
    "content": "angular.module(\"templates-file_footer\", [\"../test/fixtures/three.tpl.html\"]);\n\nangular.module(\"../test/fixtures/three.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/three.tpl.html\",\n    \"Multiple\\n\" +\n    \"Lines\\n\" +\n    \"\");\n}]);\n/* Module End */\n\n"
  },
  {
    "path": "test/expected/file_header.js",
    "content": "/* Module Start */\n\nangular.module(\"templates-file_header\", [\"../test/fixtures/three.tpl.html\"]);\n\nangular.module(\"../test/fixtures/three.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/three.tpl.html\",\n    \"Multiple\\n\" +\n    \"Lines\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/file_header_footer.js",
    "content": "/* Module Start */\n\nangular.module(\"templates-file_header_footer\", [\"../test/fixtures/three.tpl.html\"]);\n\nangular.module(\"../test/fixtures/three.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/three.tpl.html\",\n    \"Multiple\\n\" +\n    \"Lines\\n\" +\n    \"\");\n}]);\n/* Module End */\n\n"
  },
  {
    "path": "test/expected/files_array_custom_options_1.js",
    "content": "angular.module(\"my-custom-templates\", [\"fixtures/one.tpl.html\"]);\n\nangular.module(\"fixtures/one.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"fixtures/one.tpl.html\",\n    \"1 2 3\");\n}]);\n"
  },
  {
    "path": "test/expected/files_array_custom_options_2.js",
    "content": "angular.module(\"my-custom-templates\", [\"fixtures/two.tpl.html\"]);\n\nangular.module(\"fixtures/two.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"fixtures/two.tpl.html\",\n    \"Testing\");\n}]);\n"
  },
  {
    "path": "test/expected/files_array_default_options_1.js",
    "content": "angular.module(\"templates-files_array_default_options\", [\"../test/fixtures/one.tpl.html\"]);\n\nangular.module(\"../test/fixtures/one.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/one.tpl.html\",\n    \"1 2 3\");\n}]);\n"
  },
  {
    "path": "test/expected/files_array_default_options_2.js",
    "content": "angular.module(\"templates-files_array_default_options\", [\"../test/fixtures/two.tpl.html\"]);\n\nangular.module(\"../test/fixtures/two.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/two.tpl.html\",\n    \"Testing\");\n}]);\n"
  },
  {
    "path": "test/expected/files_object_custom_options_1.js",
    "content": "angular.module(\"my-custom-template-module\", [\"fixtures/one.tpl.html\"]);\n\nangular.module(\"fixtures/one.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"fixtures/one.tpl.html\",\n    \"1 2 3\");\n}]);\n"
  },
  {
    "path": "test/expected/files_object_custom_options_2.js",
    "content": "angular.module(\"my-custom-template-module\", [\"fixtures/two.tpl.html\"]);\n\nangular.module(\"fixtures/two.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"fixtures/two.tpl.html\",\n    \"Testing\");\n}]);\n"
  },
  {
    "path": "test/expected/files_object_default_options_1.js",
    "content": "angular.module(\"templates-files_object_default_options\", [\"../test/fixtures/one.tpl.html\"]);\n\nangular.module(\"../test/fixtures/one.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/one.tpl.html\",\n    \"1 2 3\");\n}]);\n"
  },
  {
    "path": "test/expected/files_object_default_options_2.js",
    "content": "angular.module(\"templates-files_object_default_options\", [\"../test/fixtures/two.tpl.html\"]);\n\nangular.module(\"../test/fixtures/two.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/two.tpl.html\",\n    \"Testing\");\n}]);\n"
  },
  {
    "path": "test/expected/htmlmin.js",
    "content": "angular.module(\"templates-htmlmin\", [\"../test/fixtures/five.tpl.html\"]);\n\nangular.module(\"../test/fixtures/five.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/five.tpl.html\",\n    \"<div class=\\\"quotes should be escaped\\\"><span><span><span>Lorem ipsum</span></span></span></div>\");\n}]);\n"
  },
  {
    "path": "test/expected/issue_26_withCollapseWhitespaceFalseDefaultQuotes.js",
    "content": "angular.module(\"templates-issue_26_withCollapseWhitespaceFalseDefaultQuotes\", [\"../test/fixtures/issue_26.tpl.html\"]);\n\nangular.module(\"../test/fixtures/issue_26.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/issue_26.tpl.html\",\n    \"<div>\\n\" +\n    \"    <div ng-class='\\\"bsp-alert-\\\" + (type || \\\"warning\\\")'></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/issue_26_withCollapseWhitespaceFalseDoubleQuotes.js",
    "content": "angular.module(\"templates-issue_26_withCollapseWhitespaceFalseDoubleQuotes\", [\"../test/fixtures/issue_26.tpl.html\"]);\n\nangular.module(\"../test/fixtures/issue_26.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/issue_26.tpl.html\",\n    \"<div>\\n\" +\n    \"    <div ng-class='\\\"bsp-alert-\\\" + (type || \\\"warning\\\")'></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/issue_26_withCollapseWhitespaceFalseSingleQuotes.js",
    "content": "angular.module('templates-issue_26_withCollapseWhitespaceFalseSingleQuotes', ['../test/fixtures/issue_26.tpl.html']);\n\nangular.module('../test/fixtures/issue_26.tpl.html', []).run(['$templateCache', function($templateCache) {\n  $templateCache.put('../test/fixtures/issue_26.tpl.html',\n    '<div>\\n' +\n    '    <div ng-class=\\'\"bsp-alert-\" + (type || \"warning\")\\'></div>\\n' +\n    '</div>\\n' +\n    '');\n}]);\n"
  },
  {
    "path": "test/expected/issue_26_withCollapseWhitespaceTrueDefaultQuotes.js",
    "content": "angular.module(\"templates-issue_26_withCollapseWhitespaceTrueDefaultQuotes\", [\"../test/fixtures/issue_26.tpl.html\"]);\n\nangular.module(\"../test/fixtures/issue_26.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/issue_26.tpl.html\",\n    \"<div>\\n\" +\n    \"    <div ng-class='\\\"bsp-alert-\\\" + (type || \\\"warning\\\")'></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/issue_26_withCollapseWhitespaceTrueDoubleQuotes.js",
    "content": "angular.module(\"templates-issue_26_withCollapseWhitespaceTrueDoubleQuotes\", [\"../test/fixtures/issue_26.tpl.html\"]);\n\nangular.module(\"../test/fixtures/issue_26.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/issue_26.tpl.html\",\n    \"<div>\\n\" +\n    \"    <div ng-class='\\\"bsp-alert-\\\" + (type || \\\"warning\\\")'></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/issue_26_withCollapseWhitespaceTrueSingleQuotes.js",
    "content": "angular.module('templates-issue_26_withCollapseWhitespaceTrueSingleQuotes', ['../test/fixtures/issue_26.tpl.html']);\n\nangular.module('../test/fixtures/issue_26.tpl.html', []).run(['$templateCache', function($templateCache) {\n  $templateCache.put('../test/fixtures/issue_26.tpl.html',\n    '<div>\\n' +\n    '    <div ng-class=\\'\"bsp-alert-\" + (type || \"warning\")\\'></div>\\n' +\n    '</div>\\n' +\n    '');\n}]);\n"
  },
  {
    "path": "test/expected/issue_26_withoutCollapseWhitespaceDefaultQuotes.js",
    "content": "angular.module(\"templates-issue_26_withoutCollapseWhitespaceDefaultQuotes\", [\"../test/fixtures/issue_26.tpl.html\"]);\n\nangular.module(\"../test/fixtures/issue_26.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/issue_26.tpl.html\",\n    \"<div>\\n\" +\n    \"    <div ng-class='\\\"bsp-alert-\\\" + (type || \\\"warning\\\")'></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/issue_26_withoutCollapseWhitespaceDoubleQuotes.js",
    "content": "angular.module(\"templates-issue_26_withoutCollapseWhitespaceDoubleQuotes\", [\"../test/fixtures/issue_26.tpl.html\"]);\n\nangular.module(\"../test/fixtures/issue_26.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/issue_26.tpl.html\",\n    \"<div>\\n\" +\n    \"    <div ng-class='\\\"bsp-alert-\\\" + (type || \\\"warning\\\")'></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/issue_26_withoutCollapseWhitespaceSingleQuotes.js",
    "content": "angular.module('templates-issue_26_withoutCollapseWhitespaceSingleQuotes', ['../test/fixtures/issue_26.tpl.html']);\n\nangular.module('../test/fixtures/issue_26.tpl.html', []).run(['$templateCache', function($templateCache) {\n  $templateCache.put('../test/fixtures/issue_26.tpl.html',\n    '<div>\\n' +\n    '    <div ng-class=\\'\"bsp-alert-\" + (type || \"warning\")\\'></div>\\n' +\n    '</div>\\n' +\n    '');\n}]);\n"
  },
  {
    "path": "test/expected/module_as_function.js",
    "content": "angular.module(\"NAME_FROM_FUNCTION\", [\"../test/fixtures/one.tpl.html\", \"../test/fixtures/two.tpl.html\"]);\n\nangular.module(\"../test/fixtures/one.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/one.tpl.html\",\n    \"1 2 3\");\n}]);\n\nangular.module(\"../test/fixtures/two.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/two.tpl.html\",\n    \"Testing\");\n}]);\n"
  },
  {
    "path": "test/expected/multi_lines.js",
    "content": "angular.module(\"templates-multi_lines\", [\"../test/fixtures/three.tpl.html\"]);\n\nangular.module(\"../test/fixtures/three.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/three.tpl.html\",\n    \"Multiple\\n\" +\n    \"Lines\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/multi_lines_4spaces.js",
    "content": "angular.module(\"templates-multi_lines_4space\", [\"../test/fixtures/three.tpl.html\"]);\n\nangular.module(\"../test/fixtures/three.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n    $templateCache.put(\"../test/fixtures/three.tpl.html\",\n        \"Multiple\\n\" +\n        \"Lines\\n\" +\n        \"\");\n}]);\n"
  },
  {
    "path": "test/expected/multi_lines_tabs.js",
    "content": "angular.module(\"templates-multi_lines_tabs\", [\"../test/fixtures/three.tpl.html\"]);\n\nangular.module(\"../test/fixtures/three.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n\t$templateCache.put(\"../test/fixtures/three.tpl.html\",\n\t\t\"Multiple\\n\" +\n\t\t\"Lines\\n\" +\n\t\t\"\");\n}]);\n"
  },
  {
    "path": "test/expected/process_all_pug.js",
    "content": "angular.module(\"templates-process_all_pug\", [\"../test/fixtures/process_pug_custom.pug\", \"../test/fixtures/process_pug_with_include.pug\", \"../test/fixtures/process_pug.pug\", \"../test/fixtures/pug_include.pug\"]);\n\nangular.module(\"../test/fixtures/process_pug_custom.pug\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/process_pug_custom.pug\",\n    \"<a href=\\\"href\\\">Great</a>\");\n}]);\n\nangular.module(\"../test/fixtures/process_pug_with_include.pug\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/process_pug_with_include.pug\",\n    \"<h1>I'm an include!</h1>\");\n}]);\n\nangular.module(\"../test/fixtures/process_pug.pug\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/process_pug.pug\",\n    \"<p class=\\\"example\\\">Hello World!</p><div id=\\\"greeting\\\">Nice</div><div id=\\\"watch\\\">test</div>\");\n}]);\n\nangular.module(\"../test/fixtures/pug_include.pug\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/pug_include.pug\",\n    \"<h1>I'm an include!</h1>\");\n}]);\n"
  },
  {
    "path": "test/expected/process_all_pug_after_change.js",
    "content": "angular.module(\"templates-process_all_pug\", [\"../test/fixtures/process_pug_custom.pug\", \"../test/fixtures/process_pug_with_include.pug\", \"../test/fixtures/process_pug.pug\", \"../test/fixtures/pug_include.pug\"]);\n\nangular.module(\"../test/fixtures/process_pug_custom.pug\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/process_pug_custom.pug\",\n    \"<a href=\\\"href\\\">Great</a>\");\n}]);\n\nangular.module(\"../test/fixtures/process_pug_with_include.pug\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/process_pug_with_include.pug\",\n    \"<h1>I'm an include!</h1>\");\n}]);\n\nangular.module(\"../test/fixtures/process_pug.pug\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/process_pug.pug\",\n    \"<p class=\\\"example\\\">Hello World!</p><div id=\\\"greeting\\\">Nice</div><div id=\\\"watch\\\">test</div>\");\n}]);\n\nangular.module(\"../test/fixtures/pug_include.pug\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/pug_include.pug\",\n    \"<h1>I'm an include!</h1>\");\n}]);\n"
  },
  {
    "path": "test/expected/process_function.js",
    "content": "angular.module(\"templates-process_function\", [\"../test/fixtures/process_function.tpl.html\"]);\n\nangular.module(\"../test/fixtures/process_function.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/process_function.tpl.html\",\n    \"<h1> 1 </h1>\\n\" +\n    \"<h2> 2 </h2>\\n\" +\n    \"<h3> 3 </h3>\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/process_pug.js",
    "content": "angular.module(\"templates-process_pug\", [\"../test/fixtures/process_pug.pug\"]);\n\nangular.module(\"../test/fixtures/process_pug.pug\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/process_pug.pug\",\n    \"<p class=\\\"example\\\">Hello World!</p>\\n\" +\n    \"<div id=\\\"greeting\\\">Nice</div>\");\n}]);\n"
  },
  {
    "path": "test/expected/process_pug_custom.js",
    "content": "angular.module(\"templates-process_pug_custom\", [\"../test/fixtures/process_pug_custom.pug\"]);\n\nangular.module(\"../test/fixtures/process_pug_custom.pug\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/process_pug_custom.pug\",\n    \"<a href>Great</a>\");\n}]);\n"
  },
  {
    "path": "test/expected/process_pug_with_include.js",
    "content": "angular.module(\"templates-process_pug_with_include\", [\"../test/fixtures/process_pug_with_include.pug\"]);\n\nangular.module(\"../test/fixtures/process_pug_with_include.pug\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/process_pug_with_include.pug\",\n    \"<h1>I'm an include!</h1>\");\n}]);\n"
  },
  {
    "path": "test/expected/process_template.js",
    "content": "angular.module(\"templates-process_template\", [\"../test/fixtures/process_template.tpl.html\"]);\n\nangular.module(\"../test/fixtures/process_template.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/process_template.tpl.html\",\n    \"<h1> Main Title </h1>\\n\" +\n    \"<h2> Subtitle with {{ interpolation }} </h2>\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/regex_in_template.js",
    "content": "angular.module(\"templates-regex_in_template\", [\"../test/fixtures/pattern.tpl.html\"]);\n\nangular.module(\"../test/fixtures/pattern.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/pattern.tpl.html\",\n    \"<form>\\n\" +\n    \"<span class=\\\"registration-error\\\" ng-show=\\\"regForm.password.$error.pattern\\\">- Fail to match..</span>\\n\" +\n    \"<input type=\\\"password\\\" ng-model=\\\"registerForm.password\\\" name=\\\"password\\\" ng-pattern=\\\"/^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[\\\\d\\\\W]).*$/\\\"  required/>\\n\" +\n    \"</form>\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/rename.js",
    "content": "angular.module(\"templates-rename\", [\"../test/fixtures/one.tpl\", \"../test/fixtures/two.tpl\"]);\n\nangular.module(\"../test/fixtures/one.tpl\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/one.tpl\",\n    \"1 2 3\");\n}]);\n\nangular.module(\"../test/fixtures/two.tpl\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/two.tpl\",\n    \"Testing\");\n}]);\n"
  },
  {
    "path": "test/expected/single_module.coffee",
    "content": "angular.module(\"templates-single_module_coffee\", []).run([\"$templateCache\", ($templateCache) ->\n  $templateCache.put(\"../test/fixtures/one.tpl.html\",\n    \"1 2 3\")\n  $templateCache.put(\"../test/fixtures/three.tpl.html\",\n    \"Multiple\\n\" +\n    \"Lines\\n\" +\n    \"\")\n])\n"
  },
  {
    "path": "test/expected/single_module.js",
    "content": "angular.module(\"templates-single_module\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/one.tpl.html\",\n    \"1 2 3\");\n  $templateCache.put(\"../test/fixtures/three.tpl.html\",\n    \"Multiple\\n\" +\n    \"Lines\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/single_module_strict.js",
    "content": "angular.module(\"templates-single_module_strict\", []).run([\"$templateCache\", function($templateCache) {\n  \"use strict\";\n  $templateCache.put(\"../test/fixtures/one.tpl.html\",\n    \"1 2 3\");\n  $templateCache.put(\"../test/fixtures/three.tpl.html\",\n    \"Multiple\\n\" +\n    \"Lines\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/expected/single_quotes.js",
    "content": "angular.module('templates-single_quotes', ['../test/fixtures/four.tpl.html']);\n\nangular.module('../test/fixtures/four.tpl.html', []).run(['$templateCache', function($templateCache) {\n  $templateCache.put('../test/fixtures/four.tpl.html',\n    'This data is \"in quotes\"\\n' +\n    'And this data is \\'in single quotes\\'\\n' +\n    '');\n}]);\n"
  },
  {
    "path": "test/expected/strict_mode.js",
    "content": "angular.module(\"templates-strict_mode\", [\"../test/fixtures/one.tpl.html\"]);\n\nangular.module(\"../test/fixtures/one.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  \"use strict\";\n  $templateCache.put(\"../test/fixtures/one.tpl.html\",\n    \"1 2 3\");\n}]);\n"
  },
  {
    "path": "test/expected/template_path_in_comment.js",
    "content": "angular.module(\"templates-template_path_in_comment\", [\"../test/fixtures/three.tpl.html\"]);\n\nangular.module(\"../test/fixtures/three.tpl.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"../test/fixtures/three.tpl.html\",\n    \"<!-- template: test/fixtures/three.tpl.html -->\\n\" +\n    \"Multiple\\n\" +\n    \"Lines\\n\" +\n    \"\");\n}]);\n"
  },
  {
    "path": "test/fixtures/broken_newlines.tpl.html",
    "content": "abc\r\r\ndef"
  },
  {
    "path": "test/fixtures/custom_attribute_collapse.tpl.html",
    "content": "<div\n        my-style=\"\n            background-color: red;\n            font-size: large;\"\n></div>\n"
  },
  {
    "path": "test/fixtures/empty_attribute.tpl.html",
    "content": "<div ui-view></div>\n"
  },
  {
    "path": "test/fixtures/five.tpl.html",
    "content": "<div class=\"quotes should be escaped\">\n  <span>\n    <span>\n      <span>\n        Lorem ipsum\n      </span>\n    </span>\n  </span>\n</div>\n"
  },
  {
    "path": "test/fixtures/four.tpl.html",
    "content": "This data is \"in quotes\"\nAnd this data is 'in single quotes'\n"
  },
  {
    "path": "test/fixtures/issue_26.tpl.html",
    "content": "<div>\n    <div ng-class='\"bsp-alert-\" + (type || \"warning\")'></div>\n</div>\n"
  },
  {
    "path": "test/fixtures/one.tpl.html",
    "content": "1 2 3"
  },
  {
    "path": "test/fixtures/pattern.tpl.html",
    "content": "<form>\n<span class=\"registration-error\" ng-show=\"regForm.password.$error.pattern\">- Fail to match..</span>\n<input type=\"password\" ng-model=\"registerForm.password\" name=\"password\" ng-pattern=\"/^.*(?=.{8,})(?=.*[a-z])(?=.*[A-Z])(?=.*[\\d\\W]).*$/\"  required/>\n</form>\n"
  },
  {
    "path": "test/fixtures/process_function.tpl.html",
    "content": "<h1> (ONE) </h1>\n<h2> (TWO) </h2>\n<h3> (THREE) </h3>\n"
  },
  {
    "path": "test/fixtures/process_pug.pug",
    "content": "p.example Hello World!\n#greeting Nice\n"
  },
  {
    "path": "test/fixtures/process_pug_custom.pug",
    "content": "a(href) Great\n"
  },
  {
    "path": "test/fixtures/process_pug_with_include.pug",
    "content": "include ./pug_include\n"
  },
  {
    "path": "test/fixtures/process_template.tpl.html",
    "content": "<h1> <%= html2js.process_template.testMessages.title %> </h1>\n<h2> <%= html2js.process_template.testMessages.subtitle %> </h2>\n"
  },
  {
    "path": "test/fixtures/pug_include.pug",
    "content": "h1 I'm an include!\n"
  },
  {
    "path": "test/fixtures/three.tpl.html",
    "content": "Multiple\nLines\n"
  },
  {
    "path": "test/fixtures/two.tpl.html",
    "content": "Testing"
  },
  {
    "path": "test/html2js_test.js",
    "content": "'use strict';\n\nvar grunt = require('grunt');\n\n/*\n ======== A Handy Little Nodeunit Reference ========\n https://github.com/caolan/nodeunit\n\n Test methods:\n test.expect(numAssertions)\n test.done()\n Test assertions:\n test.ok(value, [message])\n test.equal(actual, expected, [message])\n test.notEqual(actual, expected, [message])\n test.deepEqual(actual, expected, [message])\n test.notDeepEqual(actual, expected, [message])\n test.strictEqual(actual, expected, [message])\n test.notStrictEqual(actual, expected, [message])\n test.throws(block, [error], [message])\n test.doesNotThrow(block, [error], [message])\n test.ifError(value)\n */\n\nvar strContext = function (s, pos, size) {\n  var start = pos - size > 0 ? pos - size : 0;\n  var end = pos + size < s.length ? pos + size : pos.length;\n  return s.substring(start, end);\n};\n\nvar assertFileContentsEqual = function (test, actualFile, expectedFile, message) {\n\n  var actual = grunt.file.read(actualFile);\n  var expected = grunt.util.normalizelf(grunt.file.read(expectedFile));\n\n  var i, pos = null;\n  for (i = 0; i < expected.length - 1; i++) {\n    if (actual.charAt(i) !== expected.charAt(i)) {\n      pos = i;\n      break;\n    }\n  }\n  if (pos !== null) {\n    message += ' at character ' + i + ': ' + strContext(actual, pos, 5);\n  }\n\n  test.equal(actual, expected, message);\n};\n\nvar assertFileDoesNotExist = function (test, unexpectedFile, message) {\n  test.equal(false, grunt.file.exists(unexpectedFile), message);\n};\n\nexports.html2js = {\n\n  setUp: function (done) {\n    // setup here if necessary\n    done();\n  },\n\n  amd_module: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/amd_module.js',\n      'test/expected/amd_module.js',\n      'expected use of amd module');\n\n    test.done();\n  },\n  amd_module_custom_prefix: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/amd_module_custom_prefix.js',\n      'test/expected/amd_module_custom_prefix.js',\n      'expected use of amd module with custom prefix');\n\n    test.done();\n  },\n  amd_module_custom_suffix: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/amd_module_custom_suffix.js',\n      'test/expected/amd_module_custom_suffix.js',\n      'expected use of amd module with custom suffix');\n\n    test.done();\n  },\n  broken_newlines: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/broken_newlines.js',\n      'test/expected/broken_newlines.js',\n      'expected correct newlines');\n\n    test.done();\n  },\n  coffee: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/coffee.coffee',\n      'test/expected/coffee.coffee',\n      'expected compiled template module');\n\n    test.done();\n  },\n  compact_format_custom_options: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/compact_format_custom_options.js',\n      'test/expected/compact_format_custom_options.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  compact_format_default_options: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/compact_format_default_options.js',\n      'test/expected/compact_format_default_options.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  custom_attribute_collapsed: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/custom_attribute_collapsed.js',\n      'test/expected/custom_attribute_collapsed.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  custom_attribute_not_collapsed: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/custom_attribute_not_collapsed.js',\n      'test/expected/custom_attribute_not_collapsed.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  double_quotes: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/double_quotes.js',\n      'test/expected/double_quotes.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  empty_attribute: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/empty_attribute.js',\n      'test/expected/empty_attribute.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  empty_module: function (test) {\n    test.expect(1);\n\n    assertFileDoesNotExist(test, 'tmp/empty_module.js',\n      'test/expected/empty_module.js',\n      'expected empty module');\n\n    test.done();\n  },\n  existing_module: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/existing_module.js',\n      'test/expected/existing_module.js',\n      'expected use of existing module');\n\n    test.done();\n\n  },\n  file_footer: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/file_footer.js',\n      'test/expected/file_footer.js',\n      'expected compiled template module with footer');\n\n    test.done();\n  },\n  file_header: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/file_header.js',\n      'test/expected/file_header.js',\n      'expected compiled template module with header');\n\n    test.done();\n  },\n  file_header_footer: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/file_header_footer.js',\n      'test/expected/file_header_footer.js',\n      'expected compiled template module with header and footer');\n\n    test.done();\n  },\n  files_array_custom_options: function (test) {\n    test.expect(2);\n\n    assertFileContentsEqual(test, 'tmp/files_array_custom_options_1.js',\n      'test/expected/files_array_custom_options_1.js',\n      'expected compiled template module');\n\n    assertFileContentsEqual(test, 'tmp/files_array_custom_options_2.js',\n      'test/expected/files_array_custom_options_2.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  files_array_default_options: function (test) {\n    test.expect(2);\n\n    assertFileContentsEqual(test, 'tmp/files_array_default_options_1.js',\n      'test/expected/files_array_default_options_1.js',\n      'expected compiled template module');\n\n    assertFileContentsEqual(test, 'tmp/files_array_default_options_2.js',\n      'test/expected/files_array_default_options_2.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  files_object_custom_options: function (test) {\n    test.expect(2);\n\n    assertFileContentsEqual(test, 'tmp/files_object_custom_options_1.js',\n      'test/expected/files_object_custom_options_1.js',\n      'expected compiled template module');\n\n    assertFileContentsEqual(test, 'tmp/files_object_custom_options_2.js',\n      'test/expected/files_object_custom_options_2.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  files_object_default_options: function (test) {\n    test.expect(2);\n\n    assertFileContentsEqual(test, 'tmp/files_object_default_options_1.js',\n      'test/expected/files_object_default_options_1.js',\n      'expected compiled template module');\n\n    assertFileContentsEqual(test, 'tmp/files_object_default_options_2.js',\n      'test/expected/files_object_default_options_2.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  htmlmin: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/htmlmin.js',\n      'test/expected/htmlmin.js',\n      'expected minified template');\n\n    test.done();\n  },\n  issue_26_withCollapseWhitespaceFalseDefaultQuotes: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/issue_26_withCollapseWhitespaceFalseDefaultQuotes.js',\n      'test/expected/issue_26_withCollapseWhitespaceFalseDefaultQuotes.js',\n      'expected issue 26 with whitespace collapse false and default quotes'\n    );\n\n    test.done();\n  },\n  issue_26_withCollapseWhitespaceFalseDoubleQuotes: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/issue_26_withCollapseWhitespaceFalseDoubleQuotes.js',\n      'test/expected/issue_26_withCollapseWhitespaceFalseDoubleQuotes.js',\n      'expected issue 26 with whitespace collapse false and Double quotes'\n    );\n\n    test.done();\n  },\n  issue_26_withCollapseWhitespaceFalseSingleQuotes: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/issue_26_withCollapseWhitespaceFalseSingleQuotes.js',\n      'test/expected/issue_26_withCollapseWhitespaceFalseSingleQuotes.js',\n      'expected issue 26 with whitespace collapse false and Single quotes'\n    );\n\n    test.done();\n  },\n  issue_26_withCollapseWhitespaceTrueDefaultQuotes: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/issue_26_withCollapseWhitespaceTrueDefaultQuotes.js',\n      'test/expected/issue_26_withCollapseWhitespaceTrueDefaultQuotes.js',\n      'expected issue 26 with whitespace collapse true and default quotes'\n    );\n\n    test.done();\n  },\n  issue_26_withCollapseWhitespaceTrueDoubleQuotes: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/issue_26_withCollapseWhitespaceTrueDoubleQuotes.js',\n      'test/expected/issue_26_withCollapseWhitespaceTrueDoubleQuotes.js',\n      'expected issue 26 with whitespace collapse true and Double quotes'\n    );\n\n    test.done();\n  },\n  issue_26_withCollapseWhitespaceTrueSingleQuotes: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/issue_26_withCollapseWhitespaceTrueSingleQuotes.js',\n      'test/expected/issue_26_withCollapseWhitespaceTrueSingleQuotes.js',\n      'expected issue 26 with whitespace collapse true and Single quotes'\n    );\n\n    test.done();\n  },\n  issue_26_withoutCollapseWhitespaceDefaultQuotes: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/issue_26_withoutCollapseWhitespaceDefaultQuotes.js',\n      'test/expected/issue_26_withoutCollapseWhitespaceDefaultQuotes.js',\n      'expected issue 26 without whitespace collapse and default quotes'\n    );\n\n    test.done();\n  },\n  issue_26_withoutCollapseWhitespaceDoubleQuotes: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/issue_26_withoutCollapseWhitespaceDoubleQuotes.js',\n      'test/expected/issue_26_withoutCollapseWhitespaceDoubleQuotes.js',\n      'expected issue 26 without whitespace collapse and Double quotes'\n    );\n\n    test.done();\n  },\n  issue_26_withoutCollapseWhitespaceSingleQuotes: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/issue_26_withoutCollapseWhitespaceSingleQuotes.js',\n      'test/expected/issue_26_withoutCollapseWhitespaceSingleQuotes.js',\n      'expected issue 26 without whitespace collapse and Single quotes'\n    );\n\n    test.done();\n  },\n  issue_76_missingSourceFile: function(test){\n    // @todo Not exactly sure what should go in here!\n    test.expect(0);\n    test.done();\n  },\n  issue_76_missingSourceFiles: function(test){\n    // @todo Not exactly sure what should go in here!\n    test.expect(0);\n    test.done();\n  },\n  issue_76_missingSourceFilesFirst: function(test){\n    // @todo Not exactly sure what should go in here!\n    test.expect(0);\n    test.done();\n  },\n  issue_76_missingSourceFilesLast: function(test){\n    // @todo Not exactly sure what should go in here!\n    test.expect(0);\n    test.done();\n  },\n  issue_76_missingSourceFilesMiddle: function(test){\n    // @todo Not exactly sure what should go in here!\n    test.expect(0);\n    test.done();\n  },\n  module_as_function: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/module_as_function.js',\n      'test/expected/module_as_function.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  multi_lines: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/multi_lines.js',\n      'test/expected/multi_lines.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  multi_lines_4spaces: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/multi_lines_4spaces.js',\n      'test/expected/multi_lines_4spaces.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  multi_lines_tabs: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/multi_lines_tabs.js',\n      'test/expected/multi_lines_tabs.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  process_all_pug: function (test) {\n    test.expect(1);\n\n    // This test is run with options.watch on\n    // We need to edit a fixture file to make sure it is watched and re-compiled\n    var file2Change = 'test/fixtures/process_pug.pug';\n    var contents = grunt.file.read(file2Change);\n    var newContents = contents + '\\n#watch test';\n\n    // Write edited fixture file\n    grunt.file.write(file2Change, grunt.util.normalizelf(newContents));\n\n    // wait for the watch-change to process\n    setTimeout(function () {\n      // Check re-compiled with changes were added\n      assertFileContentsEqual(test, 'tmp/process_all_pug.js',\n        'test/expected/process_all_pug_after_change.js',\n        'expected pug template to be processed with custom options');\n\n      //reset fixture file to original contents\n      grunt.file.write(file2Change, grunt.util.normalizelf(contents));\n      test.done();\n    }, 1500);\n  },\n  process_function: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/process_function.js',\n      'test/expected/process_function.js',\n      'expected grunt templates to be processed by a custom function');\n\n    test.done();\n  },\n  process_pug: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/process_pug.js',\n      'test/expected/process_pug.js',\n      'expected pug template to be processed');\n\n    test.done();\n  },\n  process_pug_custom: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/process_pug_custom.js',\n      'test/expected/process_pug_custom.js',\n      'expected pug template to be processed with custom options');\n\n    test.done();\n  },\n  process_pug_with_include: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/process_pug_with_include.js',\n      'test/expected/process_pug_with_include.js',\n      'expected pug template to be processed with custom options');\n\n    test.done();\n  },\n  process_template: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/process_template.js',\n      'test/expected/process_template.js',\n      'expected grunt templates to be processed');\n\n    test.done();\n  },\n  regex_in_template: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/regex_in_template.js',\n      'test/expected/regex_in_template.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  rename: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/rename.js',\n      'test/expected/rename.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  single_module: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/single_module.js',\n      'test/expected/single_module.js',\n      'expected template with single module');\n\n    test.done();\n  },\n  single_module_coffee: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/single_module.coffee',\n      'test/expected/single_module.coffee',\n      'expected coffee template with single module');\n\n    test.done();\n\n  },\n  single_module_strict: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/single_module_strict.js',\n      'test/expected/single_module_strict.js',\n      'expected template with single strict module');\n\n    test.done();\n  },\n  single_quotes: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/single_quotes.js',\n      'test/expected/single_quotes.js',\n      'expected compiled template module');\n\n    test.done();\n  },\n  strict_mode: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/strict_mode.js',\n      'test/expected/strict_mode.js',\n      'expected strict mode in templates');\n\n    test.done();\n  },\n  template_path_in_comment: function (test) {\n    test.expect(1);\n\n    assertFileContentsEqual(test, 'tmp/template_path_in_comment.js',\n      'test/expected/template_path_in_comment.js',\n      'expected template path in comment');\n\n    test.done();\n  }\n};\n"
  }
]