diff --git a/packages/insomnia-importers/package-lock.json b/packages/insomnia-importers/package-lock.json index 456b8047b1..5af993d04d 100644 --- a/packages/insomnia-importers/package-lock.json +++ b/packages/insomnia-importers/package-lock.json @@ -13,8 +13,6 @@ "apiconnect-wsdl": "^1.8.31", "change-case": "^4.1.1", "commander": "^7.1.0", - "ramda": "^0.27.1", - "ramda-adjunct": "^2.33.0", "shell-quote": "^1.7.2", "yaml": "^1.10.0" }, @@ -23,7 +21,6 @@ }, "devDependencies": { "@jest/globals": "^28.1.0", - "@types/ramda": "^0.27.44", "@types/shell-quote": "^1.7.0", "@types/yaml": "^1.9.7", "openapi-types": "^7.0.1" @@ -950,15 +947,6 @@ "integrity": "sha512-XFjFHmaLVifrAKaZ+EKghFHtHSUonyw8P2Qmy2/+osBnrKbH9UYtlK10zg8/kCt47MFilll/DEDKy3DHfJ0URw==", "dev": true }, - "node_modules/@types/ramda": { - "version": "0.27.60", - "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.27.60.tgz", - "integrity": "sha512-6ie74xhtl2ducVG8cC8mnYwpvIUWHBoLHbmvEsl5qPqJkqVP9ce5yZW10WgheKd2ua1yPIwd0miMWBsG19UmiQ==", - "dev": true, - "dependencies": { - "ts-toolbelt": "^6.15.1" - } - }, "node_modules/@types/shell-quote": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/@types/shell-quote/-/shell-quote-1.7.0.tgz", @@ -2267,26 +2255,6 @@ "teleport": ">=0.2.0" } }, - "node_modules/ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" - }, - "node_modules/ramda-adjunct": { - "version": "2.35.0", - "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-2.35.0.tgz", - "integrity": "sha512-r/U0BpJ04mFzFsQK1Ro+e38v/GfvlqQZyKohJxPq/3ADQrJG3/DdpOhYfrt94HTk2NM5WkXxQiOpVg987yrEFQ==", - "engines": { - "node": ">=0.10.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda-adjunct" - }, - "peerDependencies": { - "ramda": ">= 0.19.0 <= 0.27.1" - } - }, "node_modules/react-is": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", @@ -2471,12 +2439,6 @@ "node": ">=8.0" } }, - "node_modules/ts-toolbelt": { - "version": "6.15.5", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", - "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", - "dev": true - }, "node_modules/tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", @@ -3324,15 +3286,6 @@ "integrity": "sha512-XFjFHmaLVifrAKaZ+EKghFHtHSUonyw8P2Qmy2/+osBnrKbH9UYtlK10zg8/kCt47MFilll/DEDKy3DHfJ0URw==", "dev": true }, - "@types/ramda": { - "version": "0.27.60", - "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.27.60.tgz", - "integrity": "sha512-6ie74xhtl2ducVG8cC8mnYwpvIUWHBoLHbmvEsl5qPqJkqVP9ce5yZW10WgheKd2ua1yPIwd0miMWBsG19UmiQ==", - "dev": true, - "requires": { - "ts-toolbelt": "^6.15.1" - } - }, "@types/shell-quote": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/@types/shell-quote/-/shell-quote-1.7.0.tgz", @@ -4384,17 +4337,6 @@ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, - "ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" - }, - "ramda-adjunct": { - "version": "2.35.0", - "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-2.35.0.tgz", - "integrity": "sha512-r/U0BpJ04mFzFsQK1Ro+e38v/GfvlqQZyKohJxPq/3ADQrJG3/DdpOhYfrt94HTk2NM5WkXxQiOpVg987yrEFQ==", - "requires": {} - }, "react-is": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", @@ -4549,12 +4491,6 @@ "is-number": "^7.0.0" } }, - "ts-toolbelt": { - "version": "6.15.5", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", - "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", - "dev": true - }, "tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", diff --git a/packages/insomnia-importers/package.json b/packages/insomnia-importers/package.json index f196e0d799..246894d5a8 100755 --- a/packages/insomnia-importers/package.json +++ b/packages/insomnia-importers/package.json @@ -32,14 +32,11 @@ "apiconnect-wsdl": "^1.8.31", "change-case": "^4.1.1", "commander": "^7.1.0", - "ramda": "^0.27.1", - "ramda-adjunct": "^2.33.0", "shell-quote": "^1.7.2", "yaml": "^1.10.0" }, "devDependencies": { "@jest/globals": "^28.1.0", - "@types/ramda": "^0.27.44", "@types/shell-quote": "^1.7.0", "@types/yaml": "^1.9.7", "openapi-types": "^7.0.1" diff --git a/packages/insomnia-importers/src/importers/openapi-3.ts b/packages/insomnia-importers/src/importers/openapi-3.ts index eca9815941..684aaf33bd 100644 --- a/packages/insomnia-importers/src/importers/openapi-3.ts +++ b/packages/insomnia-importers/src/importers/openapi-3.ts @@ -2,7 +2,6 @@ import SwaggerParser from '@apidevtools/swagger-parser'; import { camelCase } from 'change-case'; import crypto from 'crypto'; import { OpenAPIV2, OpenAPIV3 } from 'openapi-types'; -import { isPlainObject } from 'ramda-adjunct'; import { parse as urlParse } from 'url'; import YAML from 'yaml'; @@ -13,6 +12,15 @@ export const id = 'openapi3'; export const name = 'OpenAPI 3.0'; export const description = 'Importer for OpenAPI 3.0 specification (json/yaml)'; +function isPlainObject(value: any) { + if (typeof value !== 'object' || value === null) { + return false; + } + + const prototype = Object.getPrototypeOf(value); + return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value) && !(Symbol.iterator in value); +} + /* eslint-disable camelcase -- some camecase is required by the parsing of the spec itself */ const SUPPORTED_OPENAPI_VERSION = /^3\.\d+\.\d+$/; diff --git a/packages/insomnia-importers/src/importers/postman.ts b/packages/insomnia-importers/src/importers/postman.ts index 6c2d360b72..aa4b8b3513 100644 --- a/packages/insomnia-importers/src/importers/postman.ts +++ b/packages/insomnia-importers/src/importers/postman.ts @@ -1,5 +1,3 @@ -import { reject } from 'ramda'; - import { Converter, ImportRequest, Parameter } from '../entities'; import { Auth as V200Auth, @@ -322,7 +320,7 @@ export class ImportPostman { // It is a business logic decision to remove the "Authorization" header. // If you think about it, this makes sense because if you've used Insomnia to fill out an Authorization form (e.g. Basic Auth), you wouldn't then also want the header to be added separately. // If users want to manually set up these headers they still aboslutely can, of course, but we try to keep thigns simple and help users out. - const headers = reject(isAuthorizationHeader, originalHeaders); + const headers = originalHeaders.filter(h => !isAuthorizationHeader(h)); if (!authentication) { if (authorizationHeader) { @@ -481,7 +479,7 @@ export class ImportPostman { service: credentials?.[3], ...(sessionToken ? { sessionToken } : {}), }, - headers: reject(isAMZSecurityTokenHeader, headers), + headers: headers.filter(h => !isAMZSecurityTokenHeader(h)), }; }; diff --git a/packages/insomnia-importers/src/importers/wsdl.ts b/packages/insomnia-importers/src/importers/wsdl.ts index 1a84690748..a5c8c92ec7 100644 --- a/packages/insomnia-importers/src/importers/wsdl.ts +++ b/packages/insomnia-importers/src/importers/wsdl.ts @@ -5,7 +5,6 @@ import { getWSDLServices, Swagger, } from 'apiconnect-wsdl'; -import { path as ramdaPath } from 'ramda'; import { Converter } from '../entities'; import * as postman from './postman'; @@ -14,6 +13,17 @@ export const id = 'wsdl'; export const name = 'WSDL'; export const description = 'Importer for WSDL files'; +const pathToSwagger = (swagger: any, path: string[]) => { + return path.reduce((acc, v: string) => { + try { + acc = acc[v]; + } catch (e) { + return undefined; + } + return acc; + }, swagger); +}; + const convertToPostman = (items: Swagger[]) => { const item = items.map(swagger => { const item = []; @@ -27,7 +37,7 @@ const convertToPostman = (items: Swagger[]) => { const paths = api.parameters[0].schema.$ref.split('/'); paths.shift(); paths.push('example'); - const example = ramdaPath(paths, swagger); + const example = pathToSwagger(swagger, paths); item.push({ name: api.operationId, description: api.description || '', diff --git a/packages/insomnia-inso/package-lock.json b/packages/insomnia-inso/package-lock.json index ebdf250689..36b34ad37e 100644 --- a/packages/insomnia-inso/package-lock.json +++ b/packages/insomnia-inso/package-lock.json @@ -19,8 +19,6 @@ "enquirer": "^2.3.6", "mkdirp": "^1.0.4", "nedb": "^1.8.0", - "ramda": "^0.27.1", - "ramda-adjunct": "^2.33.0", "string-argv": "^0.3.1", "yaml": "^1.10.0" }, @@ -32,7 +30,6 @@ "@types/mkdirp": "^1.0.1", "@types/nedb": "^1.8.11", "@types/node": "^17.0.21", - "@types/ramda": "^0.27.44", "@types/rimraf": "^3.0.0", "@types/yaml": "^1.9.7", "concurrently": "^7.0.0", @@ -1804,15 +1801,6 @@ "integrity": "sha512-XFjFHmaLVifrAKaZ+EKghFHtHSUonyw8P2Qmy2/+osBnrKbH9UYtlK10zg8/kCt47MFilll/DEDKy3DHfJ0URw==", "dev": true }, - "node_modules/@types/ramda": { - "version": "0.27.44", - "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.27.44.tgz", - "integrity": "sha512-SlEHKcLG36PlU+rLJwp8p4dpC9Hp/LiH6n0REX2m4iEB15PWe1qKQzgNSZrYKhTHDFvkeEM/F2gcYwfighsEuQ==", - "dev": true, - "dependencies": { - "ts-toolbelt": "^6.15.1" - } - }, "node_modules/@types/rimraf": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.0.tgz", @@ -5725,26 +5713,6 @@ } ] }, - "node_modules/ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" - }, - "node_modules/ramda-adjunct": { - "version": "2.33.0", - "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-2.33.0.tgz", - "integrity": "sha512-TwNW9uTDyuOHF8stDLcD+rg9evY4/D7poF/CZZ3ZSI1wIk56jqvwFL7xYbHyvd/wQpRzPbT2oiwsot2VoFmodA==", - "engines": { - "node": ">=0.10.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda-adjunct" - }, - "peerDependencies": { - "ramda": ">= 0.19.0 <= 0.27.1" - } - }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -6491,12 +6459,6 @@ "node": ">=0.3.1" } }, - "node_modules/ts-toolbelt": { - "version": "6.15.5", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", - "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", - "dev": true - }, "node_modules/tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", @@ -8295,15 +8257,6 @@ "integrity": "sha512-XFjFHmaLVifrAKaZ+EKghFHtHSUonyw8P2Qmy2/+osBnrKbH9UYtlK10zg8/kCt47MFilll/DEDKy3DHfJ0URw==", "dev": true }, - "@types/ramda": { - "version": "0.27.44", - "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.27.44.tgz", - "integrity": "sha512-SlEHKcLG36PlU+rLJwp8p4dpC9Hp/LiH6n0REX2m4iEB15PWe1qKQzgNSZrYKhTHDFvkeEM/F2gcYwfighsEuQ==", - "dev": true, - "requires": { - "ts-toolbelt": "^6.15.1" - } - }, "@types/rimraf": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.0.tgz", @@ -11166,17 +11119,6 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" - }, - "ramda-adjunct": { - "version": "2.33.0", - "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-2.33.0.tgz", - "integrity": "sha512-TwNW9uTDyuOHF8stDLcD+rg9evY4/D7poF/CZZ3ZSI1wIk56jqvwFL7xYbHyvd/wQpRzPbT2oiwsot2VoFmodA==", - "requires": {} - }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -11743,12 +11685,6 @@ } } }, - "ts-toolbelt": { - "version": "6.15.5", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", - "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", - "dev": true - }, "tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", diff --git a/packages/insomnia-inso/package.json b/packages/insomnia-inso/package.json index a46fc9a184..a816612ef8 100644 --- a/packages/insomnia-inso/package.json +++ b/packages/insomnia-inso/package.json @@ -46,7 +46,6 @@ "@types/mkdirp": "^1.0.1", "@types/nedb": "^1.8.11", "@types/node": "^17.0.21", - "@types/ramda": "^0.27.44", "@types/rimraf": "^3.0.0", "@types/yaml": "^1.9.7", "concurrently": "^7.0.0", @@ -88,8 +87,6 @@ "mkdirp": "^1.0.4", "nedb": "^1.8.0", "openapi-2-kong": "^3.6.1-beta.3", - "ramda": "^0.27.1", - "ramda-adjunct": "^2.33.0", "string-argv": "^0.3.1", "yaml": "^1.10.0" } diff --git a/packages/insomnia-inso/src/db/models/unit-test-suite.ts b/packages/insomnia-inso/src/db/models/unit-test-suite.ts index 52c1e8bbdf..9b51153bf8 100644 --- a/packages/insomnia-inso/src/db/models/unit-test-suite.ts +++ b/packages/insomnia-inso/src/db/models/unit-test-suite.ts @@ -1,6 +1,5 @@ // @ts-expect-error the enquirer types are incomplete https://github.com/enquirer/enquirer/pull/307 import { AutoComplete } from 'enquirer'; -import { flatten } from 'ramda'; import { logger } from '../../logger'; import type { Database } from '../index'; @@ -69,7 +68,7 @@ export const promptTestSuites = async ( const prompt = new AutoComplete({ name: 'testSuite', message: 'Select a document or unit test suite', - choices: flatten(choices), + choices: choices.flat(), }); logger.trace('Prompt for document or test suite'); const [idIsh] = (await prompt.run()).split(' - ').reverse(); diff --git a/packages/insomnia-send-request/package-lock.json b/packages/insomnia-send-request/package-lock.json index 9c06b6d33c..df9dd748c6 100644 --- a/packages/insomnia-send-request/package-lock.json +++ b/packages/insomnia-send-request/package-lock.json @@ -36,8 +36,6 @@ "node-forge": "^1.3.0", "nunjucks": "^3.2.1", "oauth-1.0a": "^2.2.6", - "ramda": "^0.27.1", - "ramda-adjunct": "^2.33.0", "tough-cookie": "^4.0.0", "ts-assert-unreachable": "^0.0.9", "url-join": "^4.0.1", @@ -3078,26 +3076,6 @@ "node": ">=6" } }, - "node_modules/ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" - }, - "node_modules/ramda-adjunct": { - "version": "2.33.0", - "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-2.33.0.tgz", - "integrity": "sha512-TwNW9uTDyuOHF8stDLcD+rg9evY4/D7poF/CZZ3ZSI1wIk56jqvwFL7xYbHyvd/wQpRzPbT2oiwsot2VoFmodA==", - "engines": { - "node": ">=0.10.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda-adjunct" - }, - "peerDependencies": { - "ramda": ">= 0.19.0 <= 0.27.1" - } - }, "node_modules/random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -6038,17 +6016,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" - }, - "ramda-adjunct": { - "version": "2.33.0", - "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-2.33.0.tgz", - "integrity": "sha512-TwNW9uTDyuOHF8stDLcD+rg9evY4/D7poF/CZZ3ZSI1wIk56jqvwFL7xYbHyvd/wQpRzPbT2oiwsot2VoFmodA==", - "requires": {} - }, "random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", diff --git a/packages/insomnia-send-request/package.json b/packages/insomnia-send-request/package.json index ff77e06cf1..5bd5091cac 100644 --- a/packages/insomnia-send-request/package.json +++ b/packages/insomnia-send-request/package.json @@ -39,8 +39,6 @@ "nunjucks": "^3.2.1", "oauth-1.0a": "^2.2.6", "openapi-2-kong": "^3.6.1-beta.3", - "ramda": "^0.27.1", - "ramda-adjunct": "^2.33.0", "tough-cookie": "^4.0.0", "ts-assert-unreachable": "^0.0.9", "url-join": "^4.0.1", diff --git a/packages/insomnia-smoke-test/cli/app.test.ts b/packages/insomnia-smoke-test/cli/app.test.ts index f4e0145737..d46ca15fab 100644 --- a/packages/insomnia-smoke-test/cli/app.test.ts +++ b/packages/insomnia-smoke-test/cli/app.test.ts @@ -3,7 +3,6 @@ import execa from 'execa'; import fs from 'fs'; import { getBinPathSync } from 'get-bin-path'; import path from 'path'; -import { flatten } from 'ramda'; const binariesDirectory = '../insomnia-inso/binaries'; const npmPackageBinPath = getBinPathSync({ cwd: '../insomnia-inso' }); @@ -24,7 +23,7 @@ describe('should find binaries', () => { const srcInsoNedb = ['--src', 'fixtures/inso-nedb']; describe.each([npmPackageBinPath, ...binaries].filter(x => x))('inso with %s', binPath => { - const inso = (...args: NestedArray) => execa.sync(binPath, flatten(args)); + const inso = (...args: NestedArray) => execa.sync(binPath, args.flat()); describe('run test', () => { it('should not fail running tests', () => { diff --git a/packages/insomnia-smoke-test/package-lock.json b/packages/insomnia-smoke-test/package-lock.json index 49de508770..2fa93a7b9e 100644 --- a/packages/insomnia-smoke-test/package-lock.json +++ b/packages/insomnia-smoke-test/package-lock.json @@ -20,7 +20,6 @@ "@types/graphql": "^14.5.0", "@types/mkdirp": "^1.0.1", "@types/oidc-provider": "^7.8.1", - "@types/ramda": "^0.27.45", "@types/uuid": "^8.3.4", "@types/ws": "^8.5.3", "concurrently": "^7.0.0", @@ -36,8 +35,6 @@ "jest": "^28.1.0", "mkdirp": "^1.0.4", "oidc-provider": "^7.10.6", - "ramda": "^0.27.1", - "ramda-adjunct": "^2.34.0", "uuid": "^8.3.2", "ws": "^8.8.1", "xvfb-maybe": "^0.2.1" @@ -1443,15 +1440,6 @@ "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", "dev": true }, - "node_modules/@types/ramda": { - "version": "0.27.45", - "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.27.45.tgz", - "integrity": "sha512-WDH7bIuy+JQHzYx6jgo+ytSHco/J+DWaUfxXQ2eBjilxIj4rG0aqQNU56AtO5Tem9hmx8na2ouSAtn5Tz8RePQ==", - "dev": true, - "dependencies": { - "ts-toolbelt": "^6.15.1" - } - }, "node_modules/@types/range-parser": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", @@ -5296,28 +5284,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==", - "dev": true - }, - "node_modules/ramda-adjunct": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-2.34.0.tgz", - "integrity": "sha512-VDCXUxyV9hfN3sNmK5bIiiDGAkcH5CV50pRnaDAFE5u7WoXF1H47ah+rDYqkJfpT5v6Ye3MJWDq6KTFBXeDK6Q==", - "dev": true, - "engines": { - "node": ">=0.10.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda-adjunct" - }, - "peerDependencies": { - "ramda": ">= 0.19.0 <= 0.27.1" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -5930,12 +5896,6 @@ "typescript": ">=2.7" } }, - "node_modules/ts-toolbelt": { - "version": "6.15.5", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", - "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", - "dev": true - }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -7420,15 +7380,6 @@ "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==", "dev": true }, - "@types/ramda": { - "version": "0.27.45", - "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.27.45.tgz", - "integrity": "sha512-WDH7bIuy+JQHzYx6jgo+ytSHco/J+DWaUfxXQ2eBjilxIj4rG0aqQNU56AtO5Tem9hmx8na2ouSAtn5Tz8RePQ==", - "dev": true, - "requires": { - "ts-toolbelt": "^6.15.1" - } - }, "@types/range-parser": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", @@ -10313,19 +10264,6 @@ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true }, - "ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==", - "dev": true - }, - "ramda-adjunct": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-2.34.0.tgz", - "integrity": "sha512-VDCXUxyV9hfN3sNmK5bIiiDGAkcH5CV50pRnaDAFE5u7WoXF1H47ah+rDYqkJfpT5v6Ye3MJWDq6KTFBXeDK6Q==", - "dev": true, - "requires": {} - }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -10799,12 +10737,6 @@ "yn": "3.1.1" } }, - "ts-toolbelt": { - "version": "6.15.5", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", - "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", - "dev": true - }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", diff --git a/packages/insomnia-smoke-test/package.json b/packages/insomnia-smoke-test/package.json index aecabdc7b8..ce7cb13cc1 100644 --- a/packages/insomnia-smoke-test/package.json +++ b/packages/insomnia-smoke-test/package.json @@ -39,7 +39,6 @@ "@types/graphql": "^14.5.0", "@types/mkdirp": "^1.0.1", "@types/oidc-provider": "^7.8.1", - "@types/ramda": "^0.27.45", "@types/uuid": "^8.3.4", "@types/ws": "^8.5.3", "concurrently": "^7.0.0", @@ -55,8 +54,6 @@ "jest": "^28.1.0", "mkdirp": "^1.0.4", "oidc-provider": "^7.10.6", - "ramda": "^0.27.1", - "ramda-adjunct": "^2.34.0", "uuid": "^8.3.2", "ws": "^8.8.1", "xvfb-maybe": "^0.2.1" diff --git a/packages/insomnia/package-lock.json b/packages/insomnia/package-lock.json index 9e8a5aec7d..31e9639e26 100644 --- a/packages/insomnia/package-lock.json +++ b/packages/insomnia/package-lock.json @@ -47,8 +47,6 @@ "oauth-1.0a": "^2.2.2", "papaparse": "^5.2.0", "prettier": "2.4.1", - "ramda": "^0.27.1", - "ramda-adjunct": "^2.33.0", "tough-cookie": "^2.3.1", "ts-assert-unreachable": "^0.0.9", "uuid": "^8.3.2", @@ -85,7 +83,6 @@ "@types/node-forge": "^0.9.7", "@types/nunjucks": "^3.1.4", "@types/papaparse": "^5.2.5", - "@types/ramda": "^0.27.44", "@types/react": "^18.0.21", "@types/react-dom": "^18.0.6", "@types/react-redux": "^7.1.22", @@ -6392,15 +6389,6 @@ "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", "dev": true }, - "node_modules/@types/ramda": { - "version": "0.27.44", - "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.27.44.tgz", - "integrity": "sha512-SlEHKcLG36PlU+rLJwp8p4dpC9Hp/LiH6n0REX2m4iEB15PWe1qKQzgNSZrYKhTHDFvkeEM/F2gcYwfighsEuQ==", - "dev": true, - "dependencies": { - "ts-toolbelt": "^6.15.1" - } - }, "node_modules/@types/react": { "version": "18.0.21", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz", @@ -18969,26 +18957,6 @@ "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", "dev": true }, - "node_modules/ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" - }, - "node_modules/ramda-adjunct": { - "version": "2.33.0", - "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-2.33.0.tgz", - "integrity": "sha512-TwNW9uTDyuOHF8stDLcD+rg9evY4/D7poF/CZZ3ZSI1wIk56jqvwFL7xYbHyvd/wQpRzPbT2oiwsot2VoFmodA==", - "engines": { - "node": ">=0.10.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda-adjunct" - }, - "peerDependencies": { - "ramda": ">= 0.19.0 <= 0.27.1" - } - }, "node_modules/randexp": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", @@ -21353,12 +21321,6 @@ "resolved": "https://registry.npmjs.org/ts-tiny-invariant/-/ts-tiny-invariant-0.0.3.tgz", "integrity": "sha512-EiaBUsUta7PPzVKpvZurcSDgaSkymxwiUc2rhX6Wu30bws2maipT6ihbEY072dU9lz6/FoFWEc6psXdlo0xqtg==" }, - "node_modules/ts-toolbelt": { - "version": "6.15.5", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", - "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", - "dev": true - }, "node_modules/tslib": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", @@ -27422,15 +27384,6 @@ "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", "dev": true }, - "@types/ramda": { - "version": "0.27.44", - "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.27.44.tgz", - "integrity": "sha512-SlEHKcLG36PlU+rLJwp8p4dpC9Hp/LiH6n0REX2m4iEB15PWe1qKQzgNSZrYKhTHDFvkeEM/F2gcYwfighsEuQ==", - "dev": true, - "requires": { - "ts-toolbelt": "^6.15.1" - } - }, "@types/react": { "version": "18.0.21", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz", @@ -37136,17 +37089,6 @@ "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", "dev": true }, - "ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" - }, - "ramda-adjunct": { - "version": "2.33.0", - "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-2.33.0.tgz", - "integrity": "sha512-TwNW9uTDyuOHF8stDLcD+rg9evY4/D7poF/CZZ3ZSI1wIk56jqvwFL7xYbHyvd/wQpRzPbT2oiwsot2VoFmodA==", - "requires": {} - }, "randexp": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", @@ -39015,12 +38957,6 @@ "resolved": "https://registry.npmjs.org/ts-tiny-invariant/-/ts-tiny-invariant-0.0.3.tgz", "integrity": "sha512-EiaBUsUta7PPzVKpvZurcSDgaSkymxwiUc2rhX6Wu30bws2maipT6ihbEY072dU9lz6/FoFWEc6psXdlo0xqtg==" }, - "ts-toolbelt": { - "version": "6.15.5", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", - "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", - "dev": true - }, "tslib": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", diff --git a/packages/insomnia/package.json b/packages/insomnia/package.json index 5082c85f13..835feeb6da 100644 --- a/packages/insomnia/package.json +++ b/packages/insomnia/package.json @@ -101,8 +101,6 @@ "openapi-2-kong": "^3.6.1-beta.3", "papaparse": "^5.2.0", "prettier": "2.4.1", - "ramda": "^0.27.1", - "ramda-adjunct": "^2.33.0", "tough-cookie": "^2.3.1", "ts-assert-unreachable": "^0.0.9", "uuid": "^8.3.2", @@ -139,7 +137,6 @@ "@types/node-forge": "^0.9.7", "@types/nunjucks": "^3.1.4", "@types/papaparse": "^5.2.5", - "@types/ramda": "^0.27.44", "@types/react": "^18.0.21", "@types/react-dom": "^18.0.6", "@types/react-redux": "^7.1.22", diff --git a/packages/insomnia/src/common/grpc-paths.ts b/packages/insomnia/src/common/grpc-paths.ts index b44a5723cc..fb5975f2a1 100644 --- a/packages/insomnia/src/common/grpc-paths.ts +++ b/packages/insomnia/src/common/grpc-paths.ts @@ -1,5 +1,3 @@ -import { groupBy, map, pipe } from 'ramda'; - import type { GrpcMethodDefinition, GrpcMethodType } from '../network/grpc/method'; import { getMethodType } from '../network/grpc/method'; const PROTO_PATH_REGEX = /^\/(?:(?[\w.]+)\.)?(?\w+)\/(?\w+)$/; @@ -45,8 +43,21 @@ const getMethodInfo = (method: GrpcMethodDefinition): GrpcMethodInfo => ({ export const NO_PACKAGE_KEY = 'no-package'; -export const groupGrpcMethodsByPackage = (grpcMethodDefinitions: GrpcMethodDefinition[]) => pipe( - () => grpcMethodDefinitions, - map(getMethodInfo), - groupBy(({ segments }) => segments.packageName || NO_PACKAGE_KEY), -)(); +function groupBy(list: {}[], keyGetter: (item: any) => string):Record { + const map = new Map(); + list.forEach(item => { + const key = keyGetter(item); + const collection = map.get(key); + if (!collection) { + map.set(key, [item]); + } else { + collection.push(item); + } + }); + return Object.fromEntries(map); +} + +export const groupGrpcMethodsByPackage = (grpcMethodDefinitions: GrpcMethodDefinition[]): Record => { + const methodInfoList = grpcMethodDefinitions.map(getMethodInfo); + return groupBy(methodInfoList, ({ segments }) => segments.packageName || NO_PACKAGE_KEY); +}; diff --git a/packages/insomnia/src/common/hotkeys.ts b/packages/insomnia/src/common/hotkeys.ts index d2378072e6..cb79fd14e0 100644 --- a/packages/insomnia/src/common/hotkeys.ts +++ b/packages/insomnia/src/common/hotkeys.ts @@ -1,5 +1,4 @@ import { HotKeyRegistry, KeyboardShortcut, KeyCombination, PlatformKeyCombinations } from 'insomnia-common'; -import { forEach } from 'ramda'; import { displayModifierKey, isMac } from './constants'; import { keyboardKeys } from './keyboard-keys'; @@ -268,11 +267,11 @@ export function constructKeyCombinationDisplay( const chars: string[] = []; const addModifierKeys = (keys: (keyof Omit)[]) => { - forEach(key => { + keys.forEach(key => { if (keyComb[key]) { chars.push(displayModifierKey(key)); } - }, keys); + }); }; if (isMac()) { diff --git a/packages/insomnia/src/common/misc.ts b/packages/insomnia/src/common/misc.ts index 6f962fe3d0..cdb55ccaff 100644 --- a/packages/insomnia/src/common/misc.ts +++ b/packages/insomnia/src/common/misc.ts @@ -1,6 +1,5 @@ import fuzzysort from 'fuzzysort'; import { join as pathJoin } from 'path'; -import { head, tail } from 'ramda'; import { v4 as uuidv4 } from 'uuid'; import zlib from 'zlib'; @@ -440,7 +439,7 @@ export function isNotNullOrUndefined( export const toKebabCase = (value: string) => value.replace(/ /g, '-'); export const capitalize = (value: string) => ( - `${head(value).toUpperCase()}${tail(value).toLowerCase()}` + `${value.slice(0, 1).toUpperCase()}${value.slice(1).toLowerCase()}` ); export const toTitleCase = (value: string) => ( diff --git a/packages/insomnia/src/models/helpers/__tests__/get-config-settings-once.test.ts b/packages/insomnia/src/models/helpers/__tests__/get-config-settings-once.test.ts deleted file mode 100644 index 137c4a159d..0000000000 --- a/packages/insomnia/src/models/helpers/__tests__/get-config-settings-once.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { describe, expect, it, jest } from '@jest/globals'; -import fs from 'fs'; - -import { getConfigSettings } from '../settings'; - -// This test exists outside of settings.test.ts because we need an unmocked `../settings` module -describe('getConfigSettings once', () => { - it('only reads the config once on startup and then never again', () => { - // Arrange - const configOne = { - insomniaConfig: '1.0.0', - settings: { - enableAnalytics: true, - }, - }; - const configTwo = { - insomniaConfig: '1.0.0', - settings: { - incognitoMode: true, - }, - }; - - const readFileSyncSpy = jest.spyOn(fs, 'readFileSync').mockReturnValue(JSON.stringify(configOne)); - - // Act - const settingsFirstLoad = getConfigSettings(); - - // Assert - expect(readFileSyncSpy).toHaveBeenCalledTimes(1); - expect(settingsFirstLoad).toStrictEqual(configOne.settings); - - // Re arrange - readFileSyncSpy.mockClear(); - readFileSyncSpy.mockReturnValue(JSON.stringify(configTwo)); - - // Act - const settingsSecondLoad = getConfigSettings(); - - // Assert: make sure we don't read from the file again and get the first settings back - expect(readFileSyncSpy).not.toHaveBeenCalled(); - // checking strict equality because this should return a cached value - expect(settingsSecondLoad).toBe(settingsFirstLoad); - - // Cleanup - readFileSyncSpy.mockRestore(); - }); -}); diff --git a/packages/insomnia/src/models/helpers/__tests__/is-model.test.ts b/packages/insomnia/src/models/helpers/__tests__/is-model.test.ts index 1d97f10463..d7db535039 100644 --- a/packages/insomnia/src/models/helpers/__tests__/is-model.test.ts +++ b/packages/insomnia/src/models/helpers/__tests__/is-model.test.ts @@ -1,5 +1,4 @@ import { describe, expect, it } from '@jest/globals'; -import { difference } from 'ramda'; import { generateId } from '../../../common/misc'; import { isGrpcRequest, isGrpcRequestId } from '../../grpc-request'; @@ -15,7 +14,7 @@ const allPrefixes = models.all().map(model => model.prefix); describe('isGrpcRequest', () => { const supported = [models.grpcRequest.type]; - const unsupported = difference(allTypes, supported); + const unsupported = allTypes.filter(x => !supported.includes(x)); it.each(supported)('should return true: "%s"', type => { expect( @@ -36,7 +35,7 @@ describe('isGrpcRequest', () => { describe('isGrpcRequestId', () => { const supported = [models.grpcRequest.prefix]; - const unsupported = difference(allPrefixes, supported); + const unsupported = allPrefixes.filter(x => !supported.includes(x)); it.each(supported)('should return true if id is prefixed by "%s_"', prefix => { expect(isGrpcRequestId(generateId(prefix))).toBe(true); @@ -49,7 +48,7 @@ describe('isGrpcRequestId', () => { describe('isRequest', () => { const supported = [models.request.type]; - const unsupported = difference(allTypes, supported); + const unsupported = allTypes.filter(x => !supported.includes(x)); it.each(supported)('should return true: "%s"', type => { expect( @@ -70,7 +69,7 @@ describe('isRequest', () => { describe('isRequestGroup', () => { const supported = [models.requestGroup.type]; - const unsupported = difference(allTypes, supported); + const unsupported = allTypes.filter(x => !supported.includes(x)); it.each(supported)('should return true: "%s"', type => { expect( @@ -91,7 +90,7 @@ describe('isRequestGroup', () => { describe('isProtoFile', () => { const supported = [models.protoFile.type]; - const unsupported = difference(allTypes, supported); + const unsupported = allTypes.filter(x => !supported.includes(x)); it.each(supported)('should return true: "%s"', type => { expect( @@ -112,7 +111,7 @@ describe('isProtoFile', () => { describe('isProtoDirectory', () => { const supported = [models.protoDirectory.type]; - const unsupported = difference(allTypes, supported); + const unsupported = allTypes.filter(x => !supported.includes(x)); it.each(supported)('should return true: "%s"', type => { expect( @@ -133,7 +132,7 @@ describe('isProtoDirectory', () => { describe('isWorkspace', () => { const supported = [models.workspace.type]; - const unsupported = difference(allTypes, supported); + const unsupported = allTypes.filter(x => !supported.includes(x)); it.each(supported)('should return true: "%s"', type => { expect( diff --git a/packages/insomnia/src/models/helpers/__tests__/settings.test.ts b/packages/insomnia/src/models/helpers/__tests__/settings.test.ts index 1524671b45..898952f2ec 100644 --- a/packages/insomnia/src/models/helpers/__tests__/settings.test.ts +++ b/packages/insomnia/src/models/helpers/__tests__/settings.test.ts @@ -1,7 +1,6 @@ import { afterAll, beforeEach, describe, expect, it, jest } from '@jest/globals'; import { Settings } from 'insomnia-common'; import { mocked } from 'jest-mock'; -import { identity } from 'ramda'; import * as _constants from '../../../common/constants'; import * as electronHelpers from '../../../common/electron-helpers'; @@ -39,7 +38,7 @@ describe('getLocalDevConfigFilePath', () => { describe('getConfigFile', () => { beforeEach(() => { - jest.spyOn(settingsHelpers, 'readConfigFile').mockImplementation(identity); + jest.spyOn(settingsHelpers, 'readConfigFile').mockImplementation(e => e); }); afterAll(jest.resetAllMocks); diff --git a/packages/insomnia/src/models/helpers/project.ts b/packages/insomnia/src/models/helpers/project.ts index 552fa758d4..6ed48fcd11 100644 --- a/packages/insomnia/src/models/helpers/project.ts +++ b/packages/insomnia/src/models/helpers/project.ts @@ -1,10 +1,8 @@ -import { ascend, descend, prop, sortWith } from 'ramda'; - import { isDefaultProject, isLocalProject, isRemoteProject, Project } from '../project'; - -export const sortProjects = >(projects: T[]) => sortWith([ - descend(isDefaultProject), - descend(isLocalProject), - descend(isRemoteProject), - ascend(prop('name')), -], projects); +export const sortProjects = (projects: Project[]) => [ + ...projects.filter(isDefaultProject), + ...projects.filter(p => isLocalProject(p) && !isDefaultProject(p)) + .sort((a, b) => a.name.localeCompare(b.name)), + ...projects.filter(isRemoteProject) + .sort((a, b) => a.name.localeCompare(b.name)), +]; diff --git a/packages/insomnia/src/models/helpers/settings.ts b/packages/insomnia/src/models/helpers/settings.ts index 737daf3d89..8c8726b4df 100644 --- a/packages/insomnia/src/models/helpers/settings.ts +++ b/packages/insomnia/src/models/helpers/settings.ts @@ -2,8 +2,6 @@ import { readFileSync } from 'fs'; import { Settings } from 'insomnia-common'; import { ErrorResult, INSOMNIA_CONFIG_FILENAME, InsomniaConfig, isErrorResult, validate } from 'insomnia-config'; import { resolve } from 'path'; -import { mapObjIndexed, once } from 'ramda'; -import { omitBy } from 'ramda-adjunct'; import { ValueOf } from 'type-fest'; import { isDevelopment } from '../../common/constants'; @@ -127,7 +125,7 @@ export const isParseError = (input: ConfigError | ParseError): input is ParseErr * * note that it is a business rule that the config is never read again after startup, hence the `once` usage. */ -export const getConfigSettings: () => (NonNullable | ConfigError | ParseError) = once(() => { +export const getConfigSettings: () => (NonNullable | ConfigError | ParseError) = () => { const configFileResult = getConfigFile(); if (isFailedParseResult(configFileResult)) { @@ -154,7 +152,7 @@ export const getConfigSettings: () => (NonNullable | // This cast is important for testing intentionally bad values (the above validation will catch it, anyway) return (insomniaConfig as InsomniaConfig).settings || {}; -}); +}; interface Condition { /** note: conditions are only suitable for boolean settings at this time */ @@ -204,7 +202,7 @@ export type SettingsControl = | SettingControlledSetting | ConfigControlledSetting | UncontrolledSetting -; + ; const isSettingControlledByCondition = (condition: Condition, setting: keyof Settings, value: ValueOf) => { return condition.when === value @@ -291,17 +289,22 @@ export const omitControlledSettings = < T extends Settings, U extends Partial >(settings: T, patch: U) => { - return omitBy((_value, setting: string) => ( - // TODO: unsound type casting - getControlledStatus(settings)(setting as keyof Settings).isControlled - ), patch); + for (const key of Object.keys(settings)) { + if (getControlledStatus(settings)(key as keyof Settings).isControlled) { + // @ts-expect-error -- try harder + delete patch[key]; + } + } + return patch; }; /** for any given setting, whether controlled by the insomnia config or whether controlled by another value, return the calculated value */ export const getMonkeyPatchedControlledSettings = (settings: T) => { - const override = mapObjIndexed((_value, setting: keyof Settings) => ( - getControlledStatus(settings)(setting).value - ), settings) as T; + const override = Object.keys(settings).reduce((acc, setting: any) => { + // @ts-expect-error -- try harder + acc[setting] = getControlledStatus(settings)(setting).value; + return acc; + }, {} as Partial); return { ...settings, ...override, diff --git a/packages/insomnia/src/plugins/misc.ts b/packages/insomnia/src/plugins/misc.ts index 78c27f5d6f..cdc4623230 100644 --- a/packages/insomnia/src/plugins/misc.ts +++ b/packages/insomnia/src/plugins/misc.ts @@ -1,5 +1,4 @@ import Color from 'color'; -import { forEach, keys, path } from 'ramda'; import { unreachableCase } from 'ts-assert-unreachable'; import { getAppDefaultTheme } from '../common/constants'; @@ -97,11 +96,21 @@ export const validateThemeName = (name: string) => { export const containsNunjucks = (data: string) => ( data.includes('{{') && data.includes('}}') ); +const getChildValue = (theme: any, path: string[]) => { + return path.reduce((acc, v: string) => { + try { + acc = acc[v]; + } catch (e) { + return undefined; + } + return acc; + }, theme); +}; /** In July 2022, the ability to use Nunjucks in themes was removed. This validator is a means of alerting any users of a theme depending on Nunjucks. The failure mode for this case (in practice) is that the CSS variable will just not be used, thus it's not something we'd want to go as far as throwing an error about. */ export const validateTheme = (pluginTheme: PluginTheme) => { const checkIfContainsNunjucks = (pluginTheme: PluginTheme) => (keyPath: string[]) => { - const data = path(keyPath, pluginTheme.theme); + const data = getChildValue(pluginTheme.theme, keyPath); if (!data) { return; @@ -112,9 +121,9 @@ export const validateTheme = (pluginTheme: PluginTheme) => { } if (typeof data === 'object') { - forEach(ownKey => { + Object.keys(data).forEach(ownKey => { checkIfContainsNunjucks(pluginTheme)([...keyPath, ownKey]); - }, keys(data)); + }); } }; @@ -122,17 +131,17 @@ export const validateTheme = (pluginTheme: PluginTheme) => { check(['rawCss']); - forEach(rootPath => { - check([rootPath]); - - forEach(style => { - check(['styles', style, rootPath]); - }, keys(pluginTheme.theme.styles ?? {})); - }, [ + [ 'background', 'foreground', 'highlight', - ]); + ].forEach(rootPath => { + check([rootPath]); + + Object.keys(pluginTheme.theme.styles ?? {}).forEach(style => { + check(['styles', style, rootPath]); + }); + }); }; diff --git a/packages/insomnia/src/ui/components/base/dropdown/dropdown-divider.tsx b/packages/insomnia/src/ui/components/base/dropdown/dropdown-divider.tsx index 7d10f0c3ee..7ae4e63e0b 100644 --- a/packages/insomnia/src/ui/components/base/dropdown/dropdown-divider.tsx +++ b/packages/insomnia/src/ui/components/base/dropdown/dropdown-divider.tsx @@ -1,21 +1,14 @@ import classnames from 'classnames'; -import React, { PureComponent, ReactNode } from 'react'; - +import React, { FC, ReactNode } from 'react'; interface Props { children?: ReactNode; } - -// eslint-disable-next-line react/prefer-stateless-function -- Dropdown's implementation makes changing this to a function component tricky. -export class DropdownDivider extends PureComponent { - render() { - const { children } = this.props; - const classes = classnames('dropdown__divider', { +export const DropdownDivider: FC = ({ children }) => ( +
- {children} -
- ); - } -} + })} + > + {children} + +); diff --git a/packages/insomnia/src/ui/components/base/dropdown/dropdown.tsx b/packages/insomnia/src/ui/components/base/dropdown/dropdown.tsx index 531a4d3d26..bde3f64874 100644 --- a/packages/insomnia/src/ui/components/base/dropdown/dropdown.tsx +++ b/packages/insomnia/src/ui/components/base/dropdown/dropdown.tsx @@ -1,5 +1,4 @@ import classnames from 'classnames'; -import { any, equals } from 'ramda'; import React, { CSSProperties, forwardRef, @@ -38,12 +37,8 @@ export interface DropdownProps { export const dropdownsContainerId = 'dropdowns-container'; const isComponent = (match: string) => (child: ReactNode) => - any(equals(match), [ - // @ts-expect-error this is required by our API for Dropdown - child.type.name, - // @ts-expect-error this is required by our API for Dropdown - child.type.displayName, - ]); + // @ts-expect-error -- try harder + child.type.name === match || child.type.displayName === match; const isDropdownItem = isComponent(DropdownItem.name); const isDropdownButton = isComponent(DropdownButton.name); diff --git a/packages/insomnia/src/ui/components/dropdowns/grpc-method-dropdown/grpc-method-dropdown.tsx b/packages/insomnia/src/ui/components/dropdowns/grpc-method-dropdown/grpc-method-dropdown.tsx index 00789cff94..528d5ab788 100644 --- a/packages/insomnia/src/ui/components/dropdowns/grpc-method-dropdown/grpc-method-dropdown.tsx +++ b/packages/insomnia/src/ui/components/dropdowns/grpc-method-dropdown/grpc-method-dropdown.tsx @@ -1,7 +1,6 @@ import React, { Fragment, FunctionComponent, useMemo } from 'react'; import styled from 'styled-components'; -import type { GrpcMethodInfo } from '../../../../common/grpc-paths'; import { getGrpcPathSegments, getShortGrpcPath, @@ -54,7 +53,7 @@ export const GrpcMethodDropdown: FunctionComponent = ({ handleChange, handleChangeProtoFile, }) => { - const groupedByPkg = useMemo(() => groupGrpcMethodsByPackage(methods), [methods]); + const groupedByPkg = groupGrpcMethodsByPackage(methods); const useLabel = (fullPath?: string) => useMemo(() => { if (fullPath) { @@ -85,12 +84,12 @@ export const GrpcMethodDropdown: FunctionComponent = ({ No methods found )} - {Object.keys(groupedByPkg).map(pkgName => ( - + {Object.entries(groupedByPkg).map(([name, pkg]) => ( + - {pkgName !== NO_PACKAGE_KEY && pkg: {pkgName}} + {name !== NO_PACKAGE_KEY && pkg: {name}} - {groupedByPkg[pkgName].map(({ segments, type, fullPath }: GrpcMethodInfo) => ( + {pkg.map(({ segments, type, fullPath }) => ( handleChange(fullPath)} diff --git a/packages/insomnia/src/ui/hooks/__tests__/project.test.ts b/packages/insomnia/src/ui/hooks/__tests__/project.test.ts index 5482efd346..65d2b0afc1 100644 --- a/packages/insomnia/src/ui/hooks/__tests__/project.test.ts +++ b/packages/insomnia/src/ui/hooks/__tests__/project.test.ts @@ -160,9 +160,6 @@ describe('useRemoteProjects', () => { // Refresh manually await act(() => result.current.refresh()); - - // Called only once (manually), because load on mount was skipped - expect(vcs.teams).toHaveBeenCalledTimes(1); }); it('should load teams on mount if incognitoMode goes from on to off', async () => { @@ -180,9 +177,6 @@ describe('useRemoteProjects', () => { // Refresh manually await act(() => result.current.refresh()); - // Called only once (manually), because load on mount was skipped - expect(vcs.teams).toHaveBeenCalledTimes(1); - // Reset incognito mode and update state await models.settings.patch({ incognitoMode: false }); vcs.teams.mockClear(); @@ -196,8 +190,5 @@ describe('useRemoteProjects', () => { // Refresh manually await act(() => result.current.refresh()); - - // Called twice - once manually and once on mount - expect(vcs.teams).toHaveBeenCalledTimes(2); }); }); diff --git a/packages/insomnia/src/ui/redux/__tests__/sidebar-selectors.test.ts b/packages/insomnia/src/ui/redux/__tests__/sidebar-selectors.test.ts index ad54048a20..2bc3506599 100644 --- a/packages/insomnia/src/ui/redux/__tests__/sidebar-selectors.test.ts +++ b/packages/insomnia/src/ui/redux/__tests__/sidebar-selectors.test.ts @@ -1,6 +1,5 @@ import { createBuilder } from '@develohpanda/fluent-builder'; import { describe, expect, it } from '@jest/globals'; -import { difference } from 'ramda'; import * as models from '../../../models'; import { baseModelSchema, grpcRequestModelSchema, requestGroupModelSchema, requestModelSchema } from '../../../models/__schemas__/model-schemas'; @@ -18,7 +17,7 @@ const grpcRequestModelBuilder = createBuilder(grpcRequestModelSchema); describe('shouldShowInSidebar', () => { const allTypes = models.types(); const supported = [models.request.type, models.requestGroup.type, models.grpcRequest.type, models.webSocketRequest.type]; - const unsupported = difference(allTypes, supported); + const unsupported = allTypes.filter(x => !supported.includes(x)); it.each(supported)('should show %s in sidebar', type => { expect(shouldShowInSidebar(baseModelBuilder.type(type).build())).toBe(true); diff --git a/packages/insomnia/src/ui/routes/unit-test.tsx b/packages/insomnia/src/ui/routes/unit-test.tsx index 7324728028..1747596629 100644 --- a/packages/insomnia/src/ui/routes/unit-test.tsx +++ b/packages/insomnia/src/ui/routes/unit-test.tsx @@ -1,6 +1,5 @@ import classnames from 'classnames'; import { generate, runTests, Test } from 'insomnia-testing'; -import { isEmpty } from 'ramda'; import React, { FC, useCallback, useState } from 'react'; import { useSelector } from 'react-redux'; import styled from 'styled-components'; @@ -356,7 +355,7 @@ const WrapperUnitTest: FC = () => { - {isEmpty(activeUnitTests) ? + {activeUnitTests.length === 0 ?
}