upload_d_n_d 0.9.2 → 0.9.4
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 +4 -4
- data/README.md +2 -0
- data/docs/CHANGELOG.md +18 -0
- data/lib/tasks/upload_d_n_d_tasks.rake +12 -7
- data/lib/upload_d_n_d/js_link.rb +114 -0
- data/lib/upload_d_n_d/version.rb +1 -1
- data/lib/upload_d_n_d.rb +1 -0
- data/package.json +19 -0
- metadata +3 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2bc35467ae9c71f396f1168a6c900f8a828e87ad9491b99abd0f07c3ebfe49ab
|
|
4
|
+
data.tar.gz: 477cb07d1fda946dfccea4181327a4a5c8ce978998c2183a7fd7b38f1fd1ff6d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: '09adbe224dd2403b21da5e590e667686dea3c514f9c6c5a11f8cd2b528cf2506883cc283e99b916795afaf9a3278b7ff31c8aa9de41cb8a2ff3b403c5c947d29'
|
|
7
|
+
data.tar.gz: b5427eda02e120647c435f27df467126cbe24faa060260cd71833b02c57f4aa5adca316db0f6354606b20e632113eb1a48edeba72b8c5928aa94270ee44818fa
|
data/README.md
CHANGED
|
@@ -55,6 +55,8 @@ The installer adds `view_component` and `stimulus-rails` if missing, creates the
|
|
|
55
55
|
|
|
56
56
|
Everything else (JS, CSS, components, concerns) is served from the gem: upgrading is a `bundle update`.
|
|
57
57
|
|
|
58
|
+
With **jsbundling-rails** (bun/esbuild), the `upload_d_n_d:link_js` task copies the gem's JS/CSS into `node_modules/upload_d_n_d` so your bundler can resolve `import "upload_d_n_d"` and `@import "upload_d_n_d/styles"`. It is a real directory (not a symlink), so the gem's own imports of `@hotwired/stimulus` and `@rails/activestorage` resolve against your app's `node_modules`. The task runs automatically on `javascript:build` (so `assets:precompile` at deploy is always up to date). Note: a watch-mode dev server such as `bin/dev` calls the bundler directly and does **not** run the task, so after upgrading the gem run `bin/rails javascript:build` once locally to refresh the copy.
|
|
59
|
+
|
|
58
60
|
ActiveStorage must be installed (`bin/rails active_storage:install`). With an external S3-like bucket and a strict CSP, serve files same-origin:
|
|
59
61
|
|
|
60
62
|
```ruby
|
data/docs/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.9.4] - 2026-10-29
|
|
11
|
+
|
|
12
|
+
`link_js` copie le JS/CSS dans `node_modules` au lieu d'un lien symbolique, pour que les imports tiers de la gem se résolvent dans l'app (jsbundling/bun/esbuild). Patch, sans changement d'API.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
- **`upload_d_n_d:link_js` copie désormais le JS au lieu de créer un lien symbolique** — le JS de la gem importe `@hotwired/stimulus` et `@rails/activestorage`, que l'app hôte fournit dans ses propres `node_modules`. Avec un lien symbolique, le bundler (bun/esbuild) résolvait ces imports depuis le `realpath` du lien (le dossier de la gem, hors de l'app) et ne les trouvait pas — la compilation échouait (y compris à la construction de l'image de déploiement). La tâche copie maintenant `package.json` et les fichiers des `exports` dans `node_modules/upload_d_n_d` (vrai dossier), ce qui laisse la résolution remonter jusqu'aux dépendances de l'app. La copie est rafraîchie quand la version de la gem change ; un dossier ou fichier **non géré par la gem** (ex. paquet npm) n'est jamais supprimé (avertissement). Un ancien lien symbolique (gem ≤ 0.9.3) est remplacé par la copie au premier `rake upload_d_n_d:link_js` (ou `javascript:build`).
|
|
16
|
+
|
|
17
|
+
### Migration
|
|
18
|
+
- Les apps qui avaient ajouté `NODE_PATH=node_modules` à leur script de build pour contourner le problème en 0.9.3 peuvent **retirer ce réglage** après passage en 0.9.4 : la copie rend la résolution correcte sans configuration côté app.
|
|
19
|
+
|
|
20
|
+
## [0.9.3] - 2026-10-29
|
|
21
|
+
|
|
22
|
+
Correctifs d'empaquetage pour la consommation de la gem via jsbundling (bun/esbuild) et Tailwind. Patch, sans changement d'API.
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
- **Paquet publié : `package.json` manquant** — la liste de fichiers du gemspec n'incluait pas `package.json`, absent de la gem publiée. Les apps qui compilent leurs assets avec jsbundling (bun/esbuild) et Tailwind ne pouvaient plus résoudre `import "upload_d_n_d"` ni `@import "upload_d_n_d/styles"` via `node_modules/upload_d_n_d` (« Could not resolve "upload_d_n_d" », « Can't resolve 'upload_d_n_d/styles' »). `package.json` est désormais embarqué ; un test construit la gem (`gem build`) et vérifie sa présence ainsi que celle des fichiers déclarés dans ses `exports`.
|
|
26
|
+
- **`upload_d_n_d:link_js` ne mettait pas le lien à jour** — la tâche ne (re)créait le lien `node_modules/upload_d_n_d` que lorsqu'il était absent (`exist?` suit le lien). Lors d'une montée de version, l'ancien lien vers la copie précédente de la gem était conservé ; si l'ancienne cible avait disparu, le lien cassé faisait échouer `ln_s` (lien déjà présent). La tâche compare désormais la cible **résolue** du lien au répertoire de la gem courante (résolution des deux chemins, pour qu'un chemin relatif ou un lien intermédiaire ne déclenche pas un remplacement inutile) et le remplace s'il diffère ou est cassé. Un vrai dossier ou fichier à cet emplacement (ex. paquet installé par npm) n'est **jamais** supprimé : la tâche avertit et le laisse en place. Logique extraite dans `UploadDND::JsLink`, idempotente.
|
|
27
|
+
|
|
10
28
|
## [0.9.2] - 2026-10-29
|
|
11
29
|
|
|
12
30
|
Reconnaissance des formats `.ods`/`.heic`/`.heif` et affichage des extensions (au lieu des types MIME bruts) sous la zone de dépôt. Patch, sans changement d'API.
|
|
@@ -1,16 +1,21 @@
|
|
|
1
|
+
require "upload_d_n_d/js_link"
|
|
2
|
+
|
|
1
3
|
namespace :upload_d_n_d do
|
|
2
|
-
desc "
|
|
4
|
+
desc "Copy gem JS into node_modules for jsbundling compatibility"
|
|
3
5
|
task :link_js do
|
|
4
6
|
gem_spec = Gem.loaded_specs["upload_d_n_d"]
|
|
5
7
|
next unless gem_spec
|
|
6
8
|
|
|
7
|
-
gem_path
|
|
8
|
-
|
|
9
|
+
gem_path = gem_spec.gem_dir
|
|
10
|
+
dest = Rails.root.join("node_modules", "upload_d_n_d")
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
case UploadDND::JsLink.sync(source: gem_path, dest: dest)
|
|
13
|
+
when :created then puts "upload_d_n_d: copied JS → #{dest}"
|
|
14
|
+
when :updated then puts "upload_d_n_d: updated JS → #{dest}"
|
|
15
|
+
when :conflict
|
|
16
|
+
warn "upload_d_n_d: #{dest} existe et n'est pas géré par la gem ; " \
|
|
17
|
+
"laissé tel quel (rien supprimé). Retirez-le pour permettre à " \
|
|
18
|
+
"`rake upload_d_n_d:link_js` d'y copier le JS de la gem."
|
|
14
19
|
end
|
|
15
20
|
end
|
|
16
21
|
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "fileutils"
|
|
4
|
+
require "json"
|
|
5
|
+
|
|
6
|
+
module UploadDND
|
|
7
|
+
# Synchronise `node_modules/upload_d_n_d` avec le JS/CSS de la gem
|
|
8
|
+
# (`package.json` + les fichiers de ses `exports`) en les **copiant**.
|
|
9
|
+
#
|
|
10
|
+
# Pourquoi une copie et non un lien symbolique : le JS de la gem importe des
|
|
11
|
+
# bibliothèques tierces (`@hotwired/stimulus`, `@rails/activestorage`) que
|
|
12
|
+
# l'app hôte fournit dans ses propres `node_modules`. Un lien symbolique est
|
|
13
|
+
# résolu vers son `realpath` (le dossier de la gem, hors de l'app) et la
|
|
14
|
+
# résolution de ces imports y échoue. Un vrai dossier sous les `node_modules`
|
|
15
|
+
# de l'app laisse la résolution remonter jusqu'aux dépendances de l'app.
|
|
16
|
+
#
|
|
17
|
+
# La copie est rafraîchie quand la version de la gem change. Un dossier ou
|
|
18
|
+
# fichier **non géré par la gem** (ex. paquet installé par npm) n'est jamais
|
|
19
|
+
# supprimé : la méthode signale un conflit et laisse l'appelant avertir.
|
|
20
|
+
module JsLink
|
|
21
|
+
PACKAGE_NAME = "upload_d_n_d"
|
|
22
|
+
|
|
23
|
+
module_function
|
|
24
|
+
|
|
25
|
+
# Copie/rafraîchit le JS de la gem depuis `source` (gem_dir) vers `dest`
|
|
26
|
+
# (node_modules/upload_d_n_d).
|
|
27
|
+
#
|
|
28
|
+
# @param source [String, Pathname] répertoire de la gem (gem_dir)
|
|
29
|
+
# @param dest [String, Pathname] destination dans node_modules
|
|
30
|
+
# @return [Symbol] :created, :updated, :unchanged ou :conflict
|
|
31
|
+
def sync(source:, dest:)
|
|
32
|
+
source = source.to_s
|
|
33
|
+
dest = dest.to_s
|
|
34
|
+
|
|
35
|
+
if File.symlink?(dest)
|
|
36
|
+
replace(source, dest) # ancien lien symbolique (gem <= 0.9.3)
|
|
37
|
+
:updated
|
|
38
|
+
elsif File.directory?(dest)
|
|
39
|
+
return :conflict unless ours?(dest) # dossier étranger : on n'y touche jamais
|
|
40
|
+
return :unchanged if same_version?(source, dest)
|
|
41
|
+
|
|
42
|
+
replace(source, dest) # notre copie, version périmée
|
|
43
|
+
:updated
|
|
44
|
+
elsif File.exist?(dest)
|
|
45
|
+
:conflict # fichier étranger
|
|
46
|
+
else
|
|
47
|
+
copy(source, dest)
|
|
48
|
+
:created
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Le dossier est-il une copie gérée par la gem (et non un paquet étranger) ?
|
|
53
|
+
def ours?(dest)
|
|
54
|
+
pkg = File.join(dest, "package.json")
|
|
55
|
+
File.file?(pkg) && read_json(pkg)["name"] == PACKAGE_NAME
|
|
56
|
+
rescue JSON::ParserError
|
|
57
|
+
false
|
|
58
|
+
end
|
|
59
|
+
private_class_method :ours?
|
|
60
|
+
|
|
61
|
+
def same_version?(source, dest)
|
|
62
|
+
read_json(File.join(source, "package.json"))["version"] ==
|
|
63
|
+
read_json(File.join(dest, "package.json"))["version"]
|
|
64
|
+
end
|
|
65
|
+
private_class_method :same_version?
|
|
66
|
+
|
|
67
|
+
def replace(source, dest)
|
|
68
|
+
FileUtils.remove_entry(dest)
|
|
69
|
+
copy(source, dest)
|
|
70
|
+
end
|
|
71
|
+
private_class_method :replace
|
|
72
|
+
|
|
73
|
+
# Copie `package.json` et les fichiers référencés par ses `exports`, en
|
|
74
|
+
# conservant leurs chemins relatifs (les `exports` les désignent ainsi).
|
|
75
|
+
def copy(source, dest)
|
|
76
|
+
package_files(source).each do |rel|
|
|
77
|
+
from = File.join(source, rel)
|
|
78
|
+
to = File.join(dest, rel)
|
|
79
|
+
FileUtils.mkdir_p(File.dirname(to))
|
|
80
|
+
FileUtils.cp(from, to)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
private_class_method :copy
|
|
84
|
+
|
|
85
|
+
def package_files(source)
|
|
86
|
+
exports = read_json(File.join(source, "package.json"))["exports"] || {}
|
|
87
|
+
targets = []
|
|
88
|
+
collect = lambda do |value|
|
|
89
|
+
case value
|
|
90
|
+
when String then targets << value
|
|
91
|
+
when Hash then value.each_value(&collect)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
exports.each_value(&collect)
|
|
95
|
+
|
|
96
|
+
files = [ "package.json" ]
|
|
97
|
+
targets.each do |target|
|
|
98
|
+
rel = target.sub(%r{\A\./}, "")
|
|
99
|
+
if rel.include?("*")
|
|
100
|
+
Dir.glob(File.join(source, rel)).each { |path| files << path.sub("#{source}/", "") }
|
|
101
|
+
else
|
|
102
|
+
files << rel
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
files.uniq
|
|
106
|
+
end
|
|
107
|
+
private_class_method :package_files
|
|
108
|
+
|
|
109
|
+
def read_json(path)
|
|
110
|
+
JSON.parse(File.read(path))
|
|
111
|
+
end
|
|
112
|
+
private_class_method :read_json
|
|
113
|
+
end
|
|
114
|
+
end
|
data/lib/upload_d_n_d/version.rb
CHANGED
data/lib/upload_d_n_d.rb
CHANGED
|
@@ -9,6 +9,7 @@ require "upload_d_n_d/rejected_blob"
|
|
|
9
9
|
require "upload_d_n_d/orphan_blobs"
|
|
10
10
|
require "upload_d_n_d/file_validator"
|
|
11
11
|
require "upload_d_n_d/mime_types"
|
|
12
|
+
require "upload_d_n_d/js_link"
|
|
12
13
|
require "upload_d_n_d/uploadable"
|
|
13
14
|
require "upload_d_n_d/controllers/uploadable"
|
|
14
15
|
|
data/package.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "upload_d_n_d",
|
|
3
|
+
"version": "0.9.4",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "app/javascript/upload_d_n_d/index.js",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": "./app/javascript/upload_d_n_d/index.js",
|
|
8
|
+
"./controllers/*": "./app/javascript/upload_d_n_d/controllers/*.js",
|
|
9
|
+
"./styles": {
|
|
10
|
+
"style": "./app/assets/stylesheets/upload_d_n_d/application.css"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@rails/activestorage": "^7.2.3"
|
|
15
|
+
},
|
|
16
|
+
"peerDependencies": {
|
|
17
|
+
"@hotwired/stimulus": "^3.0.0"
|
|
18
|
+
}
|
|
19
|
+
}
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: upload_d_n_d
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.9.
|
|
4
|
+
version: 0.9.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Pierre Cherbero
|
|
@@ -116,12 +116,14 @@ files:
|
|
|
116
116
|
- lib/upload_d_n_d/field_constraints.rb
|
|
117
117
|
- lib/upload_d_n_d/field_reference.rb
|
|
118
118
|
- lib/upload_d_n_d/file_validator.rb
|
|
119
|
+
- lib/upload_d_n_d/js_link.rb
|
|
119
120
|
- lib/upload_d_n_d/mime_types.rb
|
|
120
121
|
- lib/upload_d_n_d/orphan_blobs.rb
|
|
121
122
|
- lib/upload_d_n_d/rejected_blob.rb
|
|
122
123
|
- lib/upload_d_n_d/session_id.rb
|
|
123
124
|
- lib/upload_d_n_d/uploadable.rb
|
|
124
125
|
- lib/upload_d_n_d/version.rb
|
|
126
|
+
- package.json
|
|
125
127
|
homepage: https://github.com/Peyochanchan/upload_d_n_d
|
|
126
128
|
licenses:
|
|
127
129
|
- MIT
|