Esempio n. 1
0
            convert: function (target, depends, exports, noConflict) {
                var contents = fs.readFileSync(target, 'utf8'),
                    prelude = '',
                    temp, commentIndex, cjsProps, amdProps;

                if (contents.charAt(0) === '#') {
                    //This is probably an executable file for node, skip it.
                    return 'SKIP: ' + target + ': node executable script.';
                }

                amdProps = parse.usesAmdOrRequireJs(target, contents);
                if (amdProps && (!amdProps.declaresDefine ||
                                (amdProps.declaresDefine && amdProps.defineAmd))) {
                    //AMD in use, and it is not a file that declares a define()
                    //or if it does, does not declare define.amd.
                    return 'SKIP: ' + target + ': already uses AMD.';
                } else {
                    cjsProps = parse.usesCommonJs(target, contents);
                    //If no exports or depends and it looks like a cjs module convert
                    if (!exports && !depends && cjsProps) {
                        if (cjsProps.filename || cjsProps.dirname) {
                            prelude = "var __filename = module.uri, " +
                                      "__dirname = __filename.substring(0, __filename.lastIndexOf('/');";
                        }
                        //Just do a simple wrapper.
                        contents = 'define(function (require, exports, module) {' + prelude + '\n' +
                                    contents +
                                    '\n});';
                        fs.writeFileSync(target, contents, 'utf8');
                        return 'CONVERTED: ' + target + ': wrapped define().';
                    } else {
                        //Get the export boilerplate ready.
                        if (exports) {
                            exports = noConflict ?
                                        exportsNoConflictTemplate.replace(exportsRegExp, exports) :
                                        exportsTemplate.replace(exportsRegExp, exports);
                        }

                        //Create the main wrapping. Do depends and exports replacement
                        //before inserting the main contents, to avoid problems with
                        //a possibly undesirable regexp replacement.
                        temp = template
                                .replace(dependsRegExp, depends)
                                .replace(exportsRegExp, exports);

                        //Cannot use a regexp replacement for comment, because if
                        //the contents contain funky regexp associated markers, like
                        //a `$`, then get double content insertion.
                        commentIndex = temp.indexOf(contentsComment);
                        contents = temp.substring(0, commentIndex) +
                                   contents +
                                   temp.substring(commentIndex + contentsComment.length, temp.length);

                        fs.writeFileSync(target, contents, 'utf8');

                        return 'CONVERTED: ' + target + ': depends: ' + depends +
                               '; exports: ' + exports + '.';
                    }
                }
            }
Esempio n. 2
0
            convert: function (target, depends, varNames, exports, options) {
                options = options || {};

                var contents = fs.readFileSync(target, 'utf8'),
                    prelude = '',
                    d = q.defer(),
                    v = options.v,
                    dependPrompted = false,
                    suggestions = [
                        {
                            re: /jquery/i,
                            suggest: 'jquery',
                            fullSuggest: 'jquery=jQuery'
                        },
                        {
                            re: /backbone/i,
                            suggest: 'backbone',
                            fullSuggest: 'backbone=Backbone'
                        }
                    ],
                    temp, commentIndex, cjsProps, amdProps, dependSuggestion,
                    dependFullSuggestion;

                if (contents.charAt(0) === '#') {
                    //This is probably an executable file for node, skip it.
                    d.resolve('SKIP: ' + target + ': node executable script.');
                }

                amdProps = parse.usesAmdOrRequireJs(target, contents);
                if (amdProps && (!amdProps.declaresDefine ||
                                (amdProps.declaresDefine && amdProps.defineAmd))) {
                    //AMD in use, and it is not a file that declares a define()
                    //or if it does, does not declare define.amd.
                    d.resolve('SKIP: ' + target + ': already uses AMD.');
                } else {
                    cjsProps = parse.usesCommonJs(target, contents);
                    //If no exports or depends and it looks like a cjs module convert
                    if (!exports && !depends && cjsProps) {
                        if (cjsProps.filename || cjsProps.dirname) {
                            prelude = "var __filename = module.uri, " +
                                      "__dirname = __filename.substring(0, __filename.lastIndexOf('/');";
                        }
                        //Just do a simple wrapper.
                        contents = 'define(function (require, exports, module) {' + prelude + '\n' +
                                    contents +
                                    '\n});';
                        fs.writeFileSync(target, contents, 'utf8');
                        d.resolve('CONVERTED: ' + target + ': wrapped define().');
                    } else {
                        //May need to prompt the user for input so use promises.
                        d.resolve(q.call(function () {
                            var message;

                            //If no explicit depends passed in, ask, but only if no exports
                            //either and noprompt is not in play.
                            if (v && !depends && !exports && !options.noprompt) {
                                dependPrompted = true;

                                //Suggest a dependency for common things.
                                suggestions.some(function (suggestion) {
                                    //If a match, but he match is not [suggest].js, which
                                    //indicates the actual suggestion is being installed,
                                    //not something that depends on it.
                                    if (suggestion.re.test(target) &&
                                        target.lastIndexOf(suggestion.suggest + '.js') !==
                                        target.length - suggestion.suggest.length - 3) {
                                        dependSuggestion = suggestion.suggest;
                                        dependFullSuggestion = suggestion.fullSuggest;
                                        return true;
                                    }
                                });

                                message = 'No AMD/CommonJS dependencies ' +
                                          'detected for: ' + target + '\n' +
                                          'List any dependencies, ' +
                                          'comma separated, no spaces' +
                                          (dependSuggestion ? ' [' + dependSuggestion + ']' : '') +
                                          ': ';
                                return v.prompt(message);
                            }
                        }).then(function (promptDepends) {
                            //If no value, but there was a suggestion, the suggestion is wanted.
                            if (!promptDepends && dependFullSuggestion) {
                                promptDepends = dependFullSuggestion;
                            }

                            if (promptDepends) {
                                depends = promptDepends;
                            }

                            //If no explicit depends passed in, ask, but only if no depends
                            //either and noprompt is not in play.
                            if (v && !exports && dependPrompted && !options.noprompt) {
                                return v.prompt('What global to use for exported value []: ');
                            }
                        }).then(function (promptExports) {
                            var parsed;

                            if (promptExports) {
                                exports = promptExports;
                            }

                            if (dependPrompted) {
                                parsed = parseDepends(depends);
                                depends = parsed.depends;
                                varNames = parsed.varNames;
                            }

                            //Get the export boilerplate ready.
                            if (exports) {
                                exports = options.noConflict ?
                                            exportsNoConflictTemplate.replace(exportsRegExp, exports) :
                                            exportsTemplate.replace(exportsRegExp, exports);
                            }

                            //Create the main wrapping. Do depends and exports replacement
                            //before inserting the main contents, to avoid problems with
                            //a possibly undesirable regexp replacement.
                            temp = template
                                    .replace(dependsRegExp, depends)
                                    .replace(varNamesRegExp, varNames)
                                    .replace(exportsRegExp, exports);

                            //Cannot use a regexp replacement for comment, because if
                            //the contents contain funky regexp associated markers, like
                            //a `$`, then get double content insertion.
                            commentIndex = temp.indexOf(contentsComment);
                            contents = temp.substring(0, commentIndex) +
                                       contents +
                                       temp.substring(commentIndex + contentsComment.length, temp.length);

                            fs.writeFileSync(target, contents, 'utf8');

                            return 'CONVERTED: ' + target +
                                   (depends ? ': depends: ' + depends.trim() : '') +
                                   (varNames ? ': localvars: ' + varNames : '') +
                                   (exports ? ': exports: ' + exports.trim() : '');
                        }));
                    }
                }
                return d.promise;
            }