UNPKG

typescript-loadable-components-plugin

Version:

A custom transformer of typescript that is used to add some necessary properties to loadable-components.

61 lines 2.42 kB
/*! * Copyright 2019 acrazing <joking.young@gmail.com>. All rights reserved. * @since 2019-11-01 23:01:37 */ import * as ts from 'typescript'; import { createChunkName } from './properties/createChunkName'; import { createIsReady } from './properties/createIsReady'; import { createRequireAsync } from './properties/createRequireAsync'; import { createRequireSync } from './properties/createRequireSync'; import { createResolve } from './properties/createResolve'; import { State } from './State'; import { getImportCallList, getRealExpression } from './utils'; var properties = [ createChunkName, createIsReady, createRequireAsync, createRequireSync, createResolve, ]; function visitLoadableComponents(state, node) { if (!ts.isCallExpression(node) || node.arguments.length === 0) { return node; } var loader = getRealExpression(node.arguments[0]); if (!ts.isFunctionExpression(loader) && !ts.isArrowFunction(loader)) { return node; } var identifier = getRealExpression(node.expression); if (ts.isPropertyAccessExpression(identifier) && identifier.name.escapedText === 'lib') { identifier = getRealExpression(identifier.expression); } if (!ts.isIdentifier(identifier) || identifier.escapedText !== 'loadable') { return node; } var importList = getImportCallList(loader.body); if (importList.length === 0) { return node; } if (importList.length > 1) { throw new Error('loadable: multiple import calls inside `loadable()` function are not supported.'); } var args = node.arguments.slice(); args[0] = ts.factory.createObjectLiteralExpression(properties.map(function (fn) { return fn(state, importList[0], loader); }), true); return ts.factory.createCallExpression(node.expression, void 0, args); } export function createLoadableComponentsTransformer(program, options) { var state = new State(program, options); return function (context) { state.context = context; return function (source) { state.sourceFile = source; var visitor = function (node) { node = visitLoadableComponents(state, node); return ts.visitEachChild(node, visitor, context); }; return ts.visitNode(source, visitor); }; }; } //# sourceMappingURL=createLoadableComponentsTransformer.js.map