✨ Recognize teammates in slack by awarding them sparkles!

✨ Initial commit

davidcel.is c9b83de1

+2
.env
··· 1 + # This is checked into source control, so put sensitive values into `.env.local` 2 + DATABASE_URL=postgres://localhost/sparkles
+5
.gitignore
··· 1 + .env*.local 2 + log/* 3 + public/ 4 + node_modules/ 5 + spec/examples.txt
+1
.rspec
··· 1 + --require spec_helper
+44
Gemfile
··· 1 + # frozen_string_literal: true 2 + 3 + source "https://gem.coop" 4 + 5 + HANAMI_VERSION = "~> 2.2" 6 + 7 + gem "hanami", HANAMI_VERSION 8 + gem "hanami-assets", HANAMI_VERSION 9 + gem "hanami-controller", HANAMI_VERSION 10 + gem "hanami-db", HANAMI_VERSION 11 + gem "hanami-router", HANAMI_VERSION 12 + gem "hanami-validations", HANAMI_VERSION 13 + gem "hanami-view", HANAMI_VERSION 14 + 15 + gem "dry-types", "~> 1.7" 16 + gem "dry-operation" 17 + gem "puma" 18 + gem "rake" 19 + gem "pg" 20 + 21 + group :development do 22 + gem "hanami-webconsole", "~> 2.2" 23 + end 24 + 25 + group :development, :test do 26 + gem "dotenv" 27 + end 28 + 29 + group :cli, :development do 30 + gem "hanami-reloader", "~> 2.2" 31 + end 32 + 33 + group :cli, :development, :test do 34 + gem "hanami-rspec", "~> 2.2" 35 + end 36 + 37 + group :test do 38 + # Database 39 + gem "database_cleaner-sequel" 40 + 41 + # Web integration 42 + gem "capybara" 43 + gem "rack-test" 44 + end
+345
Gemfile.lock
··· 1 + GEM 2 + remote: https://gem.coop/ 3 + specs: 4 + addressable (2.8.7) 5 + public_suffix (>= 2.0.2, < 7.0) 6 + better_errors (2.10.1) 7 + erubi (>= 1.0.0) 8 + rack (>= 0.9.0) 9 + rouge (>= 1.0.0) 10 + bigdecimal (3.3.1) 11 + binding_of_caller (1.0.1) 12 + debug_inspector (>= 1.2.0) 13 + capybara (3.40.0) 14 + addressable 15 + matrix 16 + mini_mime (>= 0.1.3) 17 + nokogiri (~> 1.11) 18 + rack (>= 1.6.0) 19 + rack-test (>= 0.6.3) 20 + regexp_parser (>= 1.5, < 3.0) 21 + xpath (~> 3.2) 22 + coderay (1.1.3) 23 + concurrent-ruby (1.3.5) 24 + database_cleaner-core (2.0.1) 25 + database_cleaner-sequel (2.0.2) 26 + database_cleaner-core (~> 2.0.0) 27 + sequel 28 + debug_inspector (1.2.0) 29 + diff-lcs (1.6.2) 30 + dotenv (3.1.8) 31 + dry-auto_inject (1.1.0) 32 + dry-core (~> 1.1) 33 + zeitwerk (~> 2.6) 34 + dry-cli (1.3.0) 35 + dry-configurable (1.3.0) 36 + dry-core (~> 1.1) 37 + zeitwerk (~> 2.6) 38 + dry-core (1.1.0) 39 + concurrent-ruby (~> 1.0) 40 + logger 41 + zeitwerk (~> 2.6) 42 + dry-events (1.1.0) 43 + concurrent-ruby (~> 1.0) 44 + dry-core (~> 1.1) 45 + dry-files (1.1.0) 46 + dry-inflector (1.2.0) 47 + dry-initializer (3.2.0) 48 + dry-logger (1.1.0) 49 + dry-logic (1.6.0) 50 + bigdecimal 51 + concurrent-ruby (~> 1.0) 52 + dry-core (~> 1.1) 53 + zeitwerk (~> 2.6) 54 + dry-monads (1.9.0) 55 + concurrent-ruby (~> 1.0) 56 + dry-core (~> 1.1) 57 + zeitwerk (~> 2.6) 58 + dry-monitor (1.0.1) 59 + dry-configurable (~> 1.0, < 2) 60 + dry-core (~> 1.0, < 2) 61 + dry-events (~> 1.0, < 2) 62 + dry-operation (1.0.0) 63 + dry-monads (~> 1.6) 64 + zeitwerk (~> 2.6) 65 + dry-schema (1.14.1) 66 + concurrent-ruby (~> 1.0) 67 + dry-configurable (~> 1.0, >= 1.0.1) 68 + dry-core (~> 1.1) 69 + dry-initializer (~> 3.2) 70 + dry-logic (~> 1.5) 71 + dry-types (~> 1.8) 72 + zeitwerk (~> 2.6) 73 + dry-struct (1.8.0) 74 + dry-core (~> 1.1) 75 + dry-types (~> 1.8, >= 1.8.2) 76 + ice_nine (~> 0.11) 77 + zeitwerk (~> 2.6) 78 + dry-system (1.2.4) 79 + dry-auto_inject (~> 1.1) 80 + dry-configurable (~> 1.3) 81 + dry-core (~> 1.1) 82 + dry-inflector (~> 1.1) 83 + dry-transformer (1.0.1) 84 + zeitwerk (~> 2.6) 85 + dry-types (1.8.3) 86 + bigdecimal (~> 3.0) 87 + concurrent-ruby (~> 1.0) 88 + dry-core (~> 1.0) 89 + dry-inflector (~> 1.0) 90 + dry-logic (~> 1.4) 91 + zeitwerk (~> 2.6) 92 + dry-validation (1.11.1) 93 + concurrent-ruby (~> 1.0) 94 + dry-core (~> 1.1) 95 + dry-initializer (~> 3.2) 96 + dry-schema (~> 1.14) 97 + zeitwerk (~> 2.6) 98 + erubi (1.13.1) 99 + ffi (1.17.2) 100 + ffi (1.17.2-aarch64-linux-gnu) 101 + ffi (1.17.2-aarch64-linux-musl) 102 + ffi (1.17.2-arm-linux-gnu) 103 + ffi (1.17.2-arm-linux-musl) 104 + ffi (1.17.2-arm64-darwin) 105 + ffi (1.17.2-x86-linux-gnu) 106 + ffi (1.17.2-x86-linux-musl) 107 + ffi (1.17.2-x86_64-darwin) 108 + ffi (1.17.2-x86_64-linux-gnu) 109 + ffi (1.17.2-x86_64-linux-musl) 110 + formatador (1.2.1) 111 + reline 112 + guard (2.19.1) 113 + formatador (>= 0.2.4) 114 + listen (>= 2.7, < 4.0) 115 + logger (~> 1.6) 116 + lumberjack (>= 1.0.12, < 2.0) 117 + nenv (~> 0.1) 118 + notiffany (~> 0.0) 119 + ostruct (~> 0.6) 120 + pry (>= 0.13.0) 121 + shellany (~> 0.0) 122 + thor (>= 0.18.1) 123 + guard-compat (1.2.1) 124 + guard-puma (0.9.2) 125 + guard (~> 2.14) 126 + guard-compat (~> 1.2) 127 + puma (>= 4.0, < 8) 128 + hanami (2.2.1) 129 + bundler (>= 1.16, < 3) 130 + dry-configurable (~> 1.0, >= 1.2.0, < 2) 131 + dry-core (~> 1.0, < 2) 132 + dry-inflector (~> 1.0, >= 1.1.0, < 2) 133 + dry-logger (~> 1.0, < 2) 134 + dry-monitor (~> 1.0, >= 1.0.1, < 2) 135 + dry-system (~> 1.1) 136 + hanami-cli (~> 2.2.1) 137 + hanami-utils (~> 2.2) 138 + json (>= 2.7.2) 139 + zeitwerk (~> 2.6) 140 + hanami-assets (2.2.0) 141 + zeitwerk (~> 2.6) 142 + hanami-cli (2.2.1) 143 + bundler (~> 2.1) 144 + dry-cli (~> 1.0, >= 1.1.0) 145 + dry-files (~> 1.0, >= 1.0.2, < 2) 146 + dry-inflector (~> 1.0, < 2) 147 + rake (~> 13.0) 148 + zeitwerk (~> 2.6) 149 + hanami-controller (2.2.0) 150 + dry-configurable (~> 1.0, < 2) 151 + dry-core (~> 1.0) 152 + hanami-utils (~> 2.2) 153 + rack (~> 2.0) 154 + zeitwerk (~> 2.6) 155 + hanami-db (2.2.1) 156 + rom (~> 5.4, >= 5.4.1) 157 + rom-sql (~> 3.7) 158 + zeitwerk (~> 2.6) 159 + hanami-reloader (2.2.0) 160 + guard (~> 2.19) 161 + guard-puma (~> 0.8) 162 + hanami-cli (~> 2.2) 163 + zeitwerk (~> 2.6) 164 + hanami-router (2.2.0) 165 + mustermann (~> 3.0) 166 + mustermann-contrib (~> 3.0) 167 + rack (~> 2.0) 168 + hanami-rspec (2.2.1) 169 + hanami-cli (~> 2.2) 170 + rake (~> 13.0) 171 + rspec (~> 3.12) 172 + zeitwerk (~> 2.6) 173 + hanami-utils (2.2.0) 174 + concurrent-ruby (~> 1.0) 175 + dry-core (~> 1.0, < 2) 176 + dry-transformer (~> 1.0, < 2) 177 + hanami-validations (2.2.0) 178 + dry-validation (>= 1.10, < 2) 179 + hanami-view (2.2.1) 180 + dry-configurable (~> 1.0) 181 + dry-core (~> 1.0) 182 + dry-inflector (~> 1.0, < 2) 183 + temple (~> 0.10.0, >= 0.10.2) 184 + tilt (~> 2.3) 185 + zeitwerk (~> 2.6) 186 + hanami-webconsole (2.2.0) 187 + better_errors (~> 2.10, >= 2.10.1) 188 + binding_of_caller (~> 1.0) 189 + hansi (0.2.1) 190 + ice_nine (0.11.2) 191 + io-console (0.8.1) 192 + json (2.15.1) 193 + listen (3.9.0) 194 + rb-fsevent (~> 0.10, >= 0.10.3) 195 + rb-inotify (~> 0.9, >= 0.9.10) 196 + logger (1.7.0) 197 + lumberjack (1.4.2) 198 + matrix (0.4.3) 199 + method_source (1.1.0) 200 + mini_mime (1.1.5) 201 + mini_portile2 (2.8.9) 202 + mustermann (3.0.4) 203 + ruby2_keywords (~> 0.0.1) 204 + mustermann-contrib (3.0.4) 205 + hansi (~> 0.2.0) 206 + mustermann (= 3.0.4) 207 + nenv (0.3.0) 208 + nio4r (2.7.4) 209 + nokogiri (1.18.10) 210 + mini_portile2 (~> 2.8.2) 211 + racc (~> 1.4) 212 + nokogiri (1.18.10-aarch64-linux-gnu) 213 + racc (~> 1.4) 214 + nokogiri (1.18.10-aarch64-linux-musl) 215 + racc (~> 1.4) 216 + nokogiri (1.18.10-arm-linux-gnu) 217 + racc (~> 1.4) 218 + nokogiri (1.18.10-arm-linux-musl) 219 + racc (~> 1.4) 220 + nokogiri (1.18.10-arm64-darwin) 221 + racc (~> 1.4) 222 + nokogiri (1.18.10-x86_64-darwin) 223 + racc (~> 1.4) 224 + nokogiri (1.18.10-x86_64-linux-gnu) 225 + racc (~> 1.4) 226 + nokogiri (1.18.10-x86_64-linux-musl) 227 + racc (~> 1.4) 228 + notiffany (0.1.3) 229 + nenv (~> 0.1) 230 + shellany (~> 0.0) 231 + ostruct (0.6.3) 232 + pg (1.6.2) 233 + pg (1.6.2-aarch64-linux) 234 + pg (1.6.2-aarch64-linux-musl) 235 + pg (1.6.2-arm64-darwin) 236 + pg (1.6.2-x86_64-darwin) 237 + pg (1.6.2-x86_64-linux) 238 + pg (1.6.2-x86_64-linux-musl) 239 + pry (0.15.2) 240 + coderay (~> 1.1) 241 + method_source (~> 1.0) 242 + public_suffix (6.0.2) 243 + puma (7.1.0) 244 + nio4r (~> 2.0) 245 + racc (1.8.1) 246 + rack (2.2.20) 247 + rack-test (2.2.0) 248 + rack (>= 1.3) 249 + rake (13.3.0) 250 + rb-fsevent (0.11.2) 251 + rb-inotify (0.11.1) 252 + ffi (~> 1.0) 253 + regexp_parser (2.11.3) 254 + reline (0.6.2) 255 + io-console (~> 0.5) 256 + rom (5.4.2) 257 + rom-changeset (~> 5.4) 258 + rom-core (~> 5.4) 259 + rom-repository (~> 5.4, >= 5.4.2) 260 + rom-changeset (5.4.0) 261 + dry-core (~> 1.0) 262 + rom-core (~> 5.4) 263 + transproc (~> 1.1) 264 + rom-core (5.4.0) 265 + concurrent-ruby (~> 1.1) 266 + dry-configurable (~> 1.0) 267 + dry-core (~> 1.0) 268 + dry-inflector (~> 1.0) 269 + dry-initializer (~> 3.2) 270 + dry-struct (~> 1.0) 271 + dry-types (~> 1.6) 272 + transproc (~> 1.1) 273 + rom-repository (5.4.2) 274 + dry-core (~> 1.0) 275 + dry-initializer (~> 3.2) 276 + rom-core (~> 5.4) 277 + rom-sql (3.7.0) 278 + dry-core (~> 1.1) 279 + dry-types (~> 1.8) 280 + rom (~> 5.4) 281 + sequel (>= 4.49) 282 + rouge (4.6.1) 283 + rspec (3.13.1) 284 + rspec-core (~> 3.13.0) 285 + rspec-expectations (~> 3.13.0) 286 + rspec-mocks (~> 3.13.0) 287 + rspec-core (3.13.6) 288 + rspec-support (~> 3.13.0) 289 + rspec-expectations (3.13.5) 290 + diff-lcs (>= 1.2.0, < 2.0) 291 + rspec-support (~> 3.13.0) 292 + rspec-mocks (3.13.6) 293 + diff-lcs (>= 1.2.0, < 2.0) 294 + rspec-support (~> 3.13.0) 295 + rspec-support (3.13.6) 296 + ruby2_keywords (0.0.5) 297 + sequel (5.97.0) 298 + bigdecimal 299 + shellany (0.0.1) 300 + temple (0.10.4) 301 + thor (1.4.0) 302 + tilt (2.6.1) 303 + transproc (1.1.1) 304 + xpath (3.2.0) 305 + nokogiri (~> 1.8) 306 + zeitwerk (2.7.3) 307 + 308 + PLATFORMS 309 + aarch64-linux 310 + aarch64-linux-gnu 311 + aarch64-linux-musl 312 + arm-linux-gnu 313 + arm-linux-musl 314 + arm64-darwin 315 + ruby 316 + x86-linux-gnu 317 + x86-linux-musl 318 + x86_64-darwin 319 + x86_64-linux 320 + x86_64-linux-gnu 321 + x86_64-linux-musl 322 + 323 + DEPENDENCIES 324 + capybara 325 + database_cleaner-sequel 326 + dotenv 327 + dry-operation 328 + dry-types (~> 1.7) 329 + hanami (~> 2.2) 330 + hanami-assets (~> 2.2) 331 + hanami-controller (~> 2.2) 332 + hanami-db (~> 2.2) 333 + hanami-reloader (~> 2.2) 334 + hanami-router (~> 2.2) 335 + hanami-rspec (~> 2.2) 336 + hanami-validations (~> 2.2) 337 + hanami-view (~> 2.2) 338 + hanami-webconsole (~> 2.2) 339 + pg 340 + puma 341 + rack-test 342 + rake 343 + 344 + BUNDLED WITH 345 + 2.7.2
+9
Guardfile
··· 1 + # frozen_string_literal: true 2 + 3 + group :server do 4 + guard "puma", port: ENV.fetch("HANAMI_PORT", 2300) do 5 + # Edit the following regular expression for your needs. 6 + # See: https://guides.hanamirb.org/app/code-reloading/ 7 + watch(%r{^(app|config|lib|slices)([\/][^\/]+)*.(rb|erb|haml|slim)$}i) 8 + end 9 + end
+2
Procfile.dev
··· 1 + web: bundle exec hanami server 2 + assets: bundle exec hanami assets watch
+1
README.md
··· 1 + # Sparkles
+3
Rakefile
··· 1 + # frozen_string_literal: true 2 + 3 + require "hanami/rake_tasks"
+12
app/action.rb
··· 1 + # auto_register: false 2 + # frozen_string_literal: true 3 + 4 + require "hanami/action" 5 + require "dry/monads" 6 + 7 + module Sparkles 8 + class Action < Hanami::Action 9 + # Provide `Success` and `Failure` for pattern matching on operation results 10 + include Dry::Monads[:result] 11 + end 12 + end
app/actions/.keep

This is a binary file and will not be displayed.

+5
app/assets/css/app.css
··· 1 + body { 2 + background-color: #fff; 3 + color: #000; 4 + font-family: sans-serif; 5 + }
app/assets/images/favicon.ico

This is a binary file and will not be displayed.

+1
app/assets/js/app.js
··· 1 + import "../css/app.css";
+10
app/db/relation.rb
··· 1 + # frozen_string_literal: true 2 + 3 + require "hanami/db/relation" 4 + 5 + module Sparkles 6 + module DB 7 + class Relation < Hanami::DB::Relation 8 + end 9 + end 10 + end
+10
app/db/repo.rb
··· 1 + # frozen_string_literal: true 2 + 3 + require "hanami/db/repo" 4 + 5 + module Sparkles 6 + module DB 7 + class Repo < Hanami::DB::Repo 8 + end 9 + end 10 + end
+10
app/db/struct.rb
··· 1 + # frozen_string_literal: true 2 + 3 + require "hanami/db/struct" 4 + 5 + module Sparkles 6 + module DB 7 + class Struct < Hanami::DB::Struct 8 + end 9 + end 10 + end
+9
app/operation.rb
··· 1 + # auto_register: false 2 + # frozen_string_literal: true 3 + 4 + require "dry/operation" 5 + 6 + module Sparkles 7 + class Operation < Dry::Operation 8 + end 9 + end
app/relations/.keep

This is a binary file and will not be displayed.

app/repos/.keep

This is a binary file and will not be displayed.

app/structs/.keep

This is a binary file and will not be displayed.

+14
app/templates/layouts/app.html.erb
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 + <title>Sparkles</title> 7 + <%= favicon_tag %> 8 + <%= stylesheet_tag "app" %> 9 + </head> 10 + <body> 11 + <%= yield %> 12 + <%= javascript_tag "app" %> 13 + </body> 14 + </html>
+9
app/view.rb
··· 1 + # auto_register: false 2 + # frozen_string_literal: true 3 + 4 + require "hanami/view" 5 + 6 + module Sparkles 7 + class View < Hanami::View 8 + end 9 + end
+10
app/views/helpers.rb
··· 1 + # auto_register: false 2 + # frozen_string_literal: true 3 + 4 + module Sparkles 5 + module Views 6 + module Helpers 7 + # Add your view helpers here 8 + end 9 + end 10 + end
+5
config.ru
··· 1 + # frozen_string_literal: true 2 + 3 + require "hanami/boot" 4 + 5 + run Hanami.app
+8
config/app.rb
··· 1 + # frozen_string_literal: true 2 + 3 + require "hanami" 4 + 5 + module Sparkles 6 + class App < Hanami::App 7 + end 8 + end
+16
config/assets.js
··· 1 + import * as assets from "hanami-assets"; 2 + 3 + await assets.run(); 4 + 5 + // To provide additional esbuild (https://esbuild.github.io) options, use the following: 6 + // 7 + // Read more at: https://guides.hanamirb.org/assets/customization/ 8 + // 9 + // await assets.run({ 10 + // esbuildOptionsFn: (args, esbuildOptions) => { 11 + // // Add to esbuildOptions here. Use `args.watch` as a condition for different options for 12 + // // compile vs watch. 13 + // 14 + // return esbuildOptions; 15 + // } 16 + // });
config/db/migrate/.keep

This is a binary file and will not be displayed.

+15
config/db/seeds.rb
··· 1 + # This seeds file should create the database records required to run the app. 2 + # 3 + # The code should be idempotent so that it can be executed at any time. 4 + # 5 + # To load the seeds, run `hanami db seed`. Seeds are also loaded as part of `hanami db prepare`. 6 + 7 + # For example, if you have appropriate repos available: 8 + # 9 + # category_repo = Hanami.app["repos.category_repo"] 10 + # category_repo.create(title: "General") 11 + # 12 + # Alternatively, you can use relations directly: 13 + # 14 + # categories = Hanami.app["relations.categories"] 15 + # categories.insert(title: "General")
+47
config/puma.rb
··· 1 + # frozen_string_literal: true 2 + 3 + # 4 + # Environment and port 5 + # 6 + port ENV.fetch("HANAMI_PORT", 2300) 7 + environment ENV.fetch("HANAMI_ENV", "development") 8 + 9 + # 10 + # Threads within each Puma/Ruby process (aka worker) 11 + # 12 + 13 + # Configure the minimum and maximum number of threads to use to answer requests. 14 + max_threads_count = ENV.fetch("HANAMI_MAX_THREADS", 5) 15 + min_threads_count = ENV.fetch("HANAMI_MIN_THREADS") { max_threads_count } 16 + 17 + threads min_threads_count, max_threads_count 18 + 19 + # 20 + # Workers (aka Puma/Ruby processes) 21 + # 22 + 23 + puma_concurrency = Integer(ENV.fetch("HANAMI_WEB_CONCURRENCY", 0)) 24 + puma_cluster_mode = puma_concurrency > 1 25 + 26 + # How many worker (Puma/Ruby) processes to run. 27 + # Typically this is set to the number of available cores. 28 + workers puma_concurrency 29 + 30 + # 31 + # Cluster mode (aka multiple workers) 32 + # 33 + 34 + if puma_cluster_mode 35 + # Preload the application before starting the workers. Only in cluster mode. 36 + preload_app! 37 + 38 + # Code to run immediately before master process forks workers (once on boot). 39 + # 40 + # These hooks can block if necessary to wait for background operations unknown 41 + # to puma to finish before the process terminates. This can be used to close 42 + # any connections to remote servers (database, redis, …) that were opened when 43 + # preloading the code. 44 + before_fork do 45 + Hanami.shutdown 46 + end 47 + end
+7
config/routes.rb
··· 1 + # frozen_string_literal: true 2 + 3 + module Sparkles 4 + class Routes < Hanami::Routes 5 + # Add your routes here. See https://guides.hanamirb.org/routing/overview/ for details. 6 + end 7 + end
+9
config/settings.rb
··· 1 + # frozen_string_literal: true 2 + 3 + module Sparkles 4 + class Settings < Hanami::Settings 5 + # Define your app settings here, for example: 6 + # 7 + # setting :my_flag, default: false, constructor: Types::Params::Bool 8 + end 9 + end
+11
lib/sparkles/types.rb
··· 1 + # frozen_string_literal: true 2 + 3 + require "dry/types" 4 + 5 + module Sparkles 6 + Types = Dry.Types 7 + 8 + module Types 9 + # Define your custom types here 10 + end 11 + end
lib/tasks/.keep

This is a binary file and will not be displayed.

+999
package-lock.json
··· 1 + { 2 + "name": "sparkles", 3 + "lockfileVersion": 3, 4 + "requires": true, 5 + "packages": { 6 + "": { 7 + "name": "sparkles", 8 + "dependencies": { 9 + "hanami-assets": "^2.2.1" 10 + } 11 + }, 12 + "node_modules/@esbuild/aix-ppc64": { 13 + "version": "0.25.11", 14 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", 15 + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", 16 + "cpu": [ 17 + "ppc64" 18 + ], 19 + "license": "MIT", 20 + "optional": true, 21 + "os": [ 22 + "aix" 23 + ], 24 + "engines": { 25 + "node": ">=18" 26 + } 27 + }, 28 + "node_modules/@esbuild/android-arm": { 29 + "version": "0.25.11", 30 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", 31 + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", 32 + "cpu": [ 33 + "arm" 34 + ], 35 + "license": "MIT", 36 + "optional": true, 37 + "os": [ 38 + "android" 39 + ], 40 + "engines": { 41 + "node": ">=18" 42 + } 43 + }, 44 + "node_modules/@esbuild/android-arm64": { 45 + "version": "0.25.11", 46 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", 47 + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", 48 + "cpu": [ 49 + "arm64" 50 + ], 51 + "license": "MIT", 52 + "optional": true, 53 + "os": [ 54 + "android" 55 + ], 56 + "engines": { 57 + "node": ">=18" 58 + } 59 + }, 60 + "node_modules/@esbuild/android-x64": { 61 + "version": "0.25.11", 62 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", 63 + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", 64 + "cpu": [ 65 + "x64" 66 + ], 67 + "license": "MIT", 68 + "optional": true, 69 + "os": [ 70 + "android" 71 + ], 72 + "engines": { 73 + "node": ">=18" 74 + } 75 + }, 76 + "node_modules/@esbuild/darwin-arm64": { 77 + "version": "0.25.11", 78 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", 79 + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", 80 + "cpu": [ 81 + "arm64" 82 + ], 83 + "license": "MIT", 84 + "optional": true, 85 + "os": [ 86 + "darwin" 87 + ], 88 + "engines": { 89 + "node": ">=18" 90 + } 91 + }, 92 + "node_modules/@esbuild/darwin-x64": { 93 + "version": "0.25.11", 94 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", 95 + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", 96 + "cpu": [ 97 + "x64" 98 + ], 99 + "license": "MIT", 100 + "optional": true, 101 + "os": [ 102 + "darwin" 103 + ], 104 + "engines": { 105 + "node": ">=18" 106 + } 107 + }, 108 + "node_modules/@esbuild/freebsd-arm64": { 109 + "version": "0.25.11", 110 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", 111 + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", 112 + "cpu": [ 113 + "arm64" 114 + ], 115 + "license": "MIT", 116 + "optional": true, 117 + "os": [ 118 + "freebsd" 119 + ], 120 + "engines": { 121 + "node": ">=18" 122 + } 123 + }, 124 + "node_modules/@esbuild/freebsd-x64": { 125 + "version": "0.25.11", 126 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", 127 + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", 128 + "cpu": [ 129 + "x64" 130 + ], 131 + "license": "MIT", 132 + "optional": true, 133 + "os": [ 134 + "freebsd" 135 + ], 136 + "engines": { 137 + "node": ">=18" 138 + } 139 + }, 140 + "node_modules/@esbuild/linux-arm": { 141 + "version": "0.25.11", 142 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", 143 + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", 144 + "cpu": [ 145 + "arm" 146 + ], 147 + "license": "MIT", 148 + "optional": true, 149 + "os": [ 150 + "linux" 151 + ], 152 + "engines": { 153 + "node": ">=18" 154 + } 155 + }, 156 + "node_modules/@esbuild/linux-arm64": { 157 + "version": "0.25.11", 158 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", 159 + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", 160 + "cpu": [ 161 + "arm64" 162 + ], 163 + "license": "MIT", 164 + "optional": true, 165 + "os": [ 166 + "linux" 167 + ], 168 + "engines": { 169 + "node": ">=18" 170 + } 171 + }, 172 + "node_modules/@esbuild/linux-ia32": { 173 + "version": "0.25.11", 174 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", 175 + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", 176 + "cpu": [ 177 + "ia32" 178 + ], 179 + "license": "MIT", 180 + "optional": true, 181 + "os": [ 182 + "linux" 183 + ], 184 + "engines": { 185 + "node": ">=18" 186 + } 187 + }, 188 + "node_modules/@esbuild/linux-loong64": { 189 + "version": "0.25.11", 190 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", 191 + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", 192 + "cpu": [ 193 + "loong64" 194 + ], 195 + "license": "MIT", 196 + "optional": true, 197 + "os": [ 198 + "linux" 199 + ], 200 + "engines": { 201 + "node": ">=18" 202 + } 203 + }, 204 + "node_modules/@esbuild/linux-mips64el": { 205 + "version": "0.25.11", 206 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", 207 + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", 208 + "cpu": [ 209 + "mips64el" 210 + ], 211 + "license": "MIT", 212 + "optional": true, 213 + "os": [ 214 + "linux" 215 + ], 216 + "engines": { 217 + "node": ">=18" 218 + } 219 + }, 220 + "node_modules/@esbuild/linux-ppc64": { 221 + "version": "0.25.11", 222 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", 223 + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", 224 + "cpu": [ 225 + "ppc64" 226 + ], 227 + "license": "MIT", 228 + "optional": true, 229 + "os": [ 230 + "linux" 231 + ], 232 + "engines": { 233 + "node": ">=18" 234 + } 235 + }, 236 + "node_modules/@esbuild/linux-riscv64": { 237 + "version": "0.25.11", 238 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", 239 + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", 240 + "cpu": [ 241 + "riscv64" 242 + ], 243 + "license": "MIT", 244 + "optional": true, 245 + "os": [ 246 + "linux" 247 + ], 248 + "engines": { 249 + "node": ">=18" 250 + } 251 + }, 252 + "node_modules/@esbuild/linux-s390x": { 253 + "version": "0.25.11", 254 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", 255 + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", 256 + "cpu": [ 257 + "s390x" 258 + ], 259 + "license": "MIT", 260 + "optional": true, 261 + "os": [ 262 + "linux" 263 + ], 264 + "engines": { 265 + "node": ">=18" 266 + } 267 + }, 268 + "node_modules/@esbuild/linux-x64": { 269 + "version": "0.25.11", 270 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", 271 + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", 272 + "cpu": [ 273 + "x64" 274 + ], 275 + "license": "MIT", 276 + "optional": true, 277 + "os": [ 278 + "linux" 279 + ], 280 + "engines": { 281 + "node": ">=18" 282 + } 283 + }, 284 + "node_modules/@esbuild/netbsd-arm64": { 285 + "version": "0.25.11", 286 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", 287 + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", 288 + "cpu": [ 289 + "arm64" 290 + ], 291 + "license": "MIT", 292 + "optional": true, 293 + "os": [ 294 + "netbsd" 295 + ], 296 + "engines": { 297 + "node": ">=18" 298 + } 299 + }, 300 + "node_modules/@esbuild/netbsd-x64": { 301 + "version": "0.25.11", 302 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", 303 + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", 304 + "cpu": [ 305 + "x64" 306 + ], 307 + "license": "MIT", 308 + "optional": true, 309 + "os": [ 310 + "netbsd" 311 + ], 312 + "engines": { 313 + "node": ">=18" 314 + } 315 + }, 316 + "node_modules/@esbuild/openbsd-arm64": { 317 + "version": "0.25.11", 318 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", 319 + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", 320 + "cpu": [ 321 + "arm64" 322 + ], 323 + "license": "MIT", 324 + "optional": true, 325 + "os": [ 326 + "openbsd" 327 + ], 328 + "engines": { 329 + "node": ">=18" 330 + } 331 + }, 332 + "node_modules/@esbuild/openbsd-x64": { 333 + "version": "0.25.11", 334 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", 335 + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", 336 + "cpu": [ 337 + "x64" 338 + ], 339 + "license": "MIT", 340 + "optional": true, 341 + "os": [ 342 + "openbsd" 343 + ], 344 + "engines": { 345 + "node": ">=18" 346 + } 347 + }, 348 + "node_modules/@esbuild/openharmony-arm64": { 349 + "version": "0.25.11", 350 + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", 351 + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", 352 + "cpu": [ 353 + "arm64" 354 + ], 355 + "license": "MIT", 356 + "optional": true, 357 + "os": [ 358 + "openharmony" 359 + ], 360 + "engines": { 361 + "node": ">=18" 362 + } 363 + }, 364 + "node_modules/@esbuild/sunos-x64": { 365 + "version": "0.25.11", 366 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", 367 + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", 368 + "cpu": [ 369 + "x64" 370 + ], 371 + "license": "MIT", 372 + "optional": true, 373 + "os": [ 374 + "sunos" 375 + ], 376 + "engines": { 377 + "node": ">=18" 378 + } 379 + }, 380 + "node_modules/@esbuild/win32-arm64": { 381 + "version": "0.25.11", 382 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", 383 + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", 384 + "cpu": [ 385 + "arm64" 386 + ], 387 + "license": "MIT", 388 + "optional": true, 389 + "os": [ 390 + "win32" 391 + ], 392 + "engines": { 393 + "node": ">=18" 394 + } 395 + }, 396 + "node_modules/@esbuild/win32-ia32": { 397 + "version": "0.25.11", 398 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", 399 + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", 400 + "cpu": [ 401 + "ia32" 402 + ], 403 + "license": "MIT", 404 + "optional": true, 405 + "os": [ 406 + "win32" 407 + ], 408 + "engines": { 409 + "node": ">=18" 410 + } 411 + }, 412 + "node_modules/@esbuild/win32-x64": { 413 + "version": "0.25.11", 414 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", 415 + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", 416 + "cpu": [ 417 + "x64" 418 + ], 419 + "license": "MIT", 420 + "optional": true, 421 + "os": [ 422 + "win32" 423 + ], 424 + "engines": { 425 + "node": ">=18" 426 + } 427 + }, 428 + "node_modules/@isaacs/balanced-match": { 429 + "version": "4.0.1", 430 + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", 431 + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", 432 + "license": "MIT", 433 + "engines": { 434 + "node": "20 || >=22" 435 + } 436 + }, 437 + "node_modules/@isaacs/brace-expansion": { 438 + "version": "5.0.0", 439 + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", 440 + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", 441 + "license": "MIT", 442 + "dependencies": { 443 + "@isaacs/balanced-match": "^4.0.1" 444 + }, 445 + "engines": { 446 + "node": "20 || >=22" 447 + } 448 + }, 449 + "node_modules/@isaacs/cliui": { 450 + "version": "8.0.2", 451 + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 452 + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 453 + "license": "ISC", 454 + "dependencies": { 455 + "string-width": "^5.1.2", 456 + "string-width-cjs": "npm:string-width@^4.2.0", 457 + "strip-ansi": "^7.0.1", 458 + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 459 + "wrap-ansi": "^8.1.0", 460 + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 461 + }, 462 + "engines": { 463 + "node": ">=12" 464 + } 465 + }, 466 + "node_modules/ansi-regex": { 467 + "version": "6.2.2", 468 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", 469 + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", 470 + "license": "MIT", 471 + "engines": { 472 + "node": ">=12" 473 + }, 474 + "funding": { 475 + "url": "https://github.com/chalk/ansi-regex?sponsor=1" 476 + } 477 + }, 478 + "node_modules/ansi-styles": { 479 + "version": "6.2.3", 480 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", 481 + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", 482 + "license": "MIT", 483 + "engines": { 484 + "node": ">=12" 485 + }, 486 + "funding": { 487 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 488 + } 489 + }, 490 + "node_modules/color-convert": { 491 + "version": "2.0.1", 492 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 493 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 494 + "license": "MIT", 495 + "dependencies": { 496 + "color-name": "~1.1.4" 497 + }, 498 + "engines": { 499 + "node": ">=7.0.0" 500 + } 501 + }, 502 + "node_modules/color-name": { 503 + "version": "1.1.4", 504 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 505 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 506 + "license": "MIT" 507 + }, 508 + "node_modules/cross-spawn": { 509 + "version": "7.0.6", 510 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 511 + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 512 + "license": "MIT", 513 + "dependencies": { 514 + "path-key": "^3.1.0", 515 + "shebang-command": "^2.0.0", 516 + "which": "^2.0.1" 517 + }, 518 + "engines": { 519 + "node": ">= 8" 520 + } 521 + }, 522 + "node_modules/eastasianwidth": { 523 + "version": "0.2.0", 524 + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 525 + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 526 + "license": "MIT" 527 + }, 528 + "node_modules/emoji-regex": { 529 + "version": "9.2.2", 530 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 531 + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 532 + "license": "MIT" 533 + }, 534 + "node_modules/esbuild": { 535 + "version": "0.25.11", 536 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", 537 + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", 538 + "hasInstallScript": true, 539 + "license": "MIT", 540 + "bin": { 541 + "esbuild": "bin/esbuild" 542 + }, 543 + "engines": { 544 + "node": ">=18" 545 + }, 546 + "optionalDependencies": { 547 + "@esbuild/aix-ppc64": "0.25.11", 548 + "@esbuild/android-arm": "0.25.11", 549 + "@esbuild/android-arm64": "0.25.11", 550 + "@esbuild/android-x64": "0.25.11", 551 + "@esbuild/darwin-arm64": "0.25.11", 552 + "@esbuild/darwin-x64": "0.25.11", 553 + "@esbuild/freebsd-arm64": "0.25.11", 554 + "@esbuild/freebsd-x64": "0.25.11", 555 + "@esbuild/linux-arm": "0.25.11", 556 + "@esbuild/linux-arm64": "0.25.11", 557 + "@esbuild/linux-ia32": "0.25.11", 558 + "@esbuild/linux-loong64": "0.25.11", 559 + "@esbuild/linux-mips64el": "0.25.11", 560 + "@esbuild/linux-ppc64": "0.25.11", 561 + "@esbuild/linux-riscv64": "0.25.11", 562 + "@esbuild/linux-s390x": "0.25.11", 563 + "@esbuild/linux-x64": "0.25.11", 564 + "@esbuild/netbsd-arm64": "0.25.11", 565 + "@esbuild/netbsd-x64": "0.25.11", 566 + "@esbuild/openbsd-arm64": "0.25.11", 567 + "@esbuild/openbsd-x64": "0.25.11", 568 + "@esbuild/openharmony-arm64": "0.25.11", 569 + "@esbuild/sunos-x64": "0.25.11", 570 + "@esbuild/win32-arm64": "0.25.11", 571 + "@esbuild/win32-ia32": "0.25.11", 572 + "@esbuild/win32-x64": "0.25.11" 573 + } 574 + }, 575 + "node_modules/foreground-child": { 576 + "version": "3.3.1", 577 + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", 578 + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", 579 + "license": "ISC", 580 + "dependencies": { 581 + "cross-spawn": "^7.0.6", 582 + "signal-exit": "^4.0.1" 583 + }, 584 + "engines": { 585 + "node": ">=14" 586 + }, 587 + "funding": { 588 + "url": "https://github.com/sponsors/isaacs" 589 + } 590 + }, 591 + "node_modules/fs-extra": { 592 + "version": "11.3.2", 593 + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", 594 + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", 595 + "license": "MIT", 596 + "dependencies": { 597 + "graceful-fs": "^4.2.0", 598 + "jsonfile": "^6.0.1", 599 + "universalify": "^2.0.0" 600 + }, 601 + "engines": { 602 + "node": ">=14.14" 603 + } 604 + }, 605 + "node_modules/glob": { 606 + "version": "11.0.3", 607 + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", 608 + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", 609 + "license": "ISC", 610 + "dependencies": { 611 + "foreground-child": "^3.3.1", 612 + "jackspeak": "^4.1.1", 613 + "minimatch": "^10.0.3", 614 + "minipass": "^7.1.2", 615 + "package-json-from-dist": "^1.0.0", 616 + "path-scurry": "^2.0.0" 617 + }, 618 + "bin": { 619 + "glob": "dist/esm/bin.mjs" 620 + }, 621 + "engines": { 622 + "node": "20 || >=22" 623 + }, 624 + "funding": { 625 + "url": "https://github.com/sponsors/isaacs" 626 + } 627 + }, 628 + "node_modules/graceful-fs": { 629 + "version": "4.2.11", 630 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 631 + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 632 + "license": "ISC" 633 + }, 634 + "node_modules/hanami-assets": { 635 + "version": "2.2.2", 636 + "resolved": "https://registry.npmjs.org/hanami-assets/-/hanami-assets-2.2.2.tgz", 637 + "integrity": "sha512-Dce4sHaWDkWHKM94nQplF2/1/w/xwbQlmuqQat96df5rL3GlweGBmhHgjjQR81jaoOrl57EmOsU2sAFcawF63A==", 638 + "license": "MIT", 639 + "dependencies": { 640 + "esbuild": "^0.25.1", 641 + "fs-extra": "^11.3.0", 642 + "glob": "^11.0.1" 643 + }, 644 + "funding": { 645 + "url": "https://github.com/sponsors/hanami" 646 + } 647 + }, 648 + "node_modules/is-fullwidth-code-point": { 649 + "version": "3.0.0", 650 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 651 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 652 + "license": "MIT", 653 + "engines": { 654 + "node": ">=8" 655 + } 656 + }, 657 + "node_modules/isexe": { 658 + "version": "2.0.0", 659 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 660 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 661 + "license": "ISC" 662 + }, 663 + "node_modules/jackspeak": { 664 + "version": "4.1.1", 665 + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", 666 + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", 667 + "license": "BlueOak-1.0.0", 668 + "dependencies": { 669 + "@isaacs/cliui": "^8.0.2" 670 + }, 671 + "engines": { 672 + "node": "20 || >=22" 673 + }, 674 + "funding": { 675 + "url": "https://github.com/sponsors/isaacs" 676 + } 677 + }, 678 + "node_modules/jsonfile": { 679 + "version": "6.2.0", 680 + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", 681 + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", 682 + "license": "MIT", 683 + "dependencies": { 684 + "universalify": "^2.0.0" 685 + }, 686 + "optionalDependencies": { 687 + "graceful-fs": "^4.1.6" 688 + } 689 + }, 690 + "node_modules/lru-cache": { 691 + "version": "11.2.2", 692 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", 693 + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", 694 + "license": "ISC", 695 + "engines": { 696 + "node": "20 || >=22" 697 + } 698 + }, 699 + "node_modules/minimatch": { 700 + "version": "10.0.3", 701 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", 702 + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", 703 + "license": "ISC", 704 + "dependencies": { 705 + "@isaacs/brace-expansion": "^5.0.0" 706 + }, 707 + "engines": { 708 + "node": "20 || >=22" 709 + }, 710 + "funding": { 711 + "url": "https://github.com/sponsors/isaacs" 712 + } 713 + }, 714 + "node_modules/minipass": { 715 + "version": "7.1.2", 716 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 717 + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 718 + "license": "ISC", 719 + "engines": { 720 + "node": ">=16 || 14 >=14.17" 721 + } 722 + }, 723 + "node_modules/package-json-from-dist": { 724 + "version": "1.0.1", 725 + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 726 + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 727 + "license": "BlueOak-1.0.0" 728 + }, 729 + "node_modules/path-key": { 730 + "version": "3.1.1", 731 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 732 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 733 + "license": "MIT", 734 + "engines": { 735 + "node": ">=8" 736 + } 737 + }, 738 + "node_modules/path-scurry": { 739 + "version": "2.0.0", 740 + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", 741 + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", 742 + "license": "BlueOak-1.0.0", 743 + "dependencies": { 744 + "lru-cache": "^11.0.0", 745 + "minipass": "^7.1.2" 746 + }, 747 + "engines": { 748 + "node": "20 || >=22" 749 + }, 750 + "funding": { 751 + "url": "https://github.com/sponsors/isaacs" 752 + } 753 + }, 754 + "node_modules/shebang-command": { 755 + "version": "2.0.0", 756 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 757 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 758 + "license": "MIT", 759 + "dependencies": { 760 + "shebang-regex": "^3.0.0" 761 + }, 762 + "engines": { 763 + "node": ">=8" 764 + } 765 + }, 766 + "node_modules/shebang-regex": { 767 + "version": "3.0.0", 768 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 769 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 770 + "license": "MIT", 771 + "engines": { 772 + "node": ">=8" 773 + } 774 + }, 775 + "node_modules/signal-exit": { 776 + "version": "4.1.0", 777 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 778 + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 779 + "license": "ISC", 780 + "engines": { 781 + "node": ">=14" 782 + }, 783 + "funding": { 784 + "url": "https://github.com/sponsors/isaacs" 785 + } 786 + }, 787 + "node_modules/string-width": { 788 + "version": "5.1.2", 789 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 790 + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 791 + "license": "MIT", 792 + "dependencies": { 793 + "eastasianwidth": "^0.2.0", 794 + "emoji-regex": "^9.2.2", 795 + "strip-ansi": "^7.0.1" 796 + }, 797 + "engines": { 798 + "node": ">=12" 799 + }, 800 + "funding": { 801 + "url": "https://github.com/sponsors/sindresorhus" 802 + } 803 + }, 804 + "node_modules/string-width-cjs": { 805 + "name": "string-width", 806 + "version": "4.2.3", 807 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 808 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 809 + "license": "MIT", 810 + "dependencies": { 811 + "emoji-regex": "^8.0.0", 812 + "is-fullwidth-code-point": "^3.0.0", 813 + "strip-ansi": "^6.0.1" 814 + }, 815 + "engines": { 816 + "node": ">=8" 817 + } 818 + }, 819 + "node_modules/string-width-cjs/node_modules/ansi-regex": { 820 + "version": "5.0.1", 821 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 822 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 823 + "license": "MIT", 824 + "engines": { 825 + "node": ">=8" 826 + } 827 + }, 828 + "node_modules/string-width-cjs/node_modules/emoji-regex": { 829 + "version": "8.0.0", 830 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 831 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 832 + "license": "MIT" 833 + }, 834 + "node_modules/string-width-cjs/node_modules/strip-ansi": { 835 + "version": "6.0.1", 836 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 837 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 838 + "license": "MIT", 839 + "dependencies": { 840 + "ansi-regex": "^5.0.1" 841 + }, 842 + "engines": { 843 + "node": ">=8" 844 + } 845 + }, 846 + "node_modules/strip-ansi": { 847 + "version": "7.1.2", 848 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", 849 + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", 850 + "license": "MIT", 851 + "dependencies": { 852 + "ansi-regex": "^6.0.1" 853 + }, 854 + "engines": { 855 + "node": ">=12" 856 + }, 857 + "funding": { 858 + "url": "https://github.com/chalk/strip-ansi?sponsor=1" 859 + } 860 + }, 861 + "node_modules/strip-ansi-cjs": { 862 + "name": "strip-ansi", 863 + "version": "6.0.1", 864 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 865 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 866 + "license": "MIT", 867 + "dependencies": { 868 + "ansi-regex": "^5.0.1" 869 + }, 870 + "engines": { 871 + "node": ">=8" 872 + } 873 + }, 874 + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 875 + "version": "5.0.1", 876 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 877 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 878 + "license": "MIT", 879 + "engines": { 880 + "node": ">=8" 881 + } 882 + }, 883 + "node_modules/universalify": { 884 + "version": "2.0.1", 885 + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 886 + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 887 + "license": "MIT", 888 + "engines": { 889 + "node": ">= 10.0.0" 890 + } 891 + }, 892 + "node_modules/which": { 893 + "version": "2.0.2", 894 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 895 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 896 + "license": "ISC", 897 + "dependencies": { 898 + "isexe": "^2.0.0" 899 + }, 900 + "bin": { 901 + "node-which": "bin/node-which" 902 + }, 903 + "engines": { 904 + "node": ">= 8" 905 + } 906 + }, 907 + "node_modules/wrap-ansi": { 908 + "version": "8.1.0", 909 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 910 + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 911 + "license": "MIT", 912 + "dependencies": { 913 + "ansi-styles": "^6.1.0", 914 + "string-width": "^5.0.1", 915 + "strip-ansi": "^7.0.1" 916 + }, 917 + "engines": { 918 + "node": ">=12" 919 + }, 920 + "funding": { 921 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 922 + } 923 + }, 924 + "node_modules/wrap-ansi-cjs": { 925 + "name": "wrap-ansi", 926 + "version": "7.0.0", 927 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 928 + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 929 + "license": "MIT", 930 + "dependencies": { 931 + "ansi-styles": "^4.0.0", 932 + "string-width": "^4.1.0", 933 + "strip-ansi": "^6.0.0" 934 + }, 935 + "engines": { 936 + "node": ">=10" 937 + }, 938 + "funding": { 939 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 940 + } 941 + }, 942 + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 943 + "version": "5.0.1", 944 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 945 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 946 + "license": "MIT", 947 + "engines": { 948 + "node": ">=8" 949 + } 950 + }, 951 + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 952 + "version": "4.3.0", 953 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 954 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 955 + "license": "MIT", 956 + "dependencies": { 957 + "color-convert": "^2.0.1" 958 + }, 959 + "engines": { 960 + "node": ">=8" 961 + }, 962 + "funding": { 963 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 964 + } 965 + }, 966 + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 967 + "version": "8.0.0", 968 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 969 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 970 + "license": "MIT" 971 + }, 972 + "node_modules/wrap-ansi-cjs/node_modules/string-width": { 973 + "version": "4.2.3", 974 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 975 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 976 + "license": "MIT", 977 + "dependencies": { 978 + "emoji-regex": "^8.0.0", 979 + "is-fullwidth-code-point": "^3.0.0", 980 + "strip-ansi": "^6.0.1" 981 + }, 982 + "engines": { 983 + "node": ">=8" 984 + } 985 + }, 986 + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 987 + "version": "6.0.1", 988 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 989 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 990 + "license": "MIT", 991 + "dependencies": { 992 + "ansi-regex": "^5.0.1" 993 + }, 994 + "engines": { 995 + "node": ">=8" 996 + } 997 + } 998 + } 999 + }
+8
package.json
··· 1 + { 2 + "name": "sparkles", 3 + "private": true, 4 + "type": "module", 5 + "dependencies": { 6 + "hanami-assets": "^2.2.1" 7 + } 8 + }
+11
spec/requests/root_spec.rb
··· 1 + # frozen_string_literal: true 2 + 3 + RSpec.describe "Root", type: :request do 4 + it "is not found" do 5 + get "/" 6 + 7 + # Generate new action via: 8 + # `bundle exec hanami generate action home.index --url=/` 9 + expect(last_response.status).to be(404) 10 + end 11 + end
+9
spec/spec_helper.rb
··· 1 + # frozen_string_literal: true 2 + 3 + require "pathname" 4 + SPEC_ROOT = Pathname(__dir__).realpath.freeze 5 + 6 + ENV["HANAMI_ENV"] ||= "test" 7 + require "hanami/prepare" 8 + 9 + SPEC_ROOT.glob("support/**/*.rb").each { |f| require f }
+10
spec/support/db.rb
··· 1 + # frozen_string_literal: true 2 + 3 + # Tag feature spec examples as `:db` 4 + # 5 + # See support/db/cleaning.rb for how the database is cleaned around these `:db` examples. 6 + RSpec.configure do |config| 7 + config.define_derived_metadata(type: :feature) do |metadata| 8 + metadata[:db] = true 9 + end 10 + end
+42
spec/support/db/cleaning.rb
··· 1 + # frozen_string_literal: true 2 + 3 + require "database_cleaner/sequel" 4 + 5 + # Clean the databases between tests tagged as `:db` 6 + RSpec.configure do |config| 7 + # Returns all the configured databases across the app and its slices. 8 + # 9 + # Used in the before/after hooks below to ensure each database is cleaned between examples. 10 + # 11 + # Modify this proc (or any code below) if you only need specific databases cleaned. 12 + all_databases = -> { 13 + slices = [Hanami.app] + Hanami.app.slices.with_nested 14 + 15 + slices.each_with_object([]) { |slice, dbs| 16 + next unless slice.key?("db.rom") 17 + 18 + dbs.concat slice["db.rom"].gateways.values.map(&:connection) 19 + }.uniq 20 + } 21 + 22 + config.before :suite do 23 + all_databases.call.each do |db| 24 + DatabaseCleaner[:sequel, db: db].clean_with :truncation, except: ["schema_migrations"] 25 + end 26 + end 27 + 28 + config.before :each, :db do |example| 29 + strategy = example.metadata[:js] ? :truncation : :transaction 30 + 31 + all_databases.call.each do |db| 32 + DatabaseCleaner[:sequel, db: db].strategy = strategy 33 + DatabaseCleaner[:sequel, db: db].start 34 + end 35 + end 36 + 37 + config.after :each, :db do 38 + all_databases.call.each do |db| 39 + DatabaseCleaner[:sequel, db: db].clean 40 + end 41 + end 42 + end
+5
spec/support/features.rb
··· 1 + # frozen_string_literal: true 2 + 3 + require "capybara/rspec" 4 + 5 + Capybara.app = Hanami.app
+8
spec/support/operations.rb
··· 1 + # frozen_string_literal: true 2 + 3 + require "dry/monads" 4 + 5 + RSpec.configure do |config| 6 + # Provide `Success` and `Failure` for testing operation results 7 + config.include Dry::Monads[:result] 8 + end
+13
spec/support/requests.rb
··· 1 + # frozen_string_literal: true 2 + 3 + require "rack/test" 4 + 5 + RSpec.shared_context "Rack::Test" do 6 + # Define the app for Rack::Test requests 7 + let(:app) { Hanami.app } 8 + end 9 + 10 + RSpec.configure do |config| 11 + config.include Rack::Test::Methods, type: :request 12 + config.include_context "Rack::Test", type: :request 13 + end
+61
spec/support/rspec.rb
··· 1 + # frozen_string_literal: true 2 + 3 + RSpec.configure do |config| 4 + # Use the recommended non-monkey patched syntax. 5 + config.disable_monkey_patching! 6 + 7 + # Use and configure rspec-expectations. 8 + config.expect_with :rspec do |expectations| 9 + # This option will default to `true` in RSpec 4. 10 + expectations.include_chain_clauses_in_custom_matcher_descriptions = true 11 + end 12 + 13 + # Use and configure rspec-mocks. 14 + config.mock_with :rspec do |mocks| 15 + # Prevents you from mocking or stubbing a method that does not exist on a 16 + # real object. 17 + mocks.verify_partial_doubles = true 18 + end 19 + 20 + # This option will default to `:apply_to_host_groups` in RSpec 4. 21 + config.shared_context_metadata_behavior = :apply_to_host_groups 22 + 23 + # Limit a spec run to individual examples or groups you care about by tagging 24 + # them with `:focus` metadata. When nothing is tagged with `:focus`, all 25 + # examples get run. 26 + # 27 + # RSpec also provides aliases for `it`, `describe`, and `context` that include 28 + # `:focus` metadata: `fit`, `fdescribe` and `fcontext`, respectively. 29 + config.filter_run_when_matching :focus 30 + 31 + # Allow RSpec to persist some state between runs in order to support the 32 + # `--only-failures` and `--next-failure` CLI options. We recommend you 33 + # configure your source control system to ignore this file. 34 + config.example_status_persistence_file_path = "spec/examples.txt" 35 + 36 + # Uncomment this to enable warnings. This is recommended, but in some cases 37 + # may be too noisy due to issues in dependencies. 38 + # config.warnings = true 39 + 40 + # Show more verbose output when running an individual spec file. 41 + if config.files_to_run.one? 42 + config.default_formatter = "doc" 43 + end 44 + 45 + # Print the 10 slowest examples and example groups at the end of the spec run, 46 + # to help surface which specs are running particularly slow. 47 + config.profile_examples = 10 48 + 49 + # Run specs in random order to surface order dependencies. If you find an 50 + # order dependency and want to debug it, you can fix the order by providing 51 + # the seed, which is printed after each run: 52 + # 53 + # --seed 1234 54 + config.order = :random 55 + 56 + # Seed global randomization in this process using the `--seed` CLI option. 57 + # This allows you to use `--seed` to deterministically reproduce test failures 58 + # related to randomization by passing the same `--seed` value as the one that 59 + # triggered the failure. 60 + Kernel.srand config.seed 61 + end