123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- /*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
- var glob = require('glob');
- var fsExtra = require('fs-extra');
- var esprima = require('esprima');
- function run(cb) {
- glob('**/*.js', {
- cwd: __dirname + '/../src/'
- }, function (err, files) {
- files.forEach(function (filePath) {
- var code = parse(fsExtra.readFileSync(
- __dirname + '/../src/' + filePath, 'utf-8'));
- code = code.replace(/require\(([\'"])zrender\//g, 'require($1zrender/lib/');
- fsExtra.outputFileSync(
- __dirname + '/../lib/' + filePath,
- code, 'utf-8');
- });
- cb && cb();
- });
- }
- if (require.main === module) {
- run();
- }
- else {
- module.exports = run;
- }
- var MAGIC_DEPS = {
- 'exports': true,
- 'module': true,
- 'require': true
- };
- var SIMPLIFIED_CJS = ['require', 'exports', 'module'];
- // Convert AMD-style JavaScript string into node.js compatible module
- function parse(raw) {
- var output = '';
- var ast = esprima.parse(raw, {
- range: true,
- raw: true
- });
- var defines = ast.body.filter(isDefine);
- if (defines.length > 1) {
- throw new Error('Each file can have only a single define call. Found "' + defines.length + '"');
- }
- else if (!defines.length) {
- return raw;
- }
- var def = defines[0];
- var args = def.expression['arguments'];
- var factory = getFactory(args);
- var useStrict = getUseStrict(factory);
- // do replacements in-place to avoid modifying the code more than needed
- if (useStrict) {
- output += useStrict.expression.raw + ';\n';
- }
- output += raw.substring(0, def.range[0]); // anything before define
- output += getRequires(args, factory); // add requires
- output += getBody(raw, factory.body, useStrict); // module body
- output += raw.substring(def.range[1], raw.length); // anything after define
- return output;
- }
- function getRequires(args, factory) {
- var requires = [];
- var deps = getDependenciesNames(args);
- var params = factory.params.map(function (param, i) {
- return {
- name: param.name,
- // simplified cjs doesn't have deps
- dep: (deps.length) ? deps[i] : SIMPLIFIED_CJS[i]
- };
- });
- params.forEach(function (param) {
- if (MAGIC_DEPS[param.dep] && !MAGIC_DEPS[param.name]) {
- // if user remaped magic dependency we declare a var
- requires.push('var ' + param.name + ' = ' + param.dep + ';');
- }
- else if (param.dep && !MAGIC_DEPS[param.dep]) {
- // only do require for params that have a matching dependency also
- // skip "magic" dependencies
- requires.push('var ' + param.name + ' = require(\'' + param.dep + '\');');
- }
- });
- return requires.join('\n');
- }
- function getDependenciesNames(args) {
- var deps = [];
- var arr = args.filter(function (arg) {
- return arg.type === 'ArrayExpression';
- })[0];
- if (arr) {
- deps = arr.elements.map(function (el) {
- return el.value;
- });
- }
- return deps;
- }
- function isDefine(node) {
- return node.type === 'ExpressionStatement'
- && node.expression.type === 'CallExpression'
- && node.expression.callee.type === 'Identifier'
- && node.expression.callee.name === 'define';
- }
- function getFactory(args) {
- return args.filter(function (arg) {
- return arg.type === 'FunctionExpression';
- })[0];
- }
- function getBody(raw, factoryBody, useStrict) {
- var returnStatement = factoryBody.body.filter(function (node) {
- return node.type === 'ReturnStatement';
- })[0];
- var body = '';
- var bodyStart = useStrict ? useStrict.expression.range[1] + 1 : factoryBody.range[0] + 1;
- if (returnStatement) {
- body += raw.substring(bodyStart, returnStatement.range[0]);
- // "return ".length === 7 so we add "6" to returnStatement start
- body += 'module.exports =' + raw.substring(returnStatement.range[0] + 6, factoryBody.range[1] - 1);
- }
- else {
- // if using exports or module.exports or just a private module we
- // simply return the factoryBody content
- body = raw.substring(bodyStart, factoryBody.range[1] - 1);
- }
- return body;
- }
- function getUseStrict(factory) {
- return factory.body.body.filter(isUseStrict)[0];
- }
- function isUseStrict(node) {
- return node.type === 'ExpressionStatement'
- && node.expression.type === 'Literal'
- && node.expression.value === 'use strict';
- }
|