karafka-core 2.5.7 → 2.5.9
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/.github/workflows/ci.yml +44 -39
- data/.github/workflows/push.yml +3 -3
- data/.github/workflows/trigger-wiki-refresh.yml +1 -1
- data/.github/workflows/verify-action-pins.yml +1 -1
- data/.gitignore +0 -1
- data/.rubocop.yml +37 -0
- data/.ruby-version +1 -1
- data/.yard-lint.yml +275 -0
- data/CHANGELOG.md +12 -4
- data/Gemfile +5 -7
- data/Gemfile.lint +13 -0
- data/Gemfile.lint.lock +103 -0
- data/Gemfile.lock +19 -24
- data/Rakefile +14 -2
- data/karafka-core.gemspec +21 -21
- data/lib/karafka/core/configurable/node.rb +39 -39
- data/lib/karafka/core/configurable.rb +8 -10
- data/lib/karafka/core/contractable/contract.rb +6 -9
- data/lib/karafka/core/contractable/result.rb +10 -10
- data/lib/karafka/core/helpers/rspec_locator.rb +10 -10
- data/lib/karafka/core/helpers/time.rb +1 -1
- data/lib/karafka/core/monitoring/event.rb +1 -1
- data/lib/karafka/core/monitoring/monitor.rb +8 -12
- data/lib/karafka/core/monitoring/notifications.rb +25 -14
- data/lib/karafka/core/monitoring/statistics_decorator.rb +71 -54
- data/lib/karafka/core/version.rb +1 -1
- data/lib/karafka/core.rb +1 -1
- data/lib/karafka-core.rb +26 -26
- data/package-lock.json +331 -0
- data/package.json +9 -0
- data/renovate.json +28 -6
- data/test/lib/karafka/core/configurable/leaf_test.rb +3 -0
- data/test/lib/karafka/core/configurable/node_test.rb +3 -0
- data/test/lib/karafka/core/configurable_test.rb +504 -0
- data/test/lib/karafka/core/contractable/contract_test.rb +241 -0
- data/test/lib/karafka/core/contractable/result_test.rb +106 -0
- data/test/lib/karafka/core/contractable/rule_test.rb +5 -0
- data/test/lib/karafka/core/contractable_test.rb +3 -0
- data/test/lib/karafka/core/helpers/time_test.rb +29 -0
- data/test/lib/karafka/core/instrumentation/callbacks_manager_test.rb +81 -0
- data/test/lib/karafka/core/instrumentation_test.rb +35 -0
- data/test/lib/karafka/core/monitoring/event_test.rb +25 -0
- data/test/lib/karafka/core/monitoring/monitor_test.rb +237 -0
- data/test/lib/karafka/core/monitoring/notifications_test.rb +275 -0
- data/test/lib/karafka/core/monitoring/statistics_decorator_test.rb +284 -0
- data/test/lib/karafka/core/monitoring_test.rb +3 -0
- data/test/lib/karafka/core/patches/rdkafka/bindings_test.rb +25 -0
- data/test/lib/karafka/core/taggable/tags_test.rb +66 -0
- data/test/lib/karafka/core/taggable_test.rb +36 -0
- data/test/lib/karafka/core/version_test.rb +5 -0
- data/test/lib/karafka/core_test.rb +13 -0
- data/test/lib/karafka-core_test.rb +3 -0
- data/test/support/class_builder.rb +24 -0
- data/test/support/describe_current_helper.rb +85 -0
- data/test/test_helper.rb +55 -0
- metadata +32 -5
- data/.coditsu/ci.yml +0 -3
- data/.diffend.yml +0 -3
- data/.rspec +0 -1
|
@@ -39,7 +39,7 @@ module Karafka
|
|
|
39
39
|
def register_event(event_id)
|
|
40
40
|
@mutex.synchronize do
|
|
41
41
|
@listeners[event_id] = []
|
|
42
|
-
@events_methods_map[event_id] = :"on_#{event_id.to_s.tr(
|
|
42
|
+
@events_methods_map[event_id] = :"on_#{event_id.to_s.tr(".", "_")}"
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
|
|
@@ -107,7 +107,7 @@ module Karafka
|
|
|
107
107
|
# Allows for code instrumentation
|
|
108
108
|
# Runs the provided code and sends the instrumentation details to all registered listeners
|
|
109
109
|
#
|
|
110
|
-
# @param event_id [String]
|
|
110
|
+
# @param event_id [String]
|
|
111
111
|
# @param payload [Hash] payload for the instrumentation
|
|
112
112
|
# @yield [Proc] instrumented code
|
|
113
113
|
# @return [Object] whatever the provided block (if any) returns
|
|
@@ -139,18 +139,31 @@ module Karafka
|
|
|
139
139
|
return
|
|
140
140
|
end
|
|
141
141
|
|
|
142
|
-
final_payload =
|
|
143
|
-
if payload.empty?
|
|
144
|
-
{ time: time }
|
|
145
|
-
else
|
|
146
|
-
payload.merge(time: time)
|
|
147
|
-
end
|
|
148
|
-
else
|
|
149
|
-
payload
|
|
150
|
-
end
|
|
151
|
-
|
|
142
|
+
final_payload = build_payload(payload, time)
|
|
152
143
|
event = Event.new(event_id, final_payload)
|
|
153
144
|
|
|
145
|
+
notify_listeners(event_id, event, assigned_listeners)
|
|
146
|
+
|
|
147
|
+
result
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
private
|
|
151
|
+
|
|
152
|
+
# Builds the final payload with time information if available
|
|
153
|
+
# @param payload [Hash] original payload
|
|
154
|
+
# @param time [Float, nil] execution time if block was given
|
|
155
|
+
# @return [Hash] final payload
|
|
156
|
+
def build_payload(payload, time)
|
|
157
|
+
return payload unless time
|
|
158
|
+
|
|
159
|
+
payload.empty? ? { time: time } : payload.merge(time: time)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Notifies all assigned listeners about the event
|
|
163
|
+
# @param event_id [String]
|
|
164
|
+
# @param event [Event] event with payload to broadcast to listeners
|
|
165
|
+
# @param assigned_listeners [Array] list of listeners to notify
|
|
166
|
+
def notify_listeners(event_id, event, assigned_listeners)
|
|
154
167
|
assigned_listeners.each do |listener|
|
|
155
168
|
if listener.is_a?(Proc)
|
|
156
169
|
listener.call(event)
|
|
@@ -158,8 +171,6 @@ module Karafka
|
|
|
158
171
|
listener.send(@events_methods_map[event_id], event)
|
|
159
172
|
end
|
|
160
173
|
end
|
|
161
|
-
|
|
162
|
-
result
|
|
163
174
|
end
|
|
164
175
|
end
|
|
165
176
|
end
|
|
@@ -23,11 +23,22 @@ module Karafka
|
|
|
23
23
|
|
|
24
24
|
private_constant :EMPTY_HASH
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
# @param excluded_keys [Array<String>] list of key names to skip entirely during
|
|
27
|
+
# decoration. Excluded keys are not recursed into and not decorated with delta/freeze
|
|
28
|
+
# duration suffixes. This is useful for skipping large subtrees of the librdkafka
|
|
29
|
+
# statistics that are not consumed by the application (e.g. broker toppars, window
|
|
30
|
+
# stats like int_latency, outbuf_latency, throttle, batchsize, batchcnt, req).
|
|
31
|
+
def initialize(excluded_keys: [])
|
|
27
32
|
@previous = EMPTY_HASH
|
|
28
33
|
# Operate on ms precision only
|
|
29
34
|
@previous_at = monotonic_now.round
|
|
30
|
-
|
|
35
|
+
# Cache for memoized suffix keys to avoid repeated string allocations
|
|
36
|
+
@suffix_keys_cache = {}
|
|
37
|
+
# Frozen hash for O(1) key exclusion lookup, nil when empty to avoid per-key
|
|
38
|
+
# lookups in the hot loop when no exclusions are configured
|
|
39
|
+
@excluded_keys = unless excluded_keys.empty?
|
|
40
|
+
excluded_keys.each_with_object({}) { |k, h| h[k] = true }.freeze
|
|
41
|
+
end
|
|
31
42
|
end
|
|
32
43
|
|
|
33
44
|
# @param emited_stats [Hash] original emited statistics
|
|
@@ -36,78 +47,84 @@ module Karafka
|
|
|
36
47
|
# any API to get raw data, users can just assume that the result of this decoration is
|
|
37
48
|
# the proper raw stats that they can use
|
|
38
49
|
def call(emited_stats)
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
@change_d = @current_at - @previous_at
|
|
50
|
+
current_at = monotonic_now.round
|
|
51
|
+
change_d = current_at - @previous_at
|
|
42
52
|
|
|
43
53
|
diff(
|
|
44
54
|
@previous,
|
|
45
|
-
emited_stats
|
|
55
|
+
emited_stats,
|
|
56
|
+
[],
|
|
57
|
+
0,
|
|
58
|
+
change_d
|
|
46
59
|
)
|
|
47
60
|
|
|
48
61
|
@previous = emited_stats
|
|
49
|
-
@previous_at =
|
|
62
|
+
@previous_at = current_at
|
|
50
63
|
|
|
51
64
|
emited_stats.freeze
|
|
52
65
|
end
|
|
53
66
|
|
|
54
67
|
private
|
|
55
68
|
|
|
56
|
-
# Calculates the diff of the provided values
|
|
69
|
+
# Calculates the diff of the provided values, appends delta and freeze duration keys,
|
|
70
|
+
# and modifies in place the emited statistics.
|
|
71
|
+
#
|
|
72
|
+
# Uses `each_pair` with a per-call pending-writes buffer instead of `current.keys.each`
|
|
73
|
+
# to avoid allocating a new Array for every Hash node in the statistics tree. At scale
|
|
74
|
+
# (thousands of partitions), this reduces allocations from tens of thousands to one per call.
|
|
57
75
|
#
|
|
58
|
-
#
|
|
59
|
-
#
|
|
76
|
+
# The append and suffix_keys_for logic is inlined to reduce method call overhead
|
|
77
|
+
# (from ~915k method calls to ~39k at 6400 partitions).
|
|
78
|
+
#
|
|
79
|
+
# @param previous [Object] previous value from the given scope in which we are
|
|
60
80
|
# @param current [Object] current scope from emitted statistics
|
|
61
|
-
# @
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
81
|
+
# @param pw [Array] pending writes buffer shared across recursive calls
|
|
82
|
+
# @param pw_start [Integer] starting offset in the buffer for this hash level
|
|
83
|
+
# @param change_d [Integer] time delta in ms since last stats emission
|
|
84
|
+
def diff(previous, current, pw, pw_start, change_d)
|
|
85
|
+
return unless current.is_a?(Hash)
|
|
86
|
+
|
|
87
|
+
filled_previous = previous || EMPTY_HASH
|
|
88
|
+
cache = @suffix_keys_cache
|
|
89
|
+
excluded = @excluded_keys
|
|
90
|
+
pw_size = pw_start
|
|
91
|
+
|
|
92
|
+
current.each_pair do |key, value|
|
|
93
|
+
next if excluded&.key?(key)
|
|
94
|
+
|
|
95
|
+
if value.is_a?(Hash)
|
|
96
|
+
diff(filled_previous[key], value, pw, pw_size, change_d)
|
|
97
|
+
next
|
|
76
98
|
end
|
|
77
|
-
end
|
|
78
99
|
|
|
79
|
-
|
|
80
|
-
return current unless current.is_a?(Numeric)
|
|
81
|
-
# If there was no previous value, delta is always zero
|
|
82
|
-
return 0 unless previous
|
|
83
|
-
# Should never happen but just in case, a type changed in between stats
|
|
84
|
-
return current unless previous.is_a?(Numeric)
|
|
100
|
+
next unless value.is_a?(Numeric)
|
|
85
101
|
|
|
86
|
-
|
|
87
|
-
end
|
|
102
|
+
prev_value = filled_previous[key]
|
|
88
103
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
current[freeze_duration_key] += @change_d
|
|
106
|
-
else
|
|
107
|
-
current[freeze_duration_key] = 0
|
|
104
|
+
if prev_value.nil?
|
|
105
|
+
result = 0
|
|
106
|
+
elsif prev_value.is_a?(Numeric)
|
|
107
|
+
result = value - prev_value
|
|
108
|
+
else
|
|
109
|
+
next
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Inlined suffix_keys_for for reduced method call overhead
|
|
113
|
+
pair = cache[key] || (cache[key] = ["#{key}_fd".freeze, "#{key}_d".freeze].freeze)
|
|
114
|
+
|
|
115
|
+
pw[pw_size] = pair[0]
|
|
116
|
+
pw[pw_size + 1] = (result == 0) ? (filled_previous[pair[0]] || 0) + change_d : 0
|
|
117
|
+
pw[pw_size + 2] = pair[1]
|
|
118
|
+
pw[pw_size + 3] = result
|
|
119
|
+
pw_size += 4
|
|
108
120
|
end
|
|
109
121
|
|
|
110
|
-
|
|
122
|
+
# Apply collected writes for this hash level
|
|
123
|
+
i = pw_start
|
|
124
|
+
while i < pw_size
|
|
125
|
+
current[pw[i]] = pw[i + 1]
|
|
126
|
+
i += 2
|
|
127
|
+
end
|
|
111
128
|
end
|
|
112
129
|
end
|
|
113
130
|
end
|
data/lib/karafka/core/version.rb
CHANGED
data/lib/karafka/core.rb
CHANGED
data/lib/karafka-core.rb
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
5
|
-
require
|
|
6
|
-
require
|
|
7
|
-
require
|
|
8
|
-
require
|
|
9
|
-
require
|
|
10
|
-
require
|
|
11
|
-
require
|
|
12
|
-
require
|
|
13
|
-
require
|
|
14
|
-
require
|
|
15
|
-
require
|
|
16
|
-
require
|
|
17
|
-
require
|
|
18
|
-
require
|
|
19
|
-
require
|
|
20
|
-
require
|
|
21
|
-
require
|
|
22
|
-
require
|
|
23
|
-
require
|
|
24
|
-
require
|
|
3
|
+
require "logger"
|
|
4
|
+
require "yaml"
|
|
5
|
+
require "rdkafka"
|
|
6
|
+
require "karafka/core"
|
|
7
|
+
require "karafka/core/version"
|
|
8
|
+
require "karafka/core/helpers/time"
|
|
9
|
+
require "karafka/core/monitoring"
|
|
10
|
+
require "karafka/core/monitoring/event"
|
|
11
|
+
require "karafka/core/monitoring/monitor"
|
|
12
|
+
require "karafka/core/monitoring/notifications"
|
|
13
|
+
require "karafka/core/monitoring/statistics_decorator"
|
|
14
|
+
require "karafka/core/configurable"
|
|
15
|
+
require "karafka/core/configurable/leaf"
|
|
16
|
+
require "karafka/core/configurable/node"
|
|
17
|
+
require "karafka/core/contractable/contract"
|
|
18
|
+
require "karafka/core/contractable/result"
|
|
19
|
+
require "karafka/core/contractable/rule"
|
|
20
|
+
require "karafka/core/instrumentation"
|
|
21
|
+
require "karafka/core/instrumentation/callbacks_manager"
|
|
22
|
+
require "karafka/core/taggable"
|
|
23
|
+
require "karafka/core/taggable/tags"
|
|
24
|
+
require "karafka/core/patches/rdkafka/bindings"
|
|
25
25
|
|
|
26
26
|
# Karafka framework main namespace
|
|
27
27
|
module Karafka
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
# Patch rdkafka
|
|
31
|
-
|
|
31
|
+
Rdkafka::Bindings.include(Karafka::Core::Patches::Rdkafka::Bindings)
|
|
32
32
|
|
|
33
|
-
instrumentation =
|
|
34
|
-
rd_config =
|
|
33
|
+
instrumentation = Karafka::Core::Instrumentation
|
|
34
|
+
rd_config = Rdkafka::Config
|
|
35
35
|
|
|
36
36
|
# Rdkafka uses a single global callback for things. We bypass that by injecting a manager for
|
|
37
37
|
# each callback type. Callback manager allows us to register more than one callback
|
|
@@ -43,4 +43,4 @@ rd_config.oauthbearer_token_refresh_callback = instrumentation.oauthbearer_token
|
|
|
43
43
|
# This loads librdkafka components into memory prior to initializing the client.
|
|
44
44
|
# This mitigates macos forking issues.
|
|
45
45
|
# @see https://github.com/confluentinc/librdkafka/issues/4590
|
|
46
|
-
|
|
46
|
+
Rdkafka::Bindings.rd_kafka_global_init if Rdkafka::Bindings.respond_to?(:rd_kafka_global_init)
|
data/package-lock.json
ADDED
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "karafka-core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"lockfileVersion": 3,
|
|
5
|
+
"requires": true,
|
|
6
|
+
"packages": {
|
|
7
|
+
"": {
|
|
8
|
+
"name": "karafka-core",
|
|
9
|
+
"version": "1.0.0",
|
|
10
|
+
"devDependencies": {
|
|
11
|
+
"lostconf": "0.4.0"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"node_modules/@nodelib/fs.scandir": {
|
|
15
|
+
"version": "2.1.5",
|
|
16
|
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
|
|
17
|
+
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
|
|
18
|
+
"dev": true,
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@nodelib/fs.stat": "2.0.5",
|
|
22
|
+
"run-parallel": "^1.1.9"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">= 8"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"node_modules/@nodelib/fs.stat": {
|
|
29
|
+
"version": "2.0.5",
|
|
30
|
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
|
|
31
|
+
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
|
|
32
|
+
"dev": true,
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">= 8"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"node_modules/@nodelib/fs.walk": {
|
|
39
|
+
"version": "1.2.8",
|
|
40
|
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
|
|
41
|
+
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
|
|
42
|
+
"dev": true,
|
|
43
|
+
"license": "MIT",
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@nodelib/fs.scandir": "2.1.5",
|
|
46
|
+
"fastq": "^1.6.0"
|
|
47
|
+
},
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">= 8"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"node_modules/braces": {
|
|
53
|
+
"version": "3.0.3",
|
|
54
|
+
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
|
55
|
+
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
|
56
|
+
"dev": true,
|
|
57
|
+
"license": "MIT",
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"fill-range": "^7.1.1"
|
|
60
|
+
},
|
|
61
|
+
"engines": {
|
|
62
|
+
"node": ">=8"
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"node_modules/chalk": {
|
|
66
|
+
"version": "5.6.2",
|
|
67
|
+
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
|
|
68
|
+
"integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
|
|
69
|
+
"dev": true,
|
|
70
|
+
"license": "MIT",
|
|
71
|
+
"engines": {
|
|
72
|
+
"node": "^12.17.0 || ^14.13 || >=16.0.0"
|
|
73
|
+
},
|
|
74
|
+
"funding": {
|
|
75
|
+
"url": "https://github.com/chalk/chalk?sponsor=1"
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"node_modules/commander": {
|
|
79
|
+
"version": "12.1.0",
|
|
80
|
+
"resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
|
|
81
|
+
"integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
|
|
82
|
+
"dev": true,
|
|
83
|
+
"license": "MIT",
|
|
84
|
+
"engines": {
|
|
85
|
+
"node": ">=18"
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"node_modules/fast-glob": {
|
|
89
|
+
"version": "3.3.3",
|
|
90
|
+
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
|
|
91
|
+
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
|
|
92
|
+
"dev": true,
|
|
93
|
+
"license": "MIT",
|
|
94
|
+
"dependencies": {
|
|
95
|
+
"@nodelib/fs.stat": "^2.0.2",
|
|
96
|
+
"@nodelib/fs.walk": "^1.2.3",
|
|
97
|
+
"glob-parent": "^5.1.2",
|
|
98
|
+
"merge2": "^1.3.0",
|
|
99
|
+
"micromatch": "^4.0.8"
|
|
100
|
+
},
|
|
101
|
+
"engines": {
|
|
102
|
+
"node": ">=8.6.0"
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"node_modules/fastq": {
|
|
106
|
+
"version": "1.20.1",
|
|
107
|
+
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
|
|
108
|
+
"integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
|
|
109
|
+
"dev": true,
|
|
110
|
+
"license": "ISC",
|
|
111
|
+
"dependencies": {
|
|
112
|
+
"reusify": "^1.0.4"
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
"node_modules/fill-range": {
|
|
116
|
+
"version": "7.1.1",
|
|
117
|
+
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
|
118
|
+
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
|
119
|
+
"dev": true,
|
|
120
|
+
"license": "MIT",
|
|
121
|
+
"dependencies": {
|
|
122
|
+
"to-regex-range": "^5.0.1"
|
|
123
|
+
},
|
|
124
|
+
"engines": {
|
|
125
|
+
"node": ">=8"
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
"node_modules/glob-parent": {
|
|
129
|
+
"version": "5.1.2",
|
|
130
|
+
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
|
|
131
|
+
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
|
|
132
|
+
"dev": true,
|
|
133
|
+
"license": "ISC",
|
|
134
|
+
"dependencies": {
|
|
135
|
+
"is-glob": "^4.0.1"
|
|
136
|
+
},
|
|
137
|
+
"engines": {
|
|
138
|
+
"node": ">= 6"
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
"node_modules/is-extglob": {
|
|
142
|
+
"version": "2.1.1",
|
|
143
|
+
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
|
|
144
|
+
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
|
|
145
|
+
"dev": true,
|
|
146
|
+
"license": "MIT",
|
|
147
|
+
"engines": {
|
|
148
|
+
"node": ">=0.10.0"
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
"node_modules/is-glob": {
|
|
152
|
+
"version": "4.0.3",
|
|
153
|
+
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
|
|
154
|
+
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
|
|
155
|
+
"dev": true,
|
|
156
|
+
"license": "MIT",
|
|
157
|
+
"dependencies": {
|
|
158
|
+
"is-extglob": "^2.1.1"
|
|
159
|
+
},
|
|
160
|
+
"engines": {
|
|
161
|
+
"node": ">=0.10.0"
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"node_modules/is-number": {
|
|
165
|
+
"version": "7.0.0",
|
|
166
|
+
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
|
167
|
+
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
|
168
|
+
"dev": true,
|
|
169
|
+
"license": "MIT",
|
|
170
|
+
"engines": {
|
|
171
|
+
"node": ">=0.12.0"
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
"node_modules/lostconf": {
|
|
175
|
+
"version": "0.4.0",
|
|
176
|
+
"resolved": "https://registry.npmjs.org/lostconf/-/lostconf-0.4.0.tgz",
|
|
177
|
+
"integrity": "sha512-VNbUnirRU7uESqMHslIRHTcuyx/rr4OZK+L7EQXtYUe5PorBgqBYvPu+6xOr0CoUy4n34NNUKO6BBH6TgwwGTA==",
|
|
178
|
+
"dev": true,
|
|
179
|
+
"license": "MIT",
|
|
180
|
+
"dependencies": {
|
|
181
|
+
"chalk": "^5.3.0",
|
|
182
|
+
"commander": "^12.1.0",
|
|
183
|
+
"fast-glob": "^3.3.2",
|
|
184
|
+
"micromatch": "^4.0.8",
|
|
185
|
+
"smol-toml": "^1.3.0",
|
|
186
|
+
"yaml": "^2.5.0"
|
|
187
|
+
},
|
|
188
|
+
"bin": {
|
|
189
|
+
"lostconf": "dist/cli.js"
|
|
190
|
+
},
|
|
191
|
+
"engines": {
|
|
192
|
+
"node": ">=18.0.0"
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
"node_modules/merge2": {
|
|
196
|
+
"version": "1.4.1",
|
|
197
|
+
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
|
|
198
|
+
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
|
|
199
|
+
"dev": true,
|
|
200
|
+
"license": "MIT",
|
|
201
|
+
"engines": {
|
|
202
|
+
"node": ">= 8"
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
"node_modules/micromatch": {
|
|
206
|
+
"version": "4.0.8",
|
|
207
|
+
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
|
|
208
|
+
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
|
|
209
|
+
"dev": true,
|
|
210
|
+
"license": "MIT",
|
|
211
|
+
"dependencies": {
|
|
212
|
+
"braces": "^3.0.3",
|
|
213
|
+
"picomatch": "^2.3.1"
|
|
214
|
+
},
|
|
215
|
+
"engines": {
|
|
216
|
+
"node": ">=8.6"
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
"node_modules/picomatch": {
|
|
220
|
+
"version": "2.3.1",
|
|
221
|
+
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
|
|
222
|
+
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
|
|
223
|
+
"dev": true,
|
|
224
|
+
"license": "MIT",
|
|
225
|
+
"engines": {
|
|
226
|
+
"node": ">=8.6"
|
|
227
|
+
},
|
|
228
|
+
"funding": {
|
|
229
|
+
"url": "https://github.com/sponsors/jonschlinkert"
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
"node_modules/queue-microtask": {
|
|
233
|
+
"version": "1.2.3",
|
|
234
|
+
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
|
|
235
|
+
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
|
|
236
|
+
"dev": true,
|
|
237
|
+
"funding": [
|
|
238
|
+
{
|
|
239
|
+
"type": "github",
|
|
240
|
+
"url": "https://github.com/sponsors/feross"
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"type": "patreon",
|
|
244
|
+
"url": "https://www.patreon.com/feross"
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"type": "consulting",
|
|
248
|
+
"url": "https://feross.org/support"
|
|
249
|
+
}
|
|
250
|
+
],
|
|
251
|
+
"license": "MIT"
|
|
252
|
+
},
|
|
253
|
+
"node_modules/reusify": {
|
|
254
|
+
"version": "1.1.0",
|
|
255
|
+
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
|
|
256
|
+
"integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
|
|
257
|
+
"dev": true,
|
|
258
|
+
"license": "MIT",
|
|
259
|
+
"engines": {
|
|
260
|
+
"iojs": ">=1.0.0",
|
|
261
|
+
"node": ">=0.10.0"
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
"node_modules/run-parallel": {
|
|
265
|
+
"version": "1.2.0",
|
|
266
|
+
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
|
|
267
|
+
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
|
|
268
|
+
"dev": true,
|
|
269
|
+
"funding": [
|
|
270
|
+
{
|
|
271
|
+
"type": "github",
|
|
272
|
+
"url": "https://github.com/sponsors/feross"
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"type": "patreon",
|
|
276
|
+
"url": "https://www.patreon.com/feross"
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"type": "consulting",
|
|
280
|
+
"url": "https://feross.org/support"
|
|
281
|
+
}
|
|
282
|
+
],
|
|
283
|
+
"license": "MIT",
|
|
284
|
+
"dependencies": {
|
|
285
|
+
"queue-microtask": "^1.2.2"
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
"node_modules/smol-toml": {
|
|
289
|
+
"version": "1.6.0",
|
|
290
|
+
"resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz",
|
|
291
|
+
"integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==",
|
|
292
|
+
"dev": true,
|
|
293
|
+
"license": "BSD-3-Clause",
|
|
294
|
+
"engines": {
|
|
295
|
+
"node": ">= 18"
|
|
296
|
+
},
|
|
297
|
+
"funding": {
|
|
298
|
+
"url": "https://github.com/sponsors/cyyynthia"
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
"node_modules/to-regex-range": {
|
|
302
|
+
"version": "5.0.1",
|
|
303
|
+
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
|
|
304
|
+
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
|
|
305
|
+
"dev": true,
|
|
306
|
+
"license": "MIT",
|
|
307
|
+
"dependencies": {
|
|
308
|
+
"is-number": "^7.0.0"
|
|
309
|
+
},
|
|
310
|
+
"engines": {
|
|
311
|
+
"node": ">=8.0"
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
"node_modules/yaml": {
|
|
315
|
+
"version": "2.8.2",
|
|
316
|
+
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
|
|
317
|
+
"integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
|
|
318
|
+
"dev": true,
|
|
319
|
+
"license": "ISC",
|
|
320
|
+
"bin": {
|
|
321
|
+
"yaml": "bin.mjs"
|
|
322
|
+
},
|
|
323
|
+
"engines": {
|
|
324
|
+
"node": ">= 14.6"
|
|
325
|
+
},
|
|
326
|
+
"funding": {
|
|
327
|
+
"url": "https://github.com/sponsors/eemeli"
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|