transformImport.js 2.67 KB
// adding js extension in the import statement.

// Reference:
// https://regexr.com/47jlq
// https://gist.github.com/manekinekko/7e58a17bc62a9be47172
const regexp = /((?:(?:import)|(?:export))\s+?(?:(?:(?:[\w*\s{},\/]*)\s+from\s+?)|))(?:(?:"(.*?)")|(?:'(.*?)'))([\s]*?(?:;|$|))/g;

module.exports.transformImport = function (code, processModuleName) {
    return code.replace(regexp, (str, prefix, moduleNameA, moduleNameB, postfix) => {
        let moduleName = (moduleNameA === undefined ? moduleNameB : moduleNameA).trim();
        const quote = moduleNameA === undefined ? "'" : '"';
        return prefix + quote + processModuleName(moduleName) + quote + postfix;
        // Not support other extensions.
    });
}


const testCases = `import videos from './videos/index.js'

export default (socket, context) => {
    // dynamically importing all the socket.io handler (it's dynamic import that happen at run time)
  import {
	something
} from "./test/okbb"

const f = 2;

import test from 'obb'


import {
  Component
} from '@angular2/core';

import defaultMember from "module-0";

import   *    as name from "module-1  ";

import   {  member }   from "  module-2";

import { member as alias } from "module-3";

import { member1 , member2 } from "module-4";

import { member1 , member2 as alias2 , member3 as alias3 } from "module-5";

import defaultMember, { member, member } from "module-6";

import defaultMember, * as name from "module-7";

import "module-8";

import "module-9"    // comment no problem

import {
    AAAA,
    // BBB
} from 'module-10';

import "module-b' // doesn't match -> the opening and closing quation mark are different

importing hya from 'ttt'

import fbsfrom ''


// Export expressions.
export { aaa };

export * from "module-11";

export { aaa } from "module-12";

// Should not be parsed
export default aaa;

export function bbb () {
};
`

module.exports.runTest = function () {
    const expected = [
        './videos/index.js',
        './test/okbb',
        'obb',
        '@angular2/core',
        'module-0',
        'module-1',
        'module-2',
        'module-3',
        'module-4',
        'module-5',
        'module-6',
        'module-7',
        'module-8',
        'module-9',
        'module-10',
        'module-11',
        'module-12'
    ]
    let cursor = 0;
    module.exports.transformImport(testCases, (moduleName) => {
        if (expected[cursor] !== moduleName) {
            throw new Error(`Expected ${expected[cursor]}. Actual ${moduleName}`);
        }
        cursor++;
        return moduleName;
    })
    if (cursor !== expected.length) {
        throw new Error('Test failed');
    }
    console.log('All test passed!')
}

// module.exports.runTest();