Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit d04ee30

Browse filesBrowse files
committed
factor out lookup stuff
1 parent bc3f96a commit d04ee30
Copy full SHA for d04ee30

File tree

Expand file treeCollapse file tree

2 files changed

+187
-182
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+187
-182
lines changed

‎lib/builders/lookup.js

Copy file name to clipboard
+184Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
2+
module.exports = lookup;
3+
4+
var url = require('url');
5+
var path = require('path');
6+
var debug = require('debug')('component-builder:scripts:lookup');
7+
8+
// default extensions to look up
9+
var extensions = [
10+
'',
11+
'.js',
12+
'.json',
13+
'/index.js',
14+
];
15+
16+
/**
17+
* From a file, lookup another file within that dep.
18+
* For use within `require()`s.
19+
*
20+
* To do:
21+
*
22+
* - people like @raynos will want to be able to do require('component/lib') or something but F that!
23+
*
24+
* @param {Object} file
25+
* @param {String} target
26+
* @return {String} name
27+
*/
28+
29+
function* lookup (file, target, opts) {
30+
target = target.toLowerCase();
31+
32+
var currentDir = target.slice(0, 2) === './';
33+
var parentDir = target.slice(0, 3) === '../';
34+
if (currentDir || parentDir ) {
35+
var lookup_ = lookupRelative(file, target);
36+
if (lookup_ != null) return lookup_;
37+
return target;
38+
} else {
39+
return yield* lookupDependency(file, target, opts);
40+
}
41+
}
42+
43+
44+
/**
45+
* Lookup a relative file.
46+
*
47+
* @param {Object} file
48+
* @param {String} target
49+
* @return {String} name
50+
* @api private
51+
*/
52+
53+
function lookupRelative (file, target) {
54+
var path_ = url.resolve(file.path, target);
55+
var files = file.manifest.files;
56+
57+
for (var i = 0; i < files.length; i++) {
58+
var f = files[i];
59+
// we need this fallback to check relatives from a foreign local
60+
var name = f.name || path.join(f.manifest.name, path.relative(f.manifest.path, f.filename));
61+
for (var j = 0; j < extensions.length; j++) {
62+
// check by adding extensions
63+
if (f.path.toLowerCase() === path_ + extensions[j]) return name;
64+
}
65+
// check by removing extensions
66+
if (f.path.replace(/\.\w+$/, '').toLowerCase() === path_) return name;
67+
}
68+
69+
var message = 'ignore "' + target + '" , could not resolve from "' + file.branch.name + '"\'s file "' + file.path + '"';
70+
debug(message);
71+
return null;
72+
}
73+
74+
75+
/**
76+
* Look up a remote dependency.
77+
* Valid references:
78+
*
79+
* <repo>
80+
* <user>-<repo>
81+
* <user>~<repo>
82+
*
83+
* or:
84+
*
85+
* <reference>/<filename>
86+
*
87+
* @param {Object} component
88+
* @param {Object} file
89+
* @param {String} target
90+
* @return {String} name
91+
* @api private
92+
*/
93+
94+
function* lookupDependency (file, target, opts) {
95+
var frags = target.split('/');
96+
var reference = frags[0];
97+
var tail = frags.length > 1
98+
? ('/' + frags.slice(1).join('/'))
99+
: ''
100+
101+
var branch = file.branch;
102+
var deps = branch.dependencies;
103+
var names = Object.keys(deps);
104+
105+
// <user>~<repo>
106+
if (~reference.indexOf('~')) {
107+
var name = reference.replace('~', '/');
108+
if (deps[name]) return deps[name].canonical + tail;
109+
}
110+
111+
// <user>-<repo>
112+
if (~reference.indexOf('-')) {
113+
for (var i = 0; i < names.length; i++) {
114+
var name = names[i];
115+
if (reference === name.replace('/', '-')) {
116+
return deps[name].canonical + tail;
117+
}
118+
}
119+
}
120+
121+
// local
122+
var localDeps = Object.keys(branch.locals);
123+
for (var i = 0; i < localDeps.length; i++) {
124+
// Find a local dependency that matches as a prefix of the target
125+
// or the whole target, and return the canonical path.
126+
var re = new RegExp("^("+localDeps[i]+")(/.*)?$");
127+
if (m = re.exec(target)) {
128+
var dep = m[1];
129+
var tail = m[2] || '';
130+
if (tail !== '') {
131+
var relativeFile = '.' + tail;
132+
var resolvedTail = yield* lookupRelativeForLocal(branch.locals[dep], relativeFile, opts);
133+
if (resolvedTail != null) {
134+
debug('resolved relative file for local "' + dep + '/' + resolvedTail + '"');
135+
return branch.locals[dep].canonical + '/' + resolvedTail;
136+
}
137+
}
138+
return branch.locals[dep].canonical + tail;
139+
140+
}
141+
}
142+
143+
// <repo>
144+
for (var i = 0; i < names.length; i++) {
145+
var name = names[i];
146+
var repo = name.split('/')[1];
147+
if (repo === reference) {
148+
return deps[name].canonical + tail;
149+
}
150+
}
151+
152+
// component.json name, if different than repo
153+
for (var i = 0; i < names.length; i++) {
154+
var name = names[i];
155+
var dep = deps[name];
156+
if (dep.node.name.toLowerCase() === reference) {
157+
return dep.canonical + tail;
158+
}
159+
}
160+
161+
// to do: look up stuff outside the dependencies
162+
debug('could not resolve "%s" from "%s"', target, file.name)
163+
return target
164+
}
165+
166+
function* lookupRelativeForLocal (localBranch, relativeTarget, opts) {
167+
var createManifest = require('component-manifest');
168+
169+
var manifestGenerator = createManifest(opts);
170+
var manifest = yield* manifestGenerator(localBranch);
171+
172+
var obj = {
173+
path: '', // it should simulate a url-relative path
174+
manifest: manifest,
175+
branch: localBranch
176+
}
177+
// resolve the file (if extension is not provided)
178+
var resolved = lookupRelative(obj, relativeTarget);
179+
if (resolved == null) return null;
180+
181+
var relative = path.relative(manifest.name, resolved);
182+
183+
return relative;
184+
}

‎lib/builders/scripts.js

Copy file name to clipboardExpand all lines: lib/builders/scripts.js
+3-182Lines changed: 3 additions & 182 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,13 @@
11

22
var debug = require('debug')('component-builder:scripts');
3-
var path = pathUtil = require('path');
3+
var path = require('path');
44
var relative = path.relative;
55
var requires = require('requires');
66
var fs = require('graceful-fs');
7-
var url = require('url');
7+
var lookup = require('./lookup.js');
88

99
var Builder = require('./builder');
1010
var utils = require('../utils');
11-
var manifest = require('component-manifest');
12-
13-
// default extension to look up
14-
var extensions = [
15-
'',
16-
'.js',
17-
'.json',
18-
'/index.js',
19-
]
2011

2112
module.exports = Scripts
2213

@@ -207,7 +198,7 @@ Scripts.prototype.register = function* (file) {
207198
for (var i=0; i<result.length; i++) {
208199
var require = result[i];
209200
var quote = require.string.match(/"/) ? '"' : "'";
210-
var resolvedPath = yield* self.lookup(file, require.path);
201+
var resolvedPath = yield* lookup(file, require.path, self);
211202
var resolvedRequire = 'require(' + quote + resolvedPath + quote + ')';
212203
js = js.replace(require.string, resolvedRequire);
213204
}
@@ -314,176 +305,6 @@ Scripts.prototype.aliasModule = function (manifest) {
314305
}).join('') + '\n\n';
315306
}
316307

317-
/**
318-
* From a file, lookup another file within that dep.
319-
* For use within `require()`s.
320-
*
321-
* To do:
322-
*
323-
* - people like @raynos will want to be able to do require('component/lib') or something but F that!
324-
*
325-
* @param {Object} file
326-
* @param {String} target
327-
* @return {String} name
328-
* @api private
329-
*/
330-
331-
Scripts.prototype.lookup = function* (file, target) {
332-
target = target.toLowerCase();
333-
334-
var currentDir = target.slice(0, 2) === './';
335-
var parentDir = target.slice(0, 3) === '../';
336-
if (currentDir || parentDir ) {
337-
var lookup = this.lookupRelative(file, target);
338-
if (lookup != null) return lookup;
339-
return target;
340-
} else {
341-
return yield* this.lookupDependency(file, target);
342-
}
343-
}
344-
345-
/**
346-
* Lookup a relative file.
347-
*
348-
* @param {Object} file
349-
* @param {String} target
350-
* @return {String} name
351-
* @api private
352-
*/
353-
354-
Scripts.prototype.lookupRelative = function (file, target) {
355-
var path = url.resolve(file.path, target);
356-
var files = file.manifest.files;
357-
358-
for (var i = 0; i < files.length; i++) {
359-
var f = files[i];
360-
// we need this fallback to check relatives from a foreign local
361-
var name = f.name || pathUtil.join(f.manifest.name, pathUtil.relative(f.manifest.path, f.filename));
362-
for (var j = 0; j < extensions.length; j++) {
363-
// check by adding extensions
364-
if (f.path.toLowerCase() === path + extensions[j]) return name;
365-
}
366-
// check by removing extensions
367-
if (f.path.replace(/\.\w+$/, '').toLowerCase() === path) return name;
368-
}
369-
370-
var message = 'ignore "' + target + '" , could not resolve from "' + file.branch.name + '"\'s file "' + file.path + '"';
371-
debug(message);
372-
return null;
373-
}
374-
375-
/**
376-
* Look up a remote dependency.
377-
* Valid references:
378-
*
379-
* <repo>
380-
* <user>-<repo>
381-
* <user>~<repo>
382-
*
383-
* or:
384-
*
385-
* <reference>/<filename>
386-
*
387-
* @param {Object} component
388-
* @param {Object} file
389-
* @param {String} target
390-
* @return {String} name
391-
* @api private
392-
*/
393-
394-
Scripts.prototype.lookupDependency = function* (file, target) {
395-
var frags = target.split('/');
396-
var reference = frags[0];
397-
var tail = frags.length > 1
398-
? ('/' + frags.slice(1).join('/'))
399-
: ''
400-
401-
var branch = file.branch;
402-
var deps = branch.dependencies;
403-
var names = Object.keys(deps);
404-
405-
// <user>~<repo>
406-
if (~reference.indexOf('~')) {
407-
var name = reference.replace('~', '/');
408-
if (deps[name]) return deps[name].canonical + tail;
409-
}
410-
411-
// <user>-<repo>
412-
if (~reference.indexOf('-')) {
413-
for (var i = 0; i < names.length; i++) {
414-
var name = names[i];
415-
if (reference === name.replace('/', '-')) {
416-
return deps[name].canonical + tail;
417-
}
418-
}
419-
}
420-
421-
// local
422-
var localDeps = Object.keys(branch.locals);
423-
for (var i = 0; i < localDeps.length; i++) {
424-
// Find a local dependency that matches as a prefix of the target
425-
// or the whole target, and return the canonical path.
426-
var re = new RegExp("^("+localDeps[i]+")(/.*)?$");
427-
if (m = re.exec(target)) {
428-
var dep = m[1];
429-
var tail = m[2] || '';
430-
if (tail !== '') {
431-
var relativeFile = '.' + tail;
432-
var resolvedTail = yield* this.lookupRelativeForLocal(branch.locals[dep], relativeFile);
433-
if (resolvedTail != null) {
434-
debug('resolved relative file for local "' + dep + '/' + resolvedTail + '"');
435-
return branch.locals[dep].canonical + '/' + resolvedTail;
436-
}
437-
}
438-
return branch.locals[dep].canonical + tail;
439-
440-
}
441-
}
442-
443-
// <repo>
444-
for (var i = 0; i < names.length; i++) {
445-
var name = names[i];
446-
var repo = name.split('/')[1];
447-
if (repo === reference) {
448-
return deps[name].canonical + tail;
449-
}
450-
}
451-
452-
// component.json name, if different than repo
453-
for (var i = 0; i < names.length; i++) {
454-
var name = names[i];
455-
var dep = deps[name];
456-
if (dep.node.name.toLowerCase() === reference) {
457-
return dep.canonical + tail;
458-
}
459-
}
460-
461-
// to do: look up stuff outside the dependencies
462-
debug('could not resolve "%s" from "%s"', target, file.name)
463-
return target
464-
}
465-
466-
Scripts.prototype.lookupRelativeForLocal = function* (localBranch, relativeTarget) {
467-
var createManifest = require('component-manifest');
468-
469-
var manifestGenerator = createManifest(this);
470-
var manifest = yield* manifestGenerator(localBranch);
471-
472-
var obj = {
473-
path: '', // it should simulate a url-relative path
474-
manifest: manifest,
475-
branch: localBranch
476-
}
477-
// resolve the file (if extension is not provided)
478-
var resolved = this.lookupRelative(obj, relativeTarget);
479-
if (resolved == null) return null;
480-
481-
var relative = pathUtil.relative(manifest.name, resolved);
482-
483-
return relative;
484-
}
485-
486-
487308
// private helpers
488309

489310
function assetPaths(source, replacer) {

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.