react-components-rails 1.0.0.beta2 → 1.0.0.beta3
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/Gemfile.lock +1 -1
- data/package.json +6 -9
- data/pnpm-lock.yaml +0 -14
- data/react-components-rails.gemspec +1 -1
- data/src/index.ts +85 -62
- data/tsconfig.json +1 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b0c3195d86d0560cf12133385cef8ea31ab04781fef04127f548d8aa57586ef0
|
|
4
|
+
data.tar.gz: 7c733c62ce9dc6592afa462563ab8882aaf9a003e6aec95c403cfbeb1479ea3c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 17d30edf163397119ab79c3119d43c44be8d8851b0b35a7025ca7002ea77a79c258f0d2ff92bbf01b1085e7b36fa8e131e8b724a12955aa84b6137da1def3aa4
|
|
7
|
+
data.tar.gz: e967f7206ba91fdd642addeae9f581277300d2ddc30df20d7eecf4588757ef063e14e0139dde49e8d0cdece71f835e0e55954cf2728a407398c35a53aa385d70
|
data/Gemfile.lock
CHANGED
data/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-components-rails",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.3",
|
|
4
4
|
"homepage": "https://github.com/renchap/react-components-rails",
|
|
5
5
|
"repository": "renchap/react-components-rails",
|
|
6
6
|
"author": {
|
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
"email": "renchap@gmail.com"
|
|
9
9
|
},
|
|
10
10
|
"license": "MIT",
|
|
11
|
-
"type": "module",
|
|
12
11
|
"source": "src/index.ts",
|
|
13
12
|
"exports": {
|
|
14
|
-
"
|
|
15
|
-
"
|
|
13
|
+
"import": "./dist/index.mjs",
|
|
14
|
+
"require": "./dist/index.js",
|
|
15
|
+
"default": "./dist/index.mjs"
|
|
16
16
|
},
|
|
17
|
-
"main": "./dist/index.
|
|
17
|
+
"main": "./dist/index.js",
|
|
18
18
|
"types": "dist/index.d.ts",
|
|
19
19
|
"files": [
|
|
20
20
|
"dist/",
|
|
@@ -24,10 +24,7 @@
|
|
|
24
24
|
"build": "tsup src/index.ts --dts --sourcemap --format esm --target es6 --minify && tsup src/index.ts --sourcemap --format cjs --target es5 --minify",
|
|
25
25
|
"dev": "tsup watch"
|
|
26
26
|
},
|
|
27
|
-
"dependencies": {
|
|
28
|
-
"@types/lodash": "^4.14.182",
|
|
29
|
-
"lodash": "^4.17.21"
|
|
30
|
-
},
|
|
27
|
+
"dependencies": {},
|
|
31
28
|
"peerDependencies": {
|
|
32
29
|
"react": ">= 0.14",
|
|
33
30
|
"react-dom": ">= 0.14"
|
data/pnpm-lock.yaml
CHANGED
|
@@ -2,20 +2,14 @@ lockfileVersion: 5.4
|
|
|
2
2
|
|
|
3
3
|
specifiers:
|
|
4
4
|
'@swc/core': ^1.2.231
|
|
5
|
-
'@types/lodash': ^4.14.182
|
|
6
5
|
'@types/react': ^18.0.17
|
|
7
6
|
'@types/react-dom': ^18.0.6
|
|
8
|
-
lodash: ^4.17.21
|
|
9
7
|
prettier: ^2.7.1
|
|
10
8
|
react: ^18.2.0
|
|
11
9
|
react-dom: ^18.2.0
|
|
12
10
|
tsup: ^6.2.2
|
|
13
11
|
typescript: ^4.7.4
|
|
14
12
|
|
|
15
|
-
dependencies:
|
|
16
|
-
'@types/lodash': 4.14.182
|
|
17
|
-
lodash: 4.17.21
|
|
18
|
-
|
|
19
13
|
devDependencies:
|
|
20
14
|
'@swc/core': 1.2.231
|
|
21
15
|
'@types/react': 18.0.17
|
|
@@ -220,10 +214,6 @@ packages:
|
|
|
220
214
|
dev: true
|
|
221
215
|
optional: true
|
|
222
216
|
|
|
223
|
-
/@types/lodash/4.14.182:
|
|
224
|
-
resolution: {integrity: sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==}
|
|
225
|
-
dev: false
|
|
226
|
-
|
|
227
217
|
/@types/prop-types/15.7.5:
|
|
228
218
|
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
|
|
229
219
|
dev: true
|
|
@@ -733,10 +723,6 @@ packages:
|
|
|
733
723
|
resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==}
|
|
734
724
|
dev: true
|
|
735
725
|
|
|
736
|
-
/lodash/4.17.21:
|
|
737
|
-
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
|
|
738
|
-
dev: false
|
|
739
|
-
|
|
740
726
|
/loose-envify/1.4.0:
|
|
741
727
|
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
|
|
742
728
|
hasBin: true
|
|
@@ -6,7 +6,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
|
6
6
|
Gem::Specification.new do |spec|
|
|
7
7
|
spec.name = "react-components-rails"
|
|
8
8
|
spec.licenses = ["MIT"]
|
|
9
|
-
spec.version = "1.0.0.
|
|
9
|
+
spec.version = "1.0.0.beta3"
|
|
10
10
|
spec.authors = ["Renaud Chaput"]
|
|
11
11
|
spec.email = ["renchap@gmail.com"]
|
|
12
12
|
|
data/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from "react"
|
|
2
2
|
import ReactDOM from "react-dom"
|
|
3
3
|
import ReactDOMClient, { Root } from "react-dom/client"
|
|
4
|
-
|
|
4
|
+
|
|
5
5
|
// import ujs from './ujs'
|
|
6
6
|
|
|
7
7
|
const CLASS_ATTRIBUTE_NAME = "data-react-class"
|
|
@@ -9,66 +9,86 @@ const PROPS_ATTRIBUTE_NAME = "data-react-props"
|
|
|
9
9
|
|
|
10
10
|
declare global {
|
|
11
11
|
interface Window {
|
|
12
|
-
ReactComponentsRails:
|
|
12
|
+
ReactComponentsRails: ReactComponentsRails
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
registeredComponents
|
|
18
|
-
mountedRoots
|
|
19
|
-
ReactDOMClient
|
|
16
|
+
class ReactComponentsRails {
|
|
17
|
+
#registeredComponents = {} as { [name: string]: React.ComponentType }
|
|
18
|
+
#mountedRoots = [] as Root[]
|
|
19
|
+
#ReactDOMClient = undefined as
|
|
20
20
|
| typeof ReactDOM
|
|
21
21
|
| typeof ReactDOMClient
|
|
22
|
-
| undefined
|
|
22
|
+
| undefined
|
|
23
|
+
|
|
24
|
+
static getInstance() {
|
|
25
|
+
if (typeof window.ReactComponentsRails === "undefined") {
|
|
26
|
+
const instance = new ReactComponentsRails()
|
|
27
|
+
window.ReactComponentsRails = instance
|
|
28
|
+
|
|
29
|
+
// ujs.setup(this.mountComponents.bind(this), this.unmountComponents.bind(this))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return window.ReactComponentsRails
|
|
33
|
+
}
|
|
23
34
|
|
|
24
|
-
render(node: Element, component: React.ComponentType) {
|
|
35
|
+
private render(node: Element, component: React.ComponentType) {
|
|
25
36
|
const propsJson = node.getAttribute(PROPS_ATTRIBUTE_NAME)
|
|
26
37
|
const props = propsJson && JSON.parse(propsJson)
|
|
27
38
|
|
|
28
39
|
const reactElement = React.createElement(component, props)
|
|
29
40
|
|
|
30
|
-
if (this
|
|
31
|
-
if ("createRoot" in this
|
|
32
|
-
const root = this
|
|
41
|
+
if (this.#ReactDOMClient) {
|
|
42
|
+
if ("createRoot" in this.#ReactDOMClient) {
|
|
43
|
+
const root = this.#ReactDOMClient.createRoot(node)
|
|
33
44
|
root.render(reactElement)
|
|
34
|
-
this
|
|
45
|
+
this.#mountedRoots.push(root)
|
|
35
46
|
} else {
|
|
36
|
-
this
|
|
47
|
+
this.#ReactDOMClient.render(reactElement, node)
|
|
37
48
|
}
|
|
38
49
|
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
registerComponents(components: {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private registerComponents(components: {
|
|
53
|
+
[name: string]: React.ComponentType
|
|
54
|
+
}) {
|
|
55
|
+
const alreadyExisting: string[] = []
|
|
56
|
+
|
|
57
|
+
Object.keys(components).forEach((key) => {
|
|
58
|
+
if (this.#registeredComponents[key]) alreadyExisting.push(key)
|
|
59
|
+
else {
|
|
60
|
+
const comp = components[key]
|
|
61
|
+
this.#registeredComponents[key] = comp
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
if (alreadyExisting.length > 0) {
|
|
47
66
|
console.error(
|
|
48
|
-
`react-components-rails: can not register components. Following components are already registered: ${
|
|
67
|
+
`react-components-rails: can not register components. Following components are already registered: ${alreadyExisting.join(
|
|
68
|
+
", "
|
|
69
|
+
)}`
|
|
49
70
|
)
|
|
50
71
|
}
|
|
51
72
|
|
|
52
|
-
assign(this.registeredComponents, omit(components, collisions))
|
|
53
73
|
return true
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
unmountComponents() {
|
|
57
|
-
if (this.ReactDOMClient) {
|
|
58
|
-
if ("createRoot" in this.ReactDOMClient) {
|
|
59
|
-
this.mountedRoots.forEach((root) => root.unmount())
|
|
60
|
-
this.mountedRoots = []
|
|
61
|
-
} else {
|
|
62
|
-
const mounted = document.querySelectorAll(`[${CLASS_ATTRIBUTE_NAME}]`)
|
|
63
|
-
for (let i = 0; i < mounted.length; i += 1) {
|
|
64
|
-
this.ReactDOMClient.unmountComponentAtNode(mounted[i])
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
},
|
|
74
|
+
}
|
|
69
75
|
|
|
70
|
-
|
|
71
|
-
|
|
76
|
+
// Not used for now, useful for UJS
|
|
77
|
+
// private unmountComponents() {
|
|
78
|
+
// if (this.#ReactDOMClient) {
|
|
79
|
+
// if ("createRoot" in this.#ReactDOMClient) {
|
|
80
|
+
// this.#mountedRoots.forEach((root) => root.unmount())
|
|
81
|
+
// this.#mountedRoots = []
|
|
82
|
+
// } else {
|
|
83
|
+
// const mounted = document.querySelectorAll(`[${CLASS_ATTRIBUTE_NAME}]`)
|
|
84
|
+
// for (let i = 0; i < mounted.length; i += 1) {
|
|
85
|
+
// this.#ReactDOMClient.unmountComponentAtNode(mounted[i])
|
|
86
|
+
// }
|
|
87
|
+
// }
|
|
88
|
+
// }
|
|
89
|
+
// }
|
|
90
|
+
|
|
91
|
+
private mountComponents() {
|
|
72
92
|
const toMount = document.querySelectorAll(`[${CLASS_ATTRIBUTE_NAME}]`)
|
|
73
93
|
|
|
74
94
|
for (let i = 0; i < toMount.length; i += 1) {
|
|
@@ -82,7 +102,7 @@ const ReactComponentsRails = {
|
|
|
82
102
|
continue
|
|
83
103
|
}
|
|
84
104
|
|
|
85
|
-
const component = registeredComponents[className]
|
|
105
|
+
const component = this.#registeredComponents[className]
|
|
86
106
|
|
|
87
107
|
if (component) {
|
|
88
108
|
if (node.innerHTML.length === 0) this.render(node, component)
|
|
@@ -92,28 +112,31 @@ const ReactComponentsRails = {
|
|
|
92
112
|
)
|
|
93
113
|
}
|
|
94
114
|
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
async setup(components = {}) {
|
|
98
|
-
await this.loadReactDOMClient()
|
|
99
|
-
if (typeof window.ReactComponentsRails === "undefined") {
|
|
100
|
-
window.ReactComponentsRails = this
|
|
101
|
-
// ujs.setup(this.mountComponents.bind(this), this.unmountComponents.bind(this))
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
window.ReactComponentsRails.registerComponents(components)
|
|
105
|
-
window.ReactComponentsRails.mountComponents()
|
|
106
|
-
},
|
|
115
|
+
}
|
|
107
116
|
|
|
108
|
-
|
|
109
|
-
|
|
117
|
+
setup(components = {}) {
|
|
118
|
+
this.loadReactDOMClient().then(() => {
|
|
119
|
+
window.ReactComponentsRails.registerComponents(components)
|
|
120
|
+
window.ReactComponentsRails.mountComponents()
|
|
121
|
+
})
|
|
122
|
+
}
|
|
110
123
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
124
|
+
private loadReactDOMClient() {
|
|
125
|
+
return new Promise<void>((resolve) => {
|
|
126
|
+
if (this.#ReactDOMClient) resolve()
|
|
127
|
+
|
|
128
|
+
import("react-dom/client")
|
|
129
|
+
.then((i) => {
|
|
130
|
+
this.#ReactDOMClient = i
|
|
131
|
+
resolve()
|
|
132
|
+
})
|
|
133
|
+
.catch(() => {
|
|
134
|
+
this.#ReactDOMClient = ReactDOM
|
|
135
|
+
})
|
|
136
|
+
})
|
|
137
|
+
}
|
|
117
138
|
}
|
|
118
139
|
|
|
119
|
-
|
|
140
|
+
const instance = ReactComponentsRails.getInstance()
|
|
141
|
+
|
|
142
|
+
export default instance
|
data/tsconfig.json
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: react-components-rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.0.
|
|
4
|
+
version: 1.0.0.beta3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Renaud Chaput
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-08-
|
|
11
|
+
date: 2022-08-16 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|