diff --git a/.gitignore b/.gitignore index a032922..0c2a594 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,7 @@ /doc/ /pkg/ /tmp/ +/test/dummy/tmp/ +/test/dummy/log/ +node_modules +*.log \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..bd6a0ea --- /dev/null +++ b/.travis.yml @@ -0,0 +1,21 @@ +sudo: false +language: ruby +script: 'bundle exec rake' + +rvm: + - 2.2.5 + +env: + - TRAVIS_NODE_VERSION='6.8.1' + +before_install: + - gem install bundler -v 1.12.5 + - rm -rf ~/.nvm && git clone https://github.com/creationix/nvm.git ~/.nvm && (cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`) && source ~/.nvm/nvm.sh && nvm install $TRAVIS_NODE_VERSION + - npm install + +notifications: + email: + recipients: + - mail@tomascelizna.com + on_failure: change + on_success: never diff --git a/Gemfile b/Gemfile index 3d70a1b..f99f6b8 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,6 @@ -source "https://rubygems.org" +source 'https://rubygems.org' # Specify your gem's dependencies in cssm-rails.gemspec gemspec + +gem 'rb-readline' diff --git a/README.md b/README.md index ea2922d..64f5537 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,12 @@ # CSS Modules for Rails +[![Build Status](https://travis-ci.org/tomasc/cssm-rails.svg)](https://travis-ci.org/tomasc/cssm-rails) [![Gem Version](https://badge.fury.io/rb/cssm-rails.svg)](http://badge.fury.io/rb/cssm-rails) + +A Rails (Sprockets) wrapper on CSS Modules (respective the [CSS Module Loader Core](https://github.com/css-modules/css-modules-loader-core)). +It is a minimal and slightly naïve implementation at the moment (for example calling `node` command directly via command-line). Pull requests are more than welcome. + +**A current drawback of an implementation of CSS Modules in Rails is, that it makes views dependent on stylesheets. Currently there is no way how to include digests of relevant stylesheet files with Rails partial digests. This in turn renders this solution unusable in connection with so called russian-doll-caching, since changes to stylesheet assets won't bust the view cache. Ideas and solutions welcome.** + ## Installation Add this line to your application's Gemfile: @@ -10,15 +17,73 @@ gem 'cssm-rails' And then execute: - $ bundle +```sh +$ bundle +``` Or install it yourself as: - $ gem install cssm-rails +```sh +$ gem install cssm-rails +``` + +## Requirements + +This gem requires Node to be installed. ## Usage -Put foo.cssm in your app/assets/stylesheets directory with `.bar { color: red; }`. Use `
">` in your views. `//= require cssm` in then `CSSM.foo.bar` to use from javascript. +Files with `*.cssm`, `*.sassm`, `*.scssm` will be processed for CSS modules. +Files with `*.css`, `*.sass`, `*.scss` extensions will remain unchanged. + +```css +/* common.cssm */ +.bg { /* this class will be transformed to `.common_bg_HASH` */ }; +``` + +```css +/* event.cssm */ +.title { + composes: bg from './common.cssm'; + /* this class will be transformed to `.event_title_HASH`, + the outcome of the `cssm` helper will then be `event_title_HASH common_bg_HASH` + */ +} +``` + +### Helpers + +The `cssm` helper outputs css module classes: + +```ruby +cssm(file_name, class_name) +``` + +For example: + +```ruby +cssm('event', 'title') # => 'event_title_HASH common_bg_HASH' +``` + +The `cssms` outputs class selector: + +```ruby +cssms('event', 'title') # => '.event_title_HASH.common_bg_HASH' +``` + +These are helpful to generate module classes in views: + +```ruby +

# =>

+ event title +

+``` + +And selectors in JS: + +```js +$("<%= cssms 'event', 'title' %>"); // => $('.event_title_HASH.common_bg_HASH') +``` ## Development @@ -26,6 +91,12 @@ After checking out the repo, run `bin/setup` to install dependencies. You can al To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). +### Rebuilding CSS Modules JS + +```sh +bundle exec rake vendor_build +``` + ## Contributing Bug reports and pull requests are welcome on GitHub at https://github.com/css-modules/cssm-rails. @@ -33,4 +104,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/css-mo ## License The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). - diff --git a/Rakefile b/Rakefile index 2995527..b4e8ce5 100644 --- a/Rakefile +++ b/Rakefile @@ -1 +1,23 @@ -require "bundler/gem_tasks" +require 'bundler/gem_tasks' +require 'rake/testtask' + +Rake::TestTask.new(:test) do |t| + t.libs << 'test' + t.libs << 'lib' + t.test_files = FileList['test/**/*_test.rb'] +end + +task default: :test + +desc 'rebuild the vendored postcss-modules' +task :vendor_build do + `cd vendor/src && npm install` + `cd vendor/src && npm run bundle` + + # re-enable the fs module (which would be removed by browserify if uncommented) + bundle = File.join(__dir__, 'vendor/bundle.js') + content = File.read(bundle).gsub("// var fs = require('fs');", "var fs = require('fs');") + File.open(bundle, 'w+') do |output_file| + output_file.write(content) + end +end diff --git a/cssm-rails.gemspec b/cssm-rails.gemspec index 9246085..a440aed 100644 --- a/cssm-rails.gemspec +++ b/cssm-rails.gemspec @@ -4,29 +4,29 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'cssm/rails/version' Gem::Specification.new do |spec| - spec.name = "cssm-rails" + spec.name = 'cssm-rails' spec.version = CSSM::Rails::VERSION - spec.authors = ["Samuel Cochran"] - spec.email = ["sj26@sj26.com"] + spec.authors = ['Tomas Celizna'] + spec.email = ['mail@tomascelizna.com'] - spec.summary = %q{CSS Modules for Rails} - spec.description = %q{A CSS Module is a CSS file in which all class names and animation names are scoped locally by default. All URLs (url(...)) and @imports are in module request format (./xxx and ../xxx means relative, xxx and xxx/yyy means in modules folder, i. e. in node_modules).} - spec.homepage = "https://github.com/css-modules/cssm-rails" - spec.license = "MIT" - - # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or - # delete this section to allow pushing this gem to any host. - if spec.respond_to?(:metadata) - spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'" - else - raise "RubyGems 2.0 or newer is required to protect against public gem pushes." - end + spec.summary = 'CSS Modules for Rails' + spec.description = 'A CSS Module is a CSS file in which class names and animation names are scoped locally.' + spec.homepage = 'https://github.com/css-modules/cssm-rails' + spec.license = 'MIT' spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } - spec.bindir = "exe" + spec.bindir = 'exe' spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } - spec.require_paths = ["lib"] + spec.require_paths = ['lib'] + + spec.add_dependency 'rails' + spec.add_dependency 'sassc' + spec.add_dependency 'sassc-rails' + spec.add_dependency 'sprockets' - spec.add_development_dependency "bundler", "~> 1.10" - spec.add_development_dependency "rake", "~> 10.0" + spec.add_development_dependency 'bundler', '~> 1.10' + spec.add_development_dependency 'minitest', '~> 5.0' + spec.add_development_dependency 'minitest-rails' + spec.add_development_dependency 'minitest-rails-capybara' + spec.add_development_dependency 'rake', '~> 10.0' end diff --git a/lib/cssm.rb b/lib/cssm.rb index 736546d..8b22f2f 100644 --- a/lib/cssm.rb +++ b/lib/cssm.rb @@ -1,2 +1 @@ -module CSSM -end +require_relative 'rails/rails' diff --git a/lib/cssm/rails.rb b/lib/cssm/rails.rb index 121a100..b26087f 100644 --- a/lib/cssm/rails.rb +++ b/lib/cssm/rails.rb @@ -1,9 +1,34 @@ -require "cssm/rails/version" - -require "cssm" - module CSSM module Rails - # Your code goes here... + ROOT_PATH = __dir__ + + autoload :Sprockets, 'cssm/rails/sprockets' + + def self.process(css, opts = {}) + params = {} + processor(params).process(css, opts) + end + + def self.install(assets, params = {}) + Sprockets.register_processor(processor(params)) + Sprockets.install(assets) + end + + def self.uninstall(assets) + Sprockets.uninstall(assets) + end + + def self.processor(params = {}) + Processor.new(params) + end end end + +require_relative 'rails/asset' +require_relative 'rails/processor' +require_relative 'rails/result' +require_relative 'rails/view_helper' + +require_relative 'rails/railtie' if defined?(Rails) + +require_relative 'rails/version' diff --git a/lib/cssm/rails/asset.rb b/lib/cssm/rails/asset.rb new file mode 100644 index 0000000..daecf68 --- /dev/null +++ b/lib/cssm/rails/asset.rb @@ -0,0 +1,33 @@ +module CSSM + module Rails + class Asset < Struct.new(:name, :options) + def initialize(name, options = {}) + super(name, options) + end + + def path + @path ||= paths.flat_map do |path| + Dir.glob("#{path}/**/#{name}.{#{extensions.join(',')}}") + end.first + end + + def css + @css ||= File.read(path) + end + + def digest + @digest ||= Digest::MD5.hexdigest(css) + end + + private + + def extensions + options.fetch :extensions, %w(cssm sassm scssm) + end + + def paths + @paths ||= ::Rails.application.config.assets.paths + end + end + end +end diff --git a/lib/cssm/rails/processor.rb b/lib/cssm/rails/processor.rb new file mode 100644 index 0000000..44f1d46 --- /dev/null +++ b/lib/cssm/rails/processor.rb @@ -0,0 +1,23 @@ +module CSSM + module Rails + class Processor < Struct.new(:params) + BUNDLE_JS_PATH = File.join(ROOT_PATH, '../..', 'vendor/bundle.js') + + def initialize(params = {}) + super(params) + end + + def process(css, opts = {}) + filename = opts.fetch(:from, nil) + + bundle_js_args = Shellwords.escape(BUNDLE_JS_PATH) + css_arg = Shellwords.escape(css) + filename_arg = Shellwords.escape(filename.to_s) + + result = JSON.parse `node #{bundle_js_args} #{css_arg} #{filename_arg}` + + Result.new(result['injectableSource'], result['exportTokens']) + end + end + end +end diff --git a/lib/cssm/rails/railtie.rb b/lib/cssm/rails/railtie.rb new file mode 100644 index 0000000..f0ef948 --- /dev/null +++ b/lib/cssm/rails/railtie.rb @@ -0,0 +1,52 @@ +require 'sassc-rails' +require 'sprockets/railtie' + +begin + module CSSM + module Rails + class Railtie < ::Rails::Railtie + config.cssm = ActiveSupport::OrderedOptions.new + + if config.respond_to?(:annotations) + config.annotations.register_extensions("scssm", "sassm") { |annotation| /\/\/\s*(#{annotation}):?\s*(.*)$/ } + end + + initializer :setup_sass, group: :all do |app| + config.assets.configure do |env| + if env.respond_to?(:register_transformer) + env.register_transformer 'text/sass-modules', 'text/css', SassC::Rails::SassTemplate.new + env.register_transformer 'text/scss-modules', 'text/css', SassC::Rails::ScssTemplate.new + end + + if env.respond_to?(:register_engine) + [ + ['.sassm', SassC::Rails::SassTemplate], + ['.scssm', SassC::Rails::ScssTemplate] + ].each do |engine| + engine << { silence_deprecation: true } if ::Sprockets::VERSION.start_with?("3") + env.register_engine(*engine) + end + end + end + end + + initializer :cssm_rails_view_helpers do + ActionView::Base.send :include, CSSM::Rails::ViewHelper + end + + if config.respond_to?(:assets) && !config.assets.nil? + config.assets.configure do |env| + CSSM::Rails.install(env, {}) + end + else + initializer :setup_cssm_rails, group: :all do |app| + if defined? app.assets && !app.assets.nil? + CSSM::Rails.install(app.assets, {}) + end + end + end + end + end + rescue LoadError + end +end diff --git a/lib/cssm/rails/result.rb b/lib/cssm/rails/result.rb new file mode 100644 index 0000000..33c0c8f --- /dev/null +++ b/lib/cssm/rails/result.rb @@ -0,0 +1,13 @@ +module CSSM + module Rails + class Result < Struct.new(:injectable_source, :export_tokens) + def initialize(injectable_source, export_tokens) + super(injectable_source, export_tokens) + end + + def to_s + injectable_source + end + end + end +end diff --git a/lib/cssm/rails/sprockets.rb b/lib/cssm/rails/sprockets.rb new file mode 100644 index 0000000..1bb6f2d --- /dev/null +++ b/lib/cssm/rails/sprockets.rb @@ -0,0 +1,62 @@ +require 'pathname' + +module CSSM + module Rails + class Sprockets + def self.register_processor(processor) + @processor = processor + end + + def self.call(input) + filename = input[:filename] + source = input[:data] + run(filename, source) + end + + def self.run(filename, css) + result = @processor.process(css, from: filename) + result.to_s + end + + def self.install(env) + env.register_mime_type('text/css-modules', extensions: %w(.cssm)) + env.register_mime_type('text/sass-modules', extensions: %w(.sassm)) + env.register_mime_type('text/scss-modules', extensions: %w(.scssm)) + + if ::Sprockets::VERSION.to_f < 4 + env.register_postprocessor('text/css-modules', ::CSSM::Rails::Sprockets) + env.register_postprocessor('text/sass-modules', ::CSSM::Rails::Sprockets) + env.register_postprocessor('text/scss-modules', ::CSSM::Rails::Sprockets) + else + env.register_bundle_processor('text/css-modules', ::CSSM::Rails::Sprockets) + env.register_bundle_processor('text/sass-modules', ::CSSM::Rails::Sprockets) + env.register_bundle_processor('text/scss-modules', ::CSSM::Rails::Sprockets) + end + end + + # Register postprocessor in Sprockets depend on issues with other gems + def self.uninstall(env) + if ::Sprockets::VERSION.to_f < 4 + env.unregister_preprocessor('text/css-modules', ::CSSM::Rails::Sprockets) + env.unregister_preprocessor('text/sass-modules', ::CSSM::Rails::Sprockets) + env.unregister_preprocessor('text/scss-modules', ::CSSM::Rails::Sprockets) + else + env.unregister_bundle_processor('text/css-modules', ::CSSM::Rails::Sprockets) + env.unregister_bundle_processor('text/sass-modules', ::CSSM::Rails::Sprockets) + env.unregister_bundle_processor('text/scss-modules', ::CSSM::Rails::Sprockets) + end + end + + # Sprockets 2 API new and render + def initialize(filename) + @filename = filename + @source = yield + end + + # Sprockets 2 API new and render + def render(_, _) + self.class.run(@filename, @source) + end + end + end +end diff --git a/lib/cssm/rails/version.rb b/lib/cssm/rails/version.rb index d87b042..34792f6 100644 --- a/lib/cssm/rails/version.rb +++ b/lib/cssm/rails/version.rb @@ -1,5 +1,5 @@ module CSSM module Rails - VERSION = "0.1.0" + VERSION = '0.1.0'.freeze end end diff --git a/lib/cssm/rails/view_helper.rb b/lib/cssm/rails/view_helper.rb new file mode 100644 index 0000000..c261505 --- /dev/null +++ b/lib/cssm/rails/view_helper.rb @@ -0,0 +1,26 @@ +module CSSM + module Rails + module ViewHelper + def cssm(asset_name, cls) + asset = cssm_asset(asset_name) + cache_key = ['cssm', asset.digest, cls].join('-') + + ::Rails.cache.fetch(cache_key) do + result = CSSM::Rails.process(asset.css, from: asset.path) + result.export_tokens.fetch(cls.to_s, cls) + end + end + + def cssms(asset_name, cls) + cssm(asset_name, cls).split(/\s+/).map { |i| ".#{i}" }.join + end + + private + + def cssm_asset(asset_name) + @cssm_asset ||= {} + @cssm_asset[asset_name] ||= Asset.new(asset_name) + end + end + end +end diff --git a/test/cssm/rails/processor_test.rb b/test/cssm/rails/processor_test.rb new file mode 100644 index 0000000..cd87f5a --- /dev/null +++ b/test/cssm/rails/processor_test.rb @@ -0,0 +1,32 @@ +require 'test_helper' + +describe CSSM::Rails::Processor do + let(:filename) { 'test.cssm' } + let(:path) { File.join(SAMPLE_DIR, filename) } + let(:css) { File.read(path) } + + it 'process CSS' do + CSSM::Rails.process(css, from: path).must_be_kind_of CSSM::Rails::Result + end + + describe 'Result' do + let(:result) { CSSM::Rails.process(css, from: path) } + + it 'transforms the class names' do + result.injectable_source.must_include ".test_background_s10oz {\n background: yellow;\n}\n" + result.injectable_source.must_include ".test_title_yzy5m {\n color: red;\n}\n" + end + + describe 'local composes: directive' do + it 'generates export tokens' do + result.export_tokens['title'].must_equal 'test_title_yzy5m test_background_s10oz' + end + end + + describe 'cross-file composes: directive' do + it 'generates export tokens' do + result.export_tokens['heading'].must_equal 'test_heading_3wdId common_bold_1B60t' + end + end + end +end diff --git a/test/cssm/rails/view_helper_test.rb b/test/cssm/rails/view_helper_test.rb new file mode 100644 index 0000000..f84fff2 --- /dev/null +++ b/test/cssm/rails/view_helper_test.rb @@ -0,0 +1,17 @@ +require 'test_helper' + +describe CSSM::Rails::ViewHelper, :capybara do + include CSSM::Rails::ViewHelper + + before do + visit page_path + end + + describe '.scssm' do + it { page.must_have_selector cssms('event', 'title') } + end + + describe 'nested' do + it { page.must_have_selector cssms('test', 'heading') } + end +end diff --git a/test/dummy/Rakefile b/test/dummy/Rakefile new file mode 100644 index 0000000..e85f913 --- /dev/null +++ b/test/dummy/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative 'config/application' + +Rails.application.load_tasks diff --git a/test/dummy/app/assets/config/manifest.js b/test/dummy/app/assets/config/manifest.js new file mode 100644 index 0000000..43aeceb --- /dev/null +++ b/test/dummy/app/assets/config/manifest.js @@ -0,0 +1,5 @@ + +//= link_tree ../images +//= link_directory ../javascripts .js +//= link_directory ../stylesheets .css +//= link css_modules_manifest.js diff --git a/test/dummy/app/assets/images/.keep b/test/dummy/app/assets/images/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/app/assets/stylesheets/application.css b/test/dummy/app/assets/stylesheets/application.css new file mode 100644 index 0000000..4cb2bc0 --- /dev/null +++ b/test/dummy/app/assets/stylesheets/application.css @@ -0,0 +1,4 @@ +/* +*= require_tree . +*= require_self +*/ diff --git a/test/dummy/app/assets/stylesheets/common.scssm b/test/dummy/app/assets/stylesheets/common.scssm new file mode 100644 index 0000000..b47583e --- /dev/null +++ b/test/dummy/app/assets/stylesheets/common.scssm @@ -0,0 +1,3 @@ +.bg { + background-color: yellow; +} diff --git a/test/dummy/app/assets/stylesheets/default.css b/test/dummy/app/assets/stylesheets/default.css new file mode 100644 index 0000000..93854b8 --- /dev/null +++ b/test/dummy/app/assets/stylesheets/default.css @@ -0,0 +1,3 @@ +.default { + color: blue; +} diff --git a/test/dummy/app/assets/stylesheets/event.scssm b/test/dummy/app/assets/stylesheets/event.scssm new file mode 100644 index 0000000..ea91b93 --- /dev/null +++ b/test/dummy/app/assets/stylesheets/event.scssm @@ -0,0 +1,4 @@ +.title { + composes: bg from './common.scssm'; + font-weight: bold; +} diff --git a/test/dummy/app/assets/stylesheets/nested/test.scssm b/test/dummy/app/assets/stylesheets/nested/test.scssm new file mode 100644 index 0000000..b3365e4 --- /dev/null +++ b/test/dummy/app/assets/stylesheets/nested/test.scssm @@ -0,0 +1,3 @@ +.heading { + font-weight: bold; +} diff --git a/test/dummy/app/channels/application_cable/channel.rb b/test/dummy/app/channels/application_cable/channel.rb new file mode 100644 index 0000000..d56fa30 --- /dev/null +++ b/test/dummy/app/channels/application_cable/channel.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. Action Cable runs in a loop that does not support auto reloading. +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/test/dummy/app/channels/application_cable/connection.rb b/test/dummy/app/channels/application_cable/connection.rb new file mode 100644 index 0000000..b4f4138 --- /dev/null +++ b/test/dummy/app/channels/application_cable/connection.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. Action Cable runs in a loop that does not support auto reloading. +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/test/dummy/app/controllers/application_controller.rb b/test/dummy/app/controllers/application_controller.rb new file mode 100644 index 0000000..d83690e --- /dev/null +++ b/test/dummy/app/controllers/application_controller.rb @@ -0,0 +1,5 @@ +class ApplicationController < ActionController::Base + # Prevent CSRF attacks by raising an exception. + # For APIs, you may want to use :null_session instead. + protect_from_forgery with: :exception +end diff --git a/test/dummy/app/controllers/concerns/.keep b/test/dummy/app/controllers/concerns/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/app/controllers/pages_controller.rb b/test/dummy/app/controllers/pages_controller.rb new file mode 100644 index 0000000..bb7924d --- /dev/null +++ b/test/dummy/app/controllers/pages_controller.rb @@ -0,0 +1,4 @@ +class PagesController < ApplicationController + def show + end +end diff --git a/test/dummy/app/helpers/application_helper.rb b/test/dummy/app/helpers/application_helper.rb new file mode 100644 index 0000000..de6be79 --- /dev/null +++ b/test/dummy/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/test/dummy/app/jobs/application_job.rb b/test/dummy/app/jobs/application_job.rb new file mode 100644 index 0000000..a009ace --- /dev/null +++ b/test/dummy/app/jobs/application_job.rb @@ -0,0 +1,2 @@ +class ApplicationJob < ActiveJob::Base +end diff --git a/test/dummy/app/mailers/application_mailer.rb b/test/dummy/app/mailers/application_mailer.rb new file mode 100644 index 0000000..286b223 --- /dev/null +++ b/test/dummy/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: 'from@example.com' + layout 'mailer' +end diff --git a/test/dummy/app/models/application_record.rb b/test/dummy/app/models/application_record.rb new file mode 100644 index 0000000..10a4cba --- /dev/null +++ b/test/dummy/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/test/dummy/app/models/concerns/.keep b/test/dummy/app/models/concerns/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/app/views/layouts/application.html.erb b/test/dummy/app/views/layouts/application.html.erb new file mode 100644 index 0000000..fbc2441 --- /dev/null +++ b/test/dummy/app/views/layouts/application.html.erb @@ -0,0 +1,12 @@ + + + + Dummy + <%= csrf_meta_tags %> + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> + + + + <%= yield %> + + diff --git a/test/dummy/app/views/pages/show.html.erb b/test/dummy/app/views/pages/show.html.erb new file mode 100644 index 0000000..9f7bf34 --- /dev/null +++ b/test/dummy/app/views/pages/show.html.erb @@ -0,0 +1,7 @@ +

+ title +

+ +

+ heading +

diff --git a/test/dummy/bin/bundle b/test/dummy/bin/bundle new file mode 100755 index 0000000..66e9889 --- /dev/null +++ b/test/dummy/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +load Gem.bin_path('bundler', 'bundle') diff --git a/test/dummy/bin/rails b/test/dummy/bin/rails new file mode 100755 index 0000000..0739660 --- /dev/null +++ b/test/dummy/bin/rails @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/test/dummy/bin/rake b/test/dummy/bin/rake new file mode 100755 index 0000000..1724048 --- /dev/null +++ b/test/dummy/bin/rake @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/test/dummy/bin/setup b/test/dummy/bin/setup new file mode 100755 index 0000000..e620b4d --- /dev/null +++ b/test/dummy/bin/setup @@ -0,0 +1,34 @@ +#!/usr/bin/env ruby +require 'pathname' +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:setup' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/test/dummy/bin/update b/test/dummy/bin/update new file mode 100755 index 0000000..a8e4462 --- /dev/null +++ b/test/dummy/bin/update @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +require 'pathname' +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a way to update your development environment automatically. + # Add necessary update steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + puts "\n== Updating database ==" + system! 'bin/rails db:migrate' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/test/dummy/config.ru b/test/dummy/config.ru new file mode 100644 index 0000000..f7ba0b5 --- /dev/null +++ b/test/dummy/config.ru @@ -0,0 +1,5 @@ +# This file is used by Rack-based servers to start the application. + +require_relative 'config/environment' + +run Rails.application diff --git a/test/dummy/config/application.rb b/test/dummy/config/application.rb new file mode 100644 index 0000000..699a2c9 --- /dev/null +++ b/test/dummy/config/application.rb @@ -0,0 +1,18 @@ +require_relative 'boot' + +# require 'rails/all' +require 'rails' +require 'action_controller/railtie' +require 'action_mailer/railtie' +require 'rails/test_unit/railtie' +require 'sprockets/railtie' + +Bundler.require(*Rails.groups) + +module Dummy + class Application < Rails::Application + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + end +end diff --git a/test/dummy/config/boot.rb b/test/dummy/config/boot.rb new file mode 100644 index 0000000..c9aef85 --- /dev/null +++ b/test/dummy/config/boot.rb @@ -0,0 +1,5 @@ +# Set up gems listed in the Gemfile. +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../Gemfile', __dir__) + +require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) +$LOAD_PATH.unshift File.expand_path('../../../lib', __dir__) diff --git a/test/dummy/config/cable.yml b/test/dummy/config/cable.yml new file mode 100644 index 0000000..aa4e832 --- /dev/null +++ b/test/dummy/config/cable.yml @@ -0,0 +1,10 @@ +# Action Cable uses Redis by default to administer connections, channels, and sending/receiving messages over the WebSocket. +production: + adapter: redis + url: redis://localhost:6379/1 + +development: + adapter: async + +test: + adapter: async diff --git a/test/dummy/config/database.yml b/test/dummy/config/database.yml new file mode 100644 index 0000000..1c1a37c --- /dev/null +++ b/test/dummy/config/database.yml @@ -0,0 +1,25 @@ +# SQLite version 3.x +# gem install sqlite3 +# +# Ensure the SQLite 3 gem is defined in your Gemfile +# gem 'sqlite3' +# +default: &default + adapter: sqlite3 + pool: 5 + timeout: 5000 + +development: + <<: *default + database: db/development.sqlite3 + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: db/test.sqlite3 + +production: + <<: *default + database: db/production.sqlite3 diff --git a/test/dummy/config/environment.rb b/test/dummy/config/environment.rb new file mode 100644 index 0000000..426333b --- /dev/null +++ b/test/dummy/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/test/dummy/config/environments/development.rb b/test/dummy/config/environments/development.rb new file mode 100644 index 0000000..1338be2 --- /dev/null +++ b/test/dummy/config/environments/development.rb @@ -0,0 +1,51 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + if Rails.root.join('tmp/caching-dev.txt').exist? + config.action_controller.perform_caching = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => 'public, max-age=172800' + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + # config.active_record.migration_error = :page_load + + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true + + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + # config.file_watcher = ActiveSupport::EventedFileUpdateChecker +end diff --git a/test/dummy/config/environments/production.rb b/test/dummy/config/environments/production.rb new file mode 100644 index 0000000..7df88ed --- /dev/null +++ b/test/dummy/config/environments/production.rb @@ -0,0 +1,88 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Action Cable endpoint configuration + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + + # Don't mount Action Cable in the main server process. + # config.action_cable.mount_path = nil + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Use a real queuing backend for Active Job (and separate queues per environment) + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "dummy_#{Rails.env}" + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false +end diff --git a/test/dummy/config/environments/test.rb b/test/dummy/config/environments/test.rb new file mode 100644 index 0000000..78bc093 --- /dev/null +++ b/test/dummy/config/environments/test.rb @@ -0,0 +1,44 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure public file server for tests with Cache-Control for performance. + # config.public_file_server.enabled = true + # config.public_file_server.headers = { + # 'Cache-Control' => 'public, max-age=3600' + # } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + # config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true + + config.active_support.test_order = :random +end diff --git a/test/dummy/config/initializers/active_record_belongs_to_required_by_default.rb b/test/dummy/config/initializers/active_record_belongs_to_required_by_default.rb new file mode 100644 index 0000000..c948b25 --- /dev/null +++ b/test/dummy/config/initializers/active_record_belongs_to_required_by_default.rb @@ -0,0 +1,6 @@ +# Be sure to restart your server when you modify this file. + +# Require `belongs_to` associations by default. This is a new Rails 5.0 +# default, so it is introduced as a configuration option to ensure that apps +# made on earlier versions of Rails are not affected when upgrading. +# Rails.application.config.active_record.belongs_to_required_by_default = true diff --git a/test/dummy/config/initializers/application_controller_renderer.rb b/test/dummy/config/initializers/application_controller_renderer.rb new file mode 100644 index 0000000..51639b6 --- /dev/null +++ b/test/dummy/config/initializers/application_controller_renderer.rb @@ -0,0 +1,6 @@ +# Be sure to restart your server when you modify this file. + +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) diff --git a/test/dummy/config/initializers/assets.rb b/test/dummy/config/initializers/assets.rb new file mode 100644 index 0000000..01ef3e6 --- /dev/null +++ b/test/dummy/config/initializers/assets.rb @@ -0,0 +1,11 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = '1.0' + +# Add additional assets to the asset load path +# Rails.application.config.assets.paths << Emoji.images_path + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in app/assets folder are already added. +# Rails.application.config.assets.precompile += %w( search.js ) diff --git a/test/dummy/config/initializers/backtrace_silencers.rb b/test/dummy/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000..59385cd --- /dev/null +++ b/test/dummy/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/test/dummy/config/initializers/callback_terminator.rb b/test/dummy/config/initializers/callback_terminator.rb new file mode 100644 index 0000000..5ce0dc3 --- /dev/null +++ b/test/dummy/config/initializers/callback_terminator.rb @@ -0,0 +1,6 @@ +# Be sure to restart your server when you modify this file. + +# Do not halt callback chains when a callback returns false. This is a new +# Rails 5.0 default, so it is introduced as a configuration option to ensure +# that apps made with earlier versions of Rails are not affected when upgrading. +# ActiveSupport.halt_callback_chains_on_return_false = false diff --git a/test/dummy/config/initializers/cookies_serializer.rb b/test/dummy/config/initializers/cookies_serializer.rb new file mode 100644 index 0000000..5a6a32d --- /dev/null +++ b/test/dummy/config/initializers/cookies_serializer.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Specify a serializer for the signed and encrypted cookie jars. +# Valid options are :json, :marshal, and :hybrid. +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/test/dummy/config/initializers/filter_parameter_logging.rb b/test/dummy/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000..4a994e1 --- /dev/null +++ b/test/dummy/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/test/dummy/config/initializers/inflections.rb b/test/dummy/config/initializers/inflections.rb new file mode 100644 index 0000000..ac033bf --- /dev/null +++ b/test/dummy/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/test/dummy/config/initializers/mime_types.rb b/test/dummy/config/initializers/mime_types.rb new file mode 100644 index 0000000..dc18996 --- /dev/null +++ b/test/dummy/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/test/dummy/config/initializers/per_form_csrf_tokens.rb b/test/dummy/config/initializers/per_form_csrf_tokens.rb new file mode 100644 index 0000000..0ee20d6 --- /dev/null +++ b/test/dummy/config/initializers/per_form_csrf_tokens.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Enable per-form CSRF tokens. +# Rails.application.config.action_controller.per_form_csrf_tokens = true diff --git a/test/dummy/config/initializers/request_forgery_protection.rb b/test/dummy/config/initializers/request_forgery_protection.rb new file mode 100644 index 0000000..4847681 --- /dev/null +++ b/test/dummy/config/initializers/request_forgery_protection.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Enable origin-checking CSRF mitigation. +# Rails.application.config.action_controller.forgery_protection_origin_check = true diff --git a/test/dummy/config/initializers/session_store.rb b/test/dummy/config/initializers/session_store.rb new file mode 100644 index 0000000..e766b67 --- /dev/null +++ b/test/dummy/config/initializers/session_store.rb @@ -0,0 +1,3 @@ +# Be sure to restart your server when you modify this file. + +Rails.application.config.session_store :cookie_store, key: '_dummy_session' diff --git a/test/dummy/config/initializers/ssl_options.rb b/test/dummy/config/initializers/ssl_options.rb new file mode 100644 index 0000000..1775dea --- /dev/null +++ b/test/dummy/config/initializers/ssl_options.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure SSL options to enable HSTS with subdomains. +Rails.application.config.ssl_options = { hsts: { subdomains: true } } diff --git a/test/dummy/config/initializers/to_time_preserves_timezone.rb b/test/dummy/config/initializers/to_time_preserves_timezone.rb new file mode 100644 index 0000000..fb0c5b8 --- /dev/null +++ b/test/dummy/config/initializers/to_time_preserves_timezone.rb @@ -0,0 +1,10 @@ +# Be sure to restart your server when you modify this file. + +# Preserve the timezone of the receiver when calling to `to_time`. +# Ruby 2.4 will change the behavior of `to_time` to preserve the timezone +# when converting to an instance of `Time` instead of the previous behavior +# of converting to the local system timezone. +# +# Rails 5.0 introduced this config option so that apps made with earlier +# versions of Rails are not affected when upgrading. +# ActiveSupport.to_time_preserves_timezone = true diff --git a/test/dummy/config/initializers/wrap_parameters.rb b/test/dummy/config/initializers/wrap_parameters.rb new file mode 100644 index 0000000..bbfc396 --- /dev/null +++ b/test/dummy/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/test/dummy/config/locales/en.yml b/test/dummy/config/locales/en.yml new file mode 100644 index 0000000..0653957 --- /dev/null +++ b/test/dummy/config/locales/en.yml @@ -0,0 +1,23 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/test/dummy/config/puma.rb b/test/dummy/config/puma.rb new file mode 100644 index 0000000..c7f311f --- /dev/null +++ b/test/dummy/config/puma.rb @@ -0,0 +1,47 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum, this matches the default thread size of Active Record. +# +threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i +threads threads_count, threads_count + +# Specifies the `port` that Puma will listen on to receive requests, default is 3000. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked webserver processes. If using threads and workers together +# the concurrency of the application would be max `threads` * `workers`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# workers ENV.fetch("WEB_CONCURRENCY") { 2 } + +# Use the `preload_app!` method when specifying a `workers` number. +# This directive tells Puma to first boot the application and load code +# before forking the application. This takes advantage of Copy On Write +# process behavior so workers use less memory. If you use this option +# you need to make sure to reconnect any threads in the `on_worker_boot` +# block. +# +# preload_app! + +# The code in the `on_worker_boot` will be called if you are using +# clustered mode by specifying a number of `workers`. After each worker +# process is booted this block will be run, if you are using `preload_app!` +# option you will want to use this block to reconnect to any threads +# or connections that may have been created at application boot, Ruby +# cannot share connections between processes. +# +# on_worker_boot do +# ActiveRecord::Base.establish_connection if defined?(ActiveRecord) +# end + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/test/dummy/config/routes.rb b/test/dummy/config/routes.rb new file mode 100644 index 0000000..ff336b3 --- /dev/null +++ b/test/dummy/config/routes.rb @@ -0,0 +1,3 @@ +Rails.application.routes.draw do + resource :page, only: :show +end diff --git a/test/dummy/config/secrets.yml b/test/dummy/config/secrets.yml new file mode 100644 index 0000000..c73019c --- /dev/null +++ b/test/dummy/config/secrets.yml @@ -0,0 +1,22 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key is used for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! + +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +# You can use `rails secret` to generate a secure secret key. + +# Make sure the secrets in this file are kept private +# if you're sharing your code publicly. + +development: + secret_key_base: 37f1173ed7241aea65d6355f4bf28dee399792051894c6ff66d570f3a6a7f571a0f1c5519474150ac486a70421f5b15bed1f28cd285b6eb4be86adc54bb7312a + +test: + secret_key_base: ba0cb24d234def5e7321fbee82f64e11afb5a09bd4a61aae604edb3d4a29f901fd1ff80d90b2f3a62c05bf5d62f287b2c5592b4836a5aaf3f1908cc8e6a8043c + +# Do not keep production secrets in the repository, +# instead read values from the environment. +production: + secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/test/dummy/config/spring.rb b/test/dummy/config/spring.rb new file mode 100644 index 0000000..c9119b4 --- /dev/null +++ b/test/dummy/config/spring.rb @@ -0,0 +1,6 @@ +%w( + .ruby-version + .rbenv-vars + tmp/restart.txt + tmp/caching-dev.txt +).each { |path| Spring.watch(path) } diff --git a/test/dummy/db/test.sqlite3 b/test/dummy/db/test.sqlite3 new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/lib/assets/.keep b/test/dummy/lib/assets/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/log/.keep b/test/dummy/log/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/log/test.log b/test/dummy/log/test.log new file mode 100644 index 0000000..2deaeee --- /dev/null +++ b/test/dummy/log/test.log @@ -0,0 +1,1419 @@ +------------------------------------------------- +CSSMRails::ViewHelper::#cssm: test_0001_anonymous +------------------------------------------------- +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/" for 127.0.0.1 at 2016-11-05 14:19:48 +0100 +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/" for 127.0.0.1 at 2016-11-05 14:20:17 +0100 +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:22:12 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (2.1ms) +Completed 200 OK in 214ms (Views: 211.9ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:23:15 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1.6ms) +Completed 200 OK in 229ms (Views: 226.7ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:23:24 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1.2ms) +Completed 200 OK in 237ms (Views: 235.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:24:02 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (9.9ms) +Completed 500 Internal Server Error in 18ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:25:44 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (6.2ms) +Completed 500 Internal Server Error in 19ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:26:16 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (4.2ms) +Completed 500 Internal Server Error in 13ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:26:46 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1.4ms) +Completed 200 OK in 233ms (Views: 230.2ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:27:50 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (196.7ms) +Completed 200 OK in 211ms (Views: 209.0ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:28:28 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (248.0ms) +Completed 500 Internal Server Error in 257ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:29:23 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1104.7ms) +Completed 200 OK in 1125ms (Views: 1121.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:29:44 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (351.4ms) +Completed 200 OK in 366ms (Views: 364.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:31:31 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (357.9ms) +Completed 200 OK in 374ms (Views: 371.2ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:32:15 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (545.3ms) +Completed 200 OK in 559ms (Views: 556.4ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:33:58 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (338.7ms) +Completed 200 OK in 354ms (Views: 351.3ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:34:16 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (375.4ms) +Completed 500 Internal Server Error in 388ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:36:49 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (352.9ms) +Completed 200 OK in 368ms (Views: 365.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:37:06 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (403.6ms) +Completed 500 Internal Server Error in 413ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:37:28 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (355.1ms) +Completed 200 OK in 369ms (Views: 367.2ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:48:24 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1024.8ms) +Completed 200 OK in 1042ms (Views: 1040.2ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:48:47 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1318.6ms) +Completed 200 OK in 1338ms (Views: 1335.7ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:52:26 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (891.0ms) +Completed 200 OK in 913ms (Views: 910.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:53:38 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (890.2ms) +Completed 200 OK in 905ms (Views: 902.8ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:57:15 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (832.6ms) +Completed 200 OK in 849ms (Views: 846.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:58:00 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (806.6ms) +Completed 200 OK in 822ms (Views: 819.6ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:58:28 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (816.8ms) +Completed 500 Internal Server Error in 827ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 14:58:45 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (811.2ms) +Completed 200 OK in 826ms (Views: 823.4ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 15:07:30 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (822.7ms) +Completed 200 OK in 838ms (Views: 835.7ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 15:08:16 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (793.3ms) +Completed 200 OK in 809ms (Views: 806.3ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 15:12:19 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (787.4ms) +Completed 200 OK in 802ms (Views: 799.8ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 15:13:22 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1359.4ms) +Completed 200 OK in 1374ms (Views: 1371.9ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 15:13:40 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (204.5ms) +Completed 500 Internal Server Error in 213ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 15:14:08 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (824.7ms) +Completed 200 OK in 838ms (Views: 836.2ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 15:14:55 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (815.3ms) +Completed 200 OK in 828ms (Views: 826.3ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 15:15:45 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (794.0ms) +Completed 200 OK in 808ms (Views: 805.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 15:15:55 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (846.7ms) +Completed 200 OK in 861ms (Views: 858.7ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-05 15:16:11 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (876.4ms) +Completed 200 OK in 893ms (Views: 890.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 10:24:10 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (854.1ms) +Completed 200 OK in 876ms (Views: 872.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 10:24:37 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (868.2ms) +Completed 200 OK in 884ms (Views: 881.3ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 10:24:56 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (805.5ms) +Completed 200 OK in 822ms (Views: 818.8ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 10:25:08 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (750.7ms) +Completed 200 OK in 765ms (Views: 763.4ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 10:25:16 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (770.3ms) +Completed 200 OK in 785ms (Views: 782.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 10:26:09 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (791.4ms) +Completed 200 OK in 807ms (Views: 804.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 10:46:05 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (924.8ms) +Completed 200 OK in 946ms (Views: 942.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:00:43 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (859.1ms) +Completed 200 OK in 878ms (Views: 875.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:01:55 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (934.1ms) +Completed 200 OK in 956ms (Views: 953.8ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:04:57 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (857.6ms) +Completed 200 OK in 879ms (Views: 876.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:05:19 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (822.9ms) +Completed 200 OK in 839ms (Views: 836.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:08:13 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (971.9ms) +Completed 200 OK in 990ms (Views: 987.6ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:08:36 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (854.4ms) +Completed 200 OK in 871ms (Views: 868.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:09:34 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (861.8ms) +Completed 200 OK in 879ms (Views: 876.6ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:10:12 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (823.3ms) +Completed 200 OK in 840ms (Views: 838.0ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:10:59 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (816.8ms) +Completed 200 OK in 833ms (Views: 830.8ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:11:28 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (851.0ms) +Completed 200 OK in 865ms (Views: 862.7ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:15:59 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (842.3ms) +Completed 200 OK in 858ms (Views: 855.8ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:16:54 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (830.5ms) +Completed 200 OK in 844ms (Views: 842.3ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:17:23 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (838.2ms) +Completed 500 Internal Server Error in 851ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:18:26 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (898.2ms) +Completed 200 OK in 915ms (Views: 912.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:20:29 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (797.9ms) +Completed 200 OK in 813ms (Views: 810.2ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:22:42 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (829.7ms) +Completed 200 OK in 843ms (Views: 841.0ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:23:59 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (846.6ms) +Completed 200 OK in 861ms (Views: 858.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:24:52 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (814.6ms) +Completed 200 OK in 833ms (Views: 829.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:26:07 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (877.4ms) +Completed 200 OK in 894ms (Views: 890.8ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:26:59 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (836.6ms) +Completed 200 OK in 853ms (Views: 849.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:28:07 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (882.9ms) +Completed 200 OK in 899ms (Views: 896.4ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:29:45 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (834.4ms) +Completed 200 OK in 848ms (Views: 845.8ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:30:54 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (845.4ms) +Completed 200 OK in 861ms (Views: 858.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:33:47 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (802.7ms) +Completed 200 OK in 817ms (Views: 814.7ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:36:08 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (872.8ms) +Completed 200 OK in 887ms (Views: 885.2ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:36:59 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (797.5ms) +Completed 200 OK in 813ms (Views: 811.0ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:39:28 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (799.5ms) +Completed 200 OK in 815ms (Views: 812.3ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:39:54 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (885.8ms) +Completed 200 OK in 901ms (Views: 899.2ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:40:42 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (891.2ms) +Completed 200 OK in 906ms (Views: 903.7ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:42:24 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (796.5ms) +Completed 200 OK in 811ms (Views: 808.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:43:31 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (827.5ms) +Completed 200 OK in 843ms (Views: 840.4ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:44:13 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (864.1ms) +Completed 200 OK in 878ms (Views: 876.4ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:44:25 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (845.1ms) +Completed 200 OK in 860ms (Views: 857.0ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:45:01 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (794.4ms) +Completed 200 OK in 809ms (Views: 807.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:45:52 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (832.6ms) +Completed 200 OK in 848ms (Views: 845.6ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:46:25 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1025.0ms) +Completed 200 OK in 1040ms (Views: 1037.3ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:48:52 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1054.5ms) +Completed 200 OK in 1073ms (Views: 1070.3ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 11:49:57 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (881.4ms) +Completed 200 OK in 901ms (Views: 898.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:32:16 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (920.6ms) +Completed 200 OK in 942ms (Views: 938.3ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:33:34 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (796.1ms) +Completed 200 OK in 814ms (Views: 811.8ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:34:32 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (893.7ms) +Completed 200 OK in 908ms (Views: 906.0ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:35:04 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (792.1ms) +Completed 200 OK in 806ms (Views: 803.6ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:36:00 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (900.2ms) +Completed 200 OK in 914ms (Views: 912.0ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:38:38 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1023.4ms) +Completed 200 OK in 1043ms (Views: 1040.0ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:39:40 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (995.3ms) +Completed 200 OK in 1015ms (Views: 1012.2ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:40:16 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (850.2ms) +Completed 200 OK in 866ms (Views: 862.7ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:40:55 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (851.8ms) +Completed 200 OK in 873ms (Views: 871.0ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:41:33 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1086.0ms) +Completed 200 OK in 1106ms (Views: 1102.8ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:44:08 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (840.7ms) +Completed 200 OK in 860ms (Views: 857.6ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:45:33 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (866.9ms) +Completed 200 OK in 883ms (Views: 880.2ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:47:11 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (901.7ms) +Completed 200 OK in 918ms (Views: 915.4ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:48:14 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (969.0ms) +Completed 200 OK in 990ms (Views: 985.7ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:49:58 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (866.5ms) +Completed 200 OK in 881ms (Views: 878.4ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:50:15 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (885.1ms) +Completed 200 OK in 901ms (Views: 897.8ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:50:47 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (817.6ms) +Completed 200 OK in 833ms (Views: 830.4ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:51:03 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (860.9ms) +Completed 200 OK in 875ms (Views: 872.6ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 13:58:08 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (923.2ms) +Completed 500 Internal Server Error in 934ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 14:02:36 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (856.8ms) +Completed 500 Internal Server Error in 869ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 14:03:32 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (799.7ms) +Completed 500 Internal Server Error in 809ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 14:04:03 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1103.9ms) +Completed 200 OK in 1122ms (Views: 1119.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 14:04:28 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1148.9ms) +Completed 200 OK in 1165ms (Views: 1162.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 14:05:02 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (919.7ms) +Completed 500 Internal Server Error in 930ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 14:05:33 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (999.5ms) +Completed 200 OK in 1014ms (Views: 1012.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 14:05:56 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1103.6ms) +Completed 200 OK in 1121ms (Views: 1118.6ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 14:12:26 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (935.8ms) +Completed 200 OK in 950ms (Views: 947.9ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 14:14:41 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1006.5ms) +Completed 200 OK in 1025ms (Views: 1022.6ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 14:15:31 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (1084.4ms) +Completed 200 OK in 1100ms (Views: 1097.7ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:32:09 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (877.8ms) +Completed 500 Internal Server Error in 890ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:34:51 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (740.3ms) +Completed 500 Internal Server Error in 749ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:37:40 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (488.1ms) +Completed 500 Internal Server Error in 498ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:37:59 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (859.5ms) +Completed 500 Internal Server Error in 870ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:41:24 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (814.0ms) +Completed 500 Internal Server Error in 823ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:42:29 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (760.7ms) +Completed 500 Internal Server Error in 770ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:43:16 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (804.7ms) +Completed 500 Internal Server Error in 815ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:45:56 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (789.0ms) +Completed 500 Internal Server Error in 801ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:46:49 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (907.6ms) +Completed 500 Internal Server Error in 919ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:47:28 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (589.6ms) +Completed 500 Internal Server Error in 599ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:48:34 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (605.2ms) +Completed 500 Internal Server Error in 615ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:48:53 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (619.3ms) +Completed 500 Internal Server Error in 629ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:50:34 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (608.1ms) +Completed 500 Internal Server Error in 616ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:51:08 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (636.5ms) +Completed 500 Internal Server Error in 647ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:51:21 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (626.1ms) +Completed 500 Internal Server Error in 637ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:52:17 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (608.4ms) +Completed 500 Internal Server Error in 632ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:53:20 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (605.4ms) +Completed 500 Internal Server Error in 615ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:53:46 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (646.6ms) +Completed 500 Internal Server Error in 657ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:54:42 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (609.8ms) +Completed 500 Internal Server Error in 619ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:56:30 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (643.4ms) +Completed 500 Internal Server Error in 657ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:56:44 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (570.8ms) +Completed 500 Internal Server Error in 580ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:57:37 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (609.7ms) +Completed 500 Internal Server Error in 621ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:57:51 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (687.2ms) +Completed 500 Internal Server Error in 701ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 15:58:29 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (718.2ms) +Completed 500 Internal Server Error in 731ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 16:01:48 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (673.7ms) +Completed 500 Internal Server Error in 684ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 16:02:01 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (790.0ms) +Completed 500 Internal Server Error in 806ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 16:02:29 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (679.6ms) +Completed 500 Internal Server Error in 693ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 16:03:25 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (711.7ms) +Completed 500 Internal Server Error in 722ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 16:04:34 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (670.8ms) +Completed 500 Internal Server Error in 684ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 16:05:09 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (614.0ms) +Completed 500 Internal Server Error in 624ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 16:06:29 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (657.7ms) +Completed 500 Internal Server Error in 670ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 16:06:49 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (704.4ms) +Completed 500 Internal Server Error in 715ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 16:10:27 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (705.2ms) +Completed 500 Internal Server Error in 719ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 16:11:12 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (749.3ms) +Completed 500 Internal Server Error in 763ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 16:11:40 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (673.6ms) +Completed 500 Internal Server Error in 684ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:40:40 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (678.8ms) +Completed 500 Internal Server Error in 689ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:42:00 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (743.4ms) +Completed 500 Internal Server Error in 762ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:42:10 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (662.8ms) +Completed 500 Internal Server Error in 676ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:42:28 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (648.8ms) +Completed 500 Internal Server Error in 658ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:42:52 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (598.0ms) +Completed 500 Internal Server Error in 610ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:43:02 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (702.5ms) +Completed 500 Internal Server Error in 714ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:43:32 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (730.0ms) +Completed 200 OK in 781ms (Views: 777.9ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:44:03 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (757.1ms) +Completed 500 Internal Server Error in 771ms +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:44:49 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (612.5ms) +Completed 200 OK in 660ms (Views: 657.8ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:46:00 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (681.9ms) +Completed 200 OK in 698ms (Views: 695.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:46:54 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (662.6ms) +Completed 200 OK in 678ms (Views: 675.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:48:03 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (627.1ms) +Completed 200 OK in 679ms (Views: 676.7ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:48:23 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (971.8ms) +Completed 200 OK in 994ms (Views: 990.3ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:48:32 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (675.9ms) +Completed 200 OK in 722ms (Views: 719.9ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:49:28 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (617.8ms) +Completed 200 OK in 663ms (Views: 661.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:49:45 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (633.2ms) +Completed 200 OK in 680ms (Views: 677.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:50:07 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (660.5ms) +Completed 200 OK in 679ms (Views: 675.8ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:50:47 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (665.9ms) +Completed 200 OK in 684ms (Views: 681.3ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:51:37 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (695.9ms) +Completed 200 OK in 742ms (Views: 740.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:51:56 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (868.6ms) +Completed 200 OK in 889ms (Views: 885.6ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:52:10 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (803.3ms) +Completed 200 OK in 864ms (Views: 860.9ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:52:23 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (787.9ms) +Completed 200 OK in 807ms (Views: 803.9ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:52:35 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (595.8ms) +Completed 200 OK in 642ms (Views: 639.7ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:52:54 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (628.0ms) +Completed 200 OK in 673ms (Views: 671.1ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 17:53:14 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (637.7ms) +Completed 200 OK in 686ms (Views: 682.8ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 18:06:55 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (646.1ms) +Completed 200 OK in 694ms (Views: 692.3ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 18:07:16 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (616.8ms) +Completed 200 OK in 669ms (Views: 666.7ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0002_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 18:07:17 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (239.9ms) +Completed 200 OK in 249ms (Views: 246.4ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 18:07:28 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (642.4ms) +Completed 200 OK in 657ms (Views: 654.7ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 18:07:48 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (612.1ms) +Completed 200 OK in 660ms (Views: 657.5ms) +-------------------------------------------------- +CSSMRails::ViewHelper::capybara::#cssm: test_0001_ +-------------------------------------------------- +Started GET "/page" for 127.0.0.1 at 2016-11-06 18:07:53 +0100 +Processing by PagesController#show as HTML + Rendering pages/show.html.erb within layouts/application + Rendered pages/show.html.erb within layouts/application (614.7ms) +Completed 200 OK in 631ms (Views: 628.5ms) diff --git a/test/dummy/public/404.html b/test/dummy/public/404.html new file mode 100644 index 0000000..b612547 --- /dev/null +++ b/test/dummy/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/test/dummy/public/422.html b/test/dummy/public/422.html new file mode 100644 index 0000000..a21f82b --- /dev/null +++ b/test/dummy/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/test/dummy/public/500.html b/test/dummy/public/500.html new file mode 100644 index 0000000..061abc5 --- /dev/null +++ b/test/dummy/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/test/dummy/public/apple-touch-icon-precomposed.png b/test/dummy/public/apple-touch-icon-precomposed.png new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/public/apple-touch-icon.png b/test/dummy/public/apple-touch-icon.png new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/public/favicon.ico b/test/dummy/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/test/samples/common.cssm b/test/samples/common.cssm new file mode 100644 index 0000000..81d40c0 --- /dev/null +++ b/test/samples/common.cssm @@ -0,0 +1,3 @@ +.bold { + font-weight: bold; +} diff --git a/test/samples/default.css b/test/samples/default.css new file mode 100644 index 0000000..93854b8 --- /dev/null +++ b/test/samples/default.css @@ -0,0 +1,3 @@ +.default { + color: blue; +} diff --git a/test/samples/test.cssm b/test/samples/test.cssm new file mode 100644 index 0000000..0675ed6 --- /dev/null +++ b/test/samples/test.cssm @@ -0,0 +1,13 @@ +.background { + background: yellow; +} + +.title { + composes: background; + color: red; +} + +.heading { + composes: bold from './common.cssm'; + color: pink; +} diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..671d4e2 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,16 @@ +ENV['RAILS_ENV'] ||= 'test' + +require File.expand_path('../../test/dummy/config/environment.rb', __FILE__) + +require 'rails/test_help' + +require 'minitest' +require 'minitest/autorun' +require 'minitest/spec' +require 'minitest/rails/capybara' + +require 'cssm/rails' + +# require_relative '../lib/cssm/rails' + +SAMPLE_DIR = File.join(__dir__, 'samples') diff --git a/vendor/bundle.js b/vendor/bundle.js new file mode 100644 index 0000000..fdfad28 --- /dev/null +++ b/vendor/bundle.js @@ -0,0 +1,21670 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.postcss_modules = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0 && bi > 0) { + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} + +},{}],3:[function(require,module,exports){ +/* big.js v3.1.3 https://github.com/MikeMcl/big.js/LICENCE */ +;(function (global) { + 'use strict'; + +/* + big.js v3.1.3 + A small, fast, easy-to-use library for arbitrary-precision decimal arithmetic. + https://github.com/MikeMcl/big.js/ + Copyright (c) 2014 Michael Mclaughlin + MIT Expat Licence +*/ + +/***************************** EDITABLE DEFAULTS ******************************/ + + // The default values below must be integers within the stated ranges. + + /* + * The maximum number of decimal places of the results of operations + * involving division: div and sqrt, and pow with negative exponents. + */ + var DP = 20, // 0 to MAX_DP + + /* + * The rounding mode used when rounding to the above decimal places. + * + * 0 Towards zero (i.e. truncate, no rounding). (ROUND_DOWN) + * 1 To nearest neighbour. If equidistant, round up. (ROUND_HALF_UP) + * 2 To nearest neighbour. If equidistant, to even. (ROUND_HALF_EVEN) + * 3 Away from zero. (ROUND_UP) + */ + RM = 1, // 0, 1, 2 or 3 + + // The maximum value of DP and Big.DP. + MAX_DP = 1E6, // 0 to 1000000 + + // The maximum magnitude of the exponent argument to the pow method. + MAX_POWER = 1E6, // 1 to 1000000 + + /* + * The exponent value at and beneath which toString returns exponential + * notation. + * JavaScript's Number type: -7 + * -1000000 is the minimum recommended exponent value of a Big. + */ + E_NEG = -7, // 0 to -1000000 + + /* + * The exponent value at and above which toString returns exponential + * notation. + * JavaScript's Number type: 21 + * 1000000 is the maximum recommended exponent value of a Big. + * (This limit is not enforced or checked.) + */ + E_POS = 21, // 0 to 1000000 + +/******************************************************************************/ + + // The shared prototype object. + P = {}, + isValid = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i, + Big; + + + /* + * Create and return a Big constructor. + * + */ + function bigFactory() { + + /* + * The Big constructor and exported function. + * Create and return a new instance of a Big number object. + * + * n {number|string|Big} A numeric value. + */ + function Big(n) { + var x = this; + + // Enable constructor usage without new. + if (!(x instanceof Big)) { + return n === void 0 ? bigFactory() : new Big(n); + } + + // Duplicate. + if (n instanceof Big) { + x.s = n.s; + x.e = n.e; + x.c = n.c.slice(); + } else { + parse(x, n); + } + + /* + * Retain a reference to this Big constructor, and shadow + * Big.prototype.constructor which points to Object. + */ + x.constructor = Big; + } + + Big.prototype = P; + Big.DP = DP; + Big.RM = RM; + Big.E_NEG = E_NEG; + Big.E_POS = E_POS; + + return Big; + } + + + // Private functions + + + /* + * Return a string representing the value of Big x in normal or exponential + * notation to dp fixed decimal places or significant digits. + * + * x {Big} The Big to format. + * dp {number} Integer, 0 to MAX_DP inclusive. + * toE {number} 1 (toExponential), 2 (toPrecision) or undefined (toFixed). + */ + function format(x, dp, toE) { + var Big = x.constructor, + + // The index (normal notation) of the digit that may be rounded up. + i = dp - (x = new Big(x)).e, + c = x.c; + + // Round? + if (c.length > ++dp) { + rnd(x, i, Big.RM); + } + + if (!c[0]) { + ++i; + } else if (toE) { + i = dp; + + // toFixed + } else { + c = x.c; + + // Recalculate i as x.e may have changed if value rounded up. + i = x.e + i + 1; + } + + // Append zeros? + for (; c.length < i; c.push(0)) { + } + i = x.e; + + /* + * toPrecision returns exponential notation if the number of + * significant digits specified is less than the number of digits + * necessary to represent the integer part of the value in normal + * notation. + */ + return toE === 1 || toE && (dp <= i || i <= Big.E_NEG) ? + + // Exponential notation. + (x.s < 0 && c[0] ? '-' : '') + + (c.length > 1 ? c[0] + '.' + c.join('').slice(1) : c[0]) + + (i < 0 ? 'e' : 'e+') + i + + // Normal notation. + : x.toString(); + } + + + /* + * Parse the number or string value passed to a Big constructor. + * + * x {Big} A Big number instance. + * n {number|string} A numeric value. + */ + function parse(x, n) { + var e, i, nL; + + // Minus zero? + if (n === 0 && 1 / n < 0) { + n = '-0'; + + // Ensure n is string and check validity. + } else if (!isValid.test(n += '')) { + throwErr(NaN); + } + + // Determine sign. + x.s = n.charAt(0) == '-' ? (n = n.slice(1), -1) : 1; + + // Decimal point? + if ((e = n.indexOf('.')) > -1) { + n = n.replace('.', ''); + } + + // Exponential form? + if ((i = n.search(/e/i)) > 0) { + + // Determine exponent. + if (e < 0) { + e = i; + } + e += +n.slice(i + 1); + n = n.substring(0, i); + + } else if (e < 0) { + + // Integer. + e = n.length; + } + + // Determine leading zeros. + for (i = 0; n.charAt(i) == '0'; i++) { + } + + if (i == (nL = n.length)) { + + // Zero. + x.c = [ x.e = 0 ]; + } else { + + // Determine trailing zeros. + for (; n.charAt(--nL) == '0';) { + } + + x.e = e - i - 1; + x.c = []; + + // Convert string to array of digits without leading/trailing zeros. + for (e = 0; i <= nL; x.c[e++] = +n.charAt(i++)) { + } + } + + return x; + } + + + /* + * Round Big x to a maximum of dp decimal places using rounding mode rm. + * Called by div, sqrt and round. + * + * x {Big} The Big to round. + * dp {number} Integer, 0 to MAX_DP inclusive. + * rm {number} 0, 1, 2 or 3 (DOWN, HALF_UP, HALF_EVEN, UP) + * [more] {boolean} Whether the result of division was truncated. + */ + function rnd(x, dp, rm, more) { + var u, + xc = x.c, + i = x.e + dp + 1; + + if (rm === 1) { + + // xc[i] is the digit after the digit that may be rounded up. + more = xc[i] >= 5; + } else if (rm === 2) { + more = xc[i] > 5 || xc[i] == 5 && + (more || i < 0 || xc[i + 1] !== u || xc[i - 1] & 1); + } else if (rm === 3) { + more = more || xc[i] !== u || i < 0; + } else { + more = false; + + if (rm !== 0) { + throwErr('!Big.RM!'); + } + } + + if (i < 1 || !xc[0]) { + + if (more) { + + // 1, 0.1, 0.01, 0.001, 0.0001 etc. + x.e = -dp; + x.c = [1]; + } else { + + // Zero. + x.c = [x.e = 0]; + } + } else { + + // Remove any digits after the required decimal places. + xc.length = i--; + + // Round up? + if (more) { + + // Rounding up may mean the previous digit has to be rounded up. + for (; ++xc[i] > 9;) { + xc[i] = 0; + + if (!i--) { + ++x.e; + xc.unshift(1); + } + } + } + + // Remove trailing zeros. + for (i = xc.length; !xc[--i]; xc.pop()) { + } + } + + return x; + } + + + /* + * Throw a BigError. + * + * message {string} The error message. + */ + function throwErr(message) { + var err = new Error(message); + err.name = 'BigError'; + + throw err; + } + + + // Prototype/instance methods + + + /* + * Return a new Big whose value is the absolute value of this Big. + */ + P.abs = function () { + var x = new this.constructor(this); + x.s = 1; + + return x; + }; + + + /* + * Return + * 1 if the value of this Big is greater than the value of Big y, + * -1 if the value of this Big is less than the value of Big y, or + * 0 if they have the same value. + */ + P.cmp = function (y) { + var xNeg, + x = this, + xc = x.c, + yc = (y = new x.constructor(y)).c, + i = x.s, + j = y.s, + k = x.e, + l = y.e; + + // Either zero? + if (!xc[0] || !yc[0]) { + return !xc[0] ? !yc[0] ? 0 : -j : i; + } + + // Signs differ? + if (i != j) { + return i; + } + xNeg = i < 0; + + // Compare exponents. + if (k != l) { + return k > l ^ xNeg ? 1 : -1; + } + + i = -1; + j = (k = xc.length) < (l = yc.length) ? k : l; + + // Compare digit by digit. + for (; ++i < j;) { + + if (xc[i] != yc[i]) { + return xc[i] > yc[i] ^ xNeg ? 1 : -1; + } + } + + // Compare lengths. + return k == l ? 0 : k > l ^ xNeg ? 1 : -1; + }; + + + /* + * Return a new Big whose value is the value of this Big divided by the + * value of Big y, rounded, if necessary, to a maximum of Big.DP decimal + * places using rounding mode Big.RM. + */ + P.div = function (y) { + var x = this, + Big = x.constructor, + // dividend + dvd = x.c, + //divisor + dvs = (y = new Big(y)).c, + s = x.s == y.s ? 1 : -1, + dp = Big.DP; + + if (dp !== ~~dp || dp < 0 || dp > MAX_DP) { + throwErr('!Big.DP!'); + } + + // Either 0? + if (!dvd[0] || !dvs[0]) { + + // If both are 0, throw NaN + if (dvd[0] == dvs[0]) { + throwErr(NaN); + } + + // If dvs is 0, throw +-Infinity. + if (!dvs[0]) { + throwErr(s / 0); + } + + // dvd is 0, return +-0. + return new Big(s * 0); + } + + var dvsL, dvsT, next, cmp, remI, u, + dvsZ = dvs.slice(), + dvdI = dvsL = dvs.length, + dvdL = dvd.length, + // remainder + rem = dvd.slice(0, dvsL), + remL = rem.length, + // quotient + q = y, + qc = q.c = [], + qi = 0, + digits = dp + (q.e = x.e - y.e) + 1; + + q.s = s; + s = digits < 0 ? 0 : digits; + + // Create version of divisor with leading zero. + dvsZ.unshift(0); + + // Add zeros to make remainder as long as divisor. + for (; remL++ < dvsL; rem.push(0)) { + } + + do { + + // 'next' is how many times the divisor goes into current remainder. + for (next = 0; next < 10; next++) { + + // Compare divisor and remainder. + if (dvsL != (remL = rem.length)) { + cmp = dvsL > remL ? 1 : -1; + } else { + + for (remI = -1, cmp = 0; ++remI < dvsL;) { + + if (dvs[remI] != rem[remI]) { + cmp = dvs[remI] > rem[remI] ? 1 : -1; + break; + } + } + } + + // If divisor < remainder, subtract divisor from remainder. + if (cmp < 0) { + + // Remainder can't be more than 1 digit longer than divisor. + // Equalise lengths using divisor with extra leading zero? + for (dvsT = remL == dvsL ? dvs : dvsZ; remL;) { + + if (rem[--remL] < dvsT[remL]) { + remI = remL; + + for (; remI && !rem[--remI]; rem[remI] = 9) { + } + --rem[remI]; + rem[remL] += 10; + } + rem[remL] -= dvsT[remL]; + } + for (; !rem[0]; rem.shift()) { + } + } else { + break; + } + } + + // Add the 'next' digit to the result array. + qc[qi++] = cmp ? next : ++next; + + // Update the remainder. + if (rem[0] && cmp) { + rem[remL] = dvd[dvdI] || 0; + } else { + rem = [ dvd[dvdI] ]; + } + + } while ((dvdI++ < dvdL || rem[0] !== u) && s--); + + // Leading zero? Do not remove if result is simply zero (qi == 1). + if (!qc[0] && qi != 1) { + + // There can't be more than one zero. + qc.shift(); + q.e--; + } + + // Round? + if (qi > digits) { + rnd(q, dp, Big.RM, rem[0] !== u); + } + + return q; + }; + + + /* + * Return true if the value of this Big is equal to the value of Big y, + * otherwise returns false. + */ + P.eq = function (y) { + return !this.cmp(y); + }; + + + /* + * Return true if the value of this Big is greater than the value of Big y, + * otherwise returns false. + */ + P.gt = function (y) { + return this.cmp(y) > 0; + }; + + + /* + * Return true if the value of this Big is greater than or equal to the + * value of Big y, otherwise returns false. + */ + P.gte = function (y) { + return this.cmp(y) > -1; + }; + + + /* + * Return true if the value of this Big is less than the value of Big y, + * otherwise returns false. + */ + P.lt = function (y) { + return this.cmp(y) < 0; + }; + + + /* + * Return true if the value of this Big is less than or equal to the value + * of Big y, otherwise returns false. + */ + P.lte = function (y) { + return this.cmp(y) < 1; + }; + + + /* + * Return a new Big whose value is the value of this Big minus the value + * of Big y. + */ + P.sub = P.minus = function (y) { + var i, j, t, xLTy, + x = this, + Big = x.constructor, + a = x.s, + b = (y = new Big(y)).s; + + // Signs differ? + if (a != b) { + y.s = -b; + return x.plus(y); + } + + var xc = x.c.slice(), + xe = x.e, + yc = y.c, + ye = y.e; + + // Either zero? + if (!xc[0] || !yc[0]) { + + // y is non-zero? x is non-zero? Or both are zero. + return yc[0] ? (y.s = -b, y) : new Big(xc[0] ? x : 0); + } + + // Determine which is the bigger number. + // Prepend zeros to equalise exponents. + if (a = xe - ye) { + + if (xLTy = a < 0) { + a = -a; + t = xc; + } else { + ye = xe; + t = yc; + } + + t.reverse(); + for (b = a; b--; t.push(0)) { + } + t.reverse(); + } else { + + // Exponents equal. Check digit by digit. + j = ((xLTy = xc.length < yc.length) ? xc : yc).length; + + for (a = b = 0; b < j; b++) { + + if (xc[b] != yc[b]) { + xLTy = xc[b] < yc[b]; + break; + } + } + } + + // x < y? Point xc to the array of the bigger number. + if (xLTy) { + t = xc; + xc = yc; + yc = t; + y.s = -y.s; + } + + /* + * Append zeros to xc if shorter. No need to add zeros to yc if shorter + * as subtraction only needs to start at yc.length. + */ + if (( b = (j = yc.length) - (i = xc.length) ) > 0) { + + for (; b--; xc[i++] = 0) { + } + } + + // Subtract yc from xc. + for (b = i; j > a;){ + + if (xc[--j] < yc[j]) { + + for (i = j; i && !xc[--i]; xc[i] = 9) { + } + --xc[i]; + xc[j] += 10; + } + xc[j] -= yc[j]; + } + + // Remove trailing zeros. + for (; xc[--b] === 0; xc.pop()) { + } + + // Remove leading zeros and adjust exponent accordingly. + for (; xc[0] === 0;) { + xc.shift(); + --ye; + } + + if (!xc[0]) { + + // n - n = +0 + y.s = 1; + + // Result must be zero. + xc = [ye = 0]; + } + + y.c = xc; + y.e = ye; + + return y; + }; + + + /* + * Return a new Big whose value is the value of this Big modulo the + * value of Big y. + */ + P.mod = function (y) { + var yGTx, + x = this, + Big = x.constructor, + a = x.s, + b = (y = new Big(y)).s; + + if (!y.c[0]) { + throwErr(NaN); + } + + x.s = y.s = 1; + yGTx = y.cmp(x) == 1; + x.s = a; + y.s = b; + + if (yGTx) { + return new Big(x); + } + + a = Big.DP; + b = Big.RM; + Big.DP = Big.RM = 0; + x = x.div(y); + Big.DP = a; + Big.RM = b; + + return this.minus( x.times(y) ); + }; + + + /* + * Return a new Big whose value is the value of this Big plus the value + * of Big y. + */ + P.add = P.plus = function (y) { + var t, + x = this, + Big = x.constructor, + a = x.s, + b = (y = new Big(y)).s; + + // Signs differ? + if (a != b) { + y.s = -b; + return x.minus(y); + } + + var xe = x.e, + xc = x.c, + ye = y.e, + yc = y.c; + + // Either zero? + if (!xc[0] || !yc[0]) { + + // y is non-zero? x is non-zero? Or both are zero. + return yc[0] ? y : new Big(xc[0] ? x : a * 0); + } + xc = xc.slice(); + + // Prepend zeros to equalise exponents. + // Note: Faster to use reverse then do unshifts. + if (a = xe - ye) { + + if (a > 0) { + ye = xe; + t = yc; + } else { + a = -a; + t = xc; + } + + t.reverse(); + for (; a--; t.push(0)) { + } + t.reverse(); + } + + // Point xc to the longer array. + if (xc.length - yc.length < 0) { + t = yc; + yc = xc; + xc = t; + } + a = yc.length; + + /* + * Only start adding at yc.length - 1 as the further digits of xc can be + * left as they are. + */ + for (b = 0; a;) { + b = (xc[--a] = xc[a] + yc[a] + b) / 10 | 0; + xc[a] %= 10; + } + + // No need to check for zero, as +x + +y != 0 && -x + -y != 0 + + if (b) { + xc.unshift(b); + ++ye; + } + + // Remove trailing zeros. + for (a = xc.length; xc[--a] === 0; xc.pop()) { + } + + y.c = xc; + y.e = ye; + + return y; + }; + + + /* + * Return a Big whose value is the value of this Big raised to the power n. + * If n is negative, round, if necessary, to a maximum of Big.DP decimal + * places using rounding mode Big.RM. + * + * n {number} Integer, -MAX_POWER to MAX_POWER inclusive. + */ + P.pow = function (n) { + var x = this, + one = new x.constructor(1), + y = one, + isNeg = n < 0; + + if (n !== ~~n || n < -MAX_POWER || n > MAX_POWER) { + throwErr('!pow!'); + } + + n = isNeg ? -n : n; + + for (;;) { + + if (n & 1) { + y = y.times(x); + } + n >>= 1; + + if (!n) { + break; + } + x = x.times(x); + } + + return isNeg ? one.div(y) : y; + }; + + + /* + * Return a new Big whose value is the value of this Big rounded to a + * maximum of dp decimal places using rounding mode rm. + * If dp is not specified, round to 0 decimal places. + * If rm is not specified, use Big.RM. + * + * [dp] {number} Integer, 0 to MAX_DP inclusive. + * [rm] 0, 1, 2 or 3 (ROUND_DOWN, ROUND_HALF_UP, ROUND_HALF_EVEN, ROUND_UP) + */ + P.round = function (dp, rm) { + var x = this, + Big = x.constructor; + + if (dp == null) { + dp = 0; + } else if (dp !== ~~dp || dp < 0 || dp > MAX_DP) { + throwErr('!round!'); + } + rnd(x = new Big(x), dp, rm == null ? Big.RM : rm); + + return x; + }; + + + /* + * Return a new Big whose value is the square root of the value of this Big, + * rounded, if necessary, to a maximum of Big.DP decimal places using + * rounding mode Big.RM. + */ + P.sqrt = function () { + var estimate, r, approx, + x = this, + Big = x.constructor, + xc = x.c, + i = x.s, + e = x.e, + half = new Big('0.5'); + + // Zero? + if (!xc[0]) { + return new Big(x); + } + + // If negative, throw NaN. + if (i < 0) { + throwErr(NaN); + } + + // Estimate. + i = Math.sqrt(x.toString()); + + // Math.sqrt underflow/overflow? + // Pass x to Math.sqrt as integer, then adjust the result exponent. + if (i === 0 || i === 1 / 0) { + estimate = xc.join(''); + + if (!(estimate.length + e & 1)) { + estimate += '0'; + } + + r = new Big( Math.sqrt(estimate).toString() ); + r.e = ((e + 1) / 2 | 0) - (e < 0 || e & 1); + } else { + r = new Big(i.toString()); + } + + i = r.e + (Big.DP += 4); + + // Newton-Raphson iteration. + do { + approx = r; + r = half.times( approx.plus( x.div(approx) ) ); + } while ( approx.c.slice(0, i).join('') !== + r.c.slice(0, i).join('') ); + + rnd(r, Big.DP -= 4, Big.RM); + + return r; + }; + + + /* + * Return a new Big whose value is the value of this Big times the value of + * Big y. + */ + P.mul = P.times = function (y) { + var c, + x = this, + Big = x.constructor, + xc = x.c, + yc = (y = new Big(y)).c, + a = xc.length, + b = yc.length, + i = x.e, + j = y.e; + + // Determine sign of result. + y.s = x.s == y.s ? 1 : -1; + + // Return signed 0 if either 0. + if (!xc[0] || !yc[0]) { + return new Big(y.s * 0); + } + + // Initialise exponent of result as x.e + y.e. + y.e = i + j; + + // If array xc has fewer digits than yc, swap xc and yc, and lengths. + if (a < b) { + c = xc; + xc = yc; + yc = c; + j = a; + a = b; + b = j; + } + + // Initialise coefficient array of result with zeros. + for (c = new Array(j = a + b); j--; c[j] = 0) { + } + + // Multiply. + + // i is initially xc.length. + for (i = b; i--;) { + b = 0; + + // a is yc.length. + for (j = a + i; j > i;) { + + // Current sum of products at this digit position, plus carry. + b = c[j] + yc[i] * xc[j - i - 1] + b; + c[j--] = b % 10; + + // carry + b = b / 10 | 0; + } + c[j] = (c[j] + b) % 10; + } + + // Increment result exponent if there is a final carry. + if (b) { + ++y.e; + } + + // Remove any leading zero. + if (!c[0]) { + c.shift(); + } + + // Remove trailing zeros. + for (i = c.length; !c[--i]; c.pop()) { + } + y.c = c; + + return y; + }; + + + /* + * Return a string representing the value of this Big. + * Return exponential notation if this Big has a positive exponent equal to + * or greater than Big.E_POS, or a negative exponent equal to or less than + * Big.E_NEG. + */ + P.toString = P.valueOf = P.toJSON = function () { + var x = this, + Big = x.constructor, + e = x.e, + str = x.c.join(''), + strL = str.length; + + // Exponential notation? + if (e <= Big.E_NEG || e >= Big.E_POS) { + str = str.charAt(0) + (strL > 1 ? '.' + str.slice(1) : '') + + (e < 0 ? 'e' : 'e+') + e; + + // Negative exponent? + } else if (e < 0) { + + // Prepend zeros. + for (; ++e; str = '0' + str) { + } + str = '0.' + str; + + // Positive exponent? + } else if (e > 0) { + + if (++e > strL) { + + // Append zeros. + for (e -= strL; e-- ; str += '0') { + } + } else if (e < strL) { + str = str.slice(0, e) + '.' + str.slice(e); + } + + // Exponent zero. + } else if (strL > 1) { + str = str.charAt(0) + '.' + str.slice(1); + } + + // Avoid '-0' + return x.s < 0 && x.c[0] ? '-' + str : str; + }; + + + /* + *************************************************************************** + * If toExponential, toFixed, toPrecision and format are not required they + * can safely be commented-out or deleted. No redundant code will be left. + * format is used only by toExponential, toFixed and toPrecision. + *************************************************************************** + */ + + + /* + * Return a string representing the value of this Big in exponential + * notation to dp fixed decimal places and rounded, if necessary, using + * Big.RM. + * + * [dp] {number} Integer, 0 to MAX_DP inclusive. + */ + P.toExponential = function (dp) { + + if (dp == null) { + dp = this.c.length - 1; + } else if (dp !== ~~dp || dp < 0 || dp > MAX_DP) { + throwErr('!toExp!'); + } + + return format(this, dp, 1); + }; + + + /* + * Return a string representing the value of this Big in normal notation + * to dp fixed decimal places and rounded, if necessary, using Big.RM. + * + * [dp] {number} Integer, 0 to MAX_DP inclusive. + */ + P.toFixed = function (dp) { + var str, + x = this, + Big = x.constructor, + neg = Big.E_NEG, + pos = Big.E_POS; + + // Prevent the possibility of exponential notation. + Big.E_NEG = -(Big.E_POS = 1 / 0); + + if (dp == null) { + str = x.toString(); + } else if (dp === ~~dp && dp >= 0 && dp <= MAX_DP) { + str = format(x, x.e + dp); + + // (-0).toFixed() is '0', but (-0.1).toFixed() is '-0'. + // (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'. + if (x.s < 0 && x.c[0] && str.indexOf('-') < 0) { + //E.g. -0.5 if rounded to -0 will cause toString to omit the minus sign. + str = '-' + str; + } + } + Big.E_NEG = neg; + Big.E_POS = pos; + + if (!str) { + throwErr('!toFix!'); + } + + return str; + }; + + + /* + * Return a string representing the value of this Big rounded to sd + * significant digits using Big.RM. Use exponential notation if sd is less + * than the number of digits necessary to represent the integer part of the + * value in normal notation. + * + * sd {number} Integer, 1 to MAX_DP inclusive. + */ + P.toPrecision = function (sd) { + + if (sd == null) { + return this.toString(); + } else if (sd !== ~~sd || sd < 1 || sd > MAX_DP) { + throwErr('!toPre!'); + } + + return format(this, sd - 1, 2); + }; + + + // Export + + + Big = bigFactory(); + + //AMD. + if (typeof define === 'function' && define.amd) { + define(function () { + return Big; + }); + + // Node and other CommonJS-like environments that support module.exports. + } else if (typeof module !== 'undefined' && module.exports) { + module.exports = Big; + + //Browser. + } else { + global.Big = Big; + } +})(this); + +},{}],4:[function(require,module,exports){ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = /^(.*,)+(.+)?$/.test(m.body); + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + + +},{"balanced-match":2,"concat-map":5}],5:[function(require,module,exports){ +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +},{}],6:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +var _postcss = require('postcss'); + +var _postcss2 = _interopRequireDefault(_postcss); + +var _postcssModulesLocalByDefault = require('postcss-modules-local-by-default'); + +var _postcssModulesLocalByDefault2 = _interopRequireDefault(_postcssModulesLocalByDefault); + +var _postcssModulesExtractImports = require('postcss-modules-extract-imports'); + +var _postcssModulesExtractImports2 = _interopRequireDefault(_postcssModulesExtractImports); + +var _postcssModulesScope = require('postcss-modules-scope'); + +var _postcssModulesScope2 = _interopRequireDefault(_postcssModulesScope); + +var _postcssModulesValues = require('postcss-modules-values'); + +var _postcssModulesValues2 = _interopRequireDefault(_postcssModulesValues); + +var _parser = require('./parser'); + +var _parser2 = _interopRequireDefault(_parser); + +var Core = (function () { + function Core(plugins) { + _classCallCheck(this, Core); + + this.plugins = plugins || Core.defaultPlugins; + } + + // These four plugins are aliased under this package for simplicity. + + _createClass(Core, [{ + key: 'load', + value: function load(sourceString, sourcePath, trace, pathFetcher) { + var parser = new _parser2['default'](pathFetcher, trace); + + return (0, _postcss2['default'])(this.plugins.concat([parser.plugin])).process(sourceString, { from: "/" + sourcePath }).then(function (result) { + return { injectableSource: result.css, exportTokens: parser.exportTokens }; + }); + } + }]); + + return Core; +})(); + +exports['default'] = Core; +Core.values = _postcssModulesValues2['default']; +Core.localByDefault = _postcssModulesLocalByDefault2['default']; +Core.extractImports = _postcssModulesExtractImports2['default']; +Core.scope = _postcssModulesScope2['default']; + +Core.defaultPlugins = [_postcssModulesValues2['default'], _postcssModulesLocalByDefault2['default'], _postcssModulesExtractImports2['default'], _postcssModulesScope2['default']]; +module.exports = exports['default']; +},{"./parser":7,"postcss":45,"postcss-modules-extract-imports":29,"postcss-modules-local-by-default":30,"postcss-modules-scope":31,"postcss-modules-values":32}],7:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var _icssReplaceSymbols = require('icss-replace-symbols'); + +var _icssReplaceSymbols2 = _interopRequireDefault(_icssReplaceSymbols); + +var importRegexp = /^:import\((.+)\)$/; + +var Parser = (function () { + function Parser(pathFetcher, trace) { + _classCallCheck(this, Parser); + + this.pathFetcher = pathFetcher; + this.plugin = this.plugin.bind(this); + this.exportTokens = {}; + this.translations = {}; + this.trace = trace; + } + + _createClass(Parser, [{ + key: "plugin", + value: function plugin(css, result) { + var _this = this; + + return Promise.all(this.fetchAllImports(css)).then(function (_) { + return _this.linkImportedSymbols(css); + }).then(function (_) { + return _this.extractExports(css); + }); + } + }, { + key: "fetchAllImports", + value: function fetchAllImports(css) { + var _this2 = this; + + var imports = []; + css.each(function (node) { + if (node.type == "rule" && node.selector.match(importRegexp)) { + imports.push(_this2.fetchImport(node, css.source.input.from, imports.length)); + } + }); + return imports; + } + }, { + key: "linkImportedSymbols", + value: function linkImportedSymbols(css) { + (0, _icssReplaceSymbols2["default"])(css, this.translations); + } + }, { + key: "extractExports", + value: function extractExports(css) { + var _this3 = this; + + css.each(function (node) { + if (node.type == "rule" && node.selector == ":export") _this3.handleExport(node); + }); + } + }, { + key: "handleExport", + value: function handleExport(exportNode) { + var _this4 = this; + + exportNode.each(function (decl) { + if (decl.type == 'decl') { + Object.keys(_this4.translations).forEach(function (translation) { + decl.value = decl.value.replace(translation, _this4.translations[translation]); + }); + _this4.exportTokens[decl.prop] = decl.value; + } + }); + exportNode.remove(); + } + }, { + key: "fetchImport", + value: function fetchImport(importNode, relativeTo, depNr) { + var _this5 = this; + + var file = importNode.selector.match(importRegexp)[1], + depTrace = this.trace + String.fromCharCode(depNr); + return this.pathFetcher(file, relativeTo, depTrace).then(function (exports) { + importNode.each(function (decl) { + if (decl.type == 'decl') { + _this5.translations[decl.prop] = exports[decl.value]; + } + }); + importNode.remove(); + }, function (err) { + return console.log(err); + }); + } + }]); + + return Parser; +})(); + +exports["default"] = Parser; +module.exports = exports["default"]; +},{"icss-replace-symbols":20}],8:[function(require,module,exports){ +exports.parse = require("./parse"); +exports.stringify = require("./stringify"); +exports.parseValues = require("./parseValues"); +exports.stringifyValues = require("./stringifyValues"); + +},{"./parse":9,"./parseValues":10,"./stringify":11,"./stringifyValues":12}],9:[function(require,module,exports){ +"use strict"; + +var Parser = require("fastparse"); +var regexpu = require("regexpu-core"); + +function unescape(str) { + return str.replace(/\\(.)/g, "$1"); +} + +function commentMatch(match, content) { + this.selector.nodes.push({ + type: "comment", + content: content + }); +} + +function typeMatch(type) { + return function(match, name) { + this.selector.nodes.push({ + type: type, + name: unescape(name) + }); + }; +} + +function pseudoClassStartMatch(match, name) { + var newToken = { + type: "pseudo-class", + name: unescape(name), + content: "" + }; + this.selector.nodes.push(newToken); + this.token = newToken; + this.brackets = 1; + return "inBrackets"; +} + +function nestedPseudoClassStartMatch(match, name, after) { + var newSelector = { + type: "selector", + nodes: [] + }; + var newToken = { + type: "nested-pseudo-class", + name: unescape(name), + nodes: [newSelector] + }; + if(after) { + newSelector.before = after; + } + this.selector.nodes.push(newToken); + this.stack.push(this.root); + this.root = newToken; + this.selector = newSelector; +} + +function nestedEnd(match, before) { + if(this.stack.length > 0) { + if(before) { + this.selector.after = before; + } + this.root = this.stack.pop(); + this.selector = this.root.nodes[this.root.nodes.length - 1]; + } else { + this.selector.nodes.push({ + type: "invalid", + value: match + }); + } +} + +function operatorMatch(match, before, operator, after) { + var token = { + type: "operator", + operator: operator + }; + if(before) { + token.before = before; + } + if(after) { + token.after = after; + } + this.selector.nodes.push(token); +} + +function spacingMatch(match) { + this.selector.nodes.push({ + type: "spacing", + value: match + }); +} + +function elementMatch(match, namespace, name) { + var newToken = { + type: "element", + name: unescape(name) + }; + + if(namespace) { + newToken.namespace = unescape(namespace.substr(0, namespace.length - 1)); + } + this.selector.nodes.push(newToken); +} + +function universalMatch(match, namespace) { + var newToken = { + type: "universal" + }; + if(namespace) { + newToken.namespace = unescape(namespace.substr(0, namespace.length - 1)); + } + this.selector.nodes.push(newToken); +} + +function attributeMatch(match, content) { + this.selector.nodes.push({ + type: "attribute", + content: content + }); +} + +function invalidMatch(match) { + this.selector.nodes.push({ + type: "invalid", + value: match + }); +} + +function irrelevantSpacingStartMatch(match) { + this.selector.before = match; +} + +function irrelevantSpacingEndMatch(match) { + this.selector.after = match; +} + +function nextSelectorMatch(match, before, after) { + var newSelector = { + type: "selector", + nodes: [] + }; + if(before) { + this.selector.after = before; + } + if(after) { + newSelector.before = after; + } + this.root.nodes.push(newSelector); + this.selector = newSelector; +} + +function addToCurrent(match) { + this.token.content += match; +} + +function bracketStart(match) { + this.token.content += match; + this.brackets++; +} + +function bracketEnd(match) { + if(--this.brackets === 0) { + return "selector"; + } + this.token.content += match; +} + +function getSelectors() { + // The assignment here is split to preserve the property enumeration order. + var selectors = { + "/\\*([\\s\\S]*?)\\*/": commentMatch + }; + // https://www.w3.org/TR/CSS21/syndata.html#characters + // 4.1.3: identifiers (...) can contain only the characters [a-zA-Z0-9] and + // ISO 10646 characters U+00A0 and higher, plus the hyphen (-) and the underscore (_) + // + // 10ffff is the maximum allowed in current Unicode + selectors[regexpu("\\.((?:\\\\.|[A-Za-z_\\-\\u{00a0}-\\u{10ffff}])(?:\\\\.|[A-Za-z_\\-0-9\\u{00a0}-\\u{10ffff}])*)", "u")] = typeMatch("class"); + selectors[regexpu("#((?:\\\\.|[A-Za-z_\\-\\u{00a0}-\\u{10ffff}])(?:\\\\.|[A-Za-z_\\-0-9\\u{00a0}-\\u{10ffff}])*)", "u")] = typeMatch("id"); + var selectorsSecondHalf = { + ":(not|matches|has|local|global)\\((\\s*)": nestedPseudoClassStartMatch, + ":((?:\\\\.|[A-Za-z_\\-0-9])+)\\(": pseudoClassStartMatch, + ":((?:\\\\.|[A-Za-z_\\-0-9])+)": typeMatch("pseudo-class"), + "::((?:\\\\.|[A-Za-z_\\-0-9])+)": typeMatch("pseudo-element"), + "(\\*\\|)((?:\\\\.|[A-Za-z_\\-0-9])+)": elementMatch, + "(\\*\\|)\\*": universalMatch, + "((?:\\\\.|[A-Za-z_\\-0-9])*\\|)?\\*": universalMatch, + "((?:\\\\.|[A-Za-z_\\-0-9])*\\|)?((?:\\\\.|[A-Za-z_\\-])(?:\\\\.|[A-Za-z_\\-0-9])*)": elementMatch, + "\\[([^\\]]+)\\]": attributeMatch, + "(\\s*)\\)": nestedEnd, + "(\\s*)((?:\\|\\|)|(?:>>)|[>+~])(\\s*)": operatorMatch, + "(\\s*),(\\s*)": nextSelectorMatch, + "\\s+$": irrelevantSpacingEndMatch, + "^\\s+": irrelevantSpacingStartMatch, + "\\s+": spacingMatch, + ".": invalidMatch + }; + var selector; + for (selector in selectorsSecondHalf) { + if (Object.prototype.hasOwnProperty.call(selectorsSecondHalf, selector)) { + selectors[selector] = selectorsSecondHalf[selector]; + } + } + return selectors; +} + +var parser = new Parser({ + selector: getSelectors(), + inBrackets: { + "/\\*[\\s\\S]*?\\*/": addToCurrent, + "\"([^\\\\\"]|\\\\.)*\"": addToCurrent, + "'([^\\\\']|\\\\.)*'": addToCurrent, + "[^()'\"/]+": addToCurrent, + "\\(": bracketStart, + "\\)": bracketEnd, + ".": addToCurrent + } +}); + +function parse(str) { + var selectorNode = { + type: "selector", + nodes: [] + }; + var rootNode = { + type: "selectors", + nodes: [ + selectorNode + ] + }; + parser.parse("selector", str, { + stack: [], + root: rootNode, + selector: selectorNode + }); + return rootNode; +} + +module.exports = parse; + +},{"fastparse":15,"regexpu-core":71}],10:[function(require,module,exports){ +"use strict"; + +var Parser = require("fastparse"); + +function commentMatch(match, content) { + this.value.nodes.push({ + type: "comment", + content: content + }); +} + +function spacingMatch(match) { + var item = this.value.nodes[this.value.nodes.length - 1]; + item.after = (item.after || "") + match; +} + +function initialSpacingMatch(match) { + this.value.before = match; +} + +function endSpacingMatch(match) { + this.value.after = match; +} + +function unescapeString(content) { + return content.replace(/\\(?:([a-fA-F0-9]{1,6})|(.))/g, function(all, unicode, otherCharacter) { + if (otherCharacter) { + return otherCharacter; + } + + var C = parseInt(unicode, 16); + if(C < 0x10000) { + return String.fromCharCode(C); + } else { + return String.fromCharCode(Math.floor((C - 0x10000) / 0x400) + 0xD800) + + String.fromCharCode((C - 0x10000) % 0x400 + 0xDC00); + } + }); +} + +function stringMatch(match, content) { + var value = unescapeString(content); + this.value.nodes.push({ + type: "string", + value: value, + stringType: match[0] + }); +} + +function commaMatch(match, spacing) { + var newValue = { + type: "value", + nodes: [] + }; + if(spacing) { + newValue.before = spacing; + } + this.root.nodes.push(newValue); + this.value = newValue; +} + +function itemMatch(match) { + this.value.nodes.push({ + type: "item", + name: match + }); +} + +function nestedItemMatch(match, name, spacing) { + this.stack.push(this.root); + this.root = { + type: "nested-item", + name: name, + nodes: [ + { type: "value", nodes: [] } + ] + }; + if(spacing) { + this.root.nodes[0].before = spacing; + } + this.value.nodes.push(this.root); + this.value = this.root.nodes[0]; +} + +function nestedItemEndMatch(match, spacing, remaining) { + if(this.stack.length === 0) { + if(spacing) { + var item = this.value.nodes[this.value.nodes.length - 1]; + item.after = (item.after || "") + spacing; + } + this.value.nodes.push({ + type: "invalid", + value: remaining + }); + } else { + if(spacing) { + this.value.after = spacing; + } + this.root = this.stack.pop(); + this.value = this.root.nodes[this.root.nodes.length - 1]; + } +} + +function urlMatch(match, innerSpacingBefore, content, innerSpacingAfter) { + var item = { + type: "url" + }; + if(innerSpacingBefore) { + item.innerSpacingBefore = innerSpacingBefore; + } + if(innerSpacingAfter) { + item.innerSpacingAfter = innerSpacingAfter; + } + switch(content[0]) { + case "\"": + item.stringType = "\""; + item.url = unescapeString(content.substr(1, content.length - 2)); + break; + case "'": + item.stringType = "'"; + item.url = unescapeString(content.substr(1, content.length - 2)); + break; + default: + item.url = unescapeString(content); + break; + } + this.value.nodes.push(item); +} + +var parser = new Parser({ + decl: { + "^\\s+": initialSpacingMatch, + "/\\*([\\s\\S]*?)\\*/": commentMatch, + "\"((?:[^\\\\\"]|\\\\.)*)\"": stringMatch, + "'((?:[^\\\\']|\\\\.)*)'": stringMatch, + "url\\((\\s*)(\"(?:[^\\\\\"]|\\\\.)*\")(\\s*)\\)": urlMatch, + "url\\((\\s*)('(?:[^\\\\']|\\\\.)*')(\\s*)\\)": urlMatch, + "url\\((\\s*)((?:[^\\\\)'\"]|\\\\.)*)(\\s*)\\)": urlMatch, + "([\\w\-]+)\\((\\s*)": nestedItemMatch, + "(\\s*)(\\))": nestedItemEndMatch, + ",(\\s*)": commaMatch, + "\\s+$": endSpacingMatch, + "\\s+": spacingMatch, + "[^\\s,\)]+": itemMatch + } +}); + +function parseValues(str) { + var valueNode = { + type: "value", + nodes: [] + }; + var rootNode = { + type: "values", + nodes: [ + valueNode + ] + }; + parser.parse("decl", str, { + stack: [], + root: rootNode, + value: valueNode + }); + return rootNode; +} + +module.exports = parseValues; + +},{"fastparse":15}],11:[function(require,module,exports){ +"use strict"; + +var stringify; + +var regexpu = require("regexpu-core"); +var identifierEscapeRegexp = new RegExp( + regexpu("(^[^A-Za-z_\\-\\u{00a0}-\\u{10ffff}]|^\\-\\-|[^A-Za-z_0-9\\-\\u{00a0}-\\u{10ffff}])", "ug"), + "g" +); + +function escape(str, identifier) { + if(str === "*") { + return "*"; + } + if (identifier) { + return str.replace(identifierEscapeRegexp, "\\$1"); + } else { + return str.replace(/(^[^A-Za-z_\\-]|^\-\-|[^A-Za-z_0-9\\-])/g, "\\$1"); + } +} + +function stringifyWithoutBeforeAfter(tree) { + switch(tree.type) { + case "selectors": + return tree.nodes.map(stringify).join(","); + case "selector": + return tree.nodes.map(stringify).join(""); + case "element": + return (typeof tree.namespace === "string" ? escape(tree.namespace) + "|" : "") + escape(tree.name); + case "class": + return "." + escape(tree.name, true); + case "id": + return "#" + escape(tree.name, true); + case "attribute": + return "[" + tree.content + "]"; + case "spacing": + return tree.value; + case "pseudo-class": + return ":" + escape(tree.name) + (typeof tree.content === "string" ? "(" + tree.content + ")" : ""); + case "nested-pseudo-class": + return ":" + escape(tree.name) + "(" + tree.nodes.map(stringify).join(",") + ")"; + case "pseudo-element": + return "::" + escape(tree.name); + case "universal": + return (typeof tree.namespace === "string" ? escape(tree.namespace) + "|" : "") + "*"; + case "operator": + return tree.operator; + case "comment": + return "/*" + tree.content + "*/"; + case "invalid": + return tree.value; + } +} + + +stringify = function stringify(tree) { + var str = stringifyWithoutBeforeAfter(tree); + if(tree.before) { + str = tree.before + str; + } + if(tree.after) { + str = str + tree.after; + } + return str; +}; + +module.exports = stringify; + +},{"regexpu-core":71}],12:[function(require,module,exports){ +"use strict"; + +var cssesc = require("cssesc"); + +var stringify; + +function escape(str, stringType) { + return cssesc(str, { + quotes: stringType === "\"" ? "double" : "single" + }); +} + +function stringifyWithoutBeforeAfter(tree) { + switch(tree.type) { + case "values": + return tree.nodes.map(stringify).join(","); + case "value": + return tree.nodes.map(stringify).join(""); + case "item": + return tree.name; + case "nested-item": + return tree.name + "(" + tree.nodes.map(stringify).join(",") + ")"; + case "invalid": + return tree.value; + case "comment": + return "/*" + tree.content + "*/"; + case "string": + switch(tree.stringType) { + case "'": + return "'" + escape(tree.value, "'") + "'"; + case "\"": + return "\"" + escape(tree.value, "\"") + "\""; + } + /* istanbul ignore next */ + throw new Error("Invalid stringType"); + case "url": + var start = "url(" + (tree.innerSpacingBefore || ""); + var end = (tree.innerSpacingAfter || "") + ")"; + switch(tree.stringType) { + case "'": + return start + "'" + tree.url.replace(/'/g, "\\'") + "'" + end; + case "\"": + return start + "\"" + tree.url.replace(/"/g, "\\\"") + "\"" + end; + default: + return start + tree.url.replace(/("|'|\))/g, "\\$1") + end; + } + } +} + + +stringify = function stringify(tree) { + var str = stringifyWithoutBeforeAfter(tree); + if(tree.before) { + str = tree.before + str; + } + if(tree.after) { + str = str + tree.after; + } + return str; +}; + +module.exports = stringify; + +},{"cssesc":13}],13:[function(require,module,exports){ +/*! http://mths.be/cssesc v0.1.0 by @mathias */ +;(function(root) { + + // Detect free variables `exports` + var freeExports = typeof exports == 'object' && exports; + + // Detect free variable `module` + var freeModule = typeof module == 'object' && module && + module.exports == freeExports && module; + + // Detect free variable `global`, from Node.js or Browserified code, + // and use it as `root` + var freeGlobal = typeof global == 'object' && global; + if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + var object = {}; + var hasOwnProperty = object.hasOwnProperty; + var merge = function(options, defaults) { + if (!options) { + return defaults; + } + var key; + var result = {}; + for (key in defaults) { + // `if (defaults.hasOwnProperty(key) { … }` is not needed here, since + // only recognized option names are used + result[key] = hasOwnProperty.call(options, key) + ? options[key] + : defaults[key]; + } + return result; + }; + + /*--------------------------------------------------------------------------*/ + + var regexAnySingleEscape = /[\x20-\x2C\x2E\x2F\x3B-\x40\x5B-\x5E\x60\x7B-\x7E]/; + var regexSingleEscape = /[\x20\x21\x23-\x26\x28-\x2C\x2E\x2F\x3B-\x40\x5B\x5D\x5E\x60\x7B-\x7E]/; + var regexAlwaysEscape = /['"\\]/; + var regexExcessiveSpaces = /(^|\\+)?(\\[A-F0-9]{1,6})\x20(?![a-fA-F0-9\x20])/g; + + // http://mathiasbynens.be/notes/css-escapes#css + var cssesc = function(string, options) { + + // Handle options + options = merge(options, cssesc.options); + if (options.quotes != 'single' && options.quotes != 'double') { + options.quotes = 'single'; + } + var quote = options.quotes == 'double' ? '"' : '\''; + var isIdentifier = options.isIdentifier; + + var firstChar = string.charAt(0); + var output = ''; + var counter = 0; + var length = string.length; + var value; + var character; + var codePoint; + var extra; // used for potential low surrogates + + while (counter < length) { + character = string.charAt(counter++); + codePoint = character.charCodeAt(); + // if it’s not a printable ASCII character + if (codePoint < 0x20 || codePoint > 0x7E) { + if (codePoint >= 0xD800 && codePoint <= 0xDBFF && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // next character is low surrogate + codePoint = ((codePoint & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000; + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + counter--; + } + } + value = '\\' + codePoint.toString(16).toUpperCase() + ' '; + } else { + if (options.escapeEverything) { + if (regexAnySingleEscape.test(character)) { + value = '\\' + character; + } else { + value = '\\' + codePoint.toString(16).toUpperCase() + ' '; + } + // `:` can be escaped as `\:`, but that fails in IE < 8 + } else if (/[\t\n\f\r\x0B:]/.test(character)) { + if (!isIdentifier && character == ':') { + value = character; + } else { + value = '\\' + codePoint.toString(16).toUpperCase() + ' '; + } + } else if ( + character == '\\' || + ( + !isIdentifier && + ( + (character == '"' && quote == character) || + (character == '\'' && quote == character) + ) + ) || + (isIdentifier && regexSingleEscape.test(character)) + ) { + value = '\\' + character; + } else { + value = character; + } + } + output += value; + } + + if (isIdentifier) { + if (/^_/.test(output)) { + // Prevent IE6 from ignoring the rule altogether (in case this is for an + // identifier used as a selector) + output = '\\_' + output.slice(1); + } else if (/^-[-\d]/.test(output)) { + output = '\\-' + output.slice(1); + } else if (/\d/.test(firstChar)) { + output = '\\3' + firstChar + ' ' + output.slice(1); + } + } + + // Remove spaces after `\HEX` escapes that are not followed by a hex digit, + // since they’re redundant. Note that this is only possible if the escape + // sequence isn’t preceded by an odd number of backslashes. + output = output.replace(regexExcessiveSpaces, function($0, $1, $2) { + if ($1 && $1.length % 2) { + // it’s not safe to remove the space, so don’t + return $0; + } + // strip the space + return ($1 || '') + $2; + }); + + if (!isIdentifier && options.wrap) { + return quote + output + quote; + } + return output; + }; + + // Expose default options (so they can be overridden globally) + cssesc.options = { + 'escapeEverything': false, + 'isIdentifier': false, + 'quotes': 'single', + 'wrap': false + }; + + cssesc.version = '0.1.0'; + + /*--------------------------------------------------------------------------*/ + + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof define == 'function' && + typeof define.amd == 'object' && + define.amd + ) { + define(function() { + return cssesc; + }); + } else if (freeExports && !freeExports.nodeType) { + if (freeModule) { // in Node.js or RingoJS v0.8.0+ + freeModule.exports = cssesc; + } else { // in Narwhal or RingoJS v0.7.0- + freeExports.cssesc = cssesc; + } + } else { // in Rhino or a web browser + root.cssesc = cssesc; + } + +}(this)); + +},{}],14:[function(require,module,exports){ +module.exports = [ + "🀄", + "🃏", + "🅰", + "🅱", + "🅾", + "🅿", + "🆎", + "🆑", + "🆒", + "🆓", + "🆔", + "🆕", + "🆖", + "🆗", + "🆘", + "🆙", + "🆚", + "🇦🇨", + "🇦🇩", + "🇦🇪", + "🇦🇫", + "🇦🇬", + "🇦🇮", + "🇦🇱", + "🇦🇲", + "🇦🇴", + "🇦🇶", + "🇦🇷", + "🇦🇸", + "🇦🇹", + "🇦🇺", + "🇦🇼", + "🇦🇽", + "🇦🇿", + "🇦", + "🇧🇦", + "🇧🇧", + "🇧🇩", + "🇧🇪", + "🇧🇫", + "🇧🇬", + "🇧🇭", + "🇧🇮", + "🇧🇯", + "🇧🇱", + "🇧🇲", + "🇧🇳", + "🇧🇴", + "🇧🇶", + "🇧🇷", + "🇧🇸", + "🇧🇹", + "🇧🇻", + "🇧🇼", + "🇧🇾", + "🇧🇿", + "🇧", + "🇨🇦", + "🇨🇨", + "🇨🇩", + "🇨🇫", + "🇨🇬", + "🇨🇭", + "🇨🇮", + "🇨🇰", + "🇨🇱", + "🇨🇲", + "🇨🇳", + "🇨🇴", + "🇨🇵", + "🇨🇷", + "🇨🇺", + "🇨🇻", + "🇨🇼", + "🇨🇽", + "🇨🇾", + "🇨🇿", + "🇨", + "🇩🇪", + "🇩🇬", + "🇩🇯", + "🇩🇰", + "🇩🇲", + "🇩🇴", + "🇩🇿", + "🇩", + "🇪🇦", + "🇪🇨", + "🇪🇪", + "🇪🇬", + "🇪🇭", + "🇪🇷", + "🇪🇸", + "🇪🇹", + "🇪🇺", + "🇪", + "🇫🇮", + "🇫🇯", + "🇫🇰", + "🇫🇲", + "🇫🇴", + "🇫🇷", + "🇫", + "🇬🇦", + "🇬🇧", + "🇬🇩", + "🇬🇪", + "🇬🇫", + "🇬🇬", + "🇬🇭", + "🇬🇮", + "🇬🇱", + "🇬🇲", + "🇬🇳", + "🇬🇵", + "🇬🇶", + "🇬🇷", + "🇬🇸", + "🇬🇹", + "🇬🇺", + "🇬🇼", + "🇬🇾", + "🇬", + "🇭🇰", + "🇭🇲", + "🇭🇳", + "🇭🇷", + "🇭🇹", + "🇭🇺", + "🇭", + "🇮🇨", + "🇮🇩", + "🇮🇪", + "🇮🇱", + "🇮🇲", + "🇮🇳", + "🇮🇴", + "🇮🇶", + "🇮🇷", + "🇮🇸", + "🇮🇹", + "🇮", + "🇯🇪", + "🇯🇲", + "🇯🇴", + "🇯🇵", + "🇯", + "🇰🇪", + "🇰🇬", + "🇰🇭", + "🇰🇮", + "🇰🇲", + "🇰🇳", + "🇰🇵", + "🇰🇷", + "🇰🇼", + "🇰🇾", + "🇰🇿", + "🇰", + "🇱🇦", + "🇱🇧", + "🇱🇨", + "🇱🇮", + "🇱🇰", + "🇱🇷", + "🇱🇸", + "🇱🇹", + "🇱🇺", + "🇱🇻", + "🇱🇾", + "🇱", + "🇲🇦", + "🇲🇨", + "🇲🇩", + "🇲🇪", + "🇲🇫", + "🇲🇬", + "🇲🇭", + "🇲🇰", + "🇲🇱", + "🇲🇲", + "🇲🇳", + "🇲🇴", + "🇲🇵", + "🇲🇶", + "🇲🇷", + "🇲🇸", + "🇲🇹", + "🇲🇺", + "🇲🇻", + "🇲🇼", + "🇲🇽", + "🇲🇾", + "🇲🇿", + "🇲", + "🇳🇦", + "🇳🇨", + "🇳🇪", + "🇳🇫", + "🇳🇬", + "🇳🇮", + "🇳🇱", + "🇳🇴", + "🇳🇵", + "🇳🇷", + "🇳🇺", + "🇳🇿", + "🇳", + "🇴🇲", + "🇴", + "🇵🇦", + "🇵🇪", + "🇵🇫", + "🇵🇬", + "🇵🇭", + "🇵🇰", + "🇵🇱", + "🇵🇲", + "🇵🇳", + "🇵🇷", + "🇵🇸", + "🇵🇹", + "🇵🇼", + "🇵🇾", + "🇵", + "🇶🇦", + "🇶", + "🇷🇪", + "🇷🇴", + "🇷🇸", + "🇷🇺", + "🇷🇼", + "🇷", + "🇸🇦", + "🇸🇧", + "🇸🇨", + "🇸🇩", + "🇸🇪", + "🇸🇬", + "🇸🇭", + "🇸🇮", + "🇸🇯", + "🇸🇰", + "🇸🇱", + "🇸🇲", + "🇸🇳", + "🇸🇴", + "🇸🇷", + "🇸🇸", + "🇸🇹", + "🇸🇻", + "🇸🇽", + "🇸🇾", + "🇸🇿", + "🇸", + "🇹🇦", + "🇹🇨", + "🇹🇩", + "🇹🇫", + "🇹🇬", + "🇹🇭", + "🇹🇯", + "🇹🇰", + "🇹🇱", + "🇹🇲", + "🇹🇳", + "🇹🇴", + "🇹🇷", + "🇹🇹", + "🇹🇻", + "🇹🇼", + "🇹🇿", + "🇹", + "🇺🇦", + "🇺🇬", + "🇺🇲", + "🇺🇳", + "🇺🇸", + "🇺🇾", + "🇺🇿", + "🇺", + "🇻🇦", + "🇻🇨", + "🇻🇪", + "🇻🇬", + "🇻🇮", + "🇻🇳", + "🇻🇺", + "🇻", + "🇼🇫", + "🇼🇸", + "🇼", + "🇽🇰", + "🇽", + "🇾🇪", + "🇾🇹", + "🇾", + "🇿🇦", + "🇿🇲", + "🇿🇼", + "🇿", + "🈁", + "🈂", + "🈚", + "🈯", + "🈲", + "🈳", + "🈴", + "🈵", + "🈶", + "🈷", + "🈸", + "🈹", + "🈺", + "🉐", + "🉑", + "🌀", + "🌁", + "🌂", + "🌃", + "🌄", + "🌅", + "🌆", + "🌇", + "🌈", + "🌉", + "🌊", + "🌋", + "🌌", + "🌍", + "🌎", + "🌏", + "🌐", + "🌑", + "🌒", + "🌓", + "🌔", + "🌕", + "🌖", + "🌗", + "🌘", + "🌙", + "🌚", + "🌛", + "🌜", + "🌝", + "🌞", + "🌟", + "🌠", + "🌡", + "🌤", + "🌥", + "🌦", + "🌧", + "🌨", + "🌩", + "🌪", + "🌫", + "🌬", + "🌭", + "🌮", + "🌯", + "🌰", + "🌱", + "🌲", + "🌳", + "🌴", + "🌵", + "🌶", + "🌷", + "🌸", + "🌹", + "🌺", + "🌻", + "🌼", + "🌽", + "🌾", + "🌿", + "🍀", + "🍁", + "🍂", + "🍃", + "🍄", + "🍅", + "🍆", + "🍇", + "🍈", + "🍉", + "🍊", + "🍋", + "🍌", + "🍍", + "🍎", + "🍏", + "🍐", + "🍑", + "🍒", + "🍓", + "🍔", + "🍕", + "🍖", + "🍗", + "🍘", + "🍙", + "🍚", + "🍛", + "🍜", + "🍝", + "🍞", + "🍟", + "🍠", + "🍡", + "🍢", + "🍣", + "🍤", + "🍥", + "🍦", + "🍧", + "🍨", + "🍩", + "🍪", + "🍫", + "🍬", + "🍭", + "🍮", + "🍯", + "🍰", + "🍱", + "🍲", + "🍳", + "🍴", + "🍵", + "🍶", + "🍷", + "🍸", + "🍹", + "🍺", + "🍻", + "🍼", + "🍽", + "🍾", + "🍿", + "🎀", + "🎁", + "🎂", + "🎃", + "🎄", + "🎅🏻", + "🎅🏼", + "🎅🏽", + "🎅🏾", + "🎅🏿", + "🎅", + "🎆", + "🎇", + "🎈", + "🎉", + "🎊", + "🎋", + "🎌", + "🎍", + "🎎", + "🎏", + "🎐", + "🎑", + "🎒", + "🎓", + "🎖", + "🎗", + "🎙", + "🎚", + "🎛", + "🎞", + "🎟", + "🎠", + "🎡", + "🎢", + "🎣", + "🎤", + "🎥", + "🎦", + "🎧", + "🎨", + "🎩", + "🎪", + "🎫", + "🎬", + "🎭", + "🎮", + "🎯", + "🎰", + "🎱", + "🎲", + "🎳", + "🎴", + "🎵", + "🎶", + "🎷", + "🎸", + "🎹", + "🎺", + "🎻", + "🎼", + "🎽", + "🎾", + "🎿", + "🏀", + "🏁", + "🏂🏻", + "🏂🏼", + "🏂🏽", + "🏂🏾", + "🏂🏿", + "🏂", + "🏃🏻‍♀️", + "🏃🏻‍♂️", + "🏃🏻", + "🏃🏼‍♀️", + "🏃🏼‍♂️", + "🏃🏼", + "🏃🏽‍♀️", + "🏃🏽‍♂️", + "🏃🏽", + "🏃🏾‍♀️", + "🏃🏾‍♂️", + "🏃🏾", + "🏃🏿‍♀️", + "🏃🏿‍♂️", + "🏃🏿", + "🏃‍♀️", + "🏃‍♂️", + "🏃", + "🏄🏻‍♀️", + "🏄🏻‍♂️", + "🏄🏻", + "🏄🏼‍♀️", + "🏄🏼‍♂️", + "🏄🏼", + "🏄🏽‍♀️", + "🏄🏽‍♂️", + "🏄🏽", + "🏄🏾‍♀️", + "🏄🏾‍♂️", + "🏄🏾", + "🏄🏿‍♀️", + "🏄🏿‍♂️", + "🏄🏿", + "🏄‍♀️", + "🏄‍♂️", + "🏄", + "🏅", + "🏆", + "🏇🏻", + "🏇🏼", + "🏇🏽", + "🏇🏾", + "🏇🏿", + "🏇", + "🏈", + "🏉", + "🏊🏻‍♀️", + "🏊🏻‍♂️", + "🏊🏻", + "🏊🏼‍♀️", + "🏊🏼‍♂️", + "🏊🏼", + "🏊🏽‍♀️", + "🏊🏽‍♂️", + "🏊🏽", + "🏊🏾‍♀️", + "🏊🏾‍♂️", + "🏊🏾", + "🏊🏿‍♀️", + "🏊🏿‍♂️", + "🏊🏿", + "🏊‍♀️", + "🏊‍♂️", + "🏊", + "🏋🏻‍♀️", + "🏋🏻‍♂️", + "🏋🏻", + "🏋🏼‍♀️", + "🏋🏼‍♂️", + "🏋🏼", + "🏋🏽‍♀️", + "🏋🏽‍♂️", + "🏋🏽", + "🏋🏾‍♀️", + "🏋🏾‍♂️", + "🏋🏾", + "🏋🏿‍♀️", + "🏋🏿‍♂️", + "🏋🏿", + "🏋️‍♀️", + "🏋️‍♂️", + "🏋", + "🏌🏻‍♀️", + "🏌🏻‍♂️", + "🏌🏻", + "🏌🏼‍♀️", + "🏌🏼‍♂️", + "🏌🏼", + "🏌🏽‍♀️", + "🏌🏽‍♂️", + "🏌🏽", + "🏌🏾‍♀️", + "🏌🏾‍♂️", + "🏌🏾", + "🏌🏿‍♀️", + "🏌🏿‍♂️", + "🏌🏿", + "🏌️‍♀️", + "🏌️‍♂️", + "🏌", + "🏍", + "🏎", + "🏏", + "🏐", + "🏑", + "🏒", + "🏓", + "🏔", + "🏕", + "🏖", + "🏗", + "🏘", + "🏙", + "🏚", + "🏛", + "🏜", + "🏝", + "🏞", + "🏟", + "🏠", + "🏡", + "🏢", + "🏣", + "🏤", + "🏥", + "🏦", + "🏧", + "🏨", + "🏩", + "🏪", + "🏫", + "🏬", + "🏭", + "🏮", + "🏯", + "🏰", + "🏳️‍🌈", + "🏳", + "🏴‍☠️", + "🏴", + "🏵", + "🏷", + "🏸", + "🏹", + "🏺", + "🏻", + "🏼", + "🏽", + "🏾", + "🏿", + "🐀", + "🐁", + "🐂", + "🐃", + "🐄", + "🐅", + "🐆", + "🐇", + "🐈", + "🐉", + "🐊", + "🐋", + "🐌", + "🐍", + "🐎", + "🐏", + "🐐", + "🐑", + "🐒", + "🐓", + "🐔", + "🐕", + "🐖", + "🐗", + "🐘", + "🐙", + "🐚", + "🐛", + "🐜", + "🐝", + "🐞", + "🐟", + "🐠", + "🐡", + "🐢", + "🐣", + "🐤", + "🐥", + "🐦", + "🐧", + "🐨", + "🐩", + "🐪", + "🐫", + "🐬", + "🐭", + "🐮", + "🐯", + "🐰", + "🐱", + "🐲", + "🐳", + "🐴", + "🐵", + "🐶", + "🐷", + "🐸", + "🐹", + "🐺", + "🐻", + "🐼", + "🐽", + "🐾", + "🐿", + "👀", + "👁‍🗨", + "👁", + "👂🏻", + "👂🏼", + "👂🏽", + "👂🏾", + "👂🏿", + "👂", + "👃🏻", + "👃🏼", + "👃🏽", + "👃🏾", + "👃🏿", + "👃", + "👄", + "👅", + "👆🏻", + "👆🏼", + "👆🏽", + "👆🏾", + "👆🏿", + "👆", + "👇🏻", + "👇🏼", + "👇🏽", + "👇🏾", + "👇🏿", + "👇", + "👈🏻", + "👈🏼", + "👈🏽", + "👈🏾", + "👈🏿", + "👈", + "👉🏻", + "👉🏼", + "👉🏽", + "👉🏾", + "👉🏿", + "👉", + "👊🏻", + "👊🏼", + "👊🏽", + "👊🏾", + "👊🏿", + "👊", + "👋🏻", + "👋🏼", + "👋🏽", + "👋🏾", + "👋🏿", + "👋", + "👌🏻", + "👌🏼", + "👌🏽", + "👌🏾", + "👌🏿", + "👌", + "👍🏻", + "👍🏼", + "👍🏽", + "👍🏾", + "👍🏿", + "👍", + "👎🏻", + "👎🏼", + "👎🏽", + "👎🏾", + "👎🏿", + "👎", + "👏🏻", + "👏🏼", + "👏🏽", + "👏🏾", + "👏🏿", + "👏", + "👐🏻", + "👐🏼", + "👐🏽", + "👐🏾", + "👐🏿", + "👐", + "👑", + "👒", + "👓", + "👔", + "👕", + "👖", + "👗", + "👘", + "👙", + "👚", + "👛", + "👜", + "👝", + "👞", + "👟", + "👠", + "👡", + "👢", + "👣", + "👤", + "👥", + "👦🏻", + "👦🏼", + "👦🏽", + "👦🏾", + "👦🏿", + "👦", + "👧🏻", + "👧🏼", + "👧🏽", + "👧🏾", + "👧🏿", + "👧", + "👨🏻‍🌾", + "👨🏻‍🍳", + "👨🏻‍🎓", + "👨🏻‍🎤", + "👨🏻‍🎨", + "👨🏻‍🏫", + "👨🏻‍🏭", + "👨🏻‍💻", + "👨🏻‍💼", + "👨🏻‍🔧", + "👨🏻‍🔬", + "👨🏻‍🚀", + "👨🏻‍🚒", + "👨🏻‍⚕️", + "👨🏻‍⚖️", + "👨🏻‍✈️", + "👨🏻", + "👨🏼‍🌾", + "👨🏼‍🍳", + "👨🏼‍🎓", + "👨🏼‍🎤", + "👨🏼‍🎨", + "👨🏼‍🏫", + "👨🏼‍🏭", + "👨🏼‍💻", + "👨🏼‍💼", + "👨🏼‍🔧", + "👨🏼‍🔬", + "👨🏼‍🚀", + "👨🏼‍🚒", + "👨🏼‍⚕️", + "👨🏼‍⚖️", + "👨🏼‍✈️", + "👨🏼", + "👨🏽‍🌾", + "👨🏽‍🍳", + "👨🏽‍🎓", + "👨🏽‍🎤", + "👨🏽‍🎨", + "👨🏽‍🏫", + "👨🏽‍🏭", + "👨🏽‍💻", + "👨🏽‍💼", + "👨🏽‍🔧", + "👨🏽‍🔬", + "👨🏽‍🚀", + "👨🏽‍🚒", + "👨🏽‍⚕️", + "👨🏽‍⚖️", + "👨🏽‍✈️", + "👨🏽", + "👨🏾‍🌾", + "👨🏾‍🍳", + "👨🏾‍🎓", + "👨🏾‍🎤", + "👨🏾‍🎨", + "👨🏾‍🏫", + "👨🏾‍🏭", + "👨🏾‍💻", + "👨🏾‍💼", + "👨🏾‍🔧", + "👨🏾‍🔬", + "👨🏾‍🚀", + "👨🏾‍🚒", + "👨🏾‍⚕️", + "👨🏾‍⚖️", + "👨🏾‍✈️", + "👨🏾", + "👨🏿‍🌾", + "👨🏿‍🍳", + "👨🏿‍🎓", + "👨🏿‍🎤", + "👨🏿‍🎨", + "👨🏿‍🏫", + "👨🏿‍🏭", + "👨🏿‍💻", + "👨🏿‍💼", + "👨🏿‍🔧", + "👨🏿‍🔬", + "👨🏿‍🚀", + "👨🏿‍🚒", + "👨🏿‍⚕️", + "👨🏿‍⚖️", + "👨🏿‍✈️", + "👨🏿", + "👨‍🌾", + "👨‍🍳", + "👨‍🎓", + "👨‍🎤", + "👨‍🎨", + "👨‍🏫", + "👨‍🏭", + "👨‍👦‍👦", + "👨‍👦", + "👨‍👧‍👦", + "👨‍👧‍👧", + "👨‍👧", + "👨‍👨‍👦‍👦", + "👨‍👨‍👦", + "👨‍👨‍👧‍👦", + "👨‍👨‍👧‍👧", + "👨‍👨‍👧", + "👨‍👩‍👦‍👦", + "👨‍👩‍👦", + "👨‍👩‍👧‍👦", + "👨‍👩‍👧‍👧", + "👨‍👩‍👧", + "👨‍💻", + "👨‍💼", + "👨‍🔧", + "👨‍🔬", + "👨‍🚀", + "👨‍🚒", + "👨‍⚕️", + "👨‍⚖️", + "👨‍✈️", + "👨‍❤️‍👨", + "👨‍❤️‍💋‍👨", + "👨", + "👩🏻‍🌾", + "👩🏻‍🍳", + "👩🏻‍🎓", + "👩🏻‍🎤", + "👩🏻‍🎨", + "👩🏻‍🏫", + "👩🏻‍🏭", + "👩🏻‍💻", + "👩🏻‍💼", + "👩🏻‍🔧", + "👩🏻‍🔬", + "👩🏻‍🚀", + "👩🏻‍🚒", + "👩🏻‍⚕️", + "👩🏻‍⚖️", + "👩🏻‍✈️", + "👩🏻", + "👩🏼‍🌾", + "👩🏼‍🍳", + "👩🏼‍🎓", + "👩🏼‍🎤", + "👩🏼‍🎨", + "👩🏼‍🏫", + "👩🏼‍🏭", + "👩🏼‍💻", + "👩🏼‍💼", + "👩🏼‍🔧", + "👩🏼‍🔬", + "👩🏼‍🚀", + "👩🏼‍🚒", + "👩🏼‍⚕️", + "👩🏼‍⚖️", + "👩🏼‍✈️", + "👩🏼", + "👩🏽‍🌾", + "👩🏽‍🍳", + "👩🏽‍🎓", + "👩🏽‍🎤", + "👩🏽‍🎨", + "👩🏽‍🏫", + "👩🏽‍🏭", + "👩🏽‍💻", + "👩🏽‍💼", + "👩🏽‍🔧", + "👩🏽‍🔬", + "👩🏽‍🚀", + "👩🏽‍🚒", + "👩🏽‍⚕️", + "👩🏽‍⚖️", + "👩🏽‍✈️", + "👩🏽", + "👩🏾‍🌾", + "👩🏾‍🍳", + "👩🏾‍🎓", + "👩🏾‍🎤", + "👩🏾‍🎨", + "👩🏾‍🏫", + "👩🏾‍🏭", + "👩🏾‍💻", + "👩🏾‍💼", + "👩🏾‍🔧", + "👩🏾‍🔬", + "👩🏾‍🚀", + "👩🏾‍🚒", + "👩🏾‍⚕️", + "👩🏾‍⚖️", + "👩🏾‍✈️", + "👩🏾", + "👩🏿‍🌾", + "👩🏿‍🍳", + "👩🏿‍🎓", + "👩🏿‍🎤", + "👩🏿‍🎨", + "👩🏿‍🏫", + "👩🏿‍🏭", + "👩🏿‍💻", + "👩🏿‍💼", + "👩🏿‍🔧", + "👩🏿‍🔬", + "👩🏿‍🚀", + "👩🏿‍🚒", + "👩🏿‍⚕️", + "👩🏿‍⚖️", + "👩🏿‍✈️", + "👩🏿", + "👩‍🌾", + "👩‍🍳", + "👩‍🎓", + "👩‍🎤", + "👩‍🎨", + "👩‍🏫", + "👩‍🏭", + "👩‍👦‍👦", + "👩‍👦", + "👩‍👧‍👦", + "👩‍👧‍👧", + "👩‍👧", + "👩‍👩‍👦‍👦", + "👩‍👩‍👦", + "👩‍👩‍👧‍👦", + "👩‍👩‍👧‍👧", + "👩‍👩‍👧", + "👩‍💻", + "👩‍💼", + "👩‍🔧", + "👩‍🔬", + "👩‍🚀", + "👩‍🚒", + "👩‍⚕️", + "👩‍⚖️", + "👩‍✈️", + "👩‍❤️‍👨", + "👩‍❤️‍👩", + "👩‍❤️‍💋‍👨", + "👩‍❤️‍💋‍👩", + "👩", + "👪🏻", + "👪🏼", + "👪🏽", + "👪🏾", + "👪🏿", + "👪", + "👫🏻", + "👫🏼", + "👫🏽", + "👫🏾", + "👫🏿", + "👫", + "👬🏻", + "👬🏼", + "👬🏽", + "👬🏾", + "👬🏿", + "👬", + "👭🏻", + "👭🏼", + "👭🏽", + "👭🏾", + "👭🏿", + "👭", + "👮🏻‍♀️", + "👮🏻‍♂️", + "👮🏻", + "👮🏼‍♀️", + "👮🏼‍♂️", + "👮🏼", + "👮🏽‍♀️", + "👮🏽‍♂️", + "👮🏽", + "👮🏾‍♀️", + "👮🏾‍♂️", + "👮🏾", + "👮🏿‍♀️", + "👮🏿‍♂️", + "👮🏿", + "👮‍♀️", + "👮‍♂️", + "👮", + "👯🏻‍♀️", + "👯🏻‍♂️", + "👯🏻", + "👯🏼‍♀️", + "👯🏼‍♂️", + "👯🏼", + "👯🏽‍♀️", + "👯🏽‍♂️", + "👯🏽", + "👯🏾‍♀️", + "👯🏾‍♂️", + "👯🏾", + "👯🏿‍♀️", + "👯🏿‍♂️", + "👯🏿", + "👯‍♀️", + "👯‍♂️", + "👯", + "👰🏻", + "👰🏼", + "👰🏽", + "👰🏾", + "👰🏿", + "👰", + "👱🏻‍♀️", + "👱🏻‍♂️", + "👱🏻", + "👱🏼‍♀️", + "👱🏼‍♂️", + "👱🏼", + "👱🏽‍♀️", + "👱🏽‍♂️", + "👱🏽", + "👱🏾‍♀️", + "👱🏾‍♂️", + "👱🏾", + "👱🏿‍♀️", + "👱🏿‍♂️", + "👱🏿", + "👱‍♀️", + "👱‍♂️", + "👱", + "👲🏻", + "👲🏼", + "👲🏽", + "👲🏾", + "👲🏿", + "👲", + "👳🏻‍♀️", + "👳🏻‍♂️", + "👳🏻", + "👳🏼‍♀️", + "👳🏼‍♂️", + "👳🏼", + "👳🏽‍♀️", + "👳🏽‍♂️", + "👳🏽", + "👳🏾‍♀️", + "👳🏾‍♂️", + "👳🏾", + "👳🏿‍♀️", + "👳🏿‍♂️", + "👳🏿", + "👳‍♀️", + "👳‍♂️", + "👳", + "👴🏻", + "👴🏼", + "👴🏽", + "👴🏾", + "👴🏿", + "👴", + "👵🏻", + "👵🏼", + "👵🏽", + "👵🏾", + "👵🏿", + "👵", + "👶🏻", + "👶🏼", + "👶🏽", + "👶🏾", + "👶🏿", + "👶", + "👷🏻‍♀️", + "👷🏻‍♂️", + "👷🏻", + "👷🏼‍♀️", + "👷🏼‍♂️", + "👷🏼", + "👷🏽‍♀️", + "👷🏽‍♂️", + "👷🏽", + "👷🏾‍♀️", + "👷🏾‍♂️", + "👷🏾", + "👷🏿‍♀️", + "👷🏿‍♂️", + "👷🏿", + "👷‍♀️", + "👷‍♂️", + "👷", + "👸🏻", + "👸🏼", + "👸🏽", + "👸🏾", + "👸🏿", + "👸", + "👹", + "👺", + "👻", + "👼🏻", + "👼🏼", + "👼🏽", + "👼🏾", + "👼🏿", + "👼", + "👽", + "👾", + "👿", + "💀", + "💁🏻‍♀️", + "💁🏻‍♂️", + "💁🏻", + "💁🏼‍♀️", + "💁🏼‍♂️", + "💁🏼", + "💁🏽‍♀️", + "💁🏽‍♂️", + "💁🏽", + "💁🏾‍♀️", + "💁🏾‍♂️", + "💁🏾", + "💁🏿‍♀️", + "💁🏿‍♂️", + "💁🏿", + "💁‍♀️", + "💁‍♂️", + "💁", + "💂🏻‍♀️", + "💂🏻‍♂️", + "💂🏻", + "💂🏼‍♀️", + "💂🏼‍♂️", + "💂🏼", + "💂🏽‍♀️", + "💂🏽‍♂️", + "💂🏽", + "💂🏾‍♀️", + "💂🏾‍♂️", + "💂🏾", + "💂🏿‍♀️", + "💂🏿‍♂️", + "💂🏿", + "💂‍♀️", + "💂‍♂️", + "💂", + "💃🏻", + "💃🏼", + "💃🏽", + "💃🏾", + "💃🏿", + "💃", + "💄", + "💅🏻", + "💅🏼", + "💅🏽", + "💅🏾", + "💅🏿", + "💅", + "💆🏻‍♀️", + "💆🏻‍♂️", + "💆🏻", + "💆🏼‍♀️", + "💆🏼‍♂️", + "💆🏼", + "💆🏽‍♀️", + "💆🏽‍♂️", + "💆🏽", + "💆🏾‍♀️", + "💆🏾‍♂️", + "💆🏾", + "💆🏿‍♀️", + "💆🏿‍♂️", + "💆🏿", + "💆‍♀️", + "💆‍♂️", + "💆", + "💇🏻‍♀️", + "💇🏻‍♂️", + "💇🏻", + "💇🏼‍♀️", + "💇🏼‍♂️", + "💇🏼", + "💇🏽‍♀️", + "💇🏽‍♂️", + "💇🏽", + "💇🏾‍♀️", + "💇🏾‍♂️", + "💇🏾", + "💇🏿‍♀️", + "💇🏿‍♂️", + "💇🏿", + "💇‍♀️", + "💇‍♂️", + "💇", + "💈", + "💉", + "💊", + "💋", + "💌", + "💍", + "💎", + "💏", + "💐", + "💑", + "💒", + "💓", + "💔", + "💕", + "💖", + "💗", + "💘", + "💙", + "💚", + "💛", + "💜", + "💝", + "💞", + "💟", + "💠", + "💡", + "💢", + "💣", + "💤", + "💥", + "💦", + "💧", + "💨", + "💩", + "💪🏻", + "💪🏼", + "💪🏽", + "💪🏾", + "💪🏿", + "💪", + "💫", + "💬", + "💭", + "💮", + "💯", + "💰", + "💱", + "💲", + "💳", + "💴", + "💵", + "💶", + "💷", + "💸", + "💹", + "💺", + "💻", + "💼", + "💽", + "💾", + "💿", + "📀", + "📁", + "📂", + "📃", + "📄", + "📅", + "📆", + "📇", + "📈", + "📉", + "📊", + "📋", + "📌", + "📍", + "📎", + "📏", + "📐", + "📑", + "📒", + "📓", + "📔", + "📕", + "📖", + "📗", + "📘", + "📙", + "📚", + "📛", + "📜", + "📝", + "📞", + "📟", + "📠", + "📡", + "📢", + "📣", + "📤", + "📥", + "📦", + "📧", + "📨", + "📩", + "📪", + "📫", + "📬", + "📭", + "📮", + "📯", + "📰", + "📱", + "📲", + "📳", + "📴", + "📵", + "📶", + "📷", + "📸", + "📹", + "📺", + "📻", + "📼", + "📽", + "📿", + "🔀", + "🔁", + "🔂", + "🔃", + "🔄", + "🔅", + "🔆", + "🔇", + "🔈", + "🔉", + "🔊", + "🔋", + "🔌", + "🔍", + "🔎", + "🔏", + "🔐", + "🔑", + "🔒", + "🔓", + "🔔", + "🔕", + "🔖", + "🔗", + "🔘", + "🔙", + "🔚", + "🔛", + "🔜", + "🔝", + "🔞", + "🔟", + "🔠", + "🔡", + "🔢", + "🔣", + "🔤", + "🔥", + "🔦", + "🔧", + "🔨", + "🔩", + "🔪", + "🔫", + "🔬", + "🔭", + "🔮", + "🔯", + "🔰", + "🔱", + "🔲", + "🔳", + "🔴", + "🔵", + "🔶", + "🔷", + "🔸", + "🔹", + "🔺", + "🔻", + "🔼", + "🔽", + "🕉", + "🕊", + "🕋", + "🕌", + "🕍", + "🕎", + "🕐", + "🕑", + "🕒", + "🕓", + "🕔", + "🕕", + "🕖", + "🕗", + "🕘", + "🕙", + "🕚", + "🕛", + "🕜", + "🕝", + "🕞", + "🕟", + "🕠", + "🕡", + "🕢", + "🕣", + "🕤", + "🕥", + "🕦", + "🕧", + "🕯", + "🕰", + "🕳", + "🕴🏻", + "🕴🏼", + "🕴🏽", + "🕴🏾", + "🕴🏿", + "🕴", + "🕵🏻‍♀️", + "🕵🏻‍♂️", + "🕵🏻", + "🕵🏼‍♀️", + "🕵🏼‍♂️", + "🕵🏼", + "🕵🏽‍♀️", + "🕵🏽‍♂️", + "🕵🏽", + "🕵🏾‍♀️", + "🕵🏾‍♂️", + "🕵🏾", + "🕵🏿‍♀️", + "🕵🏿‍♂️", + "🕵🏿", + "🕵️‍♀️", + "🕵️‍♂️", + "🕵", + "🕶", + "🕷", + "🕸", + "🕹", + "🕺🏻", + "🕺🏼", + "🕺🏽", + "🕺🏾", + "🕺🏿", + "🕺", + "🖇", + "🖊", + "🖋", + "🖌", + "🖍", + "🖐🏻", + "🖐🏼", + "🖐🏽", + "🖐🏾", + "🖐🏿", + "🖐", + "🖕🏻", + "🖕🏼", + "🖕🏽", + "🖕🏾", + "🖕🏿", + "🖕", + "🖖🏻", + "🖖🏼", + "🖖🏽", + "🖖🏾", + "🖖🏿", + "🖖", + "🖤", + "🖥", + "🖨", + "🖱", + "🖲", + "🖼", + "🗂", + "🗃", + "🗄", + "🗑", + "🗒", + "🗓", + "🗜", + "🗝", + "🗞", + "🗡", + "🗣", + "🗨", + "🗯", + "🗳", + "🗺", + "🗻", + "🗼", + "🗽", + "🗾", + "🗿", + "😀", + "😁", + "😂", + "😃", + "😄", + "😅", + "😆", + "😇", + "😈", + "😉", + "😊", + "😋", + "😌", + "😍", + "😎", + "😏", + "😐", + "😑", + "😒", + "😓", + "😔", + "😕", + "😖", + "😗", + "😘", + "😙", + "😚", + "😛", + "😜", + "😝", + "😞", + "😟", + "😠", + "😡", + "😢", + "😣", + "😤", + "😥", + "😦", + "😧", + "😨", + "😩", + "😪", + "😫", + "😬", + "😭", + "😮", + "😯", + "😰", + "😱", + "😲", + "😳", + "😴", + "😵", + "😶", + "😷", + "😸", + "😹", + "😺", + "😻", + "😼", + "😽", + "😾", + "😿", + "🙀", + "🙁", + "🙂", + "🙃", + "🙄", + "🙅🏻‍♀️", + "🙅🏻‍♂️", + "🙅🏻", + "🙅🏼‍♀️", + "🙅🏼‍♂️", + "🙅🏼", + "🙅🏽‍♀️", + "🙅🏽‍♂️", + "🙅🏽", + "🙅🏾‍♀️", + "🙅🏾‍♂️", + "🙅🏾", + "🙅🏿‍♀️", + "🙅🏿‍♂️", + "🙅🏿", + "🙅‍♀️", + "🙅‍♂️", + "🙅", + "🙆🏻‍♀️", + "🙆🏻‍♂️", + "🙆🏻", + "🙆🏼‍♀️", + "🙆🏼‍♂️", + "🙆🏼", + "🙆🏽‍♀️", + "🙆🏽‍♂️", + "🙆🏽", + "🙆🏾‍♀️", + "🙆🏾‍♂️", + "🙆🏾", + "🙆🏿‍♀️", + "🙆🏿‍♂️", + "🙆🏿", + "🙆‍♀️", + "🙆‍♂️", + "🙆", + "🙇🏻‍♀️", + "🙇🏻‍♂️", + "🙇🏻", + "🙇🏼‍♀️", + "🙇🏼‍♂️", + "🙇🏼", + "🙇🏽‍♀️", + "🙇🏽‍♂️", + "🙇🏽", + "🙇🏾‍♀️", + "🙇🏾‍♂️", + "🙇🏾", + "🙇🏿‍♀️", + "🙇🏿‍♂️", + "🙇🏿", + "🙇‍♀️", + "🙇‍♂️", + "🙇", + "🙈", + "🙉", + "🙊", + "🙋🏻‍♀️", + "🙋🏻‍♂️", + "🙋🏻", + "🙋🏼‍♀️", + "🙋🏼‍♂️", + "🙋🏼", + "🙋🏽‍♀️", + "🙋🏽‍♂️", + "🙋🏽", + "🙋🏾‍♀️", + "🙋🏾‍♂️", + "🙋🏾", + "🙋🏿‍♀️", + "🙋🏿‍♂️", + "🙋🏿", + "🙋‍♀️", + "🙋‍♂️", + "🙋", + "🙌🏻", + "🙌🏼", + "🙌🏽", + "🙌🏾", + "🙌🏿", + "🙌", + "🙍🏻‍♀️", + "🙍🏻‍♂️", + "🙍🏻", + "🙍🏼‍♀️", + "🙍🏼‍♂️", + "🙍🏼", + "🙍🏽‍♀️", + "🙍🏽‍♂️", + "🙍🏽", + "🙍🏾‍♀️", + "🙍🏾‍♂️", + "🙍🏾", + "🙍🏿‍♀️", + "🙍🏿‍♂️", + "🙍🏿", + "🙍‍♀️", + "🙍‍♂️", + "🙍", + "🙎🏻‍♀️", + "🙎🏻‍♂️", + "🙎🏻", + "🙎🏼‍♀️", + "🙎🏼‍♂️", + "🙎🏼", + "🙎🏽‍♀️", + "🙎🏽‍♂️", + "🙎🏽", + "🙎🏾‍♀️", + "🙎🏾‍♂️", + "🙎🏾", + "🙎🏿‍♀️", + "🙎🏿‍♂️", + "🙎🏿", + "🙎‍♀️", + "🙎‍♂️", + "🙎", + "🙏🏻", + "🙏🏼", + "🙏🏽", + "🙏🏾", + "🙏🏿", + "🙏", + "🚀", + "🚁", + "🚂", + "🚃", + "🚄", + "🚅", + "🚆", + "🚇", + "🚈", + "🚉", + "🚊", + "🚋", + "🚌", + "🚍", + "🚎", + "🚏", + "🚐", + "🚑", + "🚒", + "🚓", + "🚔", + "🚕", + "🚖", + "🚗", + "🚘", + "🚙", + "🚚", + "🚛", + "🚜", + "🚝", + "🚞", + "🚟", + "🚠", + "🚡", + "🚢", + "🚣🏻‍♀️", + "🚣🏻‍♂️", + "🚣🏻", + "🚣🏼‍♀️", + "🚣🏼‍♂️", + "🚣🏼", + "🚣🏽‍♀️", + "🚣🏽‍♂️", + "🚣🏽", + "🚣🏾‍♀️", + "🚣🏾‍♂️", + "🚣🏾", + "🚣🏿‍♀️", + "🚣🏿‍♂️", + "🚣🏿", + "🚣‍♀️", + "🚣‍♂️", + "🚣", + "🚤", + "🚥", + "🚦", + "🚧", + "🚨", + "🚩", + "🚪", + "🚫", + "🚬", + "🚭", + "🚮", + "🚯", + "🚰", + "🚱", + "🚲", + "🚳", + "🚴🏻‍♀️", + "🚴🏻‍♂️", + "🚴🏻", + "🚴🏼‍♀️", + "🚴🏼‍♂️", + "🚴🏼", + "🚴🏽‍♀️", + "🚴🏽‍♂️", + "🚴🏽", + "🚴🏾‍♀️", + "🚴🏾‍♂️", + "🚴🏾", + "🚴🏿‍♀️", + "🚴🏿‍♂️", + "🚴🏿", + "🚴‍♀️", + "🚴‍♂️", + "🚴", + "🚵🏻‍♀️", + "🚵🏻‍♂️", + "🚵🏻", + "🚵🏼‍♀️", + "🚵🏼‍♂️", + "🚵🏼", + "🚵🏽‍♀️", + "🚵🏽‍♂️", + "🚵🏽", + "🚵🏾‍♀️", + "🚵🏾‍♂️", + "🚵🏾", + "🚵🏿‍♀️", + "🚵🏿‍♂️", + "🚵🏿", + "🚵‍♀️", + "🚵‍♂️", + "🚵", + "🚶🏻‍♀️", + "🚶🏻‍♂️", + "🚶🏻", + "🚶🏼‍♀️", + "🚶🏼‍♂️", + "🚶🏼", + "🚶🏽‍♀️", + "🚶🏽‍♂️", + "🚶🏽", + "🚶🏾‍♀️", + "🚶🏾‍♂️", + "🚶🏾", + "🚶🏿‍♀️", + "🚶🏿‍♂️", + "🚶🏿", + "🚶‍♀️", + "🚶‍♂️", + "🚶", + "🚷", + "🚸", + "🚹", + "🚺", + "🚻", + "🚼", + "🚽", + "🚾", + "🚿", + "🛀🏻", + "🛀🏼", + "🛀🏽", + "🛀🏾", + "🛀🏿", + "🛀", + "🛁", + "🛂", + "🛃", + "🛄", + "🛅", + "🛋", + "🛌🏻", + "🛌🏼", + "🛌🏽", + "🛌🏾", + "🛌🏿", + "🛌", + "🛍", + "🛎", + "🛏", + "🛐", + "🛑", + "🛒", + "🛠", + "🛡", + "🛢", + "🛣", + "🛤", + "🛥", + "🛩", + "🛫", + "🛬", + "🛰", + "🛳", + "🛴", + "🛵", + "🛶", + "🤐", + "🤑", + "🤒", + "🤓", + "🤔", + "🤕", + "🤖", + "🤗", + "🤘🏻", + "🤘🏼", + "🤘🏽", + "🤘🏾", + "🤘🏿", + "🤘", + "🤙🏻", + "🤙🏼", + "🤙🏽", + "🤙🏾", + "🤙🏿", + "🤙", + "🤚🏻", + "🤚🏼", + "🤚🏽", + "🤚🏾", + "🤚🏿", + "🤚", + "🤛🏻", + "🤛🏼", + "🤛🏽", + "🤛🏾", + "🤛🏿", + "🤛", + "🤜🏻", + "🤜🏼", + "🤜🏽", + "🤜🏾", + "🤜🏿", + "🤜", + "🤝🏻", + "🤝🏼", + "🤝🏽", + "🤝🏾", + "🤝🏿", + "🤝", + "🤞🏻", + "🤞🏼", + "🤞🏽", + "🤞🏾", + "🤞🏿", + "🤞", + "🤠", + "🤡", + "🤢", + "🤣", + "🤤", + "🤥", + "🤦🏻‍♀️", + "🤦🏻‍♂️", + "🤦🏻", + "🤦🏼‍♀️", + "🤦🏼‍♂️", + "🤦🏼", + "🤦🏽‍♀️", + "🤦🏽‍♂️", + "🤦🏽", + "🤦🏾‍♀️", + "🤦🏾‍♂️", + "🤦🏾", + "🤦🏿‍♀️", + "🤦🏿‍♂️", + "🤦🏿", + "🤦‍♀️", + "🤦‍♂️", + "🤦", + "🤧", + "🤰🏻", + "🤰🏼", + "🤰🏽", + "🤰🏾", + "🤰🏿", + "🤰", + "🤳🏻", + "🤳🏼", + "🤳🏽", + "🤳🏾", + "🤳🏿", + "🤳", + "🤴🏻", + "🤴🏼", + "🤴🏽", + "🤴🏾", + "🤴🏿", + "🤴", + "🤵🏻", + "🤵🏼", + "🤵🏽", + "🤵🏾", + "🤵🏿", + "🤵", + "🤶🏻", + "🤶🏼", + "🤶🏽", + "🤶🏾", + "🤶🏿", + "🤶", + "🤷🏻‍♀️", + "🤷🏻‍♂️", + "🤷🏻", + "🤷🏼‍♀️", + "🤷🏼‍♂️", + "🤷🏼", + "🤷🏽‍♀️", + "🤷🏽‍♂️", + "🤷🏽", + "🤷🏾‍♀️", + "🤷🏾‍♂️", + "🤷🏾", + "🤷🏿‍♀️", + "🤷🏿‍♂️", + "🤷🏿", + "🤷‍♀️", + "🤷‍♂️", + "🤷", + "🤸🏻‍♀️", + "🤸🏻‍♂️", + "🤸🏻", + "🤸🏼‍♀️", + "🤸🏼‍♂️", + "🤸🏼", + "🤸🏽‍♀️", + "🤸🏽‍♂️", + "🤸🏽", + "🤸🏾‍♀️", + "🤸🏾‍♂️", + "🤸🏾", + "🤸🏿‍♀️", + "🤸🏿‍♂️", + "🤸🏿", + "🤸‍♀️", + "🤸‍♂️", + "🤸", + "🤹🏻‍♀️", + "🤹🏻‍♂️", + "🤹🏻", + "🤹🏼‍♀️", + "🤹🏼‍♂️", + "🤹🏼", + "🤹🏽‍♀️", + "🤹🏽‍♂️", + "🤹🏽", + "🤹🏾‍♀️", + "🤹🏾‍♂️", + "🤹🏾", + "🤹🏿‍♀️", + "🤹🏿‍♂️", + "🤹🏿", + "🤹‍♀️", + "🤹‍♂️", + "🤹", + "🤺", + "🤼🏻‍♀️", + "🤼🏻‍♂️", + "🤼🏻", + "🤼🏼‍♀️", + "🤼🏼‍♂️", + "🤼🏼", + "🤼🏽‍♀️", + "🤼🏽‍♂️", + "🤼🏽", + "🤼🏾‍♀️", + "🤼🏾‍♂️", + "🤼🏾", + "🤼🏿‍♀️", + "🤼🏿‍♂️", + "🤼🏿", + "🤼‍♀️", + "🤼‍♂️", + "🤼", + "🤽🏻‍♀️", + "🤽🏻‍♂️", + "🤽🏻", + "🤽🏼‍♀️", + "🤽🏼‍♂️", + "🤽🏼", + "🤽🏽‍♀️", + "🤽🏽‍♂️", + "🤽🏽", + "🤽🏾‍♀️", + "🤽🏾‍♂️", + "🤽🏾", + "🤽🏿‍♀️", + "🤽🏿‍♂️", + "🤽🏿", + "🤽‍♀️", + "🤽‍♂️", + "🤽", + "🤾🏻‍♀️", + "🤾🏻‍♂️", + "🤾🏻", + "🤾🏼‍♀️", + "🤾🏼‍♂️", + "🤾🏼", + "🤾🏽‍♀️", + "🤾🏽‍♂️", + "🤾🏽", + "🤾🏾‍♀️", + "🤾🏾‍♂️", + "🤾🏾", + "🤾🏿‍♀️", + "🤾🏿‍♂️", + "🤾🏿", + "🤾‍♀️", + "🤾‍♂️", + "🤾", + "🥀", + "🥁", + "🥂", + "🥃", + "🥄", + "🥅", + "🥇", + "🥈", + "🥉", + "🥊", + "🥋", + "🥐", + "🥑", + "🥒", + "🥓", + "🥔", + "🥕", + "🥖", + "🥗", + "🥘", + "🥙", + "🥚", + "🥛", + "🥜", + "🥝", + "🥞", + "🦀", + "🦁", + "🦂", + "🦃", + "🦄", + "🦅", + "🦆", + "🦇", + "🦈", + "🦉", + "🦊", + "🦋", + "🦌", + "🦍", + "🦎", + "🦏", + "🦐", + "🦑", + "🧀", + "‼", + "⁉", + "™", + "ℹ", + "↔", + "↕", + "↖", + "↗", + "↘", + "↙", + "↩", + "↪", + "#⃣", + "⌚", + "⌛", + "⌨", + "⏏", + "⏩", + "⏪", + "⏫", + "⏬", + "⏭", + "⏮", + "⏯", + "⏰", + "⏱", + "⏲", + "⏳", + "⏸", + "⏹", + "⏺", + "Ⓜ", + "▪", + "▫", + "▶", + "◀", + "◻", + "◼", + "◽", + "◾", + "☀", + "☁", + "☂", + "☃", + "☄", + "☎", + "☑", + "☔", + "☕", + "☘", + "☝🏻", + "☝🏼", + "☝🏽", + "☝🏾", + "☝🏿", + "☝", + "☠", + "☢", + "☣", + "☦", + "☪", + "☮", + "☯", + "☸", + "☹", + "☺", + "♀", + "♂", + "♈", + "♉", + "♊", + "♋", + "♌", + "♍", + "♎", + "♏", + "♐", + "♑", + "♒", + "♓", + "♠", + "♣", + "♥", + "♦", + "♨", + "♻", + "♿", + "⚒", + "⚓", + "⚔", + "⚕", + "⚖", + "⚗", + "⚙", + "⚛", + "⚜", + "⚠", + "⚡", + "⚪", + "⚫", + "⚰", + "⚱", + "⚽", + "⚾", + "⛄", + "⛅", + "⛈", + "⛎", + "⛏", + "⛑", + "⛓", + "⛔", + "⛩", + "⛪", + "⛰", + "⛱", + "⛲", + "⛳", + "⛴", + "⛵", + "⛷🏻", + "⛷🏼", + "⛷🏽", + "⛷🏾", + "⛷🏿", + "⛷", + "⛸", + "⛹🏻‍♀️", + "⛹🏻‍♂️", + "⛹🏻", + "⛹🏼‍♀️", + "⛹🏼‍♂️", + "⛹🏼", + "⛹🏽‍♀️", + "⛹🏽‍♂️", + "⛹🏽", + "⛹🏾‍♀️", + "⛹🏾‍♂️", + "⛹🏾", + "⛹🏿‍♀️", + "⛹🏿‍♂️", + "⛹🏿", + "⛹️‍♀️", + "⛹️‍♂️", + "⛹", + "⛺", + "⛽", + "✂", + "✅", + "✈", + "✉", + "✊🏻", + "✊🏼", + "✊🏽", + "✊🏾", + "✊🏿", + "✊", + "✋🏻", + "✋🏼", + "✋🏽", + "✋🏾", + "✋🏿", + "✋", + "✌🏻", + "✌🏼", + "✌🏽", + "✌🏾", + "✌🏿", + "✌", + "✍🏻", + "✍🏼", + "✍🏽", + "✍🏾", + "✍🏿", + "✍", + "✏", + "✒", + "✔", + "✖", + "✝", + "✡", + "✨", + "✳", + "✴", + "❄", + "❇", + "❌", + "❎", + "❓", + "❔", + "❕", + "❗", + "❣", + "❤", + "➕", + "➖", + "➗", + "➡", + "➰", + "➿", + "⤴", + "⤵", + "*⃣", + "⬅", + "⬆", + "⬇", + "⬛", + "⬜", + "⭐", + "⭕", + "0⃣", + "〰", + "〽", + "1⃣", + "2⃣", + "㊗", + "㊙", + "3⃣", + "4⃣", + "5⃣", + "6⃣", + "7⃣", + "8⃣", + "9⃣", + "©", + "®", + "" +] +},{}],15:[function(require,module,exports){ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +function ignoreFunction() {} + +function createReturningFunction(value) { + return function() { + return value; + }; +} + +function Parser(states) { + this.states = this.compileStates(states); +} + +Parser.prototype.compileStates = function(states) { + var result = {}; + Object.keys(states).forEach(function(name) { + result[name] = this.compileState(states[name], states); + }, this); + return result; +}; + +Parser.prototype.compileState = function(state, states) { + var regExps = []; + function iterator(str, value) { + regExps.push({ + groups: Parser.getGroupCount(str), + regExp: str, + value: value + }); + } + function processState(statePart) { + if(Array.isArray(statePart)) { + statePart.forEach(processState); + } else if(typeof statePart === "object") { + Object.keys(statePart).forEach(function(key) { + iterator(key, statePart[key]); + }); + } else if(typeof statePart === "string") { + processState(states[statePart]); + } else { + throw new Error("Unexpected 'state' format"); + } + } + processState(state); + var total = regExps.map(function(r) { + return "(" + r.regExp + ")"; + }).join("|"); + var actions = []; + var pos = 1; + regExps.forEach(function(r) { + var fn; + if(typeof r.value === "function") { + fn = r.value; + } else if(typeof r.value === "string") { + fn = createReturningFunction(r.value); + } else { + fn = ignoreFunction; + } + actions.push({ + name: r.regExp, + fn: fn, + pos: pos, + pos2: pos + r.groups + 1 + }); + pos += r.groups + 1; + }); + return { + regExp: new RegExp(total, "g"), + actions: actions + }; +}; + +Parser.getGroupCount = function(regExpStr) { + return new RegExp("(" + regExpStr + ")|^$").exec("").length - 2; +}; + +Parser.prototype.parse = function(initialState, string, context) { + context = context || {}; + var currentState = initialState; + var currentIndex = 0; + for(;;) { + var state = this.states[currentState]; + var regExp = state.regExp; + regExp.lastIndex = currentIndex; + var match = regExp.exec(string); + if(!match) return context; + var actions = state.actions; + currentIndex = state.regExp.lastIndex; + for(var i = 0; i < actions.length; i++) { + var action = actions[i]; + if(match[action.pos]) { + var ret = action.fn.apply(context, Array.prototype.slice.call(match, action.pos, action.pos2).concat([state.regExp.lastIndex - match[0].length, match[0].length])); + if(ret) { + if(!(ret in this.states)) + throw new Error("State '" + ret + "' doesn't exist"); + currentState = ret; + } + break; + } + } + } +}; + +module.exports = Parser; + +},{}],16:[function(require,module,exports){ +'use strict'; + +var interpolateName = require('loader-utils').interpolateName; +var path = require('path'); +var util = require('util'); + +/** + * @param {string} pattern + * @param {object} options + * @param {string} options.context + * @param {string} options.hashPrefix + * @return {function} + */ +module.exports = function createGenerator(pattern, options) { + options = options || {}; + var context = options && typeof options.context === 'string' + ? options.context + : ''; + var hashPrefix = options && typeof options.hashPrefix === 'string' + ? options.hashPrefix + : ''; + + /** + * @param {string} localName Usually a class name + * @param {string} filepath Absolute path + * @return {string} + */ + return function generate(localName, filepath) { + var name = pattern.replace(/\[local\]/gi, localName); + var loaderContext = { + resourcePath: filepath + }; + var loaderOptions = { + content: util.format('%s%s+%s', + hashPrefix, + path.relative(context, filepath), + localName), + context: context + }; + + var genericName = interpolateName(loaderContext, name, loaderOptions); + return genericName + .replace(new RegExp('[^a-zA-Z0-9\\-_\u00A0-\uFFFF]', 'g'), '-') + .replace(/^((-?[0-9])|--)/, "_$1"); + }; +}; + +},{"loader-utils":25,"path":undefined,"util":undefined}],17:[function(require,module,exports){ +exports.alphasort = alphasort +exports.alphasorti = alphasorti +exports.isAbsolute = process.platform === "win32" ? absWin : absUnix +exports.setopts = setopts +exports.ownProp = ownProp +exports.makeAbs = makeAbs +exports.finish = finish +exports.mark = mark +exports.isIgnored = isIgnored +exports.childrenIgnored = childrenIgnored + +function ownProp (obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field) +} + +var path = require("path") +var minimatch = require("minimatch") +var Minimatch = minimatch.Minimatch + +function absWin (p) { + if (absUnix(p)) return true + // pull off the device/UNC bit from a windows path. + // from node's lib/path.js + var splitDeviceRe = + /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/ + var result = splitDeviceRe.exec(p) + var device = result[1] || '' + var isUnc = device && device.charAt(1) !== ':' + var isAbsolute = !!result[2] || isUnc // UNC paths are always absolute + + return isAbsolute +} + +function absUnix (p) { + return p.charAt(0) === "/" || p === "" +} + +function alphasorti (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()) +} + +function alphasort (a, b) { + return a.localeCompare(b) +} + +function setupIgnores (self, options) { + self.ignore = options.ignore || [] + + if (!Array.isArray(self.ignore)) + self.ignore = [self.ignore] + + if (self.ignore.length) { + self.ignore = self.ignore.map(ignoreMap) + } +} + +function ignoreMap (pattern) { + var gmatcher = null + if (pattern.slice(-3) === '/**') { + var gpattern = pattern.replace(/(\/\*\*)+$/, '') + gmatcher = new Minimatch(gpattern, { nonegate: true }) + } + + return { + matcher: new Minimatch(pattern, { nonegate: true }), + gmatcher: gmatcher + } +} + +function setopts (self, pattern, options) { + if (!options) + options = {} + + // base-matching: just use globstar for that. + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar") + } + pattern = "**/" + pattern + } + + self.pattern = pattern + self.strict = options.strict !== false + self.realpath = !!options.realpath + self.realpathCache = options.realpathCache || Object.create(null) + self.follow = !!options.follow + self.dot = !!options.dot + self.mark = !!options.mark + self.nodir = !!options.nodir + if (self.nodir) + self.mark = true + self.sync = !!options.sync + self.nounique = !!options.nounique + self.nonull = !!options.nonull + self.nosort = !!options.nosort + self.nocase = !!options.nocase + self.stat = !!options.stat + self.noprocess = !!options.noprocess + + self.maxLength = options.maxLength || Infinity + self.cache = options.cache || Object.create(null) + self.statCache = options.statCache || Object.create(null) + self.symlinks = options.symlinks || Object.create(null) + + setupIgnores(self, options) + + self.changedCwd = false + var cwd = process.cwd() + if (!ownProp(options, "cwd")) + self.cwd = cwd + else { + self.cwd = options.cwd + self.changedCwd = path.resolve(options.cwd) !== cwd + } + + self.root = options.root || path.resolve(self.cwd, "/") + self.root = path.resolve(self.root) + if (process.platform === "win32") + self.root = self.root.replace(/\\/g, "/") + + self.nomount = !!options.nomount + + self.minimatch = new Minimatch(pattern, options) + self.options = self.minimatch.options +} + +function finish (self) { + var nou = self.nounique + var all = nou ? [] : Object.create(null) + + for (var i = 0, l = self.matches.length; i < l; i ++) { + var matches = self.matches[i] + if (!matches || Object.keys(matches).length === 0) { + if (self.nonull) { + // do like the shell, and spit out the literal glob + var literal = self.minimatch.globSet[i] + if (nou) + all.push(literal) + else + all[literal] = true + } + } else { + // had matches + var m = Object.keys(matches) + if (nou) + all.push.apply(all, m) + else + m.forEach(function (m) { + all[m] = true + }) + } + } + + if (!nou) + all = Object.keys(all) + + if (!self.nosort) + all = all.sort(self.nocase ? alphasorti : alphasort) + + // at *some* point we statted all of these + if (self.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self._mark(all[i]) + } + if (self.nodir) { + all = all.filter(function (e) { + return !(/\/$/.test(e)) + }) + } + } + + if (self.ignore.length) + all = all.filter(function(m) { + return !isIgnored(self, m) + }) + + self.found = all +} + +function mark (self, p) { + var abs = makeAbs(self, p) + var c = self.cache[abs] + var m = p + if (c) { + var isDir = c === 'DIR' || Array.isArray(c) + var slash = p.slice(-1) === '/' + + if (isDir && !slash) + m += '/' + else if (!isDir && slash) + m = m.slice(0, -1) + + if (m !== p) { + var mabs = makeAbs(self, m) + self.statCache[mabs] = self.statCache[abs] + self.cache[mabs] = self.cache[abs] + } + } + + return m +} + +// lotta situps... +function makeAbs (self, f) { + var abs = f + if (f.charAt(0) === '/') { + abs = path.join(self.root, f) + } else if (exports.isAbsolute(f)) { + abs = f + } else if (self.changedCwd) { + abs = path.resolve(self.cwd, f) + } else if (self.realpath) { + abs = path.resolve(f) + } + return abs +} + + +// Return true, if pattern ends with globstar '**', for the accompanying parent directory. +// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents +function isIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +function childrenIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +},{"minimatch":26,"path":undefined}],18:[function(require,module,exports){ +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern, false) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern, inGlobStar) +// Get the first [n] items from pattern that are all strings +// Join these together. This is PREFIX. +// If there is no more remaining, then stat(PREFIX) and +// add to matches if it succeeds. END. +// +// If inGlobStar and PREFIX is symlink and points to dir +// set ENTRIES = [] +// else readdir(PREFIX) as ENTRIES +// If fail, END +// +// with ENTRIES +// If pattern[n] is GLOBSTAR +// // handle the case where the globstar match is empty +// // by pruning it out, and testing the resulting pattern +// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// // Mark that this entry is a globstar match +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) +// +// else // not globstar +// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) +// Test ENTRY against pattern[n] +// If fails, continue +// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) +// +// Caveat: +// Cache all stats and readdirs results to minimize syscall. Since all +// we ever care about is existence and directory-ness, we can just keep +// `true` for files, and [children,...] for directories, or `false` for +// things that don't exist. + +module.exports = glob + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var inherits = require('inherits') +var EE = require('events').EventEmitter +var path = require('path') +var assert = require('assert') +var globSync = require('./sync.js') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var isAbsolute = common.isAbsolute +var setopts = common.setopts +var ownProp = common.ownProp +var inflight = require('inflight') +var util = require('util') +var childrenIgnored = common.childrenIgnored + +var once = require('once') + +function glob (pattern, options, cb) { + if (typeof options === 'function') cb = options, options = {} + if (!options) options = {} + + if (options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return globSync(pattern, options) + } + + return new Glob(pattern, options, cb) +} + +glob.sync = globSync +var GlobSync = glob.GlobSync = globSync.GlobSync + +// old api surface +glob.glob = glob + +glob.hasMagic = function (pattern, options_) { + var options = util._extend({}, options_) + options.noprocess = true + + var g = new Glob(pattern, options) + var set = g.minimatch.set + if (set.length > 1) + return true + + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== 'string') + return true + } + + return false +} + +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } + + if (options && options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return new GlobSync(pattern, options) + } + + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb) + + setopts(this, pattern, options) + this._didRealPath = false + + // process each pattern in the minimatch set + var n = this.minimatch.set.length + + // The matches are stored as {: true,...} so that + // duplicates are automagically pruned. + // Later, we do an Object.keys() on these. + // Keep them as a list so we can fill in when nonull is set. + this.matches = new Array(n) + + if (typeof cb === 'function') { + cb = once(cb) + this.on('error', cb) + this.on('end', function (matches) { + cb(null, matches) + }) + } + + var self = this + var n = this.minimatch.set.length + this._processing = 0 + this.matches = new Array(n) + + this._emitQueue = [] + this._processQueue = [] + this.paused = false + + if (this.noprocess) + return this + + if (n === 0) + return done() + + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false, done) + } + + function done () { + --self._processing + if (self._processing <= 0) + self._finish() + } +} + +Glob.prototype._finish = function () { + assert(this instanceof Glob) + if (this.aborted) + return + + if (this.realpath && !this._didRealpath) + return this._realpath() + + common.finish(this) + this.emit('end', this.found) +} + +Glob.prototype._realpath = function () { + if (this._didRealpath) + return + + this._didRealpath = true + + var n = this.matches.length + if (n === 0) + return this._finish() + + var self = this + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next) + + function next () { + if (--n === 0) + self._finish() + } +} + +Glob.prototype._realpathSet = function (index, cb) { + var matchset = this.matches[index] + if (!matchset) + return cb() + + var found = Object.keys(matchset) + var self = this + var n = found.length + + if (n === 0) + return cb() + + var set = this.matches[index] = Object.create(null) + found.forEach(function (p, i) { + // If there's a problem with the stat, then it means that + // one or more of the links in the realpath couldn't be + // resolved. just return the abs value in that case. + p = self._makeAbs(p) + fs.realpath(p, self.realpathCache, function (er, real) { + if (!er) + set[real] = true + else if (er.syscall === 'stat') + set[p] = true + else + self.emit('error', er) // srsly wtf right here + + if (--n === 0) { + self.matches[index] = set + cb() + } + }) + }) +} + +Glob.prototype._mark = function (p) { + return common.mark(this, p) +} + +Glob.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + +Glob.prototype.abort = function () { + this.aborted = true + this.emit('abort') +} + +Glob.prototype.pause = function () { + if (!this.paused) { + this.paused = true + this.emit('pause') + } +} + +Glob.prototype.resume = function () { + if (this.paused) { + this.emit('resume') + this.paused = false + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0) + this._emitQueue.length = 0 + for (var i = 0; i < eq.length; i ++) { + var e = eq[i] + this._emitMatch(e[0], e[1]) + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0) + this._processQueue.length = 0 + for (var i = 0; i < pq.length; i ++) { + var p = pq[i] + this._processing-- + this._process(p[0], p[1], p[2], p[3]) + } + } + } +} + +Glob.prototype._process = function (pattern, index, inGlobStar, cb) { + assert(this instanceof Glob) + assert(typeof cb === 'function') + + if (this.aborted) + return + + this._processing++ + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]) + return + } + + //console.error('PROCESS %d', this._processing, pattern) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // see if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index, cb) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip _processing + if (childrenIgnored(this, read)) + return cb() + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) +} + +Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + +Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return cb() + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return cb() + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) + } + // This was the last one, and no stats were needed + return cb() + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + this._process([e].concat(remain), index, inGlobStar, cb) + } + cb() +} + +Glob.prototype._emitMatch = function (index, e) { + if (this.aborted) + return + + if (this.matches[index][e]) + return + + if (this.paused) { + this._emitQueue.push([index, e]) + return + } + + var abs = this._makeAbs(e) + + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } + + if (this.mark) + e = this._mark(e) + + this.matches[index][e] = true + + var st = this.statCache[abs] + if (st) + this.emit('stat', e, st) + + this.emit('match', e) +} + +Glob.prototype._readdirInGlobStar = function (abs, cb) { + if (this.aborted) + return + + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false, cb) + + var lstatkey = 'lstat\0' + abs + var self = this + var lstatcb = inflight(lstatkey, lstatcb_) + + if (lstatcb) + fs.lstat(abs, lstatcb) + + function lstatcb_ (er, lstat) { + if (er) + return cb() + + var isSym = lstat.isSymbolicLink() + self.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) { + self.cache[abs] = 'FILE' + cb() + } else + self._readdir(abs, false, cb) + } +} + +Glob.prototype._readdir = function (abs, inGlobStar, cb) { + if (this.aborted) + return + + cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) + if (!cb) + return + + //console.error('RD %j %j', +inGlobStar, abs) + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return cb() + + if (Array.isArray(c)) + return cb(null, c) + } + + var self = this + fs.readdir(abs, readdirCb(this, abs, cb)) +} + +function readdirCb (self, abs, cb) { + return function (er, entries) { + if (er) + self._readdirError(abs, er, cb) + else + self._readdirEntries(abs, entries, cb) + } +} + +Glob.prototype._readdirEntries = function (abs, entries, cb) { + if (this.aborted) + return + + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + return cb(null, entries) +} + +Glob.prototype._readdirError = function (f, er, cb) { + if (this.aborted) + return + + // handle errors, and cache the information + switch (er.code) { + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) return this.emit('error', er) + if (!this.silent) console.error('glob error', er) + break + } + return cb() +} + +Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + + +Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + //console.error('pgs2', prefix, remain[0], entries) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return cb() + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false, cb) + + var isSym = this.symlinks[abs] + var len = entries.length + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return cb() + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true, cb) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true, cb) + } + + cb() +} + +Glob.prototype._processSimple = function (prefix, index, cb) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var self = this + this._stat(prefix, function (er, exists) { + self._processSimple2(prefix, index, er, exists, cb) + }) +} +Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { + + //console.error('ps2', prefix, exists) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return cb() + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this._emitMatch(index, prefix) + cb() +} + +// Returns either 'DIR', 'FILE', or false +Glob.prototype._stat = function (f, cb) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return cb() + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return cb(null, c) + + if (needDir && c === 'FILE') + return cb() + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (stat !== undefined) { + if (stat === false) + return cb(null, stat) + else { + var type = stat.isDirectory() ? 'DIR' : 'FILE' + if (needDir && type === 'FILE') + return cb() + else + return cb(null, type, stat) + } + } + + var self = this + var statcb = inflight('stat\0' + abs, lstatcb_) + if (statcb) + fs.lstat(abs, statcb) + + function lstatcb_ (er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + // If it's a symlink, then treat it as the target, unless + // the target does not exist, then treat it as a file. + return fs.stat(abs, function (er, stat) { + if (er) + self._stat2(f, abs, null, lstat, cb) + else + self._stat2(f, abs, er, stat, cb) + }) + } else { + self._stat2(f, abs, er, lstat, cb) + } + } +} + +Glob.prototype._stat2 = function (f, abs, er, stat, cb) { + if (er) { + this.statCache[abs] = false + return cb() + } + + var needDir = f.slice(-1) === '/' + this.statCache[abs] = stat + + if (abs.slice(-1) === '/' && !stat.isDirectory()) + return cb(null, false, stat) + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return cb() + + return cb(null, c, stat) +} + +},{"./common.js":17,"./sync.js":19,"assert":undefined,"events":undefined,"fs":undefined,"inflight":21,"inherits":22,"minimatch":26,"once":28,"path":undefined,"util":undefined}],19:[function(require,module,exports){ +module.exports = globSync +globSync.GlobSync = GlobSync + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var Glob = require('./glob.js').Glob +var util = require('util') +var path = require('path') +var assert = require('assert') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var isAbsolute = common.isAbsolute +var setopts = common.setopts +var ownProp = common.ownProp +var childrenIgnored = common.childrenIgnored + +function globSync (pattern, options) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + return new GlobSync(pattern, options).found +} + +function GlobSync (pattern, options) { + if (!pattern) + throw new Error('must provide pattern') + + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options) + + setopts(this, pattern, options) + + if (this.noprocess) + return this + + var n = this.minimatch.set.length + this.matches = new Array(n) + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false) + } + this._finish() +} + +GlobSync.prototype._finish = function () { + assert(this instanceof GlobSync) + if (this.realpath) { + var self = this + this.matches.forEach(function (matchset, index) { + var set = self.matches[index] = Object.create(null) + for (var p in matchset) { + try { + p = self._makeAbs(p) + var real = fs.realpathSync(p, this.realpathCache) + set[real] = true + } catch (er) { + if (er.syscall === 'stat') + set[self._makeAbs(p)] = true + else + throw er + } + } + }) + } + common.finish(this) +} + + +GlobSync.prototype._process = function (pattern, index, inGlobStar) { + assert(this instanceof GlobSync) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // See if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip processing + if (childrenIgnored(this, read)) + return + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar) +} + + +GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar) + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix.slice(-1) !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this.matches[index][e] = true + } + // This was the last one, and no stats were needed + return + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) + newPattern = [prefix, e] + else + newPattern = [e] + this._process(newPattern.concat(remain), index, inGlobStar) + } +} + + +GlobSync.prototype._emitMatch = function (index, e) { + var abs = this._makeAbs(e) + if (this.mark) + e = this._mark(e) + + if (this.matches[index][e]) + return + + if (this.nodir) { + var c = this.cache[this._makeAbs(e)] + if (c === 'DIR' || Array.isArray(c)) + return + } + + this.matches[index][e] = true + if (this.stat) + this._stat(e) +} + + +GlobSync.prototype._readdirInGlobStar = function (abs) { + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false) + + var entries + var lstat + var stat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + // lstat failed, doesn't exist + return null + } + + var isSym = lstat.isSymbolicLink() + this.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) + this.cache[abs] = 'FILE' + else + entries = this._readdir(abs, false) + + return entries +} + +GlobSync.prototype._readdir = function (abs, inGlobStar) { + var entries + + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return null + + if (Array.isArray(c)) + return c + } + + try { + return this._readdirEntries(abs, fs.readdirSync(abs)) + } catch (er) { + this._readdirError(abs, er) + return null + } +} + +GlobSync.prototype._readdirEntries = function (abs, entries) { + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + + // mark and cache dir-ness + return entries +} + +GlobSync.prototype._readdirError = function (f, er) { + // handle errors, and cache the information + switch (er.code) { + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) throw er + if (!this.silent) console.error('glob error', er) + break + } +} + +GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { + + var entries = this._readdir(abs, inGlobStar) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false) + + var len = entries.length + var isSym = this.symlinks[abs] + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true) + } +} + +GlobSync.prototype._processSimple = function (prefix, index) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var exists = this._stat(prefix) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this.matches[index][prefix] = true +} + +// Returns either 'DIR', 'FILE', or false +GlobSync.prototype._stat = function (f) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return false + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return c + + if (needDir && c === 'FILE') + return false + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (!stat) { + var lstat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + return false + } + + if (lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs) + } catch (er) { + stat = lstat + } + } else { + stat = lstat + } + } + + this.statCache[abs] = stat + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return false + + return c +} + +GlobSync.prototype._mark = function (p) { + return common.mark(this, p) +} + +GlobSync.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + +},{"./common.js":17,"./glob.js":18,"assert":undefined,"fs":undefined,"minimatch":26,"path":undefined,"util":undefined}],20:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports.replaceAll = replaceAll; +var matchConstName = /[$#]?[\w-\.]+/g; + +function replaceAll(replacements, text) { + var matches = undefined; + while (matches = matchConstName.exec(text)) { + var replacement = replacements[matches[0]]; + if (replacement) { + text = text.slice(0, matches.index) + replacement + text.slice(matchConstName.lastIndex); + matchConstName.lastIndex -= matches[0].length - replacement.length; + } + } + return text; +} + +exports['default'] = function (css, translations) { + css.walkDecls(function (decl) { + return decl.value = replaceAll(translations, decl.value); + }); + css.walkAtRules('media', function (atRule) { + return atRule.params = replaceAll(translations, atRule.params); + }); +}; +},{}],21:[function(require,module,exports){ +var wrappy = require('wrappy') +var reqs = Object.create(null) +var once = require('once') + +module.exports = wrappy(inflight) + +function inflight (key, cb) { + if (reqs[key]) { + reqs[key].push(cb) + return null + } else { + reqs[key] = [cb] + return makeres(key) + } +} + +function makeres (key) { + return once(function RES () { + var cbs = reqs[key] + var len = cbs.length + var args = slice(arguments) + + // XXX It's somewhat ambiguous whether a new callback added in this + // pass should be queued for later execution if something in the + // list of callbacks throws, or if it should just be discarded. + // However, it's such an edge case that it hardly matters, and either + // choice is likely as surprising as the other. + // As it happens, we do go ahead and schedule it for later execution. + try { + for (var i = 0; i < len; i++) { + cbs[i].apply(null, args) + } + } finally { + if (cbs.length > len) { + // added more in the interim. + // de-zalgo, just in case, but don't call again. + cbs.splice(0, len) + process.nextTick(function () { + RES.apply(null, args) + }) + } else { + delete reqs[key] + } + } + }) +} + +function slice (args) { + var length = args.length + var array = [] + + for (var i = 0; i < length; i++) array[i] = args[i] + return array +} + +},{"once":28,"wrappy":75}],22:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],23:[function(require,module,exports){ +/* + * $Id: base64.js,v 2.15 2014/04/05 12:58:57 dankogai Exp dankogai $ + * + * Licensed under the MIT license. + * http://opensource.org/licenses/mit-license + * + * References: + * http://en.wikipedia.org/wiki/Base64 + */ + +(function(global) { + 'use strict'; + // existing version for noConflict() + var _Base64 = global.Base64; + var version = "2.1.9"; + // if node.js, we use Buffer + var buffer; + if (typeof module !== 'undefined' && module.exports) { + try { + buffer = require('buffer').Buffer; + } catch (err) {} + } + // constants + var b64chars + = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + var b64tab = function(bin) { + var t = {}; + for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i; + return t; + }(b64chars); + var fromCharCode = String.fromCharCode; + // encoder stuff + var cb_utob = function(c) { + if (c.length < 2) { + var cc = c.charCodeAt(0); + return cc < 0x80 ? c + : cc < 0x800 ? (fromCharCode(0xc0 | (cc >>> 6)) + + fromCharCode(0x80 | (cc & 0x3f))) + : (fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) + + fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) + + fromCharCode(0x80 | ( cc & 0x3f))); + } else { + var cc = 0x10000 + + (c.charCodeAt(0) - 0xD800) * 0x400 + + (c.charCodeAt(1) - 0xDC00); + return (fromCharCode(0xf0 | ((cc >>> 18) & 0x07)) + + fromCharCode(0x80 | ((cc >>> 12) & 0x3f)) + + fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) + + fromCharCode(0x80 | ( cc & 0x3f))); + } + }; + var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; + var utob = function(u) { + return u.replace(re_utob, cb_utob); + }; + var cb_encode = function(ccc) { + var padlen = [0, 2, 1][ccc.length % 3], + ord = ccc.charCodeAt(0) << 16 + | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) + | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)), + chars = [ + b64chars.charAt( ord >>> 18), + b64chars.charAt((ord >>> 12) & 63), + padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63), + padlen >= 1 ? '=' : b64chars.charAt(ord & 63) + ]; + return chars.join(''); + }; + var btoa = global.btoa ? function(b) { + return global.btoa(b); + } : function(b) { + return b.replace(/[\s\S]{1,3}/g, cb_encode); + }; + var _encode = buffer ? function (u) { + return (u.constructor === buffer.constructor ? u : new buffer(u)) + .toString('base64') + } + : function (u) { return btoa(utob(u)) } + ; + var encode = function(u, urisafe) { + return !urisafe + ? _encode(String(u)) + : _encode(String(u)).replace(/[+\/]/g, function(m0) { + return m0 == '+' ? '-' : '_'; + }).replace(/=/g, ''); + }; + var encodeURI = function(u) { return encode(u, true) }; + // decoder stuff + var re_btou = new RegExp([ + '[\xC0-\xDF][\x80-\xBF]', + '[\xE0-\xEF][\x80-\xBF]{2}', + '[\xF0-\xF7][\x80-\xBF]{3}' + ].join('|'), 'g'); + var cb_btou = function(cccc) { + switch(cccc.length) { + case 4: + var cp = ((0x07 & cccc.charCodeAt(0)) << 18) + | ((0x3f & cccc.charCodeAt(1)) << 12) + | ((0x3f & cccc.charCodeAt(2)) << 6) + | (0x3f & cccc.charCodeAt(3)), + offset = cp - 0x10000; + return (fromCharCode((offset >>> 10) + 0xD800) + + fromCharCode((offset & 0x3FF) + 0xDC00)); + case 3: + return fromCharCode( + ((0x0f & cccc.charCodeAt(0)) << 12) + | ((0x3f & cccc.charCodeAt(1)) << 6) + | (0x3f & cccc.charCodeAt(2)) + ); + default: + return fromCharCode( + ((0x1f & cccc.charCodeAt(0)) << 6) + | (0x3f & cccc.charCodeAt(1)) + ); + } + }; + var btou = function(b) { + return b.replace(re_btou, cb_btou); + }; + var cb_decode = function(cccc) { + var len = cccc.length, + padlen = len % 4, + n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0) + | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0) + | (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0) + | (len > 3 ? b64tab[cccc.charAt(3)] : 0), + chars = [ + fromCharCode( n >>> 16), + fromCharCode((n >>> 8) & 0xff), + fromCharCode( n & 0xff) + ]; + chars.length -= [0, 0, 2, 1][padlen]; + return chars.join(''); + }; + var atob = global.atob ? function(a) { + return global.atob(a); + } : function(a){ + return a.replace(/[\s\S]{1,4}/g, cb_decode); + }; + var _decode = buffer ? function(a) { + return (a.constructor === buffer.constructor + ? a : new buffer(a, 'base64')).toString(); + } + : function(a) { return btou(atob(a)) }; + var decode = function(a){ + return _decode( + String(a).replace(/[-_]/g, function(m0) { return m0 == '-' ? '+' : '/' }) + .replace(/[^A-Za-z0-9\+\/]/g, '') + ); + }; + var noConflict = function() { + var Base64 = global.Base64; + global.Base64 = _Base64; + return Base64; + }; + // export Base64 + global.Base64 = { + VERSION: version, + atob: atob, + btoa: btoa, + fromBase64: decode, + toBase64: encode, + utob: utob, + encode: encode, + encodeURI: encodeURI, + btou: btou, + decode: decode, + noConflict: noConflict + }; + // if ES5 is available, make Base64.extendString() available + if (typeof Object.defineProperty === 'function') { + var noEnum = function(v){ + return {value:v,enumerable:false,writable:true,configurable:true}; + }; + global.Base64.extendString = function () { + Object.defineProperty( + String.prototype, 'fromBase64', noEnum(function () { + return decode(this) + })); + Object.defineProperty( + String.prototype, 'toBase64', noEnum(function (urisafe) { + return encode(this, urisafe) + })); + Object.defineProperty( + String.prototype, 'toBase64URI', noEnum(function () { + return encode(this, true) + })); + }; + } + // that's it! + if (global['Meteor']) { + Base64 = global.Base64; // for normal export in Meteor.js + } +})(this); + +},{"buffer":undefined}],24:[function(require,module,exports){ +// json5.js +// Modern JSON. See README.md for details. +// +// This file is based directly off of Douglas Crockford's json_parse.js: +// https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js + +var JSON5 = (typeof exports === 'object' ? exports : {}); + +JSON5.parse = (function () { + "use strict"; + +// This is a function that can parse a JSON5 text, producing a JavaScript +// data structure. It is a simple, recursive descent parser. It does not use +// eval or regular expressions, so it can be used as a model for implementing +// a JSON5 parser in other languages. + +// We are defining the function inside of another function to avoid creating +// global variables. + + var at, // The index of the current character + lineNumber, // The current line number + columnNumber, // The current column number + ch, // The current character + escapee = { + "'": "'", + '"': '"', + '\\': '\\', + '/': '/', + '\n': '', // Replace escaped newlines in strings w/ empty string + b: '\b', + f: '\f', + n: '\n', + r: '\r', + t: '\t' + }, + ws = [ + ' ', + '\t', + '\r', + '\n', + '\v', + '\f', + '\xA0', + '\uFEFF' + ], + text, + + renderChar = function (chr) { + return chr === '' ? 'EOF' : "'" + chr + "'"; + }, + + error = function (m) { + +// Call error when something is wrong. + + var error = new SyntaxError(); + // beginning of message suffix to agree with that provided by Gecko - see https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse + error.message = m + " at line " + lineNumber + " column " + columnNumber + " of the JSON5 data. Still to read: " + JSON.stringify(text.substring(at - 1, at + 19)); + error.at = at; + // These two property names have been chosen to agree with the ones in Gecko, the only popular + // environment which seems to supply this info on JSON.parse + error.lineNumber = lineNumber; + error.columnNumber = columnNumber; + throw error; + }, + + next = function (c) { + +// If a c parameter is provided, verify that it matches the current character. + + if (c && c !== ch) { + error("Expected " + renderChar(c) + " instead of " + renderChar(ch)); + } + +// Get the next character. When there are no more characters, +// return the empty string. + + ch = text.charAt(at); + at++; + columnNumber++; + if (ch === '\n' || ch === '\r' && peek() !== '\n') { + lineNumber++; + columnNumber = 0; + } + return ch; + }, + + peek = function () { + +// Get the next character without consuming it or +// assigning it to the ch varaible. + + return text.charAt(at); + }, + + identifier = function () { + +// Parse an identifier. Normally, reserved words are disallowed here, but we +// only use this for unquoted object keys, where reserved words are allowed, +// so we don't check for those here. References: +// - http://es5.github.com/#x7.6 +// - https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Core_Language_Features#Variables +// - http://docstore.mik.ua/orelly/webprog/jscript/ch02_07.htm +// TODO Identifiers can have Unicode "letters" in them; add support for those. + + var key = ch; + + // Identifiers must start with a letter, _ or $. + if ((ch !== '_' && ch !== '$') && + (ch < 'a' || ch > 'z') && + (ch < 'A' || ch > 'Z')) { + error("Bad identifier as unquoted key"); + } + + // Subsequent characters can contain digits. + while (next() && ( + ch === '_' || ch === '$' || + (ch >= 'a' && ch <= 'z') || + (ch >= 'A' && ch <= 'Z') || + (ch >= '0' && ch <= '9'))) { + key += ch; + } + + return key; + }, + + number = function () { + +// Parse a number value. + + var number, + sign = '', + string = '', + base = 10; + + if (ch === '-' || ch === '+') { + sign = ch; + next(ch); + } + + // support for Infinity (could tweak to allow other words): + if (ch === 'I') { + number = word(); + if (typeof number !== 'number' || isNaN(number)) { + error('Unexpected word for number'); + } + return (sign === '-') ? -number : number; + } + + // support for NaN + if (ch === 'N' ) { + number = word(); + if (!isNaN(number)) { + error('expected word to be NaN'); + } + // ignore sign as -NaN also is NaN + return number; + } + + if (ch === '0') { + string += ch; + next(); + if (ch === 'x' || ch === 'X') { + string += ch; + next(); + base = 16; + } else if (ch >= '0' && ch <= '9') { + error('Octal literal'); + } + } + + switch (base) { + case 10: + while (ch >= '0' && ch <= '9' ) { + string += ch; + next(); + } + if (ch === '.') { + string += '.'; + while (next() && ch >= '0' && ch <= '9') { + string += ch; + } + } + if (ch === 'e' || ch === 'E') { + string += ch; + next(); + if (ch === '-' || ch === '+') { + string += ch; + next(); + } + while (ch >= '0' && ch <= '9') { + string += ch; + next(); + } + } + break; + case 16: + while (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') { + string += ch; + next(); + } + break; + } + + if(sign === '-') { + number = -string; + } else { + number = +string; + } + + if (!isFinite(number)) { + error("Bad number"); + } else { + return number; + } + }, + + string = function () { + +// Parse a string value. + + var hex, + i, + string = '', + delim, // double quote or single quote + uffff; + +// When parsing for string values, we must look for ' or " and \ characters. + + if (ch === '"' || ch === "'") { + delim = ch; + while (next()) { + if (ch === delim) { + next(); + return string; + } else if (ch === '\\') { + next(); + if (ch === 'u') { + uffff = 0; + for (i = 0; i < 4; i += 1) { + hex = parseInt(next(), 16); + if (!isFinite(hex)) { + break; + } + uffff = uffff * 16 + hex; + } + string += String.fromCharCode(uffff); + } else if (ch === '\r') { + if (peek() === '\n') { + next(); + } + } else if (typeof escapee[ch] === 'string') { + string += escapee[ch]; + } else { + break; + } + } else if (ch === '\n') { + // unescaped newlines are invalid; see: + // https://github.com/aseemk/json5/issues/24 + // TODO this feels special-cased; are there other + // invalid unescaped chars? + break; + } else { + string += ch; + } + } + } + error("Bad string"); + }, + + inlineComment = function () { + +// Skip an inline comment, assuming this is one. The current character should +// be the second / character in the // pair that begins this inline comment. +// To finish the inline comment, we look for a newline or the end of the text. + + if (ch !== '/') { + error("Not an inline comment"); + } + + do { + next(); + if (ch === '\n' || ch === '\r') { + next(); + return; + } + } while (ch); + }, + + blockComment = function () { + +// Skip a block comment, assuming this is one. The current character should be +// the * character in the /* pair that begins this block comment. +// To finish the block comment, we look for an ending */ pair of characters, +// but we also watch for the end of text before the comment is terminated. + + if (ch !== '*') { + error("Not a block comment"); + } + + do { + next(); + while (ch === '*') { + next('*'); + if (ch === '/') { + next('/'); + return; + } + } + } while (ch); + + error("Unterminated block comment"); + }, + + comment = function () { + +// Skip a comment, whether inline or block-level, assuming this is one. +// Comments always begin with a / character. + + if (ch !== '/') { + error("Not a comment"); + } + + next('/'); + + if (ch === '/') { + inlineComment(); + } else if (ch === '*') { + blockComment(); + } else { + error("Unrecognized comment"); + } + }, + + white = function () { + +// Skip whitespace and comments. +// Note that we're detecting comments by only a single / character. +// This works since regular expressions are not valid JSON(5), but this will +// break if there are other valid values that begin with a / character! + + while (ch) { + if (ch === '/') { + comment(); + } else if (ws.indexOf(ch) >= 0) { + next(); + } else { + return; + } + } + }, + + word = function () { + +// true, false, or null. + + switch (ch) { + case 't': + next('t'); + next('r'); + next('u'); + next('e'); + return true; + case 'f': + next('f'); + next('a'); + next('l'); + next('s'); + next('e'); + return false; + case 'n': + next('n'); + next('u'); + next('l'); + next('l'); + return null; + case 'I': + next('I'); + next('n'); + next('f'); + next('i'); + next('n'); + next('i'); + next('t'); + next('y'); + return Infinity; + case 'N': + next( 'N' ); + next( 'a' ); + next( 'N' ); + return NaN; + } + error("Unexpected " + renderChar(ch)); + }, + + value, // Place holder for the value function. + + array = function () { + +// Parse an array value. + + var array = []; + + if (ch === '[') { + next('['); + white(); + while (ch) { + if (ch === ']') { + next(']'); + return array; // Potentially empty array + } + // ES5 allows omitting elements in arrays, e.g. [,] and + // [,null]. We don't allow this in JSON5. + if (ch === ',') { + error("Missing array element"); + } else { + array.push(value()); + } + white(); + // If there's no comma after this value, this needs to + // be the end of the array. + if (ch !== ',') { + next(']'); + return array; + } + next(','); + white(); + } + } + error("Bad array"); + }, + + object = function () { + +// Parse an object value. + + var key, + object = {}; + + if (ch === '{') { + next('{'); + white(); + while (ch) { + if (ch === '}') { + next('}'); + return object; // Potentially empty object + } + + // Keys can be unquoted. If they are, they need to be + // valid JS identifiers. + if (ch === '"' || ch === "'") { + key = string(); + } else { + key = identifier(); + } + + white(); + next(':'); + object[key] = value(); + white(); + // If there's no comma after this pair, this needs to be + // the end of the object. + if (ch !== ',') { + next('}'); + return object; + } + next(','); + white(); + } + } + error("Bad object"); + }; + + value = function () { + +// Parse a JSON value. It could be an object, an array, a string, a number, +// or a word. + + white(); + switch (ch) { + case '{': + return object(); + case '[': + return array(); + case '"': + case "'": + return string(); + case '-': + case '+': + case '.': + return number(); + default: + return ch >= '0' && ch <= '9' ? number() : word(); + } + }; + +// Return the json_parse function. It will have access to all of the above +// functions and variables. + + return function (source, reviver) { + var result; + + text = String(source); + at = 0; + lineNumber = 1; + columnNumber = 1; + ch = ' '; + result = value(); + white(); + if (ch) { + error("Syntax error"); + } + +// If there is a reviver function, we recursively walk the new structure, +// passing each name/value pair to the reviver function for possible +// transformation, starting with a temporary root object that holds the result +// in an empty key. If there is not a reviver function, we simply return the +// result. + + return typeof reviver === 'function' ? (function walk(holder, key) { + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + }({'': result}, '')) : result; + }; +}()); + +// JSON5 stringify will not quote keys where appropriate +JSON5.stringify = function (obj, replacer, space) { + if (replacer && (typeof(replacer) !== "function" && !isArray(replacer))) { + throw new Error('Replacer must be a function or an array'); + } + var getReplacedValueOrUndefined = function(holder, key, isTopLevel) { + var value = holder[key]; + + // Replace the value with its toJSON value first, if possible + if (value && value.toJSON && typeof value.toJSON === "function") { + value = value.toJSON(); + } + + // If the user-supplied replacer if a function, call it. If it's an array, check objects' string keys for + // presence in the array (removing the key/value pair from the resulting JSON if the key is missing). + if (typeof(replacer) === "function") { + return replacer.call(holder, key, value); + } else if(replacer) { + if (isTopLevel || isArray(holder) || replacer.indexOf(key) >= 0) { + return value; + } else { + return undefined; + } + } else { + return value; + } + }; + + function isWordChar(c) { + return (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9') || + c === '_' || c === '$'; + } + + function isWordStart(c) { + return (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + c === '_' || c === '$'; + } + + function isWord(key) { + if (typeof key !== 'string') { + return false; + } + if (!isWordStart(key[0])) { + return false; + } + var i = 1, length = key.length; + while (i < length) { + if (!isWordChar(key[i])) { + return false; + } + i++; + } + return true; + } + + // export for use in tests + JSON5.isWord = isWord; + + // polyfills + function isArray(obj) { + if (Array.isArray) { + return Array.isArray(obj); + } else { + return Object.prototype.toString.call(obj) === '[object Array]'; + } + } + + function isDate(obj) { + return Object.prototype.toString.call(obj) === '[object Date]'; + } + + var objStack = []; + function checkForCircular(obj) { + for (var i = 0; i < objStack.length; i++) { + if (objStack[i] === obj) { + throw new TypeError("Converting circular structure to JSON"); + } + } + } + + function makeIndent(str, num, noNewLine) { + if (!str) { + return ""; + } + // indentation no more than 10 chars + if (str.length > 10) { + str = str.substring(0, 10); + } + + var indent = noNewLine ? "" : "\n"; + for (var i = 0; i < num; i++) { + indent += str; + } + + return indent; + } + + var indentStr; + if (space) { + if (typeof space === "string") { + indentStr = space; + } else if (typeof space === "number" && space >= 0) { + indentStr = makeIndent(" ", space, true); + } else { + // ignore space parameter + } + } + + // Copied from Crokford's implementation of JSON + // See https://github.com/douglascrockford/JSON-js/blob/e39db4b7e6249f04a195e7dd0840e610cc9e941e/json2.js#L195 + // Begin + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }; + function escapeString(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? + c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + // End + + function internalStringify(holder, key, isTopLevel) { + var buffer, res; + + // Replace the value, if necessary + var obj_part = getReplacedValueOrUndefined(holder, key, isTopLevel); + + if (obj_part && !isDate(obj_part)) { + // unbox objects + // don't unbox dates, since will turn it into number + obj_part = obj_part.valueOf(); + } + switch(typeof obj_part) { + case "boolean": + return obj_part.toString(); + + case "number": + if (isNaN(obj_part) || !isFinite(obj_part)) { + return "null"; + } + return obj_part.toString(); + + case "string": + return escapeString(obj_part.toString()); + + case "object": + if (obj_part === null) { + return "null"; + } else if (isArray(obj_part)) { + checkForCircular(obj_part); + buffer = "["; + objStack.push(obj_part); + + for (var i = 0; i < obj_part.length; i++) { + res = internalStringify(obj_part, i, false); + buffer += makeIndent(indentStr, objStack.length); + if (res === null || typeof res === "undefined") { + buffer += "null"; + } else { + buffer += res; + } + if (i < obj_part.length-1) { + buffer += ","; + } else if (indentStr) { + buffer += "\n"; + } + } + objStack.pop(); + buffer += makeIndent(indentStr, objStack.length, true) + "]"; + } else { + checkForCircular(obj_part); + buffer = "{"; + var nonEmpty = false; + objStack.push(obj_part); + for (var prop in obj_part) { + if (obj_part.hasOwnProperty(prop)) { + var value = internalStringify(obj_part, prop, false); + isTopLevel = false; + if (typeof value !== "undefined" && value !== null) { + buffer += makeIndent(indentStr, objStack.length); + nonEmpty = true; + key = isWord(prop) ? prop : escapeString(prop); + buffer += key + ":" + (indentStr ? ' ' : '') + value + ","; + } + } + } + objStack.pop(); + if (nonEmpty) { + buffer = buffer.substring(0, buffer.length-1) + makeIndent(indentStr, objStack.length) + "}"; + } else { + buffer = '{}'; + } + } + return buffer; + default: + // functions and undefined should be ignored + return undefined; + } + } + + // special case...when undefined is used inside of + // a compound object/array, return null. + // but when top-level, return undefined + var topLevelHolder = {"":obj}; + if (obj === undefined) { + return getReplacedValueOrUndefined(topLevelHolder, '', true); + } + return internalStringify(topLevelHolder, '', true); +}; + +},{}],25:[function(require,module,exports){ +var JSON5 = require("json5"); +var path = require("path"); +var assign = require("object-assign"); +var emojiRegex = /[\uD800-\uDFFF]./; +var emojiList = require("emojis-list").filter(function(emoji) { + return emojiRegex.test(emoji) +}); + +var baseEncodeTables = { + 26: "abcdefghijklmnopqrstuvwxyz", + 32: "123456789abcdefghjkmnpqrstuvwxyz", // no 0lio + 36: "0123456789abcdefghijklmnopqrstuvwxyz", + 49: "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ", // no lIO + 52: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 58: "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ", // no 0lIO + 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", + 64: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_" +}; +var emojiCache = {}; + +function encodeStringToEmoji(content, length) { + if (emojiCache[content]) return emojiCache[content]; + length = length || 1; + var emojis = []; + do { + var index = Math.floor(Math.random() * emojiList.length); + emojis.push(emojiList[index]); + emojiList.splice(index, 1); + } while (--length > 0); + var emojiEncoding = emojis.join(''); + emojiCache[content] = emojiEncoding; + return emojiEncoding; +} + +function encodeBufferToBase(buffer, base) { + var encodeTable = baseEncodeTables[base]; + if (!encodeTable) throw new Error("Unknown encoding base" + base); + + var readLength = buffer.length; + + var Big = require('big.js'); + Big.RM = Big.DP = 0; + var b = new Big(0); + for (var i = readLength - 1; i >= 0; i--) { + b = b.times(256).plus(buffer[i]); + } + + var output = ""; + while (b.gt(0)) { + output = encodeTable[b.mod(base)] + output; + b = b.div(base); + } + + Big.DP = 20; + Big.RM = 1; + + return output; +} + +exports.parseQuery = function parseQuery(query) { + var specialValues = { + 'null': null, + 'true': true, + 'false': false + }; + if(!query) return {}; + if(typeof query !== "string") + return query; + if(query.substr(0, 1) !== "?") + throw new Error("a valid query string passed to parseQuery should begin with '?'"); + query = query.substr(1); + var queryLength = query.length; + if(query.substr(0, 1) === "{" && query.substr(-1) === "}") { + return JSON5.parse(query); + } + var queryArgs = query.split(/[,\&]/g); + var result = {}; + queryArgs.forEach(function(arg) { + var idx = arg.indexOf("="); + if(idx >= 0) { + var name = arg.substr(0, idx); + var value = decodeURIComponent(arg.substr(idx+1)); + if (specialValues.hasOwnProperty(value)) { + value = specialValues[value]; + } + if(name.substr(-2) === "[]") { + name = decodeURIComponent(name.substr(0, name.length-2)); + if(!Array.isArray(result[name])) + result[name] = []; + result[name].push(value); + } else { + name = decodeURIComponent(name); + result[name] = value; + } + } else { + if(arg.substr(0, 1) === "-") { + result[decodeURIComponent(arg.substr(1))] = false; + } else if(arg.substr(0, 1) === "+") { + result[decodeURIComponent(arg.substr(1))] = true; + } else { + result[decodeURIComponent(arg)] = true; + } + } + }); + return result; +}; + +exports.getLoaderConfig = function(loaderContext, defaultConfigKey) { + var query = exports.parseQuery(loaderContext.query); + var configKey = query.config || defaultConfigKey; + if (configKey) { + var config = loaderContext.options[configKey] || {}; + delete query.config; + return assign({}, config, query); + } + + return query; +}; + +exports.stringifyRequest = function(loaderContext, request) { + var splitted = request.split("!"); + var context = loaderContext.context || (loaderContext.options && loaderContext.options.context); + return JSON.stringify(splitted.map(function(part) { + if(/^\/|^[A-Z]:/i.test(part) && context) { + part = path.relative(context, part); + if(/^[A-Z]:/i.test(part)) { + return part; + } else { + return "./" + part.replace(/\\/g, "/"); + } + } + return part; + }).join("!")); +}; + +function dotRequest(obj) { + return obj.request; +} + +exports.getRemainingRequest = function(loaderContext) { + if(loaderContext.remainingRequest) + return loaderContext.remainingRequest; + var request = loaderContext.loaders.slice(loaderContext.loaderIndex+1).map(dotRequest).concat([loaderContext.resource]); + return request.join("!"); +}; + +exports.getCurrentRequest = function(loaderContext) { + if(loaderContext.currentRequest) + return loaderContext.currentRequest; + var request = loaderContext.loaders.slice(loaderContext.loaderIndex).map(dotRequest).concat([loaderContext.resource]); + return request.join("!"); +}; + +exports.isUrlRequest = function(url, root) { + // An URL is not an request if + // 1. it's a Data Url + // 2. it's an absolute url or and protocol-relative + // 3. it's some kind of url for a template + if(/^data:|^chrome-extension:|^(https?:)?\/\/|^[\{\}\[\]#*;,'§\$%&\(=?`´\^°<>]/.test(url)) return false; + // 4. It's also not an request if root isn't set and it's a root-relative url + if((root === undefined || root === false) && /^\//.test(url)) return false; + return true; +}; + +exports.urlToRequest = function(url, root) { + var moduleRequestRegex = /^[^?]*~/; + var request; + + if(/^[a-zA-Z]:\\|^\\\\/.test(url)) { + // absolute windows path, keep it + request = url; + } else if(root !== undefined && root !== false && /^\//.test(url)) { + // if root is set and the url is root-relative + switch(typeof root) { + // 1. root is a string: root is prefixed to the url + case "string": + // special case: `~` roots convert to module request + if (moduleRequestRegex.test(root)) { + request = root.replace(/([^~\/])$/, "$1/") + url.slice(1); + } else { + request = root + url; + } + break; + // 2. root is `true`: absolute paths are allowed + // *nix only, windows-style absolute paths are always allowed as they doesn't start with a `/` + case "boolean": + request = url; + break; + default: + throw new Error("Unexpected parameters to loader-utils 'urlToRequest': url = " + url + ", root = " + root + "."); + } + } else if(/^\.\.?\//.test(url)) { + // A relative url stays + request = url; + } else { + // every other url is threaded like a relative url + request = "./" + url; + } + + // A `~` makes the url an module + if (moduleRequestRegex.test(request)) { + request = request.replace(moduleRequestRegex, ""); + } + + return request; +}; + +exports.parseString = function parseString(str) { + try { + if(str[0] === '"') return JSON.parse(str); + if(str[0] === "'" && str.substr(str.length - 1) === "'") { + return parseString(str.replace(/\\.|"/g, function(x) { + if(x === '"') return '\\"'; + return x; + }).replace(/^'|'$/g, '"')); + } + return JSON.parse('"' + str + '"'); + } catch(e) { + return str; + } +}; + +exports.getHashDigest = function getHashDigest(buffer, hashType, digestType, maxLength) { + hashType = hashType || "md5"; + maxLength = maxLength || 9999; + var hash = require("crypto").createHash(hashType); + hash.update(buffer); + if (digestType === "base26" || digestType === "base32" || digestType === "base36" || + digestType === "base49" || digestType === "base52" || digestType === "base58" || + digestType === "base62" || digestType === "base64") { + return encodeBufferToBase(hash.digest(), digestType.substr(4)).substr(0, maxLength); + } else { + return hash.digest(digestType || "hex").substr(0, maxLength); + } +}; + +exports.interpolateName = function interpolateName(loaderContext, name, options) { + var filename = name || "[hash].[ext]"; + var context = options.context; + var content = options.content; + var regExp = options.regExp; + var ext = "bin"; + var basename = "file"; + var directory = ""; + var folder = ""; + if(loaderContext.resourcePath) { + var resourcePath = loaderContext.resourcePath; + var idx = resourcePath.lastIndexOf("."); + var i = resourcePath.lastIndexOf("\\"); + var j = resourcePath.lastIndexOf("/"); + var p = i < 0 ? j : j < 0 ? i : i < j ? i : j; + if(idx >= 0) { + ext = resourcePath.substr(idx+1); + resourcePath = resourcePath.substr(0, idx); + } + if(p >= 0) { + basename = resourcePath.substr(p+1); + resourcePath = resourcePath.substr(0, p+1); + } + if (typeof context !== 'undefined') { + directory = path.relative(context, resourcePath + "_").replace(/\\/g, "/").replace(/\.\.(\/)?/g, "_$1"); + directory = directory.substr(0, directory.length-1); + } + else { + directory = resourcePath.replace(/\\/g, "/").replace(/\.\.(\/)?/g, "_$1"); + } + if (directory.length === 1) { + directory = ""; + } else if (directory.length > 1) { + folder = path.basename(directory); + } + } + var url = filename; + if(content) { + // Match hash template + url = url.replace(/\[(?:(\w+):)?hash(?::([a-z]+\d*))?(?::(\d+))?\]/ig, function() { + return exports.getHashDigest(content, arguments[1], arguments[2], parseInt(arguments[3], 10)); + }).replace(/\[emoji(?::(\d+))?\]/ig, function() { + return encodeStringToEmoji(content, arguments[1]); + }); + } + url = url.replace(/\[ext\]/ig, function() { + return ext; + }).replace(/\[name\]/ig, function() { + return basename; + }).replace(/\[path\]/ig, function() { + return directory; + }).replace(/\[folder\]/ig, function() { + return folder; + }); + if(regExp && loaderContext.resourcePath) { + var re = new RegExp(regExp); + var match = loaderContext.resourcePath.match(re); + if(match) { + for (var i = 0; i < match.length; i++) { + var re = new RegExp("\\[" + i + "\\]", "ig"); + url = url.replace(re, match[i]); + } + } + } + if(typeof loaderContext.options === "object" && typeof loaderContext.options.customInterpolateName === "function") { + url = loaderContext.options.customInterpolateName.call(loaderContext, url, name, options); + } + return url; +}; + +},{"big.js":3,"crypto":undefined,"emojis-list":14,"json5":24,"object-assign":27,"path":undefined}],26:[function(require,module,exports){ +module.exports = minimatch +minimatch.Minimatch = Minimatch + +var path = { sep: '/' } +try { + path = require('path') +} catch (er) {} + +var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} +var expand = require('brace-expansion') + +// any single thing other than / +// don't need to escape / when using new RegExp() +var qmark = '[^/]' + +// * => any number of characters +var star = qmark + '*?' + +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' + +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' + +// characters that need to be escaped in RegExp. +var reSpecials = charSet('().*{}+?[]^$\\!') + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split('').reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} + +function minimatch (p, pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false + } + + // "" only matches "" + if (pattern.trim() === '') return p === '' + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options) + } + + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + pattern = pattern.trim() + + // windows support: need to use /, not \ + if (path.sep !== '/') { + pattern = pattern.split(path.sep).join('/') + } + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function () {} + +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return + + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = console.error + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return s.indexOf(false) === -1 + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + var negate = false + var options = this.options + var negateOffset = 0 + + if (options.nonegate) return + + for (var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === '!' + ; i++) { + negate = !negate + negateOffset++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return braceExpand(pattern, options) +} + +Minimatch.prototype.braceExpand = braceExpand + +function braceExpand (pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options + } else { + options = {} + } + } + + pattern = typeof pattern === 'undefined' + ? this.pattern : pattern + + if (typeof pattern === 'undefined') { + throw new Error('undefined pattern') + } + + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] + } + + return expand(pattern) +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + var options = this.options + + // shortcuts + if (!options.noglobstar && pattern === '**') return GLOBSTAR + if (pattern === '') return '' + + var re = '' + var hasMagic = !!options.nocase + var escaping = false + // ? => one single character + var patternListStack = [] + var negativeLists = [] + var plType + var stateChar + var inClass = false + var reClassStart = -1 + var classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + var patternStart = pattern.charAt(0) === '.' ? '' // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' + : '(?!\\.)' + var self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case '*': + re += star + hasMagic = true + break + case '?': + re += qmark + hasMagic = true + break + default: + re += '\\' + stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for (var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i++) { + this.debug('%s\t%s %s %j', pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += '\\' + c + escaping = false + continue + } + + switch (c) { + case '/': + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + + case '\\': + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case '?': + case '*': + case '+': + case '@': + case '!': + this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === '!' && i === classStart + 1) c = '^' + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case '(': + if (inClass) { + re += '(' + continue + } + + if (!stateChar) { + re += '\\(' + continue + } + + plType = stateChar + patternListStack.push({ + type: plType, + start: i - 1, + reStart: re.length + }) + // negation is (?:(?!js)[^/]*) + re += stateChar === '!' ? '(?:(?!(?:' : '(?:' + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ')': + if (inClass || !patternListStack.length) { + re += '\\)' + continue + } + + clearStateChar() + hasMagic = true + re += ')' + var pl = patternListStack.pop() + plType = pl.type + // negation is (?:(?!js)[^/]*) + // The others are (?:) + switch (plType) { + case '!': + negativeLists.push(pl) + re += ')[^/]*?)' + pl.reEnd = re.length + break + case '?': + case '+': + case '*': + re += plType + break + case '@': break // the default anyway + } + continue + + case '|': + if (inClass || !patternListStack.length || escaping) { + re += '\\|' + escaping = false + continue + } + + clearStateChar() + re += '|' + continue + + // these are mostly the same in regexp and glob + case '[': + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += '\\' + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case ']': + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += '\\' + c + escaping = false + continue + } + + // handle the case where we left a class open. + // "[z-a]" is valid, equivalent to "\[z-a\]" + if (inClass) { + // split where the last [ was, make sure we don't have + // an invalid re. if so, re-walk the contents of the + // would-be class to re-translate any characters that + // were passed through as-is + // TODO: It would probably be faster to determine this + // without a try/catch and a new RegExp, but it's tricky + // to do safely. For now, this is safe and works. + var cs = pattern.substring(classStart + 1, i) + try { + RegExp('[' + cs + ']') + } catch (er) { + // not a valid class! + var sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' + hasMagic = hasMagic || sp[1] + inClass = false + continue + } + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === '^' && inClass)) { + re += '\\' + } + + re += c + + } // switch + } // for + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + cs = pattern.substr(classStart + 1) + sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + 3) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = '\\' + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + '|' + }) + + this.debug('tail=%j\n %s', tail, tail) + var t = pl.type === '*' ? star + : pl.type === '?' ? qmark + : '\\' + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + t + '\\(' + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += '\\\\' + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case '.': + case '[': + case '(': addPatternStart = true + } + + // Hack to work around lack of negative lookbehind in JS + // A pattern like: *.!(x).!(y|z) needs to ensure that a name + // like 'a.xyz.yz' doesn't match. So, the first negative + // lookahead, has to look ALL the way ahead, to the end of + // the pattern. + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n] + + var nlBefore = re.slice(0, nl.reStart) + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + var nlAfter = re.slice(nl.reEnd) + + nlLast += nlAfter + + // Handle nested stuff like *(*.js|!(*.json)), where open parens + // mean that we should *not* include the ) in the bit that is considered + // "after" the negated section. + var openParensBefore = nlBefore.split('(').length - 1 + var cleanAfter = nlAfter + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') + } + nlAfter = cleanAfter + + var dollar = '' + if (nlAfter === '' && isSub !== SUBPARSE) { + dollar = '$' + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast + re = newRe + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== '' && hasMagic) { + re = '(?=.)' + re + } + + if (addPatternStart) { + re = patternStart + re + } + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [re, hasMagic] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? 'i' : '' + var regExp = new RegExp('^' + re + '$', flags) + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) { + this.regexp = false + return this.regexp + } + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + var flags = options.nocase ? 'i' : '' + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === 'string') ? regExpEscape(p) + : p._src + }).join('\\\/') + }).join('|') + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = '^(?:' + re + ')$' + + // can match anything, as long as it's not this. + if (this.negate) re = '^(?!' + re + ').*$' + + try { + this.regexp = new RegExp(re, flags) + } catch (ex) { + this.regexp = false + } + return this.regexp +} + +minimatch.match = function (list, pattern, options) { + options = options || {} + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (mm.options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = match +function match (f, partial) { + this.debug('match', f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === '' + + if (f === '/' && partial) return true + + var options = this.options + + // windows: need to use /, not \ + if (path.sep !== '/') { + f = f.split(path.sep).join('/') + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, 'split', f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, 'set', set) + + // Find the basename of the path by looking for the last non-empty segment + var filename + var i + for (i = f.length - 1; i >= 0; i--) { + filename = f[i] + if (filename) break + } + + for (i = 0; i < set.length; i++) { + var pattern = set[i] + var file = f + if (options.matchBase && pattern.length === 1) { + file = [filename] + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug('matchOne', + { 'this': this, file: file, pattern: pattern }) + + this.debug('matchOne', file.length, pattern.length) + + for (var fi = 0, + pi = 0, + fl = file.length, + pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi++, pi++) { + this.debug('matchOne loop') + var p = pattern[pi] + var f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + var pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for (; fi < fl; fi++) { + if (file[fi] === '.' || file[fi] === '..' || + (!options.dot && file[fi].charAt(0) === '.')) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === '.' || swallowee === '..' || + (!options.dot && swallowee.charAt(0) === '.')) { + this.debug('dot detected!', file, fr, pattern, pr) + break + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr++ + } + } + + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug('\n>>> no match, partial?', file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === 'string') { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug('string match', p, f, hit) + } else { + hit = f.match(p) + this.debug('pattern match', p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') + return emptyFileEnd + } + + // should be unreachable. + throw new Error('wtf?') +} + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, '$1') +} + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') +} + +},{"brace-expansion":4,"path":undefined}],27:[function(require,module,exports){ +'use strict'; +/* eslint-disable no-unused-vars */ +var hasOwnProperty = Object.prototype.hasOwnProperty; +var propIsEnumerable = Object.prototype.propertyIsEnumerable; + +function toObject(val) { + if (val === null || val === undefined) { + throw new TypeError('Object.assign cannot be called with null or undefined'); + } + + return Object(val); +} + +function shouldUseNative() { + try { + if (!Object.assign) { + return false; + } + + // Detect buggy property enumeration order in older V8 versions. + + // https://bugs.chromium.org/p/v8/issues/detail?id=4118 + var test1 = new String('abc'); // eslint-disable-line + test1[5] = 'de'; + if (Object.getOwnPropertyNames(test1)[0] === '5') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test2 = {}; + for (var i = 0; i < 10; i++) { + test2['_' + String.fromCharCode(i)] = i; + } + var order2 = Object.getOwnPropertyNames(test2).map(function (n) { + return test2[n]; + }); + if (order2.join('') !== '0123456789') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test3 = {}; + 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { + test3[letter] = letter; + }); + if (Object.keys(Object.assign({}, test3)).join('') !== + 'abcdefghijklmnopqrst') { + return false; + } + + return true; + } catch (e) { + // We don't expect any of the above to throw, but better to be safe. + return false; + } +} + +module.exports = shouldUseNative() ? Object.assign : function (target, source) { + var from; + var to = toObject(target); + var symbols; + + for (var s = 1; s < arguments.length; s++) { + from = Object(arguments[s]); + + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + + if (Object.getOwnPropertySymbols) { + symbols = Object.getOwnPropertySymbols(from); + for (var i = 0; i < symbols.length; i++) { + if (propIsEnumerable.call(from, symbols[i])) { + to[symbols[i]] = from[symbols[i]]; + } + } + } + } + + return to; +}; + +},{}],28:[function(require,module,exports){ +var wrappy = require('wrappy') +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) + + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) + +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f +} + +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f +} + +},{"wrappy":75}],29:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _slicedToArray(arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } } + +var _postcss = require('postcss'); + +var _postcss2 = _interopRequireDefault(_postcss); + +var declWhitelist = ['composes'], + declFilter = new RegExp('^(' + declWhitelist.join('|') + ')$'), + matchImports = /^(.+?)\s+from\s+(?:"([^"]+)"|'([^']+)'|(global))$/, + icssImport = /^:import\((?:"([^"]+)"|'([^']+)')\)/; + +var processor = _postcss2['default'].plugin('modules-extract-imports', function (options) { + return function (css) { + var imports = {}, + importIndex = 0, + createImportedName = options && options.createImportedName || function (importName /*, path*/) { + return 'i__imported_' + importName.replace(/\W/g, '_') + '_' + importIndex++; + }; + + // Find any declaration that supports imports + css.walkDecls(declFilter, function (decl) { + var matches = decl.value.match(matchImports); + var tmpSymbols = undefined; + if (matches) { + var _matches = _slicedToArray(matches, 5); + + var symbols = _matches[1]; + var doubleQuotePath = _matches[2]; + var singleQuotePath = _matches[3]; + var _global = _matches[4]; + + if (_global) { + // Composing globals simply means changing these classes to wrap them in global(name) + tmpSymbols = symbols.split(/\s+/).map(function (s) { + return 'global(' + s + ')'; + }); + } else { + (function () { + var path = doubleQuotePath || singleQuotePath; + imports[path] = imports[path] || {}; + tmpSymbols = symbols.split(/\s+/).map(function (s) { + if (!imports[path][s]) { + imports[path][s] = createImportedName(s, path); + } + return imports[path][s]; + }); + })(); + } + decl.value = tmpSymbols.join(' '); + } + }); + + // If we've found any imports, insert or append :import rules + var existingImports = {}; + css.walkRules(function (rule) { + var matches = icssImport.exec(rule.selector); + if (matches) { + var _matches2 = _slicedToArray(matches, 3); + + var doubleQuotePath = _matches2[1]; + var singleQuotePath = _matches2[2]; + + existingImports[doubleQuotePath || singleQuotePath] = rule; + } + }); + + Object.keys(imports).reverse().forEach(function (path) { + + var rule = existingImports[path]; + if (!rule) { + rule = _postcss2['default'].rule({ + selector: ':import("' + path + '")', + raws: { after: '\n' } + }); + css.prepend(rule); + } + Object.keys(imports[path]).forEach(function (importedSymbol) { + rule.push(_postcss2['default'].decl({ + value: importedSymbol, + prop: imports[path][importedSymbol], + raws: { before: '\n ' }, + _autoprefixerDisabled: true + })); + }); + }); + }; +}); + +exports['default'] = processor; +module.exports = exports['default']; +/*match*/ /*match*/ +},{"postcss":45}],30:[function(require,module,exports){ +var postcss = require('postcss'); +var Tokenizer = require('css-selector-tokenizer'); + +function normalizeNodeArray(nodes) { + var array = []; + nodes.forEach(function(x) { + if(Array.isArray(x)) { + normalizeNodeArray(x).forEach(function(item) { + array.push(item); + }); + } else if(x) { + array.push(x); + } + }); + if(array.length > 0 && array[array.length - 1].type === 'spacing') { + array.pop(); + } + return array; +} + +function localizeNode(node, context) { + if(context.ignoreNextSpacing && node.type !== 'spacing') { + throw new Error('Missing whitespace after :' + context.ignoreNextSpacing); + } + if(context.enforceNoSpacing && node.type === 'spacing') { + throw new Error('Missing whitespace before :' + context.enforceNoSpacing); + } + + var newNodes; + switch(node.type) { + case 'selectors': + var resultingGlobal; + context.hasPureGlobals = false; + newNodes = node.nodes.map(function(n) { + var nContext = { + global: context.global, + lastWasSpacing: true, + hasLocals: false, + explicit: false + }; + n = localizeNode(n, nContext); + if(typeof resultingGlobal === 'undefined') { + resultingGlobal = nContext.global; + } else if(resultingGlobal !== nContext.global) { + throw new Error('Inconsistent rule global/local result in rule "' + + Tokenizer.stringify(node) + '" (multiple selectors must result in the same mode for the rule)'); + } + if(!nContext.hasLocals) { + context.hasPureGlobals = true; + } + return n; + }); + context.global = resultingGlobal; + node = Object.create(node); + node.nodes = normalizeNodeArray(newNodes); + break; + + case 'selector': + newNodes = node.nodes.map(function(n) { + return localizeNode(n, context); + }); + node = Object.create(node); + node.nodes = normalizeNodeArray(newNodes); + break; + + case 'spacing': + if(context.ignoreNextSpacing) { + context.ignoreNextSpacing = false; + context.lastWasSpacing = false; + context.enforceNoSpacing = false; + return null; + } + context.lastWasSpacing = true; + return node; + + case 'pseudo-class': + if(node.name === 'local' || node.name === 'global') { + if(context.inside) { + throw new Error('A :' + node.name + ' is not allowed inside of a :' + context.inside + '(...)'); + } + context.ignoreNextSpacing = context.lastWasSpacing ? node.name : false; + context.enforceNoSpacing = context.lastWasSpacing ? false : node.name; + context.global = (node.name === 'global'); + context.explicit = true; + return null; + } + break; + + case 'nested-pseudo-class': + var subContext; + if(node.name === 'local' || node.name === 'global') { + if(context.inside) { + throw new Error('A :' + node.name + '(...) is not allowed inside of a :' + context.inside + '(...)'); + } + subContext = { + global: (node.name === 'global'), + inside: node.name, + hasLocals: false, + explicit: true + }; + node = node.nodes.map(function(n) { + return localizeNode(n, subContext); + }); + // don't leak spacing + node[0].before = undefined; + node[node.length - 1].after = undefined; + } else { + subContext = { + global: context.global, + inside: context.inside, + lastWasSpacing: true, + hasLocals: false, + explicit: context.explicit + }; + newNodes = node.nodes.map(function(n) { + return localizeNode(n, subContext); + }); + node = Object.create(node); + node.nodes = normalizeNodeArray(newNodes); + } + if(subContext.hasLocals) { + context.hasLocals = true; + } + break; + + case 'id': + case 'class': + if(!context.global) { + node = { + type: 'nested-pseudo-class', + name: 'local', + nodes: [node] + }; + context.hasLocals = true; + } + break; + } + + // reset context + context.lastWasSpacing = false; + context.ignoreNextSpacing = false; + context.enforceNoSpacing = false; + return node; +} + +function localizeDeclNode(node, context) { + var newNode; + switch(node.type) { + case 'item': + if(context.localizeNextItem) { + newNode = Object.create(node); + newNode.name = ':local(' + newNode.name + ')'; + context.localizeNextItem = false; + return newNode; + } + break; + + case 'nested-item': + var newNodes = node.nodes.map(function(n) { + return localizeDeclValue(n, context); + }); + node = Object.create(node); + node.nodes = newNodes; + break; + + case 'url': + if(context.options && context.options.rewriteUrl) { + newNode = Object.create(node); + newNode.url = context.options.rewriteUrl(context.global, node.url); + return newNode; + } + break; + } + return node; +} + +function localizeDeclValue(valueNode, context) { + var newValueNode = Object.create(valueNode); + newValueNode.nodes = valueNode.nodes.map(function(node) { + return localizeDeclNode(node, context); + }); + return newValueNode; +} + +function localizeAnimationShorthandDeclValueNodes(nodes, context) { + var validIdent = validIdent = /^-?[_a-z][_a-z0-9-]*$/i; + + /* + The spec defines some keywords that you can use to describe properties such as the timing + function. These are still valid animation names, so as long as there is a property that accepts + a keyword, it is given priority. Only when all the properties that can take a keyword are + exhausted can the animation name be set to the keyword. I.e. + + animation: infinite infinite; + + The animation will repeat an infinite number of times from the first argument, and will have an + animation name of infinite from the second. + */ + var animationKeywords = { + '$alternate': 1, + '$alternate-reverse': 1, + '$backwards': 1, + '$both': 1, + '$ease': 1, + '$ease-in': 1, + '$ease-in-out': 1, + '$ease-out': 1, + '$forwards': 1, + '$infinite': 1, + '$linear': 1, + '$none': Infinity, // No matter how many times you write none, it will never be an animation name + '$normal': 1, + '$paused': 1, + '$reverse': 1, + '$running': 1, + '$step-end': 1, + '$step-start': 1, + '$initial': Infinity, + '$inherit': Infinity, + '$unset': Infinity, + }; + + var didParseAnimationName = false; + var parsedAnimationKeywords = {}; + return nodes.map(function(valueNode) { + var value = valueNode.type === 'item' + ? valueNode.name.toLowerCase() + : null; + + var shouldParseAnimationName = false; + + if (!didParseAnimationName && value && validIdent.test(value)) { + if ('$' + value in animationKeywords) { + parsedAnimationKeywords['$' + value] = ('$' + value in parsedAnimationKeywords) + ? (parsedAnimationKeywords['$' + value] + 1) + : 0; + + shouldParseAnimationName = (parsedAnimationKeywords['$' + value] >= animationKeywords['$' + value]); + } else { + shouldParseAnimationName = true; + } + } + + var subContext = { + options: context.options, + global: context.global, + localizeNextItem: shouldParseAnimationName && !context.global + }; + return localizeDeclNode(valueNode, subContext); + }); +} + +function localizeAnimationShorthandDeclValues(valuesNode, decl, context) { + var newValuesNode = Object.create(valuesNode); + newValuesNode.nodes = valuesNode.nodes.map(function(valueNode, index) { + var newValueNode = Object.create(valueNode); + newValueNode.nodes = localizeAnimationShorthandDeclValueNodes(valueNode.nodes, context); + return newValueNode; + }); + decl.value = Tokenizer.stringifyValues(newValuesNode); +} + +function localizeDeclValues(localize, valuesNode, decl, context) { + var newValuesNode = Object.create(valuesNode); + newValuesNode.nodes = valuesNode.nodes.map(function(valueNode) { + var subContext = { + options: context.options, + global: context.global, + localizeNextItem: localize && !context.global + }; + return localizeDeclValue(valueNode, subContext); + }); + decl.value = Tokenizer.stringifyValues(newValuesNode); +} + +function localizeDecl(decl, context) { + var valuesNode = Tokenizer.parseValues(decl.value); + + var isAnimation = /animation?$/.test(decl.prop); + if (isAnimation) return localizeAnimationShorthandDeclValues(valuesNode, decl, context); + + var isAnimationName = /animation(-name)?$/.test(decl.prop); + if (isAnimationName) return localizeDeclValues(true, valuesNode, decl, context); + + return localizeDeclValues(false, valuesNode, decl, context); +} + +module.exports = postcss.plugin('postcss-modules-local-by-default', function (options) { + if (typeof options !== 'object') { + options = {}; // If options is undefined or not an object the plugin fails + } + if(options && options.mode) { + if(options.mode !== 'global' && options.mode !== 'local' && options.mode !== 'pure') { + throw new Error('options.mode must be either "global", "local" or "pure" (default "local")'); + } + } + var pureMode = options && options.mode === 'pure'; + var globalMode = options && options.mode === 'global'; + return function(css) { + css.walkAtRules(function(atrule) { + if(/keyframes$/.test(atrule.name)) { + var globalMatch = /^\s*:global\s*\((.+)\)\s*$/.exec(atrule.params); + var localMatch = /^\s*:local\s*\((.+)\)\s*$/.exec(atrule.params); + var globalKeyframes = globalMode; + if(globalMatch) { + if(pureMode) { + throw atrule.error('@keyframes :global(...) is not allowed in pure mode'); + } + atrule.params = globalMatch[1]; + globalKeyframes = true; + } else if(localMatch) { + atrule.params = localMatch[0]; + globalKeyframes = false; + } else if(!globalMode) { + atrule.params = ':local(' + atrule.params + ')'; + } + atrule.walkDecls(function(decl) { + localizeDecl(decl, { + options: options, + global: globalKeyframes + }); + }); + } else if(atrule.nodes) { + atrule.nodes.forEach(function(decl) { + if(decl.type === 'decl') { + localizeDecl(decl, { + options: options, + global: globalMode + }); + } + }); + } + }); + css.walkRules(function(rule) { + if(rule.parent.type === 'atrule' && /keyframes$/.test(rule.parent.name)) { + // ignore keyframe rules + return; + } + var selector = Tokenizer.parse(rule.selector); + var context = { + options: options, + global: globalMode, + hasPureGlobals: false + }; + var newSelector; + try { + newSelector = localizeNode(selector, context); + } catch(e) { + throw rule.error(e.message); + } + if(pureMode && context.hasPureGlobals) { + throw rule.error('Selector "' + Tokenizer.stringify(selector) + '" is not pure ' + + '(pure selectors must contain at least one local class or id)'); + } + // Less-syntax mixins parse as rules with no nodes + if (rule.nodes) { + rule.nodes.forEach(function(decl) { + localizeDecl(decl, context); + }); + } + rule.selector = Tokenizer.stringify(newSelector); + }); + }; +}); + +},{"css-selector-tokenizer":8,"postcss":45}],31:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _postcss = require('postcss'); + +var _postcss2 = _interopRequireDefault(_postcss); + +var _cssSelectorTokenizer = require('css-selector-tokenizer'); + +var _cssSelectorTokenizer2 = _interopRequireDefault(_cssSelectorTokenizer); + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +function getSingleLocalNamesForComposes(selectors) { + return selectors.nodes.map(function (node) { + if (node.type !== 'selector' || node.nodes.length !== 1) { + throw new Error('composition is only allowed when selector is single :local class name not in "' + _cssSelectorTokenizer2['default'].stringify(selectors) + '"'); + } + node = node.nodes[0]; + if (node.type !== 'nested-pseudo-class' || node.name !== 'local' || node.nodes.length !== 1) { + throw new Error('composition is only allowed when selector is single :local class name not in "' + _cssSelectorTokenizer2['default'].stringify(selectors) + '", "' + _cssSelectorTokenizer2['default'].stringify(node) + '" is weird'); + } + node = node.nodes[0]; + if (node.type !== 'selector' || node.nodes.length !== 1) { + throw new Error('composition is only allowed when selector is single :local class name not in "' + _cssSelectorTokenizer2['default'].stringify(selectors) + '", "' + _cssSelectorTokenizer2['default'].stringify(node) + '" is weird'); + } + node = node.nodes[0]; + if (node.type !== 'class') { + // 'id' is not possible, because you can't compose ids + throw new Error('composition is only allowed when selector is single :local class name not in "' + _cssSelectorTokenizer2['default'].stringify(selectors) + '", "' + _cssSelectorTokenizer2['default'].stringify(node) + '" is weird'); + } + return node.name; + }); +} + +var processor = _postcss2['default'].plugin('postcss-modules-scope', function (options) { + return function (css) { + var generateScopedName = options && options.generateScopedName || processor.generateScopedName; + + var exports = {}; + + function exportScopedName(name) { + var scopedName = generateScopedName(name, css.source.input.from, css.source.input.css); + exports[name] = exports[name] || []; + if (exports[name].indexOf(scopedName) < 0) { + exports[name].push(scopedName); + } + return scopedName; + } + + function localizeNode(node) { + var newNode = Object.create(node); + switch (node.type) { + case 'selector': + newNode.nodes = node.nodes.map(localizeNode); + return newNode; + case 'class': + case 'id': + var scopedName = exportScopedName(node.name); + newNode.name = scopedName; + return newNode; + } + throw new Error(node.type + ' ("' + _cssSelectorTokenizer2['default'].stringify(node) + '") is not allowed in a :local block'); + } + + function traverseNode(node) { + switch (node.type) { + case 'nested-pseudo-class': + if (node.name === 'local') { + if (node.nodes.length !== 1) { + throw new Error('Unexpected comma (",") in :local block'); + } + return localizeNode(node.nodes[0]); + } + /* falls through */ + case 'selectors': + case 'selector': + var newNode = Object.create(node); + newNode.nodes = node.nodes.map(traverseNode); + return newNode; + } + return node; + } + + // Find any :import and remember imported names + var importedNames = {}; + css.walkRules(function (rule) { + if (/^:import\(.+\)$/.test(rule.selector)) { + rule.walkDecls(function (decl) { + importedNames[decl.prop] = true; + }); + } + }); + + // Find any :local classes + css.walkRules(function (rule) { + var selector = _cssSelectorTokenizer2['default'].parse(rule.selector); + var newSelector = traverseNode(selector); + rule.selector = _cssSelectorTokenizer2['default'].stringify(newSelector); + rule.walkDecls(/composes|compose-with/, function (decl) { + var localNames = getSingleLocalNamesForComposes(selector); + var classes = decl.value.split(/\s+/); + classes.forEach(function (className) { + var global = /^global\(([^\)]+)\)$/.exec(className); + if (global) { + localNames.forEach(function (exportedName) { + exports[exportedName].push(global[1]); + }); + } else if (hasOwnProperty.call(importedNames, className)) { + localNames.forEach(function (exportedName) { + exports[exportedName].push(className); + }); + } else if (hasOwnProperty.call(exports, className)) { + localNames.forEach(function (exportedName) { + exports[className].forEach(function (item) { + exports[exportedName].push(item); + }); + }); + } else { + throw decl.error('referenced class name "' + className + '" in ' + decl.prop + ' not found'); + } + }); + decl.remove(); + }); + + rule.walkDecls(function (decl) { + var tokens = decl.value.split(/(,|'[^']*'|"[^"]*")/); + tokens = tokens.map(function (token, idx) { + if (idx === 0 || tokens[idx - 1] === ',') { + var localMatch = /^(\s*):local\s*\((.+?)\)/.exec(token); + if (localMatch) { + return localMatch[1] + exportScopedName(localMatch[2]) + token.substr(localMatch[0].length); + } else { + return token; + } + } else { + return token; + } + }); + decl.value = tokens.join(''); + }); + }); + + // Find any :local keyframes + css.walkAtRules(function (atrule) { + if (/keyframes$/.test(atrule.name)) { + var localMatch = /^\s*:local\s*\((.+?)\)\s*$/.exec(atrule.params); + if (localMatch) { + atrule.params = exportScopedName(localMatch[1]); + } + } + }); + + // If we found any :locals, insert an :export rule + var exportedNames = Object.keys(exports); + if (exportedNames.length > 0) { + (function () { + var exportRule = _postcss2['default'].rule({ selector: ':export' }); + exportedNames.forEach(function (exportedName) { + return exportRule.append({ + prop: exportedName, + value: exports[exportedName].join(' '), + raws: { before: '\n ' } + }); + }); + css.append(exportRule); + })(); + } + }; +}); + +processor.generateScopedName = function (exportedName, path) { + var sanitisedPath = path.replace(/\.[^\.\/\\]+$/, '').replace(/[\W_]+/g, '_').replace(/^_|_$/g, ''); + return '_' + sanitisedPath + '__' + exportedName; +}; + +exports['default'] = processor; +module.exports = exports['default']; +},{"css-selector-tokenizer":8,"postcss":45}],32:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _postcss = require('postcss'); + +var _postcss2 = _interopRequireDefault(_postcss); + +var _icssReplaceSymbols = require('icss-replace-symbols'); + +var _icssReplaceSymbols2 = _interopRequireDefault(_icssReplaceSymbols); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var matchImports = /^(.+?|\([\s\S]+?\))\s+from\s+("[^"]*"|'[^']*'|[\w-]+)$/; +var matchValueDefinition = /(?:\s+|^)([\w-]+):?\s+(.+?)\s*$/g; +var matchImport = /^([\w-]+)(?:\s+as\s+([\w-]+))?/; +var options = {}; +var importIndex = 0; +var createImportedName = options && options.createImportedName || function (importName /*, path*/) { + return 'i__const_' + importName.replace(/\W/g, '_') + '_' + importIndex++; +}; + +exports.default = function (css, result) { + var importAliases = []; + var definitions = {}; + + var addDefinition = function addDefinition(atRule) { + var matches = void 0; + while (matches = matchValueDefinition.exec(atRule.params)) { + var _matches = matches; + + var _matches2 = _slicedToArray(_matches, 3); + + var /*match*/key = _matches2[1]; + var value = _matches2[2]; + // Add to the definitions, knowing that values can refer to each other + + definitions[key] = (0, _icssReplaceSymbols.replaceAll)(definitions, value); + atRule.remove(); + } + }; + + var addImport = function addImport(atRule) { + var matches = matchImports.exec(atRule.params); + if (matches) { + var _matches3 = _slicedToArray(matches, 3); + + var /*match*/aliases = _matches3[1]; + var path = _matches3[2]; + // We can use constants for path names + + if (definitions[path]) path = definitions[path]; + var imports = aliases.replace(/^\(\s*([\s\S]+)\s*\)$/, '$1').split(/\s*,\s*/).map(function (alias) { + var tokens = matchImport.exec(alias); + if (tokens) { + var _tokens = _slicedToArray(tokens, 3); + + var /*match*/theirName = _tokens[1]; + var _tokens$ = _tokens[2]; + var myName = _tokens$ === undefined ? theirName : _tokens$; + + var importedName = createImportedName(myName); + definitions[myName] = importedName; + return { theirName: theirName, importedName: importedName }; + } else { + throw new Error('@import statement "' + alias + '" is invalid!'); + } + }); + importAliases.push({ path: path, imports: imports }); + atRule.remove(); + } + }; + + /* Look at all the @value statements and treat them as locals or as imports */ + css.walkAtRules('value', function (atRule) { + if (matchImports.exec(atRule.params)) { + addImport(atRule); + } else { + if (atRule.params.indexOf('@value') !== -1) { + result.warn('Invalid value definition: ' + atRule.params); + } + + addDefinition(atRule); + } + }); + + /* We want to export anything defined by now, but don't add it to the CSS yet or + it well get picked up by the replacement stuff */ + var exportDeclarations = Object.keys(definitions).map(function (key) { + return _postcss2.default.decl({ + value: definitions[key], + prop: key, + raws: { before: "\n " } + }); + }); + + /* If we have no definitions, don't continue */ + if (!Object.keys(definitions).length) return; + + /* Perform replacements */ + (0, _icssReplaceSymbols2.default)(css, definitions); + + /* Add export rules if any */ + if (exportDeclarations.length > 0) { + var exportRule = _postcss2.default.rule({ + selector: ':export', + raws: { after: "\n" } + }); + exportRule.append(exportDeclarations); + css.prepend(exportRule); + } + + /* Add import rules */ + importAliases.reverse().forEach(function (_ref) { + var path = _ref.path; + var imports = _ref.imports; + + var importRule = _postcss2.default.rule({ + selector: ':import(' + path + ')', + raws: { after: "\n" } + }); + imports.forEach(function (_ref2) { + var theirName = _ref2.theirName; + var importedName = _ref2.importedName; + + importRule.append({ + value: theirName, + prop: importedName, + raws: { before: "\n " } + }); + }); + + css.prepend(importRule); + }); +}; + +module.exports = exports['default']; +},{"icss-replace-symbols":20,"postcss":45}],33:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _container = require('./container'); + +var _container2 = _interopRequireDefault(_container); + +var _warnOnce = require('./warn-once'); + +var _warnOnce2 = _interopRequireDefault(_warnOnce); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +/** + * Represents an at-rule. + * + * If it’s followed in the CSS by a {} block, this node will have + * a nodes property representing its children. + * + * @extends Container + * + * @example + * const root = postcss.parse('@charset "UTF-8"; @media print {}'); + * + * const charset = root.first; + * charset.type //=> 'atrule' + * charset.nodes //=> undefined + * + * const media = root.last; + * media.nodes //=> [] + */ +var AtRule = function (_Container) { + _inherits(AtRule, _Container); + + function AtRule(defaults) { + _classCallCheck(this, AtRule); + + var _this = _possibleConstructorReturn(this, _Container.call(this, defaults)); + + _this.type = 'atrule'; + return _this; + } + + AtRule.prototype.append = function append() { + var _Container$prototype$; + + if (!this.nodes) this.nodes = []; + + for (var _len = arguments.length, children = Array(_len), _key = 0; _key < _len; _key++) { + children[_key] = arguments[_key]; + } + + return (_Container$prototype$ = _Container.prototype.append).call.apply(_Container$prototype$, [this].concat(children)); + }; + + AtRule.prototype.prepend = function prepend() { + var _Container$prototype$2; + + if (!this.nodes) this.nodes = []; + + for (var _len2 = arguments.length, children = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + children[_key2] = arguments[_key2]; + } + + return (_Container$prototype$2 = _Container.prototype.prepend).call.apply(_Container$prototype$2, [this].concat(children)); + }; + + _createClass(AtRule, [{ + key: 'afterName', + get: function get() { + (0, _warnOnce2.default)('AtRule#afterName was deprecated. Use AtRule#raws.afterName'); + return this.raws.afterName; + }, + set: function set(val) { + (0, _warnOnce2.default)('AtRule#afterName was deprecated. Use AtRule#raws.afterName'); + this.raws.afterName = val; + } + }, { + key: '_params', + get: function get() { + (0, _warnOnce2.default)('AtRule#_params was deprecated. Use AtRule#raws.params'); + return this.raws.params; + }, + set: function set(val) { + (0, _warnOnce2.default)('AtRule#_params was deprecated. Use AtRule#raws.params'); + this.raws.params = val; + } + + /** + * @memberof AtRule# + * @member {string} name - the at-rule’s name immediately follows the `@` + * + * @example + * const root = postcss.parse('@media print {}'); + * media.name //=> 'media' + * const media = root.first; + */ + + /** + * @memberof AtRule# + * @member {string} params - the at-rule’s parameters, the values + * that follow the at-rule’s name but precede + * any {} block + * + * @example + * const root = postcss.parse('@media print, screen {}'); + * const media = root.first; + * media.params //=> 'print, screen' + */ + + /** + * @memberof AtRule# + * @member {object} raws - Information to generate byte-to-byte equal + * node string as it was in the origin input. + * + * Every parser saves its own properties, + * but the default CSS parser uses: + * + * * `before`: the space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + * * `after`: the space symbols after the last child of the node + * to the end of the node. + * * `between`: the symbols between the property and value + * for declarations, selector and `{` for rules, or last parameter + * and `{` for at-rules. + * * `semicolon`: contains true if the last child has + * an (optional) semicolon. + * * `afterName`: the space between the at-rule name and its parameters. + * + * PostCSS cleans at-rule parameters from comments and extra spaces, + * but it stores origin content in raws properties. + * As such, if you don’t change a declaration’s value, + * PostCSS will use the raw value with comments. + * + * @example + * const root = postcss.parse(' @media\nprint {\n}') + * root.first.first.raws //=> { before: ' ', + * // between: ' ', + * // afterName: '\n', + * // after: '\n' } + */ + + }]); + + return AtRule; +}(_container2.default); + +exports.default = AtRule; +module.exports = exports['default']; + + +},{"./container":35,"./warn-once":55}],34:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _warnOnce = require('./warn-once'); + +var _warnOnce2 = _interopRequireDefault(_warnOnce); + +var _node = require('./node'); + +var _node2 = _interopRequireDefault(_node); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +/** + * Represents a comment between declarations or statements (rule and at-rules). + * + * Comments inside selectors, at-rule parameters, or declaration values + * will be stored in the `raws` properties explained above. + * + * @extends Node + */ +var Comment = function (_Node) { + _inherits(Comment, _Node); + + function Comment(defaults) { + _classCallCheck(this, Comment); + + var _this = _possibleConstructorReturn(this, _Node.call(this, defaults)); + + _this.type = 'comment'; + return _this; + } + + _createClass(Comment, [{ + key: 'left', + get: function get() { + (0, _warnOnce2.default)('Comment#left was deprecated. Use Comment#raws.left'); + return this.raws.left; + }, + set: function set(val) { + (0, _warnOnce2.default)('Comment#left was deprecated. Use Comment#raws.left'); + this.raws.left = val; + } + }, { + key: 'right', + get: function get() { + (0, _warnOnce2.default)('Comment#right was deprecated. Use Comment#raws.right'); + return this.raws.right; + }, + set: function set(val) { + (0, _warnOnce2.default)('Comment#right was deprecated. Use Comment#raws.right'); + this.raws.right = val; + } + + /** + * @memberof Comment# + * @member {string} text - the comment’s text + */ + + /** + * @memberof Comment# + * @member {object} raws - Information to generate byte-to-byte equal + * node string as it was in the origin input. + * + * Every parser saves its own properties, + * but the default CSS parser uses: + * + * * `before`: the space symbols before the node. + * * `left`: the space symbols between `/*` and the comment’s text. + * * `right`: the space symbols between the comment’s text. + */ + + }]); + + return Comment; +}(_node2.default); + +exports.default = Comment; +module.exports = exports['default']; + + +},{"./node":42,"./warn-once":55}],35:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _declaration = require('./declaration'); + +var _declaration2 = _interopRequireDefault(_declaration); + +var _warnOnce = require('./warn-once'); + +var _warnOnce2 = _interopRequireDefault(_warnOnce); + +var _comment = require('./comment'); + +var _comment2 = _interopRequireDefault(_comment); + +var _node = require('./node'); + +var _node2 = _interopRequireDefault(_node); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +function cleanSource(nodes) { + return nodes.map(function (i) { + if (i.nodes) i.nodes = cleanSource(i.nodes); + delete i.source; + return i; + }); +} + +/** + * @callback childCondition + * @param {Node} node - container child + * @param {number} index - child index + * @param {Node[]} nodes - all container children + * @return {boolean} + */ + +/** + * @callback childIterator + * @param {Node} node - container child + * @param {number} index - child index + * @return {false|undefined} returning `false` will break iteration + */ + +/** + * The {@link Root}, {@link AtRule}, and {@link Rule} container nodes + * inherit some common methods to help work with their children. + * + * Note that all containers can store any content. If you write a rule inside + * a rule, PostCSS will parse it. + * + * @extends Node + * @abstract + * @ignore + */ + +var Container = function (_Node) { + _inherits(Container, _Node); + + function Container() { + _classCallCheck(this, Container); + + return _possibleConstructorReturn(this, _Node.apply(this, arguments)); + } + + Container.prototype.push = function push(child) { + child.parent = this; + this.nodes.push(child); + return this; + }; + + /** + * Iterates through the container’s immediate children, + * calling `callback` for each child. + * + * Returning `false` in the callback will break iteration. + * + * This method only iterates through the container’s immediate children. + * If you need to recursively iterate through all the container’s descendant + * nodes, use {@link Container#walk}. + * + * Unlike the for `{}`-cycle or `Array#forEach` this iterator is safe + * if you are mutating the array of child nodes during iteration. + * PostCSS will adjust the current index to match the mutations. + * + * @param {childIterator} callback - iterator receives each node and index + * + * @return {false|undefined} returns `false` if iteration was broke + * + * @example + * const root = postcss.parse('a { color: black; z-index: 1 }'); + * const rule = root.first; + * + * for ( let decl of rule.nodes ) { + * decl.cloneBefore({ prop: '-webkit-' + decl.prop }); + * // Cycle will be infinite, because cloneBefore moves the current node + * // to the next index + * } + * + * rule.each(decl => { + * decl.cloneBefore({ prop: '-webkit-' + decl.prop }); + * // Will be executed only for color and z-index + * }); + */ + + + Container.prototype.each = function each(callback) { + if (!this.lastEach) this.lastEach = 0; + if (!this.indexes) this.indexes = {}; + + this.lastEach += 1; + var id = this.lastEach; + this.indexes[id] = 0; + + if (!this.nodes) return undefined; + + var index = void 0, + result = void 0; + while (this.indexes[id] < this.nodes.length) { + index = this.indexes[id]; + result = callback(this.nodes[index], index); + if (result === false) break; + + this.indexes[id] += 1; + } + + delete this.indexes[id]; + + return result; + }; + + /** + * Traverses the container’s descendant nodes, calling callback + * for each node. + * + * Like container.each(), this method is safe to use + * if you are mutating arrays during iteration. + * + * If you only need to iterate through the container’s immediate children, + * use {@link Container#each}. + * + * @param {childIterator} callback - iterator receives each node and index + * + * @return {false|undefined} returns `false` if iteration was broke + * + * @example + * root.walk(node => { + * // Traverses all descendant nodes. + * }); + */ + + + Container.prototype.walk = function walk(callback) { + return this.each(function (child, i) { + var result = callback(child, i); + if (result !== false && child.walk) { + result = child.walk(callback); + } + return result; + }); + }; + + /** + * Traverses the container’s descendant nodes, calling callback + * for each declaration node. + * + * If you pass a filter, iteration will only happen over declarations + * with matching properties. + * + * Like {@link Container#each}, this method is safe + * to use if you are mutating arrays during iteration. + * + * @param {string|RegExp} [prop] - string or regular expression + * to filter declarations by property name + * @param {childIterator} callback - iterator receives each node and index + * + * @return {false|undefined} returns `false` if iteration was broke + * + * @example + * root.walkDecls(decl => { + * checkPropertySupport(decl.prop); + * }); + * + * root.walkDecls('border-radius', decl => { + * decl.remove(); + * }); + * + * root.walkDecls(/^background/, decl => { + * decl.value = takeFirstColorFromGradient(decl.value); + * }); + */ + + + Container.prototype.walkDecls = function walkDecls(prop, callback) { + if (!callback) { + callback = prop; + return this.walk(function (child, i) { + if (child.type === 'decl') { + return callback(child, i); + } + }); + } else if (prop instanceof RegExp) { + return this.walk(function (child, i) { + if (child.type === 'decl' && prop.test(child.prop)) { + return callback(child, i); + } + }); + } else { + return this.walk(function (child, i) { + if (child.type === 'decl' && child.prop === prop) { + return callback(child, i); + } + }); + } + }; + + /** + * Traverses the container’s descendant nodes, calling callback + * for each rule node. + * + * If you pass a filter, iteration will only happen over rules + * with matching selectors. + * + * Like {@link Container#each}, this method is safe + * to use if you are mutating arrays during iteration. + * + * @param {string|RegExp} [selector] - string or regular expression + * to filter rules by selector + * @param {childIterator} callback - iterator receives each node and index + * + * @return {false|undefined} returns `false` if iteration was broke + * + * @example + * const selectors = []; + * root.walkRules(rule => { + * selectors.push(rule.selector); + * }); + * console.log(`Your CSS uses ${selectors.length} selectors'); + */ + + + Container.prototype.walkRules = function walkRules(selector, callback) { + if (!callback) { + callback = selector; + + return this.walk(function (child, i) { + if (child.type === 'rule') { + return callback(child, i); + } + }); + } else if (selector instanceof RegExp) { + return this.walk(function (child, i) { + if (child.type === 'rule' && selector.test(child.selector)) { + return callback(child, i); + } + }); + } else { + return this.walk(function (child, i) { + if (child.type === 'rule' && child.selector === selector) { + return callback(child, i); + } + }); + } + }; + + /** + * Traverses the container’s descendant nodes, calling callback + * for each at-rule node. + * + * If you pass a filter, iteration will only happen over at-rules + * that have matching names. + * + * Like {@link Container#each}, this method is safe + * to use if you are mutating arrays during iteration. + * + * @param {string|RegExp} [name] - string or regular expression + * to filter at-rules by name + * @param {childIterator} callback - iterator receives each node and index + * + * @return {false|undefined} returns `false` if iteration was broke + * + * @example + * root.walkAtRules(rule => { + * if ( isOld(rule.name) ) rule.remove(); + * }); + * + * let first = false; + * root.walkAtRules('charset', rule => { + * if ( !first ) { + * first = true; + * } else { + * rule.remove(); + * } + * }); + */ + + + Container.prototype.walkAtRules = function walkAtRules(name, callback) { + if (!callback) { + callback = name; + return this.walk(function (child, i) { + if (child.type === 'atrule') { + return callback(child, i); + } + }); + } else if (name instanceof RegExp) { + return this.walk(function (child, i) { + if (child.type === 'atrule' && name.test(child.name)) { + return callback(child, i); + } + }); + } else { + return this.walk(function (child, i) { + if (child.type === 'atrule' && child.name === name) { + return callback(child, i); + } + }); + } + }; + + /** + * Traverses the container’s descendant nodes, calling callback + * for each comment node. + * + * Like {@link Container#each}, this method is safe + * to use if you are mutating arrays during iteration. + * + * @param {childIterator} callback - iterator receives each node and index + * + * @return {false|undefined} returns `false` if iteration was broke + * + * @example + * root.walkComments(comment => { + * comment.remove(); + * }); + */ + + + Container.prototype.walkComments = function walkComments(callback) { + return this.walk(function (child, i) { + if (child.type === 'comment') { + return callback(child, i); + } + }); + }; + + /** + * Inserts new nodes to the start of the container. + * + * @param {...(Node|object|string|Node[])} children - new nodes + * + * @return {Node} this node for methods chain + * + * @example + * const decl1 = postcss.decl({ prop: 'color', value: 'black' }); + * const decl2 = postcss.decl({ prop: 'background-color', value: 'white' }); + * rule.append(decl1, decl2); + * + * root.append({ name: 'charset', params: '"UTF-8"' }); // at-rule + * root.append({ selector: 'a' }); // rule + * rule.append({ prop: 'color', value: 'black' }); // declaration + * rule.append({ text: 'Comment' }) // comment + * + * root.append('a {}'); + * root.first.append('color: black; z-index: 1'); + */ + + + Container.prototype.append = function append() { + for (var _len = arguments.length, children = Array(_len), _key = 0; _key < _len; _key++) { + children[_key] = arguments[_key]; + } + + for (var _iterator = children, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var child = _ref; + + var nodes = this.normalize(child, this.last); + for (var _iterator2 = nodes, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var node = _ref2; + this.nodes.push(node); + } + } + return this; + }; + + /** + * Inserts new nodes to the end of the container. + * + * @param {...(Node|object|string|Node[])} children - new nodes + * + * @return {Node} this node for methods chain + * + * @example + * const decl1 = postcss.decl({ prop: 'color', value: 'black' }); + * const decl2 = postcss.decl({ prop: 'background-color', value: 'white' }); + * rule.prepend(decl1, decl2); + * + * root.append({ name: 'charset', params: '"UTF-8"' }); // at-rule + * root.append({ selector: 'a' }); // rule + * rule.append({ prop: 'color', value: 'black' }); // declaration + * rule.append({ text: 'Comment' }) // comment + * + * root.append('a {}'); + * root.first.append('color: black; z-index: 1'); + */ + + + Container.prototype.prepend = function prepend() { + for (var _len2 = arguments.length, children = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + children[_key2] = arguments[_key2]; + } + + children = children.reverse(); + for (var _iterator3 = children, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref3; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref3 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) break; + _ref3 = _i3.value; + } + + var child = _ref3; + + var nodes = this.normalize(child, this.first, 'prepend').reverse(); + for (var _iterator4 = nodes, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { + var _ref4; + + if (_isArray4) { + if (_i4 >= _iterator4.length) break; + _ref4 = _iterator4[_i4++]; + } else { + _i4 = _iterator4.next(); + if (_i4.done) break; + _ref4 = _i4.value; + } + + var node = _ref4; + this.nodes.unshift(node); + }for (var id in this.indexes) { + this.indexes[id] = this.indexes[id] + nodes.length; + } + } + return this; + }; + + Container.prototype.cleanRaws = function cleanRaws(keepBetween) { + _Node.prototype.cleanRaws.call(this, keepBetween); + if (this.nodes) { + for (var _iterator5 = this.nodes, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref5; + + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref5 = _iterator5[_i5++]; + } else { + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref5 = _i5.value; + } + + var node = _ref5; + node.cleanRaws(keepBetween); + } + } + }; + + /** + * Insert new node before old node within the container. + * + * @param {Node|number} exist - child or child’s index. + * @param {Node|object|string|Node[]} add - new node + * + * @return {Node} this node for methods chain + * + * @example + * rule.insertBefore(decl, decl.clone({ prop: '-webkit-' + decl.prop })); + */ + + + Container.prototype.insertBefore = function insertBefore(exist, add) { + exist = this.index(exist); + + var type = exist === 0 ? 'prepend' : false; + var nodes = this.normalize(add, this.nodes[exist], type).reverse(); + for (var _iterator6 = nodes, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref6; + + if (_isArray6) { + if (_i6 >= _iterator6.length) break; + _ref6 = _iterator6[_i6++]; + } else { + _i6 = _iterator6.next(); + if (_i6.done) break; + _ref6 = _i6.value; + } + + var node = _ref6; + this.nodes.splice(exist, 0, node); + }var index = void 0; + for (var id in this.indexes) { + index = this.indexes[id]; + if (exist <= index) { + this.indexes[id] = index + nodes.length; + } + } + + return this; + }; + + /** + * Insert new node after old node within the container. + * + * @param {Node|number} exist - child or child’s index + * @param {Node|object|string|Node[]} add - new node + * + * @return {Node} this node for methods chain + */ + + + Container.prototype.insertAfter = function insertAfter(exist, add) { + exist = this.index(exist); + + var nodes = this.normalize(add, this.nodes[exist]).reverse(); + for (var _iterator7 = nodes, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { + var _ref7; + + if (_isArray7) { + if (_i7 >= _iterator7.length) break; + _ref7 = _iterator7[_i7++]; + } else { + _i7 = _iterator7.next(); + if (_i7.done) break; + _ref7 = _i7.value; + } + + var node = _ref7; + this.nodes.splice(exist + 1, 0, node); + }var index = void 0; + for (var id in this.indexes) { + index = this.indexes[id]; + if (exist < index) { + this.indexes[id] = index + nodes.length; + } + } + + return this; + }; + + Container.prototype.remove = function remove(child) { + if (typeof child !== 'undefined') { + (0, _warnOnce2.default)('Container#remove is deprecated. ' + 'Use Container#removeChild'); + this.removeChild(child); + } else { + _Node.prototype.remove.call(this); + } + return this; + }; + + /** + * Removes node from the container and cleans the parent properties + * from the node and its children. + * + * @param {Node|number} child - child or child’s index + * + * @return {Node} this node for methods chain + * + * @example + * rule.nodes.length //=> 5 + * rule.removeChild(decl); + * rule.nodes.length //=> 4 + * decl.parent //=> undefined + */ + + + Container.prototype.removeChild = function removeChild(child) { + child = this.index(child); + this.nodes[child].parent = undefined; + this.nodes.splice(child, 1); + + var index = void 0; + for (var id in this.indexes) { + index = this.indexes[id]; + if (index >= child) { + this.indexes[id] = index - 1; + } + } + + return this; + }; + + /** + * Removes all children from the container + * and cleans their parent properties. + * + * @return {Node} this node for methods chain + * + * @example + * rule.removeAll(); + * rule.nodes.length //=> 0 + */ + + + Container.prototype.removeAll = function removeAll() { + for (var _iterator8 = this.nodes, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { + var _ref8; + + if (_isArray8) { + if (_i8 >= _iterator8.length) break; + _ref8 = _iterator8[_i8++]; + } else { + _i8 = _iterator8.next(); + if (_i8.done) break; + _ref8 = _i8.value; + } + + var node = _ref8; + node.parent = undefined; + }this.nodes = []; + return this; + }; + + /** + * Passes all declaration values within the container that match pattern + * through callback, replacing those values with the returned result + * of callback. + * + * This method is useful if you are using a custom unit or function + * and need to iterate through all values. + * + * @param {string|RegExp} pattern - replace pattern + * @param {object} opts - options to speed up the search + * @param {string} opts.prop - an array of property names + * @param {string} opts.fast - string that’s used + * to narrow down values and speed up + * the regexp search + * @param {function|string} callback - string to replace pattern + * or callback that returns a new value. + * The callback will receive + * the same arguments as those passed + * to a function parameter + * of `String#replace`. + * + * @return {Node} this node for methods chain + * + * @example + * root.replaceValues(/\d+rem/, { fast: 'rem' }, string => { + * return 15 * parseInt(string) + 'px'; + * }); + */ + + + Container.prototype.replaceValues = function replaceValues(pattern, opts, callback) { + if (!callback) { + callback = opts; + opts = {}; + } + + this.walkDecls(function (decl) { + if (opts.props && opts.props.indexOf(decl.prop) === -1) return; + if (opts.fast && decl.value.indexOf(opts.fast) === -1) return; + + decl.value = decl.value.replace(pattern, callback); + }); + + return this; + }; + + /** + * Returns `true` if callback returns `true` + * for all of the container’s children. + * + * @param {childCondition} condition - iterator returns true or false. + * + * @return {boolean} is every child pass condition + * + * @example + * const noPrefixes = rule.every(i => i.prop[0] !== '-'); + */ + + + Container.prototype.every = function every(condition) { + return this.nodes.every(condition); + }; + + /** + * Returns `true` if callback returns `true` for (at least) one + * of the container’s children. + * + * @param {childCondition} condition - iterator returns true or false. + * + * @return {boolean} is every child pass condition + * + * @example + * const hasPrefix = rule.every(i => i.prop[0] === '-'); + */ + + + Container.prototype.some = function some(condition) { + return this.nodes.some(condition); + }; + + /** + * Returns a `child`’s index within the {@link Container#nodes} array. + * + * @param {Node} child - child of the current container. + * + * @return {number} child index + * + * @example + * rule.index( rule.nodes[2] ) //=> 2 + */ + + + Container.prototype.index = function index(child) { + if (typeof child === 'number') { + return child; + } else { + return this.nodes.indexOf(child); + } + }; + + /** + * The container’s first child. + * + * @type {Node} + * + * @example + * rule.first == rules.nodes[0]; + */ + + + Container.prototype.normalize = function normalize(nodes, sample) { + var _this2 = this; + + if (typeof nodes === 'string') { + var parse = require('./parse'); + nodes = cleanSource(parse(nodes).nodes); + } else if (!Array.isArray(nodes)) { + if (nodes.type === 'root') { + nodes = nodes.nodes; + } else if (nodes.type) { + nodes = [nodes]; + } else if (nodes.prop) { + if (typeof nodes.value === 'undefined') { + throw new Error('Value field is missed in node creation'); + } else if (typeof nodes.value !== 'string') { + nodes.value = String(nodes.value); + } + nodes = [new _declaration2.default(nodes)]; + } else if (nodes.selector) { + var Rule = require('./rule'); + nodes = [new Rule(nodes)]; + } else if (nodes.name) { + var AtRule = require('./at-rule'); + nodes = [new AtRule(nodes)]; + } else if (nodes.text) { + nodes = [new _comment2.default(nodes)]; + } else { + throw new Error('Unknown node type in node creation'); + } + } + + var processed = nodes.map(function (i) { + if (typeof i.raws === 'undefined') i = _this2.rebuild(i); + + if (i.parent) i = i.clone(); + if (typeof i.raws.before === 'undefined') { + if (sample && typeof sample.raws.before !== 'undefined') { + i.raws.before = sample.raws.before.replace(/[^\s]/g, ''); + } + } + i.parent = _this2; + return i; + }); + + return processed; + }; + + Container.prototype.rebuild = function rebuild(node, parent) { + var _this3 = this; + + var fix = void 0; + if (node.type === 'root') { + var Root = require('./root'); + fix = new Root(); + } else if (node.type === 'atrule') { + var AtRule = require('./at-rule'); + fix = new AtRule(); + } else if (node.type === 'rule') { + var Rule = require('./rule'); + fix = new Rule(); + } else if (node.type === 'decl') { + fix = new _declaration2.default(); + } else if (node.type === 'comment') { + fix = new _comment2.default(); + } + + for (var i in node) { + if (i === 'nodes') { + fix.nodes = node.nodes.map(function (j) { + return _this3.rebuild(j, fix); + }); + } else if (i === 'parent' && parent) { + fix.parent = parent; + } else if (node.hasOwnProperty(i)) { + fix[i] = node[i]; + } + } + + return fix; + }; + + Container.prototype.eachInside = function eachInside(callback) { + (0, _warnOnce2.default)('Container#eachInside is deprecated. ' + 'Use Container#walk instead.'); + return this.walk(callback); + }; + + Container.prototype.eachDecl = function eachDecl(prop, callback) { + (0, _warnOnce2.default)('Container#eachDecl is deprecated. ' + 'Use Container#walkDecls instead.'); + return this.walkDecls(prop, callback); + }; + + Container.prototype.eachRule = function eachRule(selector, callback) { + (0, _warnOnce2.default)('Container#eachRule is deprecated. ' + 'Use Container#walkRules instead.'); + return this.walkRules(selector, callback); + }; + + Container.prototype.eachAtRule = function eachAtRule(name, callback) { + (0, _warnOnce2.default)('Container#eachAtRule is deprecated. ' + 'Use Container#walkAtRules instead.'); + return this.walkAtRules(name, callback); + }; + + Container.prototype.eachComment = function eachComment(callback) { + (0, _warnOnce2.default)('Container#eachComment is deprecated. ' + 'Use Container#walkComments instead.'); + return this.walkComments(callback); + }; + + _createClass(Container, [{ + key: 'first', + get: function get() { + if (!this.nodes) return undefined; + return this.nodes[0]; + } + + /** + * The container’s last child. + * + * @type {Node} + * + * @example + * rule.last == rule.nodes[rule.nodes.length - 1]; + */ + + }, { + key: 'last', + get: function get() { + if (!this.nodes) return undefined; + return this.nodes[this.nodes.length - 1]; + } + }, { + key: 'semicolon', + get: function get() { + (0, _warnOnce2.default)('Node#semicolon is deprecated. Use Node#raws.semicolon'); + return this.raws.semicolon; + }, + set: function set(val) { + (0, _warnOnce2.default)('Node#semicolon is deprecated. Use Node#raws.semicolon'); + this.raws.semicolon = val; + } + }, { + key: 'after', + get: function get() { + (0, _warnOnce2.default)('Node#after is deprecated. Use Node#raws.after'); + return this.raws.after; + }, + set: function set(val) { + (0, _warnOnce2.default)('Node#after is deprecated. Use Node#raws.after'); + this.raws.after = val; + } + + /** + * @memberof Container# + * @member {Node[]} nodes - an array containing the container’s children + * + * @example + * const root = postcss.parse('a { color: black }'); + * root.nodes.length //=> 1 + * root.nodes[0].selector //=> 'a' + * root.nodes[0].nodes[0].prop //=> 'color' + */ + + }]); + + return Container; +}(_node2.default); + +exports.default = Container; +module.exports = exports['default']; + + +},{"./at-rule":33,"./comment":34,"./declaration":37,"./node":42,"./parse":43,"./root":49,"./rule":50,"./warn-once":55}],36:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _supportsColor = require('supports-color'); + +var _supportsColor2 = _interopRequireDefault(_supportsColor); + +var _warnOnce = require('./warn-once'); + +var _warnOnce2 = _interopRequireDefault(_warnOnce); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * The CSS parser throws this error for broken CSS. + * + * Custom parsers can throw this error for broken custom syntax using + * the {@link Node#error} method. + * + * PostCSS will use the input source map to detect the original error location. + * If you wrote a Sass file, compiled it to CSS and then parsed it with PostCSS, + * PostCSS will show the original position in the Sass file. + * + * If you need the position in the PostCSS input + * (e.g., to debug the previous compiler), use `error.input.file`. + * + * @example + * // Catching and checking syntax error + * try { + * postcss.parse('a{') + * } catch (error) { + * if ( error.name === 'CssSyntaxError' ) { + * error //=> CssSyntaxError + * } + * } + * + * @example + * // Raising error from plugin + * throw node.error('Unknown variable', { plugin: 'postcss-vars' }); + */ +var CssSyntaxError = function () { + + /** + * @param {string} message - error message + * @param {number} [line] - source line of the error + * @param {number} [column] - source column of the error + * @param {string} [source] - source code of the broken file + * @param {string} [file] - absolute path to the broken file + * @param {string} [plugin] - PostCSS plugin name, if error came from plugin + */ + function CssSyntaxError(message, line, column, source, file, plugin) { + _classCallCheck(this, CssSyntaxError); + + /** + * @member {string} - Always equal to `'CssSyntaxError'`. You should + * always check error type + * by `error.name === 'CssSyntaxError'` instead of + * `error instanceof CssSyntaxError`, because + * npm could have several PostCSS versions. + * + * @example + * if ( error.name === 'CssSyntaxError' ) { + * error //=> CssSyntaxError + * } + */ + this.name = 'CssSyntaxError'; + /** + * @member {string} - Error message. + * + * @example + * error.message //=> 'Unclosed block' + */ + this.reason = message; + + if (file) { + /** + * @member {string} - Absolute path to the broken file. + * + * @example + * error.file //=> 'a.sass' + * error.input.file //=> 'a.css' + */ + this.file = file; + } + if (source) { + /** + * @member {string} - Source code of the broken file. + * + * @example + * error.source //=> 'a { b {} }' + * error.input.column //=> 'a b { }' + */ + this.source = source; + } + if (plugin) { + /** + * @member {string} - Plugin name, if error came from plugin. + * + * @example + * error.plugin //=> 'postcss-vars' + */ + this.plugin = plugin; + } + if (typeof line !== 'undefined' && typeof column !== 'undefined') { + /** + * @member {number} - Source line of the error. + * + * @example + * error.line //=> 2 + * error.input.line //=> 4 + */ + this.line = line; + /** + * @member {number} - Source column of the error. + * + * @example + * error.column //=> 1 + * error.input.column //=> 4 + */ + this.column = column; + } + + this.setMessage(); + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, CssSyntaxError); + } + } + + CssSyntaxError.prototype.setMessage = function setMessage() { + /** + * @member {string} - Full error text in the GNU error format + * with plugin, file, line and column. + * + * @example + * error.message //=> 'a.css:1:1: Unclosed block' + */ + this.message = this.plugin ? this.plugin + ': ' : ''; + this.message += this.file ? this.file : ''; + if (typeof this.line !== 'undefined') { + this.message += ':' + this.line + ':' + this.column; + } + this.message += ': ' + this.reason; + }; + + /** + * Returns a few lines of CSS source that caused the error. + * + * If the CSS has an input source map without `sourceContent`, + * this method will return an empty string. + * + * @param {boolean} [color] whether arrow will be colored red by terminal + * color codes. By default, PostCSS will detect + * color support by `process.stdout.isTTY` + * and `process.env.NODE_DISABLE_COLORS`. + * + * @example + * error.showSourceCode() //=> "a { + * // bad + * // ^ + * // }" + * + * @return {string} few lines of CSS source that caused the error + */ + + + CssSyntaxError.prototype.showSourceCode = function showSourceCode(color) { + if (!this.source) return ''; + + var num = this.line - 1; + var lines = this.source.split('\n'); + + var prev = num > 0 ? lines[num - 1] + '\n' : ''; + var broken = lines[num]; + var next = num < lines.length - 1 ? '\n' + lines[num + 1] : ''; + + var mark = '\n'; + for (var i = 0; i < this.column - 1; i++) { + mark += ' '; + } + + if (typeof color === 'undefined') color = _supportsColor2.default; + if (color) { + mark += '\x1B[1;31m^\x1B[0m'; + } else { + mark += '^'; + } + + return '\n' + prev + broken + mark + next; + }; + + /** + * Returns error position, message and source code of the broken part. + * + * @example + * error.toString() //=> "CssSyntaxError: app.css:1:1: Unclosed block + * // a { + * // ^" + * + * @return {string} error position, message and source code + */ + + + CssSyntaxError.prototype.toString = function toString() { + return this.name + ': ' + this.message + this.showSourceCode(); + }; + + _createClass(CssSyntaxError, [{ + key: 'generated', + get: function get() { + (0, _warnOnce2.default)('CssSyntaxError#generated is depreacted. Use input instead.'); + return this.input; + } + + /** + * @memberof CssSyntaxError# + * @member {Input} input - Input object with PostCSS internal information + * about input file. If input has source map + * from previous tool, PostCSS will use origin + * (for example, Sass) source. You can use this + * object to get PostCSS input source. + * + * @example + * error.input.file //=> 'a.css' + * error.file //=> 'a.sass' + */ + + }]); + + return CssSyntaxError; +}(); + +exports.default = CssSyntaxError; +module.exports = exports['default']; + + +},{"./warn-once":55,"supports-color":74}],37:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _warnOnce = require('./warn-once'); + +var _warnOnce2 = _interopRequireDefault(_warnOnce); + +var _node = require('./node'); + +var _node2 = _interopRequireDefault(_node); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +/** + * Represents a CSS declaration. + * + * @extends Node + * + * @example + * const root = postcss.parse('a { color: black }'); + * const decl = root.first.first; + * decl.type //=> 'decl' + * decl.toString() //=> ' color: black' + */ +var Declaration = function (_Node) { + _inherits(Declaration, _Node); + + function Declaration(defaults) { + _classCallCheck(this, Declaration); + + var _this = _possibleConstructorReturn(this, _Node.call(this, defaults)); + + _this.type = 'decl'; + return _this; + } + + _createClass(Declaration, [{ + key: '_value', + get: function get() { + (0, _warnOnce2.default)('Node#_value was deprecated. Use Node#raws.value'); + return this.raws.value; + }, + set: function set(val) { + (0, _warnOnce2.default)('Node#_value was deprecated. Use Node#raws.value'); + this.raws.value = val; + } + }, { + key: '_important', + get: function get() { + (0, _warnOnce2.default)('Node#_important was deprecated. Use Node#raws.important'); + return this.raws.important; + }, + set: function set(val) { + (0, _warnOnce2.default)('Node#_important was deprecated. Use Node#raws.important'); + this.raws.important = val; + } + + /** + * @memberof Declaration# + * @member {string} prop - the declaration’s property name + * + * @example + * const root = postcss.parse('a { color: black }'); + * const decl = root.first.first; + * decl.prop //=> 'color' + */ + + /** + * @memberof Declaration# + * @member {string} value - the declaration’s value + * + * @example + * const root = postcss.parse('a { color: black }'); + * const decl = root.first.first; + * decl.value //=> 'black' + */ + + /** + * @memberof Declaration# + * @member {boolean} important - `true` if the declaration + * has an !important annotation. + * + * @example + * const root = postcss.parse('a { color: black !important; color: red }'); + * root.first.first.important //=> true + * root.first.last.important //=> undefined + */ + + /** + * @memberof Declaration# + * @member {object} raws - Information to generate byte-to-byte equal + * node string as it was in the origin input. + * + * Every parser saves its own properties, + * but the default CSS parser uses: + * + * * `before`: the space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + * * `between`: the symbols between the property and value + * for declarations, selector and `{` for rules, or last parameter + * and `{` for at-rules. + * * `important`: the content of the important statement, + * if it is not just `!important`. + * + * PostCSS cleans declaration from comments and extra spaces, + * but it stores origin content in raws properties. + * As such, if you don’t change a declaration’s value, + * PostCSS will use the raw value with comments. + * + * @example + * const root = postcss.parse('a {\n color:black\n}') + * root.first.first.raws //=> { before: '\n ', between: ':' } + */ + + }]); + + return Declaration; +}(_node2.default); + +exports.default = Declaration; +module.exports = exports['default']; + + +},{"./node":42,"./warn-once":55}],38:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _cssSyntaxError = require('./css-syntax-error'); + +var _cssSyntaxError2 = _interopRequireDefault(_cssSyntaxError); + +var _previousMap = require('./previous-map'); + +var _previousMap2 = _interopRequireDefault(_previousMap); + +var _path = require('path'); + +var _path2 = _interopRequireDefault(_path); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var sequence = 0; + +/** + * @typedef {object} filePosition + * @property {string} file - path to file + * @property {number} line - source line in file + * @property {number} column - source column in file + */ + +/** + * Represents the source CSS. + * + * @example + * const root = postcss.parse(css, { from: file }); + * const input = root.source.input; + */ + +var Input = function () { + + /** + * @param {string} css - input CSS source + * @param {object} [opts] - {@link Processor#process} options + */ + function Input(css) { + var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + _classCallCheck(this, Input); + + /** + * @member {string} - input CSS source + * + * @example + * const input = postcss.parse('a{}', { from: file }).input; + * input.css //=> "a{}"; + */ + this.css = css.toString(); + + if (this.css[0] === '' || this.css[0] === '￾') { + this.css = this.css.slice(1); + } + + if (opts.from) { + if (/^\w+:\/\//.test(opts.from)) { + /** + * @member {string} - The absolute path to the CSS source file + * defined with the `from` option. + * + * @example + * const root = postcss.parse(css, { from: 'a.css' }); + * root.source.input.file //=> '/home/ai/a.css' + */ + this.file = opts.from; + } else { + this.file = _path2.default.resolve(opts.from); + } + } + + var map = new _previousMap2.default(this.css, opts); + if (map.text) { + /** + * @member {PreviousMap} - The input source map passed from + * a compilation step before PostCSS + * (for example, from Sass compiler). + * + * @example + * root.source.input.map.consumer().sources //=> ['a.sass'] + */ + this.map = map; + var file = map.consumer().file; + if (!this.file && file) this.file = this.mapResolve(file); + } + + if (!this.file) { + sequence += 1; + /** + * @member {string} - The unique ID of the CSS source. It will be + * created if `from` option is not provided + * (because PostCSS does not know the file path). + * + * @example + * const root = postcss.parse(css); + * root.source.input.file //=> undefined + * root.source.input.id //=> "" + */ + this.id = ''; + } + if (this.map) this.map.file = this.from; + } + + Input.prototype.error = function error(message, line, column) { + var opts = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; + + var result = void 0; + var origin = this.origin(line, column); + if (origin) { + result = new _cssSyntaxError2.default(message, origin.line, origin.column, origin.source, origin.file, opts.plugin); + } else { + result = new _cssSyntaxError2.default(message, line, column, this.css, this.file, opts.plugin); + } + + result.input = { line: line, column: column, source: this.css }; + if (this.file) result.input.file = this.file; + + return result; + }; + + /** + * Reads the input source map and returns a symbol position + * in the input source (e.g., in a Sass file that was compiled + * to CSS before being passed to PostCSS). + * + * @param {number} line - line in input CSS + * @param {number} column - column in input CSS + * + * @return {filePosition} position in input source + * + * @example + * root.source.input.origin(1, 1) //=> { file: 'a.css', line: 3, column: 1 } + */ + + + Input.prototype.origin = function origin(line, column) { + if (!this.map) return false; + var consumer = this.map.consumer(); + + var from = consumer.originalPositionFor({ line: line, column: column }); + if (!from.source) return false; + + var result = { + file: this.mapResolve(from.source), + line: from.line, + column: from.column + }; + + var source = consumer.sourceContentFor(from.source); + if (source) result.source = source; + + return result; + }; + + Input.prototype.mapResolve = function mapResolve(file) { + if (/^\w+:\/\//.test(file)) { + return file; + } else { + return _path2.default.resolve(this.map.consumer().sourceRoot || '.', file); + } + }; + + /** + * The CSS source identifier. Contains {@link Input#file} if the user + * set the `from` option, or {@link Input#id} if they did not. + * @type {string} + * + * @example + * const root = postcss.parse(css, { from: 'a.css' }); + * root.source.input.from //=> "/home/ai/a.css" + * + * const root = postcss.parse(css); + * root.source.input.from //=> "" + */ + + + _createClass(Input, [{ + key: 'from', + get: function get() { + return this.file || this.id; + } + }]); + + return Input; +}(); + +exports.default = Input; +module.exports = exports['default']; + + +},{"./css-syntax-error":36,"./previous-map":46,"path":undefined}],39:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; + +var _mapGenerator = require('./map-generator'); + +var _mapGenerator2 = _interopRequireDefault(_mapGenerator); + +var _stringify2 = require('./stringify'); + +var _stringify3 = _interopRequireDefault(_stringify2); + +var _warnOnce = require('./warn-once'); + +var _warnOnce2 = _interopRequireDefault(_warnOnce); + +var _result = require('./result'); + +var _result2 = _interopRequireDefault(_result); + +var _parse = require('./parse'); + +var _parse2 = _interopRequireDefault(_parse); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function isPromise(obj) { + return (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && typeof obj.then === 'function'; +} + +/** + * @callback onFulfilled + * @param {Result} result + */ + +/** + * @callback onRejected + * @param {Error} error + */ + +/** + * A Promise proxy for the result of PostCSS transformations. + * + * A `LazyResult` instance is returned by {@link Processor#process}. + * + * @example + * const lazy = postcss([cssnext]).process(css); + */ + +var LazyResult = function () { + function LazyResult(processor, css, opts) { + _classCallCheck(this, LazyResult); + + this.stringified = false; + this.processed = false; + + var root = void 0; + if ((typeof css === 'undefined' ? 'undefined' : _typeof(css)) === 'object' && css.type === 'root') { + root = css; + } else if (css instanceof LazyResult || css instanceof _result2.default) { + root = css.root; + if (css.map) { + if (typeof opts.map === 'undefined') opts.map = {}; + if (!opts.map.inline) opts.map.inline = false; + opts.map.prev = css.map; + } + } else { + var parser = _parse2.default; + if (opts.syntax) parser = opts.syntax.parse; + if (opts.parser) parser = opts.parser; + if (parser.parse) parser = parser.parse; + + try { + root = parser(css, opts); + } catch (error) { + this.error = error; + } + } + + this.result = new _result2.default(processor, root, opts); + } + + /** + * Returns a {@link Processor} instance, which will be used + * for CSS transformations. + * @type {Processor} + */ + + + /** + * Processes input CSS through synchronous plugins + * and calls {@link Result#warnings()}. + * + * @return {Warning[]} warnings from plugins + */ + LazyResult.prototype.warnings = function warnings() { + return this.sync().warnings(); + }; + + /** + * Alias for the {@link LazyResult#css} property. + * + * @example + * lazy + '' === lazy.css; + * + * @return {string} output CSS + */ + + + LazyResult.prototype.toString = function toString() { + return this.css; + }; + + /** + * Processes input CSS through synchronous and asynchronous plugins + * and calls `onFulfilled` with a Result instance. If a plugin throws + * an error, the `onRejected` callback will be executed. + * + * It implements standard Promise API. + * + * @param {onFulfilled} onFulfilled - callback will be executed + * when all plugins will finish work + * @param {onRejected} onRejected - callback will be execited on any error + * + * @return {Promise} Promise API to make queue + * + * @example + * postcss([cssnext]).process(css).then(result => { + * console.log(result.css); + * }); + */ + + + LazyResult.prototype.then = function then(onFulfilled, onRejected) { + return this.async().then(onFulfilled, onRejected); + }; + + /** + * Processes input CSS through synchronous and asynchronous plugins + * and calls onRejected for each error thrown in any plugin. + * + * It implements standard Promise API. + * + * @param {onRejected} onRejected - callback will be execited on any error + * + * @return {Promise} Promise API to make queue + * + * @example + * postcss([cssnext]).process(css).then(result => { + * console.log(result.css); + * }).catch(error => { + * console.error(error); + * }); + */ + + + LazyResult.prototype.catch = function _catch(onRejected) { + return this.async().catch(onRejected); + }; + + LazyResult.prototype.handleError = function handleError(error, plugin) { + try { + this.error = error; + if (error.name === 'CssSyntaxError' && !error.plugin) { + error.plugin = plugin.postcssPlugin; + error.setMessage(); + } else if (plugin.postcssVersion) { + var pluginName = plugin.postcssPlugin; + var pluginVer = plugin.postcssVersion; + var runtimeVer = this.result.processor.version; + var a = pluginVer.split('.'); + var b = runtimeVer.split('.'); + + if (a[0] !== b[0] || parseInt(a[1]) > parseInt(b[1])) { + (0, _warnOnce2.default)('Your current PostCSS version ' + 'is ' + runtimeVer + ', but ' + pluginName + ' ' + 'uses ' + pluginVer + '. Perhaps this is ' + 'the source of the error below.'); + } + } + } catch (err) { + if (console && console.error) console.error(err); + } + }; + + LazyResult.prototype.asyncTick = function asyncTick(resolve, reject) { + var _this = this; + + if (this.plugin >= this.processor.plugins.length) { + this.processed = true; + return resolve(); + } + + try { + (function () { + var plugin = _this.processor.plugins[_this.plugin]; + var promise = _this.run(plugin); + _this.plugin += 1; + + if (isPromise(promise)) { + promise.then(function () { + _this.asyncTick(resolve, reject); + }).catch(function (error) { + _this.handleError(error, plugin); + _this.processed = true; + reject(error); + }); + } else { + _this.asyncTick(resolve, reject); + } + })(); + } catch (error) { + this.processed = true; + reject(error); + } + }; + + LazyResult.prototype.async = function async() { + var _this2 = this; + + if (this.processed) { + return new Promise(function (resolve, reject) { + if (_this2.error) { + reject(_this2.error); + } else { + resolve(_this2.stringify()); + } + }); + } + if (this.processing) { + return this.processing; + } + + this.processing = new Promise(function (resolve, reject) { + if (_this2.error) return reject(_this2.error); + _this2.plugin = 0; + _this2.asyncTick(resolve, reject); + }).then(function () { + _this2.processed = true; + return _this2.stringify(); + }); + + return this.processing; + }; + + LazyResult.prototype.sync = function sync() { + if (this.processed) return this.result; + this.processed = true; + + if (this.processing) { + throw new Error('Use process(css).then(cb) to work with async plugins'); + } + + if (this.error) throw this.error; + + for (var _iterator = this.result.processor.plugins, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var plugin = _ref; + + var promise = this.run(plugin); + if (isPromise(promise)) { + throw new Error('Use process(css).then(cb) to work with async plugins'); + } + } + + return this.result; + }; + + LazyResult.prototype.run = function run(plugin) { + this.result.lastPlugin = plugin; + + try { + return plugin(this.result.root, this.result); + } catch (error) { + this.handleError(error, plugin); + throw error; + } + }; + + LazyResult.prototype.stringify = function stringify() { + if (this.stringified) return this.result; + this.stringified = true; + + this.sync(); + + var opts = this.result.opts; + var str = _stringify3.default; + if (opts.syntax) str = opts.syntax.stringify; + if (opts.stringifier) str = opts.stringifier; + if (str.stringify) str = str.stringify; + + var map = new _mapGenerator2.default(str, this.result.root, this.result.opts); + var data = map.generate(); + this.result.css = data[0]; + this.result.map = data[1]; + + return this.result; + }; + + _createClass(LazyResult, [{ + key: 'processor', + get: function get() { + return this.result.processor; + } + + /** + * Options from the {@link Processor#process} call. + * @type {processOptions} + */ + + }, { + key: 'opts', + get: function get() { + return this.result.opts; + } + + /** + * Processes input CSS through synchronous plugins, converts `Root` + * to a CSS string and returns {@link Result#css}. + * + * This property will only work with synchronous plugins. + * If the processor contains any asynchronous plugins + * it will throw an error. This is why this method is only + * for debug purpose, you should always use {@link LazyResult#then}. + * + * @type {string} + * @see Result#css + */ + + }, { + key: 'css', + get: function get() { + return this.stringify().css; + } + + /** + * An alias for the `css` property. Use it with syntaxes + * that generate non-CSS output. + * + * This property will only work with synchronous plugins. + * If the processor contains any asynchronous plugins + * it will throw an error. This is why this method is only + * for debug purpose, you should always use {@link LazyResult#then}. + * + * @type {string} + * @see Result#content + */ + + }, { + key: 'content', + get: function get() { + return this.stringify().content; + } + + /** + * Processes input CSS through synchronous plugins + * and returns {@link Result#map}. + * + * This property will only work with synchronous plugins. + * If the processor contains any asynchronous plugins + * it will throw an error. This is why this method is only + * for debug purpose, you should always use {@link LazyResult#then}. + * + * @type {SourceMapGenerator} + * @see Result#map + */ + + }, { + key: 'map', + get: function get() { + return this.stringify().map; + } + + /** + * Processes input CSS through synchronous plugins + * and returns {@link Result#root}. + * + * This property will only work with synchronous plugins. If the processor + * contains any asynchronous plugins it will throw an error. + * + * This is why this method is only for debug purpose, + * you should always use {@link LazyResult#then}. + * + * @type {Root} + * @see Result#root + */ + + }, { + key: 'root', + get: function get() { + return this.sync().root; + } + + /** + * Processes input CSS through synchronous plugins + * and returns {@link Result#messages}. + * + * This property will only work with synchronous plugins. If the processor + * contains any asynchronous plugins it will throw an error. + * + * This is why this method is only for debug purpose, + * you should always use {@link LazyResult#then}. + * + * @type {Message[]} + * @see Result#messages + */ + + }, { + key: 'messages', + get: function get() { + return this.sync().messages; + } + }]); + + return LazyResult; +}(); + +exports.default = LazyResult; +module.exports = exports['default']; + + +},{"./map-generator":41,"./parse":43,"./result":48,"./stringify":52,"./warn-once":55}],40:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +/** + * Contains helpers for safely splitting lists of CSS values, + * preserving parentheses and quotes. + * + * @example + * const list = postcss.list; + * + * @namespace list + */ +var list = { + split: function split(string, separators, last) { + var array = []; + var current = ''; + var split = false; + + var func = 0; + var quote = false; + var escape = false; + + for (var i = 0; i < string.length; i++) { + var letter = string[i]; + + if (quote) { + if (escape) { + escape = false; + } else if (letter === '\\') { + escape = true; + } else if (letter === quote) { + quote = false; + } + } else if (letter === '"' || letter === '\'') { + quote = letter; + } else if (letter === '(') { + func += 1; + } else if (letter === ')') { + if (func > 0) func -= 1; + } else if (func === 0) { + if (separators.indexOf(letter) !== -1) split = true; + } + + if (split) { + if (current !== '') array.push(current.trim()); + current = ''; + split = false; + } else { + current += letter; + } + } + + if (last || current !== '') array.push(current.trim()); + return array; + }, + + + /** + * Safely splits space-separated values (such as those for `background`, + * `border-radius`, and other shorthand properties). + * + * @param {string} string - space-separated values + * + * @return {string[]} splitted values + * + * @example + * postcss.list.space('1px calc(10% + 1px)') //=> ['1px', 'calc(10% + 1px)'] + */ + space: function space(string) { + var spaces = [' ', '\n', '\t']; + return list.split(string, spaces); + }, + + + /** + * Safely splits comma-separated values (such as those for `transition-*` + * and `background` properties). + * + * @param {string} string - comma-separated values + * + * @return {string[]} splitted values + * + * @example + * postcss.list.comma('black, linear-gradient(white, black)') + * //=> ['black', 'linear-gradient(white, black)'] + */ + comma: function comma(string) { + var comma = ','; + return list.split(string, [comma], true); + } +}; + +exports.default = list; +module.exports = exports['default']; + + +},{}],41:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _jsBase = require('js-base64'); + +var _sourceMap = require('source-map'); + +var _sourceMap2 = _interopRequireDefault(_sourceMap); + +var _path = require('path'); + +var _path2 = _interopRequireDefault(_path); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var MapGenerator = function () { + function MapGenerator(stringify, root, opts) { + _classCallCheck(this, MapGenerator); + + this.stringify = stringify; + this.mapOpts = opts.map || {}; + this.root = root; + this.opts = opts; + } + + MapGenerator.prototype.isMap = function isMap() { + if (typeof this.opts.map !== 'undefined') { + return !!this.opts.map; + } else { + return this.previous().length > 0; + } + }; + + MapGenerator.prototype.previous = function previous() { + var _this = this; + + if (!this.previousMaps) { + this.previousMaps = []; + this.root.walk(function (node) { + if (node.source && node.source.input.map) { + var map = node.source.input.map; + if (_this.previousMaps.indexOf(map) === -1) { + _this.previousMaps.push(map); + } + } + }); + } + + return this.previousMaps; + }; + + MapGenerator.prototype.isInline = function isInline() { + if (typeof this.mapOpts.inline !== 'undefined') { + return this.mapOpts.inline; + } + + var annotation = this.mapOpts.annotation; + if (typeof annotation !== 'undefined' && annotation !== true) { + return false; + } + + if (this.previous().length) { + return this.previous().some(function (i) { + return i.inline; + }); + } else { + return true; + } + }; + + MapGenerator.prototype.isSourcesContent = function isSourcesContent() { + if (typeof this.mapOpts.sourcesContent !== 'undefined') { + return this.mapOpts.sourcesContent; + } + if (this.previous().length) { + return this.previous().some(function (i) { + return i.withContent(); + }); + } else { + return true; + } + }; + + MapGenerator.prototype.clearAnnotation = function clearAnnotation() { + if (this.mapOpts.annotation === false) return; + + var node = void 0; + for (var i = this.root.nodes.length - 1; i >= 0; i--) { + node = this.root.nodes[i]; + if (node.type !== 'comment') continue; + if (node.text.indexOf('# sourceMappingURL=') === 0) { + this.root.removeChild(i); + } + } + }; + + MapGenerator.prototype.setSourcesContent = function setSourcesContent() { + var _this2 = this; + + var already = {}; + this.root.walk(function (node) { + if (node.source) { + var from = node.source.input.from; + if (from && !already[from]) { + already[from] = true; + var relative = _this2.relative(from); + _this2.map.setSourceContent(relative, node.source.input.css); + } + } + }); + }; + + MapGenerator.prototype.applyPrevMaps = function applyPrevMaps() { + for (var _iterator = this.previous(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var prev = _ref; + + var from = this.relative(prev.file); + var root = prev.root || _path2.default.dirname(prev.file); + var map = void 0; + + if (this.mapOpts.sourcesContent === false) { + map = new _sourceMap2.default.SourceMapConsumer(prev.text); + if (map.sourcesContent) { + map.sourcesContent = map.sourcesContent.map(function () { + return null; + }); + } + } else { + map = prev.consumer(); + } + + this.map.applySourceMap(map, from, this.relative(root)); + } + }; + + MapGenerator.prototype.isAnnotation = function isAnnotation() { + if (this.isInline()) { + return true; + } else if (typeof this.mapOpts.annotation !== 'undefined') { + return this.mapOpts.annotation; + } else if (this.previous().length) { + return this.previous().some(function (i) { + return i.annotation; + }); + } else { + return true; + } + }; + + MapGenerator.prototype.addAnnotation = function addAnnotation() { + var content = void 0; + + if (this.isInline()) { + content = 'data:application/json;base64,' + _jsBase.Base64.encode(this.map.toString()); + } else if (typeof this.mapOpts.annotation === 'string') { + content = this.mapOpts.annotation; + } else { + content = this.outputFile() + '.map'; + } + + var eol = '\n'; + if (this.css.indexOf('\r\n') !== -1) eol = '\r\n'; + + this.css += eol + '/*# sourceMappingURL=' + content + ' */'; + }; + + MapGenerator.prototype.outputFile = function outputFile() { + if (this.opts.to) { + return this.relative(this.opts.to); + } else if (this.opts.from) { + return this.relative(this.opts.from); + } else { + return 'to.css'; + } + }; + + MapGenerator.prototype.generateMap = function generateMap() { + this.generateString(); + if (this.isSourcesContent()) this.setSourcesContent(); + if (this.previous().length > 0) this.applyPrevMaps(); + if (this.isAnnotation()) this.addAnnotation(); + + if (this.isInline()) { + return [this.css]; + } else { + return [this.css, this.map]; + } + }; + + MapGenerator.prototype.relative = function relative(file) { + if (/^\w+:\/\//.test(file)) return file; + + var from = this.opts.to ? _path2.default.dirname(this.opts.to) : '.'; + + if (typeof this.mapOpts.annotation === 'string') { + from = _path2.default.dirname(_path2.default.resolve(from, this.mapOpts.annotation)); + } + + file = _path2.default.relative(from, file); + if (_path2.default.sep === '\\') { + return file.replace(/\\/g, '/'); + } else { + return file; + } + }; + + MapGenerator.prototype.sourcePath = function sourcePath(node) { + if (this.mapOpts.from) { + return this.mapOpts.from; + } else { + return this.relative(node.source.input.from); + } + }; + + MapGenerator.prototype.generateString = function generateString() { + var _this3 = this; + + this.css = ''; + this.map = new _sourceMap2.default.SourceMapGenerator({ file: this.outputFile() }); + + var line = 1; + var column = 1; + + var lines = void 0, + last = void 0; + this.stringify(this.root, function (str, node, type) { + _this3.css += str; + + if (node && type !== 'end') { + if (node.source && node.source.start) { + _this3.map.addMapping({ + source: _this3.sourcePath(node), + generated: { line: line, column: column - 1 }, + original: { + line: node.source.start.line, + column: node.source.start.column - 1 + } + }); + } else { + _this3.map.addMapping({ + source: '', + original: { line: 1, column: 0 }, + generated: { line: line, column: column - 1 } + }); + } + } + + lines = str.match(/\n/g); + if (lines) { + line += lines.length; + last = str.lastIndexOf('\n'); + column = str.length - last; + } else { + column += str.length; + } + + if (node && type !== 'start') { + if (node.source && node.source.end) { + _this3.map.addMapping({ + source: _this3.sourcePath(node), + generated: { line: line, column: column - 1 }, + original: { + line: node.source.end.line, + column: node.source.end.column + } + }); + } else { + _this3.map.addMapping({ + source: '', + original: { line: 1, column: 0 }, + generated: { line: line, column: column - 1 } + }); + } + } + }); + }; + + MapGenerator.prototype.generate = function generate() { + this.clearAnnotation(); + + if (this.isMap()) { + return this.generateMap(); + } else { + var result = ''; + this.stringify(this.root, function (i) { + result += i; + }); + return [result]; + } + }; + + return MapGenerator; +}(); + +exports.default = MapGenerator; +module.exports = exports['default']; + + +},{"js-base64":23,"path":undefined,"source-map":67}],42:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; + +var _cssSyntaxError = require('./css-syntax-error'); + +var _cssSyntaxError2 = _interopRequireDefault(_cssSyntaxError); + +var _stringifier = require('./stringifier'); + +var _stringifier2 = _interopRequireDefault(_stringifier); + +var _stringify = require('./stringify'); + +var _stringify2 = _interopRequireDefault(_stringify); + +var _warnOnce = require('./warn-once'); + +var _warnOnce2 = _interopRequireDefault(_warnOnce); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * @typedef {object} position + * @property {number} line - source line in file + * @property {number} column - source column in file + */ + +/** + * @typedef {object} source + * @property {Input} input - {@link Input} with input file + * @property {position} start - The starting position of the node’s source + * @property {position} end - The ending position of the node’s source + */ + +var cloneNode = function cloneNode(obj, parent) { + var cloned = new obj.constructor(); + + for (var i in obj) { + if (!obj.hasOwnProperty(i)) continue; + var value = obj[i]; + var type = typeof value === 'undefined' ? 'undefined' : _typeof(value); + + if (i === 'parent' && type === 'object') { + if (parent) cloned[i] = parent; + } else if (i === 'source') { + cloned[i] = value; + } else if (value instanceof Array) { + cloned[i] = value.map(function (j) { + return cloneNode(j, cloned); + }); + } else if (i !== 'before' && i !== 'after' && i !== 'between' && i !== 'semicolon') { + if (type === 'object' && value !== null) value = cloneNode(value); + cloned[i] = value; + } + } + + return cloned; +}; + +/** + * All node classes inherit the following common methods. + * + * @abstract + * @ignore + */ + +var Node = function () { + + /** + * @param {object} [defaults] - value for node properties + */ + function Node() { + var defaults = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + _classCallCheck(this, Node); + + this.raws = {}; + for (var name in defaults) { + this[name] = defaults[name]; + } + } + + /** + * Returns a CssSyntaxError instance containing the original position + * of the node in the source, showing line and column numbers and also + * a small excerpt to facilitate debugging. + * + * If present, an input source map will be used to get the original position + * of the source, even from a previous compilation step + * (e.g., from Sass compilation). + * + * This method produces very useful error messages. + * + * @param {string} message - error description + * @param {object} [opts] - options + * @param {string} opts.plugin - plugin name that created this error. + * PostCSS will set it automatically. + * @param {string} opts.word - a word inside a node’s string that should + * be highlighted as the source of the error + * @param {number} opts.index - an index inside a node’s string that should + * be highlighted as the source of the error + * + * @return {CssSyntaxError} error object to throw it + * + * @example + * if ( !variables[name] ) { + * throw decl.error('Unknown variable ' + name, { word: name }); + * // CssSyntaxError: postcss-vars:a.sass:4:3: Unknown variable $black + * // color: $black + * // a + * // ^ + * // background: white + * } + */ + + + Node.prototype.error = function error(message) { + var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + if (this.source) { + var pos = this.positionBy(opts); + return this.source.input.error(message, pos.line, pos.column, opts); + } else { + return new _cssSyntaxError2.default(message); + } + }; + + /** + * This method is provided as a convenience wrapper for {@link Result#warn}. + * + * @param {Result} result - the {@link Result} instance + * that will receive the warning + * @param {string} text - warning message + * @param {object} [opts] - options + * @param {string} opts.plugin - plugin name that created this warning. + * PostCSS will set it automatically. + * @param {string} opts.word - a word inside a node’s string that should + * be highlighted as the source of the warning + * @param {number} opts.index - an index inside a node’s string that should + * be highlighted as the source of the warning + * + * @return {Warning} created warning object + * + * @example + * const plugin = postcss.plugin('postcss-deprecated', () => { + * return (css, result) => { + * css.walkDecls('bad', decl => { + * decl.warn(result, 'Deprecated property bad'); + * }); + * }; + * }); + */ + + + Node.prototype.warn = function warn(result, text, opts) { + var data = { node: this }; + for (var i in opts) { + data[i] = opts[i]; + }return result.warn(text, data); + }; + + /** + * Removes the node from its parent and cleans the parent properties + * from the node and its children. + * + * @example + * if ( decl.prop.match(/^-webkit-/) ) { + * decl.remove(); + * } + * + * @return {Node} node to make calls chain + */ + + + Node.prototype.remove = function remove() { + if (this.parent) { + this.parent.removeChild(this); + } + this.parent = undefined; + return this; + }; + + /** + * Returns a CSS string representing the node. + * + * @param {stringifier|syntax} [stringifier] - a syntax to use + * in string generation + * + * @return {string} CSS string of this node + * + * @example + * postcss.rule({ selector: 'a' }).toString() //=> "a {}" + */ + + + Node.prototype.toString = function toString() { + var stringifier = arguments.length <= 0 || arguments[0] === undefined ? _stringify2.default : arguments[0]; + + if (stringifier.stringify) stringifier = stringifier.stringify; + var result = ''; + stringifier(this, function (i) { + result += i; + }); + return result; + }; + + /** + * Returns a clone of the node. + * + * The resulting cloned node and its (cloned) children will have + * a clean parent and code style properties. + * + * @param {object} [overrides] - new properties to override in the clone. + * + * @example + * const cloned = decl.clone({ prop: '-moz-' + decl.prop }); + * cloned.raws.before //=> undefined + * cloned.parent //=> undefined + * cloned.toString() //=> -moz-transform: scale(0) + * + * @return {Node} clone of the node + */ + + + Node.prototype.clone = function clone() { + var overrides = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + var cloned = cloneNode(this); + for (var name in overrides) { + cloned[name] = overrides[name]; + } + return cloned; + }; + + /** + * Shortcut to clone the node and insert the resulting cloned node + * before the current node. + * + * @param {object} [overrides] - new properties to override in the clone. + * + * @example + * decl.cloneBefore({ prop: '-moz-' + decl.prop }); + * + * @return {Node} - new node + */ + + + Node.prototype.cloneBefore = function cloneBefore() { + var overrides = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + var cloned = this.clone(overrides); + this.parent.insertBefore(this, cloned); + return cloned; + }; + + /** + * Shortcut to clone the node and insert the resulting cloned node + * after the current node. + * + * @param {object} [overrides] - new properties to override in the clone. + * + * @return {Node} - new node + */ + + + Node.prototype.cloneAfter = function cloneAfter() { + var overrides = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + var cloned = this.clone(overrides); + this.parent.insertAfter(this, cloned); + return cloned; + }; + + /** + * Inserts node(s) before the current node and removes the current node. + * + * @param {...Node} nodes - node(s) to replace current one + * + * @example + * if ( atrule.name == 'mixin' ) { + * atrule.replaceWith(mixinRules[atrule.params]); + * } + * + * @return {Node} current node to methods chain + */ + + + Node.prototype.replaceWith = function replaceWith() { + if (this.parent) { + for (var _len = arguments.length, nodes = Array(_len), _key = 0; _key < _len; _key++) { + nodes[_key] = arguments[_key]; + } + + for (var _iterator = nodes, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var node = _ref; + + this.parent.insertBefore(this, node); + } + + this.remove(); + } + + return this; + }; + + /** + * Removes the node from its current parent and inserts it + * at the end of `newParent`. + * + * This will clean the `before` and `after` code {@link Node#raws} data + * from the node and replace them with the indentation style of `newParent`. + * It will also clean the `between` property + * if `newParent` is in another {@link Root}. + * + * @param {Container} newParent - container node where the current node + * will be moved + * + * @example + * atrule.moveTo(atrule.root()); + * + * @return {Node} current node to methods chain + */ + + + Node.prototype.moveTo = function moveTo(newParent) { + this.cleanRaws(this.root() === newParent.root()); + this.remove(); + newParent.append(this); + return this; + }; + + /** + * Removes the node from its current parent and inserts it into + * a new parent before `otherNode`. + * + * This will also clean the node’s code style properties just as it would + * in {@link Node#moveTo}. + * + * @param {Node} otherNode - node that will be before current node + * + * @return {Node} current node to methods chain + */ + + + Node.prototype.moveBefore = function moveBefore(otherNode) { + this.cleanRaws(this.root() === otherNode.root()); + this.remove(); + otherNode.parent.insertBefore(otherNode, this); + return this; + }; + + /** + * Removes the node from its current parent and inserts it into + * a new parent after `otherNode`. + * + * This will also clean the node’s code style properties just as it would + * in {@link Node#moveTo}. + * + * @param {Node} otherNode - node that will be after current node + * + * @return {Node} current node to methods chain + */ + + + Node.prototype.moveAfter = function moveAfter(otherNode) { + this.cleanRaws(this.root() === otherNode.root()); + this.remove(); + otherNode.parent.insertAfter(otherNode, this); + return this; + }; + + /** + * Returns the next child of the node’s parent. + * Returns `undefined` if the current node is the last child. + * + * @return {Node|undefined} next node + * + * @example + * if ( comment.text === 'delete next' ) { + * const next = comment.next(); + * if ( next ) { + * next.remove(); + * } + * } + */ + + + Node.prototype.next = function next() { + var index = this.parent.index(this); + return this.parent.nodes[index + 1]; + }; + + /** + * Returns the previous child of the node’s parent. + * Returns `undefined` if the current node is the first child. + * + * @return {Node|undefined} previous node + * + * @example + * const annotation = decl.prev(); + * if ( annotation.type == 'comment' ) { + * readAnnotation(annotation.text); + * } + */ + + + Node.prototype.prev = function prev() { + var index = this.parent.index(this); + return this.parent.nodes[index - 1]; + }; + + Node.prototype.toJSON = function toJSON() { + var fixed = {}; + + for (var name in this) { + if (!this.hasOwnProperty(name)) continue; + if (name === 'parent') continue; + var value = this[name]; + + if (value instanceof Array) { + fixed[name] = value.map(function (i) { + if ((typeof i === 'undefined' ? 'undefined' : _typeof(i)) === 'object' && i.toJSON) { + return i.toJSON(); + } else { + return i; + } + }); + } else if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value.toJSON) { + fixed[name] = value.toJSON(); + } else { + fixed[name] = value; + } + } + + return fixed; + }; + + /** + * Returns a {@link Node#raws} value. If the node is missing + * the code style property (because the node was manually built or cloned), + * PostCSS will try to autodetect the code style property by looking + * at other nodes in the tree. + * + * @param {string} prop - name of code style property + * @param {string} [defaultType] - name of default value, it can be missed + * if the value is the same as prop + * + * @example + * const root = postcss.parse('a { background: white }'); + * root.nodes[0].append({ prop: 'color', value: 'black' }); + * root.nodes[0].nodes[1].raws.before //=> undefined + * root.nodes[0].nodes[1].raw('before') //=> ' ' + * + * @return {string} code style value + */ + + + Node.prototype.raw = function raw(prop, defaultType) { + var str = new _stringifier2.default(); + return str.raw(this, prop, defaultType); + }; + + /** + * Finds the Root instance of the node’s tree. + * + * @example + * root.nodes[0].nodes[0].root() === root + * + * @return {Root} root parent + */ + + + Node.prototype.root = function root() { + var result = this; + while (result.parent) { + result = result.parent; + }return result; + }; + + Node.prototype.cleanRaws = function cleanRaws(keepBetween) { + delete this.raws.before; + delete this.raws.after; + if (!keepBetween) delete this.raws.between; + }; + + Node.prototype.positionInside = function positionInside(index) { + var string = this.toString(); + var column = this.source.start.column; + var line = this.source.start.line; + + for (var i = 0; i < index; i++) { + if (string[i] === '\n') { + column = 1; + line += 1; + } else { + column += 1; + } + } + + return { line: line, column: column }; + }; + + Node.prototype.positionBy = function positionBy(opts) { + var pos = this.source.start; + if (opts.index) { + pos = this.positionInside(opts.index); + } else if (opts.word) { + var index = this.toString().indexOf(opts.word); + if (index !== -1) pos = this.positionInside(index); + } + return pos; + }; + + Node.prototype.removeSelf = function removeSelf() { + (0, _warnOnce2.default)('Node#removeSelf is deprecated. Use Node#remove.'); + return this.remove(); + }; + + Node.prototype.replace = function replace(nodes) { + (0, _warnOnce2.default)('Node#replace is deprecated. Use Node#replaceWith'); + return this.replaceWith(nodes); + }; + + Node.prototype.style = function style(own, detect) { + (0, _warnOnce2.default)('Node#style() is deprecated. Use Node#raw()'); + return this.raw(own, detect); + }; + + Node.prototype.cleanStyles = function cleanStyles(keepBetween) { + (0, _warnOnce2.default)('Node#cleanStyles() is deprecated. Use Node#cleanRaws()'); + return this.cleanRaws(keepBetween); + }; + + _createClass(Node, [{ + key: 'before', + get: function get() { + (0, _warnOnce2.default)('Node#before is deprecated. Use Node#raws.before'); + return this.raws.before; + }, + set: function set(val) { + (0, _warnOnce2.default)('Node#before is deprecated. Use Node#raws.before'); + this.raws.before = val; + } + }, { + key: 'between', + get: function get() { + (0, _warnOnce2.default)('Node#between is deprecated. Use Node#raws.between'); + return this.raws.between; + }, + set: function set(val) { + (0, _warnOnce2.default)('Node#between is deprecated. Use Node#raws.between'); + this.raws.between = val; + } + + /** + * @memberof Node# + * @member {string} type - String representing the node’s type. + * Possible values are `root`, `atrule`, `rule`, + * `decl`, or `comment`. + * + * @example + * postcss.decl({ prop: 'color', value: 'black' }).type //=> 'decl' + */ + + /** + * @memberof Node# + * @member {Container} parent - the node’s parent node. + * + * @example + * root.nodes[0].parent == root; + */ + + /** + * @memberof Node# + * @member {source} source - the input source of the node + * + * The property is used in source map generation. + * + * If you create a node manually (e.g., with `postcss.decl()`), + * that node will not have a `source` property and will be absent + * from the source map. For this reason, the plugin developer should + * consider cloning nodes to create new ones (in which case the new node’s + * source will reference the original, cloned node) or setting + * the `source` property manually. + * + * ```js + * // Bad + * const prefixed = postcss.decl({ + * prop: '-moz-' + decl.prop, + * value: decl.value + * }); + * + * // Good + * const prefixed = decl.clone({ prop: '-moz-' + decl.prop }); + * ``` + * + * ```js + * if ( atrule.name == 'add-link' ) { + * const rule = postcss.rule({ selector: 'a', source: atrule.source }); + * atrule.parent.insertBefore(atrule, rule); + * } + * ``` + * + * @example + * decl.source.input.from //=> '/home/ai/a.sass' + * decl.source.start //=> { line: 10, column: 2 } + * decl.source.end //=> { line: 10, column: 12 } + */ + + /** + * @memberof Node# + * @member {object} raws - Information to generate byte-to-byte equal + * node string as it was in the origin input. + * + * Every parser saves its own properties, + * but the default CSS parser uses: + * + * * `before`: the space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + * * `after`: the space symbols after the last child of the node + * to the end of the node. + * * `between`: the symbols between the property and value + * for declarations, selector and `{` for rules, or last parameter + * and `{` for at-rules. + * * `semicolon`: contains true if the last child has + * an (optional) semicolon. + * * `afterName`: the space between the at-rule name and its parameters. + * * `left`: the space symbols between `/*` and the comment’s text. + * * `right`: the space symbols between the comment’s text + * and */. + * * `important`: the content of the important statement, + * if it is not just `!important`. + * + * PostCSS cleans selectors, declaration values and at-rule parameters + * from comments and extra spaces, but it stores origin content in raws + * properties. As such, if you don’t change a declaration’s value, + * PostCSS will use the raw value with comments. + * + * @example + * const root = postcss.parse('a {\n color:black\n}') + * root.first.first.raws //=> { before: '\n ', between: ':' } + */ + + }]); + + return Node; +}(); + +exports.default = Node; +module.exports = exports['default']; + + +},{"./css-syntax-error":36,"./stringifier":51,"./stringify":52,"./warn-once":55}],43:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports.default = parse; + +var _parser = require('./parser'); + +var _parser2 = _interopRequireDefault(_parser); + +var _input = require('./input'); + +var _input2 = _interopRequireDefault(_input); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function parse(css, opts) { + if (opts && opts.safe) { + throw new Error('Option safe was removed. ' + 'Use parser: require("postcss-safe-parser")'); + } + + var input = new _input2.default(css, opts); + + var parser = new _parser2.default(input); + try { + parser.tokenize(); + parser.loop(); + } catch (e) { + if (e.name === 'CssSyntaxError' && opts && opts.from) { + if (/\.scss$/i.test(opts.from)) { + e.message += '\nYou tried to parse SCSS with ' + 'the standard CSS parser; ' + 'try again with the postcss-scss parser'; + } else if (/\.less$/i.test(opts.from)) { + e.message += '\nYou tried to parse Less with ' + 'the standard CSS parser; ' + 'try again with the postcss-less parser'; + } + } + throw e; + } + + return parser.root; +} +module.exports = exports['default']; + + +},{"./input":38,"./parser":44}],44:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _declaration = require('./declaration'); + +var _declaration2 = _interopRequireDefault(_declaration); + +var _tokenize = require('./tokenize'); + +var _tokenize2 = _interopRequireDefault(_tokenize); + +var _comment = require('./comment'); + +var _comment2 = _interopRequireDefault(_comment); + +var _atRule = require('./at-rule'); + +var _atRule2 = _interopRequireDefault(_atRule); + +var _root = require('./root'); + +var _root2 = _interopRequireDefault(_root); + +var _rule = require('./rule'); + +var _rule2 = _interopRequireDefault(_rule); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Parser = function () { + function Parser(input) { + _classCallCheck(this, Parser); + + this.input = input; + + this.pos = 0; + this.root = new _root2.default(); + this.current = this.root; + this.spaces = ''; + this.semicolon = false; + + this.root.source = { input: input, start: { line: 1, column: 1 } }; + } + + Parser.prototype.tokenize = function tokenize() { + this.tokens = (0, _tokenize2.default)(this.input); + }; + + Parser.prototype.loop = function loop() { + var token = void 0; + while (this.pos < this.tokens.length) { + token = this.tokens[this.pos]; + + switch (token[0]) { + case 'word': + case ':': + this.word(); + break; + + case '}': + this.end(token); + break; + + case 'comment': + this.comment(token); + break; + + case 'at-word': + this.atrule(token); + break; + + case '{': + this.emptyRule(token); + break; + + default: + this.spaces += token[1]; + break; + } + + this.pos += 1; + } + this.endFile(); + }; + + Parser.prototype.comment = function comment(token) { + var node = new _comment2.default(); + this.init(node, token[2], token[3]); + node.source.end = { line: token[4], column: token[5] }; + + var text = token[1].slice(2, -2); + if (/^\s*$/.test(text)) { + node.text = ''; + node.raws.left = text; + node.raws.right = ''; + } else { + var match = text.match(/^(\s*)([^]*[^\s])(\s*)$/); + node.text = match[2]; + node.raws.left = match[1]; + node.raws.right = match[3]; + } + }; + + Parser.prototype.emptyRule = function emptyRule(token) { + var node = new _rule2.default(); + this.init(node, token[2], token[3]); + node.selector = ''; + node.raws.between = ''; + this.current = node; + }; + + Parser.prototype.word = function word() { + var token = void 0; + var end = false; + var type = null; + var colon = false; + var bracket = null; + var brackets = 0; + + var start = this.pos; + this.pos += 1; + while (this.pos < this.tokens.length) { + token = this.tokens[this.pos]; + type = token[0]; + + if (type === '(') { + if (!bracket) bracket = token; + brackets += 1; + } else if (brackets === 0) { + if (type === ';') { + if (colon) { + this.decl(this.tokens.slice(start, this.pos + 1)); + return; + } else { + break; + } + } else if (type === '{') { + this.rule(this.tokens.slice(start, this.pos + 1)); + return; + } else if (type === '}') { + this.pos -= 1; + end = true; + break; + } else if (type === ':') { + colon = true; + } + } else if (type === ')') { + brackets -= 1; + if (brackets === 0) bracket = null; + } + + this.pos += 1; + } + if (this.pos === this.tokens.length) { + this.pos -= 1; + end = true; + } + + if (brackets > 0) this.unclosedBracket(bracket); + + if (end && colon) { + while (this.pos > start) { + token = this.tokens[this.pos][0]; + if (token !== 'space' && token !== 'comment') break; + this.pos -= 1; + } + this.decl(this.tokens.slice(start, this.pos + 1)); + return; + } + + this.unknownWord(start); + }; + + Parser.prototype.rule = function rule(tokens) { + tokens.pop(); + + var node = new _rule2.default(); + this.init(node, tokens[0][2], tokens[0][3]); + + node.raws.between = this.spacesFromEnd(tokens); + this.raw(node, 'selector', tokens); + this.current = node; + }; + + Parser.prototype.decl = function decl(tokens) { + var node = new _declaration2.default(); + this.init(node); + + var last = tokens[tokens.length - 1]; + if (last[0] === ';') { + this.semicolon = true; + tokens.pop(); + } + if (last[4]) { + node.source.end = { line: last[4], column: last[5] }; + } else { + node.source.end = { line: last[2], column: last[3] }; + } + + while (tokens[0][0] !== 'word') { + node.raws.before += tokens.shift()[1]; + } + node.source.start = { line: tokens[0][2], column: tokens[0][3] }; + + node.prop = ''; + while (tokens.length) { + var type = tokens[0][0]; + if (type === ':' || type === 'space' || type === 'comment') { + break; + } + node.prop += tokens.shift()[1]; + } + + node.raws.between = ''; + + var token = void 0; + while (tokens.length) { + token = tokens.shift(); + + if (token[0] === ':') { + node.raws.between += token[1]; + break; + } else { + node.raws.between += token[1]; + } + } + + if (node.prop[0] === '_' || node.prop[0] === '*') { + node.raws.before += node.prop[0]; + node.prop = node.prop.slice(1); + } + node.raws.between += this.spacesFromStart(tokens); + this.precheckMissedSemicolon(tokens); + + for (var i = tokens.length - 1; i > 0; i--) { + token = tokens[i]; + if (token[1] === '!important') { + node.important = true; + var string = this.stringFrom(tokens, i); + string = this.spacesFromEnd(tokens) + string; + if (string !== ' !important') node.raws.important = string; + break; + } else if (token[1] === 'important') { + var cache = tokens.slice(0); + var str = ''; + for (var j = i; j > 0; j--) { + var _type = cache[j][0]; + if (str.trim().indexOf('!') === 0 && _type !== 'space') { + break; + } + str = cache.pop()[1] + str; + } + if (str.trim().indexOf('!') === 0) { + node.important = true; + node.raws.important = str; + tokens = cache; + } + } + + if (token[0] !== 'space' && token[0] !== 'comment') { + break; + } + } + + this.raw(node, 'value', tokens); + + if (node.value.indexOf(':') !== -1) this.checkMissedSemicolon(tokens); + }; + + Parser.prototype.atrule = function atrule(token) { + var node = new _atRule2.default(); + node.name = token[1].slice(1); + if (node.name === '') { + this.unnamedAtrule(node, token); + } + this.init(node, token[2], token[3]); + + var last = false; + var open = false; + var params = []; + + this.pos += 1; + while (this.pos < this.tokens.length) { + token = this.tokens[this.pos]; + + if (token[0] === ';') { + node.source.end = { line: token[2], column: token[3] }; + this.semicolon = true; + break; + } else if (token[0] === '{') { + open = true; + break; + } else if (token[0] === '}') { + this.end(token); + break; + } else { + params.push(token); + } + + this.pos += 1; + } + if (this.pos === this.tokens.length) { + last = true; + } + + node.raws.between = this.spacesFromEnd(params); + if (params.length) { + node.raws.afterName = this.spacesFromStart(params); + this.raw(node, 'params', params); + if (last) { + token = params[params.length - 1]; + node.source.end = { line: token[4], column: token[5] }; + this.spaces = node.raws.between; + node.raws.between = ''; + } + } else { + node.raws.afterName = ''; + node.params = ''; + } + + if (open) { + node.nodes = []; + this.current = node; + } + }; + + Parser.prototype.end = function end(token) { + if (this.current.nodes && this.current.nodes.length) { + this.current.raws.semicolon = this.semicolon; + } + this.semicolon = false; + + this.current.raws.after = (this.current.raws.after || '') + this.spaces; + this.spaces = ''; + + if (this.current.parent) { + this.current.source.end = { line: token[2], column: token[3] }; + this.current = this.current.parent; + } else { + this.unexpectedClose(token); + } + }; + + Parser.prototype.endFile = function endFile() { + if (this.current.parent) this.unclosedBlock(); + if (this.current.nodes && this.current.nodes.length) { + this.current.raws.semicolon = this.semicolon; + } + this.current.raws.after = (this.current.raws.after || '') + this.spaces; + }; + + // Helpers + + Parser.prototype.init = function init(node, line, column) { + this.current.push(node); + + node.source = { start: { line: line, column: column }, input: this.input }; + node.raws.before = this.spaces; + this.spaces = ''; + if (node.type !== 'comment') this.semicolon = false; + }; + + Parser.prototype.raw = function raw(node, prop, tokens) { + var token = void 0, + type = void 0; + var length = tokens.length; + var value = ''; + var clean = true; + for (var i = 0; i < length; i += 1) { + token = tokens[i]; + type = token[0]; + if (type === 'comment' || type === 'space' && i === length - 1) { + clean = false; + } else { + value += token[1]; + } + } + if (!clean) { + var raw = tokens.reduce(function (all, i) { + return all + i[1]; + }, ''); + node.raws[prop] = { value: value, raw: raw }; + } + node[prop] = value; + }; + + Parser.prototype.spacesFromEnd = function spacesFromEnd(tokens) { + var lastTokenType = void 0; + var spaces = ''; + while (tokens.length) { + lastTokenType = tokens[tokens.length - 1][0]; + if (lastTokenType !== 'space' && lastTokenType !== 'comment') break; + spaces = tokens.pop()[1] + spaces; + } + return spaces; + }; + + Parser.prototype.spacesFromStart = function spacesFromStart(tokens) { + var next = void 0; + var spaces = ''; + while (tokens.length) { + next = tokens[0][0]; + if (next !== 'space' && next !== 'comment') break; + spaces += tokens.shift()[1]; + } + return spaces; + }; + + Parser.prototype.stringFrom = function stringFrom(tokens, from) { + var result = ''; + for (var i = from; i < tokens.length; i++) { + result += tokens[i][1]; + } + tokens.splice(from, tokens.length - from); + return result; + }; + + Parser.prototype.colon = function colon(tokens) { + var brackets = 0; + var token = void 0, + type = void 0, + prev = void 0; + for (var i = 0; i < tokens.length; i++) { + token = tokens[i]; + type = token[0]; + + if (type === '(') { + brackets += 1; + } else if (type === ')') { + brackets -= 1; + } else if (brackets === 0 && type === ':') { + if (!prev) { + this.doubleColon(token); + } else if (prev[0] === 'word' && prev[1] === 'progid') { + continue; + } else { + return i; + } + } + + prev = token; + } + return false; + }; + + // Errors + + Parser.prototype.unclosedBracket = function unclosedBracket(bracket) { + throw this.input.error('Unclosed bracket', bracket[2], bracket[3]); + }; + + Parser.prototype.unknownWord = function unknownWord(start) { + var token = this.tokens[start]; + throw this.input.error('Unknown word', token[2], token[3]); + }; + + Parser.prototype.unexpectedClose = function unexpectedClose(token) { + throw this.input.error('Unexpected }', token[2], token[3]); + }; + + Parser.prototype.unclosedBlock = function unclosedBlock() { + var pos = this.current.source.start; + throw this.input.error('Unclosed block', pos.line, pos.column); + }; + + Parser.prototype.doubleColon = function doubleColon(token) { + throw this.input.error('Double colon', token[2], token[3]); + }; + + Parser.prototype.unnamedAtrule = function unnamedAtrule(node, token) { + throw this.input.error('At-rule without name', token[2], token[3]); + }; + + Parser.prototype.precheckMissedSemicolon = function precheckMissedSemicolon(tokens) { + // Hook for Safe Parser + tokens; + }; + + Parser.prototype.checkMissedSemicolon = function checkMissedSemicolon(tokens) { + var colon = this.colon(tokens); + if (colon === false) return; + + var founded = 0; + var token = void 0; + for (var j = colon - 1; j >= 0; j--) { + token = tokens[j]; + if (token[0] !== 'space') { + founded += 1; + if (founded === 2) break; + } + } + throw this.input.error('Missed semicolon', token[2], token[3]); + }; + + return Parser; +}(); + +exports.default = Parser; +module.exports = exports['default']; + + +},{"./at-rule":33,"./comment":34,"./declaration":37,"./root":49,"./rule":50,"./tokenize":53}],45:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _declaration = require('./declaration'); + +var _declaration2 = _interopRequireDefault(_declaration); + +var _processor = require('./processor'); + +var _processor2 = _interopRequireDefault(_processor); + +var _stringify = require('./stringify'); + +var _stringify2 = _interopRequireDefault(_stringify); + +var _comment = require('./comment'); + +var _comment2 = _interopRequireDefault(_comment); + +var _atRule = require('./at-rule'); + +var _atRule2 = _interopRequireDefault(_atRule); + +var _vendor = require('./vendor'); + +var _vendor2 = _interopRequireDefault(_vendor); + +var _parse = require('./parse'); + +var _parse2 = _interopRequireDefault(_parse); + +var _list = require('./list'); + +var _list2 = _interopRequireDefault(_list); + +var _rule = require('./rule'); + +var _rule2 = _interopRequireDefault(_rule); + +var _root = require('./root'); + +var _root2 = _interopRequireDefault(_root); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Create a new {@link Processor} instance that will apply `plugins` + * as CSS processors. + * + * @param {Array.|Processor} plugins - PostCSS + * plugins. See {@link Processor#use} for plugin format. + * + * @return {Processor} Processor to process multiple CSS + * + * @example + * import postcss from 'postcss'; + * + * postcss(plugins).process(css, { from, to }).then(result => { + * console.log(result.css); + * }); + * + * @namespace postcss + */ +function postcss() { + for (var _len = arguments.length, plugins = Array(_len), _key = 0; _key < _len; _key++) { + plugins[_key] = arguments[_key]; + } + + if (plugins.length === 1 && Array.isArray(plugins[0])) { + plugins = plugins[0]; + } + return new _processor2.default(plugins); +} + +/** + * Creates a PostCSS plugin with a standard API. + * + * The newly-wrapped function will provide both the name and PostCSS + * version of the plugin. + * + * ```js + * const processor = postcss([replace]); + * processor.plugins[0].postcssPlugin //=> 'postcss-replace' + * processor.plugins[0].postcssVersion //=> '5.1.0' + * ``` + * + * The plugin function receives 2 arguments: {@link Root} + * and {@link Result} instance. The function should mutate the provided + * `Root` node. Alternatively, you can create a new `Root` node + * and override the `result.root` property. + * + * ```js + * const cleaner = postcss.plugin('postcss-cleaner', () => { + * return (css, result) => { + * result.root = postcss.root(); + * }; + * }); + * ``` + * + * As a convenience, plugins also expose a `process` method so that you can use + * them as standalone tools. + * + * ```js + * cleaner.process(css, options); + * // This is equivalent to: + * postcss([ cleaner(options) ]).process(css); + * ``` + * + * Asynchronous plugins should return a `Promise` instance. + * + * ```js + * postcss.plugin('postcss-import', () => { + * return (css, result) => { + * return new Promise( (resolve, reject) => { + * fs.readFile('base.css', (base) => { + * css.prepend(base); + * resolve(); + * }); + * }); + * }; + * }); + * ``` + * + * Add warnings using the {@link Node#warn} method. + * Send data to other plugins using the {@link Result#messages} array. + * + * ```js + * postcss.plugin('postcss-caniuse-test', () => { + * return (css, result) => { + * css.walkDecls(decl => { + * if ( !caniuse.support(decl.prop) ) { + * decl.warn(result, 'Some browsers do not support ' + decl.prop); + * } + * }); + * }; + * }); + * ``` + * + * @param {string} name - PostCSS plugin name. Same as in `name` + * property in `package.json`. It will be saved + * in `plugin.postcssPlugin` property. + * @param {function} initializer - will receive plugin options + * and should return {@link pluginFunction} + * + * @return {Plugin} PostCSS plugin + */ +postcss.plugin = function plugin(name, initializer) { + var creator = function creator() { + var transformer = initializer.apply(undefined, arguments); + transformer.postcssPlugin = name; + transformer.postcssVersion = new _processor2.default().version; + return transformer; + }; + + var cache = void 0; + Object.defineProperty(creator, 'postcss', { + get: function get() { + if (!cache) cache = creator(); + return cache; + } + }); + + creator.process = function (css, opts) { + return postcss([creator(opts)]).process(css, opts); + }; + + return creator; +}; + +/** + * Default function to convert a node tree into a CSS string. + * + * @param {Node} node - start node for stringifing. Usually {@link Root}. + * @param {builder} builder - function to concatenate CSS from node’s parts + * or generate string and source map + * + * @return {void} + * + * @function + */ +postcss.stringify = _stringify2.default; + +/** + * Parses source css and returns a new {@link Root} node, + * which contains the source CSS nodes. + * + * @param {string|toString} css - string with input CSS or any object + * with toString() method, like a Buffer + * @param {processOptions} [opts] - options with only `from` and `map` keys + * + * @return {Root} PostCSS AST + * + * @example + * // Simple CSS concatenation with source map support + * const root1 = postcss.parse(css1, { from: file1 }); + * const root2 = postcss.parse(css2, { from: file2 }); + * root1.append(root2).toResult().css; + * + * @function + */ +postcss.parse = _parse2.default; + +/** + * @member {vendor} - Contains the {@link vendor} module. + * + * @example + * postcss.vendor.unprefixed('-moz-tab') //=> ['tab'] + */ +postcss.vendor = _vendor2.default; + +/** + * @member {list} - Contains the {@link list} module. + * + * @example + * postcss.list.space('5px calc(10% + 5px)') //=> ['5px', 'calc(10% + 5px)'] + */ +postcss.list = _list2.default; + +/** + * Creates a new {@link Comment} node. + * + * @param {object} [defaults] - properties for the new node. + * + * @return {Comment} new Comment node + * + * @example + * postcss.comment({ text: 'test' }) + */ +postcss.comment = function (defaults) { + return new _comment2.default(defaults); +}; + +/** + * Creates a new {@link AtRule} node. + * + * @param {object} [defaults] - properties for the new node. + * + * @return {AtRule} new AtRule node + * + * @example + * postcss.atRule({ name: 'charset' }).toString() //=> "@charset" + */ +postcss.atRule = function (defaults) { + return new _atRule2.default(defaults); +}; + +/** + * Creates a new {@link Declaration} node. + * + * @param {object} [defaults] - properties for the new node. + * + * @return {Declaration} new Declaration node + * + * @example + * postcss.decl({ prop: 'color', value: 'red' }).toString() //=> "color: red" + */ +postcss.decl = function (defaults) { + return new _declaration2.default(defaults); +}; + +/** + * Creates a new {@link Rule} node. + * + * @param {object} [defaults] - properties for the new node. + * + * @return {AtRule} new Rule node + * + * @example + * postcss.rule({ selector: 'a' }).toString() //=> "a {\n}" + */ +postcss.rule = function (defaults) { + return new _rule2.default(defaults); +}; + +/** + * Creates a new {@link Root} node. + * + * @param {object} [defaults] - properties for the new node. + * + * @return {Root} new Root node + * + * @example + * postcss.root({ after: '\n' }).toString() //=> "\n" + */ +postcss.root = function (defaults) { + return new _root2.default(defaults); +}; + +exports.default = postcss; +module.exports = exports['default']; + + +},{"./at-rule":33,"./comment":34,"./declaration":37,"./list":40,"./parse":43,"./processor":47,"./root":49,"./rule":50,"./stringify":52,"./vendor":54}],46:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; + +var _jsBase = require('js-base64'); + +var _sourceMap = require('source-map'); + +var _sourceMap2 = _interopRequireDefault(_sourceMap); + +var _path = require('path'); + +var _path2 = _interopRequireDefault(_path); + +var _fs = require('fs'); + +var _fs2 = _interopRequireDefault(_fs); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * Source map information from input CSS. + * For example, source map after Sass compiler. + * + * This class will automatically find source map in input CSS or in file system + * near input file (according `from` option). + * + * @example + * const root = postcss.parse(css, { from: 'a.sass.css' }); + * root.input.map //=> PreviousMap + */ +var PreviousMap = function () { + + /** + * @param {string} css - input CSS source + * @param {processOptions} [opts] - {@link Processor#process} options + */ + function PreviousMap(css, opts) { + _classCallCheck(this, PreviousMap); + + this.loadAnnotation(css); + /** + * @member {boolean} - Was source map inlined by data-uri to input CSS. + */ + this.inline = this.startWith(this.annotation, 'data:'); + + var prev = opts.map ? opts.map.prev : undefined; + var text = this.loadMap(opts.from, prev); + if (text) this.text = text; + } + + /** + * Create a instance of `SourceMapGenerator` class + * from the `source-map` library to work with source map information. + * + * It is lazy method, so it will create object only on first call + * and then it will use cache. + * + * @return {SourceMapGenerator} object woth source map information + */ + + + PreviousMap.prototype.consumer = function consumer() { + if (!this.consumerCache) { + this.consumerCache = new _sourceMap2.default.SourceMapConsumer(this.text); + } + return this.consumerCache; + }; + + /** + * Does source map contains `sourcesContent` with input source text. + * + * @return {boolean} Is `sourcesContent` present + */ + + + PreviousMap.prototype.withContent = function withContent() { + return !!(this.consumer().sourcesContent && this.consumer().sourcesContent.length > 0); + }; + + PreviousMap.prototype.startWith = function startWith(string, start) { + if (!string) return false; + return string.substr(0, start.length) === start; + }; + + PreviousMap.prototype.loadAnnotation = function loadAnnotation(css) { + var match = css.match(/\/\*\s*# sourceMappingURL=(.*)\s*\*\//); + if (match) this.annotation = match[1].trim(); + }; + + PreviousMap.prototype.decodeInline = function decodeInline(text) { + var utfd64 = 'data:application/json;charset=utf-8;base64,'; + var utf64 = 'data:application/json;charset=utf8;base64,'; + var b64 = 'data:application/json;base64,'; + var uri = 'data:application/json,'; + + if (this.startWith(text, uri)) { + return decodeURIComponent(text.substr(uri.length)); + } else if (this.startWith(text, b64)) { + return _jsBase.Base64.decode(text.substr(b64.length)); + } else if (this.startWith(text, utf64)) { + return _jsBase.Base64.decode(text.substr(utf64.length)); + } else if (this.startWith(text, utfd64)) { + return _jsBase.Base64.decode(text.substr(utfd64.length)); + } else { + var encoding = text.match(/data:application\/json;([^,]+),/)[1]; + throw new Error('Unsupported source map encoding ' + encoding); + } + }; + + PreviousMap.prototype.loadMap = function loadMap(file, prev) { + if (prev === false) return false; + + if (prev) { + if (typeof prev === 'string') { + return prev; + } else if (typeof prev === 'function') { + var prevPath = prev(file); + if (prevPath && _fs2.default.existsSync && _fs2.default.existsSync(prevPath)) { + return _fs2.default.readFileSync(prevPath, 'utf-8').toString().trim(); + } else { + throw new Error('Unable to load previous source map: ' + prevPath.toString()); + } + } else if (prev instanceof _sourceMap2.default.SourceMapConsumer) { + return _sourceMap2.default.SourceMapGenerator.fromSourceMap(prev).toString(); + } else if (prev instanceof _sourceMap2.default.SourceMapGenerator) { + return prev.toString(); + } else if (this.isMap(prev)) { + return JSON.stringify(prev); + } else { + throw new Error('Unsupported previous source map format: ' + prev.toString()); + } + } else if (this.inline) { + return this.decodeInline(this.annotation); + } else if (this.annotation) { + var map = this.annotation; + if (file) map = _path2.default.join(_path2.default.dirname(file), map); + + this.root = _path2.default.dirname(map); + if (_fs2.default.existsSync && _fs2.default.existsSync(map)) { + return _fs2.default.readFileSync(map, 'utf-8').toString().trim(); + } else { + return false; + } + } + }; + + PreviousMap.prototype.isMap = function isMap(map) { + if ((typeof map === 'undefined' ? 'undefined' : _typeof(map)) !== 'object') return false; + return typeof map.mappings === 'string' || typeof map._mappings === 'string'; + }; + + return PreviousMap; +}(); + +exports.default = PreviousMap; +module.exports = exports['default']; + + +},{"fs":undefined,"js-base64":23,"path":undefined,"source-map":67}],47:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; + +var _lazyResult = require('./lazy-result'); + +var _lazyResult2 = _interopRequireDefault(_lazyResult); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * @callback builder + * @param {string} part - part of generated CSS connected to this node + * @param {Node} node - AST node + * @param {"start"|"end"} [type] - node’s part type + */ + +/** + * @callback parser + * + * @param {string|toString} css - string with input CSS or any object + * with toString() method, like a Buffer + * @param {processOptions} [opts] - options with only `from` and `map` keys + * + * @return {Root} PostCSS AST + */ + +/** + * @callback stringifier + * + * @param {Node} node - start node for stringifing. Usually {@link Root}. + * @param {builder} builder - function to concatenate CSS from node’s parts + * or generate string and source map + * + * @return {void} + */ + +/** + * @typedef {object} syntax + * @property {parser} parse - function to generate AST by string + * @property {stringifier} stringify - function to generate string by AST + */ + +/** + * @typedef {object} toString + * @property {function} toString + */ + +/** + * @callback pluginFunction + * @param {Root} root - parsed input CSS + * @param {Result} result - result to set warnings or check other plugins + */ + +/** + * @typedef {object} Plugin + * @property {function} postcss - PostCSS plugin function + */ + +/** + * @typedef {object} processOptions + * @property {string} from - the path of the CSS source file. + * You should always set `from`, + * because it is used in source map + * generation and syntax error messages. + * @property {string} to - the path where you’ll put the output + * CSS file. You should always set `to` + * to generate correct source maps. + * @property {parser} parser - function to generate AST by string + * @property {stringifier} stringifier - class to generate string by AST + * @property {syntax} syntax - object with `parse` and `stringify` + * @property {object} map - source map options + * @property {boolean} map.inline - does source map should + * be embedded in the output + * CSS as a base64-encoded + * comment + * @property {string|object|false|function} map.prev - source map content + * from a previous + * processing step + * (for example, Sass). + * PostCSS will try to find + * previous map + * automatically, so you + * could disable it by + * `false` value. + * @property {boolean} map.sourcesContent - does PostCSS should set + * the origin content to map + * @property {string|false} map.annotation - does PostCSS should set + * annotation comment to map + * @property {string} map.from - override `from` in map’s + * `sources` + */ + +/** + * Contains plugins to process CSS. Create one `Processor` instance, + * initialize its plugins, and then use that instance on numerous CSS files. + * + * @example + * const processor = postcss([autoprefixer, precss]); + * processor.process(css1).then(result => console.log(result.css)); + * processor.process(css2).then(result => console.log(result.css)); + */ +var Processor = function () { + + /** + * @param {Array.|Processor} plugins - PostCSS + * plugins. See {@link Processor#use} for plugin format. + */ + function Processor() { + var plugins = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; + + _classCallCheck(this, Processor); + + /** + * @member {string} - Current PostCSS version. + * + * @example + * if ( result.processor.version.split('.')[0] !== '5' ) { + * throw new Error('This plugin works only with PostCSS 5'); + * } + */ + this.version = '5.1.2'; + /** + * @member {pluginFunction[]} - Plugins added to this processor. + * + * @example + * const processor = postcss([autoprefixer, precss]); + * processor.plugins.length //=> 2 + */ + this.plugins = this.normalize(plugins); + } + + /** + * Adds a plugin to be used as a CSS processor. + * + * PostCSS plugin can be in 4 formats: + * * A plugin created by {@link postcss.plugin} method. + * * A function. PostCSS will pass the function a @{link Root} + * as the first argument and current {@link Result} instance + * as the second. + * * An object with a `postcss` method. PostCSS will use that method + * as described in #2. + * * Another {@link Processor} instance. PostCSS will copy plugins + * from that instance into this one. + * + * Plugins can also be added by passing them as arguments when creating + * a `postcss` instance (see [`postcss(plugins)`]). + * + * Asynchronous plugins should return a `Promise` instance. + * + * @param {Plugin|pluginFunction|Processor} plugin - PostCSS plugin + * or {@link Processor} + * with plugins + * + * @example + * const processor = postcss() + * .use(autoprefixer) + * .use(precss); + * + * @return {Processes} current processor to make methods chain + */ + + + Processor.prototype.use = function use(plugin) { + this.plugins = this.plugins.concat(this.normalize([plugin])); + return this; + }; + + /** + * Parses source CSS and returns a {@link LazyResult} Promise proxy. + * Because some plugins can be asynchronous it doesn’t make + * any transformations. Transformations will be applied + * in the {@link LazyResult} methods. + * + * @param {string|toString|Result} css - String with input CSS or + * any object with a `toString()` + * method, like a Buffer. + * Optionally, send a {@link Result} + * instance and the processor will + * take the {@link Root} from it. + * @param {processOptions} [opts] - options + * + * @return {LazyResult} Promise proxy + * + * @example + * processor.process(css, { from: 'a.css', to: 'a.out.css' }) + * .then(result => { + * console.log(result.css); + * }); + */ + + + Processor.prototype.process = function process(css) { + var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + return new _lazyResult2.default(this, css, opts); + }; + + Processor.prototype.normalize = function normalize(plugins) { + var normalized = []; + for (var _iterator = plugins, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var i = _ref; + + if (i.postcss) i = i.postcss; + + if ((typeof i === 'undefined' ? 'undefined' : _typeof(i)) === 'object' && Array.isArray(i.plugins)) { + normalized = normalized.concat(i.plugins); + } else if (typeof i === 'function') { + normalized.push(i); + } else { + throw new Error(i + ' is not a PostCSS plugin'); + } + } + return normalized; + }; + + return Processor; +}(); + +exports.default = Processor; +module.exports = exports['default']; + + +},{"./lazy-result":39}],48:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _warning = require('./warning'); + +var _warning2 = _interopRequireDefault(_warning); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * @typedef {object} Message + * @property {string} type - message type + * @property {string} plugin - source PostCSS plugin name + */ + +/** + * Provides the result of the PostCSS transformations. + * + * A Result instance is returned by {@link LazyResult#then} + * or {@link Root#toResult} methods. + * + * @example + * postcss([cssnext]).process(css).then(function (result) { + * console.log(result.css); + * }); + * + * @example + * var result2 = postcss.parse(css).toResult(); + */ +var Result = function () { + + /** + * @param {Processor} processor - processor used for this transformation. + * @param {Root} root - Root node after all transformations. + * @param {processOptions} opts - options from the {@link Processor#process} + * or {@link Root#toResult} + */ + function Result(processor, root, opts) { + _classCallCheck(this, Result); + + /** + * @member {Processor} - The Processor instance used + * for this transformation. + * + * @example + * for ( let plugin of result.processor.plugins) { + * if ( plugin.postcssPlugin === 'postcss-bad' ) { + * throw 'postcss-good is incompatible with postcss-bad'; + * } + * }); + */ + this.processor = processor; + /** + * @member {Message[]} - Contains messages from plugins + * (e.g., warnings or custom messages). + * Each message should have type + * and plugin properties. + * + * @example + * postcss.plugin('postcss-min-browser', () => { + * return (css, result) => { + * var browsers = detectMinBrowsersByCanIUse(css); + * result.messages.push({ + * type: 'min-browser', + * plugin: 'postcss-min-browser', + * browsers: browsers + * }); + * }; + * }); + */ + this.messages = []; + /** + * @member {Root} - Root node after all transformations. + * + * @example + * root.toResult().root == root; + */ + this.root = root; + /** + * @member {processOptions} - Options from the {@link Processor#process} + * or {@link Root#toResult} call + * that produced this Result instance. + * + * @example + * root.toResult(opts).opts == opts; + */ + this.opts = opts; + /** + * @member {string} - A CSS string representing of {@link Result#root}. + * + * @example + * postcss.parse('a{}').toResult().css //=> "a{}" + */ + this.css = undefined; + /** + * @member {SourceMapGenerator} - An instance of `SourceMapGenerator` + * class from the `source-map` library, + * representing changes + * to the {@link Result#root} instance. + * + * @example + * result.map.toJSON() //=> { version: 3, file: 'a.css', … } + * + * @example + * if ( result.map ) { + * fs.writeFileSync(result.opts.to + '.map', result.map.toString()); + * } + */ + this.map = undefined; + } + + /** + * Returns for @{link Result#css} content. + * + * @example + * result + '' === result.css + * + * @return {string} string representing of {@link Result#root} + */ + + + Result.prototype.toString = function toString() { + return this.css; + }; + + /** + * Creates an instance of {@link Warning} and adds it + * to {@link Result#messages}. + * + * @param {string} text - warning message + * @param {Object} [opts] - warning options + * @param {Node} opts.node - CSS node that caused the warning + * @param {string} opts.word - word in CSS source that caused the warning + * @param {number} opts.index - index in CSS node string that caused + * the warning + * @param {string} opts.plugin - name of the plugin that created + * this warning. {@link Result#warn} fills + * this property automatically. + * + * @return {Warning} created warning + */ + + + Result.prototype.warn = function warn(text) { + var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + if (!opts.plugin) { + if (this.lastPlugin && this.lastPlugin.postcssPlugin) { + opts.plugin = this.lastPlugin.postcssPlugin; + } + } + + var warning = new _warning2.default(text, opts); + this.messages.push(warning); + + return warning; + }; + + /** + * Returns warnings from plugins. Filters {@link Warning} instances + * from {@link Result#messages}. + * + * @example + * result.warnings().forEach(warn => { + * console.warn(warn.toString()); + * }); + * + * @return {Warning[]} warnings from plugins + */ + + + Result.prototype.warnings = function warnings() { + return this.messages.filter(function (i) { + return i.type === 'warning'; + }); + }; + + /** + * An alias for the {@link Result#css} property. + * Use it with syntaxes that generate non-CSS output. + * @type {string} + * + * @example + * result.css === result.content; + */ + + + _createClass(Result, [{ + key: 'content', + get: function get() { + return this.css; + } + }]); + + return Result; +}(); + +exports.default = Result; +module.exports = exports['default']; + + +},{"./warning":56}],49:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _container = require('./container'); + +var _container2 = _interopRequireDefault(_container); + +var _warnOnce = require('./warn-once'); + +var _warnOnce2 = _interopRequireDefault(_warnOnce); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +/** + * Represents a CSS file and contains all its parsed nodes. + * + * @extends Container + * + * @example + * const root = postcss.parse('a{color:black} b{z-index:2}'); + * root.type //=> 'root' + * root.nodes.length //=> 2 + */ +var Root = function (_Container) { + _inherits(Root, _Container); + + function Root(defaults) { + _classCallCheck(this, Root); + + var _this = _possibleConstructorReturn(this, _Container.call(this, defaults)); + + _this.type = 'root'; + if (!_this.nodes) _this.nodes = []; + return _this; + } + + Root.prototype.removeChild = function removeChild(child) { + child = this.index(child); + + if (child === 0 && this.nodes.length > 1) { + this.nodes[1].raws.before = this.nodes[child].raws.before; + } + + return _Container.prototype.removeChild.call(this, child); + }; + + Root.prototype.normalize = function normalize(child, sample, type) { + var nodes = _Container.prototype.normalize.call(this, child); + + if (sample) { + if (type === 'prepend') { + if (this.nodes.length > 1) { + sample.raws.before = this.nodes[1].raws.before; + } else { + delete sample.raws.before; + } + } else if (this.first !== sample) { + for (var _iterator = nodes, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var node = _ref; + + node.raws.before = sample.raws.before; + } + } + } + + return nodes; + }; + + /** + * Returns a {@link Result} instance representing the root’s CSS. + * + * @param {processOptions} [opts] - options with only `to` and `map` keys + * + * @return {Result} result with current root’s CSS + * + * @example + * const root1 = postcss.parse(css1, { from: 'a.css' }); + * const root2 = postcss.parse(css2, { from: 'b.css' }); + * root1.append(root2); + * const result = root1.toResult({ to: 'all.css', map: true }); + */ + + + Root.prototype.toResult = function toResult() { + var opts = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + var LazyResult = require('./lazy-result'); + var Processor = require('./processor'); + + var lazy = new LazyResult(new Processor(), this, opts); + return lazy.stringify(); + }; + + Root.prototype.remove = function remove(child) { + (0, _warnOnce2.default)('Root#remove is deprecated. Use Root#removeChild'); + this.removeChild(child); + }; + + Root.prototype.prevMap = function prevMap() { + (0, _warnOnce2.default)('Root#prevMap is deprecated. Use Root#source.input.map'); + return this.source.input.map; + }; + + /** + * @memberof Root# + * @member {object} raws - Information to generate byte-to-byte equal + * node string as it was in the origin input. + * + * Every parser saves its own properties, + * but the default CSS parser uses: + * + * * `after`: the space symbols after the last child to the end of file. + * * `semicolon`: is the last child has an (optional) semicolon. + * + * @example + * postcss.parse('a {}\n').raws //=> { after: '\n' } + * postcss.parse('a {}').raws //=> { after: '' } + */ + + return Root; +}(_container2.default); + +exports.default = Root; +module.exports = exports['default']; + + +},{"./container":35,"./lazy-result":39,"./processor":47,"./warn-once":55}],50:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _container = require('./container'); + +var _container2 = _interopRequireDefault(_container); + +var _warnOnce = require('./warn-once'); + +var _warnOnce2 = _interopRequireDefault(_warnOnce); + +var _list = require('./list'); + +var _list2 = _interopRequireDefault(_list); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +/** + * Represents a CSS rule: a selector followed by a declaration block. + * + * @extends Container + * + * @example + * const root = postcss.parse('a{}'); + * const rule = root.first; + * rule.type //=> 'rule' + * rule.toString() //=> 'a{}' + */ +var Rule = function (_Container) { + _inherits(Rule, _Container); + + function Rule(defaults) { + _classCallCheck(this, Rule); + + var _this = _possibleConstructorReturn(this, _Container.call(this, defaults)); + + _this.type = 'rule'; + if (!_this.nodes) _this.nodes = []; + return _this; + } + + /** + * An array containing the rule’s individual selectors. + * Groups of selectors are split at commas. + * + * @type {string[]} + * + * @example + * const root = postcss.parse('a, b { }'); + * const rule = root.first; + * + * rule.selector //=> 'a, b' + * rule.selectors //=> ['a', 'b'] + * + * rule.selectors = ['a', 'strong']; + * rule.selector //=> 'a, strong' + */ + + + _createClass(Rule, [{ + key: 'selectors', + get: function get() { + return _list2.default.comma(this.selector); + }, + set: function set(values) { + var match = this.selector ? this.selector.match(/,\s*/) : null; + var sep = match ? match[0] : ',' + this.raw('between', 'beforeOpen'); + this.selector = values.join(sep); + } + }, { + key: '_selector', + get: function get() { + (0, _warnOnce2.default)('Rule#_selector is deprecated. Use Rule#raws.selector'); + return this.raws.selector; + }, + set: function set(val) { + (0, _warnOnce2.default)('Rule#_selector is deprecated. Use Rule#raws.selector'); + this.raws.selector = val; + } + + /** + * @memberof Rule# + * @member {string} selector - the rule’s full selector represented + * as a string + * + * @example + * const root = postcss.parse('a, b { }'); + * const rule = root.first; + * rule.selector //=> 'a, b' + */ + + /** + * @memberof Rule# + * @member {object} raws - Information to generate byte-to-byte equal + * node string as it was in the origin input. + * + * Every parser saves its own properties, + * but the default CSS parser uses: + * + * * `before`: the space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + * * `after`: the space symbols after the last child of the node + * to the end of the node. + * * `between`: the symbols between the property and value + * for declarations, selector and `{` for rules, or last parameter + * and `{` for at-rules. + * * `semicolon`: contains true if the last child has + * an (optional) semicolon. + * + * PostCSS cleans selectors from comments and extra spaces, + * but it stores origin content in raws properties. + * As such, if you don’t change a declaration’s value, + * PostCSS will use the raw value with comments. + * + * @example + * const root = postcss.parse('a {\n color:black\n}') + * root.first.first.raws //=> { before: '', between: ' ', after: '\n' } + */ + + }]); + + return Rule; +}(_container2.default); + +exports.default = Rule; +module.exports = exports['default']; + + +},{"./container":35,"./list":40,"./warn-once":55}],51:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/* eslint-disable valid-jsdoc */ + +var defaultRaw = { + colon: ': ', + indent: ' ', + beforeDecl: '\n', + beforeRule: '\n', + beforeOpen: ' ', + beforeClose: '\n', + beforeComment: '\n', + after: '\n', + emptyBody: '', + commentLeft: ' ', + commentRight: ' ' +}; + +function capitalize(str) { + return str[0].toUpperCase() + str.slice(1); +} + +var Stringifier = function () { + function Stringifier(builder) { + _classCallCheck(this, Stringifier); + + this.builder = builder; + } + + Stringifier.prototype.stringify = function stringify(node, semicolon) { + this[node.type](node, semicolon); + }; + + Stringifier.prototype.root = function root(node) { + this.body(node); + if (node.raws.after) this.builder(node.raws.after); + }; + + Stringifier.prototype.comment = function comment(node) { + var left = this.raw(node, 'left', 'commentLeft'); + var right = this.raw(node, 'right', 'commentRight'); + this.builder('/*' + left + node.text + right + '*/', node); + }; + + Stringifier.prototype.decl = function decl(node, semicolon) { + var between = this.raw(node, 'between', 'colon'); + var string = node.prop + between + this.rawValue(node, 'value'); + + if (node.important) { + string += node.raws.important || ' !important'; + } + + if (semicolon) string += ';'; + this.builder(string, node); + }; + + Stringifier.prototype.rule = function rule(node) { + this.block(node, this.rawValue(node, 'selector')); + }; + + Stringifier.prototype.atrule = function atrule(node, semicolon) { + var name = '@' + node.name; + var params = node.params ? this.rawValue(node, 'params') : ''; + + if (typeof node.raws.afterName !== 'undefined') { + name += node.raws.afterName; + } else if (params) { + name += ' '; + } + + if (node.nodes) { + this.block(node, name + params); + } else { + var end = (node.raws.between || '') + (semicolon ? ';' : ''); + this.builder(name + params + end, node); + } + }; + + Stringifier.prototype.body = function body(node) { + var last = node.nodes.length - 1; + while (last > 0) { + if (node.nodes[last].type !== 'comment') break; + last -= 1; + } + + var semicolon = this.raw(node, 'semicolon'); + for (var i = 0; i < node.nodes.length; i++) { + var child = node.nodes[i]; + var before = this.raw(child, 'before'); + if (before) this.builder(before); + this.stringify(child, last !== i || semicolon); + } + }; + + Stringifier.prototype.block = function block(node, start) { + var between = this.raw(node, 'between', 'beforeOpen'); + this.builder(start + between + '{', node, 'start'); + + var after = void 0; + if (node.nodes && node.nodes.length) { + this.body(node); + after = this.raw(node, 'after'); + } else { + after = this.raw(node, 'after', 'emptyBody'); + } + + if (after) this.builder(after); + this.builder('}', node, 'end'); + }; + + Stringifier.prototype.raw = function raw(node, own, detect) { + var value = void 0; + if (!detect) detect = own; + + // Already had + if (own) { + value = node.raws[own]; + if (typeof value !== 'undefined') return value; + } + + var parent = node.parent; + + // Hack for first rule in CSS + if (detect === 'before') { + if (!parent || parent.type === 'root' && parent.first === node) { + return ''; + } + } + + // Floating child without parent + if (!parent) return defaultRaw[detect]; + + // Detect style by other nodes + var root = node.root(); + if (!root.rawCache) root.rawCache = {}; + if (typeof root.rawCache[detect] !== 'undefined') { + return root.rawCache[detect]; + } + + if (detect === 'before' || detect === 'after') { + return this.beforeAfter(node, detect); + } else { + var method = 'raw' + capitalize(detect); + if (this[method]) { + value = this[method](root, node); + } else { + root.walk(function (i) { + value = i.raws[own]; + if (typeof value !== 'undefined') return false; + }); + } + } + + if (typeof value === 'undefined') value = defaultRaw[detect]; + + root.rawCache[detect] = value; + return value; + }; + + Stringifier.prototype.rawSemicolon = function rawSemicolon(root) { + var value = void 0; + root.walk(function (i) { + if (i.nodes && i.nodes.length && i.last.type === 'decl') { + value = i.raws.semicolon; + if (typeof value !== 'undefined') return false; + } + }); + return value; + }; + + Stringifier.prototype.rawEmptyBody = function rawEmptyBody(root) { + var value = void 0; + root.walk(function (i) { + if (i.nodes && i.nodes.length === 0) { + value = i.raws.after; + if (typeof value !== 'undefined') return false; + } + }); + return value; + }; + + Stringifier.prototype.rawIndent = function rawIndent(root) { + if (root.raws.indent) return root.raws.indent; + var value = void 0; + root.walk(function (i) { + var p = i.parent; + if (p && p !== root && p.parent && p.parent === root) { + if (typeof i.raws.before !== 'undefined') { + var parts = i.raws.before.split('\n'); + value = parts[parts.length - 1]; + value = value.replace(/[^\s]/g, ''); + return false; + } + } + }); + return value; + }; + + Stringifier.prototype.rawBeforeComment = function rawBeforeComment(root, node) { + var value = void 0; + root.walkComments(function (i) { + if (typeof i.raws.before !== 'undefined') { + value = i.raws.before; + if (value.indexOf('\n') !== -1) { + value = value.replace(/[^\n]+$/, ''); + } + return false; + } + }); + if (typeof value === 'undefined') { + value = this.raw(node, null, 'beforeDecl'); + } + return value; + }; + + Stringifier.prototype.rawBeforeDecl = function rawBeforeDecl(root, node) { + var value = void 0; + root.walkDecls(function (i) { + if (typeof i.raws.before !== 'undefined') { + value = i.raws.before; + if (value.indexOf('\n') !== -1) { + value = value.replace(/[^\n]+$/, ''); + } + return false; + } + }); + if (typeof value === 'undefined') { + value = this.raw(node, null, 'beforeRule'); + } + return value; + }; + + Stringifier.prototype.rawBeforeRule = function rawBeforeRule(root) { + var value = void 0; + root.walk(function (i) { + if (i.nodes && (i.parent !== root || root.first !== i)) { + if (typeof i.raws.before !== 'undefined') { + value = i.raws.before; + if (value.indexOf('\n') !== -1) { + value = value.replace(/[^\n]+$/, ''); + } + return false; + } + } + }); + return value; + }; + + Stringifier.prototype.rawBeforeClose = function rawBeforeClose(root) { + var value = void 0; + root.walk(function (i) { + if (i.nodes && i.nodes.length > 0) { + if (typeof i.raws.after !== 'undefined') { + value = i.raws.after; + if (value.indexOf('\n') !== -1) { + value = value.replace(/[^\n]+$/, ''); + } + return false; + } + } + }); + return value; + }; + + Stringifier.prototype.rawBeforeOpen = function rawBeforeOpen(root) { + var value = void 0; + root.walk(function (i) { + if (i.type !== 'decl') { + value = i.raws.between; + if (typeof value !== 'undefined') return false; + } + }); + return value; + }; + + Stringifier.prototype.rawColon = function rawColon(root) { + var value = void 0; + root.walkDecls(function (i) { + if (typeof i.raws.between !== 'undefined') { + value = i.raws.between.replace(/[^\s:]/g, ''); + return false; + } + }); + return value; + }; + + Stringifier.prototype.beforeAfter = function beforeAfter(node, detect) { + var value = void 0; + if (node.type === 'decl') { + value = this.raw(node, null, 'beforeDecl'); + } else if (node.type === 'comment') { + value = this.raw(node, null, 'beforeComment'); + } else if (detect === 'before') { + value = this.raw(node, null, 'beforeRule'); + } else { + value = this.raw(node, null, 'beforeClose'); + } + + var buf = node.parent; + var depth = 0; + while (buf && buf.type !== 'root') { + depth += 1; + buf = buf.parent; + } + + if (value.indexOf('\n') !== -1) { + var indent = this.raw(node, null, 'indent'); + if (indent.length) { + for (var step = 0; step < depth; step++) { + value += indent; + } + } + } + + return value; + }; + + Stringifier.prototype.rawValue = function rawValue(node, prop) { + var value = node[prop]; + var raw = node.raws[prop]; + if (raw && raw.value === value) { + return raw.raw; + } else { + return value; + } + }; + + return Stringifier; +}(); + +exports.default = Stringifier; +module.exports = exports['default']; + + +},{}],52:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports.default = stringify; + +var _stringifier = require('./stringifier'); + +var _stringifier2 = _interopRequireDefault(_stringifier); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function stringify(node, builder) { + var str = new _stringifier2.default(builder); + str.stringify(node); +} +module.exports = exports['default']; + + +},{"./stringifier":51}],53:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports.default = tokenize; +var SINGLE_QUOTE = 39; +var DOUBLE_QUOTE = 34; +var BACKSLASH = 92; +var SLASH = 47; +var NEWLINE = 10; +var SPACE = 32; +var FEED = 12; +var TAB = 9; +var CR = 13; +var OPEN_PARENTHESES = 40; +var CLOSE_PARENTHESES = 41; +var OPEN_CURLY = 123; +var CLOSE_CURLY = 125; +var SEMICOLON = 59; +var ASTERICK = 42; +var COLON = 58; +var AT = 64; + +var RE_AT_END = /[ \n\t\r\f\{\(\)'"\\;/]/g; +var RE_WORD_END = /[ \n\t\r\f\(\)\{\}:;@!'"\\]|\/(?=\*)/g; +var RE_BAD_BRACKET = /.[\\\/\("'\n]/; + +function tokenize(input) { + var tokens = []; + var css = input.css.valueOf(); + + var code = void 0, + next = void 0, + quote = void 0, + lines = void 0, + last = void 0, + content = void 0, + escape = void 0, + nextLine = void 0, + nextOffset = void 0, + escaped = void 0, + escapePos = void 0, + prev = void 0, + n = void 0; + + var length = css.length; + var offset = -1; + var line = 1; + var pos = 0; + + function unclosed(what) { + throw input.error('Unclosed ' + what, line, pos - offset); + } + + while (pos < length) { + code = css.charCodeAt(pos); + + if (code === NEWLINE || code === FEED || code === CR && css.charCodeAt(pos + 1) !== NEWLINE) { + offset = pos; + line += 1; + } + + switch (code) { + case NEWLINE: + case SPACE: + case TAB: + case CR: + case FEED: + next = pos; + do { + next += 1; + code = css.charCodeAt(next); + if (code === NEWLINE) { + offset = next; + line += 1; + } + } while (code === SPACE || code === NEWLINE || code === TAB || code === CR || code === FEED); + + tokens.push(['space', css.slice(pos, next)]); + pos = next - 1; + break; + + case OPEN_CURLY: + tokens.push(['{', '{', line, pos - offset]); + break; + + case CLOSE_CURLY: + tokens.push(['}', '}', line, pos - offset]); + break; + + case COLON: + tokens.push([':', ':', line, pos - offset]); + break; + + case SEMICOLON: + tokens.push([';', ';', line, pos - offset]); + break; + + case OPEN_PARENTHESES: + prev = tokens.length ? tokens[tokens.length - 1][1] : ''; + n = css.charCodeAt(pos + 1); + if (prev === 'url' && n !== SINGLE_QUOTE && n !== DOUBLE_QUOTE && n !== SPACE && n !== NEWLINE && n !== TAB && n !== FEED && n !== CR) { + next = pos; + do { + escaped = false; + next = css.indexOf(')', next + 1); + if (next === -1) unclosed('bracket'); + escapePos = next; + while (css.charCodeAt(escapePos - 1) === BACKSLASH) { + escapePos -= 1; + escaped = !escaped; + } + } while (escaped); + + tokens.push(['brackets', css.slice(pos, next + 1), line, pos - offset, line, next - offset]); + pos = next; + } else { + next = css.indexOf(')', pos + 1); + content = css.slice(pos, next + 1); + + if (next === -1 || RE_BAD_BRACKET.test(content)) { + tokens.push(['(', '(', line, pos - offset]); + } else { + tokens.push(['brackets', content, line, pos - offset, line, next - offset]); + pos = next; + } + } + + break; + + case CLOSE_PARENTHESES: + tokens.push([')', ')', line, pos - offset]); + break; + + case SINGLE_QUOTE: + case DOUBLE_QUOTE: + quote = code === SINGLE_QUOTE ? '\'' : '"'; + next = pos; + do { + escaped = false; + next = css.indexOf(quote, next + 1); + if (next === -1) unclosed('quote'); + escapePos = next; + while (css.charCodeAt(escapePos - 1) === BACKSLASH) { + escapePos -= 1; + escaped = !escaped; + } + } while (escaped); + + content = css.slice(pos, next + 1); + lines = content.split('\n'); + last = lines.length - 1; + + if (last > 0) { + nextLine = line + last; + nextOffset = next - lines[last].length; + } else { + nextLine = line; + nextOffset = offset; + } + + tokens.push(['string', css.slice(pos, next + 1), line, pos - offset, nextLine, next - nextOffset]); + + offset = nextOffset; + line = nextLine; + pos = next; + break; + + case AT: + RE_AT_END.lastIndex = pos + 1; + RE_AT_END.test(css); + if (RE_AT_END.lastIndex === 0) { + next = css.length - 1; + } else { + next = RE_AT_END.lastIndex - 2; + } + tokens.push(['at-word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]); + pos = next; + break; + + case BACKSLASH: + next = pos; + escape = true; + while (css.charCodeAt(next + 1) === BACKSLASH) { + next += 1; + escape = !escape; + } + code = css.charCodeAt(next + 1); + if (escape && code !== SLASH && code !== SPACE && code !== NEWLINE && code !== TAB && code !== CR && code !== FEED) { + next += 1; + } + tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]); + pos = next; + break; + + default: + if (code === SLASH && css.charCodeAt(pos + 1) === ASTERICK) { + next = css.indexOf('*/', pos + 2) + 1; + if (next === 0) unclosed('comment'); + + content = css.slice(pos, next + 1); + lines = content.split('\n'); + last = lines.length - 1; + + if (last > 0) { + nextLine = line + last; + nextOffset = next - lines[last].length; + } else { + nextLine = line; + nextOffset = offset; + } + + tokens.push(['comment', content, line, pos - offset, nextLine, next - nextOffset]); + + offset = nextOffset; + line = nextLine; + pos = next; + } else { + RE_WORD_END.lastIndex = pos + 1; + RE_WORD_END.test(css); + if (RE_WORD_END.lastIndex === 0) { + next = css.length - 1; + } else { + next = RE_WORD_END.lastIndex - 2; + } + + tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]); + pos = next; + } + + break; + } + + pos++; + } + + return tokens; +} +module.exports = exports['default']; + + +},{}],54:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +/** + * Contains helpers for working with vendor prefixes. + * + * @example + * const vendor = postcss.vendor; + * + * @namespace vendor + */ +var vendor = { + + /** + * Returns the vendor prefix extracted from an input string. + * + * @param {string} prop - string with or without vendor prefix + * + * @return {string} vendor prefix or empty string + * + * @example + * postcss.vendor.prefix('-moz-tab-size') //=> '-moz-' + * postcss.vendor.prefix('tab-size') //=> '' + */ + prefix: function prefix(prop) { + if (prop[0] === '-') { + var sep = prop.indexOf('-', 1); + return prop.substr(0, sep + 1); + } else { + return ''; + } + }, + + + /** + * Returns the input string stripped of its vendor prefix. + * + * @param {string} prop - string with or without vendor prefix + * + * @return {string} string name without vendor prefixes + * + * @example + * postcss.vendor.unprefixed('-moz-tab-size') //=> 'tab-size' + */ + unprefixed: function unprefixed(prop) { + if (prop[0] === '-') { + var sep = prop.indexOf('-', 1); + return prop.substr(sep + 1); + } else { + return prop; + } + } +}; + +exports.default = vendor; +module.exports = exports['default']; + + +},{}],55:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports.default = warnOnce; +var printed = {}; + +function warnOnce(message) { + if (printed[message]) return; + printed[message] = true; + + if (typeof console !== 'undefined' && console.warn) console.warn(message); +} +module.exports = exports['default']; + + +},{}],56:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * Represents a plugin’s warning. It can be created using {@link Node#warn}. + * + * @example + * if ( decl.important ) { + * decl.warn(result, 'Avoid !important', { word: '!important' }); + * } + */ +var Warning = function () { + + /** + * @param {string} text - warning message + * @param {Object} [opts] - warning options + * @param {Node} opts.node - CSS node that caused the warning + * @param {string} opts.word - word in CSS source that caused the warning + * @param {number} opts.index - index in CSS node string that caused + * the warning + * @param {string} opts.plugin - name of the plugin that created + * this warning. {@link Result#warn} fills + * this property automatically. + */ + function Warning(text) { + var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + _classCallCheck(this, Warning); + + /** + * @member {string} - Type to filter warnings from + * {@link Result#messages}. Always equal + * to `"warning"`. + * + * @example + * const nonWarning = result.messages.filter(i => i.type !== 'warning') + */ + this.type = 'warning'; + /** + * @member {string} - The warning message. + * + * @example + * warning.text //=> 'Try to avoid !important' + */ + this.text = text; + + if (opts.node && opts.node.source) { + var pos = opts.node.positionBy(opts); + /** + * @member {number} - Line in the input file + * with this warning’s source + * + * @example + * warning.line //=> 5 + */ + this.line = pos.line; + /** + * @member {number} - Column in the input file + * with this warning’s source. + * + * @example + * warning.column //=> 6 + */ + this.column = pos.column; + } + + for (var opt in opts) { + this[opt] = opts[opt]; + } + } + + /** + * Returns a warning position and message. + * + * @example + * warning.toString() //=> 'postcss-lint:a.css:10:14: Avoid !important' + * + * @return {string} warning position and message + */ + + + Warning.prototype.toString = function toString() { + if (this.node) { + return this.node.error(this.text, { + plugin: this.plugin, + index: this.index, + word: this.word + }).message; + } else if (this.plugin) { + return this.plugin + ': ' + this.text; + } else { + return this.text; + } + }; + + /** + * @memberof Warning# + * @member {string} plugin - The name of the plugin that created + * it will fill this property automatically. + * this warning. When you call {@link Node#warn} + * + * @example + * warning.plugin //=> 'postcss-important' + */ + + /** + * @memberof Warning# + * @member {Node} node - Contains the CSS node that caused the warning. + * + * @example + * warning.node.toString() //=> 'color: white !important' + */ + + return Warning; +}(); + +exports.default = Warning; +module.exports = exports['default']; + + +},{}],57:[function(require,module,exports){ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var util = require('./util'); +var has = Object.prototype.hasOwnProperty; + +/** + * A data structure which is a combination of an array and a set. Adding a new + * member is O(1), testing for membership is O(1), and finding the index of an + * element is O(1). Removing elements from the set is not supported. Only + * strings are supported for membership. + */ +function ArraySet() { + this._array = []; + this._set = Object.create(null); +} + +/** + * Static method for creating ArraySet instances from an existing array. + */ +ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet(); + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; +}; + +/** + * Return how many unique items are in this ArraySet. If duplicates have been + * added, than those do not count towards the size. + * + * @returns Number + */ +ArraySet.prototype.size = function ArraySet_size() { + return Object.getOwnPropertyNames(this._set).length; +}; + +/** + * Add the given string to this set. + * + * @param String aStr + */ +ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = util.toSetString(aStr); + var isDuplicate = has.call(this._set, sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + this._set[sStr] = idx; + } +}; + +/** + * Is the given string a member of this set? + * + * @param String aStr + */ +ArraySet.prototype.has = function ArraySet_has(aStr) { + var sStr = util.toSetString(aStr); + return has.call(this._set, sStr); +}; + +/** + * What is the index of the given string in the array? + * + * @param String aStr + */ +ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + var sStr = util.toSetString(aStr); + if (has.call(this._set, sStr)) { + return this._set[sStr]; + } + throw new Error('"' + aStr + '" is not in the set.'); +}; + +/** + * What is the element at the given index? + * + * @param Number aIdx + */ +ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); +}; + +/** + * Returns the array representation of this set (which has the proper indices + * indicated by indexOf). Note that this is a copy of the internal array used + * for storing the members so that no one can mess with internal state. + */ +ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); +}; + +exports.ArraySet = ArraySet; + +},{"./util":66}],58:[function(require,module,exports){ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + * + * Based on the Base 64 VLQ implementation in Closure Compiler: + * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java + * + * Copyright 2011 The Closure Compiler Authors. All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +var base64 = require('./base64'); + +// A single base 64 digit can contain 6 bits of data. For the base 64 variable +// length quantities we use in the source map spec, the first bit is the sign, +// the next four bits are the actual value, and the 6th bit is the +// continuation bit. The continuation bit tells us whether there are more +// digits in this value following this digit. +// +// Continuation +// | Sign +// | | +// V V +// 101011 + +var VLQ_BASE_SHIFT = 5; + +// binary: 100000 +var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + +// binary: 011111 +var VLQ_BASE_MASK = VLQ_BASE - 1; + +// binary: 100000 +var VLQ_CONTINUATION_BIT = VLQ_BASE; + +/** + * Converts from a two-complement value to a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + */ +function toVLQSigned(aValue) { + return aValue < 0 + ? ((-aValue) << 1) + 1 + : (aValue << 1) + 0; +} + +/** + * Converts to a two-complement value from a value where the sign bit is + * placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + */ +function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative + ? -shifted + : shifted; +} + +/** + * Returns the base 64 VLQ encoded value. + */ +exports.encode = function base64VLQ_encode(aValue) { + var encoded = ""; + var digit; + + var vlq = toVLQSigned(aValue); + + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + // There are still more digits in this value, so we must make sure the + // continuation bit is marked. + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + + return encoded; +}; + +/** + * Decodes the next base 64 VLQ value from the given string and returns the + * value and the rest of the string via the out parameter. + */ +exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + + do { + if (aIndex >= strLen) { + throw new Error("Expected more digits in base 64 VLQ value."); + } + + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); + } + + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; +}; + +},{"./base64":59}],59:[function(require,module,exports){ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + +/** + * Encode an integer in the range of 0 to 63 to a single base 64 digit. + */ +exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError("Must be between 0 and 63: " + number); +}; + +/** + * Decode a single base 64 character code digit to an integer. Returns -1 on + * failure. + */ +exports.decode = function (charCode) { + var bigA = 65; // 'A' + var bigZ = 90; // 'Z' + + var littleA = 97; // 'a' + var littleZ = 122; // 'z' + + var zero = 48; // '0' + var nine = 57; // '9' + + var plus = 43; // '+' + var slash = 47; // '/' + + var littleOffset = 26; + var numberOffset = 52; + + // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ + if (bigA <= charCode && charCode <= bigZ) { + return (charCode - bigA); + } + + // 26 - 51: abcdefghijklmnopqrstuvwxyz + if (littleA <= charCode && charCode <= littleZ) { + return (charCode - littleA + littleOffset); + } + + // 52 - 61: 0123456789 + if (zero <= charCode && charCode <= nine) { + return (charCode - zero + numberOffset); + } + + // 62: + + if (charCode == plus) { + return 62; + } + + // 63: / + if (charCode == slash) { + return 63; + } + + // Invalid base64 digit. + return -1; +}; + +},{}],60:[function(require,module,exports){ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +exports.GREATEST_LOWER_BOUND = 1; +exports.LEAST_UPPER_BOUND = 2; + +/** + * Recursive implementation of binary search. + * + * @param aLow Indices here and lower do not contain the needle. + * @param aHigh Indices here and higher do not contain the needle. + * @param aNeedle The element being searched for. + * @param aHaystack The non-empty array being searched. + * @param aCompare Function which takes two elements and returns -1, 0, or 1. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + */ +function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + // This function terminates when one of the following is true: + // + // 1. We find the exact element we are looking for. + // + // 2. We did not find the exact element, but we can return the index of + // the next-closest element. + // + // 3. We did not find the exact element, and there is no next-closest + // element than the one we are searching for, so we return -1. + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + // Found the element we are looking for. + return mid; + } + else if (cmp > 0) { + // Our needle is greater than aHaystack[mid]. + if (aHigh - mid > 1) { + // The element is in the upper half. + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + + // The exact needle element was not found in this haystack. Determine if + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } + else { + // Our needle is less than aHaystack[mid]. + if (mid - aLow > 1) { + // The element is in the lower half. + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + + // we are in termination case (3) or (2) and return the appropriate thing. + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } +} + +/** + * This is an implementation of binary search which will always try and return + * the index of the closest element if there is no exact hit. This is because + * mappings between original and generated line/col pairs are single points, + * and there is an implicit region between each of them, so a miss just means + * that you aren't on the very start of a region. + * + * @param aNeedle The element you are looking for. + * @param aHaystack The array that is being searched. + * @param aCompare A function which takes the needle and an element in the + * array and returns -1, 0, or 1 depending on whether the needle is less + * than, equal to, or greater than the element, respectively. + * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or + * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. + */ +exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, + aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + + // We have found either the exact element, or the next-closest element than + // the one we are searching for. However, there may be more than one such + // element. Make sure we always return the smallest of these. + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + + return index; +}; + +},{}],61:[function(require,module,exports){ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2014 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var util = require('./util'); + +/** + * Determine whether mappingB is after mappingA with respect to generated + * position. + */ +function generatedPositionAfter(mappingA, mappingB) { + // Optimized for most common case + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || + util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; +} + +/** + * A data structure to provide a sorted view of accumulated mappings in a + * performance conscious manner. It trades a neglibable overhead in general + * case for a large speedup in case of mappings being added in order. + */ +function MappingList() { + this._array = []; + this._sorted = true; + // Serves as infimum + this._last = {generatedLine: -1, generatedColumn: 0}; +} + +/** + * Iterate through internal items. This method takes the same arguments that + * `Array.prototype.forEach` takes. + * + * NOTE: The order of the mappings is NOT guaranteed. + */ +MappingList.prototype.unsortedForEach = + function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + +/** + * Add the given source mapping. + * + * @param Object aMapping + */ +MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } +}; + +/** + * Returns the flat, sorted array of mappings. The mappings are sorted by + * generated position. + * + * WARNING: This method returns internal data without copying, for + * performance. The return value must NOT be mutated, and should be treated as + * an immutable borrow. If you want to take ownership, you must make your own + * copy. + */ +MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; +}; + +exports.MappingList = MappingList; + +},{"./util":66}],62:[function(require,module,exports){ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +// It turns out that some (most?) JavaScript engines don't self-host +// `Array.prototype.sort`. This makes sense because C++ will likely remain +// faster than JS when doing raw CPU-intensive sorting. However, when using a +// custom comparator function, calling back and forth between the VM's C++ and +// JIT'd JS is rather slow *and* loses JIT type information, resulting in +// worse generated code for the comparator function than would be optimal. In +// fact, when sorting with a comparator, these costs outweigh the benefits of +// sorting in C++. By using our own JS-implemented Quick Sort (below), we get +// a ~3500ms mean speed-up in `bench/bench.html`. + +/** + * Swap the elements indexed by `x` and `y` in the array `ary`. + * + * @param {Array} ary + * The array. + * @param {Number} x + * The index of the first item. + * @param {Number} y + * The index of the second item. + */ +function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; +} + +/** + * Returns a random integer within the range `low .. high` inclusive. + * + * @param {Number} low + * The lower bound on the range. + * @param {Number} high + * The upper bound on the range. + */ +function randomIntInRange(low, high) { + return Math.round(low + (Math.random() * (high - low))); +} + +/** + * The Quick Sort algorithm. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + * @param {Number} p + * Start index of the array + * @param {Number} r + * End index of the array + */ +function doQuickSort(ary, comparator, p, r) { + // If our lower bound is less than our upper bound, we (1) partition the + // array into two pieces and (2) recurse on each half. If it is not, this is + // the empty array and our base case. + + if (p < r) { + // (1) Partitioning. + // + // The partitioning chooses a pivot between `p` and `r` and moves all + // elements that are less than or equal to the pivot to the before it, and + // all the elements that are greater than it after it. The effect is that + // once partition is done, the pivot is in the exact place it will be when + // the array is put in sorted order, and it will not need to be moved + // again. This runs in O(n) time. + + // Always choose a random pivot so that an input array which is reverse + // sorted does not cause O(n^2) running time. + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + + swap(ary, pivotIndex, r); + var pivot = ary[r]; + + // Immediately after `j` is incremented in this loop, the following hold + // true: + // + // * Every element in `ary[p .. i]` is less than or equal to the pivot. + // + // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + + swap(ary, i + 1, j); + var q = i + 1; + + // (2) Recurse on each half. + + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } +} + +/** + * Sort the given array in-place with the given comparator function. + * + * @param {Array} ary + * An array to sort. + * @param {function} comparator + * Function to use to compare two items. + */ +exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); +}; + +},{}],63:[function(require,module,exports){ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var util = require('./util'); +var binarySearch = require('./binary-search'); +var ArraySet = require('./array-set').ArraySet; +var base64VLQ = require('./base64-vlq'); +var quickSort = require('./quick-sort').quickSort; + +function SourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + return sourceMap.sections != null + ? new IndexedSourceMapConsumer(sourceMap) + : new BasicSourceMapConsumer(sourceMap); +} + +SourceMapConsumer.fromSourceMap = function(aSourceMap) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap); +} + +/** + * The version of the source mapping spec that we are consuming. + */ +SourceMapConsumer.prototype._version = 3; + +// `__generatedMappings` and `__originalMappings` are arrays that hold the +// parsed mapping coordinates from the source map's "mappings" attribute. They +// are lazily instantiated, accessed via the `_generatedMappings` and +// `_originalMappings` getters respectively, and we only parse the mappings +// and create these arrays once queried for a source location. We jump through +// these hoops because there can be many thousands of mappings, and parsing +// them is expensive, so we only want to do it if we must. +// +// Each object in the arrays is of the form: +// +// { +// generatedLine: The line number in the generated code, +// generatedColumn: The column number in the generated code, +// source: The path to the original source file that generated this +// chunk of code, +// originalLine: The line number in the original source that +// corresponds to this chunk of generated code, +// originalColumn: The column number in the original source that +// corresponds to this chunk of generated code, +// name: The name of the original symbol which generated this chunk of +// code. +// } +// +// All properties except for `generatedLine` and `generatedColumn` can be +// `null`. +// +// `_generatedMappings` is ordered by the generated positions. +// +// `_originalMappings` is ordered by the original positions. + +SourceMapConsumer.prototype.__generatedMappings = null; +Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__generatedMappings; + } +}); + +SourceMapConsumer.prototype.__originalMappings = null; +Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + + return this.__originalMappings; + } +}); + +SourceMapConsumer.prototype._charIsMappingSeparator = + function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ";" || c === ","; + }; + +/** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ +SourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error("Subclasses must implement _parseMappings"); + }; + +SourceMapConsumer.GENERATED_ORDER = 1; +SourceMapConsumer.ORIGINAL_ORDER = 2; + +SourceMapConsumer.GREATEST_LOWER_BOUND = 1; +SourceMapConsumer.LEAST_UPPER_BOUND = 2; + +/** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ +SourceMapConsumer.prototype.eachMapping = + function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error("Unknown order of iteration."); + } + + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + if (source != null && sourceRoot != null) { + source = util.join(sourceRoot, source); + } + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + +/** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: Optional. the column number in the original source. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ +SourceMapConsumer.prototype.allGeneratedPositionsFor = + function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + + // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping + // returns the index of the closest mapping less than the needle. By + // setting needle.originalColumn to 0, we thus find the last mapping for + // the given line, provided such a mapping exists. + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + + if (this.sourceRoot != null) { + needle.source = util.relative(this.sourceRoot, needle.source); + } + if (!this._sources.has(needle.source)) { + return []; + } + needle.source = this._sources.indexOf(needle.source); + + var mappings = []; + + var index = this._findMapping(needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we found. Since + // mappings are sorted, this is guaranteed to find all mappings for + // the line we found. + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + + // Iterate until either we run out of mappings, or we run into + // a mapping for a different line than the one we were searching for. + // Since mappings are sorted, this is guaranteed to find all mappings for + // the line we are searching for. + while (mapping && + mapping.originalLine === line && + mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + + mapping = this._originalMappings[++index]; + } + } + } + + return mappings; + }; + +exports.SourceMapConsumer = SourceMapConsumer; + +/** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The only parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referrenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ +function BasicSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + sources = sources + .map(String) + // Some source maps produce relative source paths like "./foo.js" instead of + // "foo.js". Normalize these first so that future comparisons will succeed. + // See bugzil.la/1090768. + .map(util.normalize) + // Always ensure that absolute sources are internally stored relative to + // the source root, if the source root is absolute. Not doing this would + // be particularly problematic when the source root is a prefix of the + // source (valid, but why??). See github issue #199 and bugzil.la/1188982. + .map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) + ? util.relative(sourceRoot, source) + : source; + }); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + this._names = ArraySet.fromArray(names.map(String), true); + this._sources = ArraySet.fromArray(sources, true); + + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this.file = file; +} + +BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); +BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + +/** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @returns BasicSourceMapConsumer + */ +BasicSourceMapConsumer.fromSourceMap = + function SourceMapConsumer_fromSourceMap(aSourceMap) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), + smc.sourceRoot); + smc.file = aSourceMap._file; + + // Because we are modifying the entries (by converting string sources and + // names to indices into the sources and names ArraySets), we have to make + // a copy of the entry or else bad things happen. Shared mutable state + // strikes again! See github issue #191. + + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + + destOriginalMappings.push(destMapping); + } + + destGeneratedMappings.push(destMapping); + } + + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + + return smc; + }; + +/** + * The version of the source mapping spec that we are consuming. + */ +BasicSourceMapConsumer.prototype._version = 3; + +/** + * The list of original sources. + */ +Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._sources.toArray().map(function (s) { + return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; + }, this); + } +}); + +/** + * Provide the JIT with a nice shape / hidden class. + */ +function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; +} + +/** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ +BasicSourceMapConsumer.prototype._parseMappings = + function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } + else if (aStr.charAt(index) === ',') { + index++; + } + else { + mapping = new Mapping(); + mapping.generatedLine = generatedLine; + + // Because each offset is encoded relative to the previous one, + // many segments often have the same encoding. We can exploit this + // fact by caching the parsed variable length fields of each segment, + // allowing us to avoid a second parse if we encounter the same + // segment again. + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + + cachedSegments[str] = segment; + } + + // Generated column. + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + + if (segment.length > 1) { + // Original source. + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + + // Original line. + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + // Lines are stored 0-based + mapping.originalLine += 1; + + // Original column. + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + + if (segment.length > 4) { + // Original name. + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + +/** + * Find the mapping that best matches the hypothetical "needle" mapping that + * we are searching for in the given "haystack" of mappings. + */ +BasicSourceMapConsumer.prototype._findMapping = + function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, + aColumnName, aComparator, aBias) { + // To return the position we are searching for, we must first find the + // mapping for the given position and then return the opposite position it + // points to. Because the mappings are sorted, we can use binary search to + // find the best mapping. + + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + + aNeedle[aColumnName]); + } + + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + +/** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ +BasicSourceMapConsumer.prototype.computeColumnSpans = + function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + + // Mappings do not contain a field for the last generated columnt. We + // can come up with an optimistic estimate, however, by assuming that + // mappings are contiguous (i.e. given two consecutive mappings, the + // first mapping ends where the second one starts). + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + + // The last mapping for each line spans the entire line. + mapping.lastGeneratedColumn = Infinity; + } + }; + +/** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ +BasicSourceMapConsumer.prototype.originalPositionFor = + function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._generatedMappings, + "generatedLine", + "generatedColumn", + util.compareByGeneratedPositionsDeflated, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._generatedMappings[index]; + + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + if (this.sourceRoot != null) { + source = util.join(this.sourceRoot, source); + } + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + }; + +/** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ +BasicSourceMapConsumer.prototype.hasContentsOfAllSources = + function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + }; + +/** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ +BasicSourceMapConsumer.prototype.sourceContentFor = + function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + if (this.sourceRoot != null) { + aSource = util.relative(this.sourceRoot, aSource); + } + + if (this._sources.has(aSource)) { + return this.sourcesContent[this._sources.indexOf(aSource)]; + } + + var url; + if (this.sourceRoot != null + && (url = util.urlParse(this.sourceRoot))) { + // XXX: file:// URIs and absolute paths lead to unexpected behavior for + // many users. We can help them out when they expect file:// URIs to + // behave like it would if they were running a local HTTP server. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. + var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); + if (url.scheme == "file" + && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] + } + + if ((!url.path || url.path == "/") + && this._sources.has("/" + aSource)) { + return this.sourcesContent[this._sources.indexOf("/" + aSource)]; + } + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + +/** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ +BasicSourceMapConsumer.prototype.generatedPositionFor = + function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + if (this.sourceRoot != null) { + source = util.relative(this.sourceRoot, source); + } + if (!this._sources.has(source)) { + return { + line: null, + column: null, + lastColumn: null + }; + } + source = this._sources.indexOf(source); + + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + + var index = this._findMapping( + needle, + this._originalMappings, + "originalLine", + "originalColumn", + util.compareByOriginalPositions, + util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND) + ); + + if (index >= 0) { + var mapping = this._originalMappings[index]; + + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + }; + +exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + +/** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The only parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ +function IndexedSourceMapConsumer(aSourceMap) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); + } + + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + + this._sources = new ArraySet(); + this._names = new ArraySet(); + + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map')) + } + }); +} + +IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); +IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + +/** + * The version of the source mapping spec that we are consuming. + */ +IndexedSourceMapConsumer.prototype._version = 3; + +/** + * The list of original sources. + */ +Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } +}); + +/** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. + * - column: The column number in the generated source. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. + * - column: The column number in the original source, or null. + * - name: The original identifier, or null. + */ +IndexedSourceMapConsumer.prototype.originalPositionFor = + function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + var sectionIndex = binarySearch.search(needle, this._sections, + function(needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (needle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + var section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + }; + +/** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ +IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = + function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + +/** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ +IndexedSourceMapConsumer.prototype.sourceContentFor = + function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + +/** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. + * - column: The column number in the original source. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. + * - column: The column number in the generated source, or null. + */ +IndexedSourceMapConsumer.prototype.generatedPositionFor = + function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + + // Only consider this section if the requested source is in the list of + // sources of the consumer. + if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + + (section.generatedOffset.generatedLine === generatedPosition.line + ? section.generatedOffset.generatedColumn - 1 + : 0) + }; + return ret; + } + } + + return { + line: null, + column: null + }; + }; + +/** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ +IndexedSourceMapConsumer.prototype._parseMappings = + function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + + var source = section.consumer._sources.at(mapping.source); + if (section.consumer.sourceRoot !== null) { + source = util.join(section.consumer.sourceRoot, source); + } + this._sources.add(source); + source = this._sources.indexOf(source); + + var name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + + // The mappings coming from the consumer for the section have + // generated positions relative to the start of the section, so we + // need to offset them to be relative to the start of the concatenated + // generated file. + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + + (section.generatedOffset.generatedLine === mapping.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + +exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + +},{"./array-set":57,"./base64-vlq":58,"./binary-search":60,"./quick-sort":62,"./util":66}],64:[function(require,module,exports){ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var base64VLQ = require('./base64-vlq'); +var util = require('./util'); +var ArraySet = require('./array-set').ArraySet; +var MappingList = require('./mapping-list').MappingList; + +/** + * An instance of the SourceMapGenerator represents a source map which is + * being built incrementally. You may pass an object with the following + * properties: + * + * - file: The filename of the generated source. + * - sourceRoot: A root for all relative URLs in this source map. + */ +function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet(); + this._names = new ArraySet(); + this._mappings = new MappingList(); + this._sourcesContents = null; +} + +SourceMapGenerator.prototype._version = 3; + +/** + * Creates a new SourceMapGenerator based on a SourceMapConsumer + * + * @param aSourceMapConsumer The SourceMap. + */ +SourceMapGenerator.fromSourceMap = + function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + +/** + * Add a single mapping from original source line and column to the generated + * source's line and column for this source map being created. The mapping + * object should have the following properties: + * + * - generated: An object with the generated line and column positions. + * - original: An object with the original line and column positions. + * - source: The original source file (relative to the sourceRoot). + * - name: An optional original token name for this mapping. + */ +SourceMapGenerator.prototype.addMapping = + function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + + if (source != null) { + source = String(source); + if (!this._sources.has(source)) { + this._sources.add(source); + } + } + + if (name != null) { + name = String(name); + if (!this._names.has(name)) { + this._names.add(name); + } + } + + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + +/** + * Set the source content for a source file. + */ +SourceMapGenerator.prototype.setSourceContent = + function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + + if (aSourceContent != null) { + // Add the source content to the _sourcesContents map. + // Create a new _sourcesContents map if the property is null. + if (!this._sourcesContents) { + this._sourcesContents = Object.create(null); + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + // Remove the source file from the _sourcesContents map. + // If the _sourcesContents map is empty, set the property to null. + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + +/** + * Applies the mappings of a sub-source-map for a specific source file to the + * source map being generated. Each mapping to the supplied source file is + * rewritten using the supplied source map. Note: The resolution for the + * resulting mappings is the minimium of this map and the supplied map. + * + * @param aSourceMapConsumer The source map to be applied. + * @param aSourceFile Optional. The filename of the source file. + * If omitted, SourceMapConsumer's file property will be used. + * @param aSourceMapPath Optional. The dirname of the path to the source map + * to be applied. If relative, it is relative to the SourceMapConsumer. + * This parameter is needed when the two source maps aren't in the same + * directory, and the source map to be applied contains relative source + * paths. If so, those relative source paths need to be rewritten + * relative to the SourceMapGenerator. + */ +SourceMapGenerator.prototype.applySourceMap = + function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + // If aSourceFile is omitted, we will use the file property of the SourceMap + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + + 'or the source map\'s "file" property. Both were omitted.' + ); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + // Make "sourceFile" relative if an absolute Url is passed. + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + // Applying the SourceMap can add and remove items from the sources and + // the names array. + var newSources = new ArraySet(); + var newNames = new ArraySet(); + + // Find mappings for the "sourceFile" + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + // Check if it can be mapped by the source map, then update the mapping. + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + // Copy mapping + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source) + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + + }, this); + this._sources = newSources; + this._names = newNames; + + // Copy sourcesContents of applied map. + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + +/** + * A mapping can have one of the three levels of data: + * + * 1. Just the generated position. + * 2. The Generated position, original position, and original source. + * 3. Generated and original position, original source, as well as a name + * token. + * + * To maintain consistency, we validate that any new mapping being added falls + * in to one of these categories. + */ +SourceMapGenerator.prototype._validateMapping = + function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, + aName) { + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aGenerated.line > 0 && aGenerated.column >= 0 + && !aOriginal && !aSource && !aName) { + // Case 1. + return; + } + else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated + && aOriginal && 'line' in aOriginal && 'column' in aOriginal + && aGenerated.line > 0 && aGenerated.column >= 0 + && aOriginal.line > 0 && aOriginal.column >= 0 + && aSource) { + // Cases 2 and 3. + return; + } + else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + +/** + * Serialize the accumulated mappings in to the stream of base 64 VLQs + * specified by the source map format. + */ +SourceMapGenerator.prototype._serializeMappings = + function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var next; + var mapping; + var nameIdx; + var sourceIdx; + + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + next = '' + + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + next += ';'; + previousGeneratedLine++; + } + } + else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + next += ','; + } + } + + next += base64VLQ.encode(mapping.generatedColumn + - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + next += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + + // lines are stored 0-based in SourceMap spec version 3 + next += base64VLQ.encode(mapping.originalLine - 1 + - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + + next += base64VLQ.encode(mapping.originalColumn + - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + next += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + + result += next; + } + + return result; + }; + +SourceMapGenerator.prototype._generateSourcesContent = + function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) + ? this._sourcesContents[key] + : null; + }, this); + }; + +/** + * Externalize the source map. + */ +SourceMapGenerator.prototype.toJSON = + function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + + return map; + }; + +/** + * Render the source map being generated to a string. + */ +SourceMapGenerator.prototype.toString = + function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + +exports.SourceMapGenerator = SourceMapGenerator; + +},{"./array-set":57,"./base64-vlq":58,"./mapping-list":61,"./util":66}],65:[function(require,module,exports){ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator; +var util = require('./util'); + +// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other +// operating systems these days (capturing the result). +var REGEX_NEWLINE = /(\r?\n)/; + +// Newline character code for charCodeAt() comparisons +var NEWLINE_CODE = 10; + +// Private symbol for identifying `SourceNode`s when multiple versions of +// the source-map library are loaded. This MUST NOT CHANGE across +// versions! +var isSourceNode = "$$$isSourceNode$$$"; + +/** + * SourceNodes provide a way to abstract over interpolating/concatenating + * snippets of generated JavaScript source code while maintaining the line and + * column information associated with the original source code. + * + * @param aLine The original line number. + * @param aColumn The original column number. + * @param aSource The original source's filename. + * @param aChunks Optional. An array of strings which are snippets of + * generated JS, or other SourceNodes. + * @param aName The original identifier. + */ +function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) this.add(aChunks); +} + +/** + * Creates a SourceNode from generated code and a SourceMapConsumer. + * + * @param aGeneratedCode The generated code + * @param aSourceMapConsumer The SourceMap for the generated code + * @param aRelativePath Optional. The path that relative sources in the + * SourceMapConsumer should be relative to. + */ +SourceNode.fromStringWithSourceMap = + function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + // The SourceNode we want to fill with the generated code + // and the SourceMap + var node = new SourceNode(); + + // All even indices of this array are one line of the generated code, + // while all odd indices are the newlines between two adjacent lines + // (since `REGEX_NEWLINE` captures its match). + // Processed fragments are removed from this array, by calling `shiftNextLine`. + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var shiftNextLine = function() { + var lineContents = remainingLines.shift(); + // The last line of a file might not have a newline. + var newLine = remainingLines.shift() || ""; + return lineContents + newLine; + }; + + // We need to remember the position of "remainingLines" + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + + // The generate SourceNodes we need a code range. + // To extract it current and last mapping is used. + // Here we store the last mapping. + var lastMapping = null; + + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + // We add the code from "lastMapping" to "mapping": + // First check if there is a new line in between. + if (lastGeneratedLine < mapping.generatedLine) { + // Associate first line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + // The remaining code is added without mapping + } else { + // There is no new line in between. + // Associate the code between "lastGeneratedColumn" and + // "mapping.generatedColumn" with "lastMapping" + var nextLine = remainingLines[0]; + var code = nextLine.substr(0, mapping.generatedColumn - + lastGeneratedColumn); + remainingLines[0] = nextLine.substr(mapping.generatedColumn - + lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + // No more remaining code, continue + lastMapping = mapping; + return; + } + } + // We add the generated code until the first mapping + // to the SourceNode without any mapping. + // Each line is added as separate string. + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[0]; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[0] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + // We have processed all mappings. + if (remainingLines.length > 0) { + if (lastMapping) { + // Associate the remaining code in the current line with "lastMapping" + addMappingWithCode(lastMapping, shiftNextLine()); + } + // and add the remaining lines without any mapping + node.add(remainingLines.join("")); + } + + // Copy sourcesContent into SourceNode + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + + return node; + + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath + ? util.join(aRelativePath, mapping.source) + : mapping.source; + node.add(new SourceNode(mapping.originalLine, + mapping.originalColumn, + source, + code, + mapping.name)); + } + } + }; + +/** + * Add a chunk of generated JS to this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ +SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + if (aChunk) { + this.children.push(aChunk); + } + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; +}; + +/** + * Add a chunk of generated JS to the beginning of this source node. + * + * @param aChunk A string snippet of generated JS code, another instance of + * SourceNode, or an array where each member is one of those things. + */ +SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length-1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } + else if (aChunk[isSourceNode] || typeof aChunk === "string") { + this.children.unshift(aChunk); + } + else { + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk + ); + } + return this; +}; + +/** + * Walk over the tree of JS snippets in this node and its children. The + * walking function is called once for each snippet of JS and is passed that + * snippet and the its original associated source's line/column location. + * + * @param aFn The traversal function. + */ +SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } + else { + if (chunk !== '') { + aFn(chunk, { source: this.source, + line: this.line, + column: this.column, + name: this.name }); + } + } + } +}; + +/** + * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between + * each of `this.children`. + * + * @param aSep The separator. + */ +SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len-1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; +}; + +/** + * Call String.prototype.replace on the very right-most source snippet. Useful + * for trimming whitespace from the end of a source node, etc. + * + * @param aPattern The pattern to replace. + * @param aReplacement The thing to replace the pattern with. + */ +SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } + else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } + else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; +}; + +/** + * Set the source content for a source file. This will be added to the SourceMapGenerator + * in the sourcesContent field. + * + * @param aSourceFile The filename of the source file + * @param aSourceContent The content of the source file + */ +SourceNode.prototype.setSourceContent = + function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + +/** + * Walk over the tree of SourceNodes. The walking function is called for each + * source file content and is passed the filename and source content. + * + * @param aFn The traversal function. + */ +SourceNode.prototype.walkSourceContents = + function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + +/** + * Return the string representation of this source node. Walks over the tree + * and concatenates all the various snippets together to one string. + */ +SourceNode.prototype.toString = function SourceNode_toString() { + var str = ""; + this.walk(function (chunk) { + str += chunk; + }); + return str; +}; + +/** + * Returns the string representation of this source node along with a source + * map. + */ +SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: "", + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null + && original.line !== null + && original.column !== null) { + if(lastOriginalSource !== original.source + || lastOriginalLine !== original.line + || lastOriginalColumn !== original.column + || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + // Mappings end at eol + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + + return { code: generated.code, map: map }; +}; + +exports.SourceNode = SourceNode; + +},{"./source-map-generator":64,"./util":66}],66:[function(require,module,exports){ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +/** + * This is a helper function for getting values from parameter/options + * objects. + * + * @param args The object we are extracting values from + * @param name The name of the property we are getting. + * @param defaultValue An optional value to return if the property is missing + * from the object. If this is not specified and the property is missing, an + * error will be thrown. + */ +function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } +} +exports.getArg = getArg; + +var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; +var dataUrlRegexp = /^data:.+\,.+$/; + +function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; +} +exports.urlParse = urlParse; + +function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ":" + aParsedUrl.port + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; +} +exports.urlGenerate = urlGenerate; + +/** + * Normalizes a path, or the path portion of a URL: + * + * - Replaces consecutive slashes with one slash. + * - Removes unnecessary '.' parts. + * - Removes unnecessary '/..' parts. + * + * Based on code in the Node.js 'path' core module. + * + * @param aPath The path or url to normalize. + */ +function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + // The first part is blank if the path is absolute. Trying to go + // above the root is a no-op. Therefore we can remove all '..' parts + // directly after the root. + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; +} +exports.normalize = normalize; + +/** + * Joins two paths/URLs. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be joined with the root. + * + * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a + * scheme-relative URL: Then the scheme of aRoot, if any, is prepended + * first. + * - Otherwise aPath is a path. If aRoot is a URL, then its path portion + * is updated with the result and aRoot is returned. Otherwise the result + * is returned. + * - If aPath is absolute, the result is aPath. + * - Otherwise the two paths are joined with a slash. + * - Joining for example 'http://' and 'www.example.com' is also supported. + */ +function join(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + if (aPath === "") { + aPath = "."; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + + // `join(foo, '//www.example.org')` + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + + // `join('http://', 'www.example.com')` + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + + var joined = aPath.charAt(0) === '/' + ? aPath + : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; +} +exports.join = join; + +exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp); +}; + +/** + * Make a path relative to a URL or another path. + * + * @param aRoot The root path or URL. + * @param aPath The path or URL to be made relative to aRoot. + */ +function relative(aRoot, aPath) { + if (aRoot === "") { + aRoot = "."; + } + + aRoot = aRoot.replace(/\/$/, ''); + + // It is possible for the path to be above the root. In this case, simply + // checking whether the root is a prefix of the path won't work. Instead, we + // need to remove components from the root one by one, until either we find + // a prefix that fits, or we run out of components to remove. + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf("/"); + if (index < 0) { + return aPath; + } + + // If the only part of the root that is left is the scheme (i.e. http://, + // file:///, etc.), one or more slashes (/), or simply nothing at all, we + // have exhausted all components, so the path is not relative to the root. + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + + ++level; + } + + // Make sure we add a "../" for each component we removed from the root. + return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); +} +exports.relative = relative; + +var supportsNullProto = (function () { + var obj = Object.create(null); + return !('__proto__' in obj); +}()); + +function identity (s) { + return s; +} + +/** + * Because behavior goes wacky when you set `__proto__` on objects, we + * have to prefix all the strings in our set with an arbitrary character. + * + * See https://github.com/mozilla/source-map/pull/31 and + * https://github.com/mozilla/source-map/issues/30 + * + * @param String aStr + */ +function toSetString(aStr) { + if (isProtoString(aStr)) { + return '$' + aStr; + } + + return aStr; +} +exports.toSetString = supportsNullProto ? identity : toSetString; + +function fromSetString(aStr) { + if (isProtoString(aStr)) { + return aStr.slice(1); + } + + return aStr; +} +exports.fromSetString = supportsNullProto ? identity : fromSetString; + +function isProtoString(s) { + if (!s) { + return false; + } + + var length = s.length; + + if (length < 9 /* "__proto__".length */) { + return false; + } + + if (s.charCodeAt(length - 1) !== 95 /* '_' */ || + s.charCodeAt(length - 2) !== 95 /* '_' */ || + s.charCodeAt(length - 3) !== 111 /* 'o' */ || + s.charCodeAt(length - 4) !== 116 /* 't' */ || + s.charCodeAt(length - 5) !== 111 /* 'o' */ || + s.charCodeAt(length - 6) !== 114 /* 'r' */ || + s.charCodeAt(length - 7) !== 112 /* 'p' */ || + s.charCodeAt(length - 8) !== 95 /* '_' */ || + s.charCodeAt(length - 9) !== 95 /* '_' */) { + return false; + } + + for (var i = length - 10; i >= 0; i--) { + if (s.charCodeAt(i) !== 36 /* '$' */) { + return false; + } + } + + return true; +} + +/** + * Comparator between two mappings where the original positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same original source/line/column, but different generated + * line and column the same. Useful when searching for a mapping with a + * stubbed out mapping. + */ +function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; +} +exports.compareByOriginalPositions = compareByOriginalPositions; + +/** + * Comparator between two mappings with deflated source and name indices where + * the generated positions are compared. + * + * Optionally pass in `true` as `onlyCompareGenerated` to consider two + * mappings with the same generated line and column, but different + * source/name/original line and column the same. Useful when searching for a + * mapping with a stubbed out mapping. + */ +function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + + cmp = mappingA.source - mappingB.source; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return mappingA.name - mappingB.name; +} +exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + +function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + + if (aStr1 > aStr2) { + return 1; + } + + return -1; +} + +/** + * Comparator between two mappings with inflated source and name strings where + * the generated positions are compared. + */ +function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + + return strcmp(mappingA.name, mappingB.name); +} +exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; + +},{}],67:[function(require,module,exports){ +/* + * Copyright 2009-2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE.txt or: + * http://opensource.org/licenses/BSD-3-Clause + */ +exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator; +exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer; +exports.SourceNode = require('./lib/source-node').SourceNode; + +},{"./lib/source-map-consumer":63,"./lib/source-map-generator":64,"./lib/source-node":65}],68:[function(require,module,exports){ +/*! https://mths.be/regenerate v1.3.1 by @mathias | MIT license */ +;(function(root) { + + // Detect free variables `exports`. + var freeExports = typeof exports == 'object' && exports; + + // Detect free variable `module`. + var freeModule = typeof module == 'object' && module && + module.exports == freeExports && module; + + // Detect free variable `global`, from Node.js/io.js or Browserified code, + // and use it as `root`. + var freeGlobal = typeof global == 'object' && global; + if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + var ERRORS = { + 'rangeOrder': 'A range\u2019s `stop` value must be greater than or equal ' + + 'to the `start` value.', + 'codePointRange': 'Invalid code point value. Code points range from ' + + 'U+000000 to U+10FFFF.' + }; + + // https://mathiasbynens.be/notes/javascript-encoding#surrogate-pairs + var HIGH_SURROGATE_MIN = 0xD800; + var HIGH_SURROGATE_MAX = 0xDBFF; + var LOW_SURROGATE_MIN = 0xDC00; + var LOW_SURROGATE_MAX = 0xDFFF; + + // In Regenerate output, `\0` is never preceded by `\` because we sort by + // code point value, so let’s keep this regular expression simple. + var regexNull = /\\x00([^0123456789]|$)/g; + + var object = {}; + var hasOwnProperty = object.hasOwnProperty; + var extend = function(destination, source) { + var key; + for (key in source) { + if (hasOwnProperty.call(source, key)) { + destination[key] = source[key]; + } + } + return destination; + }; + + var forEach = function(array, callback) { + var index = -1; + var length = array.length; + while (++index < length) { + callback(array[index], index); + } + }; + + var toString = object.toString; + var isArray = function(value) { + return toString.call(value) == '[object Array]'; + }; + var isNumber = function(value) { + return typeof value == 'number' || + toString.call(value) == '[object Number]'; + }; + + // This assumes that `number` is a positive integer that `toString()`s nicely + // (which is the case for all code point values). + var zeroes = '0000'; + var pad = function(number, totalCharacters) { + var string = String(number); + return string.length < totalCharacters + ? (zeroes + string).slice(-totalCharacters) + : string; + }; + + var hex = function(number) { + return Number(number).toString(16).toUpperCase(); + }; + + var slice = [].slice; + + /*--------------------------------------------------------------------------*/ + + var dataFromCodePoints = function(codePoints) { + var index = -1; + var length = codePoints.length; + var max = length - 1; + var result = []; + var isStart = true; + var tmp; + var previous = 0; + while (++index < length) { + tmp = codePoints[index]; + if (isStart) { + result.push(tmp); + previous = tmp; + isStart = false; + } else { + if (tmp == previous + 1) { + if (index != max) { + previous = tmp; + continue; + } else { + isStart = true; + result.push(tmp + 1); + } + } else { + // End the previous range and start a new one. + result.push(previous + 1, tmp); + previous = tmp; + } + } + } + if (!isStart) { + result.push(tmp + 1); + } + return result; + }; + + var dataRemove = function(data, codePoint) { + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var length = data.length; + while (index < length) { + start = data[index]; + end = data[index + 1]; + if (codePoint >= start && codePoint < end) { + // Modify this pair. + if (codePoint == start) { + if (end == start + 1) { + // Just remove `start` and `end`. + data.splice(index, 2); + return data; + } else { + // Just replace `start` with a new value. + data[index] = codePoint + 1; + return data; + } + } else if (codePoint == end - 1) { + // Just replace `end` with a new value. + data[index + 1] = codePoint; + return data; + } else { + // Replace `[start, end]` with `[startA, endA, startB, endB]`. + data.splice(index, 2, start, codePoint, codePoint + 1, end); + return data; + } + } + index += 2; + } + return data; + }; + + var dataRemoveRange = function(data, rangeStart, rangeEnd) { + if (rangeEnd < rangeStart) { + throw Error(ERRORS.rangeOrder); + } + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + while (index < data.length) { + start = data[index]; + end = data[index + 1] - 1; // Note: the `- 1` makes `end` inclusive. + + // Exit as soon as no more matching pairs can be found. + if (start > rangeEnd) { + return data; + } + + // Check if this range pair is equal to, or forms a subset of, the range + // to be removed. + // E.g. we have `[0, 11, 40, 51]` and want to remove 0-10 → `[40, 51]`. + // E.g. we have `[40, 51]` and want to remove 0-100 → `[]`. + if (rangeStart <= start && rangeEnd >= end) { + // Remove this pair. + data.splice(index, 2); + continue; + } + + // Check if both `rangeStart` and `rangeEnd` are within the bounds of + // this pair. + // E.g. we have `[0, 11]` and want to remove 4-6 → `[0, 4, 7, 11]`. + if (rangeStart >= start && rangeEnd < end) { + if (rangeStart == start) { + // Replace `[start, end]` with `[startB, endB]`. + data[index] = rangeEnd + 1; + data[index + 1] = end + 1; + return data; + } + // Replace `[start, end]` with `[startA, endA, startB, endB]`. + data.splice(index, 2, start, rangeStart, rangeEnd + 1, end + 1); + return data; + } + + // Check if only `rangeStart` is within the bounds of this pair. + // E.g. we have `[0, 11]` and want to remove 4-20 → `[0, 4]`. + if (rangeStart >= start && rangeStart <= end) { + // Replace `end` with `rangeStart`. + data[index + 1] = rangeStart; + // Note: we cannot `return` just yet, in case any following pairs still + // contain matching code points. + // E.g. we have `[0, 11, 14, 31]` and want to remove 4-20 + // → `[0, 4, 21, 31]`. + } + + // Check if only `rangeEnd` is within the bounds of this pair. + // E.g. we have `[14, 31]` and want to remove 4-20 → `[21, 31]`. + else if (rangeEnd >= start && rangeEnd <= end) { + // Just replace `start`. + data[index] = rangeEnd + 1; + return data; + } + + index += 2; + } + return data; + }; + + var dataAdd = function(data, codePoint) { + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var lastIndex = null; + var length = data.length; + if (codePoint < 0x0 || codePoint > 0x10FFFF) { + throw RangeError(ERRORS.codePointRange); + } + while (index < length) { + start = data[index]; + end = data[index + 1]; + + // Check if the code point is already in the set. + if (codePoint >= start && codePoint < end) { + return data; + } + + if (codePoint == start - 1) { + // Just replace `start` with a new value. + data[index] = codePoint; + return data; + } + + // At this point, if `start` is `greater` than `codePoint`, insert a new + // `[start, end]` pair before the current pair, or after the current pair + // if there is a known `lastIndex`. + if (start > codePoint) { + data.splice( + lastIndex != null ? lastIndex + 2 : 0, + 0, + codePoint, + codePoint + 1 + ); + return data; + } + + if (codePoint == end) { + // Check if adding this code point causes two separate ranges to become + // a single range, e.g. `dataAdd([0, 4, 5, 10], 4)` → `[0, 10]`. + if (codePoint + 1 == data[index + 2]) { + data.splice(index, 4, start, data[index + 3]); + return data; + } + // Else, just replace `end` with a new value. + data[index + 1] = codePoint + 1; + return data; + } + lastIndex = index; + index += 2; + } + // The loop has finished; add the new pair to the end of the data set. + data.push(codePoint, codePoint + 1); + return data; + }; + + var dataAddData = function(dataA, dataB) { + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var data = dataA.slice(); + var length = dataB.length; + while (index < length) { + start = dataB[index]; + end = dataB[index + 1] - 1; + if (start == end) { + data = dataAdd(data, start); + } else { + data = dataAddRange(data, start, end); + } + index += 2; + } + return data; + }; + + var dataRemoveData = function(dataA, dataB) { + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var data = dataA.slice(); + var length = dataB.length; + while (index < length) { + start = dataB[index]; + end = dataB[index + 1] - 1; + if (start == end) { + data = dataRemove(data, start); + } else { + data = dataRemoveRange(data, start, end); + } + index += 2; + } + return data; + }; + + var dataAddRange = function(data, rangeStart, rangeEnd) { + if (rangeEnd < rangeStart) { + throw Error(ERRORS.rangeOrder); + } + if ( + rangeStart < 0x0 || rangeStart > 0x10FFFF || + rangeEnd < 0x0 || rangeEnd > 0x10FFFF + ) { + throw RangeError(ERRORS.codePointRange); + } + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var added = false; + var length = data.length; + while (index < length) { + start = data[index]; + end = data[index + 1]; + + if (added) { + // The range has already been added to the set; at this point, we just + // need to get rid of the following ranges in case they overlap. + + // Check if this range can be combined with the previous range. + if (start == rangeEnd + 1) { + data.splice(index - 1, 2); + return data; + } + + // Exit as soon as no more possibly overlapping pairs can be found. + if (start > rangeEnd) { + return data; + } + + // E.g. `[0, 11, 12, 16]` and we’ve added 5-15, so we now have + // `[0, 16, 12, 16]`. Remove the `12,16` part, as it lies within the + // `0,16` range that was previously added. + if (start >= rangeStart && start <= rangeEnd) { + // `start` lies within the range that was previously added. + + if (end > rangeStart && end - 1 <= rangeEnd) { + // `end` lies within the range that was previously added as well, + // so remove this pair. + data.splice(index, 2); + index -= 2; + // Note: we cannot `return` just yet, as there may still be other + // overlapping pairs. + } else { + // `start` lies within the range that was previously added, but + // `end` doesn’t. E.g. `[0, 11, 12, 31]` and we’ve added 5-15, so + // now we have `[0, 16, 12, 31]`. This must be written as `[0, 31]`. + // Remove the previously added `end` and the current `start`. + data.splice(index - 1, 2); + index -= 2; + } + + // Note: we cannot return yet. + } + + } + + else if (start == rangeEnd + 1) { + data[index] = rangeStart; + return data; + } + + // Check if a new pair must be inserted *before* the current one. + else if (start > rangeEnd) { + data.splice(index, 0, rangeStart, rangeEnd + 1); + return data; + } + + else if (rangeStart >= start && rangeStart < end && rangeEnd + 1 <= end) { + // The new range lies entirely within an existing range pair. No action + // needed. + return data; + } + + else if ( + // E.g. `[0, 11]` and you add 5-15 → `[0, 16]`. + (rangeStart >= start && rangeStart < end) || + // E.g. `[0, 3]` and you add 3-6 → `[0, 7]`. + end == rangeStart + ) { + // Replace `end` with the new value. + data[index + 1] = rangeEnd + 1; + // Make sure the next range pair doesn’t overlap, e.g. `[0, 11, 12, 14]` + // and you add 5-15 → `[0, 16]`, i.e. remove the `12,14` part. + added = true; + // Note: we cannot `return` just yet. + } + + else if (rangeStart <= start && rangeEnd + 1 >= end) { + // The new range is a superset of the old range. + data[index] = rangeStart; + data[index + 1] = rangeEnd + 1; + added = true; + } + + index += 2; + } + // The loop has finished without doing anything; add the new pair to the end + // of the data set. + if (!added) { + data.push(rangeStart, rangeEnd + 1); + } + return data; + }; + + var dataContains = function(data, codePoint) { + var index = 0; + var length = data.length; + // Exit early if `codePoint` is not within `data`’s overall range. + var start = data[index]; + var end = data[length - 1]; + if (length >= 2) { + if (codePoint < start || codePoint > end) { + return false; + } + } + // Iterate over the data per `(start, end)` pair. + while (index < length) { + start = data[index]; + end = data[index + 1]; + if (codePoint >= start && codePoint < end) { + return true; + } + index += 2; + } + return false; + }; + + var dataIntersection = function(data, codePoints) { + var index = 0; + var length = codePoints.length; + var codePoint; + var result = []; + while (index < length) { + codePoint = codePoints[index]; + if (dataContains(data, codePoint)) { + result.push(codePoint); + } + ++index; + } + return dataFromCodePoints(result); + }; + + var dataIsEmpty = function(data) { + return !data.length; + }; + + var dataIsSingleton = function(data) { + // Check if the set only represents a single code point. + return data.length == 2 && data[0] + 1 == data[1]; + }; + + var dataToArray = function(data) { + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var result = []; + var length = data.length; + while (index < length) { + start = data[index]; + end = data[index + 1]; + while (start < end) { + result.push(start); + ++start; + } + index += 2; + } + return result; + }; + + /*--------------------------------------------------------------------------*/ + + // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + var floor = Math.floor; + var highSurrogate = function(codePoint) { + return parseInt( + floor((codePoint - 0x10000) / 0x400) + HIGH_SURROGATE_MIN, + 10 + ); + }; + + var lowSurrogate = function(codePoint) { + return parseInt( + (codePoint - 0x10000) % 0x400 + LOW_SURROGATE_MIN, + 10 + ); + }; + + var stringFromCharCode = String.fromCharCode; + var codePointToString = function(codePoint) { + var string; + // https://mathiasbynens.be/notes/javascript-escapes#single + // Note: the `\b` escape sequence for U+0008 BACKSPACE in strings has a + // different meaning in regular expressions (word boundary), so it cannot + // be used here. + if (codePoint == 0x09) { + string = '\\t'; + } + // Note: IE < 9 treats `'\v'` as `'v'`, so avoid using it. + // else if (codePoint == 0x0B) { + // string = '\\v'; + // } + else if (codePoint == 0x0A) { + string = '\\n'; + } + else if (codePoint == 0x0C) { + string = '\\f'; + } + else if (codePoint == 0x0D) { + string = '\\r'; + } + else if (codePoint == 0x5C) { + string = '\\\\'; + } + else if ( + codePoint == 0x24 || + (codePoint >= 0x28 && codePoint <= 0x2B) || + codePoint == 0x2D || codePoint == 0x2E || codePoint == 0x3F || + (codePoint >= 0x5B && codePoint <= 0x5E) || + (codePoint >= 0x7B && codePoint <= 0x7D) + ) { + // The code point maps to an unsafe printable ASCII character; + // backslash-escape it. Here’s the list of those symbols: + // + // $()*+-.?[\]^{|} + // + // See #7 for more info. + string = '\\' + stringFromCharCode(codePoint); + } + else if (codePoint >= 0x20 && codePoint <= 0x7E) { + // The code point maps to one of these printable ASCII symbols + // (including the space character): + // + // !"#%&',/0123456789:;<=>@ABCDEFGHIJKLMNO + // PQRSTUVWXYZ_`abcdefghijklmnopqrstuvwxyz~ + // + // These can safely be used directly. + string = stringFromCharCode(codePoint); + } + else if (codePoint <= 0xFF) { + // https://mathiasbynens.be/notes/javascript-escapes#hexadecimal + string = '\\x' + pad(hex(codePoint), 2); + } + else { // `codePoint <= 0xFFFF` holds true. + // https://mathiasbynens.be/notes/javascript-escapes#unicode + string = '\\u' + pad(hex(codePoint), 4); + } + + // There’s no need to account for astral symbols / surrogate pairs here, + // since `codePointToString` is private and only used for BMP code points. + // But if that’s what you need, just add an `else` block with this code: + // + // string = '\\u' + pad(hex(highSurrogate(codePoint)), 4) + // + '\\u' + pad(hex(lowSurrogate(codePoint)), 4); + + return string; + }; + + var codePointToStringUnicode = function(codePoint) { + if (codePoint <= 0xFFFF) { + return codePointToString(codePoint); + } + return '\\u{' + codePoint.toString(16).toUpperCase() + '}'; + }; + + var symbolToCodePoint = function(symbol) { + var length = symbol.length; + var first = symbol.charCodeAt(0); + var second; + if ( + first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && + length > 1 // There is a next code unit. + ) { + // `first` is a high surrogate, and there is a next character. Assume + // it’s a low surrogate (else it’s invalid usage of Regenerate anyway). + second = symbol.charCodeAt(1); + // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + return (first - HIGH_SURROGATE_MIN) * 0x400 + + second - LOW_SURROGATE_MIN + 0x10000; + } + return first; + }; + + var createBMPCharacterClasses = function(data) { + // Iterate over the data per `(start, end)` pair. + var result = ''; + var index = 0; + var start; + var end; + var length = data.length; + if (dataIsSingleton(data)) { + return codePointToString(data[0]); + } + while (index < length) { + start = data[index]; + end = data[index + 1] - 1; // Note: the `- 1` makes `end` inclusive. + if (start == end) { + result += codePointToString(start); + } else if (start + 1 == end) { + result += codePointToString(start) + codePointToString(end); + } else { + result += codePointToString(start) + '-' + codePointToString(end); + } + index += 2; + } + return '[' + result + ']'; + }; + + var createUnicodeCharacterClasses = function(data) { + // Iterate over the data per `(start, end)` pair. + var result = ''; + var index = 0; + var start; + var end; + var length = data.length; + if (dataIsSingleton(data)) { + return codePointToStringUnicode(data[0]); + } + while (index < length) { + start = data[index]; + end = data[index + 1] - 1; // Note: the `- 1` makes `end` inclusive. + if (start == end) { + result += codePointToStringUnicode(start); + } else if (start + 1 == end) { + result += codePointToStringUnicode(start) + codePointToStringUnicode(end); + } else { + result += codePointToStringUnicode(start) + '-' + codePointToStringUnicode(end); + } + index += 2; + } + return '[' + result + ']'; + }; + + var splitAtBMP = function(data) { + // Iterate over the data per `(start, end)` pair. + var loneHighSurrogates = []; + var loneLowSurrogates = []; + var bmp = []; + var astral = []; + var index = 0; + var start; + var end; + var length = data.length; + while (index < length) { + start = data[index]; + end = data[index + 1] - 1; // Note: the `- 1` makes `end` inclusive. + + if (start < HIGH_SURROGATE_MIN) { + + // The range starts and ends before the high surrogate range. + // E.g. (0, 0x10). + if (end < HIGH_SURROGATE_MIN) { + bmp.push(start, end + 1); + } + + // The range starts before the high surrogate range and ends within it. + // E.g. (0, 0xD855). + if (end >= HIGH_SURROGATE_MIN && end <= HIGH_SURROGATE_MAX) { + bmp.push(start, HIGH_SURROGATE_MIN); + loneHighSurrogates.push(HIGH_SURROGATE_MIN, end + 1); + } + + // The range starts before the high surrogate range and ends in the low + // surrogate range. E.g. (0, 0xDCFF). + if (end >= LOW_SURROGATE_MIN && end <= LOW_SURROGATE_MAX) { + bmp.push(start, HIGH_SURROGATE_MIN); + loneHighSurrogates.push(HIGH_SURROGATE_MIN, HIGH_SURROGATE_MAX + 1); + loneLowSurrogates.push(LOW_SURROGATE_MIN, end + 1); + } + + // The range starts before the high surrogate range and ends after the + // low surrogate range. E.g. (0, 0x10FFFF). + if (end > LOW_SURROGATE_MAX) { + bmp.push(start, HIGH_SURROGATE_MIN); + loneHighSurrogates.push(HIGH_SURROGATE_MIN, HIGH_SURROGATE_MAX + 1); + loneLowSurrogates.push(LOW_SURROGATE_MIN, LOW_SURROGATE_MAX + 1); + if (end <= 0xFFFF) { + bmp.push(LOW_SURROGATE_MAX + 1, end + 1); + } else { + bmp.push(LOW_SURROGATE_MAX + 1, 0xFFFF + 1); + astral.push(0xFFFF + 1, end + 1); + } + } + + } else if (start >= HIGH_SURROGATE_MIN && start <= HIGH_SURROGATE_MAX) { + + // The range starts and ends in the high surrogate range. + // E.g. (0xD855, 0xD866). + if (end >= HIGH_SURROGATE_MIN && end <= HIGH_SURROGATE_MAX) { + loneHighSurrogates.push(start, end + 1); + } + + // The range starts in the high surrogate range and ends in the low + // surrogate range. E.g. (0xD855, 0xDCFF). + if (end >= LOW_SURROGATE_MIN && end <= LOW_SURROGATE_MAX) { + loneHighSurrogates.push(start, HIGH_SURROGATE_MAX + 1); + loneLowSurrogates.push(LOW_SURROGATE_MIN, end + 1); + } + + // The range starts in the high surrogate range and ends after the low + // surrogate range. E.g. (0xD855, 0x10FFFF). + if (end > LOW_SURROGATE_MAX) { + loneHighSurrogates.push(start, HIGH_SURROGATE_MAX + 1); + loneLowSurrogates.push(LOW_SURROGATE_MIN, LOW_SURROGATE_MAX + 1); + if (end <= 0xFFFF) { + bmp.push(LOW_SURROGATE_MAX + 1, end + 1); + } else { + bmp.push(LOW_SURROGATE_MAX + 1, 0xFFFF + 1); + astral.push(0xFFFF + 1, end + 1); + } + } + + } else if (start >= LOW_SURROGATE_MIN && start <= LOW_SURROGATE_MAX) { + + // The range starts and ends in the low surrogate range. + // E.g. (0xDCFF, 0xDDFF). + if (end >= LOW_SURROGATE_MIN && end <= LOW_SURROGATE_MAX) { + loneLowSurrogates.push(start, end + 1); + } + + // The range starts in the low surrogate range and ends after the low + // surrogate range. E.g. (0xDCFF, 0x10FFFF). + if (end > LOW_SURROGATE_MAX) { + loneLowSurrogates.push(start, LOW_SURROGATE_MAX + 1); + if (end <= 0xFFFF) { + bmp.push(LOW_SURROGATE_MAX + 1, end + 1); + } else { + bmp.push(LOW_SURROGATE_MAX + 1, 0xFFFF + 1); + astral.push(0xFFFF + 1, end + 1); + } + } + + } else if (start > LOW_SURROGATE_MAX && start <= 0xFFFF) { + + // The range starts and ends after the low surrogate range. + // E.g. (0xFFAA, 0x10FFFF). + if (end <= 0xFFFF) { + bmp.push(start, end + 1); + } else { + bmp.push(start, 0xFFFF + 1); + astral.push(0xFFFF + 1, end + 1); + } + + } else { + + // The range starts and ends in the astral range. + astral.push(start, end + 1); + + } + + index += 2; + } + return { + 'loneHighSurrogates': loneHighSurrogates, + 'loneLowSurrogates': loneLowSurrogates, + 'bmp': bmp, + 'astral': astral + }; + }; + + var optimizeSurrogateMappings = function(surrogateMappings) { + var result = []; + var tmpLow = []; + var addLow = false; + var mapping; + var nextMapping; + var highSurrogates; + var lowSurrogates; + var nextHighSurrogates; + var nextLowSurrogates; + var index = -1; + var length = surrogateMappings.length; + while (++index < length) { + mapping = surrogateMappings[index]; + nextMapping = surrogateMappings[index + 1]; + if (!nextMapping) { + result.push(mapping); + continue; + } + highSurrogates = mapping[0]; + lowSurrogates = mapping[1]; + nextHighSurrogates = nextMapping[0]; + nextLowSurrogates = nextMapping[1]; + + // Check for identical high surrogate ranges. + tmpLow = lowSurrogates; + while ( + nextHighSurrogates && + highSurrogates[0] == nextHighSurrogates[0] && + highSurrogates[1] == nextHighSurrogates[1] + ) { + // Merge with the next item. + if (dataIsSingleton(nextLowSurrogates)) { + tmpLow = dataAdd(tmpLow, nextLowSurrogates[0]); + } else { + tmpLow = dataAddRange( + tmpLow, + nextLowSurrogates[0], + nextLowSurrogates[1] - 1 + ); + } + ++index; + mapping = surrogateMappings[index]; + highSurrogates = mapping[0]; + lowSurrogates = mapping[1]; + nextMapping = surrogateMappings[index + 1]; + nextHighSurrogates = nextMapping && nextMapping[0]; + nextLowSurrogates = nextMapping && nextMapping[1]; + addLow = true; + } + result.push([ + highSurrogates, + addLow ? tmpLow : lowSurrogates + ]); + addLow = false; + } + return optimizeByLowSurrogates(result); + }; + + var optimizeByLowSurrogates = function(surrogateMappings) { + if (surrogateMappings.length == 1) { + return surrogateMappings; + } + var index = -1; + var innerIndex = -1; + while (++index < surrogateMappings.length) { + var mapping = surrogateMappings[index]; + var lowSurrogates = mapping[1]; + var lowSurrogateStart = lowSurrogates[0]; + var lowSurrogateEnd = lowSurrogates[1]; + innerIndex = index; // Note: the loop starts at the next index. + while (++innerIndex < surrogateMappings.length) { + var otherMapping = surrogateMappings[innerIndex]; + var otherLowSurrogates = otherMapping[1]; + var otherLowSurrogateStart = otherLowSurrogates[0]; + var otherLowSurrogateEnd = otherLowSurrogates[1]; + if ( + lowSurrogateStart == otherLowSurrogateStart && + lowSurrogateEnd == otherLowSurrogateEnd + ) { + // Add the code points in the other item to this one. + if (dataIsSingleton(otherMapping[0])) { + mapping[0] = dataAdd(mapping[0], otherMapping[0][0]); + } else { + mapping[0] = dataAddRange( + mapping[0], + otherMapping[0][0], + otherMapping[0][1] - 1 + ); + } + // Remove the other, now redundant, item. + surrogateMappings.splice(innerIndex, 1); + --innerIndex; + } + } + } + return surrogateMappings; + }; + + var surrogateSet = function(data) { + // Exit early if `data` is an empty set. + if (!data.length) { + return []; + } + + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var startHigh; + var startLow; + var prevStartHigh = 0; + var prevEndHigh = 0; + var tmpLow = []; + var endHigh; + var endLow; + var surrogateMappings = []; + var length = data.length; + var dataHigh = []; + while (index < length) { + start = data[index]; + end = data[index + 1] - 1; + + startHigh = highSurrogate(start); + startLow = lowSurrogate(start); + endHigh = highSurrogate(end); + endLow = lowSurrogate(end); + + var startsWithLowestLowSurrogate = startLow == LOW_SURROGATE_MIN; + var endsWithHighestLowSurrogate = endLow == LOW_SURROGATE_MAX; + var complete = false; + + // Append the previous high-surrogate-to-low-surrogate mappings. + // Step 1: `(startHigh, startLow)` to `(startHigh, LOW_SURROGATE_MAX)`. + if ( + startHigh == endHigh || + startsWithLowestLowSurrogate && endsWithHighestLowSurrogate + ) { + surrogateMappings.push([ + [startHigh, endHigh + 1], + [startLow, endLow + 1] + ]); + complete = true; + } else { + surrogateMappings.push([ + [startHigh, startHigh + 1], + [startLow, LOW_SURROGATE_MAX + 1] + ]); + } + + // Step 2: `(startHigh + 1, LOW_SURROGATE_MIN)` to + // `(endHigh - 1, LOW_SURROGATE_MAX)`. + if (!complete && startHigh + 1 < endHigh) { + if (endsWithHighestLowSurrogate) { + // Combine step 2 and step 3. + surrogateMappings.push([ + [startHigh + 1, endHigh + 1], + [LOW_SURROGATE_MIN, endLow + 1] + ]); + complete = true; + } else { + surrogateMappings.push([ + [startHigh + 1, endHigh], + [LOW_SURROGATE_MIN, LOW_SURROGATE_MAX + 1] + ]); + } + } + + // Step 3. `(endHigh, LOW_SURROGATE_MIN)` to `(endHigh, endLow)`. + if (!complete) { + surrogateMappings.push([ + [endHigh, endHigh + 1], + [LOW_SURROGATE_MIN, endLow + 1] + ]); + } + + prevStartHigh = startHigh; + prevEndHigh = endHigh; + + index += 2; + } + + // The format of `surrogateMappings` is as follows: + // + // [ surrogateMapping1, surrogateMapping2 ] + // + // i.e.: + // + // [ + // [ highSurrogates1, lowSurrogates1 ], + // [ highSurrogates2, lowSurrogates2 ] + // ] + return optimizeSurrogateMappings(surrogateMappings); + }; + + var createSurrogateCharacterClasses = function(surrogateMappings) { + var result = []; + forEach(surrogateMappings, function(surrogateMapping) { + var highSurrogates = surrogateMapping[0]; + var lowSurrogates = surrogateMapping[1]; + result.push( + createBMPCharacterClasses(highSurrogates) + + createBMPCharacterClasses(lowSurrogates) + ); + }); + return result.join('|'); + }; + + var createCharacterClassesFromData = function(data, bmpOnly, hasUnicodeFlag) { + if (hasUnicodeFlag) { + return createUnicodeCharacterClasses(data); + } + var result = []; + + var parts = splitAtBMP(data); + var loneHighSurrogates = parts.loneHighSurrogates; + var loneLowSurrogates = parts.loneLowSurrogates; + var bmp = parts.bmp; + var astral = parts.astral; + var hasAstral = !dataIsEmpty(parts.astral); + var hasLoneHighSurrogates = !dataIsEmpty(loneHighSurrogates); + var hasLoneLowSurrogates = !dataIsEmpty(loneLowSurrogates); + + var surrogateMappings = surrogateSet(astral); + + if (bmpOnly) { + bmp = dataAddData(bmp, loneHighSurrogates); + hasLoneHighSurrogates = false; + bmp = dataAddData(bmp, loneLowSurrogates); + hasLoneLowSurrogates = false; + } + + if (!dataIsEmpty(bmp)) { + // The data set contains BMP code points that are not high surrogates + // needed for astral code points in the set. + result.push(createBMPCharacterClasses(bmp)); + } + if (surrogateMappings.length) { + // The data set contains astral code points; append character classes + // based on their surrogate pairs. + result.push(createSurrogateCharacterClasses(surrogateMappings)); + } + // https://gist.github.com/mathiasbynens/bbe7f870208abcfec860 + if (hasLoneHighSurrogates) { + result.push( + createBMPCharacterClasses(loneHighSurrogates) + + // Make sure the high surrogates aren’t part of a surrogate pair. + '(?![\\uDC00-\\uDFFF])' + ); + } + if (hasLoneLowSurrogates) { + result.push( + // It is not possible to accurately assert the low surrogates aren’t + // part of a surrogate pair, since JavaScript regular expressions do + // not support lookbehind. + '(?:[^\\uD800-\\uDBFF]|^)' + + createBMPCharacterClasses(loneLowSurrogates) + ); + } + return result.join('|'); + }; + + /*--------------------------------------------------------------------------*/ + + // `regenerate` can be used as a constructor (and new methods can be added to + // its prototype) but also as a regular function, the latter of which is the + // documented and most common usage. For that reason, it’s not capitalized. + var regenerate = function(value) { + if (arguments.length > 1) { + value = slice.call(arguments); + } + if (this instanceof regenerate) { + this.data = []; + return value ? this.add(value) : this; + } + return (new regenerate).add(value); + }; + + regenerate.version = '1.3.1'; + + var proto = regenerate.prototype; + extend(proto, { + 'add': function(value) { + var $this = this; + if (value == null) { + return $this; + } + if (value instanceof regenerate) { + // Allow passing other Regenerate instances. + $this.data = dataAddData($this.data, value.data); + return $this; + } + if (arguments.length > 1) { + value = slice.call(arguments); + } + if (isArray(value)) { + forEach(value, function(item) { + $this.add(item); + }); + return $this; + } + $this.data = dataAdd( + $this.data, + isNumber(value) ? value : symbolToCodePoint(value) + ); + return $this; + }, + 'remove': function(value) { + var $this = this; + if (value == null) { + return $this; + } + if (value instanceof regenerate) { + // Allow passing other Regenerate instances. + $this.data = dataRemoveData($this.data, value.data); + return $this; + } + if (arguments.length > 1) { + value = slice.call(arguments); + } + if (isArray(value)) { + forEach(value, function(item) { + $this.remove(item); + }); + return $this; + } + $this.data = dataRemove( + $this.data, + isNumber(value) ? value : symbolToCodePoint(value) + ); + return $this; + }, + 'addRange': function(start, end) { + var $this = this; + $this.data = dataAddRange($this.data, + isNumber(start) ? start : symbolToCodePoint(start), + isNumber(end) ? end : symbolToCodePoint(end) + ); + return $this; + }, + 'removeRange': function(start, end) { + var $this = this; + var startCodePoint = isNumber(start) ? start : symbolToCodePoint(start); + var endCodePoint = isNumber(end) ? end : symbolToCodePoint(end); + $this.data = dataRemoveRange( + $this.data, + startCodePoint, + endCodePoint + ); + return $this; + }, + 'intersection': function(argument) { + var $this = this; + // Allow passing other Regenerate instances. + // TODO: Optimize this by writing and using `dataIntersectionData()`. + var array = argument instanceof regenerate ? + dataToArray(argument.data) : + argument; + $this.data = dataIntersection($this.data, array); + return $this; + }, + 'contains': function(codePoint) { + return dataContains( + this.data, + isNumber(codePoint) ? codePoint : symbolToCodePoint(codePoint) + ); + }, + 'clone': function() { + var set = new regenerate; + set.data = this.data.slice(0); + return set; + }, + 'toString': function(options) { + var result = createCharacterClassesFromData( + this.data, + options ? options.bmpOnly : false, + options ? options.hasUnicodeFlag : false + ); + if (!result) { + // For an empty set, return something that can be inserted `/here/` to + // form a valid regular expression. Avoid `(?:)` since that matches the + // empty string. + return '[]'; + } + // Use `\0` instead of `\x00` where possible. + return result.replace(regexNull, '\\0$1'); + }, + 'toRegExp': function(flags) { + var pattern = this.toString( + flags && flags.indexOf('u') != -1 ? + { 'hasUnicodeFlag': true } : + null + ); + return RegExp(pattern, flags || ''); + }, + 'valueOf': function() { // Note: `valueOf` is aliased as `toArray`. + return dataToArray(this.data); + } + }); + + proto.toArray = proto.valueOf; + + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof define == 'function' && + typeof define.amd == 'object' && + define.amd + ) { + define(function() { + return regenerate; + }); + } else if (freeExports && !freeExports.nodeType) { + if (freeModule) { // in Node.js, io.js, or RingoJS v0.8.0+ + freeModule.exports = regenerate; + } else { // in Narwhal or RingoJS v0.7.0- + freeExports.regenerate = regenerate; + } + } else { // in Rhino or a web browser + root.regenerate = regenerate; + } + +}(this)); + +},{}],69:[function(require,module,exports){ +// Generated by `/scripts/character-class-escape-sets.js`. Do not edit. +var regenerate = require('regenerate'); + +exports.REGULAR = { + 'd': regenerate() + .addRange(0x30, 0x39), + 'D': regenerate() + .addRange(0x0, 0x2F) + .addRange(0x3A, 0xFFFF), + 's': regenerate(0x20, 0xA0, 0x1680, 0x180E, 0x202F, 0x205F, 0x3000, 0xFEFF) + .addRange(0x9, 0xD) + .addRange(0x2000, 0x200A) + .addRange(0x2028, 0x2029), + 'S': regenerate() + .addRange(0x0, 0x8) + .addRange(0xE, 0x1F) + .addRange(0x21, 0x9F) + .addRange(0xA1, 0x167F) + .addRange(0x1681, 0x180D) + .addRange(0x180F, 0x1FFF) + .addRange(0x200B, 0x2027) + .addRange(0x202A, 0x202E) + .addRange(0x2030, 0x205E) + .addRange(0x2060, 0x2FFF) + .addRange(0x3001, 0xFEFE) + .addRange(0xFF00, 0xFFFF), + 'w': regenerate(0x5F) + .addRange(0x30, 0x39) + .addRange(0x41, 0x5A) + .addRange(0x61, 0x7A), + 'W': regenerate(0x60) + .addRange(0x0, 0x2F) + .addRange(0x3A, 0x40) + .addRange(0x5B, 0x5E) + .addRange(0x7B, 0xFFFF) +}; + +exports.UNICODE = { + 'd': regenerate() + .addRange(0x30, 0x39), + 'D': regenerate() + .addRange(0x0, 0x2F) + .addRange(0x3A, 0x10FFFF), + 's': regenerate(0x20, 0xA0, 0x1680, 0x180E, 0x202F, 0x205F, 0x3000, 0xFEFF) + .addRange(0x9, 0xD) + .addRange(0x2000, 0x200A) + .addRange(0x2028, 0x2029), + 'S': regenerate() + .addRange(0x0, 0x8) + .addRange(0xE, 0x1F) + .addRange(0x21, 0x9F) + .addRange(0xA1, 0x167F) + .addRange(0x1681, 0x180D) + .addRange(0x180F, 0x1FFF) + .addRange(0x200B, 0x2027) + .addRange(0x202A, 0x202E) + .addRange(0x2030, 0x205E) + .addRange(0x2060, 0x2FFF) + .addRange(0x3001, 0xFEFE) + .addRange(0xFF00, 0x10FFFF), + 'w': regenerate(0x5F) + .addRange(0x30, 0x39) + .addRange(0x41, 0x5A) + .addRange(0x61, 0x7A), + 'W': regenerate(0x60) + .addRange(0x0, 0x2F) + .addRange(0x3A, 0x40) + .addRange(0x5B, 0x5E) + .addRange(0x7B, 0x10FFFF) +}; + +exports.UNICODE_IGNORE_CASE = { + 'd': regenerate() + .addRange(0x30, 0x39), + 'D': regenerate() + .addRange(0x0, 0x2F) + .addRange(0x3A, 0x10FFFF), + 's': regenerate(0x20, 0xA0, 0x1680, 0x180E, 0x202F, 0x205F, 0x3000, 0xFEFF) + .addRange(0x9, 0xD) + .addRange(0x2000, 0x200A) + .addRange(0x2028, 0x2029), + 'S': regenerate() + .addRange(0x0, 0x8) + .addRange(0xE, 0x1F) + .addRange(0x21, 0x9F) + .addRange(0xA1, 0x167F) + .addRange(0x1681, 0x180D) + .addRange(0x180F, 0x1FFF) + .addRange(0x200B, 0x2027) + .addRange(0x202A, 0x202E) + .addRange(0x2030, 0x205E) + .addRange(0x2060, 0x2FFF) + .addRange(0x3001, 0xFEFE) + .addRange(0xFF00, 0x10FFFF), + 'w': regenerate(0x5F, 0x17F, 0x212A) + .addRange(0x30, 0x39) + .addRange(0x41, 0x5A) + .addRange(0x61, 0x7A), + 'W': regenerate(0x4B, 0x53, 0x60) + .addRange(0x0, 0x2F) + .addRange(0x3A, 0x40) + .addRange(0x5B, 0x5E) + .addRange(0x7B, 0x10FFFF) +}; + +},{"regenerate":68}],70:[function(require,module,exports){ +module.exports={ + "75": 8490, + "83": 383, + "107": 8490, + "115": 383, + "181": 924, + "197": 8491, + "383": 83, + "452": 453, + "453": 452, + "455": 456, + "456": 455, + "458": 459, + "459": 458, + "497": 498, + "498": 497, + "837": 8126, + "914": 976, + "917": 1013, + "920": 1012, + "921": 8126, + "922": 1008, + "924": 181, + "928": 982, + "929": 1009, + "931": 962, + "934": 981, + "937": 8486, + "962": 931, + "976": 914, + "977": 1012, + "981": 934, + "982": 928, + "1008": 922, + "1009": 929, + "1012": [ + 920, + 977 + ], + "1013": 917, + "7776": 7835, + "7835": 7776, + "8126": [ + 837, + 921 + ], + "8486": 937, + "8490": 75, + "8491": 197, + "66560": 66600, + "66561": 66601, + "66562": 66602, + "66563": 66603, + "66564": 66604, + "66565": 66605, + "66566": 66606, + "66567": 66607, + "66568": 66608, + "66569": 66609, + "66570": 66610, + "66571": 66611, + "66572": 66612, + "66573": 66613, + "66574": 66614, + "66575": 66615, + "66576": 66616, + "66577": 66617, + "66578": 66618, + "66579": 66619, + "66580": 66620, + "66581": 66621, + "66582": 66622, + "66583": 66623, + "66584": 66624, + "66585": 66625, + "66586": 66626, + "66587": 66627, + "66588": 66628, + "66589": 66629, + "66590": 66630, + "66591": 66631, + "66592": 66632, + "66593": 66633, + "66594": 66634, + "66595": 66635, + "66596": 66636, + "66597": 66637, + "66598": 66638, + "66599": 66639, + "66600": 66560, + "66601": 66561, + "66602": 66562, + "66603": 66563, + "66604": 66564, + "66605": 66565, + "66606": 66566, + "66607": 66567, + "66608": 66568, + "66609": 66569, + "66610": 66570, + "66611": 66571, + "66612": 66572, + "66613": 66573, + "66614": 66574, + "66615": 66575, + "66616": 66576, + "66617": 66577, + "66618": 66578, + "66619": 66579, + "66620": 66580, + "66621": 66581, + "66622": 66582, + "66623": 66583, + "66624": 66584, + "66625": 66585, + "66626": 66586, + "66627": 66587, + "66628": 66588, + "66629": 66589, + "66630": 66590, + "66631": 66591, + "66632": 66592, + "66633": 66593, + "66634": 66594, + "66635": 66595, + "66636": 66596, + "66637": 66597, + "66638": 66598, + "66639": 66599, + "68736": 68800, + "68737": 68801, + "68738": 68802, + "68739": 68803, + "68740": 68804, + "68741": 68805, + "68742": 68806, + "68743": 68807, + "68744": 68808, + "68745": 68809, + "68746": 68810, + "68747": 68811, + "68748": 68812, + "68749": 68813, + "68750": 68814, + "68751": 68815, + "68752": 68816, + "68753": 68817, + "68754": 68818, + "68755": 68819, + "68756": 68820, + "68757": 68821, + "68758": 68822, + "68759": 68823, + "68760": 68824, + "68761": 68825, + "68762": 68826, + "68763": 68827, + "68764": 68828, + "68765": 68829, + "68766": 68830, + "68767": 68831, + "68768": 68832, + "68769": 68833, + "68770": 68834, + "68771": 68835, + "68772": 68836, + "68773": 68837, + "68774": 68838, + "68775": 68839, + "68776": 68840, + "68777": 68841, + "68778": 68842, + "68779": 68843, + "68780": 68844, + "68781": 68845, + "68782": 68846, + "68783": 68847, + "68784": 68848, + "68785": 68849, + "68786": 68850, + "68800": 68736, + "68801": 68737, + "68802": 68738, + "68803": 68739, + "68804": 68740, + "68805": 68741, + "68806": 68742, + "68807": 68743, + "68808": 68744, + "68809": 68745, + "68810": 68746, + "68811": 68747, + "68812": 68748, + "68813": 68749, + "68814": 68750, + "68815": 68751, + "68816": 68752, + "68817": 68753, + "68818": 68754, + "68819": 68755, + "68820": 68756, + "68821": 68757, + "68822": 68758, + "68823": 68759, + "68824": 68760, + "68825": 68761, + "68826": 68762, + "68827": 68763, + "68828": 68764, + "68829": 68765, + "68830": 68766, + "68831": 68767, + "68832": 68768, + "68833": 68769, + "68834": 68770, + "68835": 68771, + "68836": 68772, + "68837": 68773, + "68838": 68774, + "68839": 68775, + "68840": 68776, + "68841": 68777, + "68842": 68778, + "68843": 68779, + "68844": 68780, + "68845": 68781, + "68846": 68782, + "68847": 68783, + "68848": 68784, + "68849": 68785, + "68850": 68786, + "71840": 71872, + "71841": 71873, + "71842": 71874, + "71843": 71875, + "71844": 71876, + "71845": 71877, + "71846": 71878, + "71847": 71879, + "71848": 71880, + "71849": 71881, + "71850": 71882, + "71851": 71883, + "71852": 71884, + "71853": 71885, + "71854": 71886, + "71855": 71887, + "71856": 71888, + "71857": 71889, + "71858": 71890, + "71859": 71891, + "71860": 71892, + "71861": 71893, + "71862": 71894, + "71863": 71895, + "71864": 71896, + "71865": 71897, + "71866": 71898, + "71867": 71899, + "71868": 71900, + "71869": 71901, + "71870": 71902, + "71871": 71903, + "71872": 71840, + "71873": 71841, + "71874": 71842, + "71875": 71843, + "71876": 71844, + "71877": 71845, + "71878": 71846, + "71879": 71847, + "71880": 71848, + "71881": 71849, + "71882": 71850, + "71883": 71851, + "71884": 71852, + "71885": 71853, + "71886": 71854, + "71887": 71855, + "71888": 71856, + "71889": 71857, + "71890": 71858, + "71891": 71859, + "71892": 71860, + "71893": 71861, + "71894": 71862, + "71895": 71863, + "71896": 71864, + "71897": 71865, + "71898": 71866, + "71899": 71867, + "71900": 71868, + "71901": 71869, + "71902": 71870, + "71903": 71871 +} + +},{}],71:[function(require,module,exports){ +var generate = require('regjsgen').generate; +var parse = require('regjsparser').parse; +var regenerate = require('regenerate'); +var iuMappings = require('./data/iu-mappings.json'); +var ESCAPE_SETS = require('./data/character-class-escape-sets.js'); + +function getCharacterClassEscapeSet(character) { + if (unicode) { + if (ignoreCase) { + return ESCAPE_SETS.UNICODE_IGNORE_CASE[character]; + } + return ESCAPE_SETS.UNICODE[character]; + } + return ESCAPE_SETS.REGULAR[character]; +} + +var object = {}; +var hasOwnProperty = object.hasOwnProperty; +function has(object, property) { + return hasOwnProperty.call(object, property); +} + +// Prepare a Regenerate set containing all code points, used for negative +// character classes (if any). +var UNICODE_SET = regenerate().addRange(0x0, 0x10FFFF); +// Without the `u` flag, the range stops at 0xFFFF. +// https://mths.be/es6#sec-pattern-semantics +var BMP_SET = regenerate().addRange(0x0, 0xFFFF); + +// Prepare a Regenerate set containing all code points that are supposed to be +// matched by `/./u`. https://mths.be/es6#sec-atom +var DOT_SET_UNICODE = UNICODE_SET.clone() // all Unicode code points + .remove( + // minus `LineTerminator`s (https://mths.be/es6#sec-line-terminators): + 0x000A, // Line Feed + 0x000D, // Carriage Return + 0x2028, // Line Separator + 0x2029 // Paragraph Separator + ); +// Prepare a Regenerate set containing all code points that are supposed to be +// matched by `/./` (only BMP code points). +var DOT_SET = DOT_SET_UNICODE.clone() + .intersection(BMP_SET); + +// Add a range of code points + any case-folded code points in that range to a +// set. +regenerate.prototype.iuAddRange = function(min, max) { + var $this = this; + do { + var folded = caseFold(min); + if (folded) { + $this.add(folded); + } + } while (++min <= max); + return $this; +}; + +function assign(target, source) { + for (var key in source) { + // Note: `hasOwnProperty` is not needed here. + target[key] = source[key]; + } +} + +function update(item, pattern) { + // TODO: Test if memoizing `pattern` here is worth the effort. + if (!pattern) { + return; + } + var tree = parse(pattern, ''); + switch (tree.type) { + case 'characterClass': + case 'group': + case 'value': + // No wrapping needed. + break; + default: + // Wrap the pattern in a non-capturing group. + tree = wrap(tree, pattern); + } + assign(item, tree); +} + +function wrap(tree, pattern) { + // Wrap the pattern in a non-capturing group. + return { + 'type': 'group', + 'behavior': 'ignore', + 'body': [tree], + 'raw': '(?:' + pattern + ')' + }; +} + +function caseFold(codePoint) { + return has(iuMappings, codePoint) ? iuMappings[codePoint] : false; +} + +var ignoreCase = false; +var unicode = false; +function processCharacterClass(characterClassItem) { + var set = regenerate(); + var body = characterClassItem.body.forEach(function(item) { + switch (item.type) { + case 'value': + set.add(item.codePoint); + if (ignoreCase && unicode) { + var folded = caseFold(item.codePoint); + if (folded) { + set.add(folded); + } + } + break; + case 'characterClassRange': + var min = item.min.codePoint; + var max = item.max.codePoint; + set.addRange(min, max); + if (ignoreCase && unicode) { + set.iuAddRange(min, max); + } + break; + case 'characterClassEscape': + set.add(getCharacterClassEscapeSet(item.value)); + break; + // The `default` clause is only here as a safeguard; it should never be + // reached. Code coverage tools should ignore it. + /* istanbul ignore next */ + default: + throw Error('Unknown term type: ' + item.type); + } + }); + if (characterClassItem.negative) { + set = (unicode ? UNICODE_SET : BMP_SET).clone().remove(set); + } + update(characterClassItem, set.toString()); + return characterClassItem; +} + +function processTerm(item) { + switch (item.type) { + case 'dot': + update( + item, + (unicode ? DOT_SET_UNICODE : DOT_SET).toString() + ); + break; + case 'characterClass': + item = processCharacterClass(item); + break; + case 'characterClassEscape': + update( + item, + getCharacterClassEscapeSet(item.value).toString() + ); + break; + case 'alternative': + case 'disjunction': + case 'group': + case 'quantifier': + item.body = item.body.map(processTerm); + break; + case 'value': + var codePoint = item.codePoint; + var set = regenerate(codePoint); + if (ignoreCase && unicode) { + var folded = caseFold(codePoint); + if (folded) { + set.add(folded); + } + } + update(item, set.toString()); + break; + case 'anchor': + case 'empty': + case 'group': + case 'reference': + // Nothing to do here. + break; + // The `default` clause is only here as a safeguard; it should never be + // reached. Code coverage tools should ignore it. + /* istanbul ignore next */ + default: + throw Error('Unknown term type: ' + item.type); + } + return item; +}; + +module.exports = function(pattern, flags) { + var tree = parse(pattern, flags); + ignoreCase = flags ? flags.indexOf('i') > -1 : false; + unicode = flags ? flags.indexOf('u') > -1 : false; + assign(tree, processTerm(tree)); + return generate(tree); +}; + +},{"./data/character-class-escape-sets.js":69,"./data/iu-mappings.json":70,"regenerate":68,"regjsgen":72,"regjsparser":73}],72:[function(require,module,exports){ +/*! + * RegJSGen + * Copyright 2014 Benjamin Tan + * Available under MIT license + */ +;(function() { + 'use strict'; + + /** Used to determine if values are of the language type `Object` */ + var objectTypes = { + 'function': true, + 'object': true + }; + + /** Used as a reference to the global object */ + var root = (objectTypes[typeof window] && window) || this; + + /** Backup possible global object */ + var oldRoot = root; + + /** Detect free variable `exports` */ + var freeExports = objectTypes[typeof exports] && exports; + + /** Detect free variable `module` */ + var freeModule = objectTypes[typeof module] && module && !module.nodeType && module; + + /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */ + var freeGlobal = freeExports && freeModule && typeof global == 'object' && global; + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + /*! Based on https://mths.be/fromcodepoint v0.2.0 by @mathias */ + + var stringFromCharCode = String.fromCharCode; + var floor = Math.floor; + function fromCodePoint() { + var MAX_SIZE = 0x4000; + var codeUnits = []; + var highSurrogate; + var lowSurrogate; + var index = -1; + var length = arguments.length; + if (!length) { + return ''; + } + var result = ''; + while (++index < length) { + var codePoint = Number(arguments[index]); + if ( + !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity` + codePoint < 0 || // not a valid Unicode code point + codePoint > 0x10FFFF || // not a valid Unicode code point + floor(codePoint) != codePoint // not an integer + ) { + throw RangeError('Invalid code point: ' + codePoint); + } + if (codePoint <= 0xFFFF) { + // BMP code point + codeUnits.push(codePoint); + } else { + // Astral code point; split in surrogate halves + // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + codePoint -= 0x10000; + highSurrogate = (codePoint >> 10) + 0xD800; + lowSurrogate = (codePoint % 0x400) + 0xDC00; + codeUnits.push(highSurrogate, lowSurrogate); + } + if (index + 1 == length || codeUnits.length > MAX_SIZE) { + result += stringFromCharCode.apply(null, codeUnits); + codeUnits.length = 0; + } + } + return result; + } + + function assertType(type, expected) { + if (expected.indexOf('|') == -1) { + if (type == expected) { + return; + } + + throw Error('Invalid node type: ' + type); + } + + expected = assertType.hasOwnProperty(expected) + ? assertType[expected] + : (assertType[expected] = RegExp('^(?:' + expected + ')$')); + + if (expected.test(type)) { + return; + } + + throw Error('Invalid node type: ' + type); + } + + /*--------------------------------------------------------------------------*/ + + function generate(node) { + var type = node.type; + + if (generate.hasOwnProperty(type) && typeof generate[type] == 'function') { + return generate[type](node); + } + + throw Error('Invalid node type: ' + type); + } + + /*--------------------------------------------------------------------------*/ + + function generateAlternative(node) { + assertType(node.type, 'alternative'); + + var terms = node.body, + length = terms ? terms.length : 0; + + if (length == 1) { + return generateTerm(terms[0]); + } else { + var i = -1, + result = ''; + + while (++i < length) { + result += generateTerm(terms[i]); + } + + return result; + } + } + + function generateAnchor(node) { + assertType(node.type, 'anchor'); + + switch (node.kind) { + case 'start': + return '^'; + case 'end': + return '$'; + case 'boundary': + return '\\b'; + case 'not-boundary': + return '\\B'; + default: + throw Error('Invalid assertion'); + } + } + + function generateAtom(node) { + assertType(node.type, 'anchor|characterClass|characterClassEscape|dot|group|reference|value'); + + return generate(node); + } + + function generateCharacterClass(node) { + assertType(node.type, 'characterClass'); + + var classRanges = node.body, + length = classRanges ? classRanges.length : 0; + + var i = -1, + result = '['; + + if (node.negative) { + result += '^'; + } + + while (++i < length) { + result += generateClassAtom(classRanges[i]); + } + + result += ']'; + + return result; + } + + function generateCharacterClassEscape(node) { + assertType(node.type, 'characterClassEscape'); + + return '\\' + node.value; + } + + function generateCharacterClassRange(node) { + assertType(node.type, 'characterClassRange'); + + var min = node.min, + max = node.max; + + if (min.type == 'characterClassRange' || max.type == 'characterClassRange') { + throw Error('Invalid character class range'); + } + + return generateClassAtom(min) + '-' + generateClassAtom(max); + } + + function generateClassAtom(node) { + assertType(node.type, 'anchor|characterClassEscape|characterClassRange|dot|value'); + + return generate(node); + } + + function generateDisjunction(node) { + assertType(node.type, 'disjunction'); + + var body = node.body, + length = body ? body.length : 0; + + if (length == 0) { + throw Error('No body'); + } else if (length == 1) { + return generate(body[0]); + } else { + var i = -1, + result = ''; + + while (++i < length) { + if (i != 0) { + result += '|'; + } + result += generate(body[i]); + } + + return result; + } + } + + function generateDot(node) { + assertType(node.type, 'dot'); + + return '.'; + } + + function generateGroup(node) { + assertType(node.type, 'group'); + + var result = '('; + + switch (node.behavior) { + case 'normal': + break; + case 'ignore': + result += '?:'; + break; + case 'lookahead': + result += '?='; + break; + case 'negativeLookahead': + result += '?!'; + break; + default: + throw Error('Invalid behaviour: ' + node.behaviour); + } + + var body = node.body, + length = body ? body.length : 0; + + if (length == 1) { + result += generate(body[0]); + } else { + var i = -1; + + while (++i < length) { + result += generate(body[i]); + } + } + + result += ')'; + + return result; + } + + function generateQuantifier(node) { + assertType(node.type, 'quantifier'); + + var quantifier = '', + min = node.min, + max = node.max; + + switch (max) { + case undefined: + case null: + switch (min) { + case 0: + quantifier = '*' + break; + case 1: + quantifier = '+'; + break; + default: + quantifier = '{' + min + ',}'; + break; + } + break; + default: + if (min == max) { + quantifier = '{' + min + '}'; + } + else if (min == 0 && max == 1) { + quantifier = '?'; + } else { + quantifier = '{' + min + ',' + max + '}'; + } + break; + } + + if (!node.greedy) { + quantifier += '?'; + } + + return generateAtom(node.body[0]) + quantifier; + } + + function generateReference(node) { + assertType(node.type, 'reference'); + + return '\\' + node.matchIndex; + } + + function generateTerm(node) { + assertType(node.type, 'anchor|characterClass|characterClassEscape|empty|group|quantifier|reference|value'); + + return generate(node); + } + + function generateValue(node) { + assertType(node.type, 'value'); + + var kind = node.kind, + codePoint = node.codePoint; + + switch (kind) { + case 'controlLetter': + return '\\c' + fromCodePoint(codePoint + 64); + case 'hexadecimalEscape': + return '\\x' + ('00' + codePoint.toString(16).toUpperCase()).slice(-2); + case 'identifier': + return '\\' + fromCodePoint(codePoint); + case 'null': + return '\\' + codePoint; + case 'octal': + return '\\' + codePoint.toString(8); + case 'singleEscape': + switch (codePoint) { + case 0x0008: + return '\\b'; + case 0x009: + return '\\t'; + case 0x00A: + return '\\n'; + case 0x00B: + return '\\v'; + case 0x00C: + return '\\f'; + case 0x00D: + return '\\r'; + default: + throw Error('Invalid codepoint: ' + codePoint); + } + case 'symbol': + return fromCodePoint(codePoint); + case 'unicodeEscape': + return '\\u' + ('0000' + codePoint.toString(16).toUpperCase()).slice(-4); + case 'unicodeCodePointEscape': + return '\\u{' + codePoint.toString(16).toUpperCase() + '}'; + default: + throw Error('Unsupported node kind: ' + kind); + } + } + + /*--------------------------------------------------------------------------*/ + + generate.alternative = generateAlternative; + generate.anchor = generateAnchor; + generate.characterClass = generateCharacterClass; + generate.characterClassEscape = generateCharacterClassEscape; + generate.characterClassRange = generateCharacterClassRange; + generate.disjunction = generateDisjunction; + generate.dot = generateDot; + generate.group = generateGroup; + generate.quantifier = generateQuantifier; + generate.reference = generateReference; + generate.value = generateValue; + + /*--------------------------------------------------------------------------*/ + + // export regjsgen + // some AMD build optimizers, like r.js, check for condition patterns like the following: + if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { + // define as an anonymous module so, through path mapping, it can be aliased + define(function() { + return { + 'generate': generate + }; + }); + } + // check for `exports` after `define` in case a build optimizer adds an `exports` object + else if (freeExports && freeModule) { + // in Narwhal, Node.js, Rhino -require, or RingoJS + freeExports.generate = generate; + } + // in a browser or Rhino + else { + root.regjsgen = { + 'generate': generate + }; + } +}.call(this)); + +},{}],73:[function(require,module,exports){ +// regjsparser +// +// ================================================================== +// +// See ECMA-262 Standard: 15.10.1 +// +// NOTE: The ECMA-262 standard uses the term "Assertion" for /^/. Here the +// term "Anchor" is used. +// +// Pattern :: +// Disjunction +// +// Disjunction :: +// Alternative +// Alternative | Disjunction +// +// Alternative :: +// [empty] +// Alternative Term +// +// Term :: +// Anchor +// Atom +// Atom Quantifier +// +// Anchor :: +// ^ +// $ +// \ b +// \ B +// ( ? = Disjunction ) +// ( ? ! Disjunction ) +// +// Quantifier :: +// QuantifierPrefix +// QuantifierPrefix ? +// +// QuantifierPrefix :: +// * +// + +// ? +// { DecimalDigits } +// { DecimalDigits , } +// { DecimalDigits , DecimalDigits } +// +// Atom :: +// PatternCharacter +// . +// \ AtomEscape +// CharacterClass +// ( Disjunction ) +// ( ? : Disjunction ) +// +// PatternCharacter :: +// SourceCharacter but not any of: ^ $ \ . * + ? ( ) [ ] { } | +// +// AtomEscape :: +// DecimalEscape +// CharacterEscape +// CharacterClassEscape +// +// CharacterEscape[U] :: +// ControlEscape +// c ControlLetter +// HexEscapeSequence +// RegExpUnicodeEscapeSequence[?U] (ES6) +// IdentityEscape[?U] +// +// ControlEscape :: +// one of f n r t v +// ControlLetter :: +// one of +// a b c d e f g h i j k l m n o p q r s t u v w x y z +// A B C D E F G H I J K L M N O P Q R S T U V W X Y Z +// +// IdentityEscape :: +// SourceCharacter but not IdentifierPart +// +// +// +// DecimalEscape :: +// DecimalIntegerLiteral [lookahead ∉ DecimalDigit] +// +// CharacterClassEscape :: +// one of d D s S w W +// +// CharacterClass :: +// [ [lookahead ∉ {^}] ClassRanges ] +// [ ^ ClassRanges ] +// +// ClassRanges :: +// [empty] +// NonemptyClassRanges +// +// NonemptyClassRanges :: +// ClassAtom +// ClassAtom NonemptyClassRangesNoDash +// ClassAtom - ClassAtom ClassRanges +// +// NonemptyClassRangesNoDash :: +// ClassAtom +// ClassAtomNoDash NonemptyClassRangesNoDash +// ClassAtomNoDash - ClassAtom ClassRanges +// +// ClassAtom :: +// - +// ClassAtomNoDash +// +// ClassAtomNoDash :: +// SourceCharacter but not one of \ or ] or - +// \ ClassEscape +// +// ClassEscape :: +// DecimalEscape +// b +// CharacterEscape +// CharacterClassEscape + +(function() { + + function parse(str, flags) { + function addRaw(node) { + node.raw = str.substring(node.range[0], node.range[1]); + return node; + } + + function updateRawStart(node, start) { + node.range[0] = start; + return addRaw(node); + } + + function createAnchor(kind, rawLength) { + return addRaw({ + type: 'anchor', + kind: kind, + range: [ + pos - rawLength, + pos + ] + }); + } + + function createValue(kind, codePoint, from, to) { + return addRaw({ + type: 'value', + kind: kind, + codePoint: codePoint, + range: [from, to] + }); + } + + function createEscaped(kind, codePoint, value, fromOffset) { + fromOffset = fromOffset || 0; + return createValue(kind, codePoint, pos - (value.length + fromOffset), pos); + } + + function createCharacter(matches) { + var _char = matches[0]; + var first = _char.charCodeAt(0); + if (hasUnicodeFlag) { + var second; + if (_char.length === 1 && first >= 0xD800 && first <= 0xDBFF) { + second = lookahead().charCodeAt(0); + if (second >= 0xDC00 && second <= 0xDFFF) { + // Unicode surrogate pair + pos++; + return createValue( + 'symbol', + (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000, + pos - 2, pos); + } + } + } + return createValue('symbol', first, pos - 1, pos); + } + + function createDisjunction(alternatives, from, to) { + return addRaw({ + type: 'disjunction', + body: alternatives, + range: [ + from, + to + ] + }); + } + + function createDot() { + return addRaw({ + type: 'dot', + range: [ + pos - 1, + pos + ] + }); + } + + function createCharacterClassEscape(value) { + return addRaw({ + type: 'characterClassEscape', + value: value, + range: [ + pos - 2, + pos + ] + }); + } + + function createReference(matchIndex) { + return addRaw({ + type: 'reference', + matchIndex: parseInt(matchIndex, 10), + range: [ + pos - 1 - matchIndex.length, + pos + ] + }); + } + + function createGroup(behavior, disjunction, from, to) { + return addRaw({ + type: 'group', + behavior: behavior, + body: disjunction, + range: [ + from, + to + ] + }); + } + + function createQuantifier(min, max, from, to) { + if (to == null) { + from = pos - 1; + to = pos; + } + + return addRaw({ + type: 'quantifier', + min: min, + max: max, + greedy: true, + body: null, // set later on + range: [ + from, + to + ] + }); + } + + function createAlternative(terms, from, to) { + return addRaw({ + type: 'alternative', + body: terms, + range: [ + from, + to + ] + }); + } + + function createCharacterClass(classRanges, negative, from, to) { + return addRaw({ + type: 'characterClass', + body: classRanges, + negative: negative, + range: [ + from, + to + ] + }); + } + + function createClassRange(min, max, from, to) { + // See 15.10.2.15: + if (min.codePoint > max.codePoint) { + bail('invalid range in character class', min.raw + '-' + max.raw, from, to); + } + + return addRaw({ + type: 'characterClassRange', + min: min, + max: max, + range: [ + from, + to + ] + }); + } + + function flattenBody(body) { + if (body.type === 'alternative') { + return body.body; + } else { + return [body]; + } + } + + function isEmpty(obj) { + return obj.type === 'empty'; + } + + function incr(amount) { + amount = (amount || 1); + var res = str.substring(pos, pos + amount); + pos += (amount || 1); + return res; + } + + function skip(value) { + if (!match(value)) { + bail('character', value); + } + } + + function match(value) { + if (str.indexOf(value, pos) === pos) { + return incr(value.length); + } + } + + function lookahead() { + return str[pos]; + } + + function current(value) { + return str.indexOf(value, pos) === pos; + } + + function next(value) { + return str[pos + 1] === value; + } + + function matchReg(regExp) { + var subStr = str.substring(pos); + var res = subStr.match(regExp); + if (res) { + res.range = []; + res.range[0] = pos; + incr(res[0].length); + res.range[1] = pos; + } + return res; + } + + function parseDisjunction() { + // Disjunction :: + // Alternative + // Alternative | Disjunction + var res = [], from = pos; + res.push(parseAlternative()); + + while (match('|')) { + res.push(parseAlternative()); + } + + if (res.length === 1) { + return res[0]; + } + + return createDisjunction(res, from, pos); + } + + function parseAlternative() { + var res = [], from = pos; + var term; + + // Alternative :: + // [empty] + // Alternative Term + while (term = parseTerm()) { + res.push(term); + } + + if (res.length === 1) { + return res[0]; + } + + return createAlternative(res, from, pos); + } + + function parseTerm() { + // Term :: + // Anchor + // Atom + // Atom Quantifier + + if (pos >= str.length || current('|') || current(')')) { + return null; /* Means: The term is empty */ + } + + var anchor = parseAnchor(); + + if (anchor) { + return anchor; + } + + var atom = parseAtom(); + if (!atom) { + bail('Expected atom'); + } + var quantifier = parseQuantifier() || false; + if (quantifier) { + quantifier.body = flattenBody(atom); + // The quantifier contains the atom. Therefore, the beginning of the + // quantifier range is given by the beginning of the atom. + updateRawStart(quantifier, atom.range[0]); + return quantifier; + } + return atom; + } + + function parseGroup(matchA, typeA, matchB, typeB) { + var type = null, from = pos; + + if (match(matchA)) { + type = typeA; + } else if (match(matchB)) { + type = typeB; + } else { + return false; + } + + var body = parseDisjunction(); + if (!body) { + bail('Expected disjunction'); + } + skip(')'); + var group = createGroup(type, flattenBody(body), from, pos); + + if (type == 'normal') { + // Keep track of the number of closed groups. This is required for + // parseDecimalEscape(). In case the string is parsed a second time the + // value already holds the total count and no incrementation is required. + if (firstIteration) { + closedCaptureCounter++; + } + } + return group; + } + + function parseAnchor() { + // Anchor :: + // ^ + // $ + // \ b + // \ B + // ( ? = Disjunction ) + // ( ? ! Disjunction ) + var res, from = pos; + + if (match('^')) { + return createAnchor('start', 1 /* rawLength */); + } else if (match('$')) { + return createAnchor('end', 1 /* rawLength */); + } else if (match('\\b')) { + return createAnchor('boundary', 2 /* rawLength */); + } else if (match('\\B')) { + return createAnchor('not-boundary', 2 /* rawLength */); + } else { + return parseGroup('(?=', 'lookahead', '(?!', 'negativeLookahead'); + } + } + + function parseQuantifier() { + // Quantifier :: + // QuantifierPrefix + // QuantifierPrefix ? + // + // QuantifierPrefix :: + // * + // + + // ? + // { DecimalDigits } + // { DecimalDigits , } + // { DecimalDigits , DecimalDigits } + + var res, from = pos; + var quantifier; + var min, max; + + if (match('*')) { + quantifier = createQuantifier(0); + } + else if (match('+')) { + quantifier = createQuantifier(1); + } + else if (match('?')) { + quantifier = createQuantifier(0, 1); + } + else if (res = matchReg(/^\{([0-9]+)\}/)) { + min = parseInt(res[1], 10); + quantifier = createQuantifier(min, min, res.range[0], res.range[1]); + } + else if (res = matchReg(/^\{([0-9]+),\}/)) { + min = parseInt(res[1], 10); + quantifier = createQuantifier(min, undefined, res.range[0], res.range[1]); + } + else if (res = matchReg(/^\{([0-9]+),([0-9]+)\}/)) { + min = parseInt(res[1], 10); + max = parseInt(res[2], 10); + if (min > max) { + bail('numbers out of order in {} quantifier', '', from, pos); + } + quantifier = createQuantifier(min, max, res.range[0], res.range[1]); + } + + if (quantifier) { + if (match('?')) { + quantifier.greedy = false; + quantifier.range[1] += 1; + } + } + + return quantifier; + } + + function parseAtom() { + // Atom :: + // PatternCharacter + // . + // \ AtomEscape + // CharacterClass + // ( Disjunction ) + // ( ? : Disjunction ) + + var res; + + // jviereck: allow ']', '}' here as well to be compatible with browser's + // implementations: ']'.match(/]/); + // if (res = matchReg(/^[^^$\\.*+?()[\]{}|]/)) { + if (res = matchReg(/^[^^$\\.*+?(){[|]/)) { + // PatternCharacter + return createCharacter(res); + } + else if (match('.')) { + // . + return createDot(); + } + else if (match('\\')) { + // \ AtomEscape + res = parseAtomEscape(); + if (!res) { + bail('atomEscape'); + } + return res; + } + else if (res = parseCharacterClass()) { + return res; + } + else { + // ( Disjunction ) + // ( ? : Disjunction ) + return parseGroup('(?:', 'ignore', '(', 'normal'); + } + } + + function parseUnicodeSurrogatePairEscape(firstEscape) { + if (hasUnicodeFlag) { + var first, second; + if (firstEscape.kind == 'unicodeEscape' && + (first = firstEscape.codePoint) >= 0xD800 && first <= 0xDBFF && + current('\\') && next('u') ) { + var prevPos = pos; + pos++; + var secondEscape = parseClassEscape(); + if (secondEscape.kind == 'unicodeEscape' && + (second = secondEscape.codePoint) >= 0xDC00 && second <= 0xDFFF) { + // Unicode surrogate pair + firstEscape.range[1] = secondEscape.range[1]; + firstEscape.codePoint = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000; + firstEscape.type = 'value'; + firstEscape.kind = 'unicodeCodePointEscape'; + addRaw(firstEscape); + } + else { + pos = prevPos; + } + } + } + return firstEscape; + } + + function parseClassEscape() { + return parseAtomEscape(true); + } + + function parseAtomEscape(insideCharacterClass) { + // AtomEscape :: + // DecimalEscape + // CharacterEscape + // CharacterClassEscape + + var res, from = pos; + + res = parseDecimalEscape(); + if (res) { + return res; + } + + // For ClassEscape + if (insideCharacterClass) { + if (match('b')) { + // 15.10.2.19 + // The production ClassEscape :: b evaluates by returning the + // CharSet containing the one character (Unicode value 0008). + return createEscaped('singleEscape', 0x0008, '\\b'); + } else if (match('B')) { + bail('\\B not possible inside of CharacterClass', '', from); + } + } + + res = parseCharacterEscape(); + + return res; + } + + + function parseDecimalEscape() { + // DecimalEscape :: + // DecimalIntegerLiteral [lookahead ∉ DecimalDigit] + // CharacterClassEscape :: one of d D s S w W + + var res, match; + + if (res = matchReg(/^(?!0)\d+/)) { + match = res[0]; + var refIdx = parseInt(res[0], 10); + if (refIdx <= closedCaptureCounter) { + // If the number is smaller than the normal-groups found so + // far, then it is a reference... + return createReference(res[0]); + } else { + // ... otherwise it needs to be interpreted as a octal (if the + // number is in an octal format). If it is NOT octal format, + // then the slash is ignored and the number is matched later + // as normal characters. + + // Recall the negative decision to decide if the input must be parsed + // a second time with the total normal-groups. + backrefDenied.push(refIdx); + + // Reset the position again, as maybe only parts of the previous + // matched numbers are actual octal numbers. E.g. in '019' only + // the '01' should be matched. + incr(-res[0].length); + if (res = matchReg(/^[0-7]{1,3}/)) { + return createEscaped('octal', parseInt(res[0], 8), res[0], 1); + } else { + // If we end up here, we have a case like /\91/. Then the + // first slash is to be ignored and the 9 & 1 to be treated + // like ordinary characters. Create a character for the + // first number only here - other number-characters + // (if available) will be matched later. + res = createCharacter(matchReg(/^[89]/)); + return updateRawStart(res, res.range[0] - 1); + } + } + } + // Only allow octal numbers in the following. All matched numbers start + // with a zero (if the do not, the previous if-branch is executed). + // If the number is not octal format and starts with zero (e.g. `091`) + // then only the zeros `0` is treated here and the `91` are ordinary + // characters. + // Example: + // /\091/.exec('\091')[0].length === 3 + else if (res = matchReg(/^[0-7]{1,3}/)) { + match = res[0]; + if (/^0{1,3}$/.test(match)) { + // If they are all zeros, then only take the first one. + return createEscaped('null', 0x0000, '0', match.length + 1); + } else { + return createEscaped('octal', parseInt(match, 8), match, 1); + } + } else if (res = matchReg(/^[dDsSwW]/)) { + return createCharacterClassEscape(res[0]); + } + return false; + } + + function parseCharacterEscape() { + // CharacterEscape :: + // ControlEscape + // c ControlLetter + // HexEscapeSequence + // UnicodeEscapeSequence + // IdentityEscape + + var res; + if (res = matchReg(/^[fnrtv]/)) { + // ControlEscape + var codePoint = 0; + switch (res[0]) { + case 't': codePoint = 0x009; break; + case 'n': codePoint = 0x00A; break; + case 'v': codePoint = 0x00B; break; + case 'f': codePoint = 0x00C; break; + case 'r': codePoint = 0x00D; break; + } + return createEscaped('singleEscape', codePoint, '\\' + res[0]); + } else if (res = matchReg(/^c([a-zA-Z])/)) { + // c ControlLetter + return createEscaped('controlLetter', res[1].charCodeAt(0) % 32, res[1], 2); + } else if (res = matchReg(/^x([0-9a-fA-F]{2})/)) { + // HexEscapeSequence + return createEscaped('hexadecimalEscape', parseInt(res[1], 16), res[1], 2); + } else if (res = matchReg(/^u([0-9a-fA-F]{4})/)) { + // UnicodeEscapeSequence + return parseUnicodeSurrogatePairEscape( + createEscaped('unicodeEscape', parseInt(res[1], 16), res[1], 2) + ); + } else if (hasUnicodeFlag && (res = matchReg(/^u\{([0-9a-fA-F]+)\}/))) { + // RegExpUnicodeEscapeSequence (ES6 Unicode code point escape) + return createEscaped('unicodeCodePointEscape', parseInt(res[1], 16), res[1], 4); + } else { + // IdentityEscape + return parseIdentityEscape(); + } + } + + // Taken from the Esprima parser. + function isIdentifierPart(ch) { + // Generated by `tools/generate-identifier-regex.js`. + var NonAsciiIdentifierPart = new RegExp('[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B2\u08E4-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA69D\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2D\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]'); + + return (ch === 36) || (ch === 95) || // $ (dollar) and _ (underscore) + (ch >= 65 && ch <= 90) || // A..Z + (ch >= 97 && ch <= 122) || // a..z + (ch >= 48 && ch <= 57) || // 0..9 + (ch === 92) || // \ (backslash) + ((ch >= 0x80) && NonAsciiIdentifierPart.test(String.fromCharCode(ch))); + } + + function parseIdentityEscape() { + // IdentityEscape :: + // SourceCharacter but not IdentifierPart + // + // + + var ZWJ = '\u200C'; + var ZWNJ = '\u200D'; + + var tmp; + + if (!isIdentifierPart(lookahead())) { + tmp = incr(); + return createEscaped('identifier', tmp.charCodeAt(0), tmp, 1); + } + + if (match(ZWJ)) { + // + return createEscaped('identifier', 0x200C, ZWJ); + } else if (match(ZWNJ)) { + // + return createEscaped('identifier', 0x200D, ZWNJ); + } + + return null; + } + + function parseCharacterClass() { + // CharacterClass :: + // [ [lookahead ∉ {^}] ClassRanges ] + // [ ^ ClassRanges ] + + var res, from = pos; + if (res = matchReg(/^\[\^/)) { + res = parseClassRanges(); + skip(']'); + return createCharacterClass(res, true, from, pos); + } else if (match('[')) { + res = parseClassRanges(); + skip(']'); + return createCharacterClass(res, false, from, pos); + } + + return null; + } + + function parseClassRanges() { + // ClassRanges :: + // [empty] + // NonemptyClassRanges + + var res; + if (current(']')) { + // Empty array means nothing insinde of the ClassRange. + return []; + } else { + res = parseNonemptyClassRanges(); + if (!res) { + bail('nonEmptyClassRanges'); + } + return res; + } + } + + function parseHelperClassRanges(atom) { + var from, to, res; + if (current('-') && !next(']')) { + // ClassAtom - ClassAtom ClassRanges + skip('-'); + + res = parseClassAtom(); + if (!res) { + bail('classAtom'); + } + to = pos; + var classRanges = parseClassRanges(); + if (!classRanges) { + bail('classRanges'); + } + from = atom.range[0]; + if (classRanges.type === 'empty') { + return [createClassRange(atom, res, from, to)]; + } + return [createClassRange(atom, res, from, to)].concat(classRanges); + } + + res = parseNonemptyClassRangesNoDash(); + if (!res) { + bail('nonEmptyClassRangesNoDash'); + } + + return [atom].concat(res); + } + + function parseNonemptyClassRanges() { + // NonemptyClassRanges :: + // ClassAtom + // ClassAtom NonemptyClassRangesNoDash + // ClassAtom - ClassAtom ClassRanges + + var atom = parseClassAtom(); + if (!atom) { + bail('classAtom'); + } + + if (current(']')) { + // ClassAtom + return [atom]; + } + + // ClassAtom NonemptyClassRangesNoDash + // ClassAtom - ClassAtom ClassRanges + return parseHelperClassRanges(atom); + } + + function parseNonemptyClassRangesNoDash() { + // NonemptyClassRangesNoDash :: + // ClassAtom + // ClassAtomNoDash NonemptyClassRangesNoDash + // ClassAtomNoDash - ClassAtom ClassRanges + + var res = parseClassAtom(); + if (!res) { + bail('classAtom'); + } + if (current(']')) { + // ClassAtom + return res; + } + + // ClassAtomNoDash NonemptyClassRangesNoDash + // ClassAtomNoDash - ClassAtom ClassRanges + return parseHelperClassRanges(res); + } + + function parseClassAtom() { + // ClassAtom :: + // - + // ClassAtomNoDash + if (match('-')) { + return createCharacter('-'); + } else { + return parseClassAtomNoDash(); + } + } + + function parseClassAtomNoDash() { + // ClassAtomNoDash :: + // SourceCharacter but not one of \ or ] or - + // \ ClassEscape + + var res; + if (res = matchReg(/^[^\\\]-]/)) { + return createCharacter(res[0]); + } else if (match('\\')) { + res = parseClassEscape(); + if (!res) { + bail('classEscape'); + } + + return parseUnicodeSurrogatePairEscape(res); + } + } + + function bail(message, details, from, to) { + from = from == null ? pos : from; + to = to == null ? from : to; + + var contextStart = Math.max(0, from - 10); + var contextEnd = Math.min(to + 10, str.length); + + // Output a bit of context and a line pointing to where our error is. + // + // We are assuming that there are no actual newlines in the content as this is a regular expression. + var context = ' ' + str.substring(contextStart, contextEnd); + var pointer = ' ' + new Array(from - contextStart + 1).join(' ') + '^'; + + throw SyntaxError(message + ' at position ' + from + (details ? ': ' + details : '') + '\n' + context + '\n' + pointer); + } + + var backrefDenied = []; + var closedCaptureCounter = 0; + var firstIteration = true; + var hasUnicodeFlag = (flags || "").indexOf("u") !== -1; + var pos = 0; + + // Convert the input to a string and treat the empty string special. + str = String(str); + if (str === '') { + str = '(?:)'; + } + + var result = parseDisjunction(); + + if (result.range[1] !== str.length) { + bail('Could not parse entire input - got stuck', '', result.range[1]); + } + + // The spec requires to interpret the `\2` in `/\2()()/` as backreference. + // As the parser collects the number of capture groups as the string is + // parsed it is impossible to make these decisions at the point when the + // `\2` is handled. In case the local decision turns out to be wrong after + // the parsing has finished, the input string is parsed a second time with + // the total number of capture groups set. + // + // SEE: https://github.com/jviereck/regjsparser/issues/70 + for (var i = 0; i < backrefDenied.length; i++) { + if (backrefDenied[i] <= closedCaptureCounter) { + // Parse the input a second time. + pos = 0; + firstIteration = false; + return parseDisjunction(); + } + } + + return result; + } + + var regjsparser = { + parse: parse + }; + + if (typeof module !== 'undefined' && module.exports) { + module.exports = regjsparser; + } else { + window.regjsparser = regjsparser; + } + +}()); + +},{}],74:[function(require,module,exports){ +'use strict'; +module.exports = false; + +},{}],75:[function(require,module,exports){ +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} + +},{}]},{},[1])(1) +}); \ No newline at end of file diff --git a/vendor/index.html b/vendor/index.html new file mode 100644 index 0000000..1945835 --- /dev/null +++ b/vendor/index.html @@ -0,0 +1,14 @@ + + + + + Test that the CSSM bundle works in the browser + + + + + + diff --git a/vendor/src/.gitignore b/vendor/src/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/vendor/src/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/vendor/src/index.js b/vendor/src/index.js new file mode 100644 index 0000000..b4336ee --- /dev/null +++ b/vendor/src/index.js @@ -0,0 +1,57 @@ +var Core = require('css-modules-loader-core'); +var genericNames = require('generic-names') + +var extractImports = require('postcss-modules-extract-imports'); +var scope = require('postcss-modules-scope'); +var values = require('postcss-modules-values'); + +// var fs = require('fs'); +var path = require('path'); +var glob = require('glob'); +var cached = {}; + +module.exports = function(css, pathName) { + // TODO: the template should be configurable + var template = "[name]_[local]_[hash:base64:5]" + Core.scope.generateScopedName = genericNames(template, { context: process.cwd() }) + + var trace = 0; + // var core = new Core([values, extractImports, scope]); + var core = new Core(); + + function pathFetcher(file, relativeTo, depTrace) { + file = file.replace(/^["']|["']$/g, "") + var dir = path.dirname(relativeTo) + var sourcePath = glob.sync(path.join(dir, file))[0] + if (!sourcePath) { + console.error('no sourcePath', dir, file); + } + + return new Promise(function(resolve, reject) { + var _cached = cached[sourcePath]; + if (_cached) { + return resolve(_cached.exportTokens); + } + + fs.readFile(sourcePath, 'utf-8', function(error, sourceString) { + if (error) { return reject(error); } + core + .load(sourceString, sourcePath, ++trace, pathFetcher) + .then(function(result) { + cached[sourcePath] = result; + resolve(result.exportTokens); + }) + .catch(reject); + }); + }); + } + + return core.load(css, pathName, ++trace, pathFetcher) +} + +var args = process.argv.slice(2); +module.exports(args[0], args[1]).then( + function(result) { + process.stdout.write(JSON.stringify(result)) + } +) diff --git a/vendor/src/package.json b/vendor/src/package.json new file mode 100644 index 0000000..d6ed41b --- /dev/null +++ b/vendor/src/package.json @@ -0,0 +1,13 @@ +{ + "dependencies": { + "css-modules-loader-core": "^1.0.1", + "generic-names": "1.0.2", + "string-hash": "^1.1.0" + }, + "devDependencies": { + "browserify": "11.2.0" + }, + "scripts": { + "bundle": "browserify index.js -t brfs -s postcss_modules --bare -o ../bundle.js" + } +}