From b86111d3c239db150b8bd4d5c34dab0698b16c02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Bajto=C5=A1?= Date: Tue, 12 Nov 2019 15:49:41 +0100 Subject: [PATCH] fix(cli): handle missing target artifact dir MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When creating a new artifact (e.g. Model or Repository) while the target directory does not exist yet (e.g. `src/models` or `src/repositories`), we used to abort CLI with a ENOENT error. This commit is fixing our CLI to treat the missing directory as if it was empty and continue the operation if possible. Signed-off-by: Miroslav Bajtoš --- packages/cli/lib/utils.js | 20 +++++++++++++------ .../generators/controller.integration.js | 8 ++------ .../generators/model.integration.js | 16 +++++++++++++++ 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/packages/cli/lib/utils.js b/packages/cli/lib/utils.js index 3717f36056b5..b274bb86bac2 100644 --- a/packages/cli/lib/utils.js +++ b/packages/cli/lib/utils.js @@ -224,13 +224,21 @@ exports.findArtifactPaths = async function(dir, artifactType, reader) { const readdir = reader || readdirAsync; debug(`Finding artifact paths at: ${dir}`); - // Wrapping readdir in case it's not a promise. - const files = await readdir(dir); - return _.filter(files, f => { - return ( - _.endsWith(f, `${artifactType}.js`) || _.endsWith(f, `${artifactType}.ts`) + try { + // Wrapping readdir in case it's not a promise. + const files = await readdir(dir); + return files.filter( + f => + _.endsWith(f, `${artifactType}.js`) || + _.endsWith(f, `${artifactType}.ts`), ); - }); + } catch (err) { + if (err.code === 'ENOENT') { + // Target directory was not found (e.g. "src/models" does not exist yet). + return []; + } + throw err; + } }; /** * Parses the files of the target directory and returns matching JavaScript diff --git a/packages/cli/test/integration/generators/controller.integration.js b/packages/cli/test/integration/generators/controller.integration.js index 52c9c4d7adc2..c71fc37814fa 100644 --- a/packages/cli/test/integration/generators/controller.integration.js +++ b/packages/cli/test/integration/generators/controller.integration.js @@ -214,9 +214,7 @@ describe('lb4 controller', () => { }), ) .withPrompts(restCLIInputComplete), - ).to.be.rejectedWith( - /ENOENT: no such file or directory, scandir(.*?)models\b/, - ); + ).to.be.rejectedWith(/No models found in .*[\/\\]models\b/); }); it('fails when no repository directory present', () => { @@ -230,9 +228,7 @@ describe('lb4 controller', () => { }), ) .withPrompts(restCLIInputComplete), - ).to.be.rejectedWith( - /ENOENT: no such file or directory, scandir(.*?)repositories\b/, - ); + ).to.be.rejectedWith(/No repositories found in .*[\/\\]repositories\b/); }); }); }); diff --git a/packages/cli/test/integration/generators/model.integration.js b/packages/cli/test/integration/generators/model.integration.js index 58e797d41d96..ef613479ccf0 100644 --- a/packages/cli/test/integration/generators/model.integration.js +++ b/packages/cli/test/integration/generators/model.integration.js @@ -10,6 +10,7 @@ const path = require('path'); const assert = require('yeoman-assert'); const {expect, TestSandbox} = require('@loopback/testlab'); const {expectFileToMatchSnapshot} = require('../../snapshots'); +const {remove} = require('fs-extra'); const generator = path.join(__dirname, '../../../generators/model'); const tests = require('../lib/artifact-generator')(generator); @@ -118,6 +119,21 @@ describe('lb4 model integration', () => { basicModelFileChecks(expectedModelFile, expectedIndexFile); }); + it('creates "src/models" directory if it does not exist', async () => { + await testUtils + .executeGenerator(generator) + .inDir(SANDBOX_PATH, async () => { + testUtils.givenLBProject(SANDBOX_PATH); + await remove(path.resolve(SANDBOX_PATH, 'src/models')); + }) + .withPrompts({ + name: 'test', + propName: null, + }); + + basicModelFileChecks(expectedModelFile, expectedIndexFile); + }); + it('scaffolds correct files with model base class', async () => { await testUtils .executeGenerator(generator)