Skip to content

Commit f4aaca0

Browse files
committed
Add a parse test for AMD/RequireJS usage. Needed more for volo.
1 parent 606e3f0 commit f4aaca0

File tree

3 files changed

+149
-2
lines changed

3 files changed

+149
-2
lines changed

build/jslib/parse.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,21 @@ define(['uglifyjs/index'], function (uglify) {
454454
return dependencies;
455455
};
456456

457+
/**
458+
* Determines if define(), require({}|[]) or requirejs was called in the
459+
* file.
460+
*/
461+
parse.usesAmdOrRequireJs = function (fileName, fileContents, options) {
462+
var uses = false,
463+
astRoot = parser.parse(fileContents);
464+
465+
parse.recurse(astRoot, function (callName, config, name, deps) {
466+
return (uses = true);
467+
}, options, parse.findAmdOrRequireJsNode);
468+
469+
return uses;
470+
};
471+
457472
parse.findRequireDepNames = function (node, deps) {
458473
var moduleName, i, n, call, args;
459474

@@ -611,6 +626,50 @@ define(['uglifyjs/index'], function (uglify) {
611626
return false;
612627
};
613628

629+
/**
630+
* Looks for define(), require({} || []), requirejs({} || []) calls.
631+
*/
632+
parse.findAmdOrRequireJsNode = function (node, onMatch) {
633+
var call, configNode, args;
634+
635+
if (!isArray(node)) {
636+
return false;
637+
}
638+
639+
if (node[0] === 'call') {
640+
call = node[1];
641+
args = node[2];
642+
643+
if (call) {
644+
//A require.config() or requirejs.config() call.
645+
if ((call[0] === 'dot' &&
646+
(call[1] && call[1][0] === 'name' &&
647+
(call[1][1] === 'require' || call[1][1] === 'requirejs')) &&
648+
call[2] === 'config') ||
649+
650+
//A require() or requirejs() config call.
651+
(call[0] === 'name' &&
652+
(call[1] === 'require' || call[1] === 'requirejs')) ||
653+
654+
//A define call.
655+
(call[0] === 'name' && call[1] === 'define')
656+
) {
657+
//It is a plain require() call.
658+
configNode = args[0];
659+
660+
//Is a define call or the first arg is a config object
661+
//or an array of dependencies.
662+
if (call[1] === 'define' || configNode[0] === 'object' ||
663+
configNode[0] === 'array') {
664+
return onMatch(configNode);
665+
}
666+
667+
}
668+
}
669+
}
670+
671+
return false;
672+
};
614673

615674
/**
616675
* Determines if a specific node is a valid require/requirejs config

build/tests/parse.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,33 @@ define(['parse', 'env!env/file'], function (parse, file) {
122122
);
123123
doh.run();
124124

125+
126+
doh.register('parseUsesAmdOrRequireJs',
127+
[
128+
function parseUsesAmdOrRequireJs(t) {
129+
var good1 = "(function(){ if (typeof define === 'function' && define.amd) { define(['some'], function (some) {}) } }());",
130+
good2 = "(function(){ if (typeof define === 'function' && define.amd) { define(definition); } }());",
131+
good3 = "require({ baseUrl: 'scripts' }, ['main']);",
132+
good4 = "requirejs({ baseUrl: 'scripts' }, ['main']);",
133+
good5 = "require.config({ baseUrl: 'scripts' });",
134+
good6 = "require(['something']);",
135+
good7 = "requirejs(['something'], function (something){});",
136+
137+
bad1 = "var dep = require('dep');",
138+
bad2 = "this.define('some', 'thing');";
139+
140+
t.is(true, parse.usesAmdOrRequireJs("good1", good1));
141+
t.is(true, parse.usesAmdOrRequireJs("good2", good2));
142+
t.is(true, parse.usesAmdOrRequireJs("good3", good3));
143+
t.is(true, parse.usesAmdOrRequireJs("good4", good3));
144+
t.is(true, parse.usesAmdOrRequireJs("good5", good3));
145+
t.is(true, parse.usesAmdOrRequireJs("good6", good3));
146+
t.is(true, parse.usesAmdOrRequireJs("good7", good3));
147+
t.is(false, parse.usesAmdOrRequireJs("bad1", bad1));
148+
t.is(false, parse.usesAmdOrRequireJs("bad2", bad2));
149+
}
150+
]
151+
);
152+
doh.run();
153+
125154
});

dist/r.js

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* @license r.js 1.0.5 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
2+
* @license r.js 1.0.5 Tue, 31 Jan 2012 00:43:16 GMT Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
33
* Available via the MIT or new BSD license.
44
* see: http://github.com/jrburke/requirejs for details
55
*/
@@ -20,7 +20,7 @@ var requirejs, require, define;
2020

2121
var fileName, env, fs, vm, path, exec, rhinoContext, dir, nodeRequire,
2222
nodeDefine, exists, reqMain, loadedOptimizedLib,
23-
version = '1.0.5',
23+
version = '1.0.5 Tue, 31 Jan 2012 00:43:16 GMT',
2424
jsSuffixRegExp = /\.js$/,
2525
commandOption = '',
2626
useLibLoaded = {},
@@ -7024,6 +7024,21 @@ define('parse', ['uglifyjs/index'], function (uglify) {
70247024
return dependencies;
70257025
};
70267026

7027+
/**
7028+
* Determines if define(), require({}|[]) or requirejs was called in the
7029+
* file.
7030+
*/
7031+
parse.usesAmdOrRequireJs = function (fileName, fileContents, options) {
7032+
var uses = false,
7033+
astRoot = parser.parse(fileContents);
7034+
7035+
parse.recurse(astRoot, function (callName, config, name, deps) {
7036+
return (uses = true);
7037+
}, options, parse.findAmdOrRequireJsNode);
7038+
7039+
return uses;
7040+
};
7041+
70277042
parse.findRequireDepNames = function (node, deps) {
70287043
var moduleName, i, n, call, args;
70297044

@@ -7181,6 +7196,50 @@ define('parse', ['uglifyjs/index'], function (uglify) {
71817196
return false;
71827197
};
71837198

7199+
/**
7200+
* Looks for define(), require({} || []), requirejs({} || []) calls.
7201+
*/
7202+
parse.findAmdOrRequireJsNode = function (node, onMatch) {
7203+
var call, configNode, args;
7204+
7205+
if (!isArray(node)) {
7206+
return false;
7207+
}
7208+
7209+
if (node[0] === 'call') {
7210+
call = node[1];
7211+
args = node[2];
7212+
7213+
if (call) {
7214+
//A require.config() or requirejs.config() call.
7215+
if ((call[0] === 'dot' &&
7216+
(call[1] && call[1][0] === 'name' &&
7217+
(call[1][1] === 'require' || call[1][1] === 'requirejs')) &&
7218+
call[2] === 'config') ||
7219+
7220+
//A require() or requirejs() config call.
7221+
(call[0] === 'name' &&
7222+
(call[1] === 'require' || call[1] === 'requirejs')) ||
7223+
7224+
//A define call.
7225+
(call[0] === 'name' && call[1] === 'define')
7226+
) {
7227+
//It is a plain require() call.
7228+
configNode = args[0];
7229+
7230+
//Is a define call or the first arg is a config object
7231+
//or an array of dependencies.
7232+
if (call[1] === 'define' || configNode[0] === 'object' ||
7233+
configNode[0] === 'array') {
7234+
return onMatch(configNode);
7235+
}
7236+
7237+
}
7238+
}
7239+
}
7240+
7241+
return false;
7242+
};
71847243

71857244
/**
71867245
* Determines if a specific node is a valid require/requirejs config

0 commit comments

Comments
 (0)