diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 839f7500..5af94b28 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -27,7 +27,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 with: - node-version: 14.17.6 + node-version: 16.x.x - name: install modules run: npm install diff --git a/package.json b/package.json index b2691378..b0733dd0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "skyflow-node", - "version": "2.0.0-beta.2", + "version": "2.0.0-beta.3", "description": "Skyflow SDK for Node.js", "main": "./lib/index.js", "module": "./lib/index.js", diff --git a/src/error/messages/index.ts b/src/error/messages/index.ts index f4f6aed8..a2bc04e9 100644 --- a/src/error/messages/index.ts +++ b/src/error/messages/index.ts @@ -4,7 +4,7 @@ const errorPrefix = `Skyflow Node SDK v${sdkDetails.version}`; const errorMessages = { CONFIG_MISSING: `${errorPrefix} Initialization failed. Skyflow config cannot be empty. Specify a valid skyflow config.`, - INVALID_SKYFLOW_CONFIG: `${errorPrefix} Initialization failed. Invalid skyflow config. Vaults configs key missing in skyflow config.`, + INVALID_SKYFLOW_CONFIG: `${errorPrefix} Initialization failed. Invalid skyflow config. Vault/Connection config key missing in skyflow config.`, INVALID_TYPE_FOR_CONFIG: `${errorPrefix} Initialization failed. Invalid %s1 config. Specify a valid %s1 config.`, EMPTY_VAULT_CONFIG: `${errorPrefix} Initialization failed. Vault config cannot be empty. Specify a valid vault config.`, EMPTY_CONNECTION_CONFIG: `${errorPrefix} Initialization failed. Connection config cannot be empty. Specify a valid connection config.`, diff --git a/src/utils/validations/index.ts b/src/utils/validations/index.ts index 09b31ba6..025c5f0a 100644 --- a/src/utils/validations/index.ts +++ b/src/utils/validations/index.ts @@ -91,6 +91,15 @@ export const validateSkyflowConfig = (config: SkyflowConfig, logLevel: LogLevel if (config) { if (!Object.prototype.hasOwnProperty.call(config, 'vaultConfigs')) { printLog(logs.errorLogs.VAULT_CONFIG_KEY_MISSING, MessageType.ERROR, logLevel); + } + + const { vaultConfigs, connectionConfigs } = config; + + // Count how many of the fields are defined + const definedFields = [vaultConfigs, connectionConfigs].filter(Boolean).length; + + // If none are present + if (definedFields === 0) { throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_SKYFLOW_CONFIG); } @@ -98,10 +107,6 @@ export const validateSkyflowConfig = (config: SkyflowConfig, logLevel: LogLevel throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TYPE_FOR_CONFIG, [VAULT]) } - if (config?.vaultConfigs.length === 0) { - throw new SkyflowError(SKYFLOW_ERROR_CODE.EMPTY_VAULT_CONFIG); - } - if (config?.connectionConfigs && !Array.isArray(config?.connectionConfigs)) { throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TYPE_FOR_CONFIG, [CONNECTION]) } @@ -321,15 +326,11 @@ function validateInsertInput(input: unknown, index: number): void { throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_RECORD_IN_INSERT, [index]); } - // Iterate over the key-value pairs and check their types - for (const [key, value] of entries) { + // Iterate over the keys and check their types + for (const [key] of entries) { if (key && typeof key !== 'string') { throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_RECORD_IN_INSERT, [index]); } - // update the data type accordingly - if (value && typeof value !== 'string') { - throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_RECORD_IN_INSERT, [index]); - } } } catch (error) { @@ -349,15 +350,11 @@ function validateUpdateInput(input: unknown): void { throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_RECORD_IN_UPDATE); } - // Iterate over the key-value pairs and check their types - for (const [key, value] of entries) { + // Iterate over the keys and check their types + for (const [key] of entries) { if (key && typeof key !== 'string') { throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_RECORD_IN_UPDATE); } - // update the data type accordingly - if (value && typeof value !== 'string') { - throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_RECORD_IN_UPDATE); - } } } catch (error) { @@ -377,15 +374,11 @@ function validateUpdateToken(input: unknown): void { throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TOKEN_IN_UPDATE); } - // Iterate over the key-value pairs and check their types - for (const [key, value] of entries) { + // Iterate over the keys and check their types + for (const [key] of entries) { if (key && typeof key !== 'string') { throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TOKEN_IN_UPDATE); } - // update the data type accordingly - if (value && typeof value !== 'string') { - throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TOKEN_IN_UPDATE); - } } } catch (error) { @@ -434,42 +427,42 @@ export const validateInsertOptions = (insertOptions?: InsertOptions) => { }; const validateTokensMapWithTokenStrict = ( - data: object, - tokens: object + data: object, + tokens: object ) => { - const dataKeys = Object.keys(data); + const dataKeys = Object.keys(data); - for (const key of dataKeys) { - if (!tokens.hasOwnProperty(key)) { - throw new SkyflowError(SKYFLOW_ERROR_CODE.INSUFFICIENT_TOKENS_PASSED_FOR_TOKEN_MODE_ENABLE_STRICT); + for (const key of dataKeys) { + if (!tokens.hasOwnProperty(key)) { + throw new SkyflowError(SKYFLOW_ERROR_CODE.INSUFFICIENT_TOKENS_PASSED_FOR_TOKEN_MODE_ENABLE_STRICT); + } } - } }; export const validateTokensForInsertRequest = ( - insertRequest?: InsertRequest, - insertOptions?: InsertOptions + insertRequest?: InsertRequest, + insertOptions?: InsertOptions ) => { - if (insertRequest && insertOptions && insertOptions.getTokenMode()) { - if ( - (insertOptions.getTokenMode() == TokenMode.ENABLE || - insertOptions.getTokenMode() == TokenMode.ENABLE_STRICT) && !insertOptions.getTokens() - ) { - throw new SkyflowError(SKYFLOW_ERROR_CODE.NO_TOKENS_WITH_TOKEN_MODE); - } - - if((insertOptions.getTokenMode() == TokenMode.ENABLE_STRICT) && insertOptions.getTokens()) { - if(insertRequest.data.length!=insertOptions.getTokens()?.length) { - throw new SkyflowError(SKYFLOW_ERROR_CODE.INSUFFICIENT_TOKENS_PASSED_FOR_TOKEN_MODE_ENABLE_STRICT); + if (insertRequest && insertOptions && insertOptions.getTokenMode()) { + if ( + (insertOptions.getTokenMode() == TokenMode.ENABLE || + insertOptions.getTokenMode() == TokenMode.ENABLE_STRICT) && !insertOptions.getTokens() + ) { + throw new SkyflowError(SKYFLOW_ERROR_CODE.NO_TOKENS_WITH_TOKEN_MODE); } - if(insertOptions.getTokens()) { - for(let i=0;i { // diff --git a/src/vault/skyflow/index.ts b/src/vault/skyflow/index.ts index eb37ac49..7d265850 100644 --- a/src/vault/skyflow/index.ts +++ b/src/vault/skyflow/index.ts @@ -35,7 +35,7 @@ class Skyflow { this.commonCredentials = config?.skyflowCredentials; printLog(logs.infoLogs.VALIDATING_VAULT_CONFIG, MessageType.LOG, this.logLevel); - config.vaultConfigs.map(vaultConfig => { + config.vaultConfigs?.map(vaultConfig => { this.addVaultConfig(vaultConfig); }); printLog(logs.infoLogs.VALIDATING_CONNECTION_CONFIG, MessageType.LOG, this.logLevel); diff --git a/src/vault/types/index.ts b/src/vault/types/index.ts index 2efe1d8d..de71f8c6 100644 --- a/src/vault/types/index.ts +++ b/src/vault/types/index.ts @@ -7,7 +7,7 @@ import ConnectionController from "../controller/connections"; import VaultClient from "../client"; export interface SkyflowConfig { - vaultConfigs: VaultConfig[]; + vaultConfigs?: VaultConfig[]; connectionConfigs?: ConnectionConfig[]; skyflowCredentials?: Credentials; logLevel?: LogLevel; diff --git a/test/vault/skyflow/skyflow.test.js b/test/vault/skyflow/skyflow.test.js index 531a3372..f4730464 100644 --- a/test/vault/skyflow/skyflow.test.js +++ b/test/vault/skyflow/skyflow.test.js @@ -69,10 +69,6 @@ describe('Skyflow initialization', () => { })).toThrowError(invalidVaultConfigError); }); - test('should throw error when empty vaultConfig is passed', () => { - expect(() => new Skyflow({ vaultConfigs: [] })).toThrowError(emptyVaultConfigError); - }); - test('should throw error when invalid connectionConfig is passed', () => { expect(() => new Skyflow({ vaultConfigs: [{