it('should exit when erroring', async () => { const processCWD = jest.fn(); const processExit = jest.fn(); const consoleError = jest.fn(); const mockConsoleError = jest .spyOn(console, 'error') .mockImplementation(consoleError); const mockCWD = jest.spyOn(process, 'cwd').mockImplementation(processCWD); const mockExit = jest .spyOn(process, 'exit') .mockImplementation(processExit); jest.doMock('./services/_autoload', () => { return options( { singleton: true }, service(async () => $autoload, '$autoload'), ); }); $autoload.mockResolvedValueOnce({}); $autoload.mockResolvedValueOnce({ initializer: service( async () => async () => { throw new Error('E_ERROR'); }, 'commandHandler', ['log'], ), path: 'mocked://service', }); processCWD.mockReturnValueOnce('/home/whoiam/projects/my-cool-project'); const run = require('./index').default; const $ = new Knifecycle(); $.register(constant('log', log)); await run({ prepareEnvironment: () => $ }); mockCWD.mockRestore(); mockExit.mockRestore(); mockConsoleError.mockRestore(); expect({ exitCalls: processExit.mock.calls, cwdCalls: processCWD.mock.calls, errorCalls: consoleError.mock.calls.map(([arg1]) => [arg1]), autoloaderCalls: $autoload.mock.calls, logCalls: log.mock.calls.filter(args => 'stack' !== args[0]), }).toMatchSnapshot(); });
it('should run commands', async () => { const processCWD = jest.fn(); const processExit = jest.fn(); const mockCWD = jest.spyOn(process, 'cwd').mockImplementation(processCWD); const mockExit = jest .spyOn(process, 'exit') .mockImplementation(processExit); jest.doMock('./services/_autoload', () => { return options( { singleton: true }, service(async () => $autoload, '$autoload'), ); }); $autoload.mockResolvedValueOnce({ initializer: service( async ({ log }) => async () => log('warning', 'Command ran!'), 'commandHandler', ['log'], ), path: 'mocked://command', }); $autoload.mockResolvedValueOnce({ initializer: constant('COMMAND_DEFINITION', { arguments: { properties: {} }, }), path: 'mocked://definition', }); processCWD.mockReturnValueOnce('/home/whoiam/projects/my-cool-project'); const run = require('./index').default; const $ = new Knifecycle(); $.register(constant('log', log)); await run({ prepareEnvironment: () => $ }); mockCWD.mockRestore(); mockExit.mockRestore(); expect({ exitCalls: processExit.mock.calls, cwdCalls: processCWD.mock.calls, autoloaderCalls: $autoload.mock.calls, logCalls: log.mock.calls.filter(args => 'stack' !== args[0]), }).toMatchSnapshot(); });
export async function runCreateWhook() { try { const $ = new Knifecycle(); $.register(constant('CWD', process.cwd())); $.register(constant('require', _require)); $.register(constant('inquirer', inquirer)); $.register(constant('exec', _exec)); $.register(constant('writeFile', _writeFile)); $.register(constant('readFile', _readFile)); $.register(constant('copy', _copy)); $.register(constant('ensureDir', _ensureDir)); $.register( constant( 'SOURCE_DIR', path.resolve(path.dirname(require.resolve('@whook/example')), '..'), ), ); $.register(constant('debug', debug('whook'))); $.register( constant('logger', { // eslint-disable-next-line error: console.error.bind(console), // eslint-disable-next-line info: console.info.bind(console), // eslint-disable-next-line warning: console.log.bind(console), }), ); $.register(initLogService); $.register(initLockService); $.register(initDelayService); $.register(initAuthor); $.register(initProject); $.register(initCreateWhook); const { createWhook } = await $.run(['createWhook']); await createWhook(); } catch (err) { // eslint-disable-next-line console.error('💀 - Cannot launch the process:', err.stack); process.exit(1); } }