react-rails 1.11.0 → 2.0.0
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/CHANGELOG.md +29 -0
- data/README.md +294 -214
- data/lib/assets/javascripts/react_ujs.js +429 -7
- data/lib/generators/react/component_generator.rb +24 -12
- data/lib/generators/react/install_generator.rb +76 -18
- data/lib/generators/templates/react_server_rendering.rb +2 -0
- data/lib/generators/templates/server_rendering.js +6 -0
- data/lib/generators/templates/server_rendering_pack.js +5 -0
- data/lib/react/jsx.rb +2 -0
- data/lib/react/rails/component_mount.rb +23 -5
- data/lib/react/rails/controller_lifecycle.rb +35 -7
- data/lib/react/rails/railtie.rb +17 -11
- data/lib/react/rails/version.rb +1 -1
- data/lib/react/server_rendering.rb +16 -4
- data/lib/react/server_rendering/{sprockets_renderer.rb → bundle_renderer.rb} +40 -20
- data/lib/react/server_rendering/{sprockets_renderer → bundle_renderer}/console_polyfill.js +0 -0
- data/lib/react/server_rendering/{sprockets_renderer → bundle_renderer}/console_replay.js +1 -1
- data/lib/react/server_rendering/bundle_renderer/console_reset.js +3 -0
- data/lib/react/server_rendering/{sprockets_renderer → bundle_renderer}/timeout_polyfill.js +0 -0
- data/lib/react/server_rendering/exec_js_renderer.rb +4 -1
- data/lib/react/server_rendering/webpacker_manifest_container.rb +34 -0
- data/lib/react/server_rendering/yaml_manifest_container.rb +1 -1
- metadata +16 -16
- data/lib/assets/javascripts/react_ujs_event_setup.js +0 -29
- data/lib/assets/javascripts/react_ujs_mount.js +0 -104
- data/lib/assets/javascripts/react_ujs_native.js +0 -18
- data/lib/assets/javascripts/react_ujs_pjax.js +0 -10
- data/lib/assets/javascripts/react_ujs_turbolinks.js +0 -9
- data/lib/assets/javascripts/react_ujs_turbolinks_classic.js +0 -10
- data/lib/assets/javascripts/react_ujs_turbolinks_classic_deprecated.js +0 -13
- data/lib/generators/react/ujs_generator.rb +0 -44
@@ -1,7 +1,429 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
(function webpackUniversalModuleDefinition(root, factory) {
|
2
|
+
if(typeof exports === 'object' && typeof module === 'object')
|
3
|
+
module.exports = factory(require("react"), require("react-dom"), require("react-dom/server"));
|
4
|
+
else if(typeof define === 'function' && define.amd)
|
5
|
+
define(["react", "react-dom", "react-dom/server"], factory);
|
6
|
+
else if(typeof exports === 'object')
|
7
|
+
exports["ReactRailsUJS"] = factory(require("react"), require("react-dom"), require("react-dom/server"));
|
8
|
+
else
|
9
|
+
root["ReactRailsUJS"] = factory(root["React"], root["ReactDOM"], root["ReactDOMServer"]);
|
10
|
+
})(this, function(__WEBPACK_EXTERNAL_MODULE_3__, __WEBPACK_EXTERNAL_MODULE_4__, __WEBPACK_EXTERNAL_MODULE_5__) {
|
11
|
+
return /******/ (function(modules) { // webpackBootstrap
|
12
|
+
/******/ // The module cache
|
13
|
+
/******/ var installedModules = {};
|
14
|
+
/******/
|
15
|
+
/******/ // The require function
|
16
|
+
/******/ function __webpack_require__(moduleId) {
|
17
|
+
/******/
|
18
|
+
/******/ // Check if module is in cache
|
19
|
+
/******/ if(installedModules[moduleId])
|
20
|
+
/******/ return installedModules[moduleId].exports;
|
21
|
+
/******/
|
22
|
+
/******/ // Create a new module (and put it into the cache)
|
23
|
+
/******/ var module = installedModules[moduleId] = {
|
24
|
+
/******/ i: moduleId,
|
25
|
+
/******/ l: false,
|
26
|
+
/******/ exports: {}
|
27
|
+
/******/ };
|
28
|
+
/******/
|
29
|
+
/******/ // Execute the module function
|
30
|
+
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
31
|
+
/******/
|
32
|
+
/******/ // Flag the module as loaded
|
33
|
+
/******/ module.l = true;
|
34
|
+
/******/
|
35
|
+
/******/ // Return the exports of the module
|
36
|
+
/******/ return module.exports;
|
37
|
+
/******/ }
|
38
|
+
/******/
|
39
|
+
/******/
|
40
|
+
/******/ // expose the modules object (__webpack_modules__)
|
41
|
+
/******/ __webpack_require__.m = modules;
|
42
|
+
/******/
|
43
|
+
/******/ // expose the module cache
|
44
|
+
/******/ __webpack_require__.c = installedModules;
|
45
|
+
/******/
|
46
|
+
/******/ // identity function for calling harmony imports with the correct context
|
47
|
+
/******/ __webpack_require__.i = function(value) { return value; };
|
48
|
+
/******/
|
49
|
+
/******/ // define getter function for harmony exports
|
50
|
+
/******/ __webpack_require__.d = function(exports, name, getter) {
|
51
|
+
/******/ if(!__webpack_require__.o(exports, name)) {
|
52
|
+
/******/ Object.defineProperty(exports, name, {
|
53
|
+
/******/ configurable: false,
|
54
|
+
/******/ enumerable: true,
|
55
|
+
/******/ get: getter
|
56
|
+
/******/ });
|
57
|
+
/******/ }
|
58
|
+
/******/ };
|
59
|
+
/******/
|
60
|
+
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
61
|
+
/******/ __webpack_require__.n = function(module) {
|
62
|
+
/******/ var getter = module && module.__esModule ?
|
63
|
+
/******/ function getDefault() { return module['default']; } :
|
64
|
+
/******/ function getModuleExports() { return module; };
|
65
|
+
/******/ __webpack_require__.d(getter, 'a', getter);
|
66
|
+
/******/ return getter;
|
67
|
+
/******/ };
|
68
|
+
/******/
|
69
|
+
/******/ // Object.prototype.hasOwnProperty.call
|
70
|
+
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
71
|
+
/******/
|
72
|
+
/******/ // __webpack_public_path__
|
73
|
+
/******/ __webpack_require__.p = "";
|
74
|
+
/******/
|
75
|
+
/******/ // Load entry module and return exports
|
76
|
+
/******/ return __webpack_require__(__webpack_require__.s = 6);
|
77
|
+
/******/ })
|
78
|
+
/************************************************************************/
|
79
|
+
/******/ ([
|
80
|
+
/* 0 */
|
81
|
+
/***/ (function(module, exports) {
|
82
|
+
|
83
|
+
// Assume className is simple and can be found at top-level (window).
|
84
|
+
// Fallback to eval to handle cases like 'My.React.ComponentName'.
|
85
|
+
// Also, try to gracefully import Babel 6 style default exports
|
86
|
+
var topLevel = typeof window === "undefined" ? this : window;
|
87
|
+
|
88
|
+
module.exports = function(className) {
|
89
|
+
var constructor;
|
90
|
+
// Try to access the class globally first
|
91
|
+
constructor = topLevel[className];
|
92
|
+
|
93
|
+
// If that didn't work, try eval
|
94
|
+
if (!constructor) {
|
95
|
+
constructor = eval(className);
|
96
|
+
}
|
97
|
+
|
98
|
+
// Lastly, if there is a default attribute try that
|
99
|
+
if (constructor && constructor['default']) {
|
100
|
+
constructor = constructor['default'];
|
101
|
+
}
|
102
|
+
|
103
|
+
return constructor;
|
104
|
+
}
|
105
|
+
|
106
|
+
|
107
|
+
/***/ }),
|
108
|
+
/* 1 */
|
109
|
+
/***/ (function(module, exports, __webpack_require__) {
|
110
|
+
|
111
|
+
var nativeEvents = __webpack_require__(7)
|
112
|
+
var pjaxEvents = __webpack_require__(8)
|
113
|
+
var turbolinksEvents = __webpack_require__(9)
|
114
|
+
var turbolinksClassicDeprecatedEvents = __webpack_require__(11)
|
115
|
+
var turbolinksClassicEvents = __webpack_require__(10)
|
116
|
+
|
117
|
+
// see what things are globally available
|
118
|
+
// and setup event handlers to those things
|
119
|
+
module.exports = function(ujs) {
|
120
|
+
if (ujs.jQuery) {
|
121
|
+
ujs.handleEvent = function(eventName, callback) {
|
122
|
+
ujs.jQuery(document).on(eventName, callback);
|
123
|
+
};
|
124
|
+
} else {
|
125
|
+
ujs.handleEvent = function(eventName, callback) {
|
126
|
+
document.addEventListener(eventName, callback);
|
127
|
+
};
|
128
|
+
}
|
129
|
+
|
130
|
+
// Detect which kind of events to set up:
|
131
|
+
if (typeof Turbolinks !== 'undefined' && Turbolinks.supported) {
|
132
|
+
if (typeof Turbolinks.EVENTS !== 'undefined') {
|
133
|
+
// Turbolinks.EVENTS is in classic version 2.4.0+
|
134
|
+
turbolinksClassicEvents.setup(ujs)
|
135
|
+
} else if (typeof Turbolinks.controller !== "undefined") {
|
136
|
+
// Turbolinks.controller is in version 5+
|
137
|
+
turbolinksEvents.setup(ujs);
|
138
|
+
} else {
|
139
|
+
turbolinksClassicDeprecatedEvents.setup(ujs);
|
140
|
+
}
|
141
|
+
} else if (typeof $ !== "undefined" && typeof $.pjax === 'function') {
|
142
|
+
pjaxEvents.setup(ujs);
|
143
|
+
} else {
|
144
|
+
nativeEvents.setup(ujs);
|
145
|
+
}
|
146
|
+
}
|
147
|
+
|
148
|
+
|
149
|
+
/***/ }),
|
150
|
+
/* 2 */
|
151
|
+
/***/ (function(module, exports, __webpack_require__) {
|
152
|
+
|
153
|
+
// Make a function which:
|
154
|
+
// - First tries to require the name
|
155
|
+
// - Then falls back to global lookup
|
156
|
+
var fromGlobal = __webpack_require__(0)
|
157
|
+
var fromRequireContext = __webpack_require__(12)
|
158
|
+
|
159
|
+
module.exports = function(reqctx) {
|
160
|
+
var fromCtx = fromRequireContext(reqctx)
|
161
|
+
return function(className) {
|
162
|
+
var component;
|
163
|
+
try {
|
164
|
+
// `require` will raise an error if this className isn't found:
|
165
|
+
component = fromCtx(className)
|
166
|
+
} catch (err) {
|
167
|
+
// fallback to global:
|
168
|
+
component = fromGlobal(className)
|
169
|
+
}
|
170
|
+
return component
|
171
|
+
}
|
172
|
+
}
|
173
|
+
|
174
|
+
|
175
|
+
/***/ }),
|
176
|
+
/* 3 */
|
177
|
+
/***/ (function(module, exports) {
|
178
|
+
|
179
|
+
module.exports = __WEBPACK_EXTERNAL_MODULE_3__;
|
180
|
+
|
181
|
+
/***/ }),
|
182
|
+
/* 4 */
|
183
|
+
/***/ (function(module, exports) {
|
184
|
+
|
185
|
+
module.exports = __WEBPACK_EXTERNAL_MODULE_4__;
|
186
|
+
|
187
|
+
/***/ }),
|
188
|
+
/* 5 */
|
189
|
+
/***/ (function(module, exports) {
|
190
|
+
|
191
|
+
module.exports = __WEBPACK_EXTERNAL_MODULE_5__;
|
192
|
+
|
193
|
+
/***/ }),
|
194
|
+
/* 6 */
|
195
|
+
/***/ (function(module, exports, __webpack_require__) {
|
196
|
+
|
197
|
+
var React = __webpack_require__(3)
|
198
|
+
var ReactDOM = __webpack_require__(4)
|
199
|
+
var ReactDOMServer = __webpack_require__(5)
|
200
|
+
|
201
|
+
var detectEvents = __webpack_require__(1)
|
202
|
+
var constructorFromGlobal = __webpack_require__(0)
|
203
|
+
var constructorFromRequireContextWithGlobalFallback = __webpack_require__(2)
|
204
|
+
|
205
|
+
var ReactRailsUJS = {
|
206
|
+
// This attribute holds the name of component which should be mounted
|
207
|
+
// example: `data-react-class="MyApp.Items.EditForm"`
|
208
|
+
CLASS_NAME_ATTR: 'data-react-class',
|
209
|
+
|
210
|
+
// This attribute holds JSON stringified props for initializing the component
|
211
|
+
// example: `data-react-props="{\"item\": { \"id\": 1, \"name\": \"My Item\"} }"`
|
212
|
+
PROPS_ATTR: 'data-react-props',
|
213
|
+
|
214
|
+
// If jQuery is detected, save a reference to it for event handlers
|
215
|
+
jQuery: (typeof window !== 'undefined') && (typeof window.jQuery !== 'undefined') && window.jQuery,
|
216
|
+
|
217
|
+
// helper method for the mount and unmount methods to find the
|
218
|
+
// `data-react-class` DOM elements
|
219
|
+
findDOMNodes: function(selector) {
|
220
|
+
var classNameAttr = ReactRailsUJS.CLASS_NAME_ATTR
|
221
|
+
// we will use fully qualified paths as we do not bind the callbacks
|
222
|
+
var selector, parent;
|
223
|
+
|
224
|
+
switch (typeof searchSelector) {
|
225
|
+
case 'undefined':
|
226
|
+
selector = '[' + classNameAttr + ']';
|
227
|
+
parent = document;
|
228
|
+
break;
|
229
|
+
case 'object':
|
230
|
+
selector = '[' + classNameAttr + ']';
|
231
|
+
parent = searchSelector;
|
232
|
+
break;
|
233
|
+
case 'string':
|
234
|
+
selector = searchSelector + '[' + classNameAttr + '], ' +
|
235
|
+
searchSelector + ' [' + classNameAttr + ']';
|
236
|
+
parent = document;
|
237
|
+
break
|
238
|
+
default:
|
239
|
+
break;
|
240
|
+
}
|
241
|
+
|
242
|
+
if (ReactRailsUJS.jQuery) {
|
243
|
+
return ReactRailsUJS.jQuery(selector, parent);
|
244
|
+
} else {
|
245
|
+
return parent.querySelectorAll(selector);
|
246
|
+
}
|
247
|
+
},
|
248
|
+
|
249
|
+
// Get the constructor for a className (returns a React class)
|
250
|
+
// Override this function to lookup classes in a custom way,
|
251
|
+
// the default is ReactRailsUJS.ComponentGlobal
|
252
|
+
getConstructor: constructorFromGlobal,
|
253
|
+
|
254
|
+
useContext: function(req) {
|
255
|
+
this.getConstructor = constructorFromRequireContextWithGlobalFallback(req)
|
256
|
+
},
|
257
|
+
|
258
|
+
// Render `componentName` with `props` to a string,
|
259
|
+
// using the specified `renderFunction` from `react-dom/server`.
|
260
|
+
serverRender: function(renderFunction, componentName, props) {
|
261
|
+
var componentClass = this.getConstructor(componentName)
|
262
|
+
var element = React.createElement(componentClass, props)
|
263
|
+
return ReactDOMServer[renderFunction](element)
|
264
|
+
},
|
265
|
+
|
266
|
+
// Within `searchSelector`, find nodes which should have React components
|
267
|
+
// inside them, and mount them with their props.
|
268
|
+
mountComponents: function(searchSelector) {
|
269
|
+
var ujs = ReactRailsUJS
|
270
|
+
var nodes = ujs.findDOMNodes(searchSelector);
|
271
|
+
|
272
|
+
for (var i = 0; i < nodes.length; ++i) {
|
273
|
+
var node = nodes[i];
|
274
|
+
var className = node.getAttribute(ujs.CLASS_NAME_ATTR);
|
275
|
+
var constructor = ujs.getConstructor(className);
|
276
|
+
var propsJson = node.getAttribute(ujs.PROPS_ATTR);
|
277
|
+
var props = propsJson && JSON.parse(propsJson);
|
278
|
+
|
279
|
+
if (!constructor) {
|
280
|
+
var message = "Cannot find component: '" + className + "'"
|
281
|
+
if (console && console.log) {
|
282
|
+
console.log("%c[react-rails] %c" + message + " for element", "font-weight: bold", "", node)
|
283
|
+
}
|
284
|
+
throw new Error(message + ". Make sure your component is available to render.")
|
285
|
+
} else {
|
286
|
+
ReactDOM.render(React.createElement(constructor, props), node);
|
287
|
+
}
|
288
|
+
}
|
289
|
+
},
|
290
|
+
|
291
|
+
// Within `searchSelector`, find nodes which have React components
|
292
|
+
// inside them, and unmount those components.
|
293
|
+
unmountComponents: function(searchSelector) {
|
294
|
+
var nodes = ReactRailsUJS.findDOMNodes(searchSelector);
|
295
|
+
|
296
|
+
for (var i = 0; i < nodes.length; ++i) {
|
297
|
+
var node = nodes[i];
|
298
|
+
ReactDOM.unmountComponentAtNode(node);
|
299
|
+
}
|
300
|
+
},
|
301
|
+
}
|
302
|
+
|
303
|
+
if (typeof window !== "undefined") {
|
304
|
+
// Only setup events for browser (not server-rendering)
|
305
|
+
detectEvents(ReactRailsUJS)
|
306
|
+
}
|
307
|
+
|
308
|
+
// It's a bit of a no-no to populate the global namespace,
|
309
|
+
// but we really need it!
|
310
|
+
// We need access to this object for server rendering, and
|
311
|
+
// we can't do a dynamic `require`, so we'll grab it from here:
|
312
|
+
self.ReactRailsUJS = ReactRailsUJS
|
313
|
+
|
314
|
+
module.exports = ReactRailsUJS
|
315
|
+
|
316
|
+
|
317
|
+
/***/ }),
|
318
|
+
/* 7 */
|
319
|
+
/***/ (function(module, exports) {
|
320
|
+
|
321
|
+
module.exports = {
|
322
|
+
// Attach handlers to browser events to mount
|
323
|
+
// (There are no unmount handlers since the page is destroyed on navigation)
|
324
|
+
setup: function(ujs) {
|
325
|
+
if (ujs.jQuery) {
|
326
|
+
// Use jQuery if it's present:
|
327
|
+
ujs.jQuery(function() { ujs.mountComponents() });
|
328
|
+
} else if ('addEventListener' in window) {
|
329
|
+
document.addEventListener('DOMContentLoaded', function() { ujs.mountComponents() });
|
330
|
+
} else {
|
331
|
+
// add support to IE8 without jQuery
|
332
|
+
window.attachEvent('onload', function() { ujs.mountComponents() });
|
333
|
+
}
|
334
|
+
}
|
335
|
+
}
|
336
|
+
|
337
|
+
|
338
|
+
/***/ }),
|
339
|
+
/* 8 */
|
340
|
+
/***/ (function(module, exports) {
|
341
|
+
|
342
|
+
module.exports = {
|
343
|
+
// pjax support
|
344
|
+
setup: function(ujs) {
|
345
|
+
ujs.handleEvent('ready', function() { ujs.mountComponents() });
|
346
|
+
ujs.handleEvent('pjax:end', function(e) { ujs.mountComponents(e.target) });
|
347
|
+
ujs.handleEvent('pjax:beforeReplace', function(e) { ujs.unmountComponents(e.target) });
|
348
|
+
}
|
349
|
+
}
|
350
|
+
|
351
|
+
|
352
|
+
/***/ }),
|
353
|
+
/* 9 */
|
354
|
+
/***/ (function(module, exports) {
|
355
|
+
|
356
|
+
module.exports = {
|
357
|
+
// Turbolinks 5+ got rid of named events (?!)
|
358
|
+
setup: function(ujs) {
|
359
|
+
ujs.handleEvent('DOMContentLoaded', function() { ujs.mountComponents() })
|
360
|
+
ujs.handleEvent('turbolinks:render', function() { ujs.mountComponents() })
|
361
|
+
ujs.handleEvent('turbolinks:before-render', function() { ujs.unmountComponents() })
|
362
|
+
},
|
363
|
+
}
|
364
|
+
|
365
|
+
|
366
|
+
/***/ }),
|
367
|
+
/* 10 */
|
368
|
+
/***/ (function(module, exports) {
|
369
|
+
|
370
|
+
module.exports = {
|
371
|
+
// Attach handlers to Turbolinks-Classic events
|
372
|
+
// for mounting and unmounting components
|
373
|
+
setup: function(ujs) {
|
374
|
+
ujs.handleEvent(Turbolinks.EVENTS.CHANGE, function() { ujs.mountComponents() });
|
375
|
+
ujs.handleEvent(Turbolinks.EVENTS.BEFORE_UNLOAD, function() { ujs.unmountComponents() });
|
376
|
+
}
|
377
|
+
}
|
378
|
+
|
379
|
+
|
380
|
+
/***/ }),
|
381
|
+
/* 11 */
|
382
|
+
/***/ (function(module, exports) {
|
383
|
+
|
384
|
+
module.exports = {
|
385
|
+
// Before Turbolinks 2.4.0, Turbolinks didn't
|
386
|
+
// have named events and didn't have a before-unload event.
|
387
|
+
// Also, it didn't work with the Turbolinks cache, see
|
388
|
+
// https://github.com/reactjs/react-rails/issues/87
|
389
|
+
setup: function(ujs) {
|
390
|
+
Turbolinks.pagesCached(0)
|
391
|
+
ujs.handleEvent('page:change', function() { ujs.mountComponents() });
|
392
|
+
ujs.handleEvent('page:receive', function() { ujs.unmountComponents() });
|
393
|
+
}
|
394
|
+
}
|
395
|
+
|
396
|
+
|
397
|
+
/***/ }),
|
398
|
+
/* 12 */
|
399
|
+
/***/ (function(module, exports) {
|
400
|
+
|
401
|
+
// Load React components by requiring them from "components/", for example:
|
402
|
+
//
|
403
|
+
// - "pages/index" -> `require("components/pages/index")`
|
404
|
+
// - "pages/show.Header" -> `require("components/pages/show").Header`
|
405
|
+
// - "pages/show.Body.Content" -> `require("components/pages/show").Body.Content`
|
406
|
+
//
|
407
|
+
module.exports = function(reqctx) {
|
408
|
+
return function(className) {
|
409
|
+
var parts = className.split(".")
|
410
|
+
var filename = parts.shift()
|
411
|
+
var keys = parts
|
412
|
+
// Load the module:
|
413
|
+
var component = reqctx("./" + filename)
|
414
|
+
// Then access each key:
|
415
|
+
keys.forEach(function(k) {
|
416
|
+
component = component[k]
|
417
|
+
})
|
418
|
+
// support `export default`
|
419
|
+
if (component.__esModule) {
|
420
|
+
component = component["default"]
|
421
|
+
}
|
422
|
+
return component
|
423
|
+
}
|
424
|
+
}
|
425
|
+
|
426
|
+
|
427
|
+
/***/ })
|
428
|
+
/******/ ]);
|
429
|
+
});
|
@@ -4,7 +4,7 @@ module React
|
|
4
4
|
source_root File.expand_path '../../templates', __FILE__
|
5
5
|
desc <<-DESC.strip_heredoc
|
6
6
|
Description:
|
7
|
-
Scaffold a
|
7
|
+
Scaffold a React component into `components/` of your Webpacker source or asset pipeline.
|
8
8
|
The generated component will include a basic render function and a PropTypes
|
9
9
|
hash to help with development.
|
10
10
|
|
@@ -90,17 +90,29 @@ module React
|
|
90
90
|
}
|
91
91
|
|
92
92
|
def create_component_file
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
93
|
+
template_extension = case
|
94
|
+
when options[:es6]
|
95
|
+
'es6.jsx'
|
96
|
+
when options[:coffee]
|
97
|
+
'js.jsx.coffee'
|
98
|
+
else
|
99
|
+
'js.jsx'
|
100
|
+
end
|
101
|
+
|
102
|
+
# Prefer webpacker to sprockets:
|
103
|
+
if defined?(Webpacker)
|
104
|
+
extension = options[:coffee] ? "coffee" : "js"
|
105
|
+
target_dir = Webpacker::Configuration.source_path
|
106
|
+
.join("components")
|
107
|
+
.relative_path_from(::Rails.root)
|
108
|
+
.to_s
|
109
|
+
else
|
110
|
+
extension = template_extension
|
111
|
+
target_dir = 'app/assets/javascripts/components'
|
112
|
+
end
|
113
|
+
|
114
|
+
file_path = File.join(target_dir, "#{file_name}.#{extension}")
|
115
|
+
template("component.#{template_extension}", file_path)
|
104
116
|
end
|
105
117
|
|
106
118
|
private
|