snowpacker 0.0.4.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +3 -0
  3. data/.dockerignore +22 -0
  4. data/.github/workflows/build.yml +20 -0
  5. data/.gitignore +65 -0
  6. data/CHANGELOG.md +28 -0
  7. data/Dockerfile +38 -0
  8. data/Gemfile +8 -0
  9. data/Gemfile.lock +199 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +156 -0
  12. data/Rakefile +32 -0
  13. data/bin/console +15 -0
  14. data/bin/setup +8 -0
  15. data/docker-compose.yml +17 -0
  16. data/docker.env +8 -0
  17. data/examples/rails-without-webpack/.gitignore +34 -0
  18. data/examples/rails-without-webpack/.ruby-version +1 -0
  19. data/examples/rails-without-webpack/Gemfile +33 -0
  20. data/examples/rails-without-webpack/Gemfile.lock +225 -0
  21. data/examples/rails-without-webpack/README.md +24 -0
  22. data/examples/rails-without-webpack/Rakefile +6 -0
  23. data/examples/rails-without-webpack/app/assets/config/manifest.js +2 -0
  24. data/examples/rails-without-webpack/app/assets/images/.keep +0 -0
  25. data/examples/rails-without-webpack/app/assets/stylesheets/application.css +15 -0
  26. data/examples/rails-without-webpack/app/assets/stylesheets/static_pages.scss +3 -0
  27. data/examples/rails-without-webpack/app/channels/application_cable/channel.rb +4 -0
  28. data/examples/rails-without-webpack/app/channels/application_cable/connection.rb +4 -0
  29. data/examples/rails-without-webpack/app/controllers/application_controller.rb +2 -0
  30. data/examples/rails-without-webpack/app/controllers/concerns/.keep +0 -0
  31. data/examples/rails-without-webpack/app/controllers/static_pages_controller.rb +4 -0
  32. data/examples/rails-without-webpack/app/helpers/application_helper.rb +2 -0
  33. data/examples/rails-without-webpack/app/helpers/static_pages_helper.rb +2 -0
  34. data/examples/rails-without-webpack/app/javascript/channels/consumer.js +6 -0
  35. data/examples/rails-without-webpack/app/javascript/channels/index.js +6 -0
  36. data/examples/rails-without-webpack/app/javascript/packs/application.js +17 -0
  37. data/examples/rails-without-webpack/app/javascript/stylesheets/index.css +3 -0
  38. data/examples/rails-without-webpack/app/jobs/application_job.rb +7 -0
  39. data/examples/rails-without-webpack/app/mailers/application_mailer.rb +4 -0
  40. data/examples/rails-without-webpack/app/models/application_record.rb +3 -0
  41. data/examples/rails-without-webpack/app/models/concerns/.keep +0 -0
  42. data/examples/rails-without-webpack/app/views/layouts/application.html.erb +16 -0
  43. data/examples/rails-without-webpack/app/views/layouts/mailer.html.erb +13 -0
  44. data/examples/rails-without-webpack/app/views/layouts/mailer.text.erb +1 -0
  45. data/examples/rails-without-webpack/app/views/static_pages/index.html.erb +2 -0
  46. data/examples/rails-without-webpack/bin/bundle +114 -0
  47. data/examples/rails-without-webpack/bin/rails +9 -0
  48. data/examples/rails-without-webpack/bin/rake +9 -0
  49. data/examples/rails-without-webpack/bin/setup +36 -0
  50. data/examples/rails-without-webpack/bin/spring +17 -0
  51. data/examples/rails-without-webpack/bin/yarn +9 -0
  52. data/examples/rails-without-webpack/config.ru +5 -0
  53. data/examples/rails-without-webpack/config/application.rb +20 -0
  54. data/examples/rails-without-webpack/config/boot.rb +4 -0
  55. data/examples/rails-without-webpack/config/cable.yml +10 -0
  56. data/examples/rails-without-webpack/config/credentials.yml.enc +1 -0
  57. data/examples/rails-without-webpack/config/database.yml +25 -0
  58. data/examples/rails-without-webpack/config/environment.rb +5 -0
  59. data/examples/rails-without-webpack/config/environments/development.rb +62 -0
  60. data/examples/rails-without-webpack/config/environments/production.rb +112 -0
  61. data/examples/rails-without-webpack/config/environments/test.rb +49 -0
  62. data/examples/rails-without-webpack/config/initializers/application_controller_renderer.rb +8 -0
  63. data/examples/rails-without-webpack/config/initializers/assets.rb +14 -0
  64. data/examples/rails-without-webpack/config/initializers/backtrace_silencers.rb +7 -0
  65. data/examples/rails-without-webpack/config/initializers/content_security_policy.rb +31 -0
  66. data/examples/rails-without-webpack/config/initializers/cookies_serializer.rb +5 -0
  67. data/examples/rails-without-webpack/config/initializers/filter_parameter_logging.rb +4 -0
  68. data/examples/rails-without-webpack/config/initializers/inflections.rb +16 -0
  69. data/examples/rails-without-webpack/config/initializers/mime_types.rb +4 -0
  70. data/examples/rails-without-webpack/config/initializers/snowpacker.rb +19 -0
  71. data/examples/rails-without-webpack/config/initializers/wrap_parameters.rb +14 -0
  72. data/examples/rails-without-webpack/config/locales/en.yml +33 -0
  73. data/examples/rails-without-webpack/config/puma.rb +38 -0
  74. data/examples/rails-without-webpack/config/routes.rb +4 -0
  75. data/examples/rails-without-webpack/config/snowpacker/.browserslistrc +1 -0
  76. data/examples/rails-without-webpack/config/snowpacker/babel.config.js +76 -0
  77. data/examples/rails-without-webpack/config/snowpacker/postcss.config.js +12 -0
  78. data/examples/rails-without-webpack/config/snowpacker/snowpack.config.js +42 -0
  79. data/examples/rails-without-webpack/config/spring.rb +6 -0
  80. data/examples/rails-without-webpack/config/storage.yml +34 -0
  81. data/examples/rails-without-webpack/db/seeds.rb +7 -0
  82. data/examples/rails-without-webpack/lib/assets/.keep +0 -0
  83. data/examples/rails-without-webpack/lib/tasks/.keep +0 -0
  84. data/examples/rails-without-webpack/package.json +33 -0
  85. data/examples/rails-without-webpack/storage/.keep +0 -0
  86. data/examples/rails-without-webpack/test/application_system_test_case.rb +5 -0
  87. data/examples/rails-without-webpack/test/channels/application_cable/connection_test.rb +11 -0
  88. data/examples/rails-without-webpack/test/controllers/.keep +0 -0
  89. data/examples/rails-without-webpack/test/controllers/static_pages_controller_test.rb +8 -0
  90. data/examples/rails-without-webpack/test/fixtures/.keep +0 -0
  91. data/examples/rails-without-webpack/test/fixtures/files/.keep +0 -0
  92. data/examples/rails-without-webpack/test/helpers/.keep +0 -0
  93. data/examples/rails-without-webpack/test/integration/.keep +0 -0
  94. data/examples/rails-without-webpack/test/mailers/.keep +0 -0
  95. data/examples/rails-without-webpack/test/models/.keep +0 -0
  96. data/examples/rails-without-webpack/test/system/.keep +0 -0
  97. data/examples/rails-without-webpack/test/test_helper.rb +13 -0
  98. data/examples/rails-without-webpack/tmp/.keep +0 -0
  99. data/examples/rails-without-webpack/tmp/pids/.keep +0 -0
  100. data/examples/rails-without-webpack/vendor/.keep +0 -0
  101. data/examples/rails-without-webpack/yarn.lock +4254 -0
  102. data/lib/snowpacker.rb +24 -0
  103. data/lib/snowpacker/configuration.rb +19 -0
  104. data/lib/snowpacker/engine.rb +9 -0
  105. data/lib/snowpacker/env.rb +23 -0
  106. data/lib/snowpacker/runner.rb +51 -0
  107. data/lib/snowpacker/snowpacker_generator.rb +58 -0
  108. data/lib/snowpacker/snowpacker_proxy.rb +48 -0
  109. data/lib/snowpacker/templates/babel.config.js +76 -0
  110. data/lib/snowpacker/templates/postcss.config.js +12 -0
  111. data/lib/snowpacker/templates/snowpack.config.js +42 -0
  112. data/lib/snowpacker/templates/snowpacker.rb +19 -0
  113. data/lib/snowpacker/version.rb +5 -0
  114. data/lib/tasks/snowpacker_tasks.rake +30 -0
  115. data/snowpacker.gemspec +45 -0
  116. data/yarn.lock +6211 -0
  117. metadata +299 -0
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "snowpacker/configuration"
4
+ require "snowpacker/snowpacker_proxy"
5
+
6
+ module Snowpacker
7
+ class << self
8
+ attr_accessor :config
9
+ end
10
+
11
+ def self.config_location
12
+ Rails.root.join("config", "snowpack.config.json")
13
+ end
14
+
15
+ def self.configure
16
+ self.config ||= Configuration.new
17
+ yield(config)
18
+ end
19
+ end
20
+
21
+ require "snowpacker/version"
22
+ require "snowpacker/snowpacker_generator" if defined?(Rails)
23
+ require "snowpacker/runner" if defined?(Rails)
24
+ require "snowpacker/engine" if defined?(Rails)
@@ -0,0 +1,19 @@
1
+ module Snowpacker
2
+ class Configuration
3
+ attr_accessor :config_dir
4
+ attr_accessor :config_file
5
+ attr_accessor :babel_config_file
6
+ attr_accessor :postcss_config_file
7
+ attr_accessor :build_dir
8
+ attr_accessor :mount_dir
9
+ attr_accessor :output_path
10
+ attr_accessor :port, :hostname
11
+
12
+ def initialize
13
+ @output_path = "snowpacks"
14
+ @mount_dir = File.join("app", "javascript")
15
+ @port = "4035"
16
+ @hostname = "localhost"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ require "rails/railtie"
2
+
3
+ module Snowpacker
4
+ class Engine < ::Rails::Engine
5
+ isolate_namespace Snowpacker
6
+
7
+ config.snowpacker = Snowpacker::Configuration.new
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ module Snowpacker
2
+ class Env
3
+ ENV_PREFIX = "SNOWPACKER".freeze
4
+
5
+ class << self
6
+ def set_env_variables
7
+ set_env("OUTPUT_PATH", Snowpacker.config.output_path)
8
+ set_env("HOSTNAME", Snowpacker.config.hostname)
9
+ set_env("PORT", Snowpacker.config.port)
10
+ set_env("BUILD_DIR", Snowpacker.config.build_dir)
11
+ set_env("MOUNT_DIR", Snowpacker.config.mount_dir)
12
+ set_env("BABEL_CONFIG_FILE", Snowpacker.config.babel_config_file)
13
+ set_env("POSTCSS_CONFIG_FILE", Snowpacker.config.postcss_config_file)
14
+ end
15
+
16
+ private
17
+
18
+ def set_env(env_var, value)
19
+ ENV["#{ENV_PREFIX}_#{env_var}"] ||= value.to_s
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "socket"
4
+ require "snowpacker/env"
5
+
6
+ module Snowpacker
7
+ module Rails
8
+ class Runner
9
+ attr_reader :config_file
10
+
11
+ def initialize
12
+ @config_file = Snowpacker.config.config_file
13
+ Env.set_env_variables
14
+ rescue Errno::ENOENT, NoMethodError
15
+ $stdout.puts "Snowpacker configuration not found in #{Snowpacker.config_location}"
16
+ $stdout.puts "Please run bundle exec rails generate snowpacker to install Snowpacker"
17
+ exit!
18
+ end
19
+
20
+ # Build for production
21
+ def build
22
+ snowpacker_command(env: :production, cmd: :build)
23
+ end
24
+
25
+ # Serve for development
26
+ def dev
27
+ detect_port!
28
+ snowpacker_command(env: :development, cmd: :dev)
29
+ end
30
+
31
+ private
32
+
33
+ def snowpacker_command(env: "", cmd: "")
34
+ env = ENV["NODE_ENV"] || env
35
+ command = "NODE_ENV=#{env} yarn run snowpack #{cmd} --config #{@config_file}"
36
+ exec(command)
37
+ end
38
+
39
+ def detect_port!
40
+ hostname = Snowpacker.config.hostname
41
+ port = Snowpacker.config.port
42
+ server = TCPServer.new(hostname, port)
43
+ server.close
44
+ rescue Errno::EADDRINUSE
45
+ $stdout.puts "Another program is running on port #{port}.\n
46
+ Set a new port in #{Snowpacker.config_path} for devOptions: { port: \"#{port}\" }"
47
+ exit!
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+
5
+ class SnowpackerGenerator < ::Rails::Generators::Base
6
+ TEMPLATES = File.join(File.expand_path(__dir__), "templates")
7
+
8
+ desc "Generate Snowpacker initializer"
9
+ def create_initializer_file
10
+ initializer "snowpacker.rb" do
11
+ File.read(File.join(TEMPLATES, "snowpacker.rb"))
12
+ end
13
+ end
14
+
15
+ desc "Add snowpack, babel, and postcss to your package.json dependencies"
16
+ def add_snowpack
17
+ %x(yarn add -D snowpack \
18
+ @snowpack/babel-plugin-package-import \
19
+ core-js@3 \
20
+ postcss \
21
+ postcss-cli \
22
+ postcss-import \
23
+ postcss-flexbugs-fixes \
24
+ postcss-preset-env \
25
+ @babel/core \
26
+ @babel/cli \
27
+ @babel/preset-env \
28
+ @babel/plugin-transform-runtime \
29
+ babel-plugin-macros \
30
+ @snowpack/plugin-babel \
31
+ @babel/preset-env \
32
+ babel-plugin-macros \
33
+ @babel/plugin-syntax-dynamic-import \
34
+ babel-plugin-dynamic-import-node \
35
+ @babel/plugin-transform-destructuring \
36
+ @babel/plugin-proposal-class-properties \
37
+ @babel/plugin-proposal-object-rest-spread \
38
+ @babel/plugin-transform-runtime \
39
+ @babel/plugin-transform-regenerator
40
+ )
41
+ end
42
+
43
+ desc "Create config files IE: babel.config snowpack.config"
44
+ def create_config_files
45
+ config_files = %w[
46
+ snowpack.config.js
47
+ postcss.config.js
48
+ babel.config.js
49
+ .browserslistrc
50
+ ]
51
+
52
+ config_files.each do |filename|
53
+ create_file Rails.root.join("config", "snowpacker", filename) do
54
+ File.read(File.join(TEMPLATES, filename))
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rack/proxy"
4
+ require "socket"
5
+
6
+ module Snowpacker
7
+ # Proxy server for snowpacker
8
+ class SnowpackerProxy < Rack::Proxy
9
+ def perform_request(env)
10
+ if env["PATH_INFO"].start_with?(%r{/#{Snowpacker.config.output_path}}) && dev_server_running?
11
+ env["HTTP_HOST"] = env["HTTP_X_FORWARDED_HOST"] = Snowpacker.config.hostname
12
+ env["HTTP_X_FORWARDED_SERVER"] = host_with_port
13
+ env["HTTP_PORT"] = env["HTTP_X_FORWARDED_PORT"] = Snowpacker.config.port
14
+ env["HTTP_X_FORWARDED_PROTO"] = env["HTTP_X_FORWARDED_SCHEME"] = "http"
15
+
16
+ # unless dev_server.https?
17
+ env["HTTPS"] = env["HTTP_X_FORWARDED_SSL"] = "off"
18
+ # end
19
+
20
+ env["SCRIPT_NAME"] = ""
21
+
22
+ super(env)
23
+ else
24
+ @app.call(env)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def dev_server_running?
31
+ host = Snowpacker.config.hostname
32
+ port = Snowpacker.config.port
33
+ connect_timeout = 0.01
34
+
35
+ Socket.tcp(host, port, connect_timeout: connect_timeout).close
36
+ true
37
+ rescue Errno::ECONNREFUSED
38
+ puts "Snowpacker is not currently running on #{host_with_port}"
39
+ false
40
+ end
41
+
42
+ def host_with_port
43
+ hostname = Snowpacker.config.hostname
44
+ port = Snowpacker.config.port
45
+ "#{hostname}:#{port}"
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,76 @@
1
+ module.exports = function(api) {
2
+ const validEnv = ['development', 'test', 'production']
3
+ const currentEnv = process.env.NODE_ENV
4
+ const isDevelopmentEnv = (currentEnv === "development")
5
+ const isProductionEnv = (currentEnv === 'production')
6
+ const isTestEnv = (currentEnv === 'test')
7
+
8
+ if (!validEnv.includes(currentEnv)) {
9
+ throw new Error(
10
+ 'Please specify a valid `NODE_ENV` or ' +
11
+ '`BABEL_ENV` environment variables. Valid values are "development", ' +
12
+ '"test", and "production". Instead, received: ' +
13
+ JSON.stringify(currentEnv) +
14
+ '.'
15
+ )
16
+ }
17
+
18
+ // Cached based on the value of some function. If this function returns a value different from
19
+ // a previously-encountered value, the plugins will re-evaluate.
20
+ api.cache(() => currentEnv);
21
+
22
+ return {
23
+ presets: [
24
+ isTestEnv && [
25
+ '@babel/preset-env',
26
+ {
27
+ targets: {
28
+ node: 'current'
29
+ }
30
+ }
31
+ ],
32
+ (isProductionEnv || isDevelopmentEnv) && [
33
+ '@babel/preset-env',
34
+ {
35
+ forceAllTransforms: true,
36
+ useBuiltIns: 'entry',
37
+ corejs: 3,
38
+ modules: false,
39
+ exclude: ['transform-typeof-symbol']
40
+ }
41
+ ]
42
+ ].filter(Boolean),
43
+ plugins: [
44
+ 'babel-plugin-macros',
45
+ '@babel/plugin-syntax-dynamic-import',
46
+ isTestEnv && 'babel-plugin-dynamic-import-node',
47
+ '@babel/plugin-transform-destructuring',
48
+ [
49
+ '@babel/plugin-proposal-class-properties',
50
+ {
51
+ loose: true
52
+ }
53
+ ],
54
+ [
55
+ '@babel/plugin-proposal-object-rest-spread',
56
+ {
57
+ useBuiltIns: true
58
+ }
59
+ ],
60
+ [
61
+ '@babel/plugin-transform-runtime',
62
+ {
63
+ helpers: false,
64
+ regenerator: true,
65
+ corejs: false
66
+ }
67
+ ],
68
+ [
69
+ '@babel/plugin-transform-regenerator',
70
+ {
71
+ async: false
72
+ }
73
+ ]
74
+ ].filter(Boolean)
75
+ }
76
+ }
@@ -0,0 +1,12 @@
1
+ module.exports = {
2
+ plugins: [
3
+ require('postcss-import'),
4
+ require('postcss-flexbugs-fixes'),
5
+ require('postcss-preset-env')({
6
+ autoprefixer: {
7
+ flexbox: 'no-2009'
8
+ },
9
+ stage: 3
10
+ })
11
+ ]
12
+ }
@@ -0,0 +1,42 @@
1
+ const output_path = process.env["SNOWPACKER_OUTPUT_PATH"]
2
+ const port = process.env["SNOWPACKER_PORT"]
3
+ const build_dir = process.env["SNOWPACKER_BUILD_DIR"]
4
+ const mount_dir = process.env["SNOWPACKER_MOUNT_DIR"]
5
+ const babel_config = process.env["SNOWPACKER_BABEL_CONFIG_FILE"]
6
+ const postcss_config = process.env["SNOWPACKER_POSTCSS_CONFIG_FILE"]
7
+
8
+ // not currently supported
9
+ // const hostname = process.env["SNOWPACKER_HOSTNAME"]
10
+
11
+ const scripts = {
12
+ "mount:web_modules": `mount $WEB_MODULES --to /${output_path}/web_modules`,
13
+ "mount:snowpacks": `mount ${mount_dir} --to /${output_path}`,
14
+ "build:css": `postcss --config ${postcss_config}`,
15
+ "build:js,jsx,ts,tsx": `babel --config-file ${babel_config} \
16
+ ${mount_dir}`
17
+ }
18
+
19
+ const installOptions = {
20
+ NODE_ENV: true
21
+ }
22
+
23
+ const devOptions = {
24
+ port: parseInt(port, 10),
25
+ open: "none",
26
+ out: build_dir
27
+ }
28
+
29
+ const buildOptions = {
30
+ clean: true,
31
+ baseUrl: "/",
32
+ metaDir: `${output_path}/__snowpack__`
33
+ }
34
+
35
+ module.exports = {
36
+ scripts,
37
+ plugins: [],
38
+ installOptions,
39
+ devOptions,
40
+ buildOptions
41
+ }
42
+
@@ -0,0 +1,19 @@
1
+ Rails.application.config.middleware.use Snowpacker::SnowpackerProxy, {ssl_verify_none: true}
2
+
3
+ Snowpacker.configure do |snowpacker|
4
+ # Where to find the config file
5
+ snowpacker.config_dir = Rails.root.join("config", "snowpacker")
6
+ snowpacker.config_file = File.join(snowpacker.config_dir, "snowpack.config.js")
7
+
8
+ snowpacker.babel_config_file = File.join(snowpacker.config_dir, "babel.config.js")
9
+ snowpacker.postcss_config_file = File.join(snowpacker.config_dir, "postcss.config.js")
10
+
11
+ snowpacker.mount_dir = File.join("app", "javascript")
12
+ snowpacker.build_dir = "public"
13
+ snowpacker.output_path = "snowpacks" # => /public/snowpacks
14
+ snowpacker.port = "4035"
15
+
16
+ # Currently, snowpack does not support the hostname option as of version 2.6.4
17
+ # Support should be coming in 2.6.5, so until then, this is just a placeholder.
18
+ snowpacker.hostname = "localhost"
19
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Snowpacker
4
+ VERSION = "0.0.4.alpha1"
5
+ end
@@ -0,0 +1,30 @@
1
+ namespace :snowpacker do
2
+ desc "Compiles assets using snowpack bundler"
3
+ task build: :environment do
4
+ Snowpacker::Rails::Runner.new.build
5
+ end
6
+
7
+ desc "Compiles assets using snowpack bundler"
8
+ task compile: :build
9
+
10
+ desc "Run a snowpack dev server"
11
+ task dev: :environment do
12
+ Snowpacker::Rails::Runner.new.dev
13
+ end
14
+
15
+ desc "Removes compiled assets"
16
+ task clobber: :environment do
17
+ command = "rm -rf #{::Rails.application.config.snowpacker.destination}"
18
+ logger = Logger.new(STDOUT)
19
+ logger.info(command)
20
+ exec(command)
21
+ end
22
+ end
23
+
24
+ Rake::Task["assets:precompile"].enhance do
25
+ Rake::Task["snowpacker:build"].invoke
26
+ end
27
+
28
+ Rake::Task["assets:clobber"].enhance do
29
+ Rake::Task["snowpacker:clobber"].invoke
30
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ $:.push File.expand_path("lib", __dir__)
4
+
5
+ # Maintain your gem's version:
6
+ require "snowpacker/version"
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = "snowpacker"
10
+ spec.version = Snowpacker::VERSION
11
+ spec.authors = ["Konnor Rogers"]
12
+ spec.email = ["konnor7414@gmail.com"]
13
+
14
+ spec.summary = "Rails integration of Snowpack"
15
+ spec.description = "Rails integration of Snowpack"
16
+ spec.homepage = "http://github.com/paramagicdev/snowpacker"
17
+ spec.license = "MIT"
18
+
19
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
20
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
21
+ if spec.respond_to?(:metadata)
22
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
23
+ else
24
+ raise "RubyGems 2.0 or newer is required to protect against " \
25
+ "public gem pushes."
26
+ end
27
+
28
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
29
+ f.match(%r{^(test|spec|features)/})
30
+ end
31
+ spec.bindir = "exe"
32
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
+ spec.require_paths = ["lib"]
34
+
35
+ spec.add_runtime_dependency "rack-proxy", "~> 0.6.4"
36
+ spec.add_development_dependency "bundler", "~> 2"
37
+ spec.add_development_dependency "conventional-changelog", "~> 1.2"
38
+ spec.add_development_dependency "minitest", "~> 5.14"
39
+ spec.add_development_dependency "pry", "~> 0.12"
40
+ spec.add_development_dependency "rails", "~> 6"
41
+ spec.add_development_dependency "rake", "~> 13.0"
42
+ spec.add_development_dependency "rspec", "~> 3.0"
43
+ spec.add_development_dependency "standardrb"
44
+ spec.add_development_dependency "yard"
45
+ end