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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +44 -39
  3. data/.github/workflows/push.yml +3 -3
  4. data/.github/workflows/trigger-wiki-refresh.yml +1 -1
  5. data/.github/workflows/verify-action-pins.yml +1 -1
  6. data/.gitignore +0 -1
  7. data/.rubocop.yml +37 -0
  8. data/.ruby-version +1 -1
  9. data/.yard-lint.yml +275 -0
  10. data/CHANGELOG.md +12 -4
  11. data/Gemfile +5 -7
  12. data/Gemfile.lint +13 -0
  13. data/Gemfile.lint.lock +103 -0
  14. data/Gemfile.lock +19 -24
  15. data/Rakefile +14 -2
  16. data/karafka-core.gemspec +21 -21
  17. data/lib/karafka/core/configurable/node.rb +39 -39
  18. data/lib/karafka/core/configurable.rb +8 -10
  19. data/lib/karafka/core/contractable/contract.rb +6 -9
  20. data/lib/karafka/core/contractable/result.rb +10 -10
  21. data/lib/karafka/core/helpers/rspec_locator.rb +10 -10
  22. data/lib/karafka/core/helpers/time.rb +1 -1
  23. data/lib/karafka/core/monitoring/event.rb +1 -1
  24. data/lib/karafka/core/monitoring/monitor.rb +8 -12
  25. data/lib/karafka/core/monitoring/notifications.rb +25 -14
  26. data/lib/karafka/core/monitoring/statistics_decorator.rb +71 -54
  27. data/lib/karafka/core/version.rb +1 -1
  28. data/lib/karafka/core.rb +1 -1
  29. data/lib/karafka-core.rb +26 -26
  30. data/package-lock.json +331 -0
  31. data/package.json +9 -0
  32. data/renovate.json +28 -6
  33. data/test/lib/karafka/core/configurable/leaf_test.rb +3 -0
  34. data/test/lib/karafka/core/configurable/node_test.rb +3 -0
  35. data/test/lib/karafka/core/configurable_test.rb +504 -0
  36. data/test/lib/karafka/core/contractable/contract_test.rb +241 -0
  37. data/test/lib/karafka/core/contractable/result_test.rb +106 -0
  38. data/test/lib/karafka/core/contractable/rule_test.rb +5 -0
  39. data/test/lib/karafka/core/contractable_test.rb +3 -0
  40. data/test/lib/karafka/core/helpers/time_test.rb +29 -0
  41. data/test/lib/karafka/core/instrumentation/callbacks_manager_test.rb +81 -0
  42. data/test/lib/karafka/core/instrumentation_test.rb +35 -0
  43. data/test/lib/karafka/core/monitoring/event_test.rb +25 -0
  44. data/test/lib/karafka/core/monitoring/monitor_test.rb +237 -0
  45. data/test/lib/karafka/core/monitoring/notifications_test.rb +275 -0
  46. data/test/lib/karafka/core/monitoring/statistics_decorator_test.rb +284 -0
  47. data/test/lib/karafka/core/monitoring_test.rb +3 -0
  48. data/test/lib/karafka/core/patches/rdkafka/bindings_test.rb +25 -0
  49. data/test/lib/karafka/core/taggable/tags_test.rb +66 -0
  50. data/test/lib/karafka/core/taggable_test.rb +36 -0
  51. data/test/lib/karafka/core/version_test.rb +5 -0
  52. data/test/lib/karafka/core_test.rb +13 -0
  53. data/test/lib/karafka-core_test.rb +3 -0
  54. data/test/support/class_builder.rb +24 -0
  55. data/test/support/describe_current_helper.rb +85 -0
  56. data/test/test_helper.rb +55 -0
  57. metadata +32 -5
  58. data/.coditsu/ci.yml +0 -3
  59. data/.diffend.yml +0 -3
  60. 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] id of the event
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 = if time
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
- def initialize
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
- @current_at = @previous_at
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
- @current_at = monotonic_now.round
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 = @current_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 and modifies in place the emited statistics
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
- # @param previous [Object] previous value from the given scope in which
59
- # we are
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
- # @return [Object] the diff if the values were numerics or the current scope
62
- def diff(previous, current)
63
- if current.is_a?(Hash)
64
- filled_previous = previous || EMPTY_HASH
65
- filled_current = current || EMPTY_HASH
66
-
67
- # @note We cannot use #each_key as we modify the content of the current scope
68
- # in place (in case it's a hash)
69
- current.keys.each do |key|
70
- append(
71
- filled_previous,
72
- filled_current,
73
- key,
74
- diff(filled_previous[key], filled_current[key])
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
- # Diff can be computed only for numerics
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
- current - previous
87
- end
102
+ prev_value = filled_previous[key]
88
103
 
89
- # Appends the result of the diff to a given key as long as the result is numeric
90
- #
91
- # @param previous [Hash] previous scope
92
- # @param current [Hash] current scope
93
- # @param key [Symbol] key based on which we were diffing
94
- # @param result [Object] diff result
95
- def append(previous, current, key, result)
96
- return unless result.is_a?(Numeric)
97
- return if current.frozen?
98
-
99
- key_str = key.to_s
100
- freeze_duration_key = "#{key_str}_fd"
101
- delta_key = "#{key_str}_d"
102
-
103
- if result.zero?
104
- current[freeze_duration_key] = previous[freeze_duration_key] || 0
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
- current[delta_key] = result
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
@@ -4,6 +4,6 @@ module Karafka
4
4
  module Core
5
5
  # Current Karafka::Core version
6
6
  # We follow the versioning schema of given Karafka version
7
- VERSION = '2.5.7'
7
+ VERSION = "2.5.9"
8
8
  end
9
9
  end
data/lib/karafka/core.rb CHANGED
@@ -6,7 +6,7 @@ module Karafka
6
6
  class << self
7
7
  # @return [String] root path of this gem
8
8
  def gem_root
9
- Pathname.new(File.expand_path('../..', __dir__))
9
+ Pathname.new(File.expand_path("../..", __dir__))
10
10
  end
11
11
  end
12
12
  end
data/lib/karafka-core.rb CHANGED
@@ -1,37 +1,37 @@
1
1
  # frozen_string_literal: true
2
2
 
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'
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
- ::Rdkafka::Bindings.include(::Karafka::Core::Patches::Rdkafka::Bindings)
31
+ Rdkafka::Bindings.include(Karafka::Core::Patches::Rdkafka::Bindings)
32
32
 
33
- instrumentation = ::Karafka::Core::Instrumentation
34
- rd_config = ::Rdkafka::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
- ::Rdkafka::Bindings.rd_kafka_global_init if ::Rdkafka::Bindings.respond_to?(:rd_kafka_global_init)
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
+ }
data/package.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "karafka-core",
3
+ "version": "1.0.0",
4
+ "description": "CI dependencies for karafka-core",
5
+ "private": true,
6
+ "devDependencies": {
7
+ "lostconf": "0.4.0"
8
+ }
9
+ }