danger-wcc 0.0.6 → 0.1.3
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/danger-wcc.gemspec +6 -3
- data/lib/version.rb +1 -1
- data/lib/wcc/dependencies.rb +100 -0
- data/lib/wcc/plugin.rb +18 -3
- data/lib/wcc/util/yarn_info.rb +98 -0
- data/lib/wcc/utils.rb +16 -4
- data/lib/wcc/yarn_deduplicate.rb +71 -0
- data/spec/fixtures/dependencies/package.json +112 -0
- data/spec/fixtures/dependencies/package.json.diff +28 -0
- data/spec/fixtures/dependencies/package.json_patch_bumps_minor.diff +13 -0
- data/spec/fixtures/dependencies/package.json_patch_bumps_minor.json +112 -0
- data/spec/fixtures/dependencies/package.json_second_level_effect.diff +17 -0
- data/spec/fixtures/dependencies/package.json_second_level_effect.json +133 -0
- data/spec/fixtures/dependencies/yarn.lock +19609 -0
- data/spec/fixtures/dependencies/yarn.lock_patch_bumps_minor.lock +19614 -0
- data/spec/fixtures/dependencies/yarn.lock_second_level_effect.lock +20022 -0
- data/spec/fixtures/dependencies/yarn_list_second_level_effect.txt +1243 -0
- data/spec/fixtures/dependencies/yarn_list_second_level_effect.txt.diff +141 -0
- data/spec/fixtures/dependencies/yarn_minor_version.diff +33 -0
- data/spec/fixtures/dependencies/yarn_minor_version.txt +1151 -0
- data/spec/fixtures/dependencies/yarn_old.txt +1152 -0
- data/spec/fixtures/dependencies/yarn_patch_bumps_minor.diff +28 -0
- data/spec/fixtures/yarn_deduplicate/list.a.txt +293 -0
- data/spec/fixtures/yarn_deduplicate/list.b.txt +295 -0
- data/spec/fixtures/yarn_deduplicate/list.diff +11 -0
- data/spec/fixtures/yarn_deduplicate/yarn.lock +20031 -0
- data/spec/wcc/dependencies_spec.rb +130 -0
- data/spec/wcc/plugin_spec.rb +7 -3
- data/spec/wcc/yarn_deduplicate_spec.rb +57 -0
- metadata +79 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b591a61062c99e268e789682050f9e1aa87d3ac1
|
4
|
+
data.tar.gz: ee1ca7bef0b3067130959f806ca289b16c501b16
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3e0ea9ae53ae50a0063bfeccec52b3a22cacbd45e95fde82d06c76014850debc5f7f8eb6236dee02dd93cf045d512b22920994348ce7e8a82e0d16be1c06028
|
7
|
+
data.tar.gz: d0ff16ef65a8901dfcbd3c5e276ffe692990de9a10c198a75dde29602e0ef476b41006fc71fcb741cf47c51f205f06dfec73effa52c0c7473e173594efcd5c80
|
data/danger-wcc.gemspec
CHANGED
@@ -19,11 +19,14 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
|
-
spec.add_runtime_dependency '
|
22
|
+
spec.add_runtime_dependency 'activesupport', '> 5'
|
23
23
|
spec.add_runtime_dependency 'danger-plugin-api', '~> 1.0'
|
24
|
-
spec.add_runtime_dependency 'flay'
|
25
24
|
spec.add_runtime_dependency 'git_diff', '~> 0.4'
|
26
|
-
|
25
|
+
|
26
|
+
# Optional dependencies
|
27
|
+
spec.add_development_dependency 'brakeman'
|
28
|
+
spec.add_development_dependency 'flay'
|
29
|
+
spec.add_development_dependency 'reek'
|
27
30
|
|
28
31
|
# General ruby development
|
29
32
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
data/lib/version.rb
CHANGED
@@ -0,0 +1,100 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support'
|
4
|
+
require_relative 'utils'
|
5
|
+
|
6
|
+
class Danger::DangerWCC < Danger::Plugin
|
7
|
+
class Dependencies
|
8
|
+
include Utils
|
9
|
+
|
10
|
+
DEFAULT_OPTIONS = {
|
11
|
+
lockfile: 'yarn.lock',
|
12
|
+
severity: :warn
|
13
|
+
}.freeze
|
14
|
+
|
15
|
+
def yarn_info
|
16
|
+
@yarn_info ||=
|
17
|
+
Danger::DangerWCC::Util::YarnInfo.new(self, @options)
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(plugin, options = {})
|
21
|
+
@plugin = plugin
|
22
|
+
@options = DEFAULT_OPTIONS.merge(options)
|
23
|
+
end
|
24
|
+
|
25
|
+
def perform
|
26
|
+
return unless File.exist?(@options[:lockfile])
|
27
|
+
|
28
|
+
find_yarn_violations
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def issue_yarn_violation(package, versions)
|
34
|
+
line_index = yarn_info.find_index_in_lockfile(package, versions[1])
|
35
|
+
|
36
|
+
msg = "Dangerous change! #{package} was updated "\
|
37
|
+
"from #{versions[0]} to #{versions[1]}"\
|
38
|
+
' without a corresponding change to package.json!'
|
39
|
+
plugin.public_send(
|
40
|
+
@options[:severity],
|
41
|
+
msg,
|
42
|
+
file: @options[:lockfile],
|
43
|
+
line: line_index
|
44
|
+
)
|
45
|
+
end
|
46
|
+
|
47
|
+
def find_yarn_violations # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
48
|
+
# if there are any explicit major version changes in top level deps,
|
49
|
+
# say nothing about anything b/c it'll likely be noisy
|
50
|
+
has_explicit_mods =
|
51
|
+
yarn_info.modified_yarn_dependencies
|
52
|
+
.slice(*yarn_info.package_json_changes)
|
53
|
+
.any? { |_, v| major_version_change?(v[0], v[1]) }
|
54
|
+
return if has_explicit_mods
|
55
|
+
|
56
|
+
# Do say something if top level minor version change induces dangerous
|
57
|
+
# changes in other deps
|
58
|
+
|
59
|
+
mods =
|
60
|
+
yarn_info.modified_yarn_dependencies
|
61
|
+
.select { |_, versions| dangerous_change?(versions[0], versions[1]) }
|
62
|
+
|
63
|
+
has_dangerous_top_level_changes = false
|
64
|
+
mods.slice(*yarn_info.package_json_dependencies)
|
65
|
+
.each do |package, versions|
|
66
|
+
has_dangerous_top_level_changes = true
|
67
|
+
issue_yarn_violation(package, versions)
|
68
|
+
end
|
69
|
+
|
70
|
+
# issue warnings if a sub-dependency changed without a dangerous change in
|
71
|
+
# a top level dependency
|
72
|
+
return if has_dangerous_top_level_changes
|
73
|
+
|
74
|
+
mods.except(*yarn_info.package_json_dependencies)
|
75
|
+
.each do |package, versions|
|
76
|
+
issue_yarn_violation(package, versions)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def major_version_change?(old_version, new_version)
|
81
|
+
return false unless new_version
|
82
|
+
|
83
|
+
new_version.segments[0] > old_version.segments[0]
|
84
|
+
end
|
85
|
+
|
86
|
+
def dangerous_change?(old_version, new_version)
|
87
|
+
# the package was deleted
|
88
|
+
return true unless new_version
|
89
|
+
|
90
|
+
old_segments = old_version.segments
|
91
|
+
new_segments = new_version.segments
|
92
|
+
|
93
|
+
# the major or minor version changed.
|
94
|
+
new_segments[0] > old_segments[0] ||
|
95
|
+
new_segments[1] > old_segments[1]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
require_relative './util/yarn_info'
|
data/lib/wcc/plugin.rb
CHANGED
@@ -7,19 +7,24 @@ require_relative 'rubocop_exceptions'
|
|
7
7
|
require_relative 'commit_lint'
|
8
8
|
require_relative 'reek'
|
9
9
|
require_relative 'jshint'
|
10
|
+
require_relative 'dependencies'
|
11
|
+
require_relative 'yarn_deduplicate'
|
10
12
|
|
11
|
-
class Danger::DangerWCC < Danger::Plugin
|
13
|
+
class Danger::DangerWCC < Danger::Plugin # rubocop:disable Metrics/ClassLength
|
12
14
|
include Utils
|
13
15
|
include Github
|
14
16
|
|
15
17
|
DEFAULT_OPTIONS = {
|
16
18
|
rubocop_exceptions: true,
|
17
|
-
flay: true,
|
18
19
|
todos: true,
|
19
20
|
brakeman: true,
|
21
|
+
dependencies: true,
|
22
|
+
yarn_deduplicate: true,
|
23
|
+
|
20
24
|
commit_lint: false,
|
21
25
|
reek: false,
|
22
|
-
jshint: false
|
26
|
+
jshint: false,
|
27
|
+
flay: false
|
23
28
|
}.freeze
|
24
29
|
|
25
30
|
# Runs all the included checks in the plugin
|
@@ -95,6 +100,16 @@ class Danger::DangerWCC < Danger::Plugin
|
|
95
100
|
Jshint.new(self, options).perform
|
96
101
|
end
|
97
102
|
|
103
|
+
def dependencies(options = {})
|
104
|
+
logger.info "dependencies: #{options}"
|
105
|
+
Dependencies.new(self, options).perform
|
106
|
+
end
|
107
|
+
|
108
|
+
def yarn_deduplicate(options = {})
|
109
|
+
logger.info "yarn_deduplicate: #{options}"
|
110
|
+
YarnDeduplicate.new(self, options).perform
|
111
|
+
end
|
112
|
+
|
98
113
|
private
|
99
114
|
|
100
115
|
def parse_flay_results
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Danger::DangerWCC::Util
|
4
|
+
class YarnInfo
|
5
|
+
def yarn_lock
|
6
|
+
@yarn_lock ||= File.readlines(@options[:lockfile] || 'yarn.lock')
|
7
|
+
end
|
8
|
+
|
9
|
+
def package_json_dependencies # rubocop:disable Metrics/AbcSize
|
10
|
+
@package_json_dependencies ||=
|
11
|
+
begin
|
12
|
+
root = JSON.parse(File.read('package.json'))
|
13
|
+
(root['dependencies']&.keys || []).tap do |deps|
|
14
|
+
workspaces = root['workspaces']
|
15
|
+
next unless workspaces && !workspaces.empty?
|
16
|
+
|
17
|
+
# Add in deps from all workspaces
|
18
|
+
workspaces.each do |ws|
|
19
|
+
Dir.glob(File.join(ws, 'package.json')).each do |package_file|
|
20
|
+
d = JSON.parse(File.read(package_file))['dependencies']&.keys
|
21
|
+
deps.concat(d || [])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def package_json_changes
|
29
|
+
@package_json_changes ||= find_package_json_changes
|
30
|
+
end
|
31
|
+
|
32
|
+
def modified_yarn_dependencies
|
33
|
+
@modified_yarn_dependencies ||= find_modified_yarn_packages
|
34
|
+
end
|
35
|
+
|
36
|
+
attr_reader :plugin
|
37
|
+
|
38
|
+
def initialize(plugin, options = nil)
|
39
|
+
@plugin = plugin
|
40
|
+
@options = options || {}
|
41
|
+
end
|
42
|
+
|
43
|
+
def find_index_in_lockfile(package, version)
|
44
|
+
return 0 unless version
|
45
|
+
|
46
|
+
re = Regexp.new("^\"?#{Regexp.escape(package)}@", Regexp::IGNORECASE)
|
47
|
+
indexes =
|
48
|
+
yarn_lock.each_with_index
|
49
|
+
.select { |l, _i| re.match(l) }
|
50
|
+
.map { |pair| pair[1] }
|
51
|
+
idx =
|
52
|
+
indexes.find do |i|
|
53
|
+
yarn_lock[i + 1].include?("version \"#{version}\"")
|
54
|
+
end
|
55
|
+
(idx || -1) + 1
|
56
|
+
end
|
57
|
+
|
58
|
+
def parse_yarn_semver(line)
|
59
|
+
match = /(?<package>\S+)\@(?<version>\S+)/.match(line)
|
60
|
+
[match['package'], Gem::Version.new(match['version'])] if match
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def find_package_json_changes
|
66
|
+
return [] unless file = plugin.find_file_in_diff('package.json')
|
67
|
+
|
68
|
+
adds = file.hunks.flat_map { |h| h.lines.select(&:addition?) }
|
69
|
+
adds.map { |l| /\"(?<package>\S+)\"\: \"\S+\"/.match(l.content) }
|
70
|
+
.compact
|
71
|
+
.map { |match| match['package'] }
|
72
|
+
end
|
73
|
+
|
74
|
+
def find_modified_yarn_packages # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
75
|
+
diff = plugin.run_and_diff(
|
76
|
+
'NODE_ENV=production yarn list --depth 0 2>/dev/null'
|
77
|
+
)
|
78
|
+
diff = GitDiff.from_string(diff)
|
79
|
+
|
80
|
+
{}.tap do |modified_packages|
|
81
|
+
plugin.each_file_in_diff(diff) do |file, _diff|
|
82
|
+
file.hunks.each do |hunk|
|
83
|
+
deleted, added =
|
84
|
+
%i[deletion? addition?].map do |type|
|
85
|
+
Hash[hunk.lines.select { |l| l.public_send(type) }
|
86
|
+
.map { |l| parse_yarn_semver(l.content) }
|
87
|
+
.compact]
|
88
|
+
end
|
89
|
+
deleted.each do |(package, version)|
|
90
|
+
modified_packages[package] =
|
91
|
+
[version, added[package]]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/lib/wcc/utils.rb
CHANGED
@@ -22,7 +22,7 @@ module Utils
|
|
22
22
|
# All the diffs in the PR parsed into GitDiff objects
|
23
23
|
def parsed_diffs
|
24
24
|
@parsed_diffs ||=
|
25
|
-
plugin.git.diff
|
25
|
+
plugin.git.diff&.map do |d|
|
26
26
|
begin
|
27
27
|
GitDiff.from_string(d.patch)
|
28
28
|
rescue StandardError
|
@@ -32,6 +32,13 @@ module Utils
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
def find_file_in_diff(filename)
|
36
|
+
each_file_in_diff do |file, _diff|
|
37
|
+
return file if file.b_path == filename
|
38
|
+
end
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
|
35
42
|
# Finds lines in the overall diff matching the given regex, and
|
36
43
|
# executes a block for each matched line.
|
37
44
|
# The results of the yield block are returned as an array.
|
@@ -52,17 +59,22 @@ module Utils
|
|
52
59
|
|
53
60
|
def each_file_in_diff(passed_diff = nil)
|
54
61
|
diffs = passed_diff ? [passed_diff] : parsed_diffs
|
55
|
-
diffs
|
62
|
+
diffs&.flat_map do |diff|
|
56
63
|
diff.files.flat_map do |file|
|
57
64
|
yield(file, diff)
|
58
65
|
end
|
59
66
|
end
|
60
67
|
end
|
61
68
|
|
62
|
-
def each_addition_in_diff(passed_diff = nil)
|
69
|
+
def each_addition_in_diff(passed_diff = nil, &block)
|
70
|
+
each_line_in_diff(passed_diff, type: :addition, &block)
|
71
|
+
end
|
72
|
+
|
73
|
+
def each_line_in_diff(passed_diff = nil, type: nil)
|
63
74
|
each_file_in_diff(passed_diff) do |file, diff|
|
64
75
|
file.hunks.flat_map do |hunk|
|
65
|
-
lines = hunk.lines
|
76
|
+
lines = hunk.lines
|
77
|
+
lines = lines.select { |l| l.public_send("#{type}?") } if type
|
66
78
|
lines = lines.map { |l| yield(l, hunk, file, diff) } if block_given?
|
67
79
|
lines
|
68
80
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'utils'
|
4
|
+
|
5
|
+
class Danger::DangerWCC < Danger::Plugin
|
6
|
+
class YarnDeduplicate
|
7
|
+
include Utils
|
8
|
+
|
9
|
+
DEFAULT_OPTIONS = {
|
10
|
+
lockfile: 'yarn.lock',
|
11
|
+
severity: :warn
|
12
|
+
}.freeze
|
13
|
+
|
14
|
+
def yarn_info
|
15
|
+
@yarn_info ||=
|
16
|
+
Danger::DangerWCC::Util::YarnInfo.new(self, @options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(plugin, options = {})
|
20
|
+
@plugin = plugin
|
21
|
+
@options = DEFAULT_OPTIONS.merge(options)
|
22
|
+
end
|
23
|
+
|
24
|
+
def perform
|
25
|
+
diff = run_yarn_deduplicate_diff
|
26
|
+
|
27
|
+
each_addition_in_diff(diff) do |line|
|
28
|
+
add_deduplicate_warning(line)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def run_yarn_deduplicate_diff
|
35
|
+
diff =
|
36
|
+
run_and_diff do
|
37
|
+
run('npx yarn-deduplicate -s fewer --list '\
|
38
|
+
"#{@options[:lockfile]}")
|
39
|
+
end
|
40
|
+
GitDiff.from_string(diff)
|
41
|
+
end
|
42
|
+
|
43
|
+
# rubocop:disable Layout/LineLength
|
44
|
+
DEDUPE_REGEXP = /^\+Package \"([^\"]+)\" wants (\S+) and could get (\S+), but got (\S+)$/i.freeze
|
45
|
+
# rubocop:enable Layout/LineLength
|
46
|
+
|
47
|
+
def add_deduplicate_warning(line) # rubocop:disable Metrics/MethodLength
|
48
|
+
warning = line.content.match(DEDUPE_REGEXP)
|
49
|
+
return unless warning
|
50
|
+
|
51
|
+
pkg, _semver, wanted, got = warning.captures
|
52
|
+
|
53
|
+
idx = yarn_info.find_index_in_lockfile(
|
54
|
+
pkg, got
|
55
|
+
)
|
56
|
+
msg = <<~HEREDOC
|
57
|
+
You have an opportunity to deduplicate "#{pkg}".
|
58
|
+
It's using #{got} but could use the existing version #{wanted}.
|
59
|
+
|
60
|
+
You can fix this by running :
|
61
|
+
`npx yarn-deduplicate -s fewer --packages "#{pkg}"`
|
62
|
+
HEREDOC
|
63
|
+
plugin.public_send(@options[:severity],
|
64
|
+
msg,
|
65
|
+
file: @options[:lockfile],
|
66
|
+
line: idx)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
require_relative './util/yarn_info'
|
@@ -0,0 +1,112 @@
|
|
1
|
+
{
|
2
|
+
"name": "paper-signs",
|
3
|
+
"private": true,
|
4
|
+
"workspaces": [
|
5
|
+
".",
|
6
|
+
"packages/*"
|
7
|
+
],
|
8
|
+
"scripts": {
|
9
|
+
"fix-css": "stylelint app/**/*.scss --syntax scss --fix",
|
10
|
+
"fix-js": "tslint --project tsconfig.json app/assets/javascripts/**/*.ts?\\(x\\) --fix",
|
11
|
+
"fix": "yarn fix-js && yarn fix-css",
|
12
|
+
"check-types": "tsc --noemit",
|
13
|
+
"lint": "yarn lint-js && yarn lint-css",
|
14
|
+
"lint-css": "stylelint app/**/*.scss --syntax scss",
|
15
|
+
"lint-js": "tslint --project tsconfig.json app/assets/javascripts/**/*.ts?\\(x\\)",
|
16
|
+
"analyze": "RAILS_ENV=production NODE_ENV=production bin/webpack --profile --json > tmp/stats.json && webpack-bundle-analyzer tmp/stats.json public/packs --exclude server_rendering -m static",
|
17
|
+
"test": "jest && NODE_ENV=test karma start --",
|
18
|
+
"test-css": "mocha app/assets/stylesheets/true.js",
|
19
|
+
"test-watch": "NODE_ENV=test karma start --auto-watch --no-single-run",
|
20
|
+
"prepare": "contentful-ts-generator --download=false && for d in packages/*/; do (cd $d; yarn prepare) || exit -1; done"
|
21
|
+
},
|
22
|
+
"engines": {},
|
23
|
+
"dependencies": {
|
24
|
+
"@babel/core": "^7.8.3",
|
25
|
+
"@babel/plugin-proposal-class-properties": "^7.8.3",
|
26
|
+
"@babel/preset-env": "^7.8.3",
|
27
|
+
"@babel/preset-react": "^7.8.3",
|
28
|
+
"@babel/preset-typescript": "^7.8.3",
|
29
|
+
"@rails/webpacker": "^4.0.2",
|
30
|
+
"@types/algoliasearch": "^3.30.1",
|
31
|
+
"@types/algoliasearch-helper": "^2.26.1",
|
32
|
+
"@types/bootstrap": "^4.3.1",
|
33
|
+
"@types/bugsnag-js": "^3.1.0",
|
34
|
+
"@types/chai": "^4.1.7",
|
35
|
+
"@types/chai-jquery": "^1.1.38",
|
36
|
+
"@types/enzyme": "^3.1.15",
|
37
|
+
"@types/enzyme-adapter-react-16": "^1.0.3",
|
38
|
+
"@types/fontfaceobserver": "^0.0.6",
|
39
|
+
"@types/i18n-js": "^3.0.1",
|
40
|
+
"@types/lodash": "^4.14.134",
|
41
|
+
"@types/mocha": "^5.2.5",
|
42
|
+
"@types/qs": "^6.5.3",
|
43
|
+
"@types/react": "^16.9.34",
|
44
|
+
"@types/react-dom": "^16.0.9",
|
45
|
+
"@types/react-infinite-scroller": "^1.2.1",
|
46
|
+
"@types/react-instantsearch": "^5.2.1",
|
47
|
+
"@types/sinon": "^7.0.3",
|
48
|
+
"@types/webpack-env": "^1.13.9",
|
49
|
+
"@watermarkchurch/contentful-migration": "^1.0.9",
|
50
|
+
"@watermarkchurch/react-instantsearch-components": "*",
|
51
|
+
"async-toolbox": "^0.6.6",
|
52
|
+
"babel-preset-react": "^6.24.1",
|
53
|
+
"contentful-export": "^7.4.0",
|
54
|
+
"contentful-shell": "^0.2.7",
|
55
|
+
"contentful-ts-generator": "^0.2.4",
|
56
|
+
"core-js": "3",
|
57
|
+
"date-fns": "^1.30.1",
|
58
|
+
"enzyme": "^3.7.0",
|
59
|
+
"enzyme-adapter-react-16": "^1.7.0",
|
60
|
+
"fontfaceobserver": "^2.1.0",
|
61
|
+
"html-react-parser": "^0.9.1",
|
62
|
+
"i18n-js": "^3.5.1",
|
63
|
+
"identity-obj-proxy": "^3.0.0",
|
64
|
+
"inflection": "^1.12.0",
|
65
|
+
"postcss-cssnext": "^3.1.0",
|
66
|
+
"prop-types": "^15.6.2",
|
67
|
+
"qs": "^6.7.0",
|
68
|
+
"react": "^16.12.0",
|
69
|
+
"react-calendar": "^2.19.0",
|
70
|
+
"react-dom": "^16.12.0",
|
71
|
+
"react-infinite-scroller": "^1.2.2",
|
72
|
+
"react-instantsearch": "^5.3.2",
|
73
|
+
"react-svg-loader": "^3.0.3",
|
74
|
+
"react_ujs": "^2.4.4",
|
75
|
+
"sinon": "^7.2.2",
|
76
|
+
"typescript": "^3.3.3"
|
77
|
+
},
|
78
|
+
"devDependencies": {
|
79
|
+
"@percy/agent": "^0.28.0",
|
80
|
+
"@types/jest": "^25.2.1",
|
81
|
+
"@watermarkchurch/contentful-check": "*",
|
82
|
+
"@watermarkchurch/load-tester": "*",
|
83
|
+
"babel-jest": "^25.5.0",
|
84
|
+
"chai": "^4.2.0",
|
85
|
+
"chai-jquery": "^2.0.0",
|
86
|
+
"graphql-schema-diff": "^0.6.3",
|
87
|
+
"hard-source-webpack-plugin": "^0.13.1",
|
88
|
+
"jest": "^25.5.0",
|
89
|
+
"karma": "^3.1.1",
|
90
|
+
"karma-chai": "^0.1.0",
|
91
|
+
"karma-chai-jquery": "^1.0.0",
|
92
|
+
"karma-chrome-launcher": "^2.2.0",
|
93
|
+
"karma-jquery": "^0.2.3",
|
94
|
+
"karma-junit-reporter": "^1.2.0",
|
95
|
+
"karma-mocha": "^1.3.0",
|
96
|
+
"karma-mocha-reporter": "^2.2.5",
|
97
|
+
"karma-sourcemap-loader": "^0.3.7",
|
98
|
+
"karma-webpack": "^3.0.5",
|
99
|
+
"lerna": "^3.13.1",
|
100
|
+
"mocha": "^5.2.0",
|
101
|
+
"react-test-renderer": "^16.12.0",
|
102
|
+
"sass-true": "^4.0.0",
|
103
|
+
"stylelint": "^9.6.0",
|
104
|
+
"stylelint-config-sass-guidelines": "^5.2.0",
|
105
|
+
"stylelint-scss": "^3.3.2",
|
106
|
+
"ts-node": "^7.0.1",
|
107
|
+
"tslint": "^5.11.0",
|
108
|
+
"tslint-eslint-rules": "^5.4.0",
|
109
|
+
"webpack-bundle-analyzer": "^3.0.3",
|
110
|
+
"webpack-dev-server": "^3.3.1"
|
111
|
+
}
|
112
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
diff --git a/package.json b/package.json
|
2
|
+
index 74d7ad8a..ea999d34 100644
|
3
|
+
--- a/package.json
|
4
|
+
+++ b/package.json
|
5
|
+
@@ -41,7 +41,6 @@
|
6
|
+
"@types/mocha": "^5.2.5",
|
7
|
+
"@types/qs": "^6.5.3",
|
8
|
+
"@types/react": "^16.9.34",
|
9
|
+
- "@types/react-autosuggest": "^9.3.6",
|
10
|
+
"@types/react-dom": "^16.0.9",
|
11
|
+
"@types/react-infinite-scroller": "^1.2.1",
|
12
|
+
"@types/react-instantsearch": "^5.2.1",
|
13
|
+
@@ -67,7 +66,6 @@
|
14
|
+
"prop-types": "^15.6.2",
|
15
|
+
"qs": "^6.7.0",
|
16
|
+
"react": "^16.12.0",
|
17
|
+
- "react-autosuggest": "^9.4.3",
|
18
|
+
"react-calendar": "^2.19.0",
|
19
|
+
"react-dom": "^16.12.0",
|
20
|
+
"react-infinite-scroller": "^1.2.2",
|
21
|
+
@@ -78,6 +76,7 @@
|
22
|
+
"typescript": "^3.3.3"
|
23
|
+
},
|
24
|
+
"devDependencies": {
|
25
|
+
+ "@percy/agent": "^0.28.0",
|
26
|
+
"@types/jest": "^25.2.1",
|
27
|
+
"@watermarkchurch/contentful-check": "*",
|
28
|
+
"@watermarkchurch/load-tester": "*",
|
@@ -0,0 +1,13 @@
|
|
1
|
+
diff --git a/package.json b/package.json
|
2
|
+
index ea999d3..efa8440 100644
|
3
|
+
--- a/package.json
|
4
|
+
+++ b/package.json
|
5
|
+
@@ -69,7 +69,7 @@
|
6
|
+
"react-calendar": "^2.19.0",
|
7
|
+
"react-dom": "^16.12.0",
|
8
|
+
"react-infinite-scroller": "^1.2.2",
|
9
|
+
- "react-instantsearch": "^5.3.2",
|
10
|
+
+ "react-instantsearch": "^5.3.3",
|
11
|
+
"react-svg-loader": "^3.0.3",
|
12
|
+
"react_ujs": "^2.4.4",
|
13
|
+
"sinon": "^7.2.2",
|
@@ -0,0 +1,112 @@
|
|
1
|
+
{
|
2
|
+
"name": "paper-signs",
|
3
|
+
"private": true,
|
4
|
+
"workspaces": [
|
5
|
+
".",
|
6
|
+
"packages/*"
|
7
|
+
],
|
8
|
+
"scripts": {
|
9
|
+
"fix-css": "stylelint app/**/*.scss --syntax scss --fix",
|
10
|
+
"fix-js": "tslint --project tsconfig.json app/assets/javascripts/**/*.ts?\\(x\\) --fix",
|
11
|
+
"fix": "yarn fix-js && yarn fix-css",
|
12
|
+
"check-types": "tsc --noemit",
|
13
|
+
"lint": "yarn lint-js && yarn lint-css",
|
14
|
+
"lint-css": "stylelint app/**/*.scss --syntax scss",
|
15
|
+
"lint-js": "tslint --project tsconfig.json app/assets/javascripts/**/*.ts?\\(x\\)",
|
16
|
+
"analyze": "RAILS_ENV=production NODE_ENV=production bin/webpack --profile --json > tmp/stats.json && webpack-bundle-analyzer tmp/stats.json public/packs --exclude server_rendering -m static",
|
17
|
+
"test": "jest && NODE_ENV=test karma start --",
|
18
|
+
"test-css": "mocha app/assets/stylesheets/true.js",
|
19
|
+
"test-watch": "NODE_ENV=test karma start --auto-watch --no-single-run",
|
20
|
+
"prepare": "contentful-ts-generator --download=false && for d in packages/*/; do (cd $d; yarn prepare) || exit -1; done"
|
21
|
+
},
|
22
|
+
"engines": {},
|
23
|
+
"dependencies": {
|
24
|
+
"@babel/core": "^7.8.3",
|
25
|
+
"@babel/plugin-proposal-class-properties": "^7.8.3",
|
26
|
+
"@babel/preset-env": "^7.8.3",
|
27
|
+
"@babel/preset-react": "^7.8.3",
|
28
|
+
"@babel/preset-typescript": "^7.8.3",
|
29
|
+
"@rails/webpacker": "^4.0.2",
|
30
|
+
"@types/algoliasearch": "^3.30.1",
|
31
|
+
"@types/algoliasearch-helper": "^2.26.1",
|
32
|
+
"@types/bootstrap": "^4.3.1",
|
33
|
+
"@types/bugsnag-js": "^3.1.0",
|
34
|
+
"@types/chai": "^4.1.7",
|
35
|
+
"@types/chai-jquery": "^1.1.38",
|
36
|
+
"@types/enzyme": "^3.1.15",
|
37
|
+
"@types/enzyme-adapter-react-16": "^1.0.3",
|
38
|
+
"@types/fontfaceobserver": "^0.0.6",
|
39
|
+
"@types/i18n-js": "^3.0.1",
|
40
|
+
"@types/lodash": "^4.14.134",
|
41
|
+
"@types/mocha": "^5.2.5",
|
42
|
+
"@types/qs": "^6.5.3",
|
43
|
+
"@types/react": "^16.9.34",
|
44
|
+
"@types/react-dom": "^16.0.9",
|
45
|
+
"@types/react-infinite-scroller": "^1.2.1",
|
46
|
+
"@types/react-instantsearch": "^5.2.1",
|
47
|
+
"@types/sinon": "^7.0.3",
|
48
|
+
"@types/webpack-env": "^1.13.9",
|
49
|
+
"@watermarkchurch/contentful-migration": "^1.0.9",
|
50
|
+
"@watermarkchurch/react-instantsearch-components": "*",
|
51
|
+
"async-toolbox": "^0.6.6",
|
52
|
+
"babel-preset-react": "^6.24.1",
|
53
|
+
"contentful-export": "^7.4.0",
|
54
|
+
"contentful-shell": "^0.2.7",
|
55
|
+
"contentful-ts-generator": "^0.2.4",
|
56
|
+
"core-js": "3",
|
57
|
+
"date-fns": "^1.30.1",
|
58
|
+
"enzyme": "^3.7.0",
|
59
|
+
"enzyme-adapter-react-16": "^1.7.0",
|
60
|
+
"fontfaceobserver": "^2.1.0",
|
61
|
+
"html-react-parser": "^0.9.1",
|
62
|
+
"i18n-js": "^3.5.1",
|
63
|
+
"identity-obj-proxy": "^3.0.0",
|
64
|
+
"inflection": "^1.12.0",
|
65
|
+
"postcss-cssnext": "^3.1.0",
|
66
|
+
"prop-types": "^15.6.2",
|
67
|
+
"qs": "^6.7.0",
|
68
|
+
"react": "^16.12.0",
|
69
|
+
"react-calendar": "^2.19.0",
|
70
|
+
"react-dom": "^16.12.0",
|
71
|
+
"react-infinite-scroller": "^1.2.2",
|
72
|
+
"react-instantsearch": "^5.3.3",
|
73
|
+
"react-svg-loader": "^3.0.3",
|
74
|
+
"react_ujs": "^2.4.4",
|
75
|
+
"sinon": "^7.2.2",
|
76
|
+
"typescript": "^3.3.3"
|
77
|
+
},
|
78
|
+
"devDependencies": {
|
79
|
+
"@percy/agent": "^0.28.0",
|
80
|
+
"@types/jest": "^25.2.1",
|
81
|
+
"@watermarkchurch/contentful-check": "*",
|
82
|
+
"@watermarkchurch/load-tester": "*",
|
83
|
+
"babel-jest": "^25.5.0",
|
84
|
+
"chai": "^4.2.0",
|
85
|
+
"chai-jquery": "^2.0.0",
|
86
|
+
"graphql-schema-diff": "^0.6.3",
|
87
|
+
"hard-source-webpack-plugin": "^0.13.1",
|
88
|
+
"jest": "^25.5.0",
|
89
|
+
"karma": "^3.1.1",
|
90
|
+
"karma-chai": "^0.1.0",
|
91
|
+
"karma-chai-jquery": "^1.0.0",
|
92
|
+
"karma-chrome-launcher": "^2.2.0",
|
93
|
+
"karma-jquery": "^0.2.3",
|
94
|
+
"karma-junit-reporter": "^1.2.0",
|
95
|
+
"karma-mocha": "^1.3.0",
|
96
|
+
"karma-mocha-reporter": "^2.2.5",
|
97
|
+
"karma-sourcemap-loader": "^0.3.7",
|
98
|
+
"karma-webpack": "^3.0.5",
|
99
|
+
"lerna": "^3.13.1",
|
100
|
+
"mocha": "^5.2.0",
|
101
|
+
"react-test-renderer": "^16.12.0",
|
102
|
+
"sass-true": "^4.0.0",
|
103
|
+
"stylelint": "^9.6.0",
|
104
|
+
"stylelint-config-sass-guidelines": "^5.2.0",
|
105
|
+
"stylelint-scss": "^3.3.2",
|
106
|
+
"ts-node": "^7.0.1",
|
107
|
+
"tslint": "^5.11.0",
|
108
|
+
"tslint-eslint-rules": "^5.4.0",
|
109
|
+
"webpack-bundle-analyzer": "^3.0.3",
|
110
|
+
"webpack-dev-server": "^3.3.1"
|
111
|
+
}
|
112
|
+
}
|