Skip to content

Commit f74a212

Browse files
ursmclaude
andcommitted
Initial implementation
Automatically vendor CSS files when pinning packages with importmap-rails. If a pinned package declares a style field in its package.json, the corresponding CSS file is downloaded to vendor/stylesheets/. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
0 parents  commit f74a212

12 files changed

Lines changed: 547 additions & 0 deletions

File tree

.github/workflows/test.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
name: Test
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
8+
jobs:
9+
test:
10+
runs-on: ubuntu-latest
11+
strategy:
12+
fail-fast: false
13+
matrix:
14+
ruby: ['3.3', '3.4', '4.0']
15+
rails: ['7.2', '8.0', '8.1']
16+
exclude:
17+
- ruby: '4.0'
18+
rails: '7.2'
19+
- ruby: '4.0'
20+
rails: '8.0'
21+
env:
22+
RAILS_VERSION: ${{ matrix.rails }}
23+
steps:
24+
- uses: actions/checkout@v4
25+
- uses: ruby/setup-ruby@v1
26+
with:
27+
ruby-version: ${{ matrix.ruby }}
28+
bundler-cache: true
29+
- run: bundle exec rake test

Gemfile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
source 'https://rubygems.org'
2+
3+
gemspec
4+
5+
if (rails_version = ENV['RAILS_VERSION'])
6+
gem 'railties', "~> #{rails_version}.0"
7+
end
8+
9+
gem 'webmock'

Gemfile.lock

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
PATH
2+
remote: .
3+
specs:
4+
importmap-rails-css (0.1.0)
5+
importmap-rails (>= 2.0)
6+
railties (>= 7.0)
7+
8+
GEM
9+
remote: https://rubygems.org/
10+
specs:
11+
actionpack (8.1.3)
12+
actionview (= 8.1.3)
13+
activesupport (= 8.1.3)
14+
nokogiri (>= 1.8.5)
15+
rack (>= 2.2.4)
16+
rack-session (>= 1.0.1)
17+
rack-test (>= 0.6.3)
18+
rails-dom-testing (~> 2.2)
19+
rails-html-sanitizer (~> 1.6)
20+
useragent (~> 0.16)
21+
actionview (8.1.3)
22+
activesupport (= 8.1.3)
23+
builder (~> 3.1)
24+
erubi (~> 1.11)
25+
rails-dom-testing (~> 2.2)
26+
rails-html-sanitizer (~> 1.6)
27+
activesupport (8.1.3)
28+
base64
29+
bigdecimal
30+
concurrent-ruby (~> 1.0, >= 1.3.1)
31+
connection_pool (>= 2.2.5)
32+
drb
33+
i18n (>= 1.6, < 2)
34+
json
35+
logger (>= 1.4.2)
36+
minitest (>= 5.1)
37+
securerandom (>= 0.3)
38+
tzinfo (~> 2.0, >= 2.0.5)
39+
uri (>= 0.13.1)
40+
addressable (2.8.9)
41+
public_suffix (>= 2.0.2, < 8.0)
42+
base64 (0.3.0)
43+
bigdecimal (4.1.0)
44+
builder (3.3.0)
45+
concurrent-ruby (1.3.6)
46+
connection_pool (3.0.2)
47+
crack (1.0.1)
48+
bigdecimal
49+
rexml
50+
crass (1.0.6)
51+
date (3.5.1)
52+
drb (2.2.3)
53+
erb (6.0.2)
54+
erubi (1.13.1)
55+
hashdiff (1.2.1)
56+
i18n (1.14.8)
57+
concurrent-ruby (~> 1.0)
58+
importmap-rails (2.2.3)
59+
actionpack (>= 6.0.0)
60+
activesupport (>= 6.0.0)
61+
railties (>= 6.0.0)
62+
io-console (0.8.2)
63+
irb (1.17.0)
64+
pp (>= 0.6.0)
65+
prism (>= 1.3.0)
66+
rdoc (>= 4.0.0)
67+
reline (>= 0.4.2)
68+
json (2.19.3)
69+
logger (1.7.0)
70+
loofah (2.25.1)
71+
crass (~> 1.0.2)
72+
nokogiri (>= 1.12.0)
73+
minitest (6.0.3)
74+
drb (~> 2.0)
75+
prism (~> 1.5)
76+
nokogiri (1.19.2-aarch64-linux-gnu)
77+
racc (~> 1.4)
78+
nokogiri (1.19.2-aarch64-linux-musl)
79+
racc (~> 1.4)
80+
nokogiri (1.19.2-arm-linux-gnu)
81+
racc (~> 1.4)
82+
nokogiri (1.19.2-arm-linux-musl)
83+
racc (~> 1.4)
84+
nokogiri (1.19.2-arm64-darwin)
85+
racc (~> 1.4)
86+
nokogiri (1.19.2-x86_64-darwin)
87+
racc (~> 1.4)
88+
nokogiri (1.19.2-x86_64-linux-gnu)
89+
racc (~> 1.4)
90+
nokogiri (1.19.2-x86_64-linux-musl)
91+
racc (~> 1.4)
92+
pp (0.6.3)
93+
prettyprint
94+
prettyprint (0.2.0)
95+
prism (1.9.0)
96+
psych (5.3.1)
97+
date
98+
stringio
99+
public_suffix (7.0.5)
100+
racc (1.8.1)
101+
rack (3.2.6)
102+
rack-session (2.1.1)
103+
base64 (>= 0.1.0)
104+
rack (>= 3.0.0)
105+
rack-test (2.2.0)
106+
rack (>= 1.3)
107+
rackup (2.3.1)
108+
rack (>= 3)
109+
rails-dom-testing (2.3.0)
110+
activesupport (>= 5.0.0)
111+
minitest
112+
nokogiri (>= 1.6)
113+
rails-html-sanitizer (1.7.0)
114+
loofah (~> 2.25)
115+
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
116+
railties (8.1.3)
117+
actionpack (= 8.1.3)
118+
activesupport (= 8.1.3)
119+
irb (~> 1.13)
120+
rackup (>= 1.0.0)
121+
rake (>= 12.2)
122+
thor (~> 1.0, >= 1.2.2)
123+
tsort (>= 0.2)
124+
zeitwerk (~> 2.6)
125+
rake (13.3.1)
126+
rdoc (7.2.0)
127+
erb
128+
psych (>= 4.0.0)
129+
tsort
130+
reline (0.6.3)
131+
io-console (~> 0.5)
132+
rexml (3.4.4)
133+
securerandom (0.4.1)
134+
stringio (3.2.0)
135+
thor (1.5.0)
136+
tsort (0.2.0)
137+
tzinfo (2.0.6)
138+
concurrent-ruby (~> 1.0)
139+
uri (1.1.1)
140+
useragent (0.16.11)
141+
webmock (3.26.2)
142+
addressable (>= 2.8.0)
143+
crack (>= 0.3.2)
144+
hashdiff (>= 0.4.0, < 2.0.0)
145+
zeitwerk (2.7.5)
146+
147+
PLATFORMS
148+
aarch64-linux-gnu
149+
aarch64-linux-musl
150+
arm-linux-gnu
151+
arm-linux-musl
152+
arm64-darwin
153+
x86_64-darwin
154+
x86_64-linux-gnu
155+
x86_64-linux-musl
156+
157+
DEPENDENCIES
158+
importmap-rails-css!
159+
webmock
160+
161+
CHECKSUMS
162+
actionpack (8.1.3) sha256=af998cae4d47c5d581a2cc363b5c77eb718b7c4b45748d81b1887b25621c29a3
163+
actionview (8.1.3) sha256=1347c88c7f3edb38100c5ce0e9fb5e62d7755f3edc1b61cce2eb0b2c6ea2fd5d
164+
activesupport (8.1.3) sha256=21a5e0dfbd4c3ddd9e1317ec6a4d782fa226e7867dc70b0743acda81a1dca20e
165+
addressable (2.8.9) sha256=cc154fcbe689711808a43601dee7b980238ce54368d23e127421753e46895485
166+
base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
167+
bigdecimal (4.1.0) sha256=6dc07767aa3dc456ccd48e7ae70a07b474e9afd7c5bc576f80bd6da5c8dd6cae
168+
builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f
169+
concurrent-ruby (1.3.6) sha256=6b56837e1e7e5292f9864f34b69c5a2cbc75c0cf5338f1ce9903d10fa762d5ab
170+
connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
171+
crack (1.0.1) sha256=ff4a10390cd31d66440b7524eb1841874db86201d5b70032028553130b6d4c7e
172+
crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d
173+
date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
174+
drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
175+
erb (6.0.2) sha256=9fe6264d44f79422c87490a1558479bd0e7dad4dd0e317656e67ea3077b5242b
176+
erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9
177+
hashdiff (1.2.1) sha256=9c079dbc513dfc8833ab59c0c2d8f230fa28499cc5efb4b8dd276cf931457cd1
178+
i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5
179+
importmap-rails (2.2.3) sha256=7101be2a4dc97cf1558fb8f573a718404c5f6bcfe94f304bf1f39e444feeb16a
180+
importmap-rails-css (0.1.0)
181+
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
182+
irb (1.17.0) sha256=168c4ddb93d8a361a045c41d92b2952c7a118fa73f23fe14e55609eb7a863aae
183+
json (2.19.3) sha256=289b0bb53052a1fa8c34ab33cc750b659ba14a5c45f3fcf4b18762dc67c78646
184+
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
185+
loofah (2.25.1) sha256=d436c73dbd0c1147b16c4a41db097942d217303e1f7728704b37e4df9f6d2e04
186+
minitest (6.0.3) sha256=88ac8a1de36c00692420e7cb3cc11a0773bbcb126aee1c249f320160a7d11411
187+
nokogiri (1.19.2-aarch64-linux-gnu) sha256=c34d5c8208025587554608e98fd88ab125b29c80f9352b821964e9a5d5cfbd19
188+
nokogiri (1.19.2-aarch64-linux-musl) sha256=7f6b4b0202d507326841a4f790294bf75098aef50c7173443812e3ac5cb06515
189+
nokogiri (1.19.2-arm-linux-gnu) sha256=b7fa1139016f3dc850bda1260988f0d749934a939d04ef2da13bec060d7d5081
190+
nokogiri (1.19.2-arm-linux-musl) sha256=61114d44f6742ff72194a1b3020967201e2eb982814778d130f6471c11f9828c
191+
nokogiri (1.19.2-arm64-darwin) sha256=58d8ea2e31a967b843b70487a44c14c8ba1866daa1b9da9be9dbdf1b43dee205
192+
nokogiri (1.19.2-x86_64-darwin) sha256=7d9af11fda72dfaa2961d8c4d5380ca0b51bc389dc5f8d4b859b9644f195e7a4
193+
nokogiri (1.19.2-x86_64-linux-gnu) sha256=fa8feca882b73e871a9845f3817a72e9734c8e974bdc4fbad6e4bc6e8076b94f
194+
nokogiri (1.19.2-x86_64-linux-musl) sha256=93128448e61a9383a30baef041bf1f5817e22f297a1d400521e90294445069a8
195+
pp (0.6.3) sha256=2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6
196+
prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
197+
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
198+
psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974
199+
public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
200+
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
201+
rack (3.2.6) sha256=5ed78e1f73b2e25679bec7d45ee2d4483cc4146eb1be0264fc4d94cb5ef212c2
202+
rack-session (2.1.1) sha256=0b6dc07dea7e4b583f58a48e8b806d4c9f1c6c9214ebc202ec94562cbea2e4e9
203+
rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463
204+
rackup (2.3.1) sha256=6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868
205+
rails-dom-testing (2.3.0) sha256=8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d
206+
rails-html-sanitizer (1.7.0) sha256=28b145cceaf9cc214a9874feaa183c3acba036c9592b19886e0e45efc62b1e89
207+
railties (8.1.3) sha256=913eb0e0cb520aac687ffd74916bd726d48fa21f47833c6292576ef6a286de22
208+
rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c
209+
rdoc (7.2.0) sha256=8650f76cd4009c3b54955eb5d7e3a075c60a57276766ebf36f9085e8c9f23192
210+
reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835
211+
rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142
212+
securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
213+
stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1
214+
thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73
215+
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
216+
tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
217+
uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6
218+
useragent (0.16.11) sha256=700e6413ad4bb954bb63547fa098dddf7b0ebe75b40cc6f93b8d54255b173844
219+
webmock (3.26.2) sha256=774556f2ea6371846cca68c01769b2eac0d134492d21f6d0ab5dd643965a4c90
220+
zeitwerk (2.7.5) sha256=d8da92128c09ea6ec62c949011b00ed4a20242b255293dd66bf41545398f73dd
221+
222+
BUNDLED WITH
223+
4.0.9

README.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# importmap-rails-css
2+
3+
Automatically vendors CSS files when pinning packages with [importmap-rails](https://github.com/rails/importmap-rails). If a pinned package declares a `style` field in its `package.json`, the corresponding CSS file is downloaded to `vendor/stylesheets/`.
4+
5+
## Installation
6+
7+
Add to your Gemfile:
8+
9+
```ruby
10+
gem 'importmap-rails-css'
11+
```
12+
13+
## Usage
14+
15+
Just run `bin/importmap pin` as usual:
16+
17+
```
18+
$ bin/importmap pin flatpickr
19+
Pinning "flatpickr" to vendor/javascript/flatpickr.js via download from https://ga.jspm.io/npm:flatpickr@4.6.13/dist/flatpickr.js
20+
Pinning CSS "flatpickr" to vendor/stylesheets/flatpickr.css via download from https://cdn.jsdelivr.net/npm/flatpickr@4.6.13/dist/flatpickr.css
21+
```
22+
23+
`bin/importmap update` and `bin/importmap pristine` also download CSS in the same way.
24+
25+
`bin/importmap unpin` removes the corresponding CSS file as well.
26+
27+
Packages without a `style` field in their `package.json` are silently skipped.
28+
29+
## Where CSS files are placed
30+
31+
Downloaded CSS files go into `vendor/stylesheets/`. This directory is automatically added to the asset path by the gem's Engine, so you can link them with `stylesheet_link_tag`:
32+
33+
```erb
34+
<%= stylesheet_link_tag 'flatpickr' %>
35+
```
36+
37+
## License
38+
39+
MIT

Rakefile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
require 'rake/testtask'
2+
3+
Rake::TestTask.new(:test) do |t|
4+
t.libs << 'test'
5+
t.pattern = 'test/**/*_test.rb'
6+
end
7+
8+
task default: :test

importmap-rails-css.gemspec

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
require_relative 'lib/importmap_rails_css/version'
2+
3+
Gem::Specification.new do |spec|
4+
spec.name = 'importmap-rails-css'
5+
spec.version = ImportmapRailsCss::VERSION
6+
spec.authors = ['ursm']
7+
8+
spec.summary = 'Automatically vendor CSS from pinned importmap packages'
9+
spec.homepage = 'https://github.com/ursm/importmap-rails-css'
10+
spec.license = 'MIT'
11+
12+
spec.required_ruby_version = '>= 3.3'
13+
14+
spec.files = Dir['lib/**/*', 'LICENSE', 'README.md']
15+
16+
spec.add_dependency 'importmap-rails', '>= 2.0'
17+
spec.add_dependency 'railties', '>= 7.0'
18+
19+
end

lib/importmap-rails-css.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
require 'importmap-rails'
2+
require 'importmap/packager'
3+
4+
require_relative 'importmap_rails_css/version'
5+
require_relative 'importmap_rails_css/packager_extension'
6+
require_relative 'importmap_rails_css/engine'
7+
8+
Importmap::Packager.prepend ImportmapRailsCss::PackagerExtension

lib/importmap_rails_css/engine.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module ImportmapRailsCss
2+
class Engine < ::Rails::Engine
3+
initializer 'importmap_rails_css.assets' do |app|
4+
if app.config.respond_to?(:assets)
5+
app.config.assets.paths << Rails.root.join('vendor/stylesheets')
6+
end
7+
end
8+
end
9+
end

0 commit comments

Comments
 (0)