namespace :ext do

    rootdir = Pathname('extensions')

    desc 'Build Chrome Extension'
    task chrome: 'chrome:build'

    namespace :chrome do
      dist   = Pathname('dist/crx')
      extdir = rootdir.join(dist)
      manifest_json = rootdir.join('chrome/manifest.json')

      directory extdir

      task build: [ extdir, 'lib:templates' ] do
        cd rootdir do
          cp_r [ 'img/', 'tmp/lib/' ], dist
          %x`cd chrome && git ls-files`.split("\n").each do |src|
            dest = dist.join(src)
            mkdir_p dest.dirname
            cp Pathname('chrome').join(src), dest
          end
        end
      end

      # Generate a .crx file.
      task crx: [ :build, :npm ] do
        out = "crx-web-console-#{JSON.parse(File.read(manifest_json))["version"]}.crx"
        cd(extdir) { sh "node \"$(npm bin)/crx\" pack ./ -p ../crx-web-console.pem -o ../#{out}" }
      end

      # Generate a .zip file for Chrome Web Store.
      task zip: [ :build ] do
        version = JSON.parse(File.read(manifest_json))["version"]
        cd(extdir) { sh "zip -r ../crx-web-console-#{version}.zip ./" }
      end

      desc 'Launch a browser with the chrome extension.'
      task run: [ :build ] do
        cd(rootdir) { sh "sh ./script/run_chrome.sh --load-extension=#{dist}" }
      end
    end

    task :npm do
      cd(rootdir) { sh "npm install --silent" }
    end

    namespace :lib do
      templates = Pathname('lib/web_console/templates')
      tmplib    = rootdir.join('tmp/lib/')
      js_erb    = FileList.new(templates.join('**/*.js.erb'))
      dirs      = js_erb.pathmap("%{^#{templates},#{tmplib}}d")

      task templates: dirs + js_erb.pathmap("%{^#{templates},#{tmplib}}X")

      dirs.each { |d| directory d }
      rule '.js' => [ "%{^#{tmplib},#{templates}}X.js.erb" ] do |t|
        File.write(t.name, WebConsole::Testing::ERBPrecompiler.new(t.source).build)
      end
    end

end