From aa736b1a45a18b0231e6c0b7cd8f6dbc7301b0c1 Mon Sep 17 00:00:00 2001 From: Lucas Silva Souza Date: Mon, 14 Oct 2019 13:48:29 -0300 Subject: [PATCH] feat: Read schema subfolders (#230). Thanks to @lksilva! * recursive read all files into folder, including files in subfolder * add recursive read files into path * resolve path * fix lint problems --- .../cubejs-server-core/core/FileRepository.js | 62 ++++++++++++------- packages/cubejs-server-core/yarn.lock | 16 ++--- 2 files changed, 49 insertions(+), 29 deletions(-) diff --git a/packages/cubejs-server-core/core/FileRepository.js b/packages/cubejs-server-core/core/FileRepository.js index 66aceb8cf7d0..235945fee691 100644 --- a/packages/cubejs-server-core/core/FileRepository.js +++ b/packages/cubejs-server-core/core/FileRepository.js @@ -1,6 +1,6 @@ -const path = require('path'); -const fs = require('fs-extra'); -const R = require('ramda'); +const path = require("path"); +const fs = require("fs-extra"); +const R = require("ramda"); class FileRepository { constructor(repositoryPath) { @@ -11,13 +11,26 @@ class FileRepository { return path.join(process.cwd(), this.repositoryPath); } + async getFiles(dir, fileList = []) { + const files = await fs.readdir(path.join(this.localPath(), dir)); + // eslint-disable-next-line no-restricted-syntax + for (const file of files) { + const stat = await fs.stat(path.join(this.localPath(), dir, file)); + if (stat.isDirectory()) { + fileList = await this.getFiles(path.join(dir, file), fileList); + } else fileList.push(path.join(dir, file)); + } + return fileList; + } + async dataSchemaFiles(includeDependencies) { const self = this; - const files = await fs.readdir(this.localPath()); + const files = await self.getFiles(""); let result = await Promise.all( - files.filter((file) => R.endsWith('.js', file)) - .map(async (file) => { - const content = await fs.readFile(path.join(self.localPath(), file), "utf-8"); + files + .filter(file => R.endsWith(".js", file)) + .map(async file => { + const content = await fs.readFile(file, "utf-8"); return { fileName: file, content }; }) ); @@ -28,33 +41,40 @@ class FileRepository { } async readModules() { - const packageJson = JSON.parse(await fs.readFile('package.json', 'utf-8')); - const files = await Promise.all(Object.keys(packageJson.dependencies).map(async module => { - if (R.endsWith('-schema', module)) { - return this.readModuleFiles(path.join('node_modules', module)); - } - return []; - })); + const packageJson = JSON.parse(await fs.readFile("package.json", "utf-8")); + const files = await Promise.all( + Object.keys(packageJson.dependencies).map(async module => { + if (R.endsWith("-schema", module)) { + return this.readModuleFiles(path.join("node_modules", module)); + } + return []; + }) + ); return files.reduce((a, b) => a.concat(b)); } async readModuleFiles(modulePath) { const files = await fs.readdir(modulePath); - return (await Promise.all(files - .map(async file => { + return (await Promise.all( + files.map(async file => { const fileName = path.join(modulePath, file); const stats = await fs.lstat(fileName); if (stats.isDirectory()) { return this.readModuleFiles(fileName); - } else if (R.endsWith('.js', file)) { + } else if (R.endsWith(".js", file)) { const content = await fs.readFile(fileName, "utf-8"); - return [{ - fileName, content, readOnly: true - }]; + return [ + { + fileName, + content, + readOnly: true + } + ]; } else { return []; } - }))).reduce((a, b) => a.concat(b), []); + }) + )).reduce((a, b) => a.concat(b), []); } } diff --git a/packages/cubejs-server-core/yarn.lock b/packages/cubejs-server-core/yarn.lock index 815a7d152b14..737339c081b9 100644 --- a/packages/cubejs-server-core/yarn.lock +++ b/packages/cubejs-server-core/yarn.lock @@ -18,10 +18,10 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@cubejs-backend/api-gateway@^0.10.34": - version "0.10.34" - resolved "https://registry.yarnpkg.com/@cubejs-backend/api-gateway/-/api-gateway-0.10.34.tgz#ebec7fbe6412ebfa16e15d815c6332777f05c1f7" - integrity sha512-XBvBCw54AR0cEimOc10/RVgPMHYKBpmoug4vtEy1vfnZ0B0mBXlI+R+p7w0ZX2kEAqx0s/J8k/M2+Lsg+UBKRg== +"@cubejs-backend/api-gateway@^0.10.62": + version "0.10.62" + resolved "https://registry.yarnpkg.com/@cubejs-backend/api-gateway/-/api-gateway-0.10.62.tgz#83ad2894f7442e85d4fb00ee173070e53ff60a86" + integrity sha512-825CLVww9aOajKAwAE0S8vg4YWykMNZktA/pb9lASLNMmykm7om+gnVcphyIPc2c5W5iADbnH+X1uoqYKhkOQg== dependencies: "@hapi/joi" "^14.0.6" chrono-node "^1.3.11" @@ -37,10 +37,10 @@ ramda "^0.24.1" redis "^2.8.0" -"@cubejs-backend/schema-compiler@^0.10.61": - version "0.10.61" - resolved "https://registry.yarnpkg.com/@cubejs-backend/schema-compiler/-/schema-compiler-0.10.61.tgz#77dd5a52d9c5b429795cb5cbbf5684771014b6dc" - integrity sha512-ICvKRvQdZ+g7q1YONHLc9GxdPjrI69s/n4FUkw26+Et+fgq1JG+wt6LnIFOA++ozf2SPdyPXUb+LeTDUfBvQfA== +"@cubejs-backend/schema-compiler@^0.10.62": + version "0.10.62" + resolved "https://registry.yarnpkg.com/@cubejs-backend/schema-compiler/-/schema-compiler-0.10.62.tgz#942beb89a02c7a22bc85de50d8916928193870d5" + integrity sha512-f/2rR6ZEs0y0DrprFcSAzb58bFk69o0QlRnGS9WWFtsmQ3NuboGx4IW9SRTSdba2RPijiOVXfnmduBIDqw8e0w== dependencies: "@hapi/joi" "^14.3.1" babel-generator "^6.25.0"