k_builder-package_json 0.0.2 → 0.0.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 15cb594096bcde9a4e3c2961b7266983587cea63433596c7711434bdca451a2d
4
- data.tar.gz: 9d0dee4384addeb90e56d9afa8b587f81517c8d966c3fe4d37aaed687a90fde0
3
+ metadata.gz: 1955feb6eddedfbaf20e83f6192b80f8646b2a1a7c0331fb77d7b7a083382897
4
+ data.tar.gz: 3e40c92dc419c5d4c3187fe0841aea1f5bec8212b8050b596c6077b4ddf8f618
5
5
  SHA512:
6
- metadata.gz: 2f53379cf8f2336cee626f0df81e4bfd22240e1792734013933dfe20c966ac8939ce674a123ec53f8d235bbc9633744a7fea3ce15d29de721dfbd970519dd060
7
- data.tar.gz: 148f8e1f2a1aac4b6650a41f6266ede0c76f701e62fa079159ba9fc6767508cb4c1c3dde133c7483ca99aaec1ceb588f5f1bd44c5b86f688d94929fe7123f8d3
6
+ metadata.gz: 1668eacd9e2778018298d89cf569fd2fb8e27cb2c43ae35abac7a6964a8f47ab0ecd4205aeee1daad7bb81696275c6b7d1bf914f550f7a35d14af116b81dbe6b
7
+ data.tar.gz: 649800ddb5bf9f33ea33d9079ca381d4c07b4f9b9a5092417e847325c3c0c535ece2b4f2c49c33f791cb66616c53091d89d73728bccf0024642cdfdd250b627a
data/.rubocop.yml CHANGED
@@ -60,6 +60,9 @@ Naming/MemoizedInstanceVariableName:
60
60
  Naming/VariableNumber:
61
61
  Exclude:
62
62
  - "**/spec/**/*"
63
+ Naming/AccessorMethodName:
64
+ Exclude:
65
+ - "**/*builder*.rb"
63
66
  Style/EmptyMethod:
64
67
  Exclude:
65
68
  - "**/spec/**/*"
@@ -0,0 +1,6 @@
1
+ {
2
+ "cSpell.words": [
3
+ "boolbase",
4
+ "yallist"
5
+ ]
6
+ }
@@ -38,5 +38,5 @@ Gem::Specification.new do |spec|
38
38
  spec.require_paths = ['lib']
39
39
  # spec.extensions = ['ext/k_builder_package_json/extconf.rb']
40
40
 
41
- # spec.add_dependency 'tty-box', '~> 0.5.0'
41
+ spec.add_dependency 'k_builder', '~> 0.0.19'
42
42
  end
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'k_builder'
3
4
  require 'k_builder/package_json/version'
5
+ require 'k_builder/package_json/configuration'
6
+ require 'k_builder/package_json/package_builder'
4
7
 
5
8
  module KBuilder
6
9
  module PackageJson
7
10
  # raise KBuilder::PackageJson::Error, 'Sample message'
8
11
  class Error < StandardError; end
9
-
10
- # Your code goes here...
11
12
  end
12
13
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Attach configuration to the KBuilder module
4
+ module KBuilder
5
+ module PackageJson
6
+ PackageGroup = Struct.new(:key, :description, :package_names)
7
+
8
+ # Configuration class
9
+ class Configuration < BaseConfiguration
10
+ attach_to(self, KBuilder::BaseConfiguration, :package_json)
11
+
12
+ attr_accessor :package_groups
13
+
14
+ def initialize
15
+ super()
16
+ @package_groups = {}
17
+ end
18
+
19
+ def set_package_group(key, description, package_names)
20
+ package_groups[key] = PackageGroup.new(key, description, package_names)
21
+ end
22
+
23
+ def default_package_groups
24
+ set_package_group('webpack', 'Webpack V5', %w[webpack webpack-cli webpack-dev-server])
25
+ set_package_group('swc', 'SWC Transpiler', %w[@swc/cli @swc/core swc-loader])
26
+ set_package_group('babel', 'Babel Transpiler', %w[@babel/core @babel/cli @babel/preset-env babel-loader])
27
+ set_package_group('typescript', 'Typescript', %w[typescript ts-loader])
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,274 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KBuilder
4
+ module PackageJson
5
+ # Configuration currently comes from KBuilder and stores template folders and target folders if configured
6
+ class PackageBuilder < KBuilder::Builder
7
+ SETTER_METHODS = %w[dependency_type].freeze
8
+
9
+ # In memory representation of the package.json file that is being created
10
+ attr_writer :package
11
+
12
+ def initialize(configuration = nil)
13
+ super(configuration)
14
+
15
+ set_package_file('package.json')
16
+ set_dependency_type(:development)
17
+ end
18
+
19
+ # Return an array of symbols to represent the fluent setter methods in this builder.
20
+ def builder_setter_methods
21
+ SETTER_METHODS
22
+ end
23
+
24
+ # ----------------------------------------------------------------------
25
+ # Fluent interface
26
+ # ----------------------------------------------------------------------
27
+
28
+ # Change context to production, new dependencies will be for production
29
+ def production
30
+ set_dependency_type :production
31
+
32
+ self
33
+ end
34
+
35
+ # Change context to development, new dependencies will be for development
36
+ def development
37
+ set_dependency_type :development
38
+
39
+ self
40
+ end
41
+
42
+ # Init an NPN package
43
+ #
44
+ # run npm init -y
45
+ #
46
+ # Note: npm init does not support --silent operation
47
+ def npm_init
48
+ rc 'npm init -y'
49
+
50
+ load
51
+
52
+ self
53
+ end
54
+
55
+ # Space separated list of packages
56
+ def npm_install(packages, options: nil)
57
+ npm_add_or_install(packages, parse_options(options))
58
+
59
+ self
60
+ end
61
+ alias npm_i npm_install
62
+
63
+ def npm_add(packages, options: nil)
64
+ npm_add_or_install(packages, parse_options(options, '--package-lock-only --no-package-lock'))
65
+
66
+ self
67
+ end
68
+ alias npm_a npm_add
69
+
70
+ def npm_add_group(key, options: nil)
71
+ group = get_group(key)
72
+
73
+ puts "Adding #{group.description}"
74
+
75
+ npm_add(group.package_names, options: options)
76
+
77
+ self
78
+ end
79
+ alias npm_ag npm_add_group
80
+
81
+ # Add a group of NPN packages which get defined in configuration
82
+ def npm_install_group(key, options: nil)
83
+ group = get_group(key)
84
+
85
+ puts "Installing #{group.description}"
86
+
87
+ npm_install(group.package_names, options: options)
88
+
89
+ self
90
+ end
91
+
92
+ # Load the existing package.json into memory
93
+ #
94
+ # ToDo: Would be useful to record the update timestamp on the package
95
+ # so that we only load if the in memory package is not the latest.
96
+ #
97
+ # The reason this can happen, is because external tools such are
98
+ # npm install are updating the package.json and after this happens
99
+ # we need to call load, but if there is any bug in the code we may
100
+ # for get to load, or we may load multiple times.
101
+ def load
102
+ raise KBuilder::PackageJson::Error, 'package.json does not exist' unless File.exist?(package_file)
103
+
104
+ puts 'loading...'
105
+
106
+ content = File.read(package_file)
107
+ @package = JSON.parse(content)
108
+
109
+ self
110
+ end
111
+
112
+ # Write the package.json file
113
+ def write
114
+ puts 'writing...'
115
+
116
+ content = JSON.pretty_generate(@package)
117
+
118
+ File.write(package_file, content)
119
+
120
+ self
121
+ end
122
+
123
+ # Remove a script reference by key
124
+ def remove_script(key)
125
+ load
126
+
127
+ @package['scripts']&.delete(key)
128
+
129
+ write
130
+
131
+ self
132
+ end
133
+
134
+ # Add a script with key and value (command line to run)
135
+ def add_script(key, value)
136
+ load
137
+
138
+ @package['scripts'][key] = value
139
+
140
+ write
141
+
142
+ self
143
+ end
144
+
145
+ # ----------------------------------------------------------------------
146
+ # Attributes: Think getter/setter
147
+ #
148
+ # The following getter/setters can be referenced both inside and outside
149
+ # of the fluent builder fluent API. They do not implement the fluent
150
+ # interface unless prefixed by set_.
151
+ #
152
+ # set_: Only setters with the prefix _set are considered fluent.
153
+ # ----------------------------------------------------------------------
154
+
155
+ # Package
156
+ # ----------------------------------------------------------------------
157
+
158
+ # Load the package.json into a memory as object
159
+ def package
160
+ return @package if defined? @package
161
+
162
+ load
163
+
164
+ @package
165
+ end
166
+
167
+ # Package.set
168
+ # ----------------------------------------------------------------------
169
+
170
+ # Set a property value in the package
171
+ def set(key, value)
172
+ load
173
+
174
+ @package[key] = value
175
+
176
+ write
177
+
178
+ self
179
+ end
180
+
181
+ # Dependency option
182
+ # ----------------------------------------------------------------------
183
+
184
+ # Getter for dependency option
185
+ def dependency_option
186
+ dependency_type == :development ? '-D' : '-P'
187
+ end
188
+
189
+ # Dependency type
190
+ # ----------------------------------------------------------------------
191
+
192
+ # Getter for dependency type
193
+ def dependency_type
194
+ hash['dependency_type']
195
+ end
196
+
197
+ # Target folder
198
+ # ----------------------------------------------------------------------
199
+
200
+ # Fluent setter for target folder
201
+ def set_package_file(value)
202
+ self.package_file = value
203
+
204
+ self
205
+ end
206
+
207
+ # Setter for target folder
208
+ def package_file=(_value)
209
+ hash['package_file'] = File.join(target_folder, 'package.json')
210
+ end
211
+
212
+ # Getter for target folder
213
+ def package_file
214
+ hash['package_file']
215
+ end
216
+
217
+ # -----------------------------------
218
+ # Helpers
219
+ # -----------------------------------
220
+
221
+ def parse_options(options = nil, required_options = nil)
222
+ options = [] if options.nil?
223
+ options = options.split if options.is_a?(String)
224
+ options.reject(&:empty?)
225
+
226
+ required_options = [] if required_options.nil?
227
+ required_options = required_options.split if required_options.is_a?(String)
228
+
229
+ options | required_options
230
+ end
231
+
232
+ def options_any?(options, *any_options)
233
+ (options & any_options).any?
234
+ end
235
+
236
+ def execute(command)
237
+ puts "RUN: #{command}"
238
+ rc command
239
+ load
240
+ end
241
+
242
+ def npm_add_or_install(packages, options)
243
+ # if -P or -D is not in the options then use the current builder dependency option
244
+ options.push dependency_option unless options_any?(options, '-P', '-D')
245
+ packages = packages.join(' ') if packages.is_a?(Array)
246
+ command = "npm install #{options.join(' ')} #{packages}"
247
+ execute command
248
+ end
249
+
250
+ # # Debug method to open the package file in vscode
251
+ # # ToDo: Maybe remove
252
+ # def vscode
253
+ # puts "cd #{output_path}"
254
+ # puts package_file
255
+ # rc "code #{package_file}"
256
+ # end
257
+
258
+ # private
259
+
260
+ # This is all wrong, but useful for now
261
+ def context
262
+ KBuilder.data.to_struct(hash)
263
+ end
264
+
265
+ def get_group(key)
266
+ group = context.package_json.package_groups[key]
267
+
268
+ raise KBuilder::PackageJson::Error, "unknown package group: #{key}" if group.nil?
269
+
270
+ group
271
+ end
272
+ end
273
+ end
274
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module KBuilder
4
4
  module PackageJson
5
- VERSION = '0.0.2'
5
+ VERSION = '0.0.6'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: k_builder-package_json
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cruwys
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-13 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2021-03-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: k_builder
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.19
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.19
13
27
  description: " KBuilder-PackageJson provides various fluent builders and code generators
14
28
  for building package.json file\n"
15
29
  email:
@@ -22,6 +36,7 @@ files:
22
36
  - ".gitignore"
23
37
  - ".rspec"
24
38
  - ".rubocop.yml"
39
+ - ".vscode/settings.json"
25
40
  - CODE_OF_CONDUCT.md
26
41
  - Gemfile
27
42
  - Guardfile
@@ -39,6 +54,8 @@ files:
39
54
  - hooks/update-version
40
55
  - k_builder-package_json.gemspec
41
56
  - lib/k_builder/package_json.rb
57
+ - lib/k_builder/package_json/configuration.rb
58
+ - lib/k_builder/package_json/package_builder.rb
42
59
  - lib/k_builder/package_json/version.rb
43
60
  homepage: http://appydave.com/gems/k-builder-package-json
44
61
  licenses: