mirror of
https://github.com/serverless/serverless.git
synced 2026-01-18 14:58:43 +00:00
Introduce modulesCacheStub functionality
This commit is contained in:
parent
bb12637b59
commit
0bc32422e2
@ -1,40 +1,74 @@
|
||||
// Runs complete serverless instance in preconfigured environment, limited
|
||||
// to predefined plugins and hook events
|
||||
// to predefined plugins and hook events.
|
||||
// Optionally serverless instance can be freshly required with specifc modules mocked
|
||||
|
||||
'use strict';
|
||||
|
||||
const { values } = require('lodash');
|
||||
const overrideCwd = require('process-utils/override-cwd');
|
||||
const overrideArgv = require('process-utils/override-argv');
|
||||
const Serverless = require('../../lib/Serverless');
|
||||
|
||||
module.exports = ({ cwd, cliArgs, pluginConstructorsWhitelist, hookNamesWhitelist }) =>
|
||||
const resolveServerless = (modulesCacheStub, callback) => {
|
||||
if (!modulesCacheStub) return callback(require('../../lib/Serverless'));
|
||||
const originalCache = Object.assign({}, require.cache);
|
||||
for (const key of Object.keys(require.cache)) delete require.cache[key];
|
||||
Object.assign(require.cache, modulesCacheStub);
|
||||
const restore = () => {
|
||||
for (const key of Object.keys(require.cache)) delete require.cache[key];
|
||||
Object.assign(require.cache, originalCache);
|
||||
};
|
||||
try {
|
||||
return callback(require('../../lib/Serverless')).then(
|
||||
result => {
|
||||
restore();
|
||||
return result;
|
||||
},
|
||||
error => {
|
||||
restore();
|
||||
throw error;
|
||||
}
|
||||
);
|
||||
} catch (error) {
|
||||
restore();
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = ({
|
||||
cwd,
|
||||
cliArgs,
|
||||
pluginConstructorsWhitelist,
|
||||
hookNamesWhitelist,
|
||||
modulesCacheStub,
|
||||
}) =>
|
||||
overrideCwd(cwd, () =>
|
||||
overrideArgv({ args: ['serverless', ...(cliArgs || [])] }, () => {
|
||||
// Intialize serverless instances in preconfigured environement
|
||||
const serverless = new Serverless();
|
||||
const { pluginManager } = serverless;
|
||||
return serverless.init().then(() => {
|
||||
// Strip registered hooks, so only those intended are executed
|
||||
const whitelistedPlugins = pluginManager.plugins.filter(plugin =>
|
||||
pluginConstructorsWhitelist.some(Plugin => plugin instanceof Plugin)
|
||||
);
|
||||
|
||||
const { hooks } = pluginManager;
|
||||
for (const hookName of Object.keys(hooks)) {
|
||||
if (!hookNamesWhitelist.includes(hookName)) {
|
||||
delete hooks[hookName];
|
||||
continue;
|
||||
}
|
||||
hooks[hookName] = hooks[hookName].filter(({ hook }) =>
|
||||
whitelistedPlugins.some(whitelistedPlugin =>
|
||||
values(whitelistedPlugin.hooks).includes(hook)
|
||||
)
|
||||
overrideArgv({ args: ['serverless', ...(cliArgs || [])] }, () =>
|
||||
resolveServerless(modulesCacheStub, Serverless => {
|
||||
// Intialize serverless instances in preconfigured environment
|
||||
const serverless = new Serverless();
|
||||
const { pluginManager } = serverless;
|
||||
return serverless.init().then(() => {
|
||||
// Strip registered hooks, so only those intended are executed
|
||||
const whitelistedPlugins = pluginManager.plugins.filter(plugin =>
|
||||
pluginConstructorsWhitelist.some(Plugin => plugin instanceof Plugin)
|
||||
);
|
||||
}
|
||||
|
||||
// Run plugin manager hooks
|
||||
return serverless.run();
|
||||
});
|
||||
})
|
||||
const { hooks } = pluginManager;
|
||||
for (const hookName of Object.keys(hooks)) {
|
||||
if (!hookNamesWhitelist.includes(hookName)) {
|
||||
delete hooks[hookName];
|
||||
continue;
|
||||
}
|
||||
hooks[hookName] = hooks[hookName].filter(({ hook }) =>
|
||||
whitelistedPlugins.some(whitelistedPlugin =>
|
||||
values(whitelistedPlugin.hooks).includes(hook)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
// Run plugin manager hooks
|
||||
return serverless.run();
|
||||
});
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user