webpacker 5.4.2 → 6.0.0.beta

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.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +1 -1
  3. data/.github/workflows/ruby.yml +12 -0
  4. data/.gitignore +2 -0
  5. data/.node-version +1 -1
  6. data/.rubocop.yml +3 -108
  7. data/6_0_upgrade.md +43 -0
  8. data/CHANGELOG.md +19 -18
  9. data/CONTRIBUTING.md +1 -1
  10. data/Gemfile.lock +91 -94
  11. data/README.md +220 -99
  12. data/gemfiles/Gemfile-rails-edge +1 -1
  13. data/lib/install/config/webpack/base.js +3 -0
  14. data/lib/install/config/webpack/development.js +2 -2
  15. data/lib/install/config/webpack/production.js +2 -2
  16. data/lib/install/config/webpack/test.js +2 -2
  17. data/lib/install/config/webpacker.yml +8 -37
  18. data/lib/install/javascript/packs/application.css +9 -0
  19. data/lib/install/javascript/packs/application.js +3 -1
  20. data/lib/install/template.rb +32 -26
  21. data/lib/tasks/webpacker/binstubs.rake +6 -4
  22. data/lib/tasks/webpacker/check_binstubs.rake +4 -4
  23. data/lib/tasks/webpacker/check_yarn.rake +1 -1
  24. data/lib/tasks/webpacker/compile.rake +4 -2
  25. data/lib/tasks/webpacker/info.rake +12 -10
  26. data/lib/tasks/webpacker/install.rake +6 -4
  27. data/lib/tasks/webpacker/verify_install.rake +2 -1
  28. data/lib/tasks/webpacker/yarn_install.rake +9 -7
  29. data/lib/tasks/webpacker.rake +2 -11
  30. data/lib/webpacker/compiler.rb +15 -8
  31. data/lib/webpacker/configuration.rb +10 -45
  32. data/lib/webpacker/dev_server_runner.rb +21 -2
  33. data/lib/webpacker/env.rb +1 -5
  34. data/lib/webpacker/helper.rb +22 -32
  35. data/lib/webpacker/manifest.rb +1 -1
  36. data/lib/webpacker/version.rb +1 -1
  37. data/lib/webpacker/webpack_runner.rb +5 -0
  38. data/package/__tests__/config.js +5 -37
  39. data/package/__tests__/development.js +9 -11
  40. data/package/__tests__/env.js +12 -4
  41. data/package/__tests__/production.js +6 -6
  42. data/package/__tests__/staging.js +7 -6
  43. data/package/__tests__/test.js +4 -5
  44. data/package/babel/preset.js +55 -0
  45. data/package/config.js +3 -11
  46. data/package/env.js +8 -2
  47. data/package/environments/__tests__/base.js +15 -47
  48. data/package/environments/base.js +62 -125
  49. data/package/environments/development.js +45 -44
  50. data/package/environments/production.js +63 -68
  51. data/package/environments/test.js +2 -2
  52. data/package/index.js +13 -8
  53. data/package/rules/babel.js +9 -7
  54. data/package/rules/coffee.js +6 -0
  55. data/package/rules/erb.js +15 -0
  56. data/package/rules/file.js +19 -19
  57. data/package/rules/index.js +15 -18
  58. data/package/rules/less.js +22 -0
  59. data/package/rules/sass.js +10 -10
  60. data/package/rules/svg.js +20 -0
  61. data/package/utils/get_style_rule.js +26 -36
  62. data/package/utils/helpers.js +26 -35
  63. data/package.json +29 -45
  64. data/test/compiler_test.rb +0 -12
  65. data/test/configuration_test.rb +1 -32
  66. data/test/dev_server_runner_test.rb +24 -5
  67. data/test/engine_rake_tasks_test.rb +39 -0
  68. data/test/helper_test.rb +24 -30
  69. data/test/mounted_app/Rakefile +4 -0
  70. data/test/mounted_app/test/dummy/Rakefile +3 -0
  71. data/test/mounted_app/test/dummy/bin/rails +3 -0
  72. data/test/mounted_app/test/dummy/bin/rake +3 -0
  73. data/test/mounted_app/test/dummy/config/application.rb +10 -0
  74. data/test/mounted_app/test/dummy/config/environment.rb +3 -0
  75. data/test/mounted_app/test/dummy/config/webpacker.yml +75 -0
  76. data/test/mounted_app/test/dummy/config.ru +5 -0
  77. data/test/mounted_app/test/dummy/package.json +7 -0
  78. data/test/rake_tasks_test.rb +1 -10
  79. data/test/test_app/config/webpacker.yml +1 -25
  80. data/test/test_app/config/webpacker_public_root.yml +0 -1
  81. data/test/test_app/public/packs/manifest.json +17 -13
  82. data/test/test_app/some.config.js +0 -0
  83. data/test/webpack_runner_test.rb +9 -3
  84. data/yarn.lock +2505 -4943
  85. metadata +37 -83
  86. data/.travis.yml +0 -43
  87. data/docs/assets.md +0 -119
  88. data/docs/cloud9.md +0 -310
  89. data/docs/css.md +0 -308
  90. data/docs/deployment.md +0 -130
  91. data/docs/docker.md +0 -68
  92. data/docs/engines.md +0 -213
  93. data/docs/env.md +0 -63
  94. data/docs/es6.md +0 -72
  95. data/docs/folder-structure.md +0 -66
  96. data/docs/integrations.md +0 -220
  97. data/docs/misc.md +0 -23
  98. data/docs/props.md +0 -223
  99. data/docs/target.md +0 -22
  100. data/docs/testing.md +0 -136
  101. data/docs/troubleshooting.md +0 -158
  102. data/docs/typescript.md +0 -190
  103. data/docs/v4-upgrade.md +0 -142
  104. data/docs/webpack-dev-server.md +0 -92
  105. data/docs/webpack.md +0 -364
  106. data/docs/yarn.md +0 -23
  107. data/lib/install/angular.rb +0 -23
  108. data/lib/install/coffee.rb +0 -25
  109. data/lib/install/config/.browserslistrc +0 -1
  110. data/lib/install/config/babel.config.js +0 -82
  111. data/lib/install/config/postcss.config.js +0 -12
  112. data/lib/install/config/webpack/environment.js +0 -3
  113. data/lib/install/elm.rb +0 -39
  114. data/lib/install/erb.rb +0 -25
  115. data/lib/install/examples/angular/hello_angular/app/app.component.ts +0 -9
  116. data/lib/install/examples/angular/hello_angular/app/app.module.ts +0 -16
  117. data/lib/install/examples/angular/hello_angular/index.ts +0 -8
  118. data/lib/install/examples/angular/hello_angular/polyfills.ts +0 -73
  119. data/lib/install/examples/angular/hello_angular.js +0 -7
  120. data/lib/install/examples/coffee/hello_coffee.coffee +0 -4
  121. data/lib/install/examples/elm/Main.elm +0 -55
  122. data/lib/install/examples/elm/hello_elm.js +0 -16
  123. data/lib/install/examples/erb/hello_erb.js.erb +0 -6
  124. data/lib/install/examples/react/babel.config.js +0 -99
  125. data/lib/install/examples/react/hello_react.jsx +0 -26
  126. data/lib/install/examples/react/tsconfig.json +0 -21
  127. data/lib/install/examples/stimulus/application.js +0 -1
  128. data/lib/install/examples/stimulus/controllers/hello_controller.js +0 -18
  129. data/lib/install/examples/stimulus/controllers/index.js +0 -9
  130. data/lib/install/examples/svelte/app.svelte +0 -11
  131. data/lib/install/examples/svelte/hello_svelte.js +0 -20
  132. data/lib/install/examples/typescript/hello_typescript.ts +0 -4
  133. data/lib/install/examples/typescript/tsconfig.json +0 -24
  134. data/lib/install/examples/vue/app.vue +0 -22
  135. data/lib/install/examples/vue/hello_vue.js +0 -72
  136. data/lib/install/loaders/coffee.js +0 -6
  137. data/lib/install/loaders/elm.js +0 -25
  138. data/lib/install/loaders/erb.js +0 -11
  139. data/lib/install/loaders/svelte.js +0 -9
  140. data/lib/install/loaders/vue.js +0 -6
  141. data/lib/install/react.rb +0 -18
  142. data/lib/install/stimulus.rb +0 -12
  143. data/lib/install/svelte.rb +0 -29
  144. data/lib/install/typescript.rb +0 -39
  145. data/lib/install/vue.rb +0 -49
  146. data/lib/tasks/installers.rake +0 -42
  147. data/package/config_types/__tests__/config_list.js +0 -118
  148. data/package/config_types/__tests__/config_object.js +0 -43
  149. data/package/config_types/config_list.js +0 -75
  150. data/package/config_types/config_object.js +0 -55
  151. data/package/config_types/index.js +0 -7
  152. data/package/rules/module.css.js +0 -3
  153. data/package/rules/module.sass.js +0 -8
  154. data/package/rules/node_modules.js +0 -22
  155. data/package/utils/__tests__/deep_assign.js +0 -32
  156. data/package/utils/__tests__/deep_merge.js +0 -10
  157. data/package/utils/__tests__/get_style_rule.js +0 -65
  158. data/package/utils/__tests__/objectify.js +0 -9
  159. data/package/utils/deep_assign.js +0 -22
  160. data/package/utils/deep_merge.js +0 -22
  161. data/package/utils/objectify.js +0 -3
@@ -1,12 +0,0 @@
1
- say "Appending Stimulus setup code to #{Webpacker.config.source_entry_path}/application.js"
2
- append_to_file "#{Webpacker.config.source_entry_path}/application.js" do
3
- "\n" + open("#{__dir__}/examples/stimulus/application.js").read
4
- end
5
-
6
- say "Creating controllers directory"
7
- directory "#{__dir__}/examples/stimulus/controllers", "#{Webpacker.config.source_path}/controllers"
8
-
9
- say "Installing all Stimulus dependencies"
10
- run "yarn add stimulus"
11
-
12
- say "Webpacker now supports Stimulus.js 🎉", :green
@@ -1,29 +0,0 @@
1
- require "webpacker/configuration"
2
-
3
- say "Copying svelte loader to config/webpack/loaders"
4
- copy_file "#{__dir__}/loaders/svelte.js", Rails.root.join("config/webpack/loaders/svelte.js").to_s
5
-
6
- say "Adding svelte loader to config/webpack/environment.js"
7
- insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
8
- "const svelte = require('./loaders/svelte')\n",
9
- after: /require\(('|")@rails\/webpacker\1\);?\n/
10
-
11
- insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
12
- "environment.loaders.prepend('svelte', svelte)\n",
13
- before: "module.exports"
14
-
15
- say "Copying Svelte example entry file to #{Webpacker.config.source_entry_path}"
16
- copy_file "#{__dir__}/examples/svelte/hello_svelte.js",
17
- "#{Webpacker.config.source_entry_path}/hello_svelte.js"
18
-
19
- say "Copying Svelte app file to #{Webpacker.config.source_path}"
20
- copy_file "#{__dir__}/examples/svelte/app.svelte",
21
- "#{Webpacker.config.source_path}/app.svelte"
22
-
23
- say "Installing all Svelte dependencies"
24
- run "yarn add svelte svelte-loader"
25
-
26
- say "Updating webpack paths to include .svelte file extension"
27
- insert_into_file Webpacker.config.config_path, "- .svelte\n".indent(4), after: /\s+extensions:\n/
28
-
29
- say "Webpacker now supports Svelte 🎉", :green
@@ -1,39 +0,0 @@
1
- require "webpacker/configuration"
2
-
3
- additional_packages = ""
4
- example_source = "typescript"
5
-
6
- # Additional configuration is required for React projects
7
- package_json = Rails.root.join("package.json")
8
- if File.exist?(package_json)
9
- package = JSON.parse(File.read(package_json))
10
- package["dependencies"] ||= {}
11
-
12
- if package["dependencies"].key?("react")
13
- additional_packages = "@types/react @types/react-dom"
14
- example_source = "react"
15
- end
16
- end
17
-
18
- say "Adding TypeScript preset to babel.config.js"
19
- insert_into_file Rails.root.join("babel.config.js").to_s,
20
- ",\n ['@babel/preset-typescript', { 'allExtensions': true, 'isTSX': true }]",
21
- before: /\s*\].filter\(Boolean\),\n\s*plugins: \[/
22
-
23
- say "Copying tsconfig.json to the Rails root directory for typescript"
24
- copy_file "#{__dir__}/examples/#{example_source}/tsconfig.json", "tsconfig.json"
25
-
26
- say "Updating webpack paths to include .ts file extension"
27
- insert_into_file Webpacker.config.config_path, "- .ts\n".indent(4), after: /\s+extensions:\n/
28
-
29
- say "Updating webpack paths to include .tsx file extension"
30
- insert_into_file Webpacker.config.config_path, "- .tsx\n".indent(4), after: /\s+extensions:\n/
31
-
32
- say "Copying the example entry file to #{Webpacker.config.source_entry_path}"
33
- copy_file "#{__dir__}/examples/typescript/hello_typescript.ts",
34
- "#{Webpacker.config.source_entry_path}/hello_typescript.ts"
35
-
36
- say "Installing all typescript dependencies"
37
- run "yarn add typescript @babel/preset-typescript #{additional_packages}"
38
-
39
- say "Webpacker now supports typescript 🎉", :green
data/lib/install/vue.rb DELETED
@@ -1,49 +0,0 @@
1
- require "webpacker/configuration"
2
-
3
- say "Copying vue loader to config/webpack/loaders"
4
- copy_file "#{__dir__}/loaders/vue.js", Rails.root.join("config/webpack/loaders/vue.js").to_s
5
-
6
- say "Adding vue loader plugin to config/webpack/environment.js"
7
- insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
8
- "const { VueLoaderPlugin } = require('vue-loader')\n",
9
- after: /require\(('|")@rails\/webpacker\1\);?\n/
10
-
11
- insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
12
- "environment.plugins.prepend('VueLoaderPlugin', new VueLoaderPlugin())\n",
13
- before: "module.exports"
14
-
15
- say "Adding vue loader to config/webpack/environment.js"
16
- insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
17
- "const vue = require('./loaders/vue')\n",
18
- after: "require('vue-loader')\n"
19
-
20
- insert_into_file Rails.root.join("config/webpack/environment.js").to_s,
21
- "environment.loaders.prepend('vue', vue)\n",
22
- before: "module.exports"
23
-
24
- say "Updating webpack paths to include .vue file extension"
25
- insert_into_file Webpacker.config.config_path, "- .vue\n".indent(4), after: /\s+extensions:\n/
26
-
27
- say "Copying the example entry file to #{Webpacker.config.source_entry_path}"
28
- copy_file "#{__dir__}/examples/vue/hello_vue.js",
29
- "#{Webpacker.config.source_entry_path}/hello_vue.js"
30
-
31
- say "Copying Vue app file to #{Webpacker.config.source_entry_path}"
32
- copy_file "#{__dir__}/examples/vue/app.vue",
33
- "#{Webpacker.config.source_path}/app.vue"
34
-
35
- say "Installing all Vue dependencies"
36
- run "yarn add vue vue-loader vue-template-compiler"
37
-
38
- if Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR > 1
39
- say "You need to enable unsafe-eval rule.", :yellow
40
- say "This can be done in Rails 5.2+ for development environment in the CSP initializer", :yellow
41
- say "config/initializers/content_security_policy.rb with a snippet like this:", :yellow
42
- say "if Rails.env.development?", :yellow
43
- say " policy.script_src :self, :https, :unsafe_eval", :yellow
44
- say "else", :yellow
45
- say " policy.script_src :self, :https", :yellow
46
- say "end", :yellow
47
- end
48
-
49
- say "Webpacker now supports Vue.js 🎉", :green
@@ -1,42 +0,0 @@
1
- installers = {
2
- "Angular": :angular,
3
- "Elm": :elm,
4
- "React": :react,
5
- "Vue": :vue,
6
- "Erb": :erb,
7
- "Coffee": :coffee,
8
- "Typescript": :typescript,
9
- "Svelte": :svelte,
10
- "Stimulus": :stimulus
11
- }.freeze
12
-
13
- dependencies = {
14
- "Angular": [:typescript]
15
- }
16
-
17
- bin_path = ENV["BUNDLE_BIN"] || "./bin"
18
-
19
- namespace :webpacker do
20
- namespace :install do
21
- installers.each do |name, task_name|
22
- desc "Install everything needed for #{name}"
23
- task task_name => ["webpacker:verify_install"] do
24
- template = File.expand_path("../install/#{task_name}.rb", __dir__)
25
- base_path =
26
- if Rails::VERSION::MAJOR >= 5
27
- "#{RbConfig.ruby} #{bin_path}/rails app:template"
28
- else
29
- "#{RbConfig.ruby} #{bin_path}/rake rails:template"
30
- end
31
-
32
- dependencies[name] ||= []
33
- dependencies[name].each do |dependency|
34
- dependency_template = File.expand_path("../install/#{dependency}.rb", __dir__)
35
- system "#{base_path} LOCATION=#{dependency_template}"
36
- end
37
-
38
- exec "#{base_path} LOCATION=#{template}"
39
- end
40
- end
41
- end
42
- end
@@ -1,118 +0,0 @@
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
- })
@@ -1,43 +0,0 @@
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
- })
@@ -1,75 +0,0 @@
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
@@ -1,55 +0,0 @@
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