Skip to content

Commit 2b87d4c

Browse files
author
rubeniskov
committed
refactor migrate getTransformsForFile logic to mixed depper class
1 parent 877676c commit 2b87d4c

File tree

4 files changed

+127
-157
lines changed

4 files changed

+127
-157
lines changed

depper.js

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,16 @@ var inherits = require('inherits')
55
var cacheWrap = require('./cacheWrap')
66
var nodeResolve = require('resolve')
77
var glslResolve = require('glsl-resolve')
8+
var findup = require('@choojs/findup')
89

910
var {
1011
genInlineName,
1112
} = require('./common.js')
1213

14+
var {
15+
getTransformsFromPkg,
16+
} = require('./utils.js')
17+
1318

1419
module.exports = Depper
1520

@@ -137,7 +142,7 @@ Depper.prototype.resolveTransform = function(transform) {
137142
* @param {String} filename The absolute path of the file you're transforming.
138143
* @param {String} src The shader source you'd like to transform.
139144
* @param {Array} transforms The transforms you'd like to apply.
140-
* @param {Function} [done] applies when async true
145+
* @param {(err: Error, result: string) => any} [done] Applies when async true
141146
*/
142147
Depper.prototype.applyTransforms = function(filename, src, transforms, done) {
143148
if (this._async) {
@@ -164,6 +169,90 @@ Depper.prototype.applyTransforms = function(filename, src, transforms, done) {
164169
}
165170
}
166171

172+
/**
173+
* Determines which transforms to use for a particular file.
174+
* The rules here are the same you see in browserify:
175+
*
176+
* - your shader files will have your specified transforms applied to them
177+
* - shader files in node_modules do not get local transforms
178+
* - all files will apply transforms specified in `glslify.transform` in your
179+
* `package.json` file, albeit after any transforms you specified using
180+
* `depper.transform`.
181+
*
182+
* @param {String} filename The absolute path of the file in question.
183+
* @param {(err: Error, transforms: any) => any} [done] Applies when async true
184+
*/
185+
Depper.prototype.getTransformsForFile = function(filename, done) {
186+
var self = this
187+
var entry = this._deps[0]
188+
189+
if (!entry) return done(new Error(
190+
'getTransformsForFile may only be called after adding your entry file'
191+
))
192+
193+
var entryDir = path.dirname(path.resolve(entry.file))
194+
var fileDir = path.dirname(path.resolve(filename))
195+
var relative = path.relative(entryDir, fileDir).split(path.sep)
196+
var node_modules = relative.indexOf('node_modules') !== -1
197+
var trLocal = node_modules ? [] : this._transforms
198+
var trCache = this._trCache
199+
var pkgName = 'package.json'
200+
201+
if (trCache[fileDir]) {
202+
if (this._async) {
203+
return done(null, trCache[fileDir])
204+
} else {
205+
return trCache[fileDir]
206+
}
207+
}
208+
209+
function register(transforms) {
210+
trCache[fileDir] = trLocal
211+
.concat(transforms.map(function(tr) {
212+
tr.tr = self.resolveTransform(tr.tr)
213+
return tr
214+
}))
215+
.concat(self._globalTransforms);
216+
var result = trCache[fileDir]
217+
if (self._async) {
218+
done(null, result)
219+
} else {
220+
return result
221+
}
222+
}
223+
224+
if (this._async) {
225+
findup(fileDir, pkgName, function(err, found) {
226+
var notFound = err && err.message === 'not found'
227+
if (notFound) return register([])
228+
if (err) return done(err)
229+
230+
var pkg = path.join(found, pkgName)
231+
232+
self.readFile(pkg, function(err, pkgJson) {
233+
if (err) return done(err)
234+
var transforms;
235+
try {
236+
transforms = getTransformsFromPkg(pkgJson)
237+
} catch(e) { return done(e) }
238+
239+
register(transforms)
240+
})
241+
})
242+
} else {
243+
try { var found = findup.sync(fileDir, pkgName) }
244+
catch (err) {
245+
var notFound = err.message === 'not found'
246+
if (notFound) return register([])
247+
else throw err
248+
}
249+
250+
var pkg = path.join(found, pkgName)
251+
252+
return register(getTransformsFromPkg(self.readFile(pkg)))
253+
}
254+
}
255+
167256
Depper.prototype.readFile = function(filename, done) {
168257
if (path.basename(filename) !== this._inlineName)
169258
return this._readFile(filename, done)

index.js

Lines changed: 0 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -121,84 +121,3 @@ DepperAsync.prototype.add = function(filename, done) {
121121
}, resolved)
122122
}
123123
}
124-
125-
/**
126-
* Determines which transforms to use for a particular file.
127-
* The rules here are the same you see in browserify:
128-
*
129-
* - your shader files will have your specified transforms applied to them
130-
* - shader files in node_modules do not get local transforms
131-
* - all files will apply transforms specified in `glslify.transform` in your
132-
* `package.json` file, albeit after any transforms you specified using
133-
* `depperAsync.transform`.
134-
*
135-
* @param {String} filename The absolute path of the file in question.
136-
*/
137-
DepperAsync.prototype.getTransformsForFile = function(filename, done) {
138-
var self = this
139-
var entry = this._deps[0]
140-
141-
if (!entry) return done(new Error(
142-
'getTransformsForFile may only be called after adding your entry file'
143-
))
144-
145-
var entryDir = path.dirname(path.resolve(entry.file))
146-
var fileDir = path.dirname(path.resolve(filename))
147-
var relative = path.relative(entryDir, fileDir).split(path.sep)
148-
var node_modules = relative.indexOf('node_modules') !== -1
149-
var trLocal = node_modules ? [] : this._transforms
150-
var trCache = this._trCache
151-
152-
if (trCache[fileDir]) {
153-
return done(null, trCache[fileDir])
154-
}
155-
156-
findup(fileDir, 'package.json', function(err, found) {
157-
var notFound = err && err.message === 'not found'
158-
if (notFound) return register([])
159-
if (err) return done(err)
160-
161-
var pkg = path.join(found, 'package.json')
162-
163-
self.readFile(pkg, function(err, pkgjson) {
164-
if (err) return done(err)
165-
166-
try {
167-
pkgjson = JSON.parse(pkgjson)
168-
} catch(e) { return done(e) }
169-
170-
var transforms = (
171-
pkgjson['glslify']
172-
&& pkgjson['glslify']['transform']
173-
|| []
174-
)
175-
176-
transforms = transforms.map(function(key) {
177-
var transform = Array.isArray(key)
178-
? key
179-
: [key, {}]
180-
181-
var key = transform[0]
182-
var opt = transform[1]
183-
184-
if (opt) {
185-
delete opt.global
186-
delete opt.post
187-
}
188-
189-
return { tr: key, opts: opt, name: key }
190-
}).map(function(tr) {
191-
tr.tr = self.resolveTransform(tr.tr)
192-
return tr
193-
})
194-
195-
register(transforms)
196-
})
197-
})
198-
199-
function register(transforms) {
200-
done(null, trCache[fileDir] = trLocal
201-
.concat(transforms)
202-
.concat(self._globalTransforms))
203-
}
204-
}

sync.js

Lines changed: 0 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -97,78 +97,3 @@ DepperSync.prototype.add = function(filename) {
9797
})
9898
}
9999
}
100-
101-
/**
102-
* Determines which transforms to use for a particular file.
103-
* The rules here are the same you see in browserify:
104-
*
105-
* - your shader files will have your specified transforms applied to them
106-
* - shader files in node_modules do not get local transforms
107-
* - all files will apply transforms specified in `glslify.transform` in your
108-
* `package.json` file, albeit after any transforms you specified using
109-
* `depperSync.transform`.
110-
*
111-
* @param {String} filename The absolute path of the file in question.
112-
*/
113-
DepperSync.prototype.getTransformsForFile = function(filename) {
114-
var self = this
115-
var entry = this._deps[0]
116-
117-
if (!entry) throw new Error(
118-
'getTransformsForFile may only be called after adding your entry file'
119-
)
120-
121-
var entryDir = path.dirname(path.resolve(entry.file))
122-
var fileDir = path.dirname(path.resolve(filename))
123-
var relative = path.relative(entryDir, fileDir).split(path.sep)
124-
var node_modules = relative.indexOf('node_modules') !== -1
125-
var trLocal = node_modules ? [] : this._transforms
126-
var trCache = this._trCache
127-
128-
if (trCache[fileDir]) {
129-
return trCache[fileDir]
130-
}
131-
132-
try { var found = findup(fileDir, 'package.json') }
133-
catch (err) {
134-
var notFound = err.message === 'not found'
135-
if (notFound) return register([])
136-
else throw err
137-
}
138-
139-
var pkg = path.join(found, 'package.json')
140-
var pkgjson = JSON.parse(self.readFile(pkg))
141-
142-
var transforms = (
143-
pkgjson['glslify']
144-
&& pkgjson['glslify']['transform']
145-
|| []
146-
)
147-
148-
transforms = transforms.map(function(key) {
149-
var transform = Array.isArray(key)
150-
? key
151-
: [key, {}]
152-
153-
var key = transform[0]
154-
var opt = transform[1]
155-
156-
if (opt) {
157-
delete opt.global
158-
delete opt.post
159-
}
160-
161-
return { tr: key, opts: opt, name: key }
162-
}).map(function(tr) {
163-
tr.tr = self.resolveTransform(tr.tr)
164-
return tr
165-
})
166-
167-
return register(transforms)
168-
169-
function register(transforms) {
170-
return trCache[fileDir] = trLocal
171-
.concat(transforms)
172-
.concat(self._globalTransforms)
173-
}
174-
}

utils.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* Gets glslify transform from given package.json
3+
*
4+
* @param {object|string} pkgJson package.json filename path or json
5+
* @returns {({tr: string, name: string, opts: object})[]}
6+
*/
7+
const getTransformsFromPkg = (pkgJson) => {
8+
if (typeof pkgJson === 'string') {
9+
pkgJson = JSON.parse(pkgJson);
10+
}
11+
12+
var transforms = (
13+
pkgJson['glslify']
14+
&& pkgJson['glslify']['transform']
15+
|| []
16+
)
17+
18+
return transforms.map(function(key) {
19+
var transform = Array.isArray(key)
20+
? key
21+
: [key, {}]
22+
23+
var key = transform[0]
24+
var opt = transform[1]
25+
26+
if (opt) {
27+
delete opt.global
28+
delete opt.post
29+
}
30+
31+
return { tr: key, opts: opt, name: key }
32+
});
33+
}
34+
35+
module.exports = {
36+
getTransformsFromPkg
37+
}

0 commit comments

Comments
 (0)