Skip to content

Commit 35fb74f

Browse files
author
rubeniskov
committed
refactor migrate NodeDepper.add to Depper.add
1 parent 49ea8ad commit 35fb74f

File tree

3 files changed

+141
-108
lines changed

3 files changed

+141
-108
lines changed

depper.js

Lines changed: 128 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ var {
99
genInlineName,
1010
cacheWrap,
1111
parseFiles,
12+
getImportName,
13+
extractPreprocessors,
14+
asyncify,
1215
} = require('./utils.js')
1316

1417

@@ -143,10 +146,76 @@ Depper.prototype.inline = function(source, basedir, done) {
143146
}
144147

145148
/**
146-
* Add method dummy interface
149+
* Adds a shader file to the graph, including its dependencies
150+
* which are resolved in this step. Transforms are also applied
151+
* in the process too, as they may potentially add or remove dependent
152+
* modules.
153+
*
154+
* @param {String} filename The absolute path of this file.
155+
* @param {Object} [opts] The options will be pased to _resolveImports function.
156+
* @param {(err: Error, deps?: object[]) => any} [done]
157+
*
158+
* If async is defined then `done` callback will be called when the entire graph has been
159+
* resolved, and will include an array of dependencies discovered
160+
* so far as its second argument.
161+
*
162+
* If sync returns an array of dependencies discovered so far as its second argument.
147163
*/
148-
Depper.prototype.add = function(filename, cb) {
164+
Depper.prototype.add = function(filename, opts, done) {
165+
if (typeof opts === 'function') {
166+
done = opts
167+
opts = {}
168+
}
149169

170+
var self = this
171+
var exports = []
172+
var imports = []
173+
var dep = this._addDep(filename)
174+
var resolveOpts = Object.assign({
175+
deps: dep.deps,
176+
}, opts)
177+
178+
var process = asyncify(
179+
function(_, next) {return self.readFile(filename, next) },
180+
function(_, next) {return self.getTransformsForFile(filename, next) },
181+
function(result, next) {
182+
// @ts-ignore
183+
self.emit('file', filename)
184+
return self.applyTransforms(filename, result[0], result[1], next)
185+
},
186+
function(result, next) {
187+
extractPreprocessors(dep.source = result[2], imports, exports)
188+
return self._resolveImports(imports, resolveOpts, next)
189+
}, function(_, next) {
190+
if(next) {
191+
next(null, self._deps)
192+
}
193+
})
194+
195+
196+
if (this._async) {
197+
process(done || function() {
198+
console.warn('glslify-deps: depper.add() has not a callback defined using async flow')
199+
})
200+
return dep
201+
} else {
202+
process()
203+
return this._deps
204+
}
205+
}
206+
207+
/**
208+
* Dummy internal function for resolve transforms for a file
209+
* @param {String} filename The absolute path of the file in question.
210+
* @param {(err: Error, transforms?: GlslTransform[]) => any} [done] Applies when async true
211+
* @returns {GlslTransform[]} List of transform for a file
212+
*/
213+
Depper.prototype.getTransformsForFile = function(filename, done) {
214+
if(done) {
215+
done(null, [])
216+
}
217+
console.warn('glslify-deps: depper.getTransformsForFile() not yet implemented')
218+
return []
150219
}
151220

152221
/**
@@ -272,7 +341,7 @@ Depper.prototype.applyTransforms = function(filename, src, transforms, done) {
272341

273342
/**
274343
* Internal method to add dependencies
275-
* @param {object} extra
344+
* @param {object} [extra]
276345
*/
277346
Depper.prototype._addDep = function(file, extra) {
278347
var dep = Object.assign({
@@ -318,6 +387,62 @@ Depper.prototype._register = function(transforms, cb) {
318387
return result
319388
}
320389

390+
/**
391+
* Internal async method to retrieve dependencies
392+
* resolving imports using the internal cache
393+
*
394+
* @param {string[]} imports
395+
* @param {object} [opts] The options will be pased to resolve function.
396+
* @param {object} [opts.deps] Existing dependencies
397+
* @param {number} [opts.parallel=10] Parallel threads when async
398+
* @param {(err: Error) => any} [done]
399+
* @return {object} Resolved dependencies
400+
*/
401+
Depper.prototype._resolveImports = function(imports, opts, done) {
402+
if (typeof opts === 'function') {
403+
done = opts
404+
opts = {}
405+
}
406+
var self = this
407+
var deps = opts && opts.deps || {}
408+
var parallel = opts && opts.parallel || 10
409+
410+
var process = asyncify(
411+
function(result, next) { return self.resolve(result[0], opts, next) },
412+
function(result, next) {
413+
var importName = result[0]
414+
var resolved = result[1]
415+
if (self._cache[resolved]) {
416+
deps[importName] = self._cache[resolved].id
417+
return next && next()
418+
}
419+
if (next) {
420+
self._cache[resolved] = self.add(resolved, function(err) {
421+
if (err) return next(err)
422+
deps[importName] = self._cache[resolved].id
423+
next()
424+
})
425+
} else {
426+
var idx = self._i
427+
self._cache[resolved] = self.add(resolved)[idx]
428+
deps[importName] = self._cache[resolved].id
429+
}
430+
}
431+
)
432+
433+
if (this._async) {
434+
map(imports, parallel, function(imp, next) {
435+
process([getImportName(imp)], next)
436+
}, done)
437+
} else {
438+
imports.forEach(function (imp) {
439+
process([getImportName(imp)])
440+
})
441+
}
442+
443+
return deps
444+
}
445+
321446
Depper.prototype.readFile = function(filename, done) {
322447
if (path.basename(filename) !== this._inlineName)
323448
return this._readFile(filename, done)

node.js

Lines changed: 10 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,8 @@ var glslResolve = require('glsl-resolve')
99
var transformRequire = require('./transform-require')
1010

1111
var {
12-
getImportName,
13-
extractPreprocessors,
1412
getTransformsFromPkg,
1513
mix,
16-
asyncify
1714
} = require('./utils');
1815

1916
function createDefaultRead() {
@@ -30,7 +27,10 @@ function createDefaultRead() {
3027

3128
/**
3229
*
33-
* @class
30+
* @constructor
31+
* @param {string} cwd
32+
*//**
33+
* @constructor
3434
* @param {DepperOptions} opts
3535
*/
3636
function NodeDepper(opts) {
@@ -45,109 +45,15 @@ function NodeDepper(opts) {
4545
}
4646

4747
/**
48-
* Adds a shader file to the graph, including its dependencies
49-
* which are resolved in this step. Transforms are also applied
50-
* in the process too, as they may potentially add or remove dependent
51-
* modules.
52-
*
48+
* @override
5349
* @param {String} filename The absolute path of this file.
5450
* @param {(err: Error, deps?: object[]) => any} [done]
55-
*
56-
* If async is defined then `done` callback will be called when the entire graph has been
57-
* resolved, and will include an array of dependencies discovered
58-
* so far as its second argument.
59-
*
60-
* If sync returns an array of dependencies discovered so far as its second argument.
6151
*/
6252
NodeDepper.prototype.add = function(filename, done) {
63-
var basedir = path.dirname(filename = path.resolve(filename))
64-
var self = this
65-
var exports = []
66-
var imports = []
67-
68-
var dep = this._addDep(filename)
69-
70-
var process = asyncify(
71-
function(_, next) {return self.readFile(filename, next) },
72-
function(_, next) {return self.getTransformsForFile(filename, next) },
73-
function(result, next) {
74-
self.emit('file', filename)
75-
return self.applyTransforms(filename, result[0], result[1], next)
76-
},
77-
function(result, next) {
78-
extractPreprocessors(dep.source = result[2], imports, exports)
79-
return self._resolveImports(imports, {
80-
deps: dep.deps,
81-
basedir: basedir
82-
}, next)
83-
}, function(_, next) {
84-
if(next) {
85-
next(null, self._deps)
86-
}
87-
})
88-
89-
90-
if (this._async) {
91-
process(done || function() {
92-
console.warn('glslify-deps: depper.add() has not a callback defined using async flow')
93-
})
94-
return dep
95-
} else {
96-
process()
97-
return this._deps
98-
}
99-
}
100-
101-
/**
102-
* Internal async method to retrieve dependencies
103-
* resolving imports using the internal cache
104-
*
105-
* @param {string[]} imports
106-
* @param {object} opts extends options for https://www.npmjs.com/package/resolve
107-
* @param {object} opts.deps existing dependencies
108-
* @param {(err: Error) => any} [done]
109-
* @return {object} resolved dependencies
110-
*/
111-
NodeDepper.prototype._resolveImports = function(imports, opts, done) {
112-
opts = opts || {}
113-
var self = this
114-
var deps = opts.deps || {}
115-
var parallel = opts.parallel || 10
116-
117-
var process = asyncify(
118-
function(result, next) { return self.resolve(result[0], opts, next) },
119-
function(result, next) {
120-
var importName = result[0]
121-
var resolved = result[1]
122-
if (self._cache[resolved]) {
123-
deps[importName] = self._cache[resolved].id
124-
return next && next()
125-
}
126-
if (next) {
127-
self._cache[resolved] = self.add(resolved, function(err) {
128-
if (err) return next(err)
129-
deps[importName] = self._cache[resolved].id
130-
next()
131-
})
132-
} else {
133-
var idx = self._i
134-
self._cache[resolved] = self.add(resolved)[idx]
135-
deps[importName] = self._cache[resolved].id
136-
}
137-
}
138-
)
139-
140-
if (this._async) {
141-
map(imports, parallel, function(imp, next) {
142-
process([getImportName(imp)], next)
143-
}, done)
144-
} else {
145-
imports.forEach(function (imp) {
146-
process([getImportName(imp)])
147-
})
148-
}
149-
150-
return deps
53+
var resolved = path.resolve(filename);
54+
return Depper.prototype.add.call(this, resolved, {
55+
basedir: path.dirname(resolved)
56+
}, done)
15157
}
15258

15359
/**
@@ -162,6 +68,7 @@ NodeDepper.prototype._resolveImports = function(imports, opts, done) {
16268
*
16369
* @param {String} filename The absolute path of the file in question.
16470
* @param {(err: Error, transforms?: GlslTransform[]) => any} [done] Applies when async true
71+
* @returns {GlslTransform[]} List of transform for a file
16572
*/
16673
NodeDepper.prototype.getTransformsForFile = function(filename, done) {
16774
var self = this

utils.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,14 @@ function mix(sync, async) {
129129
return mixed
130130
}
131131

132+
132133
/**
133134
* Allows reuse sync/async logics detecting if done is defined to select which strategy to use.
134135
* Arguments must be functions, if sync is detected then takes the returned value,
135136
* otherwise when async next will be defined and will take the result from there
136137
*
137-
* @param {...(prevState: any[], next?: (err: Error, result?: any) => null) => any} args
138-
* @returns {(initialState?: any[], done?: (err: Error, state?: any[]) => any) => any[]}
138+
* @param {...(prevState: any[], next?: (err?: Error, result?: any) => null) => any} args
139+
* @returns {((initialState?: any[], done?: (err: Error, state?: any[]) => any) => any[])&((done?: (err: Error, state?: any[]) => any) => any[])}
139140
* @example
140141
*
141142
* const process = asyncify(

0 commit comments

Comments
 (0)