From d796de3cc7e3bf8602d76e5190cfd1d4f71c775a Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Tue, 15 Feb 2022 12:37:12 +0200 Subject: [PATCH 1/7] fix(build): Throw better error for incorrect user transformer functions. --- .../src/build/buildRefs/getUserJavascriptFunction.js | 8 ++++++-- packages/build/src/build/buildRefs/runTransformer.js | 7 ++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/build/src/build/buildRefs/getUserJavascriptFunction.js b/packages/build/src/build/buildRefs/getUserJavascriptFunction.js index 4f35267b8..748675260 100644 --- a/packages/build/src/build/buildRefs/getUserJavascriptFunction.js +++ b/packages/build/src/build/buildRefs/getUserJavascriptFunction.js @@ -16,8 +16,12 @@ import path from 'path'; async function getUserJavascriptFunction({ context, filePath }) { - const module = await import(path.resolve(context.directories.config, filePath)); - return module.default; + try { + return (await import(path.resolve(context.directories.config, filePath))).default; + } catch (error) { + context.logger.error(`Error importing ${filePath}.`); + throw Error(error); + } } export default getUserJavascriptFunction; diff --git a/packages/build/src/build/buildRefs/runTransformer.js b/packages/build/src/build/buildRefs/runTransformer.js index e34397163..03a2e2372 100644 --- a/packages/build/src/build/buildRefs/runTransformer.js +++ b/packages/build/src/build/buildRefs/runTransformer.js @@ -22,7 +22,12 @@ async function runTransformer({ context, parsedFile, refDef }) { context, filePath: refDef.transformer, }); - return transformerFn(parsedFile, refDef.vars); + try { + return transformerFn(parsedFile, refDef.vars); + } catch (error) { + context.logger.error(`Error running transformer ${refDef.transformer} for ${refDef.path}.`); + throw Error(error); + } } return parsedFile; } From 5bc113b18cc30090d9862d95dc6d021b0fe9af6b Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Tue, 15 Feb 2022 12:38:14 +0200 Subject: [PATCH 2/7] fix(build): Fix error message when block is not an object. --- .../build/src/utils/formatErrorMessage.js | 2 +- .../src/utils/formatErrorMessage.test.js | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/packages/build/src/utils/formatErrorMessage.js b/packages/build/src/utils/formatErrorMessage.js index 8ec2747db..13e5e65fd 100644 --- a/packages/build/src/utils/formatErrorMessage.js +++ b/packages/build/src/utils/formatErrorMessage.js @@ -17,7 +17,7 @@ import { get, type } from '@lowdefy/helpers'; function formatArrayKey({ index, object }) { - if (!type.isNone(object.id) || !type.isNone(object.type)) { + if (type.isObject(object) && (!type.isNone(object.id) || !type.isNone(object.type))) { const objectId = type.isNone(object.id) ? '_ERROR_MISSING_ID_' : object.id; const objectType = type.isNone(object.type) ? '_ERROR_MISSING_TYPE_' : object.type; return `[${index}:${objectId}:${objectType}]`; diff --git a/packages/build/src/utils/formatErrorMessage.test.js b/packages/build/src/utils/formatErrorMessage.test.js index a10ea4f52..a1c58b62d 100644 --- a/packages/build/src/utils/formatErrorMessage.test.js +++ b/packages/build/src/utils/formatErrorMessage.test.js @@ -94,3 +94,46 @@ should be string - pages - [0:1:_ERROR_MISSING_TYPE_].id`); }); + +test('Additional properties as root config.', async () => { + const components = { + additional: true, + pages: [ + { + id: 'page_1', + blocks: [], + }, + ], + }; + const error = { + instancePath: '', + message: 'must NOT have additional properties', + }; + const res = formatErrorMessage({ error, components }); + expect(res).toEqual(`Schema Error +must NOT have additional properties +`); +}); + +test('Block is null.', async () => { + const components = { + additional: true, + pages: [ + { + id: 'page_1', + type: 'Box', + blocks: [null], + }, + ], + }; + const error = { + instancePath: '/pages/0/blocks/0', + message: 'Block should be an object.', + }; + const res = formatErrorMessage({ error, components }); + expect(res).toEqual(`Schema Error +Block should be an object. +- pages + - [0:page_1:Box].blocks + - [0]`); +}); From 07902b0e06f9c72a04168842d7f9bb8de470c424 Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Tue, 15 Feb 2022 12:39:32 +0200 Subject: [PATCH 3/7] feat(cli): Add config option for server-dev and server directories. --- package.json | 17 ++++-- packages/cli/src/commands/build/build.js | 4 +- packages/cli/src/commands/dev/dev.js | 4 +- packages/cli/src/commands/dev/getServer.js | 53 ------------------- .../cli/src/commands/dev/installServer.js | 2 +- packages/cli/src/commands/dev/runDevServer.js | 2 +- packages/cli/src/index.js | 12 +++++ packages/cli/src/utils/getDirectories.js | 6 ++- packages/cli/src/utils/getDirectories.test.js | 38 ++++++++++++- .../{commands/build => utils}/getServer.js | 12 +++-- packages/cli/src/utils/startUp.test.js | 12 ++--- 11 files changed, 85 insertions(+), 77 deletions(-) delete mode 100644 packages/cli/src/commands/dev/getServer.js rename packages/cli/src/{commands/build => utils}/getServer.js (87%) diff --git a/package.json b/package.json index 0e270b1bd..42dd4b8a9 100644 --- a/package.json +++ b/package.json @@ -41,10 +41,19 @@ "lerna:publish": "lerna publish from-git", "postversion": "yarn install", "prettier": "prettier --config .prettierrc --write **/*.js", - "start:server-dev": "yarn workspace @lowdefy/server-dev start --package-manager yarn --config-directory ../../app", - "start": "yarn workspace @lowdefy/server build:lowdefy --config-directory ../../app && yarn && yarn workspace @lowdefy/server build:next && yarn workspace @lowdefy/server start", - "start:dev": "yarn workspace @lowdefy/server build:lowdefy --config-directory ../../app && yarn && yarn workspace @lowdefy/server dev", - "start:dev-docs": "yarn workspace @lowdefy/server build:lowdefy --config-directory ../docs && yarn && yarn workspace @lowdefy/server dev", + "start": "yarn start:server:app", + "start:cli:build:app": "yarn workspace lowdefy start build --config-directory ../../app --server-directory ../server --output-directory ../", + "start:cli:build:docs": "yarn workspace lowdefy start build --config-directory ../docs --server-directory ../server --output-directory ../", + "start:cli:dev:app": "yarn workspace lowdefy start dev --config-directory ../../app --dev-directory ../server-dev", + "start:cli:dev:docs": "yarn workspace lowdefy start dev --config-directory ../docs --dev-directory ../server-dev", + "start:cli:start:app": "yarn workspace lowdefy start start --config-directory ../../app --server-directory ../server --output-directory ../", + "start:cli:start:docs": "yarn workspace lowdefy start start --config-directory ../docs --server-directory ../server --output-directory ../", + "start:server-dev:app": "yarn workspace @lowdefy/server-dev start --package-manager yarn --config-directory ../../app", + "start:server-dev:docs": "yarn workspace @lowdefy/server-dev start --package-manager yarn --config-directory ../docs", + "start:server:app": "yarn workspace @lowdefy/server build:lowdefy --config-directory ../../app && yarn && yarn workspace @lowdefy/server build:next && yarn workspace @lowdefy/server start", + "start:server:docs": "yarn workspace @lowdefy/server build:lowdefy --config-directory ../docs && yarn && yarn workspace @lowdefy/server build:next && yarn workspace @lowdefy/server start", + "start:server:next-dev:app": "yarn workspace @lowdefy/server build:lowdefy --config-directory ../../app && yarn && yarn workspace @lowdefy/server dev", + "start:server:next-dev:docs": "yarn workspace @lowdefy/server build:lowdefy --config-directory ../docs && yarn && yarn workspace @lowdefy/server dev", "test": "lerna run test" }, "devDependencies": { diff --git a/packages/cli/src/commands/build/build.js b/packages/cli/src/commands/build/build.js index 7bab89c3b..282908581 100644 --- a/packages/cli/src/commands/build/build.js +++ b/packages/cli/src/commands/build/build.js @@ -14,14 +14,14 @@ limitations under the License. */ -import getServer from './getServer.js'; +import getServer from '../../utils/getServer.js'; import installServer from './installServer.js'; import runLowdefyBuild from './runLowdefyBuild.js'; import runNextBuild from './runNextBuild.js'; async function build({ context }) { context.print.info('Starting build.'); - await getServer({ context }); + await getServer({ context, packageName: '@lowdefy/server' }); await installServer({ context }); await runLowdefyBuild({ context }); await installServer({ context }); diff --git a/packages/cli/src/commands/dev/dev.js b/packages/cli/src/commands/dev/dev.js index 74e3c685d..b4976076c 100644 --- a/packages/cli/src/commands/dev/dev.js +++ b/packages/cli/src/commands/dev/dev.js @@ -14,13 +14,13 @@ limitations under the License. */ -import getServer from './getServer.js'; import installServer from './installServer.js'; import runDevServer from './runDevServer.js'; +import getServer from '../../utils/getServer.js'; async function dev({ context }) { context.print.info('Starting development server.'); - await getServer({ context }); + await getServer({ context, packageName: '@lowdefy/server-dev' }); await installServer({ context }); context.sendTelemetry(); await runDevServer({ context }); diff --git a/packages/cli/src/commands/dev/getServer.js b/packages/cli/src/commands/dev/getServer.js deleted file mode 100644 index 55167772b..000000000 --- a/packages/cli/src/commands/dev/getServer.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - Copyright 2020-2021 Lowdefy, Inc - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -import fs from 'fs'; -import path from 'path'; -import { cleanDirectory, readFile } from '@lowdefy/node-utils'; -import fetchNpmTarball from '../../utils/fetchNpmTarball.js'; - -async function getServer({ context }) { - let fetchServer = false; - - const serverExists = fs.existsSync(path.join(context.directories.devServer, 'package.json')); - if (!serverExists) fetchServer = true; - - if (serverExists) { - const serverPackageConfig = JSON.parse( - await readFile(path.join(context.directories.devServer, 'package.json')) - ); - if (serverPackageConfig.version !== context.lowdefyVersion) { - fetchServer = true; - context.print.warn( - `Removing @lowdefy/server-dev with version ${serverPackageConfig.version}` - ); - await cleanDirectory(context.directories.devServer); - } - } - - if (fetchServer) { - context.print.spin('Fetching @lowdefy/server-dev from npm.'); - await fetchNpmTarball({ - packageName: '@lowdefy/server-dev', - version: context.lowdefyVersion, - directory: context.directories.devServer, - }); - context.print.log('Fetched @lowdefy/server-dev from npm.'); - return; - } -} - -export default getServer; diff --git a/packages/cli/src/commands/dev/installServer.js b/packages/cli/src/commands/dev/installServer.js index 8c43ac6e7..3452a470e 100644 --- a/packages/cli/src/commands/dev/installServer.js +++ b/packages/cli/src/commands/dev/installServer.js @@ -29,7 +29,7 @@ async function installServer({ context }) { command: context.packageManager, // npm or yarn args: args[context.packageManager], processOptions: { - cwd: context.directories.devServer, + cwd: context.directories.dev, }, silent: false, }); diff --git a/packages/cli/src/commands/dev/runDevServer.js b/packages/cli/src/commands/dev/runDevServer.js index 14ec0ba7f..fdf96dd5e 100644 --- a/packages/cli/src/commands/dev/runDevServer.js +++ b/packages/cli/src/commands/dev/runDevServer.js @@ -22,7 +22,7 @@ async function runDevServer({ context }) { args: ['run', 'start'], command: context.packageManager, // npm or yarn processOptions: { - cwd: context.directories.devServer, + cwd: context.directories.dev, env: { ...process.env, LOWDEFY_BUILD_REF_RESOLVER: context.options.refResolver, diff --git a/packages/cli/src/index.js b/packages/cli/src/index.js index 0189e236c..12e5e7b77 100755 --- a/packages/cli/src/index.js +++ b/packages/cli/src/index.js @@ -55,6 +55,10 @@ program '--ref-resolver ', 'Path to a JavaScript file containing a _ref resolver function to be used as the app default _ref resolver.' ) + .option( + '--server-directory ', + 'Change the server directory. Default is "/.lowdefy/server".' + ) .action(runCommand({ cliVersion, handler: build })); program @@ -83,6 +87,10 @@ program '--watch-ignore ', 'A list of paths to files or directories that should be ignored by the file watcher. Globs are supported. Specify each path to watch separated by spaces.' ) + .option( + '--dev-directory ', + 'Change the development server directory. Default is "/.lowdefy/dev".' + ) .action(runCommand({ cliVersion, handler: dev })); program @@ -109,6 +117,10 @@ program 'The package manager to use. Options are "npm" or "yarn".' ) .option('--port ', 'Change the port the server is hosted at. Default is 3000.') + .option( + '--server-directory ', + 'Change the server directory. Default is "/.lowdefy/server".' + ) .action(runCommand({ cliVersion, handler: start })); program.parse(process.argv); diff --git a/packages/cli/src/utils/getDirectories.js b/packages/cli/src/utils/getDirectories.js index 3dc9598fd..e915fe588 100644 --- a/packages/cli/src/utils/getDirectories.js +++ b/packages/cli/src/utils/getDirectories.js @@ -27,8 +27,10 @@ function getDirectories({ configDirectory, options }) { config: configDirectory, build: path.join(dotLowdefy, 'server', 'build'), dotLowdefy, - server: path.join(dotLowdefy, 'server'), - devServer: path.join(dotLowdefy, 'dev'), + server: options.serverDirectory + ? path.resolve(options.serverDirectory) + : path.join(dotLowdefy, 'server'), + dev: options.devDirectory ? path.resolve(options.devDirectory) : path.join(dotLowdefy, 'dev'), }; } diff --git a/packages/cli/src/utils/getDirectories.test.js b/packages/cli/src/utils/getDirectories.test.js index bec4a384b..4050df832 100644 --- a/packages/cli/src/utils/getDirectories.test.js +++ b/packages/cli/src/utils/getDirectories.test.js @@ -25,7 +25,7 @@ test('default directories', () => { expect(directories).toEqual({ build: '/test/config/.lowdefy/server/build', config: '/test/config', - devServer: '/test/config/.lowdefy/dev', + dev: '/test/config/.lowdefy/dev', dotLowdefy: '/test/config/.lowdefy', server: '/test/config/.lowdefy/server', }); @@ -42,8 +42,42 @@ test('specify outputDirectory in options', () => { expect(directories).toEqual({ build: '/test/out/server/build', config: '/test/config', - devServer: '/test/out/dev', + dev: '/test/out/dev', dotLowdefy: '/test/out', server: '/test/out/server', }); }); + +test('specify serverDirectory in options', () => { + const directories = getDirectories({ + configDirectory: '/test/config', + options: { + serverDirectory: '/test/server', + }, + }); + + expect(directories).toEqual({ + build: '/test/config/.lowdefy/server/build', + config: '/test/config', + dev: '/test/config/.lowdefy/dev', + dotLowdefy: '/test/config/.lowdefy', + server: '/test/server', + }); +}); + +test('specify devDirectory in options', () => { + const directories = getDirectories({ + configDirectory: '/test/config', + options: { + devDirectory: '/test/dev', + }, + }); + + expect(directories).toEqual({ + build: '/test/config/.lowdefy/server/build', + config: '/test/config', + dev: '/test/dev', + dotLowdefy: '/test/config/.lowdefy', + server: '/test/config/.lowdefy/server', + }); +}); diff --git a/packages/cli/src/commands/build/getServer.js b/packages/cli/src/utils/getServer.js similarity index 87% rename from packages/cli/src/commands/build/getServer.js rename to packages/cli/src/utils/getServer.js index b4a74badb..c029115dd 100644 --- a/packages/cli/src/commands/build/getServer.js +++ b/packages/cli/src/utils/getServer.js @@ -17,9 +17,14 @@ import fs from 'fs'; import path from 'path'; import { cleanDirectory, readFile } from '@lowdefy/node-utils'; -import fetchNpmTarball from '../../utils/fetchNpmTarball.js'; +import fetchNpmTarball from './fetchNpmTarball.js'; + +async function getServer({ context, packageName }) { + if (context.lowdefyVersion === 'local') { + context.print.warn(`Running local ${packageName}.`); + return; + } -async function getServer({ context }) { let fetchServer = false; const serverExists = fs.existsSync(path.join(context.directories.server, 'package.json')); @@ -39,12 +44,11 @@ async function getServer({ context }) { if (fetchServer) { context.print.spin('Fetching @lowdefy/server from npm.'); await fetchNpmTarball({ - packageName: '@lowdefy/server', + packageName, version: context.lowdefyVersion, directory: context.directories.server, }); context.print.log('Fetched @lowdefy/server from npm.'); - return; } } diff --git a/packages/cli/src/utils/startUp.test.js b/packages/cli/src/utils/startUp.test.js index e5cd6c18a..971883acd 100644 --- a/packages/cli/src/utils/startUp.test.js +++ b/packages/cli/src/utils/startUp.test.js @@ -57,7 +57,7 @@ test('startUp, options empty', async () => { directories: { build: path.resolve(process.cwd(), './.lowdefy/server/build'), config: path.resolve(process.cwd()), - devServer: path.resolve(process.cwd(), './.lowdefy/dev'), + dev: path.resolve(process.cwd(), './.lowdefy/dev'), dotLowdefy: path.resolve(process.cwd(), './.lowdefy'), server: path.resolve(process.cwd(), './.lowdefy/server'), }, @@ -104,7 +104,7 @@ test('startUp, options undefined', async () => { directories: { build: path.resolve(process.cwd(), './.lowdefy/server/build'), config: path.resolve(process.cwd()), - devServer: path.resolve(process.cwd(), './.lowdefy/dev'), + dev: path.resolve(process.cwd(), './.lowdefy/dev'), dotLowdefy: path.resolve(process.cwd(), './.lowdefy'), server: path.resolve(process.cwd(), './.lowdefy/server'), }, @@ -150,7 +150,7 @@ test('startUp, options configDirectory', async () => { directories: { build: path.resolve(process.cwd(), './configDirectory/.lowdefy/server/build'), config: path.resolve(process.cwd(), './configDirectory'), - devServer: path.resolve(process.cwd(), './configDirectory/.lowdefy/dev'), + dev: path.resolve(process.cwd(), './configDirectory/.lowdefy/dev'), dotLowdefy: path.resolve(process.cwd(), './configDirectory/.lowdefy'), server: path.resolve(process.cwd(), './configDirectory/.lowdefy/server'), }, @@ -180,7 +180,7 @@ test('startUp, options outputDirectory', async () => { directories: { build: path.resolve(process.cwd(), './outputDirectory/server/build'), config: path.resolve(process.cwd()), - devServer: path.resolve(process.cwd(), './outputDirectory/dev'), + dev: path.resolve(process.cwd(), './outputDirectory/dev'), dotLowdefy: path.resolve(process.cwd(), './outputDirectory'), server: path.resolve(process.cwd(), './outputDirectory/server'), }, @@ -220,7 +220,7 @@ test('startUp, options configDirectory and outputDirectory', async () => { directories: { build: path.resolve(process.cwd(), './outputDirectory/server/build'), config: path.resolve(process.cwd(), './configDirectory'), - devServer: path.resolve(process.cwd(), './outputDirectory/dev'), + dev: path.resolve(process.cwd(), './outputDirectory/dev'), dotLowdefy: path.resolve(process.cwd(), './outputDirectory'), server: path.resolve(process.cwd(), './outputDirectory/server'), }, @@ -254,7 +254,7 @@ test('startUp, no lowdefyVersion returned', async () => { directories: { build: path.resolve(process.cwd(), './.lowdefy/server/build'), config: path.resolve(process.cwd()), - devServer: path.resolve(process.cwd(), './.lowdefy/dev'), + dev: path.resolve(process.cwd(), './.lowdefy/dev'), dotLowdefy: path.resolve(process.cwd(), './.lowdefy'), server: path.resolve(process.cwd(), './.lowdefy/server'), }, From 0128df671a212ba0584bc47678e3c6d9939e4307 Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Tue, 15 Feb 2022 12:57:44 +0200 Subject: [PATCH 4/7] chore(build): Fix error message for runTransformer. --- packages/build/src/build/buildRefs/runTransformer.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/build/src/build/buildRefs/runTransformer.js b/packages/build/src/build/buildRefs/runTransformer.js index 03a2e2372..e784e1a78 100644 --- a/packages/build/src/build/buildRefs/runTransformer.js +++ b/packages/build/src/build/buildRefs/runTransformer.js @@ -25,7 +25,9 @@ async function runTransformer({ context, parsedFile, refDef }) { try { return transformerFn(parsedFile, refDef.vars); } catch (error) { - context.logger.error(`Error running transformer ${refDef.transformer} for ${refDef.path}.`); + context.logger.error( + `Error calling transformer "${refDef.transformer}" from "${refDef.path}": ${error.message}` + ); throw Error(error); } } From cccaabcdaeb357dc8c1382310166cd96af10b2e0 Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Tue, 15 Feb 2022 13:05:13 +0200 Subject: [PATCH 5/7] fix(build): Throw instead of logging error for build. --- .../src/build/buildRefs/runTransformer.js | 3 +- packages/build/src/index.js | 61 +++++++++---------- 2 files changed, 29 insertions(+), 35 deletions(-) diff --git a/packages/build/src/build/buildRefs/runTransformer.js b/packages/build/src/build/buildRefs/runTransformer.js index e784e1a78..c2d6f8d7e 100644 --- a/packages/build/src/build/buildRefs/runTransformer.js +++ b/packages/build/src/build/buildRefs/runTransformer.js @@ -25,10 +25,9 @@ async function runTransformer({ context, parsedFile, refDef }) { try { return transformerFn(parsedFile, refDef.vars); } catch (error) { - context.logger.error( + throw Error( `Error calling transformer "${refDef.transformer}" from "${refDef.path}": ${error.message}` ); - throw Error(error); } } return parsedFile; diff --git a/packages/build/src/index.js b/packages/build/src/index.js index 3c8e7832f..9bc0a63da 100644 --- a/packages/build/src/index.js +++ b/packages/build/src/index.js @@ -83,39 +83,34 @@ async function createContext(options) { async function build(options) { const context = await createContext(options); - try { - const components = await buildRefs({ context }); - await testSchema({ components, context }); - await validateApp({ components, context }); - await validateConfig({ components, context }); - await addDefaultPages({ components, context }); - await buildAuth({ components, context }); - await buildConnections({ components, context }); - await buildPages({ components, context }); - await buildMenu({ components, context }); - await buildTypes({ components, context }); - await buildIcons({ components, context }); - await buildStyles({ components, context }); - await cleanBuildDirectory({ context }); - await writeApp({ components, context }); - await writeConnections({ components, context }); - await writeRequests({ components, context }); - await writePages({ components, context }); - await writeConfig({ components, context }); - await writeGlobal({ components, context }); - await writeMenus({ components, context }); - await writeTypes({ components, context }); - await writeBlockImports({ components, context }); - await writeConnectionImports({ components, context }); - await writeOperatorImports({ components, context }); - await writeStyleImports({ components, context }); - await writeIconImports({ components, context }); - await updateServerPackageJson({ components, context }); - await copyPublicFolder({ components, context }); - } catch (error) { - context.logger.error(error); - throw error; - } + const components = await buildRefs({ context }); + await testSchema({ components, context }); + await validateApp({ components, context }); + await validateConfig({ components, context }); + await addDefaultPages({ components, context }); + await buildAuth({ components, context }); + await buildConnections({ components, context }); + await buildPages({ components, context }); + await buildMenu({ components, context }); + await buildTypes({ components, context }); + await buildIcons({ components, context }); + await buildStyles({ components, context }); + await cleanBuildDirectory({ context }); + await writeApp({ components, context }); + await writeConnections({ components, context }); + await writeRequests({ components, context }); + await writePages({ components, context }); + await writeConfig({ components, context }); + await writeGlobal({ components, context }); + await writeMenus({ components, context }); + await writeTypes({ components, context }); + await writeBlockImports({ components, context }); + await writeConnectionImports({ components, context }); + await writeOperatorImports({ components, context }); + await writeStyleImports({ components, context }); + await writeIconImports({ components, context }); + await updateServerPackageJson({ components, context }); + await copyPublicFolder({ components, context }); } export { createContext }; From 20f02bdef929184338a62875c6207c2ffd584e81 Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Tue, 15 Feb 2022 13:05:51 +0200 Subject: [PATCH 6/7] fix: Add packages/cli/server/ to git ignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7131d947a..02f0f9a99 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ packages/server/build/** packages/server-dev/build/** !packages/docs/lowdefy.yaml !packages/docs/howto/**/lowdefy.yaml +packages/cli/server/** .DS_Store From b3c980d2bfc99d1ef4f48a5fb9ef6f99353a4fd6 Mon Sep 17 00:00:00 2001 From: Gervwyk Date: Tue, 15 Feb 2022 13:22:18 +0200 Subject: [PATCH 7/7] fix(build): Move page not an object error to addDefaultPages. --- .../build/addDefaultPages/addDefaultPages.js | 7 +++++- .../addDefaultPages/addDefaultPages.test.js | 9 ++++++++ packages/build/src/build/writePages.js | 9 -------- packages/build/src/build/writePages.test.js | 22 ------------------- packages/build/src/build/writeRequests.js | 3 --- .../build/src/build/writeRequests.test.js | 6 ----- 6 files changed, 15 insertions(+), 41 deletions(-) diff --git a/packages/build/src/build/addDefaultPages/addDefaultPages.js b/packages/build/src/build/addDefaultPages/addDefaultPages.js index a018d4574..05d4546c4 100644 --- a/packages/build/src/build/addDefaultPages/addDefaultPages.js +++ b/packages/build/src/build/addDefaultPages/addDefaultPages.js @@ -29,7 +29,12 @@ async function addDefaultPages({ components }) { throw new Error('lowdefy.pages is not an array.'); } - const pageIds = components.pages.map((page) => page.id); + const pageIds = components.pages.map((page, index) => { + if (!type.isObject(page)) { + throw new Error(`pages[${index}] is not an object. Received ${JSON.stringify(page)}`); + } + return page.id; + }); // deep copy to avoid mutating defaultConfig const filteredDefaultPages = defaultPages.filter( (defaultPage) => !pageIds.includes(defaultPage.id) diff --git a/packages/build/src/build/addDefaultPages/addDefaultPages.test.js b/packages/build/src/build/addDefaultPages/addDefaultPages.test.js index 0473b6425..aca206a5e 100644 --- a/packages/build/src/build/addDefaultPages/addDefaultPages.test.js +++ b/packages/build/src/build/addDefaultPages/addDefaultPages.test.js @@ -204,6 +204,15 @@ test('addDefaultPages, pages not an array', async () => { ); }); +test('addDefaultPages, with a page not an object', async () => { + const components = { + pages: [null], + }; + await expect(addDefaultPages({ components, context })).rejects.toThrow( + 'pages[0] is not an object. Received null' + ); +}); + test('addDefaultPages, pages are copied', async () => { const components1 = {}; const res1 = await addDefaultPages({ components: components1, context }); diff --git a/packages/build/src/build/writePages.js b/packages/build/src/build/writePages.js index 0602077cf..14cbf6541 100644 --- a/packages/build/src/build/writePages.js +++ b/packages/build/src/build/writePages.js @@ -14,12 +14,7 @@ limitations under the License. */ -import { type } from '@lowdefy/helpers'; - async function writePage({ page, context }) { - if (!type.isObject(page)) { - throw new Error(`Page is not an object. Received ${JSON.stringify(page)}`); - } await context.writeBuildArtifact( `pages/${page.pageId}/${page.pageId}.json`, JSON.stringify(page, null, 2) @@ -27,10 +22,6 @@ async function writePage({ page, context }) { } async function writePages({ components, context }) { - if (type.isNone(components.pages)) return; - if (!type.isArray(components.pages)) { - throw new Error(`Pages is not an array.`); - } const writePromises = components.pages.map((page) => writePage({ page, context })); return Promise.all(writePromises); } diff --git a/packages/build/src/build/writePages.test.js b/packages/build/src/build/writePages.test.js index 681178408..61287df08 100644 --- a/packages/build/src/build/writePages.test.js +++ b/packages/build/src/build/writePages.test.js @@ -99,25 +99,3 @@ test('writePages no pages', async () => { await writePages({ components, context }); expect(mockWriteBuildArtifact.mock.calls).toEqual([]); }); - -test('writePages pages undefined', async () => { - const components = {}; - await writePages({ components, context }); - expect(mockWriteBuildArtifact.mock.calls).toEqual([]); -}); - -test('writePages pages not an array', async () => { - const components = { - pages: 'pages', - }; - await expect(writePages({ components, context })).rejects.toThrow('Pages is not an array.'); -}); - -test('writePages page is not an object', async () => { - const components = { - pages: ['page'], - }; - await expect(writePages({ components, context })).rejects.toThrow( - 'Page is not an object. Received "page"' - ); -}); diff --git a/packages/build/src/build/writeRequests.js b/packages/build/src/build/writeRequests.js index 683a95424..1d2662748 100644 --- a/packages/build/src/build/writeRequests.js +++ b/packages/build/src/build/writeRequests.js @@ -14,8 +14,6 @@ limitations under the License. */ -import { type } from '@lowdefy/helpers'; - async function writeRequestsOnPage({ page, context }) { return Promise.all( page.requests.map(async (request) => { @@ -32,7 +30,6 @@ async function writeRequestsOnPage({ page, context }) { } async function writeRequests({ components, context }) { - if (type.isNone(components.pages)) return; const writePromises = components.pages.map((page) => writeRequestsOnPage({ page, context })); return Promise.all(writePromises); } diff --git a/packages/build/src/build/writeRequests.test.js b/packages/build/src/build/writeRequests.test.js index 3dae0384b..dda1b07c9 100644 --- a/packages/build/src/build/writeRequests.test.js +++ b/packages/build/src/build/writeRequests.test.js @@ -224,12 +224,6 @@ test('writeRequests empty pages array', async () => { expect(mockWriteBuildArtifact.mock.calls).toEqual([]); }); -test('writeRequests no pages array', async () => { - const components = {}; - await writeRequests({ components, context }); - expect(mockWriteBuildArtifact.mock.calls).toEqual([]); -}); - test('writeRequests deletes request properties', async () => { const components = { pages: [