cloudflare-turnstile-rails 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 167722dcdc89fe5d682e584a48fc218d3a6839225333f4a5cad66ec81a37ada9
4
- data.tar.gz: f07de910ba89fea39e55a0389552b4cf6485419f928b460e89f025d7ee2af22a
3
+ metadata.gz: 196412eb6b781fae101b937a9f76b0aa5eaebf94be239466cf3a9edc3175356b
4
+ data.tar.gz: 4077e06435e1c39254bd4b74aee2eaa7cb219cea37d8cbef8c37998e50f0075a
5
5
  SHA512:
6
- metadata.gz: d7de00b3c2196a250e14a625168937203a7550d8850115379cc65c11d669df19604e5f0762f47747384ec558c53311f7425820b619e2db3de6eb10ab766a5191
7
- data.tar.gz: 9120147af25bd3dcc6cf3c753b08e70b89a5b821f66eb2230edb17775361266cc4d6a5736303a30769593dd45d021d150b09cc1c95710e0437560bbe2f50e124
6
+ metadata.gz: 3e28b314dc36c83eaf191ecbe6a47e2477a7c80a54e7d791b5a3ee0d07c6f6617fbd3f06bb822c15cba75e3637b963c6524b40473eaa399932543f649abb85f1
7
+ data.tar.gz: d28f2f512b7efc7bd387e410e6829053c6a7019d730b3fb7dfa5bd69d87c59dab7dd0816187a621d7c80533c67931ce3511bca42266804f39e15f4ad77368e7d
data/README.md CHANGED
@@ -39,6 +39,7 @@ Supports `Rails >= 5.0` with `Ruby >= 2.6.0`.
39
39
  - [Upgrade Guide](#upgrade-guide)
40
40
  - [Troubleshooting](#troubleshooting)
41
41
  - [Development](#development)
42
+ - [Contributing](#contributing)
42
43
  - [License](#license)
43
44
 
44
45
 
@@ -198,8 +199,8 @@ All widgets will re‑initialize automatically on Turbo navigations (`turbo:rend
198
199
 
199
200
  If your Rails app still uses Turbolinks (rather than Turbo), you can add a small helper to your JavaScript pack so that remote form submissions returning HTML correctly display validation errors without a full page reload. Simply copy the file:
200
201
 
201
- ```
202
- templates / shared / cloudflare_turbolinks_ajax_cache.js
202
+ ```plaintext
203
+ templates/shared/cloudflare_turbolinks_ajax_cache.js
203
204
  ```
204
205
 
205
206
  into your application's JavaScript entrypoint (for example `app/javascript/packs/application.js`). This script listens for Rails UJS `ajax:complete` events that return HTML, caches the response as a Turbolinks snapshot, and then restores it via `Turbolinks.visit`, ensuring forms with validation errors are re‑rendered seamlessly.
@@ -357,7 +358,7 @@ If you run into any issues after upgrading Rails, please [open an issue](https:/
357
358
  - When using Rails' CSP nonces, make sure `content_security_policy_nonce` is available in your view context — otherwise the Turnstile script may be blocked.
358
359
 
359
360
  **Server Validation Errors**
360
- - Validation failures (invalid, expired, or already‑used tokens) surface as model errors. Consult Cloudflare's [server-side troubleshooting](https://developers.cloudflare.com/turnstile/troubleshooting/testing/) for common [error codes](https://developers.cloudflare.com/turnstile/troubleshooting/client-side-errors/error-codes/) and [test keys](https://developers.cloudflare.com/turnstile/troubleshooting/testing/#dummy-sitekeys-and-secret-keys).
361
+ - Validation failures (invalid, expired, or already‑used tokens) surface as model errors. Consult Cloudflare's [server-side troubleshooting](https://developers.cloudflare.com/turnstile/troubleshooting/testing/) for common [error codes](https://developers.cloudflare.com/turnstile/troubleshooting/client-side-errors/error-codes/) and [test keys](https://developers.cloudflare.com/turnstile/troubleshooting/testing/#test-sitekeys).
361
362
 
362
363
  > Still stuck? Check the Cloudflare Turnstile docs: [https://developers.cloudflare.com/turnstile/get-started/](https://developers.cloudflare.com/turnstile/get-started/)
363
364
 
@@ -405,7 +406,7 @@ rails new test_app \
405
406
  -m templates/template.rb
406
407
  ```
407
408
 
408
- Get the exact command from the `test/integration/` folder, where each integration test has a corresponding Rails app template. For example, to replicate the `test/integration/rails7.rb` test for Rails `v7.0.4`, run:
409
+ Get the exact command from the `test/integration/` folder, where each integration test has a corresponding Rails app template. For example, to replicate the `test/integration/rails7_template_test.rb` test for Rails `v7.0.4`, run:
409
410
 
410
411
  ```bash
411
412
  gem install rails -v 7.0.4
@@ -13,8 +13,14 @@
13
13
  el = elements[i];
14
14
 
15
15
  if (!el.dataset.initialized && el.childElementCount === 0) {
16
- turnstile.render(el);
17
- el.dataset.initialized = 'true';
16
+ try {
17
+ turnstile.render(el);
18
+ el.dataset.initialized = 'true';
19
+ }
20
+ catch (e) {
21
+ // eslint-disable-next-line no-console
22
+ console.warn('cloudflare-turnstile-rails: turnstile.render failed', e);
23
+ }
18
24
  }
19
25
  }
20
26
  }
@@ -5,6 +5,8 @@ module Cloudflare
5
5
  engine_name 'cloudflare_turnstile_rails'
6
6
 
7
7
  initializer 'cloudflare_turnstile.assets' do |app|
8
+ next unless app.config.respond_to?(:assets)
9
+
8
10
  js_path = ::Cloudflare::Turnstile::Rails::Engine.root.join(
9
11
  'lib', 'cloudflare', 'turnstile', 'rails', 'assets', 'javascripts'
10
12
  )
@@ -1,7 +1,7 @@
1
1
  module Cloudflare
2
2
  module Turnstile
3
3
  module Rails
4
- VERSION = '1.0.0'.freeze
4
+ VERSION = '1.0.2'.freeze
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudflare-turnstile-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vadim Kononov
@@ -10,7 +10,7 @@ cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
- name: rails
13
+ name: railties
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - ">="
@@ -31,12 +31,8 @@ executables: []
31
31
  extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
- - ".rubocop.yml"
35
- - Appraisals
36
34
  - LICENSE.txt
37
35
  - README.md
38
- - Rakefile
39
- - eslint.config.js
40
36
  - lib/cloudflare/turnstile/rails.rb
41
37
  - lib/cloudflare/turnstile/rails/assets/javascripts/cloudflare_turnstile_helper.js
42
38
  - lib/cloudflare/turnstile/rails/configuration.rb
@@ -65,7 +61,6 @@ files:
65
61
  - lib/cloudflare/turnstile/rails/version.rb
66
62
  - lib/generators/cloudflare_turnstile/install_generator.rb
67
63
  - lib/generators/cloudflare_turnstile/templates/cloudflare_turnstile.rb
68
- - package.json
69
64
  homepage: https://github.com/vkononov/cloudflare-turnstile-rails
70
65
  licenses:
71
66
  - MIT
@@ -88,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
83
  - !ruby/object:Gem::Version
89
84
  version: '0'
90
85
  requirements: []
91
- rubygems_version: 3.7.2
86
+ rubygems_version: 4.0.10
92
87
  specification_version: 4
93
88
  summary: Cloudflare Turnstile gem for Rails with built-in Turbo and Turbolinks support
94
89
  and CSP compliance
data/.rubocop.yml DELETED
@@ -1,46 +0,0 @@
1
- plugins:
2
- - rubocop-md
3
- - rubocop-minitest
4
- - rubocop-performance
5
- - rubocop-rake
6
-
7
- AllCops:
8
- TargetRubyVersion: 2.6.0
9
- NewCops: enable
10
- Exclude:
11
- - .git/**/*
12
- - node_modules/**/*
13
- - vendor/bundle/**/*
14
-
15
- Layout/IndentationConsistency:
16
- Exclude:
17
- - README.md
18
-
19
- Layout/InitialIndentation:
20
- Exclude:
21
- - README.md
22
-
23
- Layout/LineLength:
24
- Max: 120
25
- Exclude:
26
- - lib/cloudflare/turnstile/rails/constants/*.rb
27
- - cloudflare-turnstile-rails.gemspec
28
-
29
- Layout/SpaceInsideHashLiteralBraces:
30
- Enabled: false
31
-
32
- Metrics/MethodLength:
33
- Max: 12
34
-
35
- Minitest/MultipleAssertions:
36
- Enabled: false
37
-
38
- Style/Documentation:
39
- Enabled: false
40
-
41
- Style/EmptyElse:
42
- Exclude:
43
- - README.md
44
-
45
- Style/FrozenStringLiteralComment:
46
- EnforcedStyle: never
data/Appraisals DELETED
@@ -1,69 +0,0 @@
1
- appraise 'rails-5.0' do
2
- gem 'rails', '~> 5.0.0'
3
- if RUBY_VERSION >= '3.4.0'
4
- gem 'base64'
5
- gem 'mutex_m'
6
- end
7
- end
8
-
9
- appraise 'rails-5.1' do
10
- gem 'rails', '~> 5.1.0'
11
- if RUBY_VERSION >= '3.4.0'
12
- gem 'base64'
13
- gem 'mutex_m'
14
- end
15
- end
16
-
17
- appraise 'rails-5.2' do
18
- gem 'rails', '~> 5.2.0'
19
- if RUBY_VERSION >= '3.4.0'
20
- gem 'base64'
21
- gem 'mutex_m'
22
- end
23
- end
24
-
25
- appraise 'rails-6.0' do
26
- gem 'rails', '~> 6.0.0'
27
- if RUBY_VERSION >= '3.4.0'
28
- gem 'drb'
29
- gem 'mutex_m'
30
- end
31
- end
32
-
33
- appraise 'rails-6.1' do
34
- gem 'rails', '~> 6.1.0'
35
- if RUBY_VERSION >= '3.4.0'
36
- gem 'drb'
37
- gem 'mutex_m'
38
- end
39
- end
40
-
41
- if RUBY_VERSION >= '2.7.0'
42
- appraise 'rails-7.0' do
43
- gem 'rails', '~> 7.0.0'
44
- if RUBY_VERSION >= '3.4.0'
45
- gem 'drb'
46
- gem 'mutex_m'
47
- end
48
- end
49
-
50
- appraise 'rails-7.1' do
51
- gem 'rails', '~> 7.1.0'
52
- end
53
- end
54
-
55
- if RUBY_VERSION >= '3.1.0'
56
- appraise 'rails-7.2' do
57
- gem 'rails', '~> 7.2.0'
58
- end
59
- end
60
-
61
- if RUBY_VERSION >= '3.2.0'
62
- appraise 'rails-8.0' do
63
- gem 'rails', '~> 8.0.0'
64
- end
65
-
66
- appraise 'rails-8.1' do
67
- gem 'rails', '~> 8.1.0'
68
- end
69
- end
data/Rakefile DELETED
@@ -1,10 +0,0 @@
1
- require 'bundler/gem_tasks'
2
- require 'minitest/test_task'
3
-
4
- Minitest::TestTask.create
5
-
6
- require 'rubocop/rake_task'
7
-
8
- RuboCop::RakeTask.new
9
-
10
- task default: %i[test rubocop]
data/eslint.config.js DELETED
@@ -1,232 +0,0 @@
1
- import js from '@eslint/js';
2
- import globals from 'globals';
3
-
4
- export default [
5
- js.configs.recommended,
6
- {
7
- ignores: [
8
- 'node_modules/**',
9
- 'vendor/**',
10
- 'tmp/**',
11
- 'test/generators/tmp/**',
12
- 'eslint.config.js'
13
- ]
14
- },
15
- {
16
- files: ['**/*.js'],
17
- languageOptions: {
18
- ecmaVersion: 5,
19
- sourceType: 'script',
20
- globals: {
21
- ...globals.browser,
22
- turnstile: 'readonly',
23
- Turbolinks: 'readonly'
24
- }
25
- },
26
- rules: {
27
- 'for-direction': 'error',
28
- 'getter-return': 'error',
29
- 'no-mixed-operators': 'error',
30
- 'no-await-in-loop': 'error',
31
- 'no-compare-neg-zero': 'error',
32
- 'no-cond-assign': 'error',
33
- 'no-console': 'warn',
34
- 'no-constant-condition': 'error',
35
- 'no-control-regex': 'error',
36
- 'no-debugger': 'error',
37
- 'no-dupe-args': 'error',
38
- 'no-dupe-keys': 'error',
39
- 'no-duplicate-case': 'error',
40
- 'no-empty': 'error',
41
- 'no-empty-character-class': 'error',
42
- 'no-ex-assign': 'error',
43
- 'no-extra-boolean-cast': 'error',
44
- 'no-extra-parens': 'off',
45
- 'no-extra-semi': 'error',
46
- 'no-func-assign': 'error',
47
- 'no-inner-declarations': ['error', 'both'],
48
- 'no-invalid-regexp': 'error',
49
- 'no-irregular-whitespace': 'error',
50
- 'no-obj-calls': 'error',
51
- 'no-prototype-builtins': 'error',
52
- 'no-regex-spaces': 'error',
53
- 'no-sparse-arrays': 'error',
54
- 'no-template-curly-in-string': 'off',
55
- 'no-unexpected-multiline': 'error',
56
- 'no-unreachable': 'error',
57
- 'no-unsafe-finally': 'error',
58
- 'no-unsafe-negation': 'error',
59
- 'use-isnan': 'error',
60
- 'valid-typeof': 'error',
61
-
62
- // BEST PRACTICES
63
- 'accessor-pairs': 'error',
64
- 'array-callback-return': 'error',
65
- 'block-scoped-var': 'error',
66
- 'consistent-return': 'error',
67
- curly: 'error',
68
- 'default-case': 'error',
69
- 'dot-location': ['error', 'property'],
70
- 'dot-notation': 'error',
71
- eqeqeq: 'error',
72
- 'guard-for-in': 'error',
73
- 'no-alert': 'error',
74
- 'no-caller': 'error',
75
- 'no-case-declarations': 'error',
76
- 'no-div-regex': 'error',
77
- 'no-else-return': 'error',
78
- 'no-empty-function': 'error',
79
- 'no-empty-pattern': 'error',
80
- 'no-eq-null': 'error',
81
- 'no-eval': 'error',
82
- 'no-extend-native': 'error',
83
- 'no-extra-bind': 'error',
84
- 'no-extra-label': 'error',
85
- 'no-fallthrough': 'error',
86
- 'no-floating-decimal': 'error',
87
- 'no-global-assign': 'error',
88
- 'no-implicit-coercion': 'error',
89
- 'no-implicit-globals': 'error',
90
- 'no-implied-eval': 'error',
91
- 'no-invalid-this': 'off',
92
- 'no-iterator': 'error',
93
- 'no-labels': 'error',
94
- 'no-lone-blocks': 'error',
95
- 'no-loop-func': 'error',
96
- 'no-magic-numbers': 'off',
97
- 'no-multi-spaces': 'error',
98
- 'no-multi-str': 'error',
99
- 'no-new': 'off',
100
- 'no-new-func': 'error',
101
- 'no-new-wrappers': 'error',
102
- 'no-octal': 'error',
103
- 'no-octal-escape': 'error',
104
- 'no-param-reassign': 'error',
105
- 'no-proto': 'error',
106
- 'no-redeclare': 'error',
107
- 'no-restricted-properties': 'error',
108
- 'no-return-assign': 'error',
109
- 'no-return-await': 'error',
110
- 'no-script-url': 'error',
111
- 'no-self-assign': 'error',
112
- 'no-self-compare': 'error',
113
- 'no-sequences': 'error',
114
- 'no-throw-literal': 'error',
115
- 'no-unmodified-loop-condition': 'error',
116
- 'no-unused-expressions': 'error',
117
- 'no-unused-labels': 'error',
118
- 'no-useless-call': 'error',
119
- 'no-useless-concat': 'error',
120
- 'no-useless-escape': 'error',
121
- 'no-useless-return': 'error',
122
- 'no-void': 'error',
123
- 'no-warning-comments': 'error',
124
- 'no-with': 'error',
125
- 'prefer-promise-reject-errors': 'error',
126
- radix: 'error',
127
- 'require-await': 'error',
128
- 'vars-on-top': 'error',
129
- 'wrap-iife': 'error',
130
- yoda: 'error',
131
-
132
- // STRICT MODE - allow function-level strict mode for IIFEs
133
- strict: ['error', 'function'],
134
-
135
- // VARIABLES
136
- 'no-delete-var': 'error',
137
- 'no-label-var': 'error',
138
- 'no-restricted-globals': 'error',
139
- 'no-shadow': 'error',
140
- 'no-shadow-restricted-names': 'error',
141
- 'no-undef': 'warn',
142
- 'no-undef-init': 'error',
143
- 'no-undefined': 'error',
144
- 'no-unused-vars': 'error',
145
- 'no-use-before-define': 'error',
146
-
147
- // STYLISTIC ISSUES
148
- 'array-bracket-spacing': ['error', 'never'],
149
- 'block-spacing': 'error',
150
- 'brace-style': ['error', 'stroustrup'],
151
- camelcase: 'error',
152
- 'comma-dangle': ['error', 'never'],
153
- 'comma-spacing': 'error',
154
- 'comma-style': 'error',
155
- 'computed-property-spacing': ['error', 'never'],
156
- 'consistent-this': ['error', 'null'],
157
- 'eol-last': ['error', 'always'],
158
- 'func-call-spacing': ['error', 'never'],
159
- 'func-name-matching': ['error', 'always'],
160
- 'func-style': 'off',
161
- 'function-paren-newline': ['error', 'never'],
162
- indent: ['error', 2],
163
- 'key-spacing': ['error', {beforeColon: false, afterColon: true}],
164
- 'keyword-spacing': ['error', {after: true}],
165
- 'linebreak-style': ['error', 'unix'],
166
- 'lines-between-class-members': ['error', 'always'],
167
- 'max-depth': ['error', 4],
168
- 'max-len': ['error', 120, 4],
169
- 'max-nested-callbacks': ['error', 3],
170
- 'max-params': ['error', 5],
171
- 'max-statements': ['error', 30],
172
- 'max-statements-per-line': ['error', {max: 2}],
173
- 'multiline-comment-style': ['error', 'starred-block'],
174
- 'new-cap': 'error',
175
- 'new-parens': 'error',
176
- 'no-array-constructor': 'error',
177
- 'no-bitwise': 'error',
178
- 'no-lonely-if': 'error',
179
- 'no-mixed-spaces-and-tabs': 'error',
180
- 'no-multiple-empty-lines': ['error', {max: 1, maxBOF: 0, maxEOF: 0}],
181
- 'no-negated-condition': 'error',
182
- 'no-nested-ternary': 'error',
183
- 'no-new-object': 'error',
184
- 'no-tabs': 'error',
185
- 'no-trailing-spaces': 'error',
186
- 'no-unneeded-ternary': 'error',
187
- 'no-whitespace-before-property': 'error',
188
- 'nonblock-statement-body-position': ['error', 'beside'],
189
- 'object-curly-spacing': ['error', 'never'],
190
- 'operator-assignment': ['error', 'always'],
191
- 'operator-linebreak': 'error',
192
- 'padded-blocks': ['error', 'never'],
193
- 'padding-line-between-statements': [
194
- 'error',
195
- {blankLine: 'always', prev: '*', next: 'block'},
196
- {blankLine: 'always', prev: '*', next: 'block'},
197
- {blankLine: 'always', prev: '*', next: 'class'},
198
- {blankLine: 'always', prev: '*', next: 'export'},
199
- {blankLine: 'always', prev: '*', next: 'multiline-block-like'},
200
- {blankLine: 'always', prev: 'block', next: '*'},
201
- {blankLine: 'always', prev: 'block-like', next: '*'},
202
- {blankLine: 'always', prev: 'class', next: '*'},
203
- {blankLine: 'always', prev: 'default', next: '*'},
204
- {blankLine: 'always', prev: 'multiline-block-like', next: '*'},
205
- {blankLine: 'never', prev: 'import', next: 'import'}
206
- ],
207
- 'quote-props': ['error', 'as-needed'],
208
- quotes: ['error', 'single'],
209
- semi: ['error', 'always'],
210
- 'semi-spacing': ['error', {before: false, after: true}],
211
- 'semi-style': ['error', 'last'],
212
- 'space-before-blocks': ['error', 'always'],
213
- 'space-before-function-paren': ['error', 'never'],
214
- 'space-in-parens': ['error', 'never'],
215
- 'space-infix-ops': 'error',
216
- 'space-unary-ops': ['error', {words: true, nonwords: false}],
217
- 'spaced-comment': ['error', 'always'],
218
- 'switch-colon-spacing': ['error', {before: false, after: true}],
219
- 'template-tag-spacing': ['error', 'always'],
220
- 'unicode-bom': ['error', 'never'],
221
- 'wrap-regex': 'error',
222
-
223
- // ES6+ rules - disabled for older browser compatibility
224
- 'no-var': 'off',
225
- 'prefer-const': 'off',
226
- 'prefer-arrow-callback': 'off',
227
- 'prefer-rest-params': 'off',
228
- 'prefer-spread': 'off',
229
- 'prefer-template': 'off'
230
- }
231
- }
232
- ];
data/package.json DELETED
@@ -1,14 +0,0 @@
1
- {
2
- "name": "cloudflare-turnstile-rails",
3
- "private": true,
4
- "type": "module",
5
- "scripts": {
6
- "lint": "eslint .",
7
- "lint:fix": "eslint . --fix"
8
- },
9
- "devDependencies": {
10
- "@eslint/js": "^9.17.0",
11
- "eslint": "^9.17.0",
12
- "globals": "^15.14.0"
13
- }
14
- }