sprockets-commoner 0.1.4 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +13 -14
- data/js/babel-plugin-sprockets-commoner-internal/index.js +16 -37
- data/lib/sprockets/commoner/json_processor.rb +9 -0
- data/lib/sprockets/commoner/processor.rb +8 -24
- data/lib/sprockets/commoner/version.rb +1 -1
- data/lib/sprockets/commoner.rb +2 -0
- data/sprockets-commoner.gemspec +1 -1
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a5ceb584e1eacf7990a65e0dfb94534f9d2fdd2
|
4
|
+
data.tar.gz: 4ba4cc82f4df684af207003516778fa80ee9fd81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 424bfe23119eef889e07d452835e7bae3ca03f96017e4be8614792aaedf6b2172a93abdb577263953641fba60a95d0641fdddae9a1eef67bf29ee77a1871723d
|
7
|
+
data.tar.gz: f094b1ba53d8da39d3fd06272960a5af01d8e366dc67abb6e740b8466b6990b184537b7a27d72b79e9ac096357a6687ad3d7ec99f901d6d42f88c4b381f58866
|
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Sprockets::Commoner
|
2
2
|
|
3
|
-
`Sprockets::Commoner` is a gem that enables JavaScript package and Babel transformation in Sprockets.
|
3
|
+
`Sprockets::Commoner` is a gem that enables JavaScript package and Babel transformation in Sprockets. It is meant as a replacement for [Browserify](http://browserify.org/) or [Webpack](https://webpack.github.io/) in Rails.
|
4
4
|
|
5
5
|
## Features
|
6
6
|
|
@@ -28,7 +28,7 @@ To get started, let's begin with the simplest possible set up: just enabling res
|
|
28
28
|
1. Add `sprockets-commoner` to Gemfile, run `bundle install`, and restart your Rails server.
|
29
29
|
1. Add package.json with `babel-core` version 6 and any packages you want. For the example, we'll use the excellent [lodash](https://lodash.com) library. `npm install -S babel-core@6 lodash`
|
30
30
|
1. `require` your client-side JavaScript packages from `application.js`!
|
31
|
-
```
|
31
|
+
```javascript
|
32
32
|
var _ = require('lodash');
|
33
33
|
|
34
34
|
console.log(_.map([1, 2, 3], function(n) { return n * 3; }));
|
@@ -40,7 +40,7 @@ console.log(_.map([1, 2, 3], function(n) { return n * 3; }));
|
|
40
40
|
1. Add a `.babelrc` with you required configuration. We just need to do `echo '{presets: ["es2015"]}' > .babelrc`.
|
41
41
|
1. Use any feature you want! For example, let's use `import` and arrow functions in our `application.js`:
|
42
42
|
|
43
|
-
```
|
43
|
+
```javascript
|
44
44
|
import {map} from 'lodash';
|
45
45
|
|
46
46
|
console.log(map([1, 2, 3], (n) => n * 3));
|
@@ -52,7 +52,7 @@ console.log(map([1, 2, 3], (n) => n * 3));
|
|
52
52
|
|
53
53
|
By default, commoner will process any file under the application root directory. If you want more fine-tuned control over which files to process, you can specify which paths to include or exclude. To do so, you will need to re-register the Sprockets processor. For example:
|
54
54
|
|
55
|
-
```
|
55
|
+
```ruby
|
56
56
|
# In config/initializers/sprockets_commoner.rb
|
57
57
|
Rails.application.config.assets.configure do |env|
|
58
58
|
env.unregister_postprocessor('application/javascript', Sprockets::Commoner::Processor)
|
@@ -83,12 +83,12 @@ Commoner is designed from the start to facilitate a transition from CoffeeScript
|
|
83
83
|
Any JavaScript file can `require` a CoffeeScript file, which will cause that CoffeeScript file to be scanned for a global variable reference and the `require` call to be replaced with a reference.
|
84
84
|
If we have the following two files:
|
85
85
|
|
86
|
-
```
|
86
|
+
```coffeescript
|
87
87
|
# file.coffee
|
88
88
|
class window.ImportantClass
|
89
89
|
```
|
90
90
|
|
91
|
-
```
|
91
|
+
```javascript
|
92
92
|
// main.js
|
93
93
|
var klass = require('./file');
|
94
94
|
|
@@ -101,15 +101,15 @@ Then the second file will just be compiled down to `new window.ImportantClass()`
|
|
101
101
|
|
102
102
|
We have added a custom directive that makes it very easy to expose an ES2015 module to the global namespace so it can be used by CoffeeScript files or any other code. For example:
|
103
103
|
|
104
|
-
```
|
105
|
-
'expose window.MyClass
|
104
|
+
```javascript
|
105
|
+
'expose window.MyClass';
|
106
106
|
|
107
107
|
export default class MyClass {}
|
108
108
|
```
|
109
109
|
|
110
110
|
`expose` will use the default export if available, otherwise the whole module namespace will be assigned to the global variable. For example:
|
111
111
|
|
112
|
-
```
|
112
|
+
```javascript
|
113
113
|
// constants.js
|
114
114
|
'expose window.Constants';
|
115
115
|
|
@@ -138,7 +138,7 @@ After the regular Babel plugins are done doing their thing, `babel-plugin-common
|
|
138
138
|
* It finds any `require` calls and rewires them to variable references (as detailed in [`require` support](#require-support))
|
139
139
|
* It wraps the module in a function and supplies it with `module` and `exports`. The end value of `module.exports` gets assigned to the module identifier, which is referenced by other files (as specified in '`require` support') Example:
|
140
140
|
|
141
|
-
```
|
141
|
+
```javascript
|
142
142
|
var __commoner_module__node_modules$package$index_js = __commoner_initialize_module__(function (module, exports) {
|
143
143
|
exports.default = 123;
|
144
144
|
});
|
@@ -151,14 +151,14 @@ After all the files have been transformed, there is a bundle step which combines
|
|
151
151
|
|
152
152
|
For example, if we have the following two files:
|
153
153
|
|
154
|
-
```
|
154
|
+
```javascript
|
155
155
|
// module.js
|
156
156
|
export default function a() {
|
157
157
|
return 1;
|
158
158
|
};
|
159
159
|
```
|
160
160
|
|
161
|
-
```
|
161
|
+
```javascript
|
162
162
|
// application.js
|
163
163
|
import a from './module';
|
164
164
|
|
@@ -167,7 +167,7 @@ a();
|
|
167
167
|
|
168
168
|
We will end up with the following (browser-runnable) file:
|
169
169
|
|
170
|
-
```
|
170
|
+
```javascript
|
171
171
|
!function() {
|
172
172
|
var __commoner_initialize_module__ = function(f) {
|
173
173
|
var module = {exports: {}};
|
@@ -202,4 +202,3 @@ var __commoner_module__app$assets$javascripts$application_js = __commoner_initia
|
|
202
202
|
```
|
203
203
|
|
204
204
|
This file is meant to be compressed, and does incredibly well when processed by UglifyJS.
|
205
|
-
|
@@ -25,9 +25,7 @@ if (typeof Object.assign != 'function') {
|
|
25
25
|
|
26
26
|
var fs = require('fs');
|
27
27
|
var dirname = require('path').dirname;
|
28
|
-
var join = require('path').join;
|
29
28
|
var resolve = require('browser-resolve').sync;
|
30
|
-
var emptyModule = join(__dirname, 'node_modules', 'browser-resolve', 'empty.js');
|
31
29
|
|
32
30
|
module.exports = function (context) {
|
33
31
|
var t = context.types;
|
@@ -65,7 +63,7 @@ module.exports = function (context) {
|
|
65
63
|
}
|
66
64
|
|
67
65
|
if (identifiers.length === 0) {
|
68
|
-
|
66
|
+
throw new Error('No identifiers found in ' + path);
|
69
67
|
} else if (identifiers.length > 1) {
|
70
68
|
throw new Error('Multiple identifiers found in ' + path);
|
71
69
|
}
|
@@ -116,16 +114,12 @@ module.exports = function (context) {
|
|
116
114
|
return '__commoner_module__' + escapedPath;
|
117
115
|
}
|
118
116
|
|
119
|
-
function resolveTarget(file, path
|
117
|
+
function resolveTarget(file, path) {
|
120
118
|
var name = void 0;
|
121
119
|
if (opts.globals != null && (name = opts.globals[path]) != null) {
|
122
120
|
return name;
|
123
121
|
} else {
|
124
122
|
var resolvedPath = resolve(path, opts);
|
125
|
-
if (resolvedPath === emptyModule) {
|
126
|
-
return false;
|
127
|
-
}
|
128
|
-
|
129
123
|
file.metadata.required.push(resolvedPath);
|
130
124
|
|
131
125
|
// Check if the path is under sourceRoot
|
@@ -135,13 +129,10 @@ module.exports = function (context) {
|
|
135
129
|
}
|
136
130
|
|
137
131
|
if (/\.coffee$/.test(resolvedPath)) {
|
138
|
-
// If it's a coffee script file, look for global variable assignments
|
132
|
+
// If it's a coffee script file, look for global variable assignments
|
139
133
|
return findDeclarationInCoffeeFile(resolvedPath);
|
140
134
|
} else {
|
141
|
-
|
142
|
-
file.metadata.targetsToProcess.push(resolvedPath);
|
143
|
-
}
|
144
|
-
// Otherwise we just look for the module by referencing its Special Identifier™.
|
135
|
+
// Otherwise we just look for the module by referencing its Special Identifier™
|
145
136
|
return pathToIdentifier(resolvedPath);
|
146
137
|
}
|
147
138
|
}
|
@@ -163,14 +154,10 @@ module.exports = function (context) {
|
|
163
154
|
return;
|
164
155
|
}
|
165
156
|
|
166
|
-
var name = resolveTarget(state.file, target
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
path.scope.rename(name);
|
171
|
-
path.scope.rename(path.node.id.name, name);
|
172
|
-
path.remove();
|
173
|
-
}
|
157
|
+
var name = resolveTarget(state.file, target);
|
158
|
+
path.scope.rename(name);
|
159
|
+
path.scope.rename(path.node.id.name, name);
|
160
|
+
path.remove();
|
174
161
|
},
|
175
162
|
CallExpression: function CallExpression(path, state) {
|
176
163
|
if (!isRequire(path)) {
|
@@ -182,21 +169,16 @@ module.exports = function (context) {
|
|
182
169
|
return;
|
183
170
|
}
|
184
171
|
|
172
|
+
var replacement = resolveTarget(state.file, target);
|
185
173
|
switch (path.parent.type) {
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
// Otherwise we just look for the module by referencing its Special Identifier™.
|
193
|
-
var replacement = resolveTarget(state.file, target, true);
|
194
|
-
if (replacement === false) {
|
195
|
-
path.replaceWith(t.objectExpression([]));
|
196
|
-
} else {
|
174
|
+
case "ExpressionStatement":
|
175
|
+
// We just need to know there's a dependency, we can remove it then
|
176
|
+
path.remove();
|
177
|
+
break;
|
178
|
+
default:
|
179
|
+
// Otherwise we just look for the module by referencing its Special Identifier™
|
197
180
|
path.replaceWith(t.identifier(replacement));
|
198
|
-
|
199
|
-
break;
|
181
|
+
break;
|
200
182
|
}
|
201
183
|
}
|
202
184
|
};
|
@@ -206,9 +188,6 @@ module.exports = function (context) {
|
|
206
188
|
if (file.metadata.required == null) {
|
207
189
|
file.metadata.required = [];
|
208
190
|
}
|
209
|
-
if (file.metadata.targetsToProcess == null) {
|
210
|
-
file.metadata.targetsToProcess = [];
|
211
|
-
}
|
212
191
|
},
|
213
192
|
|
214
193
|
visitor: {
|
@@ -4,19 +4,14 @@ require 'open3'
|
|
4
4
|
module Sprockets
|
5
5
|
module Commoner
|
6
6
|
class Processor < Schmooze::Base
|
7
|
-
|
8
|
-
ExcludedFileError = Class.new(::StandardError)
|
9
|
-
|
10
|
-
VERSION = '1'.freeze
|
11
7
|
BABELRC_FILE = '.babelrc'.freeze
|
12
8
|
PACKAGE_JSON = 'package.json'.freeze
|
13
9
|
JS_PACKAGE_PATH = File.expand_path('../../../js', __dir__)
|
14
|
-
ALLOWED_EXTENSIONS = /\.js(?:\.erb)?\z/
|
15
|
-
COFFEE_EXTENSION = /\.coffee(:?\.erb)?\z/
|
10
|
+
ALLOWED_EXTENSIONS = /\.js(?:on)?(?:\.erb)?\z/
|
16
11
|
|
17
12
|
dependencies babel: 'babel-core', commoner: 'babel-plugin-sprockets-commoner-internal'
|
18
13
|
|
19
|
-
method :version, 'function() { return babel.version; }'
|
14
|
+
method :version, 'function() { return [process.version, babel.version]; }'
|
20
15
|
method :transform, %q{function(code, opts, commonerOpts) {
|
21
16
|
try {
|
22
17
|
var file = new babel.File(opts);
|
@@ -49,25 +44,20 @@ module Sprockets
|
|
49
44
|
end
|
50
45
|
|
51
46
|
attr_reader :include, :exclude, :babel_exclude
|
52
|
-
def initialize(root, include: [root], exclude: [
|
47
|
+
def initialize(root, include: [root], exclude: [], babel_exclude: [/node_modules/])
|
53
48
|
@include = include.map {|path| expand_to_root(path, root) }
|
54
49
|
@exclude = exclude.map {|path| expand_to_root(path, root) }
|
55
50
|
@babel_exclude = babel_exclude.map {|path| expand_to_root(path, root) }
|
56
51
|
super(root, 'NODE_PATH' => JS_PACKAGE_PATH)
|
57
52
|
end
|
58
53
|
|
59
|
-
def
|
54
|
+
def call(input)
|
60
55
|
@cache_key ||= [
|
61
56
|
self.class.name,
|
62
|
-
VERSION,
|
63
57
|
version,
|
64
|
-
|
65
|
-
|
66
|
-
@babel_exclude.map(&:to_s),
|
67
|
-
]
|
68
|
-
end
|
58
|
+
VERSION,
|
59
|
+
].freeze
|
69
60
|
|
70
|
-
def call(input)
|
71
61
|
filename = input[:filename]
|
72
62
|
|
73
63
|
return unless should_process?(filename)
|
@@ -80,14 +70,8 @@ module Sprockets
|
|
80
70
|
|
81
71
|
babel_config = babelrc_data(filename)
|
82
72
|
|
83
|
-
result =
|
84
|
-
|
85
|
-
if result['metadata'].has_key?('targetsToProcess')
|
86
|
-
result['metadata']['targetsToProcess'].each do |t|
|
87
|
-
unless should_process?(t)
|
88
|
-
raise ExcludedFileError, "#{t} was imported from #{filename} but this file won't be processed by Sprockets::Commoner"
|
89
|
-
end
|
90
|
-
end
|
73
|
+
result = input[:cache].fetch([filename, @cache_key, input[:data], babel_config]) do
|
74
|
+
transform(input[:data], options(input), paths: @env.paths)
|
91
75
|
end
|
92
76
|
|
93
77
|
if result['metadata'].has_key?('required')
|
data/lib/sprockets/commoner.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'sprockets'
|
2
|
+
require 'sprockets/commoner/json_processor'
|
2
3
|
require 'sprockets/commoner/processor'
|
3
4
|
require 'sprockets/commoner/bundle'
|
4
5
|
|
@@ -7,6 +8,7 @@ module Sprockets
|
|
7
8
|
end
|
8
9
|
|
9
10
|
register_postprocessor 'application/javascript', ::Sprockets::Commoner::Processor
|
11
|
+
register_transformer 'application/json', 'application/javascript', ::Sprockets::Commoner::JSONProcessor
|
10
12
|
register_bundle_metadata_reducer 'application/javascript', :commoner_enabled, false, :|
|
11
13
|
register_bundle_metadata_reducer 'application/javascript', :commoner_used_helpers, Set.new, :+
|
12
14
|
register_bundle_processor 'application/javascript', ::Sprockets::Commoner::Bundle
|
data/sprockets-commoner.gemspec
CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
28
|
spec.require_paths = ["lib"]
|
29
29
|
spec.add_dependency "sprockets", ">= 3", "< 4"
|
30
|
-
spec.add_dependency "schmooze", "~> 0.1.
|
30
|
+
spec.add_dependency "schmooze", "~> 0.1.5"
|
31
31
|
|
32
32
|
spec.add_development_dependency "rake", "~> 10.0"
|
33
33
|
spec.add_development_dependency "minitest", "~> 5.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sprockets-commoner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bouke van der Bijl
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sprockets
|
@@ -36,14 +36,14 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: 0.1.
|
39
|
+
version: 0.1.5
|
40
40
|
type: :runtime
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
44
|
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: 0.1.
|
46
|
+
version: 0.1.5
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -124,6 +124,7 @@ extra_rdoc_files: []
|
|
124
124
|
files:
|
125
125
|
- ".gitignore"
|
126
126
|
- ".nvmrc"
|
127
|
+
- CHANGELOG.md
|
127
128
|
- CODE_OF_CONDUCT.md
|
128
129
|
- Gemfile
|
129
130
|
- README.md
|
@@ -153,6 +154,7 @@ files:
|
|
153
154
|
- js/babel-plugin-sprockets-commoner/package.json
|
154
155
|
- lib/sprockets/commoner.rb
|
155
156
|
- lib/sprockets/commoner/bundle.rb
|
157
|
+
- lib/sprockets/commoner/json_processor.rb
|
156
158
|
- lib/sprockets/commoner/processor.rb
|
157
159
|
- lib/sprockets/commoner/railtie.rb
|
158
160
|
- lib/sprockets/commoner/version.rb
|
@@ -178,7 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
178
180
|
version: '0'
|
179
181
|
requirements: []
|
180
182
|
rubyforge_project:
|
181
|
-
rubygems_version: 2.
|
183
|
+
rubygems_version: 2.5.1
|
182
184
|
signing_key:
|
183
185
|
specification_version: 4
|
184
186
|
summary: Use Babel in Sprockets to compile modules for the browser
|