jetpacker 0.1.0 → 0.2.0
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.
- checksums.yaml +4 -4
- data/.eslintignore +4 -0
- data/.eslintrc.js +14 -0
- data/.gitignore +11 -11
- data/.node-version +1 -0
- data/.rubocop.yml +125 -0
- data/.travis.yml +54 -5
- data/CHANGELOG.jetpacker.md +7 -0
- data/CHANGELOG.md +1000 -0
- data/CONTRIBUTING.md +33 -0
- data/Gemfile +9 -3
- data/Gemfile.lock +157 -21
- data/MIT-LICENSE +20 -0
- data/README.md +671 -16
- data/Rakefile +8 -3
- data/docs/assets.md +119 -0
- data/docs/cloud9.md +310 -0
- data/docs/css.md +253 -0
- data/docs/deployment.md +130 -0
- data/docs/docker.md +68 -0
- data/docs/engines.md +200 -0
- data/docs/env.md +65 -0
- data/docs/es6.md +72 -0
- data/docs/folder-structure.md +66 -0
- data/docs/misc.md +23 -0
- data/docs/props.md +223 -0
- data/docs/testing.md +137 -0
- data/docs/troubleshooting.md +156 -0
- data/docs/typescript.md +126 -0
- data/docs/v4-upgrade.md +142 -0
- data/docs/webpack-dev-server.md +92 -0
- data/docs/webpack.md +364 -0
- data/docs/yarn.md +23 -0
- data/gemfiles/Gemfile-rails-edge +12 -0
- data/gemfiles/Gemfile-rails.4.2.x +9 -0
- data/gemfiles/Gemfile-rails.5.0.x +9 -0
- data/gemfiles/Gemfile-rails.5.1.x +9 -0
- data/gemfiles/Gemfile-rails.5.2.x +9 -0
- data/gemfiles/Gemfile-rails.6.0.x +9 -0
- data/jetpacker.gemspec +28 -22
- data/lib/install/angular.rb +23 -0
- data/lib/install/bin/webpack +18 -0
- data/lib/install/bin/webpack-dev-server +18 -0
- data/lib/install/binstubs.rb +4 -0
- data/lib/install/coffee.rb +25 -0
- data/lib/install/config/.browserslistrc +1 -0
- data/lib/install/config/babel.config.js +72 -0
- data/lib/install/config/postcss.config.js +12 -0
- data/lib/install/config/webpack/development.js +5 -0
- data/lib/install/config/webpack/environment.js +3 -0
- data/lib/install/config/webpack/production.js +5 -0
- data/lib/install/config/webpack/test.js +5 -0
- data/lib/install/config/webpacker.yml +96 -0
- data/lib/install/elm.rb +39 -0
- data/lib/install/erb.rb +25 -0
- data/lib/install/examples/angular/hello_angular.js +7 -0
- data/lib/install/examples/angular/hello_angular/app/app.component.ts +9 -0
- data/lib/install/examples/angular/hello_angular/app/app.module.ts +16 -0
- data/lib/install/examples/angular/hello_angular/index.ts +8 -0
- data/lib/install/examples/angular/hello_angular/polyfills.ts +73 -0
- data/lib/install/examples/coffee/hello_coffee.coffee +4 -0
- data/lib/install/examples/elm/Main.elm +55 -0
- data/lib/install/examples/elm/hello_elm.js +16 -0
- data/lib/install/examples/erb/hello_erb.js.erb +6 -0
- data/lib/install/examples/react/babel.config.js +87 -0
- data/lib/install/examples/react/hello_react.jsx +26 -0
- data/lib/install/examples/react/tsconfig.json +20 -0
- data/lib/install/examples/stimulus/application.js +1 -0
- data/lib/install/examples/stimulus/controllers/hello_controller.js +18 -0
- data/lib/install/examples/stimulus/controllers/index.js +9 -0
- data/lib/install/examples/svelte/app.svelte +11 -0
- data/lib/install/examples/svelte/hello_svelte.js +20 -0
- data/lib/install/examples/typescript/hello_typescript.ts +4 -0
- data/lib/install/examples/typescript/tsconfig.json +23 -0
- data/lib/install/examples/vue/app.vue +22 -0
- data/lib/install/examples/vue/hello_vue.js +72 -0
- data/lib/install/javascript/packs/application.js +18 -0
- data/lib/install/loaders/coffee.js +6 -0
- data/lib/install/loaders/elm.js +25 -0
- data/lib/install/loaders/erb.js +11 -0
- data/lib/install/loaders/svelte.js +9 -0
- data/lib/install/loaders/typescript.js +11 -0
- data/lib/install/loaders/vue.js +6 -0
- data/lib/install/react.rb +18 -0
- data/lib/install/stimulus.rb +12 -0
- data/lib/install/svelte.rb +29 -0
- data/lib/install/template.rb +55 -0
- data/lib/install/typescript.rb +46 -0
- data/lib/install/vue.rb +49 -0
- data/lib/jetpacker/version.rb +2 -1
- data/lib/tasks/installers.rake +37 -0
- data/lib/tasks/webpacker.rake +28 -0
- data/lib/tasks/webpacker/binstubs.rake +11 -0
- data/lib/tasks/webpacker/check_binstubs.rake +12 -0
- data/lib/tasks/webpacker/check_node.rake +24 -0
- data/lib/tasks/webpacker/check_yarn.rake +24 -0
- data/lib/tasks/webpacker/clean.rake +21 -0
- data/lib/tasks/webpacker/clobber.rake +16 -0
- data/lib/tasks/webpacker/compile.rake +43 -0
- data/lib/tasks/webpacker/info.rake +20 -0
- data/lib/tasks/webpacker/install.rake +13 -0
- data/lib/tasks/webpacker/verify_install.rake +13 -0
- data/lib/tasks/webpacker/yarn_install.rake +21 -0
- data/lib/webpacker.rb +46 -0
- data/lib/webpacker/commands.rb +50 -0
- data/lib/webpacker/compiler.rb +107 -0
- data/lib/webpacker/configuration.rb +113 -0
- data/lib/webpacker/dev_server.rb +66 -0
- data/lib/webpacker/dev_server_proxy.rb +31 -0
- data/lib/webpacker/dev_server_runner.rb +72 -0
- data/lib/webpacker/env.rb +39 -0
- data/lib/webpacker/helper.rb +176 -0
- data/lib/webpacker/instance.rb +37 -0
- data/lib/webpacker/manifest.rb +118 -0
- data/lib/webpacker/railtie.rb +98 -0
- data/lib/webpacker/rake_tasks.rb +6 -0
- data/lib/webpacker/runner.rb +22 -0
- data/lib/webpacker/version.rb +4 -0
- data/lib/webpacker/webpack_runner.rb +32 -0
- data/package.json +82 -0
- data/package/__tests__/config.js +55 -0
- data/package/__tests__/dev_server.js +43 -0
- data/package/__tests__/development.js +30 -0
- data/package/__tests__/env.js +46 -0
- data/package/__tests__/production.js +29 -0
- data/package/__tests__/staging.js +29 -0
- data/package/__tests__/test.js +26 -0
- data/package/config.js +37 -0
- data/package/config_types/__tests__/config_list.js +118 -0
- data/package/config_types/__tests__/config_object.js +43 -0
- data/package/config_types/config_list.js +75 -0
- data/package/config_types/config_object.js +55 -0
- data/package/config_types/index.js +7 -0
- data/package/dev_server.js +20 -0
- data/package/env.js +19 -0
- data/package/environments/__tests__/base.js +74 -0
- data/package/environments/base.js +166 -0
- data/package/environments/development.js +51 -0
- data/package/environments/production.js +79 -0
- data/package/environments/test.js +3 -0
- data/package/index.js +24 -0
- data/package/rules/babel.js +21 -0
- data/package/rules/css.js +3 -0
- data/package/rules/file.js +20 -0
- data/package/rules/index.js +20 -0
- data/package/rules/module.css.js +3 -0
- data/package/rules/module.sass.js +8 -0
- data/package/rules/node_modules.js +24 -0
- data/package/rules/sass.js +8 -0
- data/package/utils/__tests__/deep_assign.js +32 -0
- data/package/utils/__tests__/deep_merge.js +10 -0
- data/package/utils/__tests__/get_style_rule.js +65 -0
- data/package/utils/__tests__/objectify.js +9 -0
- data/package/utils/deep_assign.js +22 -0
- data/package/utils/deep_merge.js +22 -0
- data/package/utils/get_style_rule.js +45 -0
- data/package/utils/helpers.js +58 -0
- data/package/utils/objectify.js +3 -0
- data/test/command_test.rb +33 -0
- data/test/compiler_test.rb +75 -0
- data/test/configuration_test.rb +108 -0
- data/test/dev_server_runner_test.rb +51 -0
- data/test/dev_server_test.rb +47 -0
- data/test/env_test.rb +23 -0
- data/test/helper_test.rb +142 -0
- data/test/manifest_test.rb +42 -0
- data/test/rake_tasks_test.rb +69 -0
- data/test/test_app/Rakefile +3 -0
- data/test/test_app/app/javascript/packs/application.js +10 -0
- data/test/test_app/bin/webpack +14 -0
- data/test/test_app/bin/webpack-dev-server +14 -0
- data/test/test_app/config.ru +5 -0
- data/test/test_app/config/application.rb +12 -0
- data/test/test_app/config/environment.rb +4 -0
- data/test/test_app/config/webpack/development.js +0 -0
- data/test/test_app/config/webpacker.yml +97 -0
- data/test/test_app/config/webpacker_public_root.yml +19 -0
- data/test/test_app/package.json +13 -0
- data/test/test_app/public/packs/manifest.json +31 -0
- data/test/test_app/yarn.lock +11 -0
- data/test/test_helper.rb +33 -0
- data/test/webpack_runner_test.rb +51 -0
- data/test/webpacker_test.rb +13 -0
- data/yarn.lock +8321 -0
- metadata +267 -29
- data/.rspec +0 -3
- data/LICENSE.txt +0 -21
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/lib/jetpacker.rb +0 -6
@@ -0,0 +1,29 @@
|
|
1
|
+
/* test expect, describe, afterAll, beforeEach */
|
2
|
+
|
3
|
+
const { resolve } = require('path')
|
4
|
+
const { chdirTestApp, chdirCwd } = require('../utils/helpers')
|
5
|
+
|
6
|
+
chdirTestApp()
|
7
|
+
|
8
|
+
describe('Custom environment', () => {
|
9
|
+
afterAll(chdirCwd)
|
10
|
+
|
11
|
+
describe('toWebpackConfig', () => {
|
12
|
+
beforeEach(() => jest.resetModules())
|
13
|
+
|
14
|
+
test('should use staging config and default production environment', () => {
|
15
|
+
process.env.RAILS_ENV = 'staging'
|
16
|
+
delete process.env.NODE_ENV
|
17
|
+
|
18
|
+
const { environment } = require('../index')
|
19
|
+
const config = environment.toWebpackConfig()
|
20
|
+
|
21
|
+
expect(config.output.path).toEqual(resolve('public', 'packs-staging'))
|
22
|
+
expect(config.output.publicPath).toEqual('/packs-staging/')
|
23
|
+
expect(config).toMatchObject({
|
24
|
+
devtool: 'source-map',
|
25
|
+
stats: 'normal'
|
26
|
+
})
|
27
|
+
})
|
28
|
+
})
|
29
|
+
})
|
@@ -0,0 +1,26 @@
|
|
1
|
+
/* test expect, describe, afterAll, beforeEach */
|
2
|
+
|
3
|
+
const { resolve } = require('path')
|
4
|
+
const { chdirTestApp, chdirCwd } = require('../utils/helpers')
|
5
|
+
|
6
|
+
chdirTestApp()
|
7
|
+
|
8
|
+
describe('Test environment', () => {
|
9
|
+
afterAll(chdirCwd)
|
10
|
+
|
11
|
+
describe('toWebpackConfig', () => {
|
12
|
+
beforeEach(() => jest.resetModules())
|
13
|
+
|
14
|
+
test('should use test config and production environment', () => {
|
15
|
+
process.env.RAILS_ENV = 'test'
|
16
|
+
process.env.NODE_ENV = 'test'
|
17
|
+
|
18
|
+
const { environment } = require('../index')
|
19
|
+
const config = environment.toWebpackConfig()
|
20
|
+
|
21
|
+
expect(config.output.path).toEqual(resolve('public', 'packs-test'))
|
22
|
+
expect(config.output.publicPath).toEqual('/packs-test/')
|
23
|
+
expect(config.devServer).toEqual(undefined)
|
24
|
+
})
|
25
|
+
})
|
26
|
+
})
|
data/package/config.js
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
const { resolve } = require('path')
|
2
|
+
const { safeLoad } = require('js-yaml')
|
3
|
+
const { readFileSync } = require('fs')
|
4
|
+
const deepMerge = require('./utils/deep_merge')
|
5
|
+
const { isArray, ensureTrailingSlash } = require('./utils/helpers')
|
6
|
+
const { railsEnv } = require('./env')
|
7
|
+
|
8
|
+
const defaultConfigPath = require.resolve('../lib/install/config/webpacker.yml')
|
9
|
+
const configPath = resolve('config', 'webpacker.yml')
|
10
|
+
|
11
|
+
const getDefaultConfig = () => {
|
12
|
+
const defaultConfig = safeLoad(readFileSync(defaultConfigPath), 'utf8')
|
13
|
+
return defaultConfig[railsEnv] || defaultConfig.production
|
14
|
+
}
|
15
|
+
|
16
|
+
const defaults = getDefaultConfig()
|
17
|
+
const app = safeLoad(readFileSync(configPath), 'utf8')[railsEnv]
|
18
|
+
|
19
|
+
if (isArray(app.extensions) && app.extensions.length) delete defaults.extensions
|
20
|
+
if (isArray(app.static_assets_extensions) && app.static_assets_extensions.length) {
|
21
|
+
delete defaults.static_assets_extensions
|
22
|
+
}
|
23
|
+
|
24
|
+
const config = deepMerge(defaults, app)
|
25
|
+
config.outputPath = resolve(config.public_root_path, config.public_output_path)
|
26
|
+
|
27
|
+
// Ensure that the publicPath includes our asset host so dynamic imports
|
28
|
+
// (code-splitting chunks and static assets) load from the CDN instead of a relative path.
|
29
|
+
const getPublicPath = () => {
|
30
|
+
const rootUrl = ensureTrailingSlash(process.env.WEBPACKER_ASSET_HOST || '/')
|
31
|
+
return `${rootUrl}${config.public_output_path}/`
|
32
|
+
}
|
33
|
+
|
34
|
+
config.publicPath = getPublicPath()
|
35
|
+
config.publicPathWithoutCDN = `/${config.public_output_path}/`
|
36
|
+
|
37
|
+
module.exports = config
|
@@ -0,0 +1,118 @@
|
|
1
|
+
/* global test expect */
|
2
|
+
|
3
|
+
const ConfigList = require('../config_list')
|
4
|
+
|
5
|
+
test('new', () => {
|
6
|
+
const list = new ConfigList()
|
7
|
+
expect(list).toBeInstanceOf(ConfigList)
|
8
|
+
expect(list).toBeInstanceOf(Array)
|
9
|
+
})
|
10
|
+
|
11
|
+
test('get', () => {
|
12
|
+
const list = new ConfigList()
|
13
|
+
list.append('key', 'value')
|
14
|
+
expect(list.get('key')).toEqual('value')
|
15
|
+
})
|
16
|
+
|
17
|
+
test('append', () => {
|
18
|
+
const list = new ConfigList()
|
19
|
+
list.append('key', 'value')
|
20
|
+
expect(list.append('key1', 'value1')).toEqual([
|
21
|
+
{ key: 'key', value: 'value' },
|
22
|
+
{ key: 'key1', value: 'value1' }
|
23
|
+
])
|
24
|
+
})
|
25
|
+
|
26
|
+
test('prepend', () => {
|
27
|
+
const list = new ConfigList()
|
28
|
+
list.append('key', 'value')
|
29
|
+
expect(list.prepend('key1', 'value1')).toEqual([
|
30
|
+
{ key: 'key1', value: 'value1' },
|
31
|
+
{ key: 'key', value: 'value' }
|
32
|
+
])
|
33
|
+
})
|
34
|
+
|
35
|
+
test('insert without position', () => {
|
36
|
+
const list = new ConfigList()
|
37
|
+
list.append('key', 'value')
|
38
|
+
|
39
|
+
expect(list.insert('key1', 'value1')).toEqual([
|
40
|
+
{ key: 'key', value: 'value' },
|
41
|
+
{ key: 'key1', value: 'value1' }
|
42
|
+
])
|
43
|
+
|
44
|
+
expect(list.insert('key2', 'value2')).toEqual([
|
45
|
+
{ key: 'key', value: 'value' },
|
46
|
+
{ key: 'key1', value: 'value1' },
|
47
|
+
{ key: 'key2', value: 'value2' }
|
48
|
+
])
|
49
|
+
})
|
50
|
+
|
51
|
+
test('insert before an item', () => {
|
52
|
+
const list = new ConfigList()
|
53
|
+
list.append('key', 'value')
|
54
|
+
list.append('key1', 'value1')
|
55
|
+
|
56
|
+
expect(list.insert('key2', 'value2', { before: 'key' })).toEqual([
|
57
|
+
{ key: 'key2', value: 'value2' },
|
58
|
+
{ key: 'key', value: 'value' },
|
59
|
+
{ key: 'key1', value: 'value1' }
|
60
|
+
])
|
61
|
+
|
62
|
+
expect(list.insert('key3', 'value3', { before: 'key2' })).toEqual([
|
63
|
+
{ key: 'key3', value: 'value3' },
|
64
|
+
{ key: 'key2', value: 'value2' },
|
65
|
+
{ key: 'key', value: 'value' },
|
66
|
+
{ key: 'key1', value: 'value1' }
|
67
|
+
])
|
68
|
+
})
|
69
|
+
|
70
|
+
test('insert after an item', () => {
|
71
|
+
const list = new ConfigList()
|
72
|
+
list.append('key', 'value')
|
73
|
+
list.append('key1', 'value1')
|
74
|
+
|
75
|
+
expect(list.insert('key2', 'value2', { after: 'key' })).toEqual([
|
76
|
+
{ key: 'key', value: 'value' },
|
77
|
+
{ key: 'key2', value: 'value2' },
|
78
|
+
{ key: 'key1', value: 'value1' }
|
79
|
+
])
|
80
|
+
|
81
|
+
expect(list.insert('key3', 'value3', { after: 'key2' })).toEqual([
|
82
|
+
{ key: 'key', value: 'value' },
|
83
|
+
{ key: 'key2', value: 'value2' },
|
84
|
+
{ key: 'key3', value: 'value3' },
|
85
|
+
{ key: 'key1', value: 'value1' }
|
86
|
+
])
|
87
|
+
})
|
88
|
+
|
89
|
+
test('delete', () => {
|
90
|
+
const list = new ConfigList()
|
91
|
+
list.append('key', 'value')
|
92
|
+
list.append('key1', 'value1')
|
93
|
+
expect(list.delete('key')).toEqual([{ key: 'key1', value: 'value1' }])
|
94
|
+
expect(list.delete('key1')).toEqual([])
|
95
|
+
})
|
96
|
+
|
97
|
+
test('getIndex', () => {
|
98
|
+
const list = new ConfigList()
|
99
|
+
list.append('key', 'value')
|
100
|
+
list.append('key1', 'value1')
|
101
|
+
expect(list.getIndex('key')).toEqual(0)
|
102
|
+
expect(list.getIndex('key2')).toEqual(-1)
|
103
|
+
expect(() => list.getIndex('key2', true)).toThrow('Item key2 not found')
|
104
|
+
})
|
105
|
+
|
106
|
+
test('values', () => {
|
107
|
+
const list = new ConfigList()
|
108
|
+
list.append('key', 'value')
|
109
|
+
list.append('key1', 'value1')
|
110
|
+
expect(list.values()).toEqual(['value', 'value1'])
|
111
|
+
})
|
112
|
+
|
113
|
+
test('keys', () => {
|
114
|
+
const list = new ConfigList()
|
115
|
+
list.append('key', 'value')
|
116
|
+
list.append('key1', 'value1')
|
117
|
+
expect(list.keys()).toEqual(['key', 'key1'])
|
118
|
+
})
|
@@ -0,0 +1,43 @@
|
|
1
|
+
/* global test expect */
|
2
|
+
|
3
|
+
const ConfigObject = require('../config_object')
|
4
|
+
|
5
|
+
test('new', () => {
|
6
|
+
const object = new ConfigObject()
|
7
|
+
expect(object).toBeInstanceOf(ConfigObject)
|
8
|
+
expect(object).toBeInstanceOf(Object)
|
9
|
+
})
|
10
|
+
|
11
|
+
test('set', () => {
|
12
|
+
const object = new ConfigObject()
|
13
|
+
expect(object.set('key', 'value')).toEqual({ key: 'value' })
|
14
|
+
})
|
15
|
+
|
16
|
+
test('get', () => {
|
17
|
+
const object = new ConfigObject()
|
18
|
+
object.set('key', 'value')
|
19
|
+
object.set('key1', 'value1')
|
20
|
+
expect(object.get('key')).toEqual('value')
|
21
|
+
})
|
22
|
+
|
23
|
+
test('delete', () => {
|
24
|
+
const object = new ConfigObject()
|
25
|
+
object.set('key', { key1: 'value' })
|
26
|
+
expect(object.delete('key.key1')).toEqual({ key: {} })
|
27
|
+
expect(object.delete('key')).toEqual({})
|
28
|
+
})
|
29
|
+
|
30
|
+
test('toObject', () => {
|
31
|
+
const object = new ConfigObject()
|
32
|
+
object.set('key', 'value')
|
33
|
+
object.set('key1', 'value1')
|
34
|
+
expect(object.toObject()).toEqual({ key: 'value', key1: 'value1' })
|
35
|
+
})
|
36
|
+
|
37
|
+
test('merge', () => {
|
38
|
+
const object = new ConfigObject()
|
39
|
+
object.set('foo', {})
|
40
|
+
expect(object.merge({ key: 'foo', value: 'bar' })).toEqual(
|
41
|
+
{ foo: {}, key: 'foo', value: 'bar' }
|
42
|
+
)
|
43
|
+
})
|
@@ -0,0 +1,75 @@
|
|
1
|
+
/**
|
2
|
+
* @class
|
3
|
+
* @extends { Array }
|
4
|
+
*/
|
5
|
+
class ConfigList extends Array {
|
6
|
+
static get [Symbol.species]() { return Array }
|
7
|
+
|
8
|
+
get(key) {
|
9
|
+
const index = this.getIndex(key, true)
|
10
|
+
return this[index].value
|
11
|
+
}
|
12
|
+
|
13
|
+
append(key, value) {
|
14
|
+
return this.add({ key, value })
|
15
|
+
}
|
16
|
+
|
17
|
+
prepend(key, value) {
|
18
|
+
return this.add({ key, value }, 'prepend')
|
19
|
+
}
|
20
|
+
|
21
|
+
insert(key, value, pos = {}) {
|
22
|
+
if (!(pos.before || pos.after)) return this.append(key, value)
|
23
|
+
|
24
|
+
const currentIndex = this.getIndex(key)
|
25
|
+
if (currentIndex >= 0) this.splice(currentIndex, 1)
|
26
|
+
|
27
|
+
let newIndex = this.getIndex(pos.before || pos.after)
|
28
|
+
if (pos.after) newIndex += 1
|
29
|
+
|
30
|
+
this.splice(newIndex, 0, { key, value })
|
31
|
+
return this
|
32
|
+
}
|
33
|
+
|
34
|
+
delete(key) {
|
35
|
+
const index = this.getIndex(key, true)
|
36
|
+
this.splice(index, 1)
|
37
|
+
return this
|
38
|
+
}
|
39
|
+
|
40
|
+
getIndex(key, shouldThrow = false) {
|
41
|
+
const index = this.findIndex((entry) => (
|
42
|
+
entry === key
|
43
|
+
|| entry.key === key
|
44
|
+
|| (entry.constructor && entry.constructor.name === key)
|
45
|
+
))
|
46
|
+
|
47
|
+
if (shouldThrow && index < 0) throw new Error(`Item ${key} not found`)
|
48
|
+
return index
|
49
|
+
}
|
50
|
+
|
51
|
+
add({ key, value }, strategy = 'append') {
|
52
|
+
const index = this.getIndex(key)
|
53
|
+
if (index >= 0) this.delete(key)
|
54
|
+
|
55
|
+
switch (strategy) {
|
56
|
+
case 'prepend':
|
57
|
+
this.unshift({ key, value })
|
58
|
+
break
|
59
|
+
default:
|
60
|
+
this.push({ key, value })
|
61
|
+
}
|
62
|
+
|
63
|
+
return this
|
64
|
+
}
|
65
|
+
|
66
|
+
values() {
|
67
|
+
return this.map((item) => item.value)
|
68
|
+
}
|
69
|
+
|
70
|
+
keys() {
|
71
|
+
return this.map((item) => item.key)
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
module.exports = ConfigList
|
@@ -0,0 +1,55 @@
|
|
1
|
+
const objectify = require('../utils/objectify')
|
2
|
+
const deepAssign = require('../utils/deep_assign')
|
3
|
+
const deepMerge = require('../utils/deep_merge')
|
4
|
+
const { isStrPath, prettyPrint } = require('../utils/helpers')
|
5
|
+
|
6
|
+
/**
|
7
|
+
* @class
|
8
|
+
* @extends { Object }
|
9
|
+
*/
|
10
|
+
class ConfigObject extends Object {
|
11
|
+
constructor(props = {}) {
|
12
|
+
super()
|
13
|
+
this.merge(props)
|
14
|
+
}
|
15
|
+
|
16
|
+
get(key) {
|
17
|
+
return isStrPath(key) ? objectify(key, this) : this[key]
|
18
|
+
}
|
19
|
+
|
20
|
+
set(key, value) {
|
21
|
+
Object.assign(this, deepAssign(this, key, value))
|
22
|
+
return this
|
23
|
+
}
|
24
|
+
|
25
|
+
delete(key) {
|
26
|
+
let obj = this
|
27
|
+
let propKey = key
|
28
|
+
|
29
|
+
if (isStrPath(key)) {
|
30
|
+
const keys = key.split('.')
|
31
|
+
propKey = keys.pop()
|
32
|
+
const parentObjPath = keys.join('.')
|
33
|
+
obj = objectify(parentObjPath, this)
|
34
|
+
}
|
35
|
+
|
36
|
+
if (!obj) throw new Error(`Prop not found: ${key} in ${prettyPrint(obj)}`)
|
37
|
+
delete obj[propKey]
|
38
|
+
|
39
|
+
return this
|
40
|
+
}
|
41
|
+
|
42
|
+
toObject() {
|
43
|
+
const object = {}
|
44
|
+
/* eslint no-return-assign: 0 */
|
45
|
+
Object.keys(this).forEach((key) => (object[key] = this[key]))
|
46
|
+
return object
|
47
|
+
}
|
48
|
+
|
49
|
+
merge(config) {
|
50
|
+
Object.assign(this, deepMerge(this, config))
|
51
|
+
return this
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
module.exports = ConfigObject
|
@@ -0,0 +1,20 @@
|
|
1
|
+
const { isBoolean } = require('./utils/helpers')
|
2
|
+
const config = require('./config')
|
3
|
+
|
4
|
+
const fetch = (key) => {
|
5
|
+
const value = process.env[key]
|
6
|
+
return isBoolean(value) ? JSON.parse(value) : value
|
7
|
+
}
|
8
|
+
|
9
|
+
const devServerConfig = config.dev_server
|
10
|
+
|
11
|
+
if (devServerConfig) {
|
12
|
+
const envPrefix = config.dev_server.env_prefix || 'WEBPACKER_DEV_SERVER'
|
13
|
+
|
14
|
+
Object.keys(devServerConfig).forEach((key) => {
|
15
|
+
const envValue = fetch(`${envPrefix}_${key.toUpperCase().replace(/_/g, '')}`)
|
16
|
+
if (envValue !== undefined) devServerConfig[key] = envValue
|
17
|
+
})
|
18
|
+
}
|
19
|
+
|
20
|
+
module.exports = devServerConfig || {}
|
data/package/env.js
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
const { resolve } = require('path')
|
2
|
+
const { safeLoad } = require('js-yaml')
|
3
|
+
const { readFileSync } = require('fs')
|
4
|
+
|
5
|
+
const NODE_ENVIRONMENTS = ['development', 'production', 'test']
|
6
|
+
const DEFAULT = 'production'
|
7
|
+
const configPath = resolve('config', 'webpacker.yml')
|
8
|
+
|
9
|
+
const railsEnv = process.env.RAILS_ENV
|
10
|
+
const nodeEnv = process.env.NODE_ENV
|
11
|
+
|
12
|
+
const config = safeLoad(readFileSync(configPath), 'utf8')
|
13
|
+
const availableEnvironments = Object.keys(config).join('|')
|
14
|
+
const regex = new RegExp(`^(${availableEnvironments})$`, 'g')
|
15
|
+
|
16
|
+
module.exports = {
|
17
|
+
railsEnv: railsEnv && railsEnv.match(regex) ? railsEnv : DEFAULT,
|
18
|
+
nodeEnv: nodeEnv && NODE_ENVIRONMENTS.includes(nodeEnv) ? nodeEnv : DEFAULT
|
19
|
+
}
|
@@ -0,0 +1,74 @@
|
|
1
|
+
/* global test expect, describe, afterAll, beforeEach */
|
2
|
+
|
3
|
+
// environment.js expects to find config/webpacker.yml and resolved modules from
|
4
|
+
// the root of a Rails project
|
5
|
+
|
6
|
+
const { chdirTestApp, chdirCwd } = require('../../utils/helpers')
|
7
|
+
|
8
|
+
chdirTestApp()
|
9
|
+
|
10
|
+
const { resolve } = require('path')
|
11
|
+
const rules = require('../../rules')
|
12
|
+
const { ConfigList } = require('../../config_types')
|
13
|
+
const Environment = require('../base')
|
14
|
+
|
15
|
+
describe('Environment', () => {
|
16
|
+
afterAll(chdirCwd)
|
17
|
+
|
18
|
+
let environment
|
19
|
+
|
20
|
+
describe('toWebpackConfig', () => {
|
21
|
+
beforeEach(() => {
|
22
|
+
environment = new Environment()
|
23
|
+
})
|
24
|
+
|
25
|
+
test('should return entry', () => {
|
26
|
+
const config = environment.toWebpackConfig()
|
27
|
+
expect(config.entry.application).toEqual(
|
28
|
+
resolve('app', 'javascript', 'packs', 'application.js')
|
29
|
+
)
|
30
|
+
})
|
31
|
+
|
32
|
+
test('should return output', () => {
|
33
|
+
const config = environment.toWebpackConfig()
|
34
|
+
expect(config.output.filename).toEqual('js/[name]-[contenthash].js')
|
35
|
+
expect(config.output.chunkFilename).toEqual('js/[name]-[contenthash].chunk.js')
|
36
|
+
})
|
37
|
+
|
38
|
+
test('should return default loader rules for each file in config/loaders', () => {
|
39
|
+
const config = environment.toWebpackConfig()
|
40
|
+
const defaultRules = Object.keys(rules)
|
41
|
+
const configRules = config.module.rules
|
42
|
+
|
43
|
+
expect(defaultRules.length).toEqual(7)
|
44
|
+
expect(configRules.length).toEqual(8)
|
45
|
+
})
|
46
|
+
|
47
|
+
test('should return default plugins', () => {
|
48
|
+
const config = environment.toWebpackConfig()
|
49
|
+
expect(config.plugins.length).toEqual(4)
|
50
|
+
})
|
51
|
+
|
52
|
+
test('should return default resolveLoader', () => {
|
53
|
+
const config = environment.toWebpackConfig()
|
54
|
+
expect(config.resolveLoader.modules).toEqual(['node_modules'])
|
55
|
+
})
|
56
|
+
|
57
|
+
test('should return default resolve.modules with additions', () => {
|
58
|
+
const config = environment.toWebpackConfig()
|
59
|
+
expect(config.resolve.modules).toEqual([
|
60
|
+
resolve('app', 'javascript'),
|
61
|
+
resolve('app/assets'),
|
62
|
+
resolve('/etc/yarn'),
|
63
|
+
'node_modules'
|
64
|
+
])
|
65
|
+
})
|
66
|
+
|
67
|
+
test('returns plugins property as Array', () => {
|
68
|
+
const config = environment.toWebpackConfig()
|
69
|
+
|
70
|
+
expect(config.plugins).toBeInstanceOf(Array)
|
71
|
+
expect(config.plugins).not.toBeInstanceOf(ConfigList)
|
72
|
+
})
|
73
|
+
})
|
74
|
+
})
|