Compare commits

..

34 Commits

Author SHA1 Message Date
jamesgeorge007
a3e941271e chore: address lint errors 2024-03-07 12:24:33 +05:30
jamesgeorge007
e7fded89d5 refactor: organize imports 2024-03-07 12:24:33 +05:30
jamesgeorge007
40c8d7e4b7 feat: persist bulk mode line wrap setting for request variables
- Show line wrap toggle only if entries are present under http request headers & URL encoded params body.
- Organize imports.
2024-03-07 12:24:33 +05:30
nivedin
1d93d9dabe refactor: filter non empty value for env presidence 2024-03-07 12:24:33 +05:30
nivedin
e9f1dc7ba1 chore: code refactors 2024-03-07 12:24:33 +05:30
nivedin
1e906bbec3 fix: code refactor and handle secret var in req var 2024-03-07 12:24:33 +05:30
nivedin
7776668e40 chore: align reqvariable tab to end 2024-03-07 12:24:33 +05:30
nivedin
3d38b7678b chore: aligh button in error placeholder 2024-03-07 12:24:33 +05:30
nivedin
1ca215d887 chore: add parent container for req variable codemirror 2024-03-07 12:24:33 +05:30
nivedin
aec04a13e3 chore: diable context menu for empty text 2024-03-07 12:24:33 +05:30
nivedin
9a2058bbec chore: update env hover colours 2024-03-07 12:24:33 +05:30
nivedin
1c65147a77 fix: autocomplete env bug 2024-03-07 12:24:33 +05:30
nivedin
207eea538f chore: check for active request variables 2024-03-07 12:24:33 +05:30
nivedin
e30b59e1b5 refactor: update environments colour schema 2024-03-07 12:24:33 +05:30
nivedin
9704b3324b chore: update env autocomplete 2024-03-07 12:24:33 +05:30
nivedin
386bb453d4 refactor: update environment variables precedence order 2024-03-07 12:24:33 +05:30
nivedin
175641246e refactor: update components for embeds flow 2024-03-07 12:24:33 +05:30
nivedin
fb615d2d2b chore: add env autocomplete to components 2024-03-07 12:24:33 +05:30
nivedin
7685409ee6 chore: update env tooltip updation mechanism 2024-03-07 12:24:33 +05:30
nivedin
e01818444e chore: add env autocomplete in smartenvinput 2024-03-07 12:24:33 +05:30
nivedin
52220d9a2e chore: add action for inscpector and tooltip env 2024-03-07 12:24:33 +05:30
nivedin
82d687f665 refactor: update insomnia import 2024-03-07 12:24:33 +05:30
nivedin
d44083a380 refactor: update openapi import 2024-03-07 12:24:33 +05:30
nivedin
7589c57e86 refactor: update postman import for request variable 2024-03-07 12:24:33 +05:30
nivedin
c8009aec77 chore: update test cases in cli 2024-03-07 12:24:33 +05:30
nivedin
7114f4fd43 chore: update test cases in app 2024-03-07 12:24:33 +05:30
nivedin
ca1a4ec31b refactor: update codegen and curlparser 2024-03-07 12:24:33 +05:30
nivedin
359633102e refactor: add check for request variables for env inspector 2024-03-07 12:24:33 +05:30
nivedin
b278691a9d chore: update history 2024-03-07 12:24:33 +05:30
nivedin
c27e1be230 refactor: update env tooltip 2024-03-07 12:24:33 +05:30
nivedin
11e8ba7bb3 refactor: add request variables to request runner flow 2024-03-07 12:24:33 +05:30
nivedin
2a0000cfc4 chore: remove unused file 2024-03-07 12:24:33 +05:30
nivedin
0ed063724e feat: add request variable 2024-03-07 12:24:33 +05:30
nivedin
170ec15821 refactor: add v2 request schema 2024-03-07 12:24:33 +05:30
35 changed files with 6572 additions and 3436 deletions

1
.npmrc
View File

@@ -1,2 +1 @@
shamefully-hoist=false
save-prefix=''

View File

@@ -112,7 +112,7 @@ services:
build:
dockerfile: packages/hoppscotch-backend/Dockerfile
context: .
target: prod
target: dev
env_file:
- ./.env
restart: always
@@ -122,7 +122,7 @@ services:
- PORT=3000
volumes:
# Uncomment the line below when modifying code. Only applicable when using the "dev" target.
# - ./packages/hoppscotch-backend/:/usr/src/app
- ./packages/hoppscotch-backend/:/usr/src/app
- /usr/src/app/node_modules/
depends_on:
hoppscotch-db:

View File

@@ -23,13 +23,13 @@
"./packages/*"
],
"devDependencies": {
"@commitlint/cli": "16.3.0",
"@commitlint/config-conventional": "16.2.4",
"@hoppscotch/ui": "0.1.0",
"@commitlint/cli": "^16.2.3",
"@commitlint/config-conventional": "^16.2.1",
"@hoppscotch/ui": "^0.1.0",
"@types/node": "17.0.27",
"cross-env": "7.0.3",
"http-server": "14.1.1",
"husky": "7.0.4",
"cross-env": "^7.0.3",
"http-server": "^14.1.1",
"husky": "^7.0.4",
"lint-staged": "12.4.0"
},
"pnpm": {
@@ -37,7 +37,7 @@
"vue": "3.3.9"
},
"packageExtensions": {
"httpsnippet@3.0.1": {
"httpsnippet@^3.0.1": {
"peerDependencies": {
"ajv": "6.12.3"
}

View File

@@ -17,16 +17,16 @@
"types": "dist/index.d.ts",
"sideEffects": false,
"dependencies": {
"@codemirror/language": "6.10.1",
"@codemirror/language": "6.9.3",
"@lezer/highlight": "1.2.0",
"@lezer/lr": "1.3.14"
"@lezer/lr": "^1.3.14"
},
"devDependencies": {
"@lezer/generator": "1.5.1",
"mocha": "9.2.2",
"rollup": "3.29.4",
"rollup-plugin-dts": "6.0.2",
"rollup-plugin-ts": "3.4.5",
"typescript": "5.2.2"
"@lezer/generator": "^1.5.1",
"mocha": "^9.2.2",
"rollup": "^3.29.3",
"rollup-plugin-dts": "^6.0.2",
"rollup-plugin-ts": "^3.4.5",
"typescript": "^5.2.2"
}
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "hoppscotch-backend",
"version": "2024.3.0",
"version": "2023.12.6",
"description": "",
"author": "",
"private": true,
@@ -24,83 +24,83 @@
"do-test": "pnpm run test"
},
"dependencies": {
"@apollo/server": "4.9.5",
"@nestjs-modules/mailer": "1.9.1",
"@nestjs/apollo": "12.0.9",
"@nestjs/common": "10.2.7",
"@nestjs/config": "3.1.1",
"@nestjs/core": "10.2.7",
"@nestjs/graphql": "12.0.9",
"@nestjs/jwt": "10.1.1",
"@nestjs/passport": "10.0.2",
"@nestjs/platform-express": "10.2.7",
"@nestjs/schedule": "4.0.1",
"@nestjs/throttler": "5.0.1",
"@prisma/client": "5.8.1",
"argon2": "0.30.3",
"bcrypt": "5.1.0",
"cookie": "0.5.0",
"cookie-parser": "1.4.6",
"cron": "3.1.6",
"express": "4.18.2",
"express-session": "1.17.3",
"fp-ts": "2.13.1",
"graphql": "16.8.1",
"graphql-query-complexity": "0.12.0",
"graphql-redis-subscriptions": "2.6.0",
"graphql-subscriptions": "2.0.0",
"handlebars": "4.7.7",
"io-ts": "2.2.16",
"luxon": "3.2.1",
"nodemailer": "6.9.1",
"passport": "0.6.0",
"passport-github2": "0.1.12",
"passport-google-oauth20": "2.0.0",
"passport-jwt": "4.0.1",
"passport-local": "1.0.0",
"passport-microsoft": "1.0.0",
"posthog-node": "3.6.3",
"prisma": "5.8.1",
"reflect-metadata": "0.1.13",
"rimraf": "3.0.2",
"rxjs": "7.6.0"
"@apollo/server": "^4.9.4",
"@nestjs-modules/mailer": "^1.9.1",
"@nestjs/apollo": "^12.0.9",
"@nestjs/common": "^10.2.6",
"@nestjs/config": "^3.1.1",
"@nestjs/core": "^10.2.6",
"@nestjs/graphql": "^12.0.9",
"@nestjs/jwt": "^10.1.1",
"@nestjs/passport": "^10.0.2",
"@nestjs/platform-express": "^10.2.6",
"@nestjs/schedule": "^4.0.1",
"@nestjs/throttler": "^5.0.0",
"@prisma/client": "^5.8.0",
"argon2": "^0.30.3",
"bcrypt": "^5.1.0",
"cookie": "^0.5.0",
"cookie-parser": "^1.4.6",
"cron": "^3.1.6",
"express": "^4.17.1",
"express-session": "^1.17.3",
"fp-ts": "^2.13.1",
"graphql": "^16.8.1",
"graphql-query-complexity": "^0.12.0",
"graphql-redis-subscriptions": "^2.6.0",
"graphql-subscriptions": "^2.0.0",
"handlebars": "^4.7.7",
"io-ts": "^2.2.16",
"luxon": "^3.2.1",
"nodemailer": "^6.9.1",
"passport": "^0.6.0",
"passport-github2": "^0.1.12",
"passport-google-oauth20": "^2.0.0",
"passport-jwt": "^4.0.1",
"passport-local": "^1.0.0",
"passport-microsoft": "^1.0.0",
"posthog-node": "^3.6.3",
"prisma": "^5.8.0",
"reflect-metadata": "^0.1.13",
"rimraf": "^3.0.2",
"rxjs": "^7.6.0"
},
"devDependencies": {
"@nestjs/cli": "10.2.1",
"@nestjs/schematics": "10.0.3",
"@nestjs/testing": "10.2.7",
"@relmify/jest-fp-ts": "2.0.2",
"@types/argon2": "0.15.0",
"@types/bcrypt": "5.0.0",
"@types/cookie": "0.5.1",
"@types/cookie-parser": "1.4.3",
"@types/express": "4.17.14",
"@types/jest": "29.4.0",
"@types/luxon": "3.2.0",
"@types/node": "18.11.10",
"@types/nodemailer": "6.4.7",
"@types/passport-github2": "1.2.5",
"@types/passport-google-oauth20": "2.0.11",
"@types/passport-jwt": "3.0.8",
"@types/passport-microsoft": "0.0.0",
"@types/supertest": "2.0.12",
"@typescript-eslint/eslint-plugin": "5.45.0",
"@typescript-eslint/parser": "5.45.0",
"cross-env": "7.0.3",
"eslint": "8.29.0",
"eslint-config-prettier": "8.5.0",
"eslint-plugin-prettier": "4.2.1",
"jest": "29.4.1",
"jest-mock-extended": "3.0.1",
"@nestjs/cli": "^10.1.18",
"@nestjs/schematics": "^10.0.2",
"@nestjs/testing": "^10.2.6",
"@relmify/jest-fp-ts": "^2.0.2",
"@types/argon2": "^0.15.0",
"@types/bcrypt": "^5.0.0",
"@types/cookie": "^0.5.1",
"@types/cookie-parser": "^1.4.3",
"@types/express": "^4.17.14",
"@types/jest": "^29.4.0",
"@types/luxon": "^3.2.0",
"@types/node": "^18.11.10",
"@types/nodemailer": "^6.4.7",
"@types/passport-github2": "^1.2.5",
"@types/passport-google-oauth20": "^2.0.11",
"@types/passport-jwt": "^3.0.8",
"@types/passport-microsoft": "^0.0.0",
"@types/supertest": "^2.0.12",
"@typescript-eslint/eslint-plugin": "^5.45.0",
"@typescript-eslint/parser": "^5.45.0",
"cross-env": "^7.0.3",
"eslint": "^8.29.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.2.1",
"jest": "^29.4.1",
"jest-mock-extended": "^3.0.1",
"jwt": "link:@types/nestjs/jwt",
"prettier": "2.8.4",
"source-map-support": "0.5.21",
"supertest": "6.3.2",
"prettier": "^2.8.4",
"source-map-support": "^0.5.21",
"supertest": "^6.3.2",
"ts-jest": "29.0.5",
"ts-loader": "9.4.2",
"ts-node": "10.9.1",
"ts-loader": "^9.4.2",
"ts-node": "^10.9.1",
"tsconfig-paths": "4.1.1",
"typescript": "4.9.3"
"typescript": "^4.9.3"
},
"jest": {
"moduleFileExtensions": [
@@ -121,4 +121,4 @@
"^src/(.*)$": "<rootDir>/$1"
}
}
}
}

View File

@@ -1125,7 +1125,7 @@ export class TeamCollectionService {
id: searchResults[i].id,
path: !fetchedParentTree
? []
: (fetchedParentTree.right as CollectionSearchNode[]),
: ([fetchedParentTree.right] as CollectionSearchNode[]),
});
}
@@ -1151,8 +1151,8 @@ export class TeamCollectionService {
select id,title,'collection' AS type
from "TeamCollection"
where "TeamCollection"."teamID"=${teamID}
and titlesearch @@ plainto_tsquery(${searchQuery})
order by ts_rank(titlesearch,plainto_tsquery(${searchQuery}))
and titlesearch @@ to_tsquery(${searchQuery})
order by ts_rank(titlesearch,to_tsquery(${searchQuery}))
limit ${take}
OFFSET ${skip === 0 ? 0 : (skip - 1) * take};
`;
@@ -1183,8 +1183,8 @@ export class TeamCollectionService {
select id,title,request->>'method' as method,'request' AS type
from "TeamRequest"
where "TeamRequest"."teamID"=${teamID}
and titlesearch @@ plainto_tsquery(${searchQuery})
order by ts_rank(titlesearch,plainto_tsquery(${searchQuery}))
and titlesearch @@ to_tsquery(${searchQuery})
order by ts_rank(titlesearch,to_tsquery(${searchQuery}))
limit ${take}
OFFSET ${skip === 0 ? 0 : (skip - 1) * take};
`;
@@ -1250,53 +1250,45 @@ export class TeamCollectionService {
* @returns The parent tree of the parent collections
*/
private generateParentTree(parentCollections: ParentTreeQueryReturnType[]) {
function findChildren(id: string): CollectionSearchNode[] {
function findChildren(id) {
const collection = parentCollections.filter((item) => item.id === id)[0];
if (collection.parentID == null) {
return <CollectionSearchNode[]>[
{
id: collection.id,
title: collection.title,
type: 'collection' as const,
path: [],
},
];
}
const res = <CollectionSearchNode[]>[
{
return {
id: collection.id,
title: collection.title,
type: 'collection' as const,
path: findChildren(collection.parentID),
},
];
type: 'collection',
path: [],
};
}
const res = {
id: collection.id,
title: collection.title,
type: 'collection',
path: findChildren(collection.parentID),
};
return res;
}
if (parentCollections.length > 0) {
if (parentCollections[0].parentID == null) {
return <CollectionSearchNode[]>[
{
id: parentCollections[0].id,
title: parentCollections[0].title,
type: 'collection',
path: [],
},
];
}
return <CollectionSearchNode[]>[
{
return {
id: parentCollections[0].id,
title: parentCollections[0].title,
type: 'collection',
path: findChildren(parentCollections[0].parentID),
},
];
path: [],
};
}
return {
id: parentCollections[0].id,
title: parentCollections[0].title,
type: 'collection',
path: findChildren(parentCollections[0].parentID),
};
}
return <CollectionSearchNode[]>[];
return null;
}
/**

View File

@@ -1,6 +1,6 @@
{
"name": "@hoppscotch/cli",
"version": "0.7.0",
"version": "0.6.0",
"description": "A CLI to run Hoppscotch test scripts in CI environments.",
"homepage": "https://hoppscotch.io",
"type": "module",
@@ -41,28 +41,30 @@
"license": "MIT",
"private": false,
"dependencies": {
"axios": "1.6.7",
"chalk": "5.3.0",
"commander": "11.1.0",
"lodash-es": "4.17.21",
"qs": "6.11.2",
"verzod": "0.2.2",
"zod": "3.22.4"
"axios": "^1.6.6",
"chalk": "^5.3.0",
"commander": "^11.1.0",
"lodash-es": "^4.17.21",
"qs": "^6.11.2",
"zod": "^3.22.4"
},
"devDependencies": {
"@hoppscotch/data": "workspace:^",
"@hoppscotch/js-sandbox": "workspace:^",
"@relmify/jest-fp-ts": "2.1.1",
"@swc/core": "1.4.2",
"@types/jest": "29.5.12",
"@types/lodash-es": "4.17.12",
"@types/qs": "6.9.12",
"fp-ts": "2.16.2",
"jest": "29.7.0",
"prettier": "3.2.5",
"qs": "6.11.2",
"ts-jest": "29.1.2",
"tsup": "8.0.2",
"typescript": "5.3.3"
"@relmify/jest-fp-ts": "^2.1.1",
"@swc/core": "^1.3.105",
"@types/jest": "^29.5.11",
"@types/lodash-es": "^4.17.12",
"@types/qs": "^6.9.11",
"fp-ts": "^2.16.2",
"jest": "^29.7.0",
"lodash": "^4.17.21",
"prettier": "^3.2.4",
"qs": "^6.11.2",
"ts-jest": "^29.1.2",
"tsup": "^8.0.1",
"typescript": "^5.3.3",
"verzod": "^0.2.2",
"zod": "^3.22.4"
}
}
}

View File

@@ -154,7 +154,7 @@
"invalid_name": "Please provide a name for the collection",
"invalid_root_move": "Collection already in the root",
"moved": "Moved Successfully",
"my_collections": "Personal Collections",
"my_collections": "My Collections",
"name": "My New Collection",
"name_length_insufficient": "Collection name should be at least 3 characters long",
"new": "New Collection",
@@ -166,12 +166,14 @@
"save_as": "Save as",
"save_to_collection": "Save to Collection",
"select": "Select a Collection",
"select_location": "Select location"
"select_location": "Select location",
"select_team": "Select a team",
"team_collections": "Team Collections"
},
"confirm": {
"close_unsaved_tab": "Are you sure you want to close this tab?",
"close_unsaved_tabs": "Are you sure you want to close all tabs? {count} unsaved tabs will be lost.",
"exit_team": "Are you sure you want to leave this workspace?",
"exit_team": "Are you sure you want to leave this team?",
"logout": "Are you sure you want to logout?",
"remove_collection": "Are you sure you want to permanently delete this collection?",
"remove_environment": "Are you sure you want to permanently delete this environment?",
@@ -179,7 +181,7 @@
"remove_history": "Are you sure you want to permanently delete all history?",
"remove_request": "Are you sure you want to permanently delete this request?",
"remove_shared_request": "Are you sure you want to permanently delete this shared request?",
"remove_team": "Are you sure you want to delete this workspace?",
"remove_team": "Are you sure you want to delete this team?",
"remove_telemetry": "Are you sure you want to opt-out of Telemetry?",
"request_change": "Are you sure you want to discard current request, unsaved changes will be lost.",
"save_unsaved_tab": "Do you want to save changes made in this tab?",
@@ -232,9 +234,9 @@
"headers": "This request does not have any headers",
"history": "History is empty",
"invites": "Invite list is empty",
"members": "Workspace is empty",
"members": "Team is empty",
"parameters": "This request does not have any parameters",
"pending_invites": "There are no pending invites for this workspace",
"pending_invites": "There are no pending invites for this team",
"profile": "Login to view your profile",
"protocols": "Protocols are empty",
"request_variables": "This request does not have any request variables",
@@ -243,8 +245,8 @@
"shared_requests": "Shared requests are empty",
"shared_requests_logout": "Login to view your shared requests or create a new one",
"subscription": "Subscriptions are empty",
"team_name": "Workspace name empty",
"teams": "You don't belong to any workspaces",
"team_name": "Team name empty",
"teams": "You don't belong to any teams",
"tests": "There are no tests for this request"
},
"environment": {
@@ -261,7 +263,7 @@
"import_or_create": "Import or create a environment",
"invalid_name": "Please provide a name for the environment",
"list": "Environment variables",
"my_environments": "Personal Environments",
"my_environments": "My Environments",
"name": "Name",
"nested_overflow": "nested environment variables are limited to 10 levels",
"new": "New Environment",
@@ -276,7 +278,7 @@
"select": "Select environment",
"set": "Set environment",
"set_as_environment": "Set as environment",
"team_environments": "Workspace Environments",
"team_environments": "Team Environments",
"title": "Environments",
"updated": "Environment updated",
"value": "Value",
@@ -291,8 +293,8 @@
"check_how_to_add_origin": "Check how you can add an origin",
"curl_invalid_format": "cURL is not formatted properly",
"danger_zone": "Danger zone",
"delete_account": "Your account is currently an owner in these workspaces:",
"delete_account_description": "You must either remove yourself, transfer ownership, or delete these workspaces before you can delete your account.",
"delete_account": "Your account is currently an owner in these teams:",
"delete_account_description": "You must either remove yourself, transfer ownership, or delete these teams before you can delete your account.",
"empty_req_name": "Empty Request Name",
"f12_details": "(F12 for details)",
"gql_prettify_invalid_query": "Couldn't prettify an invalid query, solve query syntax errors and try again",
@@ -394,8 +396,8 @@
"from_insomnia_description": "Import from Insomnia collection",
"from_json": "Import from Hoppscotch",
"from_json_description": "Import from Hoppscotch collection file",
"from_my_collections": "Import from Personal Collections",
"from_my_collections_description": "Import from Personal Collections file",
"from_my_collections": "Import from My Collections",
"from_my_collections_description": "Import from My Collections file",
"from_openapi": "Import from OpenAPI",
"from_openapi_description": "Import from OpenAPI specification file (YML/JSON)",
"from_postman": "Import from Postman",
@@ -512,7 +514,7 @@
"email_verification_mail": "A verification email has been sent to your email address. Please click on the link to verify your email address.",
"no_permission": "You do not have permission to perform this action.",
"owner": "Owner",
"owner_description": "Owners can add, edit, and delete requests, collections and workspace members.",
"owner_description": "Owners can add, edit, and delete requests, collections and team members.",
"roles": "Roles",
"roles_description": "Roles are used to control access to the shared collections.",
"updated": "Profile updated",
@@ -817,12 +819,12 @@
"title": "Tabs"
},
"workspace": {
"delete": "Delete current workspace",
"edit": "Edit current workspace",
"invite": "Invite people to workspace",
"new": "Create new workspace",
"delete": "Delete current team",
"edit": "Edit current team",
"invite": "Invite people to team",
"new": "Create new team",
"switch_to_personal": "Switch to your personal workspace",
"title": "Workspaces"
"title": "Teams"
}
},
"sse": {
@@ -879,6 +881,7 @@
"forum": "Ask questions and get answers",
"github": "Follow us on Github",
"shortcuts": "Browse app faster",
"team": "Get in touch with the team",
"title": "Support",
"twitter": "Follow us on Twitter"
},
@@ -909,59 +912,60 @@
"websocket": "WebSocket"
},
"team": {
"already_member": "You are already a member of this workspace. Contact your workspace owner.",
"create_new": "Create new workspace",
"deleted": "Workspace deleted",
"edit": "Edit Workspace",
"already_member": "You are already a member of this team. Contact your team owner.",
"create_new": "Create new team",
"deleted": "Team deleted",
"edit": "Edit Team",
"email": "E-mail",
"email_do_not_match": "Email doesn't match with your account details. Contact your workspace owner.",
"exit": "Exit Workspace",
"exit_disabled": "Only owner cannot exit the workspace",
"email_do_not_match": "Email doesn't match with your account details. Contact your team owner.",
"exit": "Exit Team",
"exit_disabled": "Only owner cannot exit the team",
"failed_invites": "Failed invites",
"invalid_coll_id": "Invalid collection ID",
"invalid_email_format": "Email format is invalid",
"invalid_id": "Invalid workspace ID. Contact your workspace owner.",
"invalid_id": "Invalid team ID. Contact your team owner.",
"invalid_invite_link": "Invalid invite link",
"invalid_invite_link_description": "The link you followed is invalid. Contact your workspace owner.",
"invalid_member_permission": "Please provide a valid permission to the workspace member",
"invalid_invite_link_description": "The link you followed is invalid. Contact your team owner.",
"invalid_member_permission": "Please provide a valid permission to the team member",
"invite": "Invite",
"invite_more": "Invite more",
"invite_tooltip": "Invite people to this workspace",
"invited_to_team": "{owner} invited you to join {workspace}",
"invited_to_team": "{owner} invited you to join {team}",
"join": "Invitation accepted",
"join_team": "Join {workspace}",
"joined_team": "You have joined {workspace}",
"joined_team_description": "You are now a member of this workspace",
"left": "You left the workspace",
"join_beta": "Join the beta program to access teams.",
"join_team": "Join {team}",
"joined_team": "You have joined {team}",
"joined_team_description": "You are now a member of this team",
"left": "You left the team",
"login_to_continue": "Login to continue",
"login_to_continue_description": "You need to be logged in to join a workspace.",
"login_to_continue_description": "You need to be logged in to join a team.",
"logout_and_try_again": "Logout and sign in with another account",
"member_has_invite": "This email ID already has an invite. Contact your workspace owner.",
"member_not_found": "Member not found. Contact your workspace owner.",
"member_has_invite": "This email ID already has an invite. Contact your team owner.",
"member_not_found": "Member not found. Contact your team owner.",
"member_removed": "User removed",
"member_role_updated": "User roles updated",
"members": "Members",
"more_members": "+{count} more",
"name_length_insufficient": "Workspace name should be at least 6 characters long",
"name_updated": "Workspace name updated",
"new": "New Workspace",
"new_created": "New workspace created",
"new_name": "My New Workspace",
"no_access": "You do not have edit access to this workspace",
"no_invite_found": "Invitation not found. Contact your workspace owner.",
"name_length_insufficient": "Team name should be at least 6 characters long",
"name_updated": "Team name updated",
"new": "New Team",
"new_created": "New team created",
"new_name": "My New Team",
"no_access": "You do not have edit access to this team",
"no_invite_found": "Invitation not found. Contact your team owner.",
"no_request_found": "Request not found.",
"not_found": "Workspace not found. Contact your workspace owner.",
"not_valid_viewer": "You are not a valid viewer. Contact your workspace owner.",
"not_found": "Team not found. Contact your team owner.",
"not_valid_viewer": "You are not a valid viewer. Contact your team owner.",
"parent_coll_move": "Cannot move collection to a child collection",
"pending_invites": "Pending invites",
"permissions": "Permissions",
"same_target_destination": "Same target and destination",
"saved": "Workspace saved",
"select_a_team": "Select a workspace",
"saved": "Team saved",
"select_a_team": "Select a team",
"success_invites": "Success invites",
"title": "Workspaces",
"title": "Teams",
"we_sent_invite_link": "We sent an invite link to all invitees!",
"we_sent_invite_link_description": "Ask all invitees to check their inbox. Click on the link to join the workspace."
"we_sent_invite_link_description": "Ask all invitees to check their inbox. Click on the link to join the team."
},
"team_environment": {
"deleted": "Environment Deleted",
@@ -987,15 +991,8 @@
},
"workspace": {
"change": "Change workspace",
"personal": "Personal Workspace",
"personal_workspace": "{name}'s Workspace",
"other_workspaces": "My Workspaces",
"team": "Workspace",
"personal": "My Workspace",
"team": "Team Workspace",
"title": "Workspaces"
},
"site_protection": {
"login_to_continue": "Login to continue",
"login_to_continue_description": "You need to be logged in to access this Hoppscotch Enterprise Instance.",
"error_fetching_site_protection_status": "Something Went Wrong While Fetching Site Protection Status"
}
}

View File

@@ -1,7 +1,7 @@
{
"name": "@hoppscotch/common",
"private": true,
"version": "2024.3.0",
"version": "2023.12.6",
"scripts": {
"dev": "pnpm exec npm-run-all -p -l dev:*",
"test": "vitest --run",
@@ -21,147 +21,147 @@
"do-lintfix": "pnpm run lintfix"
},
"dependencies": {
"@apidevtools/swagger-parser": "10.1.0",
"@codemirror/autocomplete": "6.13.0",
"@codemirror/commands": "6.3.3",
"@codemirror/lang-javascript": "6.2.2",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-xml": "6.1.0",
"@codemirror/language": "6.10.1",
"@codemirror/legacy-modes": "6.3.3",
"@codemirror/lint": "6.5.0",
"@codemirror/search": "6.5.6",
"@codemirror/state": "6.4.1",
"@codemirror/view": "6.25.1",
"@apidevtools/swagger-parser": "^10.1.0",
"@codemirror/autocomplete": "^6.11.1",
"@codemirror/commands": "^6.3.2",
"@codemirror/lang-javascript": "^6.2.1",
"@codemirror/lang-json": "^6.0.1",
"@codemirror/lang-xml": "^6.0.2",
"@codemirror/language": "6.9.3",
"@codemirror/legacy-modes": "^6.3.3",
"@codemirror/lint": "^6.4.2",
"@codemirror/search": "^6.5.5",
"@codemirror/state": "^6.3.3",
"@codemirror/view": "^6.22.3",
"@hoppscotch/codemirror-lang-graphql": "workspace:^",
"@hoppscotch/data": "workspace:^",
"@hoppscotch/js-sandbox": "workspace:^",
"@hoppscotch/ui": "0.1.0",
"@hoppscotch/vue-toasted": "0.1.0",
"@hoppscotch/ui": "^0.1.0",
"@hoppscotch/vue-toasted": "^0.1.0",
"@lezer/highlight": "1.2.0",
"@unhead/vue": "1.8.8",
"@urql/core": "4.2.0",
"@urql/devtools": "2.0.3",
"@urql/exchange-auth": "2.1.6",
"@urql/exchange-graphcache": "6.4.0",
"@vitejs/plugin-legacy": "4.1.1",
"@vueuse/core": "10.7.0",
"acorn-walk": "8.3.0",
"axios": "1.6.2",
"buffer": "6.0.3",
"cookie-es": "1.0.0",
"dioc": "1.0.1",
"esprima": "4.0.1",
"events": "3.3.0",
"fp-ts": "2.16.1",
"globalthis": "1.0.3",
"graphql": "16.8.1",
"graphql-language-service-interface": "2.10.2",
"graphql-tag": "2.12.6",
"httpsnippet": "3.0.1",
"insomnia-importers": "3.6.0",
"io-ts": "2.2.20",
"js-yaml": "4.1.0",
"jsonpath-plus": "7.2.0",
"lodash-es": "4.17.21",
"lossless-json": "3.0.2",
"minisearch": "6.3.0",
"nprogress": "0.2.0",
"paho-mqtt": "1.1.0",
"path": "0.12.7",
"postman-collection": "4.3.0",
"process": "0.11.10",
"qs": "6.11.2",
"quicktype-core": "23.0.79",
"rxjs": "7.8.1",
"set-cookie-parser": "2.6.0",
"set-cookie-parser-es": "1.0.5",
"socket.io-client-v2": "npm:socket.io-client@2.4.0",
"socket.io-client-v3": "npm:socket.io-client@3.1.3",
"socket.io-client-v4": "npm:socket.io-client@4.4.1",
"socketio-wildcard": "2.0.0",
"splitpanes": "3.1.5",
"stream-browserify": "3.0.0",
"subscriptions-transport-ws": "0.11.0",
"tern": "0.24.3",
"timers": "0.1.1",
"tippy.js": "6.3.7",
"url": "0.11.3",
"util": "0.12.5",
"uuid": "9.0.1",
"verzod": "0.2.2",
"vue": "3.3.9",
"vue-i18n": "9.8.0",
"vue-pdf-embed": "1.2.1",
"vue-router": "4.2.5",
"@unhead/vue": "^1.8.8",
"@urql/core": "^4.2.0",
"@urql/devtools": "^2.0.3",
"@urql/exchange-auth": "^2.1.6",
"@urql/exchange-graphcache": "^6.3.3",
"@vitejs/plugin-legacy": "^4.1.1",
"@vueuse/core": "^10.6.1",
"acorn-walk": "^8.3.0",
"axios": "^1.6.2",
"buffer": "^6.0.3",
"cookie-es": "^1.0.0",
"dioc": "^1.0.1",
"esprima": "^4.0.1",
"events": "^3.3.0",
"fp-ts": "^2.16.1",
"globalthis": "^1.0.3",
"graphql": "^16.8.1",
"graphql-language-service-interface": "^2.10.2",
"graphql-tag": "^2.12.6",
"httpsnippet": "^3.0.1",
"insomnia-importers": "^3.6.0",
"io-ts": "^2.2.20",
"js-yaml": "^4.1.0",
"jsonpath-plus": "^7.2.0",
"lodash-es": "^4.17.21",
"lossless-json": "^3.0.2",
"minisearch": "^6.3.0",
"nprogress": "^0.2.0",
"paho-mqtt": "^1.1.0",
"path": "^0.12.7",
"postman-collection": "^4.3.0",
"process": "^0.11.10",
"qs": "^6.11.2",
"quicktype-core": "^23.0.79",
"rxjs": "^7.8.1",
"set-cookie-parser": "^2.6.0",
"set-cookie-parser-es": "^1.0.5",
"socket.io-client-v2": "npm:socket.io-client@^2.4.0",
"socket.io-client-v3": "npm:socket.io-client@^3.1.3",
"socket.io-client-v4": "npm:socket.io-client@^4.4.1",
"socketio-wildcard": "^2.0.0",
"splitpanes": "^3.1.5",
"stream-browserify": "^3.0.0",
"subscriptions-transport-ws": "^0.11.0",
"tern": "^0.24.3",
"timers": "^0.1.1",
"tippy.js": "^6.3.7",
"url": "^0.11.3",
"util": "^0.12.5",
"uuid": "^9.0.1",
"verzod": "^0.2.0",
"vue": "^3.3.8",
"vue-i18n": "^9.7.1",
"vue-pdf-embed": "^1.2.1",
"vue-router": "^4.2.5",
"vue-tippy": "6.3.1",
"vuedraggable-es": "4.1.1",
"wonka": "6.3.4",
"workbox-window": "7.0.0",
"xml-formatter": "3.6.0",
"yargs-parser": "21.1.1",
"zod": "3.22.4"
"vuedraggable-es": "^4.1.1",
"wonka": "^6.3.4",
"workbox-window": "^7.0.0",
"xml-formatter": "^3.6.0",
"yargs-parser": "^21.1.1",
"zod": "^3.22.4"
},
"devDependencies": {
"@esbuild-plugins/node-globals-polyfill": "0.2.3",
"@esbuild-plugins/node-modules-polyfill": "0.2.2",
"@graphql-codegen/add": "5.0.0",
"@graphql-codegen/cli": "5.0.0",
"@graphql-codegen/typed-document-node": "5.0.1",
"@graphql-codegen/typescript": "4.0.1",
"@graphql-codegen/typescript-operations": "4.0.1",
"@graphql-codegen/typescript-urql-graphcache": "3.0.0",
"@graphql-codegen/urql-introspection": "3.0.0",
"@graphql-typed-document-node/core": "3.2.0",
"@iconify-json/lucide": "1.1.144",
"@intlify/vite-plugin-vue-i18n": "7.0.0",
"@relmify/jest-fp-ts": "2.1.1",
"@rushstack/eslint-patch": "1.6.0",
"@types/har-format": "1.2.15",
"@types/js-yaml": "4.0.9",
"@types/lodash-es": "4.17.12",
"@types/lossless-json": "1.0.4",
"@types/nprogress": "0.2.3",
"@types/paho-mqtt": "1.0.10",
"@types/postman-collection": "3.5.10",
"@types/splitpanes": "2.2.6",
"@types/uuid": "9.0.7",
"@types/yargs-parser": "21.0.3",
"@typescript-eslint/eslint-plugin": "6.13.2",
"@typescript-eslint/parser": "6.13.2",
"@vitejs/plugin-vue": "4.5.1",
"@vue/compiler-sfc": "3.3.10",
"@vue/eslint-config-typescript": "12.0.0",
"@vue/runtime-core": "3.3.10",
"autoprefixer": "10.4.16",
"cross-env": "7.0.3",
"dotenv": "16.3.1",
"eslint": "8.55.0",
"eslint-plugin-prettier": "5.0.1",
"eslint-plugin-vue": "9.19.2",
"glob": "10.3.10",
"npm-run-all": "4.1.5",
"openapi-types": "12.1.3",
"postcss": "8.4.31",
"prettier": "3.1.0",
"prettier-plugin-tailwindcss": "0.5.7",
"rollup-plugin-polyfill-node": "0.13.0",
"sass": "1.69.5",
"tailwindcss": "3.3.5",
"typescript": "5.3.2",
"unplugin-fonts": "1.1.1",
"unplugin-icons": "0.17.4",
"unplugin-vue-components": "0.25.2",
"vite": "4.5.0",
"vite-plugin-checker": "0.6.2",
"vite-plugin-fonts": "0.7.0",
"vite-plugin-html-config": "1.0.11",
"vite-plugin-inspect": "0.7.42",
"vite-plugin-pages": "0.31.0",
"vite-plugin-pages-sitemap": "1.6.1",
"vite-plugin-pwa": "0.17.3",
"vite-plugin-vue-layouts": "0.8.0",
"vitest": "0.34.6",
"vue-tsc": "1.8.24"
"@esbuild-plugins/node-globals-polyfill": "^0.2.3",
"@esbuild-plugins/node-modules-polyfill": "^0.2.2",
"@graphql-codegen/add": "^5.0.0",
"@graphql-codegen/cli": "^5.0.0",
"@graphql-codegen/typed-document-node": "^5.0.1",
"@graphql-codegen/typescript": "^4.0.1",
"@graphql-codegen/typescript-operations": "^4.0.1",
"@graphql-codegen/typescript-urql-graphcache": "^3.0.0",
"@graphql-codegen/urql-introspection": "^3.0.0",
"@graphql-typed-document-node/core": "^3.2.0",
"@iconify-json/lucide": "^1.1.141",
"@intlify/vite-plugin-vue-i18n": "^7.0.0",
"@relmify/jest-fp-ts": "^2.1.1",
"@rushstack/eslint-patch": "^1.6.0",
"@types/har-format": "^1.2.15",
"@types/js-yaml": "^4.0.9",
"@types/lodash-es": "^4.17.12",
"@types/lossless-json": "^1.0.4",
"@types/nprogress": "^0.2.3",
"@types/paho-mqtt": "^1.0.10",
"@types/postman-collection": "^3.5.10",
"@types/splitpanes": "^2.2.6",
"@types/uuid": "^9.0.7",
"@types/yargs-parser": "^21.0.3",
"@typescript-eslint/eslint-plugin": "^6.12.0",
"@typescript-eslint/parser": "^6.12.0",
"@vitejs/plugin-vue": "^4.5.0",
"@vue/compiler-sfc": "^3.3.8",
"@vue/eslint-config-typescript": "^12.0.0",
"@vue/runtime-core": "^3.3.8",
"autoprefixer": "^10.4.14",
"cross-env": "^7.0.3",
"dotenv": "^16.3.1",
"eslint": "^8.54.0",
"eslint-plugin-prettier": "^5.0.1",
"eslint-plugin-vue": "^9.18.1",
"glob": "^10.3.10",
"npm-run-all": "^4.1.5",
"openapi-types": "^12.1.3",
"postcss": "^8.4.23",
"prettier": "^3.1.0",
"prettier-plugin-tailwindcss": "^0.5.7",
"rollup-plugin-polyfill-node": "^0.13.0",
"sass": "^1.69.5",
"tailwindcss": "^3.3.2",
"typescript": "^5.3.2",
"unplugin-fonts": "^1.1.1",
"unplugin-icons": "^0.17.4",
"unplugin-vue-components": "^0.25.2",
"vite": "^4.5.0",
"vite-plugin-checker": "^0.6.2",
"vite-plugin-fonts": "^0.7.0",
"vite-plugin-html-config": "^1.0.11",
"vite-plugin-inspect": "^0.7.42",
"vite-plugin-pages": "^0.31.0",
"vite-plugin-pages-sitemap": "^1.6.1",
"vite-plugin-pwa": "^0.17.0",
"vite-plugin-vue-layouts": "^0.8.0",
"vitest": "^0.34.6",
"vue-tsc": "^1.8.22"
}
}
}

View File

@@ -1,11 +1,11 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// Generated by unplugin-vue-components
// generated by unplugin-vue-components
// We suggest you to commit this file into source control
// Read more: https://github.com/vuejs/core/pull/3399
import '@vue/runtime-core'
export {}
declare module 'vue' {
declare module '@vue/runtime-core' {
export interface GlobalComponents {
AppActionHandler: typeof import('./components/app/ActionHandler.vue')['default']
AppBanner: typeof import('./components/app/Banner.vue')['default']
@@ -145,7 +145,6 @@ declare module 'vue' {
IconLucideAlertTriangle: typeof import('~icons/lucide/alert-triangle')['default']
IconLucideArrowLeft: typeof import('~icons/lucide/arrow-left')['default']
IconLucideArrowUpRight: typeof import('~icons/lucide/arrow-up-right')['default']
IconLucideBrush: typeof import('~icons/lucide/brush')['default']
IconLucideCheckCircle: typeof import('~icons/lucide/check-circle')['default']
IconLucideChevronRight: typeof import('~icons/lucide/chevron-right')['default']
IconLucideGlobe: typeof import('~icons/lucide/globe')['default']
@@ -155,7 +154,6 @@ declare module 'vue' {
IconLucideLayers: typeof import('~icons/lucide/layers')['default']
IconLucideListEnd: typeof import('~icons/lucide/list-end')['default']
IconLucideMinus: typeof import('~icons/lucide/minus')['default']
IconLucideRss: typeof import('~icons/lucide/rss')['default']
IconLucideSearch: typeof import('~icons/lucide/search')['default']
IconLucideUsers: typeof import('~icons/lucide/users')['default']
IconLucideX: typeof import('~icons/lucide/x')['default']
@@ -211,4 +209,5 @@ declare module 'vue' {
WorkspaceCurrent: typeof import('./components/workspace/Current.vue')['default']
WorkspaceSelector: typeof import('./components/workspace/Selector.vue')['default']
}
}

View File

@@ -1,8 +1,8 @@
<template>
<div
ref="contextMenuRef"
class="fixed transform -translate-x-10 -translate-y-8 rounded border border-dividerDark bg-popover p-2 shadow-lg"
:style="`top: ${position.top}px; left: ${position.left}px; z-index: 100;`"
class="fixed translate-y-8 transform rounded border border-dividerDark bg-popover p-2 shadow-lg"
:style="`top: ${position.top}px; left: ${position.left}px; z-index: 1000;`"
>
<div v-if="contextMenuOptions" class="flex flex-col">
<div

View File

@@ -330,16 +330,11 @@ const myTeams = useReadonlyStream(teamListAdapter.teamList$, null)
const workspace = workspaceService.currentWorkspace
const workspaceName = computed(() => {
if (workspace.value.type === "personal") {
return currentUser.value?.displayName
? t("workspace.personal_workspace", {
name: currentUser.value.displayName,
})
: t("workspace.personal")
}
return workspace.value.teamName
})
const workspaceName = computed(() =>
workspace.value.type === "personal"
? t("workspace.personal")
: workspace.value.teamName
)
const refetchTeams = () => {
teamListAdapter.fetchList()

View File

@@ -417,9 +417,7 @@ function handleTextSelection() {
const { from, to } = selection
if (from === to) return
const text = view.value?.state.doc.sliceString(from, to)
const coords = view.value?.coordsAtPos(from)
const top = coords?.top ?? 0
const left = coords?.left ?? 0
const { top, left } = view.value?.coordsAtPos(from)
if (text) {
invokeAction("contextmenu.open", {
position: {
@@ -441,17 +439,16 @@ function handleTextSelection() {
}
}
// Debounce to prevent double click from selecting the word
const debouncedTextSelection = (time: number) =>
useDebounceFn(() => {
handleTextSelection()
}, time)
const initView = (el: any) => {
// Debounce to prevent double click from selecting the word
const debounceFn = useDebounceFn(() => {
handleTextSelection()
}, 140)
// Only add event listeners if context menu is enabled in the component
if (props.contextMenuEnabled) {
el.addEventListener("mouseup", debouncedTextSelection(140))
el.addEventListener("keyup", debouncedTextSelection(140))
el.addEventListener("mouseup", debounceFn)
el.addEventListener("keyup", debounceFn)
}
const extensions: Extension = getExtensions(props.readonly || isSecret.value)
@@ -501,8 +498,7 @@ const getExtensions = (readonly: boolean): Extension => {
},
scroll(event) {
if (event.target && props.contextMenuEnabled) {
// Debounce to make the performance better
debouncedTextSelection(30)()
handleTextSelection()
}
},
}),

View File

@@ -15,8 +15,6 @@ import { computed } from "vue"
import { useI18n } from "~/composables/i18n"
import { useService } from "dioc/vue"
import { WorkspaceService } from "~/services/workspace.service"
import { useReadonlyStream } from "~/composables/stream"
import { platform } from "~/platform"
const props = defineProps<{
section?: string
@@ -28,23 +26,14 @@ const t = useI18n()
const workspaceService = useService(WorkspaceService)
const workspace = workspaceService.currentWorkspace
const currentUser = useReadonlyStream(
platform.auth.getProbableUserStream(),
platform.auth.getProbableUser()
)
const currentWorkspace = computed(() => {
const personalWorkspaceName = currentUser.value?.displayName
? t("workspace.personal_workspace", { name: currentUser.value.displayName })
: t("workspace.personal")
if (props.isOnlyPersonal) {
return personalWorkspaceName
return `${t("workspace.personal")}`
}
if (workspace.value.type === "team") {
return teamWorkspaceName.value
}
return personalWorkspaceName
return `${t("workspace.personal")}`
})
const teamWorkspaceName = computed(() => {

View File

@@ -3,7 +3,7 @@
<div class="flex flex-col">
<div class="flex flex-col">
<HoppSmartItem
:label="personalWorkspaceName"
label="My Workspace"
:icon="IconUser"
:info-icon="workspace.type === 'personal' ? IconDone : undefined"
:active-info-icon="workspace.type === 'personal'"
@@ -36,7 +36,7 @@
class="sticky top-0 z-10 mb-2 flex items-center justify-between bg-popover py-2 pl-2"
>
<div class="flex items-center px-2 font-semibold text-secondaryLight">
{{ t("workspace.other_workspaces") }}
{{ t("team.title") }}
</div>
<HoppButtonSecondary
v-tippy="{ theme: 'tooltip' }"
@@ -96,12 +96,6 @@ const currentUser = useReadonlyStream(
platform.auth.getProbableUser()
)
const personalWorkspaceName = computed(() =>
currentUser.value?.displayName
? t("workspace.personal_workspace", { name: currentUser.value.displayName })
: t("workspace.personal")
)
const workspaceService = useService(WorkspaceService)
const teamListadapter = workspaceService.acquireTeamListAdapter(null)
const myTeams = useReadonlyStream(teamListadapter.teamList$, [])

View File

@@ -242,9 +242,7 @@ export function useCodemirror(
const { from, to } = selection
if (from === to) return
const text = view.value?.state.doc.sliceString(from, to)
const coords = view.value?.coordsAtPos(from)
const top = coords?.top ?? 0
const left = coords?.left ?? 0
const { top, left } = view.value?.coordsAtPos(from)
if (text?.trim()) {
invokeAction("contextmenu.open", {
position: {
@@ -265,12 +263,6 @@ export function useCodemirror(
}
}
// Debounce to prevent double click from selecting the word
const debouncedTextSelection = (time: number) =>
useDebounceFn(() => {
handleTextSelection()
}, time)
const initView = (el: any) => {
if (el) platform.ui?.onCodemirrorInstanceMount?.(el)
@@ -282,10 +274,15 @@ export function useCodemirror(
ViewPlugin.fromClass(
class {
update(update: ViewUpdate) {
// Debounce to prevent double click from selecting the word
const debounceFn = useDebounceFn(() => {
handleTextSelection()
}, 140)
// Only add event listeners if context menu is enabled in the editor
if (options.contextMenuEnabled) {
el.addEventListener("mouseup", debouncedTextSelection(140))
el.addEventListener("keyup", debouncedTextSelection(140))
el.addEventListener("mouseup", debounceFn)
el.addEventListener("keyup", debounceFn)
}
if (options.onUpdate) {
@@ -327,8 +324,7 @@ export function useCodemirror(
EditorView.domEventHandlers({
scroll(event) {
if (event.target && options.contextMenuEnabled) {
// Debounce to make the performance better
debouncedTextSelection(30)()
handleTextSelection()
}
},
}),

View File

@@ -17,7 +17,6 @@ import {
HoppCollection,
makeCollection,
HoppRESTRequestVariable,
HoppRESTRequest,
} from "@hoppscotch/data"
import { pipe, flow } from "fp-ts/function"
import * as A from "fp-ts/Array"
@@ -26,7 +25,6 @@ import * as O from "fp-ts/Option"
import * as TE from "fp-ts/TaskEither"
import * as RA from "fp-ts/ReadonlyArray"
import { IMPORTER_INVALID_FILE_FORMAT } from "."
import { cloneDeep } from "lodash-es"
export const OPENAPI_DEREF_ERROR = "openapi/deref_error" as const
@@ -582,42 +580,30 @@ const convertPathToHoppReqs = (
? openAPIUrl + openAPIPath.slice(1)
: openAPIUrl + openAPIPath
const res: {
request: HoppRESTRequest
metadata: {
tags: string[]
}
} = {
request: makeRESTRequest({
name: info.operationId ?? info.summary ?? "Untitled Request",
method: method.toUpperCase(),
endpoint,
return makeRESTRequest({
name: info.operationId ?? info.summary ?? "Untitled Request",
method: method.toUpperCase(),
endpoint,
// We don't need to worry about reference types as the Dereferencing pass should remove them
params: parseOpenAPIParams(
(info.parameters as OpenAPIParamsType[] | undefined) ?? []
),
headers: parseOpenAPIHeaders(
(info.parameters as OpenAPIParamsType[] | undefined) ?? []
),
// We don't need to worry about reference types as the Dereferencing pass should remove them
params: parseOpenAPIParams(
(info.parameters as OpenAPIParamsType[] | undefined) ?? []
),
headers: parseOpenAPIHeaders(
(info.parameters as OpenAPIParamsType[] | undefined) ?? []
),
auth: parseOpenAPIAuth(doc, info),
auth: parseOpenAPIAuth(doc, info),
body: parseOpenAPIBody(doc, info),
body: parseOpenAPIBody(doc, info),
preRequestScript: "",
testScript: "",
preRequestScript: "",
testScript: "",
requestVariables: parseOpenAPIVariables(
(info.parameters as OpenAPIParamsType[] | undefined) ?? []
),
}),
metadata: {
tags: info.tags ?? [],
},
}
return res
requestVariables: parseOpenAPIVariables(
(info.parameters as OpenAPIParamsType[] | undefined) ?? []
),
})
}),
// Disable Readonly
@@ -636,38 +622,10 @@ const convertOpenApiDocsToHopp = (
)
.flat()
const requestsByTags: Record<string, Array<HoppRESTRequest>> = {}
const requestsWithoutTags: Array<HoppRESTRequest> = []
paths.forEach(({ metadata, request }) => {
const tags = metadata.tags
if (tags.length === 0) {
requestsWithoutTags.push(request)
return
}
for (const tag of tags) {
if (!requestsByTags[tag]) {
requestsByTags[tag] = []
}
requestsByTags[tag].push(cloneDeep(request))
}
})
return makeCollection({
name,
folders: Object.entries(requestsByTags).map(([name, paths]) =>
makeCollection({
name,
requests: paths,
folders: [],
auth: { authType: "inherit", authActive: true },
headers: [],
})
),
requests: requestsWithoutTags,
folders: [],
requests: paths,
auth: { authType: "inherit", authActive: true },
headers: [],
})

View File

@@ -34,7 +34,7 @@ export type HoppModule = {
to: RouteLocationNormalized,
from: RouteLocationNormalized,
router: Router
) => void | Promise<void>
) => void
/**
* Called by the router to tell all the modules that a route navigation has completed

View File

@@ -47,21 +47,15 @@ export default <HoppModule>{
routes,
})
router.beforeEach(async (to, from) => {
router.beforeEach((to, from) => {
_isLoadingInitialRoute.value = isInitialRoute(from)
const onBeforeRouteChangePromises: Promise<any>[] = []
HOPP_MODULES.forEach((mod) => {
const res = mod.onBeforeRouteChange?.(to, from, router)
if (res) onBeforeRouteChangePromises.push(res)
mod.onBeforeRouteChange?.(to, from, router)
})
platform.addedHoppModules?.forEach((mod) => {
const res = mod.onBeforeRouteChange?.(to, from, router)
if (res) onBeforeRouteChangePromises.push(res)
mod.onBeforeRouteChange?.(to, from, router)
})
await Promise.all(onBeforeRouteChangePromises)
})
// Instead of this a better architecture is for the router

View File

@@ -44,5 +44,4 @@ export default defineComponent({
<route lang="yaml">
meta:
layout: empty
onlyGuest: true
</route>

View File

@@ -71,7 +71,7 @@
<h1 class="heading">
{{
t("team.join_team", {
workspace: inviteDetails.data.right.teamInvitation.team.name,
team: inviteDetails.data.right.teamInvitation.team.name,
})
}}
</h1>
@@ -81,7 +81,7 @@
owner:
inviteDetails.data.right.teamInvitation.creator.displayName ??
inviteDetails.data.right.teamInvitation.creator.email,
workspace: inviteDetails.data.right.teamInvitation.team.name,
team: inviteDetails.data.right.teamInvitation.team.name,
})
}}
</p>
@@ -89,7 +89,7 @@
<HoppButtonPrimary
:label="
t('team.join_team', {
workspace: inviteDetails.data.right.teamInvitation.team.name,
team: inviteDetails.data.right.teamInvitation.team.name,
})
"
:loading="loading"
@@ -109,14 +109,14 @@
<h1 class="heading">
{{
t("team.joined_team", {
workspace: inviteDetails.data.right.teamInvitation.team.name,
team: inviteDetails.data.right.teamInvitation.team.name,
})
}}
</h1>
<p class="mt-2 text-secondaryLight">
{{
t("team.joined_team_description", {
workspace: inviteDetails.data.right.teamInvitation.team.name,
team: inviteDetails.data.right.teamInvitation.team.name,
})
}}
</p>

View File

@@ -34,16 +34,16 @@
},
"homepage": "https://github.com/hoppscotch/hoppscotch#readme",
"devDependencies": {
"@types/lodash": "4.14.200",
"typescript": "5.2.2",
"vite": "4.5.0"
"@types/lodash": "^4.14.200",
"typescript": "^5.2.2",
"vite": "^4.5.0"
},
"dependencies": {
"fp-ts": "2.16.1",
"io-ts": "2.2.20",
"lodash": "4.17.21",
"parser-ts": "0.7.0",
"verzod": "0.2.2",
"zod": "3.22.4"
"fp-ts": "^2.16.1",
"io-ts": "^2.2.20",
"lodash": "^4.17.21",
"parser-ts": "^0.7.0",
"verzod": "^0.2.2",
"zod": "^3.22.4"
}
}
}

View File

@@ -52,27 +52,27 @@
"license": "MIT",
"dependencies": {
"@hoppscotch/data": "workspace:^",
"@types/lodash-es": "4.17.12",
"fp-ts": "2.12.1",
"lodash": "4.17.21",
"lodash-es": "4.17.21"
"@types/lodash-es": "^4.17.12",
"fp-ts": "^2.11.10",
"lodash": "^4.17.21",
"lodash-es": "^4.17.21"
},
"devDependencies": {
"@digitak/esrun": "3.2.8",
"@relmify/jest-fp-ts": "2.0.2",
"@types/jest": "27.5.2",
"@types/lodash": "4.14.182",
"@types/node": "17.0.45",
"@typescript-eslint/eslint-plugin": "5.30.6",
"@typescript-eslint/parser": "5.30.6",
"eslint": "8.19.0",
"eslint-config-prettier": "8.6.0",
"eslint-plugin-prettier": "4.2.1",
"io-ts": "2.2.16",
"jest": "27.5.1",
"prettier": "2.8.4",
"ts-jest": "27.1.5",
"typescript": "4.9.5",
"vite": "5.0.5"
"@digitak/esrun": "^3.1.2",
"@relmify/jest-fp-ts": "^2.0.1",
"@types/jest": "^27.4.1",
"@types/lodash": "^4.14.181",
"@types/node": "^17.0.24",
"@typescript-eslint/eslint-plugin": "^5.19.0",
"@typescript-eslint/parser": "^5.19.0",
"eslint": "^8.13.0",
"eslint-config-prettier": "^8.6.0",
"eslint-plugin-prettier": "^4.2.1",
"io-ts": "^2.2.16",
"jest": "^27.5.1",
"prettier": "^2.8.4",
"ts-jest": "^27.1.4",
"typescript": "^4.6.3",
"vite": "^5.0.4"
}
}
}

View File

@@ -1,7 +1,7 @@
{
"name": "@hoppscotch/selfhost-desktop",
"private": true,
"version": "2024.3.0",
"version": "2023.12.6",
"type": "module",
"scripts": {
"dev:vite": "vite",
@@ -13,69 +13,69 @@
"gql-codegen": "graphql-codegen --require dotenv/config --config gql-codegen.yml dotenv_config_path=\"../../.env\""
},
"dependencies": {
"@fontsource-variable/inter": "5.0.15",
"@fontsource-variable/material-symbols-rounded": "5.0.16",
"@fontsource-variable/roboto-mono": "5.0.16",
"@fontsource-variable/inter": "^5.0.5",
"@fontsource-variable/material-symbols-rounded": "^5.0.5",
"@fontsource-variable/roboto-mono": "^5.0.6",
"@hoppscotch/common": "workspace:^",
"@platform/auth": "0.1.106",
"@tauri-apps/api": "1.5.1",
"@tauri-apps/cli": "1.5.6",
"@vueuse/core": "10.5.0",
"axios": "0.21.4",
"buffer": "6.0.3",
"dioc": "1.0.1",
"@platform/auth": "^0.1.106",
"@tauri-apps/api": "^1.3.0",
"@tauri-apps/cli": "^1.3.0",
"@vueuse/core": "^10.4.1",
"axios": "^0.21.4",
"buffer": "^6.0.3",
"dioc": "^1.0.1",
"environments.api": "link:@platform/environments/environments.api",
"event": "link:@tauri-apps/api/event",
"fp-ts": "2.16.1",
"lodash-es": "4.17.21",
"process": "0.11.10",
"rxjs": "7.8.1",
"fp-ts": "^2.16.0",
"lodash-es": "^4.17.21",
"process": "^0.11.10",
"rxjs": "^7.8.1",
"shell": "link:@tauri-apps/api/shell",
"stream-browserify": "3.0.0",
"stream-browserify": "^3.0.0",
"tauri": "link:@tauri-apps/api/tauri",
"tauri-plugin-store-api": "0.0.0",
"util": "0.12.5",
"vue": "3.3.9",
"workbox-window": "6.6.0"
"tauri-plugin-store-api": "github:tauri-apps/tauri-plugin-store#v1",
"util": "^0.12.4",
"vue": "^3.2.45",
"workbox-window": "^6.5.4"
},
"devDependencies": {
"@graphql-codegen/add": "5.0.0",
"@graphql-codegen/cli": "5.0.0",
"@graphql-codegen/typed-document-node": "5.0.1",
"@graphql-codegen/typescript": "4.0.1",
"@graphql-codegen/typescript-operations": "4.0.1",
"@graphql-codegen/typescript-urql-graphcache": "2.4.5",
"@graphql-codegen/urql-introspection": "2.2.1",
"@graphql-typed-document-node/core": "3.2.0",
"@intlify/vite-plugin-vue-i18n": "6.0.1",
"@rushstack/eslint-patch": "1.3.3",
"@types/lodash-es": "4.17.10",
"@types/node": "18.18.8",
"@typescript-eslint/eslint-plugin": "5.62.0",
"@typescript-eslint/parser": "5.62.0",
"@vitejs/plugin-legacy": "2.3.0",
"@vitejs/plugin-vue": "4.3.1",
"@vue/eslint-config-typescript": "11.0.3",
"autoprefixer": "10.4.16",
"cross-env": "7.0.3",
"eslint": "8.47.0",
"eslint-plugin-prettier": "4.2.1",
"eslint-plugin-vue": "9.17.0",
"npm-run-all": "4.1.5",
"postcss": "8.4.32",
"tailwindcss": "3.3.6",
"typescript": "4.9.5",
"unplugin-fonts": "1.1.1",
"unplugin-icons": "0.14.9",
"unplugin-vue-components": "0.21.0",
"vite": "4.5.0",
"vite-plugin-html-config": "1.0.11",
"vite-plugin-inspect": "0.7.38",
"vite-plugin-pages": "0.26.0",
"vite-plugin-pages-sitemap": "1.6.1",
"vite-plugin-pwa": "0.13.1",
"vite-plugin-static-copy": "0.12.0",
"vite-plugin-vue-layouts": "0.7.0",
"vue-tsc": "1.8.8"
"@graphql-codegen/add": "^5.0.0",
"@graphql-codegen/cli": "^5.0.0",
"@graphql-codegen/typed-document-node": "^5.0.1",
"@graphql-codegen/typescript": "^4.0.1",
"@graphql-codegen/typescript-operations": "^4.0.1",
"@graphql-codegen/typescript-urql-graphcache": "^2.4.5",
"@graphql-codegen/urql-introspection": "^2.2.1",
"@graphql-typed-document-node/core": "^3.2.0",
"@intlify/vite-plugin-vue-i18n": "^6.0.1",
"@rushstack/eslint-patch": "^1.1.4",
"@types/lodash-es": "^4.17.9",
"@types/node": "^18.7.10",
"@typescript-eslint/eslint-plugin": "^5.19.0",
"@typescript-eslint/parser": "^5.19.0",
"@vitejs/plugin-legacy": "^2.3.0",
"@vitejs/plugin-vue": "^4.0.0",
"@vue/eslint-config-typescript": "^11.0.1",
"autoprefixer": "^10.4.14",
"cross-env": "^7.0.3",
"eslint": "^8.28.0",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-vue": "^9.5.1",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.23",
"tailwindcss": "^3.3.6",
"typescript": "^4.9.5",
"unplugin-fonts": "^1.1.1",
"unplugin-icons": "^0.14.9",
"unplugin-vue-components": "^0.21.0",
"vite": "^4.2.1",
"vite-plugin-html-config": "^1.0.10",
"vite-plugin-inspect": "^0.7.4",
"vite-plugin-pages": "^0.26.0",
"vite-plugin-pages-sitemap": "^1.4.0",
"vite-plugin-pwa": "^0.13.1",
"vite-plugin-static-copy": "^0.12.0",
"vite-plugin-vue-layouts": "^0.7.0",
"vue-tsc": "^1.0.11"
}
}
}

View File

@@ -1260,7 +1260,7 @@ dependencies = [
[[package]]
name = "hoppscotch-desktop"
version = "24.3.0"
version = "23.12.6"
dependencies = [
"cocoa 0.25.0",
"hex_color",

View File

@@ -1,6 +1,6 @@
[package]
name = "hoppscotch-desktop"
version = "24.3.0"
version = "23.12.6"
description = "A Tauri App"
authors = ["you"]
license = ""

View File

@@ -8,7 +8,7 @@
},
"package": {
"productName": "Hoppscotch",
"version": "24.3.0"
"version": "23.12.6"
},
"tauri": {
"allowlist": {

View File

@@ -1,7 +1,7 @@
{
"name": "@hoppscotch/selfhost-web",
"private": true,
"version": "2024.3.0",
"version": "2023.12.6",
"type": "module",
"scripts": {
"dev:vite": "vite",
@@ -23,62 +23,62 @@
"postinstall": "pnpm run gql-codegen"
},
"dependencies": {
"@fontsource-variable/inter": "5.0.15",
"@fontsource-variable/material-symbols-rounded": "5.0.16",
"@fontsource-variable/roboto-mono": "5.0.16",
"@fontsource-variable/inter": "^5.0.15",
"@fontsource-variable/material-symbols-rounded": "^5.0.16",
"@fontsource-variable/roboto-mono": "^5.0.16",
"@hoppscotch/common": "workspace:^",
"@hoppscotch/data": "workspace:^",
"@hoppscotch/ui": "0.1.0",
"@import-meta-env/unplugin": "0.4.10",
"axios": "1.6.2",
"buffer": "6.0.3",
"fp-ts": "2.16.1",
"process": "0.11.10",
"rxjs": "7.8.1",
"stream-browserify": "3.0.0",
"util": "0.12.5",
"vue": "3.3.9",
"workbox-window": "7.0.0",
"zod": "3.22.4"
"@hoppscotch/ui": "^0.1.0",
"@import-meta-env/unplugin": "^0.4.10",
"axios": "^1.6.2",
"buffer": "^6.0.3",
"fp-ts": "^2.16.1",
"process": "^0.11.10",
"rxjs": "^7.8.1",
"stream-browserify": "^3.0.0",
"util": "^0.12.5",
"vue": "^3.3.8",
"workbox-window": "^7.0.0",
"zod": "^3.22.4"
},
"devDependencies": {
"@graphql-codegen/add": "5.0.0",
"@graphql-codegen/cli": "5.0.0",
"@graphql-codegen/typed-document-node": "5.0.1",
"@graphql-codegen/typescript": "4.0.1",
"@graphql-codegen/typescript-operations": "4.0.1",
"@graphql-codegen/typescript-urql-graphcache": "3.0.0",
"@graphql-codegen/urql-introspection": "3.0.0",
"@graphql-typed-document-node/core": "3.2.0",
"@intlify/vite-plugin-vue-i18n": "7.0.0",
"@rushstack/eslint-patch": "1.6.0",
"@typescript-eslint/eslint-plugin": "6.13.2",
"@typescript-eslint/parser": "6.13.2",
"@vitejs/plugin-legacy": "4.1.1",
"@vitejs/plugin-vue": "4.5.1",
"@vue/eslint-config-typescript": "12.0.0",
"autoprefixer": "10.4.16",
"cross-env": "7.0.3",
"eslint": "8.55.0",
"eslint-plugin-prettier": "5.0.1",
"eslint-plugin-vue": "9.19.2",
"npm-run-all": "4.1.5",
"postcss": "8.4.31",
"prettier-plugin-tailwindcss": "0.5.7",
"tailwindcss": "3.3.5",
"typescript": "5.3.2",
"unplugin-fonts": "1.1.1",
"unplugin-icons": "0.17.4",
"unplugin-vue-components": "0.25.2",
"vite": "4.5.0",
"vite-plugin-fonts": "0.7.0",
"vite-plugin-html-config": "1.0.11",
"vite-plugin-inspect": "0.7.42",
"vite-plugin-pages": "0.31.0",
"vite-plugin-pages-sitemap": "1.6.1",
"vite-plugin-pwa": "0.17.3",
"vite-plugin-static-copy": "0.17.1",
"vite-plugin-vue-layouts": "0.8.0",
"vue-tsc": "1.8.24"
"@graphql-codegen/add": "^5.0.0",
"@graphql-codegen/cli": "^5.0.0",
"@graphql-codegen/typed-document-node": "^5.0.1",
"@graphql-codegen/typescript": "^4.0.1",
"@graphql-codegen/typescript-operations": "^4.0.1",
"@graphql-codegen/typescript-urql-graphcache": "^3.0.0",
"@graphql-codegen/urql-introspection": "^3.0.0",
"@graphql-typed-document-node/core": "^3.2.0",
"@intlify/vite-plugin-vue-i18n": "^7.0.0",
"@rushstack/eslint-patch": "^1.6.0",
"@typescript-eslint/eslint-plugin": "^6.12.0",
"@typescript-eslint/parser": "^6.12.0",
"@vitejs/plugin-legacy": "^4.1.1",
"@vitejs/plugin-vue": "^4.5.0",
"@vue/eslint-config-typescript": "^12.0.0",
"autoprefixer": "^10.4.14",
"cross-env": "^7.0.3",
"eslint": "^8.54.0",
"eslint-plugin-prettier": "^5.0.1",
"eslint-plugin-vue": "^9.18.1",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.23",
"prettier-plugin-tailwindcss": "^0.5.7",
"tailwindcss": "^3.3.2",
"typescript": "^5.3.2",
"unplugin-fonts": "^1.1.1",
"unplugin-icons": "^0.17.4",
"unplugin-vue-components": "^0.25.2",
"vite": "^4.5.0",
"vite-plugin-fonts": "^0.7.0",
"vite-plugin-html-config": "^1.0.11",
"vite-plugin-inspect": "^0.7.42",
"vite-plugin-pages": "^0.31.0",
"vite-plugin-pages-sitemap": "^1.6.1",
"vite-plugin-pwa": "^0.17.0",
"vite-plugin-static-copy": "^0.17.1",
"vite-plugin-vue-layouts": "^0.8.0",
"vue-tsc": "^1.8.22"
}
}
}

View File

@@ -10,12 +10,9 @@
},
"configs": {
"auth_providers": {
"callback_url": "CALLBACK URL",
"client_id": "CLIENT ID",
"client_secret": "CLIENT SECRET",
"description": "Configure authentication providers for your server",
"scope": "SCOPE",
"tenant": "TENANT",
"title": "Authentication Providers",
"update_failure": "Failed to update authentication provider configurations!!"
},

View File

@@ -1,7 +1,7 @@
{
"name": "hoppscotch-sh-admin",
"private": true,
"version": "2024.3.0",
"version": "2023.12.6",
"type": "module",
"scripts": {
"dev": "pnpm exec npm-run-all -p -l dev:*",
@@ -13,69 +13,69 @@
"preview": "vite preview"
},
"dependencies": {
"@fontsource-variable/inter": "5.0.5",
"@fontsource-variable/material-symbols-rounded": "5.0.5",
"@fontsource-variable/roboto-mono": "5.0.6",
"@graphql-typed-document-node/core": "3.1.1",
"@hoppscotch/ui": "0.1.0",
"@hoppscotch/vue-toasted": "0.1.0",
"@intlify/unplugin-vue-i18n": "1.2.0",
"@types/cors": "2.8.13",
"@types/express": "4.17.16",
"@urql/exchange-auth": "2.1.6",
"@urql/vue": "1.1.2",
"@vueuse/core": "9.12.0",
"axios": "0.21.4",
"cors": "2.8.5",
"date-fns": "2.29.3",
"express": "4.18.2",
"express-graphql": "0.12.0",
"fp-ts": "2.13.1",
"graphql": "16.6.0",
"io-ts": "2.2.16",
"lodash-es": "4.17.21",
"postcss": "8.4.31",
"prettier-plugin-tailwindcss": "0.5.7",
"rxjs": "7.8.0",
"tailwindcss": "3.3.5",
"tippy.js": "6.3.7",
"ts-node-dev": "2.0.0",
"unplugin-icons": "0.14.9",
"unplugin-vue-components": "0.21.0",
"vue": "3.3.9",
"vue-i18n": "9.2.2",
"vue-router": "4.1.0",
"@fontsource-variable/inter": "^5.0.5",
"@fontsource-variable/material-symbols-rounded": "^5.0.5",
"@fontsource-variable/roboto-mono": "^5.0.6",
"@graphql-typed-document-node/core": "^3.1.1",
"@hoppscotch/ui": "^0.1.0",
"@hoppscotch/vue-toasted": "^0.1.0",
"@intlify/unplugin-vue-i18n": "^1.2.0",
"@types/cors": "^2.8.13",
"@types/express": "^4.17.15",
"@urql/exchange-auth": "^2.1.6",
"@urql/vue": "^1.1.2",
"@vueuse/core": "^9.10.0",
"axios": "^0.21.4",
"cors": "^2.8.5",
"date-fns": "^2.29.3",
"express": "^4.18.2",
"express-graphql": "^0.12.0",
"fp-ts": "^2.13.1",
"graphql": "^16.6.0",
"io-ts": "^2.2.16",
"lodash-es": "^4.17.21",
"postcss": "^8.4.23",
"prettier-plugin-tailwindcss": "^0.5.6",
"rxjs": "^7.8.0",
"tailwindcss": "^3.3.5",
"tippy.js": "^6.3.7",
"ts-node-dev": "^2.0.0",
"unplugin-icons": "^0.14.9",
"unplugin-vue-components": "^0.21.0",
"vue": "^3.2.6",
"vue-i18n": "^9.2.2",
"vue-router": "4",
"vue-tippy": "6.0.0-alpha.58"
},
"devDependencies": {
"hoppscotch-backend": "workspace:^",
"@graphql-codegen/cli": "3.0.0",
"@graphql-codegen/client-preset": "2.1.0",
"@graphql-codegen/client-preset": "^2.0.0",
"@graphql-codegen/introspection": "3.0.0",
"@graphql-codegen/typed-document-node": "2.3.1",
"@graphql-codegen/typed-document-node": "^2.3.1",
"@graphql-codegen/typescript": "3.0.0",
"@graphql-codegen/typescript-document-nodes": "3.0.0",
"@graphql-codegen/typescript-operations": "3.0.0",
"@graphql-codegen/urql-introspection": "2.2.1",
"@import-meta-env/cli": "0.6.3",
"@import-meta-env/unplugin": "0.4.8",
"@types/lodash-es": "4.17.12",
"@vitejs/plugin-vue": "3.2.0",
"@vue/compiler-sfc": "3.2.45",
"dotenv": "16.3.1",
"graphql-tag": "2.12.6",
"npm-run-all": "4.1.5",
"sass": "1.58.0",
"ts-node": "10.9.1",
"typescript": "4.9.3",
"unplugin-fonts": "1.0.3",
"vite": "3.2.4",
"vite-plugin-pages": "0.26.0",
"vite-plugin-vue-layouts": "0.7.0",
"vue-tsc": "0.3.0"
"@import-meta-env/cli": "^0.6.3",
"@import-meta-env/unplugin": "^0.4.8",
"@types/lodash-es": "^4.17.12",
"@vitejs/plugin-vue": "^3.1.0",
"@vue/compiler-sfc": "^3.2.6",
"dotenv": "^16.0.3",
"graphql-tag": "^2.12.6",
"npm-run-all": "^4.1.5",
"sass": "^1.57.1",
"ts-node": "^10.9.1",
"typescript": "^4.9.3",
"unplugin-fonts": "^1.0.3",
"vite": "^3.1.4",
"vite-plugin-pages": "^0.26.0",
"vite-plugin-vue-layouts": "^0.7.0",
"vue-tsc": "^0.3.0"
},
"prettier": {
"singleQuote": true,
"semi": true
}
}
}

View File

@@ -17,19 +17,13 @@ declare module '@vue/runtime-core' {
HoppButtonPrimary: typeof import('@hoppscotch/ui')['HoppButtonPrimary']
HoppButtonSecondary: typeof import('@hoppscotch/ui')['HoppButtonSecondary']
HoppSmartAnchor: typeof import('@hoppscotch/ui')['HoppSmartAnchor']
HoppSmartAutoComplete: typeof import('@hoppscotch/ui')['HoppSmartAutoComplete']
HoppSmartConfirmModal: typeof import('@hoppscotch/ui')['HoppSmartConfirmModal']
HoppSmartInput: typeof import('@hoppscotch/ui')['HoppSmartInput']
HoppSmartItem: typeof import('@hoppscotch/ui')['HoppSmartItem']
HoppSmartLink: typeof import('@hoppscotch/ui')['HoppSmartLink']
HoppSmartModal: typeof import('@hoppscotch/ui')['HoppSmartModal']
HoppSmartPicture: typeof import('@hoppscotch/ui')['HoppSmartPicture']
HoppSmartSpinner: typeof import('@hoppscotch/ui')['HoppSmartSpinner']
HoppSmartTab: typeof import('@hoppscotch/ui')['HoppSmartTab']
HoppSmartTable: typeof import('@hoppscotch/ui')['HoppSmartTable']
HoppSmartTabs: typeof import('@hoppscotch/ui')['HoppSmartTabs']
HoppSmartToggle: typeof import('@hoppscotch/ui')['HoppSmartToggle']
IconLucideChevronDown: typeof import('~icons/lucide/chevron-down')['default']
IconLucideInbox: typeof import('~icons/lucide/inbox')['default']
SettingsAuthProvider: typeof import('./components/settings/AuthProvider.vue')['default']
SettingsConfigurations: typeof import('./components/settings/Configurations.vue')['default']

View File

@@ -35,29 +35,25 @@
:key="field.key"
class="mt-5"
>
<template
v-if="field.applicableProviders.includes(provider.name)"
>
<label>{{ field.name }}</label>
<span class="flex max-w-lg">
<HoppSmartInput
v-model="provider.fields[field.key as keyof typeof provider['fields']]"
:type="
isMasked(provider.name, field.key) ? 'password' : 'text'
"
:disabled="isMasked(provider.name, field.key)"
:autofocus="false"
class="!my-2 !bg-primaryLight flex-1"
/>
<HoppButtonSecondary
:icon="
isMasked(provider.name, field.key) ? IconEye : IconEyeOff
"
class="bg-primaryLight h-9 mt-2"
@click="toggleMask(provider.name, field.key)"
/>
</span>
</template>
<label>{{ field.name }}</label>
<span class="flex">
<HoppSmartInput
v-model="provider.fields[field.key]"
:type="
isMasked(provider.name, field.key) ? 'password' : 'text'
"
:disabled="isMasked(provider.name, field.key)"
:autofocus="false"
class="!my-2 !bg-primaryLight"
/>
<HoppButtonSecondary
:icon="
isMasked(provider.name, field.key) ? IconEye : IconEyeOff
"
class="bg-primaryLight h-9 mt-2"
@click="toggleMask(provider.name, field.key)"
/>
</span>
</div>
</div>
</div>
@@ -90,76 +86,47 @@ const workingConfigs = useVModel(props, 'config', emit);
const capitalize = (text: string) =>
text.charAt(0).toUpperCase() + text.slice(1);
// Union type for all possible field keys
type ProviderFieldKeys = keyof ProviderFields;
type ProviderFields = {
[Field in keyof Config['providers'][SsoAuthProviders]['fields']]: boolean;
} & Partial<{ tenant: boolean }>;
type ProviderFieldMetadata = {
// Masking sensitive fields
type Field = {
name: string;
key: ProviderFieldKeys;
applicableProviders: SsoAuthProviders[];
key: keyof Config['providers']['google' | 'github' | 'microsoft']['fields'];
};
const providerConfigFields = <ProviderFieldMetadata[]>[
{
name: t('configs.auth_providers.client_id'),
key: 'client_id',
applicableProviders: ['google', 'github', 'microsoft'],
},
{
name: t('configs.auth_providers.client_secret'),
key: 'client_secret',
applicableProviders: ['google', 'github', 'microsoft'],
},
{
name: t('configs.auth_providers.callback_url'),
key: 'callback_url',
applicableProviders: ['google', 'github', 'microsoft'],
},
{
name: t('configs.auth_providers.scope'),
key: 'scope',
applicableProviders: ['google', 'github', 'microsoft'],
},
{
name: t('configs.auth_providers.tenant'),
key: 'tenant',
applicableProviders: ['microsoft'],
},
];
const providerConfigFields = reactive<Field[]>([
{ name: t('configs.auth_providers.client_id'), key: 'client_id' },
{ name: t('configs.auth_providers.client_secret'), key: 'client_secret' },
]);
const maskState = reactive<Record<SsoAuthProviders, ProviderFields>>({
const maskState = reactive({
google: {
client_id: true,
client_secret: true,
callback_url: true,
scope: true,
},
github: {
client_id: true,
client_secret: true,
callback_url: true,
scope: true,
},
microsoft: {
client_id: true,
client_secret: true,
callback_url: true,
scope: true,
tenant: true,
},
});
const toggleMask = (
provider: SsoAuthProviders,
fieldKey: ProviderFieldKeys
fieldKey: keyof Config['providers'][
| 'google'
| 'github'
| 'microsoft']['fields']
) => {
maskState[provider][fieldKey] = !maskState[provider][fieldKey];
};
const isMasked = (provider: SsoAuthProviders, fieldKey: ProviderFieldKeys) =>
maskState[provider][fieldKey];
const isMasked = (
provider: SsoAuthProviders,
fieldKey: keyof Config['providers'][
| 'google'
| 'github'
| 'microsoft']['fields']
) => maskState[provider][fieldKey];
</script>

View File

@@ -33,13 +33,13 @@
class="mt-5"
>
<label>{{ field.name }}</label>
<span class="flex max-w-lg">
<span class="flex">
<HoppSmartInput
v-model="smtpConfigs.fields[field.key]"
:type="isMasked(field.key) ? 'password' : 'text'"
:disabled="isMasked(field.key)"
:autofocus="false"
class="!my-2 !bg-primaryLight flex-1"
class="!my-2 !bg-primaryLight"
/>
<HoppButtonSecondary
:icon="isMasked(field.key) ? IconEye : IconEyeOff"

View File

@@ -27,8 +27,6 @@ export type Config = {
fields: {
client_id: string;
client_secret: string;
callback_url: string;
scope: string;
};
};
github: {
@@ -37,8 +35,6 @@ export type Config = {
fields: {
client_id: string;
client_secret: string;
callback_url: string;
scope: string;
};
};
microsoft: {
@@ -47,9 +43,6 @@ export type Config = {
fields: {
client_id: string;
client_secret: string;
callback_url: string;
scope: string;
tenant: string;
};
};
};
@@ -93,17 +86,10 @@ export function useConfigHandler(updatedConfigs?: Config) {
configNames: [
'GOOGLE_CLIENT_ID',
'GOOGLE_CLIENT_SECRET',
'GOOGLE_CALLBACK_URL',
'GOOGLE_SCOPE',
'MICROSOFT_CLIENT_ID',
'MICROSOFT_CLIENT_SECRET',
'MICROSOFT_CALLBACK_URL',
'MICROSOFT_SCOPE',
'MICROSOFT_TENANT',
'GITHUB_CLIENT_ID',
'GITHUB_CLIENT_SECRET',
'GITHUB_CALLBACK_URL',
'GITHUB_SCOPE',
'MAILER_SMTP_URL',
'MAILER_ADDRESS_FROM',
'ALLOW_ANALYTICS_COLLECTION',
@@ -132,9 +118,6 @@ export function useConfigHandler(updatedConfigs?: Config) {
await fetchInfraConfigs();
await fetchAllowedAuthProviders();
const getFieldValue = (name: string) =>
infraConfigs.value.find((x) => x.name === name)?.value ?? '';
// Transforming the fetched data into a Configs object
currentConfigs.value = {
providers: {
@@ -142,31 +125,37 @@ export function useConfigHandler(updatedConfigs?: Config) {
name: 'google',
enabled: allowedAuthProviders.value.includes('GOOGLE'),
fields: {
client_id: getFieldValue('GOOGLE_CLIENT_ID'),
client_secret: getFieldValue('GOOGLE_CLIENT_SECRET'),
callback_url: getFieldValue('GOOGLE_CALLBACK_URL'),
scope: getFieldValue('GOOGLE_SCOPE'),
client_id:
infraConfigs.value.find((x) => x.name === 'GOOGLE_CLIENT_ID')
?.value ?? '',
client_secret:
infraConfigs.value.find((x) => x.name === 'GOOGLE_CLIENT_SECRET')
?.value ?? '',
},
},
github: {
name: 'github',
enabled: allowedAuthProviders.value.includes('GITHUB'),
fields: {
client_id: getFieldValue('GITHUB_CLIENT_ID'),
client_secret: getFieldValue('GITHUB_CLIENT_SECRET'),
callback_url: getFieldValue('GITHUB_CALLBACK_URL'),
scope: getFieldValue('GITHUB_SCOPE'),
client_id:
infraConfigs.value.find((x) => x.name === 'GITHUB_CLIENT_ID')
?.value ?? '',
client_secret:
infraConfigs.value.find((x) => x.name === 'GITHUB_CLIENT_SECRET')
?.value ?? '',
},
},
microsoft: {
name: 'microsoft',
enabled: allowedAuthProviders.value.includes('MICROSOFT'),
fields: {
client_id: getFieldValue('MICROSOFT_CLIENT_ID'),
client_secret: getFieldValue('MICROSOFT_CLIENT_SECRET'),
callback_url: getFieldValue('MICROSOFT_CALLBACK_URL'),
scope: getFieldValue('MICROSOFT_SCOPE'),
tenant: getFieldValue('MICROSOFT_TENANT'),
client_id:
infraConfigs.value.find((x) => x.name === 'MICROSOFT_CLIENT_ID')
?.value ?? '',
client_secret:
infraConfigs.value.find(
(x) => x.name === 'MICROSOFT_CLIENT_SECRET'
)?.value ?? '',
},
},
},
@@ -174,8 +163,12 @@ export function useConfigHandler(updatedConfigs?: Config) {
name: 'email',
enabled: allowedAuthProviders.value.includes('EMAIL'),
fields: {
mailer_smtp_url: getFieldValue('MAILER_SMTP_URL'),
mailer_from_address: getFieldValue('MAILER_ADDRESS_FROM'),
mailer_smtp_url:
infraConfigs.value.find((x) => x.name === 'MAILER_SMTP_URL')
?.value ?? '',
mailer_from_address:
infraConfigs.value.find((x) => x.name === 'MAILER_ADDRESS_FROM')
?.value ?? '',
},
},
dataSharingConfigs: {
@@ -191,7 +184,7 @@ export function useConfigHandler(updatedConfigs?: Config) {
workingConfigs.value = cloneDeep(currentConfigs.value);
});
// Transforming the working configs back into the format required by the mutations
// Trasforming the working configs back into the format required by the mutations
const updatedInfraConfigs = computed(() => {
let config: UpdatedConfigs[] = [
{
@@ -209,23 +202,13 @@ export function useConfigHandler(updatedConfigs?: Config) {
{
name: 'GOOGLE_CLIENT_SECRET',
value: updatedConfigs?.providers.google.fields.client_secret ?? '',
},
{
name: 'GOOGLE_CALLBACK_URL',
value: updatedConfigs?.providers.google.fields.callback_url ?? '',
},
{
name: 'GOOGLE_SCOPE',
value: updatedConfigs?.providers.google.fields.scope ?? '',
}
);
} else {
config = config.filter(
(item) =>
item.name !== 'GOOGLE_CLIENT_ID' &&
item.name !== 'GOOGLE_CLIENT_SECRET' &&
item.name !== 'GOOGLE_CALLBACK_URL' &&
item.name !== 'GOOGLE_SCOPE'
item.name !== 'GOOGLE_CLIENT_SECRET'
);
}
if (updatedConfigs?.providers.microsoft.enabled) {
@@ -237,28 +220,13 @@ export function useConfigHandler(updatedConfigs?: Config) {
{
name: 'MICROSOFT_CLIENT_SECRET',
value: updatedConfigs?.providers.microsoft.fields.client_secret ?? '',
},
{
name: 'MICROSOFT_CALLBACK_URL',
value: updatedConfigs?.providers.microsoft.fields.callback_url ?? '',
},
{
name: 'MICROSOFT_SCOPE',
value: updatedConfigs?.providers.microsoft.fields.scope ?? '',
},
{
name: 'MICROSOFT_TENANT',
value: updatedConfigs?.providers.microsoft.fields.tenant ?? '',
}
);
} else {
config = config.filter(
(item) =>
item.name !== 'MICROSOFT_CLIENT_ID' &&
item.name !== 'MICROSOFT_CLIENT_SECRET' &&
item.name !== 'MICROSOFT_CALLBACK_URL' &&
item.name !== 'MICROSOFT_SCOPE' &&
item.name !== 'MICROSOFT_TENANT'
item.name !== 'MICROSOFT_CLIENT_SECRET'
);
}
@@ -271,23 +239,13 @@ export function useConfigHandler(updatedConfigs?: Config) {
{
name: 'GITHUB_CLIENT_SECRET',
value: updatedConfigs?.providers.github.fields.client_secret ?? '',
},
{
name: 'GITHUB_CALLBACK_URL',
value: updatedConfigs?.providers.github.fields.callback_url ?? '',
},
{
name: 'GITHUB_SCOPE',
value: updatedConfigs?.providers.github.fields.scope ?? '',
}
);
} else {
config = config.filter(
(item) =>
item.name !== 'GITHUB_CLIENT_ID' &&
item.name !== 'GITHUB_CLIENT_SECRET' &&
item.name !== 'GITHUB_CALLBACK_URL' &&
item.name !== 'GITHUB_SCOPE'
item.name !== 'GITHUB_CLIENT_SECRET'
);
}

8488
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff