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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 42843fb0b96e9dcd1bad0a4717c11c86491c41d664af9d397c03987df2ec02ad
4
- data.tar.gz: 89bd283fe6e91eba3d6788bed02765f40e5945930acaab542f1bc53d5c8bd8f0
3
+ metadata.gz: 2bc35467ae9c71f396f1168a6c900f8a828e87ad9491b99abd0f07c3ebfe49ab
4
+ data.tar.gz: 477cb07d1fda946dfccea4181327a4a5c8ce978998c2183a7fd7b38f1fd1ff6d
5
5
  SHA512:
6
- metadata.gz: f5443f3cf50c7912b52bc919a9acdbcb142255d8be9d8c161d54370ced1a6d10ffb7a290fa6af9b925bfa88289a03ea34673f10a743bb6339d9a83705b4d2f1d
7
- data.tar.gz: 8803b33d5a96ba7329bf9d83ddd8ca2d6c635e9862f1fc76fc5606cc29de5061c84628ea87115ac780847ab35c71e5b3cb15e5dfdb117a0c349e9ccaf225117a
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 "Link gem JS into node_modules for jsbundling compatibility"
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 = gem_spec.gem_dir
8
- link_path = Rails.root.join("node_modules", "upload_d_n_d")
9
+ gem_path = gem_spec.gem_dir
10
+ dest = Rails.root.join("node_modules", "upload_d_n_d")
9
11
 
10
- unless link_path.exist?
11
- FileUtils.mkdir_p(link_path.dirname)
12
- FileUtils.ln_s(gem_path, link_path.to_s)
13
- puts "upload_d_n_d: linked JS #{link_path} → #{gem_path}"
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
@@ -1,3 +1,3 @@
1
1
  module UploadDND
2
- VERSION = "0.9.2"
2
+ VERSION = "0.9.4"
3
3
  end
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.2
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