[
  {
    "path": ".gitignore",
    "content": "Gemfile.lock\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: ruby\nrvm:\n  - 2.3.1\ngemfile:\n  - Gemfile\n"
  },
  {
    "path": "Gemfile",
    "content": "source 'https://rubygems.org'\ngemspec\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2014 Joshua Peek\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\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 OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Sprockets ES6\n\n**Experimental**\n\nA Sprockets transformer that converts ES6 code into vanilla ES5 with [Babel JS](https://babeljs.io).\n\n## Usage\n\n``` ruby\n# Gemfile\ngem 'sprockets', '>= 3.0.0'\ngem 'sprockets-es6'\n```\n\n\n``` ruby\n# application.rb\n# [...]\nrequire \"action_view/railtie\"\nrequire \"sprockets/railtie\"\n# require \"rails/test_unit/railtie\"\nrequire 'sprockets/es6'\n# [...]\n```\n\n``` js\n// app.es6\n\nlet square = (x) => x * x\n\nclass Animal {\n  constructor(name) {\n    this.name = name\n  }\n}\n```\n\n## Releases\n\nThis plugin is primarily experimental and will never reach a stable 1.0. The\npurpose is to test out BabelJS features on Sprockets 3.x and include it by default\nin Sprockets 4.x.\n\n## Asset manifests required for precompiling\n\n`.es6` won't work directly with `config.assets.precompile = %w( foo.es6 )` for annoying compatibility reasons with Sprockets 2.x. Besides, you should look into moving away from `config.assets.precompile` and using manifests instead. See [Sprockets 3.x UPGRADING guide](https://github.com/rails/sprockets/blob/master/UPGRADING.md#preference-for-asset-manifest-and-links).\n"
  },
  {
    "path": "Rakefile",
    "content": "require 'rake/testtask'\n\ntask :default => :test\n\nRake::TestTask.new do |t|\n  t.libs << 'test'\n  t.warning = true\nend\n"
  },
  {
    "path": "lib/sprockets/es6/version.rb",
    "content": "module Sprockets\n  class ES6\n    VERSION = '0.9.2'\n  end\nend\n"
  },
  {
    "path": "lib/sprockets/es6.rb",
    "content": "require 'babel/transpiler'\nrequire 'sprockets'\nrequire 'sprockets/es6/version'\nrequire 'ostruct'\n\nmodule Sprockets\n  class ES6\n\n    class << self\n\n      attr_accessor :configuration\n\n      def configuration_hash\n        configuration.to_h.reduce({}) do |hash, (key, val)|\n          hash[key.to_s] = val\n          hash\n        end\n      end\n\n      def instance\n        @instance ||= new\n      end\n\n      def configure\n        self.configuration ||= OpenStruct.new\n        yield configuration\n      end\n\n      def reset_configuration\n        self.configuration = OpenStruct.new\n      end\n\n      def call(input)\n        instance.call(input)\n      end\n\n      def cache_key\n        instance.cache_key\n      end\n\n    end\n\n    attr_reader :cache_key\n\n    def configuration_hash\n      self.class.configuration_hash\n    end\n\n    def initialize(options = {})\n      @options = configuration_hash.merge(options).freeze\n\n      @cache_key = [\n        self.class.name,\n        Babel::Transpiler.version,\n        Babel::Transpiler.source_version,\n        VERSION,\n        @options\n      ].freeze\n    end\n\n    def call(input)\n      data = input[:data]\n      result = input[:cache].fetch(@cache_key + [input[:filename]] + [data]) do\n        transform(data, transformation_options(input))\n      end\n      result['code']\n    end\n\n    def transform(data, opts)\n      Babel::Transpiler.transform(data, opts)\n    end\n\n    def transformation_options(input)\n      opts = {\n        'sourceRoot' => input[:load_path],\n        'moduleRoot' => nil,\n        'filename' => input[:filename],\n        'filenameRelative' => input[:environment].split_subpath(input[:load_path], input[:filename])\n      }.merge(@options)\n\n      if opts['moduleIds'] && opts['moduleRoot']\n        opts['moduleId'] ||= File.join(opts['moduleRoot'], input[:name])\n      elsif opts['moduleIds']\n        opts['moduleId'] ||= input[:name]\n      end\n\n      opts\n    end\n\n  end\n\n  append_path Babel::Transpiler.source_path\n  \n  if respond_to?(:register_transformer)\n    register_mime_type 'text/ecmascript-6', extensions: ['.es6'], charset: :unicode\n    register_transformer 'text/ecmascript-6', 'application/javascript', ES6\n    register_preprocessor 'text/ecmascript-6', DirectiveProcessor\n  end\n  \n  if respond_to?(:register_engine)\n    args = ['.es6', ES6]\n    args << { mime_type: 'text/ecmascript-6', silence_deprecation: true } if Sprockets::VERSION.start_with?(\"3\")\n    register_engine(*args)\n  end\n\nend\n"
  },
  {
    "path": "sprockets-es6.gemspec",
    "content": "$:.unshift File.expand_path(\"../lib\", __FILE__)\nrequire 'sprockets/es6/version'\n\nGem::Specification.new do |s|\n  s.name    = 'sprockets-es6'\n  s.version = Sprockets::ES6::VERSION\n\n  s.homepage    = \"https://github.com/TannerRogalsky/sprockets-es6\"\n  s.summary     = \"Sprockets ES6 transformer\"\n  s.description = <<-EOS\n    A Sprockets transformer that converts ES6 code into vanilla ES5 with Babel JS.\n  EOS\n  s.license = \"MIT\"\n\n  s.files = [\n    'lib/sprockets/es6.rb',\n    'lib/sprockets/es6/version.rb',\n    'LICENSE',\n    'README.md'\n  ]\n\n  s.add_dependency 'babel-transpiler'\n  s.add_dependency 'babel-source', '>= 5.8.11'\n  s.add_dependency 'sprockets', '>= 3.0.0'\n  s.add_development_dependency 'rake'\n  s.add_development_dependency 'minitest'\n\n  s.authors = ['Joshua Peek']\n  s.email   = 'josh@joshpeek.com'\nend\n"
  },
  {
    "path": "test/fixtures/file.js.es6",
    "content": "var square = (n) => n * n\n"
  },
  {
    "path": "test/fixtures/math.es6",
    "content": "var square = (n) => n * n\n"
  },
  {
    "path": "test/fixtures/mod.es6.erb",
    "content": "import \"foo\";\n"
  },
  {
    "path": "test/fixtures/mod2.es6",
    "content": "import \"foo\";\n"
  },
  {
    "path": "test/fixtures/require_asset.js.erb",
    "content": "<% require_asset \"file.js.es6\" %>\n"
  },
  {
    "path": "test/test_es6.rb",
    "content": "require 'minitest/autorun'\nrequire 'sprockets'\nrequire 'sprockets/es6'\n\nclass TestES6 < MiniTest::Test\n  def setup\n    @env = Sprockets::Environment.new\n    @env.append_path File.expand_path(\"../fixtures\", __FILE__)\n  end\n\n  def test_require_asset\n    assert asset = @env[\"require_asset\"]\n    assert_equal 'application/javascript', asset.content_type\n    assert_equal <<-JS.chomp, asset.to_s.strip\n\"use strict\";\n\nvar square = function square(n) {\n  return n * n;\n};\n    JS\n  end\n\n  def test_transform_arrow_function\n    assert asset = @env[\"math.js\"]\n    assert_equal 'application/javascript', asset.content_type\n    assert_equal <<-JS.chomp, asset.to_s.strip\n\"use strict\";\n\nvar square = function square(n) {\n  return n * n;\n};\n    JS\n  end\n\n  def test_common_modules\n    register Sprockets::ES6.new('modules' => 'common')\n    assert asset = @env[\"mod.js\"]\n    assert_equal 'application/javascript', asset.content_type\n    assert_equal <<-JS.chomp, asset.to_s.strip\n\"use strict\";\n\nrequire(\"foo\");\n    JS\n  end\n\n  def test_amd_modules\n    register Sprockets::ES6.new('modules' => 'amd')\n    assert asset = @env[\"mod.js\"]\n    assert_equal 'application/javascript', asset.content_type\n    assert_equal <<-JS.chomp, asset.to_s.strip\ndefine([\"exports\", \"foo\"], function (exports, _foo) {\n  \"use strict\";\n});\n    JS\n  end\n\n  def test_amd_modules_with_ids\n    register Sprockets::ES6.new('modules' => 'amd', 'moduleIds' => true)\n    assert asset = @env[\"mod.js\"]\n    assert_equal 'application/javascript', asset.content_type\n    assert_equal <<-JS.chomp, asset.to_s.strip\ndefine(\"mod\", [\"exports\", \"foo\"], function (exports, _foo) {\n  \"use strict\";\n});\n    JS\n  end\n\n  def test_amd_modules_with_ids_and_root\n    register Sprockets::ES6.new('modules' => 'amd', 'moduleIds' => true, 'moduleRoot' => 'root')\n    assert asset = @env[\"mod.js\"]\n    assert_equal 'application/javascript', asset.content_type\n    assert_equal <<-JS.chomp, asset.to_s.strip\ndefine(\"root/mod\", [\"exports\", \"foo\"], function (exports, _foo) {\n  \"use strict\";\n});\n    JS\n  end\n\n  def test_system_modules\n    register Sprockets::ES6.new('modules' => 'system')\n    assert asset = @env[\"mod.js\"]\n    assert_equal 'application/javascript', asset.content_type\n    assert_equal <<-JS.chomp, asset.to_s.strip\nSystem.register([\"foo\"], function (_export) {\n  \"use strict\";\n\n  return {\n    setters: [function (_foo) {}],\n    execute: function () {}\n  };\n});\n    JS\n  end\n\n  def test_system_modules_with_ids\n    register Sprockets::ES6.new('modules' => 'system', 'moduleIds' => true)\n    assert asset = @env[\"mod.js\"]\n    assert_equal 'application/javascript', asset.content_type\n    assert_equal <<-JS.chomp, asset.to_s.strip\nSystem.register(\"mod\", [\"foo\"], function (_export) {\n  \"use strict\";\n\n  return {\n    setters: [function (_foo) {}],\n    execute: function () {}\n  };\n});\n    JS\n  end\n\n  def test_system_modules_with_ids_and_root\n    register Sprockets::ES6.new('modules' => 'system', 'moduleIds' => true, 'moduleRoot' => 'root')\n    assert asset = @env[\"mod.js\"]\n    assert_equal 'application/javascript', asset.content_type\n    assert_equal <<-JS.chomp, asset.to_s.strip\nSystem.register(\"root/mod\", [\"foo\"], function (_export) {\n  \"use strict\";\n\n  return {\n    setters: [function (_foo) {}],\n    execute: function () {}\n  };\n});\n    JS\n  end\n\n  def test_caching_takes_filename_into_account\n    register Sprockets::ES6.new('modules' => 'system', 'moduleIds' => true, 'moduleRoot' => 'root')\n    mod1 = @env[\"mod.js\"]\n    mod2 = @env[\"mod2.js\"]\n    assert_equal <<-JS.chomp, mod1.to_s.strip\nSystem.register(\"root/mod\", [\"foo\"], function (_export) {\n  \"use strict\";\n\n  return {\n    setters: [function (_foo) {}],\n    execute: function () {}\n  };\n});\n    JS\n    assert_equal <<-JS.chomp, mod2.to_s.strip\nSystem.register(\"root/mod2\", [\"foo\"], function (_export) {\n  \"use strict\";\n\n  return {\n    setters: [function (_foo) {}],\n    execute: function () {}\n  };\n});\n    JS\n  end\n\n  def test_class_level_transformation_configuration\n    Sprockets::ES6.configure do |config|\n      config.modules = 'amd'\n      config.moduleIds = true\n    end\n    processor = Sprockets::ES6.new\n\n    mock_env = OpenStruct.new\n    def mock_env.split_subpath(*args)\n      nil\n    end\n\n    transformation_options = processor.transformation_options(\n      :environment => mock_env\n    )\n    assert_equal transformation_options['modules'], 'amd'\n    assert transformation_options['moduleIds']\n    Sprockets::ES6.reset_configuration\n  end\n\n  def test_cache_key\n    assert Sprockets::ES6.cache_key\n\n    amd_processor_1 = Sprockets::ES6.new('modules' => 'amd')\n    amd_processor_2 = Sprockets::ES6.new('modules' => 'amd')\n    assert_equal amd_processor_1.cache_key, amd_processor_2.cache_key\n\n    system_processor = Sprockets::ES6.new('modules' => 'system')\n    refute_equal amd_processor_1.cache_key, system_processor.cache_key\n  end\n\n  def register(processor)\n    @env.register_transformer 'text/ecmascript-6', 'application/javascript', processor\n  end\nend\n"
  }
]