UNPKG

3.47 kBJavaScriptView Raw
1'use strict';
2const hackMoment = require('./transformers/hack-moment');
3const processEnv = require('./transformers/process-env');
4const nodeEnvCondition = require('./transformers/node-env-condition');
5const alias = require('./transformers/alias');
6const conventionalAlias = require('./transformers/conventional-alias');
7const text = require('./transformers/text');
8const json = require('./transformers/json');
9const wasm = require('./transformers/wasm');
10const esmToCjs = require('./transformers/esm-to-cjs');
11const replace = require('./transformers/replace');
12const cjsToAmd = require('./transformers/cjs-to-amd');
13const nameAmdDefine = require('./transformers/name-amd-define');
14const shimAmd = require('./transformers/shim-amd');
15const transform = require('./transform');
16const {ext} = require('dumber-module-loader/dist/id-utils');
17const {generateHash} = require('./shared');
18
19function unWrap(cached) {
20 return Promise.resolve(cached)
21 .then(result => {
22 if (!result) {
23 throw new Error();
24 } else if (result instanceof Error) {
25 throw result;
26 }
27 return result;
28 })
29}
30
31// depsFinder is optional
32module.exports = function(unit, opts = {}) {
33 // Bypass traced unit, possibly read directly from cache instead of source.
34 if (unit.defined && unit.deps) return Promise.resolve(unit);
35
36 const {cache, depsFinder} = opts;
37 const {contents, path, sourceMap, moduleId, packageName, packageMainPath, shim} = unit;
38
39 if (
40 packageName &&
41 (moduleId !== packageName && !moduleId.startsWith(packageName + '/'))
42 ) {
43 return Promise.reject(new Error('module "' + moduleId + '" is not in package "' + packageName + '"'));
44 }
45
46 let hash;
47
48 let tryCache;
49 if (cache) {
50 const key = [
51 process.env.NODE_ENV || '',
52 path,
53 moduleId,
54 packageName,
55 packageMainPath,
56 JSON.stringify(shim),
57 depsFinder ? depsFinder.toString() : '',
58 contents,
59 JSON.stringify(sourceMap)
60 ].join('|');
61 hash = generateHash(key);
62 tryCache = unWrap(cache.getCache(hash, {packageName, moduleId, size: contents.length}));
63 } else {
64 tryCache = Promise.reject();
65 }
66
67 return tryCache.catch(() => {
68 const transformers = [];
69 const extname = ext(path);
70 if (extname === '.js' || extname === '.cjs' || extname === '.mjs') {
71 transformers.push(
72 hackMoment,
73 processEnv,
74 nodeEnvCondition,
75 esmToCjs,
76 replace,
77 cjsToAmd,
78 nameAmdDefine,
79 shimAmd
80 );
81 } else if (extname === '.wasm') {
82 transformers.push(wasm);
83 } else if (extname === '.json') {
84 transformers.push(json);
85 } else {
86 // use text! for everything else including unknown extname
87 transformers.push(text);
88 }
89
90 // for alias to npm package main, browser replacement
91 transformers.push(alias);
92 // for alias like: foo/index -> foo/dist/cjs/index
93 transformers.push(conventionalAlias, alias);
94
95 if (depsFinder) {
96 transformers.push(function customDepsFinder(unit) {
97 // customised deps finder to find addtional deps
98 return new Promise(resolve => {
99 // note it works on original contents, not transformed contents
100 resolve(depsFinder(unit.path, contents));
101 }).then(deps => ({deps}));
102 });
103 }
104
105 return transform(unit, ...transformers)
106 .then(traced => {
107 if (cache) cache.setCache(hash, traced);
108 return traced;
109 });
110 });
111};