opal-webpack-loader 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,130 @@
1
+ // require requirements used below
2
+ const path = require('path');
3
+ const webpack = require('webpack');
4
+ const OwlResolver = require('opal-webpack-loader/resolver'); // to resolve ruby files
5
+
6
+ module.exports = {
7
+ context: path.resolve(__dirname, '<%= opal_directory %>'),
8
+ mode: "development",
9
+ optimization: {
10
+ minimize: false // dont minimize in development, to speed up hot reloads
11
+ },
12
+ performance: {
13
+ maxAssetSize: 20000000,
14
+ maxEntrypointSize: 20000000
15
+ },
16
+ entry: {
17
+ application: [path.resolve(__dirname, '<%= js_entry %>')],
18
+ application_ssr: [path.resolve(__dirname, '<%= js_ssr_entry %>')]
19
+ },
20
+ output: {
21
+ // webpack-dev-server keeps the output in memory
22
+ filename: '[name].js',
23
+ path: path.resolve(__dirname, '<%= asset_output_directory %>'),
24
+ publicPath: 'http://localhost:3035/assets/'
25
+ },
26
+ resolve: {
27
+ plugins: [
28
+ // this makes it possible for webpack to find ruby files
29
+ new OwlResolver('resolve', 'resolved')
30
+ ]
31
+ },
32
+ plugins: [
33
+ // both for hot reloading
34
+ new webpack.NamedModulesPlugin(),
35
+ new webpack.HotModuleReplacementPlugin()
36
+ ],
37
+ module: {
38
+ rules: [
39
+ {
40
+ // loader for .scss files
41
+ // test means "test for for file endings"
42
+ test: /.scss$/,
43
+ use: [
44
+ {
45
+ loader: "style-loader",
46
+ options: {
47
+ hmr: true
48
+ }
49
+ },
50
+ {
51
+ loader: "css-loader",
52
+ options: {
53
+ minimize: false // set to false to speed up hot reloads
54
+ }
55
+ },
56
+ {
57
+ loader: "sass-loader",
58
+ options: {
59
+ includePaths: [path.resolve(__dirname, '<%= stylesheets_directory %>')],
60
+ }
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ // loader for .css files
66
+ test: /.css$/,
67
+ use: [
68
+ {
69
+ loader: "style-loader",
70
+ options: {
71
+ hmr: true
72
+ }
73
+ },
74
+ {
75
+ loader: "css-loader",
76
+ options: {
77
+ minimize: false // set to false to speed up hot reloads
78
+ }
79
+ }
80
+ ]
81
+ },
82
+ {
83
+ test: /.(png|svg|jpg|gif)$/,
84
+ use: [
85
+ 'file-loader'
86
+ ]
87
+ },
88
+ {
89
+ test: /.(woff|woff2|eot|ttf|otf)$/,
90
+ use: [
91
+ 'file-loader'
92
+ ]
93
+ },
94
+ {
95
+ // opal-webpack-loader will compile and include ruby files in the pack
96
+ test: /.(rb|js.rb)$/,
97
+ use: [
98
+ {
99
+ loader: 'opal-webpack-loader',
100
+ }
101
+ ]
102
+ }
103
+ ]
104
+ },
105
+ // configuration for webpack-dev-server
106
+ devServer: {
107
+ open: false,
108
+ lazy: false,
109
+ port: 3035,
110
+ hot: true,
111
+ // hotOnly: true,
112
+ inline: true,
113
+ https: false,
114
+ disableHostCheck: true,
115
+ headers: {
116
+ "Access-Control-Allow-Origin": "*",
117
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
118
+ "Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
119
+ },
120
+ watchOptions: {
121
+ // in case of problems with hot reloading uncomment the following two lines:
122
+ // aggregateTimeout: 250,
123
+ // poll: 50,
124
+ ignored: /\bnode_modules\b/
125
+ },
126
+ contentBase: path.resolve(__dirname, 'public')
127
+ // watchContentBase: true
128
+ }
129
+ };
130
+
@@ -0,0 +1,11 @@
1
+ env = defined? Rails ? Rails.env : 'development'
2
+
3
+ if env != 'development'
4
+ OpalWebpackLoader.client_asset_path = '' # the full path is in the manifest already, like: /packs/website_packs-97fd9c2b7e7bdb112fc1.js
5
+ OpalWebpackLoader.manifest_path = 'public/assets/manifest.json'
6
+ OpalWebpackLoader.use_manifest = true
7
+ else
8
+ OpalWebpackLoader.client_asset_path = 'http://localhost:3035/assets/'
9
+ OpalWebpackLoader.manifest_path = nil
10
+ OpalWebpackLoader.use_manifest = false
11
+ end
@@ -0,0 +1,9 @@
1
+ require 'opal'
2
+
3
+ # the gem opal-autoloader may be used, so its not necessary to use 'require' all the time,
4
+ # just using 'require_tree' to bundle everything is enough:
5
+ #
6
+ # require 'opal-autoloader'
7
+ # require_tree 'my_app' # for a sub directory 'my_app'
8
+
9
+
@@ -0,0 +1,17 @@
1
+ {
2
+ "dependencies": {
3
+ },
4
+ "scripts": {
5
+ "debug": "<%= debug_script %>",
6
+ "development": "<%= development_script %>",
7
+ "production_build": "<%= production_script %>"
8
+ },
9
+ "devDependencies": {
10
+ "compression-webpack-plugin": "^2.0.0",
11
+ "opal-webpack-loader": "^<%= owl_version %>",
12
+ "webpack": "^4.30.0",
13
+ "webpack-cli": "^3.3.0",
14
+ "webpack-dev-server": "^3.3.1",
15
+ "webpack-manifest-plugin": "^2.0.4"
16
+ }
17
+ }
@@ -0,0 +1,107 @@
1
+ const path = require('path');
2
+ const OwlResolver = require('opal-webpack-loader/resolver');
3
+ const CompressionPlugin = require("compression-webpack-plugin"); // for gzipping the packs
4
+ const ManifestPlugin = require('webpack-manifest-plugin'); // for generating the manifest
5
+
6
+ module.exports = {
7
+ context: path.resolve(__dirname, '<%= opal_directory %>'),
8
+ mode: "production",
9
+ optimization: {
10
+ minimize: true // minimize
11
+ },
12
+ performance: {
13
+ maxAssetSize: 20000000,
14
+ maxEntrypointSize: 20000000
15
+ },
16
+ entry: {
17
+ application: [path.resolve(__dirname, '<%= js_entry %>')],
18
+ application_ssr: [path.resolve(__dirname, '<%= js_ssr_entry %>')]
19
+ },
20
+ output: {
21
+ filename: '[name]-[chunkhash].js', // include fingerprint in file name, so browsers get the latest
22
+ path: path.resolve(__dirname, '<%= asset_output_directory %>'),
23
+ publicPath: '/assets/'
24
+ },
25
+ resolve: {
26
+ plugins: [
27
+ new OwlResolver('resolve', 'resolved') // resolve ruby files
28
+ ]
29
+ },
30
+ plugins: [
31
+ new CompressionPlugin({ test: /^((?!application_ssr).)*$/ }), // gzip compress, exclude application_ssr.js
32
+ new ManifestPlugin({ fileName: 'manifest.json' }) // generate manifest
33
+ ],
34
+ module: {
35
+ rules: [
36
+ {
37
+ test: /.scss$/,
38
+ use: [
39
+ {
40
+ loader: "style-loader",
41
+ options: {
42
+ hmr: false
43
+ }
44
+ },
45
+ {
46
+ loader: "css-loader",
47
+ options: {
48
+ sourceMap: false, // set to false to speed up hot reloads
49
+ minimize: true // set to false to speed up hot reloads
50
+ }
51
+ },
52
+ {
53
+ loader: "sass-loader",
54
+ options: {
55
+ includePath: [path.resolve(__dirname, '<%= stylesheets_directory %>')],
56
+ sourceMap: false // set to false to speed up hot reloads
57
+ }
58
+ }
59
+ ]
60
+ },
61
+ {
62
+ // loader for .css files
63
+ test: /.css$/,
64
+ use: [
65
+ {
66
+ loader: "style-loader",
67
+ options: {
68
+ hmr: false
69
+ }
70
+ },
71
+ {
72
+ loader: "css-loader",
73
+ options: {
74
+ sourceMap: false, // set to false to speed up hot reloads
75
+ minimize: true // set to false to speed up hot reloads
76
+ }
77
+ }
78
+ ]
79
+ },
80
+ {
81
+ test: /.(png|svg|jpg|gif)$/,
82
+ use: [
83
+ 'file-loader'
84
+ ]
85
+ },
86
+ {
87
+ test: /.(woff|woff2|eot|ttf|otf)$/,
88
+ use: [
89
+ 'file-loader'
90
+ ]
91
+ },
92
+ {
93
+ // opal-webpack-loader will compile and include ruby files in the pack
94
+ test: /.(rb|js.rb)$/,
95
+ use: [
96
+ {
97
+ loader: 'opal-webpack-loader',
98
+ options: {
99
+ sourceMap: false
100
+ }
101
+ }
102
+ ]
103
+ }
104
+ ]
105
+ }
106
+ };
107
+
@@ -1,3 +1,3 @@
1
1
  module OpalWebpackLoader
2
- VERSION="0.5.0"
2
+ VERSION="0.5.1"
3
3
  end
@@ -8,5 +8,9 @@ module OpalWebpackLoader
8
8
  "<script type=\"application/javascript\" src=\"#{OpalWebpackLoader.client_asset_path}#{path}\"></script>"
9
9
  end
10
10
  end
11
+
12
+ def application_script_tag
13
+ "<script type=\"application/javascript\" src=\"#{OpalWebpackLoader.application_js_path}\"></script>"
14
+ end
11
15
  end
12
16
  end
@@ -3,28 +3,28 @@ require 'opal-webpack-loader/version'
3
3
  require 'opal-webpack-loader/manifest'
4
4
 
5
5
  module OpalWebpackLoader
6
- def self.manifest_path
7
- @manifest_path
8
- end
9
-
10
- def self.manifest_path=(path)
11
- @manifest_path = path
12
- end
13
-
14
- def self.client_asset_path
15
- @client_asset_path
16
- end
17
-
18
- def self.client_asset_path=(path)
19
- @client_asset_path = path
20
- end
21
-
22
- def self.use_manifest
23
- @use_manifest
24
- end
25
-
26
- def self.use_manifest=(bool)
27
- @use_manifest = bool
6
+ class << self
7
+ attr_accessor :client_asset_path
8
+ attr_accessor :manifest_path
9
+ attr_accessor :use_manifest
10
+
11
+ def application_js_path
12
+ if OpalWebpackLoader.use_manifest
13
+ asset_path = OpalWebpackLoader::Manifest.lookup_path_for("application.js")
14
+ "OpalWebpackLoader.client_asset_path}#{asset_path}"
15
+ else
16
+ "#{OpalWebpackLoader.client_asset_path}application.js"
17
+ end
18
+ end
19
+
20
+ def application_ssr_js_path
21
+ if OpalWebpackLoader.use_manifest
22
+ asset_path = OpalWebpackLoader::Manifest.lookup_path_for("application_ssr.js")
23
+ "OpalWebpackLoader.client_asset_path}#{asset_path}"
24
+ else
25
+ "#{OpalWebpackLoader.client_asset_path}application_ssr.js"
26
+ end
27
+ end
28
28
  end
29
29
  end
30
30
 
@@ -38,18 +38,20 @@ OpalWebpackLoader.manifest_path = File.join(Dir.getwd, 'public', 'assets', 'mani
38
38
  OpalWebpackLoader.client_asset_path = 'http://localhost:3035/assets/'
39
39
  OpalWebpackLoader.use_manifest = false
40
40
 
41
+ # TODO require yarn instead of npm
42
+ # TODO don't depend on which for non unixes
41
43
  npm = `which npm`.chop
42
44
 
43
45
  if npm != ''
44
46
  bin_dir = `npm bin`.chop
45
47
  begin
46
- owl_npm_version = `#{bin_dir}/opal-webpack-loader-npm-version`.chop
48
+ owl_npm_version = `#{File.join(bin_dir, 'opal-webpack-loader-npm-version')}`.chop
47
49
  rescue
48
50
  owl_npm_version = nil
49
51
  end
50
52
 
51
53
  if owl_npm_version != OpalWebpackLoader::VERSION
52
- raise "opal-webpack-loader: Incorrect version of npm package found or npm package not installed.\n" +
54
+ STDERR.puts "opal-webpack-loader: Incorrect version of npm package found or npm package not installed.\n" +
53
55
  "Please install the npm package for opal-webpack-loader:\n" +
54
56
  "\twith npm:\tnpm install opal-webpack-loader@#{OpalWebpackLoader::VERSION} --save-dev\n" +
55
57
  "\tor with yarn:\tyarn add opal-webpack-loader@#{OpalWebpackLoader::VERSION} --dev\n"
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ gem 'puma', '~> 3.12.0', require: false
5
+
6
+ gem 'roda', '~> 3.15.0'
7
+
8
+
9
+
10
+
@@ -0,0 +1,8 @@
1
+ require 'bundler/setup'
2
+ if ENV['FLATTERING_ENV'] && ENV['FLATTERING_ENV'] == 'test'
3
+ Bundler.require(:default, :test)
4
+ elsif ENV['FLATTERING_ENV'] && ENV['FLATTERING_ENV'] == 'production'
5
+ Bundler.require(:default, :production)
6
+ else
7
+ Bundler.require(:default, :development)
8
+ end
@@ -0,0 +1,22 @@
1
+ require './app_loader.rb'
2
+
3
+ class App < Roda
4
+
5
+
6
+ route do |r|
7
+ r.root do
8
+ <<~HTML
9
+ <html>
10
+ <head>
11
+ <title>Welcome</title>
12
+ </head>
13
+ <body>
14
+ <div>Hello world!</div>
15
+ </body>
16
+ </html>
17
+ HTML
18
+ end
19
+ end
20
+ end
21
+
22
+ run App.app
@@ -0,0 +1,96 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'owl installer' do
4
+ context 'structure: :app' do
5
+ before do
6
+ Dir.chdir('spec')
7
+ Dir.chdir('test_apps')
8
+ FileUtils.rm_rf('railing') if Dir.exist?('railing')
9
+ end
10
+
11
+ after do
12
+ Dir.chdir('..') if Dir.pwd.end_with?('railing')
13
+ FileUtils.rm_rf('railing') if Dir.exist?('railing')
14
+ Dir.chdir('..')
15
+ Dir.chdir('..')
16
+ end
17
+
18
+ it 'can install in a rails app without sprockets and webpacker gem' do
19
+ `bundle exec rails new railing --skip-git --skip-bundle --skip-sprockets --skip-spring --skip-bootsnap`
20
+ expect(Dir.exist?('railing')).to be true
21
+ Dir.chdir('railing')
22
+ arg_val = %w[rails]
23
+ expect(Dir.exist?(File.join('railing', 'config', 'webpack'))).to be false
24
+ OpalWebpackLoader::Installer::CLI.start(arg_val)
25
+
26
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application.js'))).to be true
27
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application.js_owl_new'))).to be true
28
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application_common.js'))).to be true
29
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application_debug.js'))).to be true
30
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application_ssr.js'))).to be true
31
+ expect(File.exist?(File.join('app', 'opal', 'opal_loader.rb'))).to be true
32
+ expect(File.exist?(File.join('config', 'initializers', 'opal_webpack_loader.rb'))).to be true
33
+ expect(File.exist?(File.join('config', 'webpack', 'debug.js'))).to be true
34
+ expect(File.exist?(File.join('config', 'webpack', 'development.js'))).to be true
35
+ expect(File.exist?(File.join('config', 'webpack', 'production.js'))).to be true
36
+ expect(File.exist?('package.json')).to be true
37
+ expect(File.exist?('Procfile')).to be true
38
+ end
39
+
40
+ it 'can install in a rails app without sprockets and webpacker gem specifying another opal files dir' do
41
+ `bundle exec rails new railing --skip-git --skip-bundle --skip-sprockets --skip-spring --skip-bootsnap`
42
+ expect(Dir.exist?('railing')).to be true
43
+ Dir.chdir('railing')
44
+ arg_val = %w[rails -o hyperhyper]
45
+ expect(Dir.exist?(File.join('railing', 'config', 'webpack'))).to be false
46
+ OpalWebpackLoader::Installer::CLI.start(arg_val)
47
+
48
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application.js'))).to be true
49
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application.js_owl_new'))).to be true
50
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application_common.js'))).to be true
51
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application_debug.js'))).to be true
52
+ expect(File.exist?(File.join('app', 'assets', 'javascripts', 'application_ssr.js'))).to be true
53
+ expect(File.exist?(File.join('app', 'hyperhyper', 'hyperhyper_loader.rb'))).to be true
54
+ expect(File.exist?(File.join('config', 'initializers', 'opal_webpack_loader.rb'))).to be true
55
+ expect(File.exist?(File.join('config', 'webpack', 'debug.js'))).to be true
56
+ expect(File.exist?(File.join('config', 'webpack', 'development.js'))).to be true
57
+ expect(File.exist?(File.join('config', 'webpack', 'production.js'))).to be true
58
+ expect(File.exist?('package.json')).to be true
59
+ expect(File.exist?('Procfile')).to be true
60
+ end
61
+ end
62
+
63
+ context 'structure: :flat' do
64
+ before do
65
+ Dir.chdir('spec')
66
+ Dir.chdir('test_apps')
67
+ FileUtils.rm_rf('flattering') if Dir.exist?('flattering')
68
+ end
69
+
70
+ after do
71
+ Dir.chdir('..') if Dir.pwd.end_with?('flattering')
72
+ FileUtils.rm_rf('flattering') if Dir.exist?('flattering')
73
+ Dir.chdir('..')
74
+ Dir.chdir('..')
75
+ end
76
+
77
+ it 'can install in a roda app' do
78
+ FileUtils.cp_r(File.join('..', 'fixtures', 'flattering'), File.join('.'))
79
+ expect(Dir.exist?('flattering')).to be true
80
+ Dir.chdir('flattering')
81
+ arg_val = %w[flat]
82
+ OpalWebpackLoader::Installer::CLI.start(arg_val)
83
+ expect(File.exist?(File.join('javascripts', 'application.js'))).to be true
84
+ expect(File.exist?(File.join('javascripts', 'application_common.js'))).to be true
85
+ expect(File.exist?(File.join('javascripts', 'application_debug.js'))).to be true
86
+ expect(File.exist?(File.join('javascripts', 'application_ssr.js'))).to be true
87
+ expect(File.exist?(File.join('opal', 'opal_loader.rb'))).to be true
88
+ expect(File.exist?(File.join('owl_init.rb'))).to be true
89
+ expect(File.exist?(File.join('webpack', 'debug.js'))).to be true
90
+ expect(File.exist?(File.join('webpack', 'development.js'))).to be true
91
+ expect(File.exist?(File.join('webpack', 'production.js'))).to be true
92
+ expect(File.exist?('package.json')).to be true
93
+ expect(File.exist?('Procfile')).to be true
94
+ end
95
+ end
96
+ end
data/spec/owl_spec.rb ADDED
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'owl' do
4
+ context 'in a rails app' do
5
+ before do
6
+ Dir.chdir('spec')
7
+ Dir.chdir('test_apps')
8
+ FileUtils.rm_rf('railing') if Dir.exist?('railing')
9
+ end
10
+
11
+ after do
12
+ Dir.chdir('..') if Dir.pwd.end_with?('railing')
13
+ FileUtils.rm_rf('railing') if Dir.exist?('railing')
14
+ Dir.chdir('..')
15
+ Dir.chdir('..')
16
+ end
17
+
18
+ it 'can run the production build script' do
19
+ `bundle exec rails new railing --skip-git --skip-bundle --skip-sprockets --skip-spring --skip-bootsnap`
20
+ expect(Dir.exist?('railing')).to be true
21
+ Dir.chdir('railing')
22
+ arg_val = %w[rails]
23
+ expect(Dir.exist?(File.join('railing', 'config', 'webpack'))).to be false
24
+ OpalWebpackLoader::Installer::CLI.start(arg_val)
25
+ FileUtils.mv(File.join('app', 'assets', 'javascripts', 'application.js_owl_new'), File.join('app', 'assets', 'javascripts', 'application.js´'))
26
+ gemfile = File.read('Gemfile')
27
+ gemfile << <<~GEMS
28
+
29
+ gem 'opal', github: 'janbiedermann/opal', branch: 'es6_import_export'
30
+ gem 'opal-webpack-loader', path: '#{File.realpath(File.join('..','..', '..', '..', 'opal-webpack-loader'))}'
31
+
32
+ GEMS
33
+ File.write('Gemfile', gemfile)
34
+ `yarn install`
35
+ # bundler set some environment things, but we need a clean environment, so things don't get mixed up, use env
36
+ `env -i PATH="#{ENV['PATH']}" bundle install`
37
+ expect(File.exist?('Gemfile.lock')).to be true
38
+ `env -i PATH="#{ENV['PATH']}" yarn run production_build`
39
+ expect(File.exist?(File.join('public', 'assets', 'manifest.json'))).to be true
40
+ manifest = Oj.load(File.read(File.join('public', 'assets', 'manifest.json')), mode: :strict)
41
+ application_js = manifest['application.js']
42
+ expect(File.exist?(File.join('public', application_js))).to be true
43
+ end
44
+ end
45
+
46
+ context 'in a roda app' do
47
+ before do
48
+ Dir.chdir('spec')
49
+ Dir.chdir('test_apps')
50
+ FileUtils.rm_rf('flattering') if Dir.exist?('flattering')
51
+ end
52
+
53
+ after do
54
+ Dir.chdir('..') if Dir.pwd.end_with?('flattering')
55
+ FileUtils.rm_rf('flattering') if Dir.exist?('flattering')
56
+ Dir.chdir('..')
57
+ Dir.chdir('..')
58
+ end
59
+
60
+ it 'can install in a roda app' do
61
+ FileUtils.cp_r(File.join('..', 'fixtures', 'flattering'), File.join('.'))
62
+ expect(Dir.exist?('flattering')).to be true
63
+ Dir.chdir('flattering')
64
+ arg_val = %w[flat]
65
+ OpalWebpackLoader::Installer::CLI.start(arg_val)
66
+
67
+ gemfile = File.read('Gemfile')
68
+ gemfile << <<~GEMS
69
+
70
+ gem 'opal', github: 'janbiedermann/opal', branch: 'es6_import_export'
71
+ gem 'opal-webpack-loader', path: '#{File.realpath(File.join('..','..', '..', '..', 'opal-webpack-loader'))}'
72
+
73
+ GEMS
74
+ File.write('Gemfile', gemfile)
75
+ `yarn install`
76
+ # bundler set some environment things, but we need a clean environment, so things don't get mixed up, use env
77
+ `env -i PATH="#{ENV['PATH']}" bundle install`
78
+ expect(File.exist?('Gemfile.lock')).to be true
79
+ `env -i PATH="#{ENV['PATH']}" yarn run production_build`
80
+ expect(File.exist?(File.join('public', 'assets', 'manifest.json'))).to be true
81
+ manifest = Oj.load(File.read(File.join('public', 'assets', 'manifest.json')), mode: :strict)
82
+ application_js = manifest['application.js']
83
+ expect(File.exist?(File.join('public', application_js))).to be true
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,16 @@
1
+ require 'fileutils'
2
+ require 'oj'
3
+ require 'thor'
4
+ require_relative '../lib/opal-webpack-loader/installer_cli'
5
+
6
+ RSpec.configure do |config|
7
+ config.expect_with :rspec do |expectations|
8
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
9
+ end
10
+
11
+ config.mock_with :rspec do |mocks|
12
+ mocks.verify_partial_doubles = true
13
+ end
14
+
15
+ config.shared_context_metadata_behavior = :apply_to_host_groups
16
+ end