Compare commits
10 Commits
fix/precis
...
experiment
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4522aeb79a | ||
|
|
31a275b971 | ||
|
|
9575f3c9e3 | ||
|
|
89e05f501a | ||
|
|
fd84f4e1fa | ||
|
|
5e84e6b479 | ||
|
|
cc5359b80b | ||
|
|
96c18c0500 | ||
|
|
e4e0278b6a | ||
|
|
5bf1b6942b |
15
.github/workflows/tests.yml
vendored
15
.github/workflows/tests.yml
vendored
@@ -17,21 +17,22 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup environment
|
||||
run: mv .env.example .env
|
||||
|
||||
- name: Setup node
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v3
|
||||
uses: pnpm/action-setup@v2.2.4
|
||||
with:
|
||||
version: 8
|
||||
run_install: true
|
||||
|
||||
- name: Setup node
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node }}
|
||||
cache: pnpm
|
||||
|
||||
- name: Run tests
|
||||
run: pnpm test
|
||||
|
||||
@@ -9,10 +9,6 @@ curlCheck() {
|
||||
fi
|
||||
}
|
||||
|
||||
if [ "$ENABLE_SUBPATH_BASED_ACCESS" = "true" ]; then
|
||||
curlCheck "http://localhost:80/backend/ping"
|
||||
else
|
||||
curlCheck "http://localhost:3000"
|
||||
curlCheck "http://localhost:3100"
|
||||
curlCheck "http://localhost:3170/ping"
|
||||
fi
|
||||
curlCheck "http://localhost:3000"
|
||||
curlCheck "http://localhost:3100"
|
||||
curlCheck "http://localhost:3170/ping"
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
},
|
||||
"packageExtensions": {
|
||||
"httpsnippet@3.0.1": {
|
||||
"dependencies": {
|
||||
"peerDependencies": {
|
||||
"ajv": "6.12.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM node:20.12.2 AS builder
|
||||
FROM node:18.8.0 AS builder
|
||||
|
||||
WORKDIR /usr/src/app
|
||||
|
||||
|
||||
@@ -3,7 +3,9 @@
|
||||
"collection": "@nestjs/schematics",
|
||||
"sourceRoot": "src",
|
||||
"compilerOptions": {
|
||||
"assets": [{ "include": "mailer/templates/**/*", "outDir": "dist" }],
|
||||
"assets": [
|
||||
"**/*.hbs"
|
||||
],
|
||||
"watchAssets": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "hoppscotch-backend",
|
||||
"version": "2024.3.3",
|
||||
"version": "2024.3.0",
|
||||
"description": "",
|
||||
"author": "",
|
||||
"private": true,
|
||||
@@ -35,7 +35,6 @@
|
||||
"@nestjs/passport": "10.0.2",
|
||||
"@nestjs/platform-express": "10.2.7",
|
||||
"@nestjs/schedule": "4.0.1",
|
||||
"@nestjs/terminus": "10.2.3",
|
||||
"@nestjs/throttler": "5.0.1",
|
||||
"@prisma/client": "5.8.1",
|
||||
"argon2": "0.30.3",
|
||||
@@ -122,4 +121,4 @@
|
||||
"^src/(.*)$": "<rootDir>/$1"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,7 +26,6 @@ import { loadInfraConfiguration } from './infra-config/helper';
|
||||
import { MailerModule } from './mailer/mailer.module';
|
||||
import { PosthogModule } from './posthog/posthog.module';
|
||||
import { ScheduleModule } from '@nestjs/schedule';
|
||||
import { HealthModule } from './health/health.module';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
@@ -101,7 +100,6 @@ import { HealthModule } from './health/health.module';
|
||||
InfraConfigModule,
|
||||
PosthogModule,
|
||||
ScheduleModule.forRoot(),
|
||||
HealthModule,
|
||||
],
|
||||
providers: [GQLComplexityPlugin],
|
||||
controllers: [AppController],
|
||||
|
||||
@@ -84,12 +84,6 @@ export const USER_ALREADY_INVITED = 'admin/user_already_invited' as const;
|
||||
*/
|
||||
export const USER_UPDATE_FAILED = 'user/update_failed' as const;
|
||||
|
||||
/**
|
||||
* User display name validation failure
|
||||
* (UserService)
|
||||
*/
|
||||
export const USER_SHORT_DISPLAY_NAME = 'user/short_display_name' as const;
|
||||
|
||||
/**
|
||||
* User deletion failure
|
||||
* (UserService)
|
||||
@@ -756,8 +750,3 @@ export const DATABASE_TABLE_NOT_EXIST =
|
||||
* (InfraConfigService)
|
||||
*/
|
||||
export const POSTHOG_CLIENT_NOT_INITIALIZED = 'posthog/client_not_initialized';
|
||||
|
||||
/**
|
||||
* Inputs supplied are invalid
|
||||
*/
|
||||
export const INVALID_PARAMS = 'invalid_parameters' as const;
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
import { Controller, Get } from '@nestjs/common';
|
||||
import {
|
||||
HealthCheck,
|
||||
HealthCheckService,
|
||||
PrismaHealthIndicator,
|
||||
} from '@nestjs/terminus';
|
||||
import { PrismaService } from 'src/prisma/prisma.service';
|
||||
|
||||
@Controller('health')
|
||||
export class HealthController {
|
||||
constructor(
|
||||
private health: HealthCheckService,
|
||||
private prismaHealth: PrismaHealthIndicator,
|
||||
private prisma: PrismaService,
|
||||
) {}
|
||||
|
||||
@Get()
|
||||
@HealthCheck()
|
||||
check() {
|
||||
return this.health.check([
|
||||
async () => this.prismaHealth.pingCheck('database', this.prisma),
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { HealthController } from './health.controller';
|
||||
import { PrismaModule } from 'src/prisma/prisma.module';
|
||||
import { TerminusModule } from '@nestjs/terminus';
|
||||
|
||||
@Module({
|
||||
imports: [PrismaModule, TerminusModule],
|
||||
controllers: [HealthController],
|
||||
})
|
||||
export class HealthModule {}
|
||||
@@ -156,25 +156,6 @@ export async function getDefaultInfraConfigs(): Promise<
|
||||
return infraConfigDefaultObjs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the missing entries in the 'infra_config' table
|
||||
* @returns Array of InfraConfig
|
||||
*/
|
||||
export async function getMissingInfraConfigEntries() {
|
||||
const prisma = new PrismaService();
|
||||
const [dbInfraConfigs, infraConfigDefaultObjs] = await Promise.all([
|
||||
prisma.infraConfig.findMany(),
|
||||
getDefaultInfraConfigs(),
|
||||
]);
|
||||
|
||||
const missingEntries = infraConfigDefaultObjs.filter(
|
||||
(config) =>
|
||||
!dbInfraConfigs.some((dbConfig) => dbConfig.name === config.name),
|
||||
);
|
||||
|
||||
return missingEntries;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify if 'infra_config' table is loaded with all entries
|
||||
* @returns boolean
|
||||
@@ -182,7 +163,12 @@ export async function getMissingInfraConfigEntries() {
|
||||
export async function isInfraConfigTablePopulated(): Promise<boolean> {
|
||||
const prisma = new PrismaService();
|
||||
try {
|
||||
const propsRemainingToInsert = await getMissingInfraConfigEntries();
|
||||
const dbInfraConfigs = await prisma.infraConfig.findMany();
|
||||
const infraConfigDefaultObjs = await getDefaultInfraConfigs();
|
||||
|
||||
const propsRemainingToInsert = infraConfigDefaultObjs.filter(
|
||||
(p) => !dbInfraConfigs.find((e) => e.name === p.name),
|
||||
);
|
||||
|
||||
if (propsRemainingToInsert.length > 0) {
|
||||
console.log(
|
||||
|
||||
@@ -21,12 +21,7 @@ import {
|
||||
validateUrl,
|
||||
} from 'src/utils';
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import {
|
||||
ServiceStatus,
|
||||
getDefaultInfraConfigs,
|
||||
getMissingInfraConfigEntries,
|
||||
stopApp,
|
||||
} from './helper';
|
||||
import { ServiceStatus, getDefaultInfraConfigs, stopApp } from './helper';
|
||||
import { EnableAndDisableSSOArgs, InfraConfigArgs } from './input-args';
|
||||
import { AuthProvider } from 'src/auth/helper';
|
||||
|
||||
@@ -61,7 +56,14 @@ export class InfraConfigService implements OnModuleInit {
|
||||
*/
|
||||
async initializeInfraConfigTable() {
|
||||
try {
|
||||
const propsToInsert = await getMissingInfraConfigEntries();
|
||||
// Fetch the default values (value in .env) for configs to be saved in 'infra_config' table
|
||||
const infraConfigDefaultObjs = await getDefaultInfraConfigs();
|
||||
|
||||
// Eliminate the rows (from 'infraConfigDefaultObjs') that are already present in the database table
|
||||
const dbInfraConfigs = await this.prisma.infraConfig.findMany();
|
||||
const propsToInsert = infraConfigDefaultObjs.filter(
|
||||
(p) => !dbInfraConfigs.find((e) => e.name === p.name),
|
||||
);
|
||||
|
||||
if (propsToInsert.length > 0) {
|
||||
await this.prisma.infraConfig.createMany({ data: propsToInsert });
|
||||
@@ -283,7 +285,6 @@ export class InfraConfigService implements OnModuleInit {
|
||||
/**
|
||||
* Get InfraConfigs by names
|
||||
* @param names Names of the InfraConfigs
|
||||
* @param checkDisallowedKeys If true, check if the names are allowed to fetch by client
|
||||
* @returns InfraConfig model
|
||||
*/
|
||||
async getMany(names: InfraConfigEnum[], checkDisallowedKeys: boolean = true) {
|
||||
|
||||
@@ -1,11 +1,4 @@
|
||||
import {
|
||||
Controller,
|
||||
Get,
|
||||
HttpStatus,
|
||||
Param,
|
||||
Query,
|
||||
UseGuards,
|
||||
} from '@nestjs/common';
|
||||
import { Controller, Get, Param, Query, UseGuards } from '@nestjs/common';
|
||||
import { TeamCollectionService } from './team-collection.service';
|
||||
import * as E from 'fp-ts/Either';
|
||||
import { ThrottlerBehindProxyGuard } from 'src/guards/throttler-behind-proxy.guard';
|
||||
@@ -14,15 +7,13 @@ import { RequiresTeamRole } from 'src/team/decorators/requires-team-role.decorat
|
||||
import { TeamMemberRole } from '@prisma/client';
|
||||
import { RESTTeamMemberGuard } from 'src/team/guards/rest-team-member.guard';
|
||||
import { throwHTTPErr } from 'src/utils';
|
||||
import { RESTError } from 'src/types/RESTError';
|
||||
import { INVALID_PARAMS } from 'src/errors';
|
||||
|
||||
@UseGuards(ThrottlerBehindProxyGuard)
|
||||
@Controller({ path: 'team-collection', version: '1' })
|
||||
export class TeamCollectionController {
|
||||
constructor(private readonly teamCollectionService: TeamCollectionService) {}
|
||||
|
||||
@Get('search/:teamID')
|
||||
@Get('search/:teamID/:searchQuery')
|
||||
@RequiresTeamRole(
|
||||
TeamMemberRole.VIEWER,
|
||||
TeamMemberRole.EDITOR,
|
||||
@@ -30,20 +21,13 @@ export class TeamCollectionController {
|
||||
)
|
||||
@UseGuards(JwtAuthGuard, RESTTeamMemberGuard)
|
||||
async searchByTitle(
|
||||
@Query('searchQuery') searchQuery: string,
|
||||
@Param('searchQuery') searchQuery: string,
|
||||
@Param('teamID') teamID: string,
|
||||
@Query('take') take: string,
|
||||
@Query('skip') skip: string,
|
||||
) {
|
||||
if (!teamID || !searchQuery) {
|
||||
return <RESTError>{
|
||||
message: INVALID_PARAMS,
|
||||
statusCode: HttpStatus.BAD_REQUEST,
|
||||
};
|
||||
}
|
||||
|
||||
const res = await this.teamCollectionService.searchByTitle(
|
||||
searchQuery.trim(),
|
||||
searchQuery,
|
||||
teamID,
|
||||
parseInt(take),
|
||||
parseInt(skip),
|
||||
|
||||
@@ -58,29 +58,6 @@ export class UserResolver {
|
||||
if (E.isLeft(updatedUser)) throwErr(updatedUser.left);
|
||||
return updatedUser.right;
|
||||
}
|
||||
|
||||
@Mutation(() => User, {
|
||||
description: 'Update a users display name',
|
||||
})
|
||||
@UseGuards(GqlAuthGuard)
|
||||
async updateDisplayName(
|
||||
@GqlUser() user: AuthUser,
|
||||
@Args({
|
||||
name: 'updatedDisplayName',
|
||||
description: 'New name of user',
|
||||
type: () => String,
|
||||
})
|
||||
updatedDisplayName: string,
|
||||
) {
|
||||
const updatedUser = await this.userService.updateUserDisplayName(
|
||||
user.uid,
|
||||
updatedDisplayName,
|
||||
);
|
||||
|
||||
if (E.isLeft(updatedUser)) throwErr(updatedUser.left);
|
||||
return updatedUser.right;
|
||||
}
|
||||
|
||||
@Mutation(() => Boolean, {
|
||||
description: 'Delete an user account',
|
||||
})
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
import {
|
||||
JSON_INVALID,
|
||||
USERS_NOT_FOUND,
|
||||
USER_NOT_FOUND,
|
||||
USER_SHORT_DISPLAY_NAME,
|
||||
} from 'src/errors';
|
||||
import { JSON_INVALID, USERS_NOT_FOUND, USER_NOT_FOUND } from 'src/errors';
|
||||
import { mockDeep, mockReset } from 'jest-mock-extended';
|
||||
import { PrismaService } from 'src/prisma/prisma.service';
|
||||
import { AuthUser } from 'src/types/AuthUser';
|
||||
@@ -485,14 +480,6 @@ describe('UserService', () => {
|
||||
);
|
||||
expect(result).toEqualLeft(USER_NOT_FOUND);
|
||||
});
|
||||
test('should resolve left and error when short display name is passed', async () => {
|
||||
const newDisplayName = '';
|
||||
const result = await userService.updateUserDisplayName(
|
||||
user.uid,
|
||||
newDisplayName,
|
||||
);
|
||||
expect(result).toEqualLeft(USER_SHORT_DISPLAY_NAME);
|
||||
});
|
||||
});
|
||||
|
||||
describe('fetchAllUsers', () => {
|
||||
|
||||
@@ -8,11 +8,7 @@ import * as T from 'fp-ts/Task';
|
||||
import * as A from 'fp-ts/Array';
|
||||
import { pipe, constVoid } from 'fp-ts/function';
|
||||
import { AuthUser } from 'src/types/AuthUser';
|
||||
import {
|
||||
USERS_NOT_FOUND,
|
||||
USER_NOT_FOUND,
|
||||
USER_SHORT_DISPLAY_NAME,
|
||||
} from 'src/errors';
|
||||
import { USERS_NOT_FOUND, USER_NOT_FOUND } from 'src/errors';
|
||||
import { SessionType, User } from './user.model';
|
||||
import { USER_UPDATE_FAILED } from 'src/errors';
|
||||
import { PubSubService } from 'src/pubsub/pubsub.service';
|
||||
@@ -295,10 +291,6 @@ export class UserService {
|
||||
* @returns a Either of User or error
|
||||
*/
|
||||
async updateUserDisplayName(userUID: string, displayName: string) {
|
||||
if (!displayName || displayName.length === 0) {
|
||||
return E.left(USER_SHORT_DISPLAY_NAME);
|
||||
}
|
||||
|
||||
try {
|
||||
const dbUpdatedUser = await this.prisma.user.update({
|
||||
where: { uid: userUID },
|
||||
|
||||
@@ -261,28 +261,29 @@ export function checkEnvironmentAuthProvider(
|
||||
* Source: https://stackoverflow.com/a/32648526
|
||||
*/
|
||||
export function escapeSqlLikeString(str: string) {
|
||||
if (typeof str != 'string') return str;
|
||||
if (typeof str != 'string')
|
||||
return str;
|
||||
|
||||
return str.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) {
|
||||
switch (char) {
|
||||
case '\0':
|
||||
return '\\0';
|
||||
case '\x08':
|
||||
return '\\b';
|
||||
case '\x09':
|
||||
return '\\t';
|
||||
case '\x1a':
|
||||
return '\\z';
|
||||
case '\n':
|
||||
return '\\n';
|
||||
case '\r':
|
||||
return '\\r';
|
||||
case '"':
|
||||
case "'":
|
||||
case '\\':
|
||||
case '%':
|
||||
return '\\' + char; // prepends a backslash to backslash, percent,
|
||||
// and double/single quotes
|
||||
}
|
||||
});
|
||||
return str.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) {
|
||||
switch (char) {
|
||||
case "\0":
|
||||
return "\\0";
|
||||
case "\x08":
|
||||
return "\\b";
|
||||
case "\x09":
|
||||
return "\\t";
|
||||
case "\x1a":
|
||||
return "\\z";
|
||||
case "\n":
|
||||
return "\\n";
|
||||
case "\r":
|
||||
return "\\r";
|
||||
case "\"":
|
||||
case "'":
|
||||
case "\\":
|
||||
case "%":
|
||||
return "\\"+char; // prepends a backslash to backslash, percent,
|
||||
// and double/single quotes
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -52,34 +52,11 @@ hopp [options or commands] arguments
|
||||
Taking the above example, `pw.env.get("ENV1")` will return `"value1"`
|
||||
|
||||
## Install
|
||||
- Before you install Hoppscotch CLI you need to make sure you have the dependencies it requires to run.
|
||||
- **Windows & macOS**: You will need `node-gyp` installed. Find instructions here: https://github.com/nodejs/node-gyp
|
||||
- **Debian/Ubuntu derivatives**:
|
||||
```sh
|
||||
sudo apt-get install python g++ build-essential
|
||||
```
|
||||
- **Alpine Linux**:
|
||||
```sh
|
||||
sudo apk add python3 make g++
|
||||
```
|
||||
- **Amazon Linux (AMI)**
|
||||
```sh
|
||||
sudo yum install gcc72 gcc72-c++
|
||||
```
|
||||
- **Arch Linux**
|
||||
```sh
|
||||
sudo pacman -S make gcc python
|
||||
```
|
||||
- **RHEL/Fedora derivatives**:
|
||||
```sh
|
||||
sudo dnf install python3 make gcc gcc-c++ zlib-devel brotli-devel openssl-devel libuv-devel
|
||||
```
|
||||
|
||||
|
||||
- Once the dependencies are installed, install [@hoppscotch/cli](https://www.npmjs.com/package/@hoppscotch/cli) from npm by running:
|
||||
```
|
||||
npm i -g @hoppscotch/cli
|
||||
```
|
||||
Install [@hoppscotch/cli](https://www.npmjs.com/package/@hoppscotch/cli) from npm by running:
|
||||
```
|
||||
npm i -g @hoppscotch/cli
|
||||
```
|
||||
|
||||
## **Developing:**
|
||||
|
||||
|
||||
@@ -1,31 +1,6 @@
|
||||
#!/usr/bin/env node
|
||||
// * The entry point of the CLI
|
||||
// @ts-check
|
||||
|
||||
import { cli } from "../dist/index.js";
|
||||
|
||||
import { spawnSync } from "child_process";
|
||||
import { cloneDeep } from "lodash-es";
|
||||
|
||||
const nodeVersion = parseInt(process.versions.node.split(".")[0]);
|
||||
|
||||
// As per isolated-vm documentation, we need to supply `--no-node-snapshot` for node >= 20
|
||||
// src: https://github.com/laverdet/isolated-vm?tab=readme-ov-file#requirements
|
||||
if (nodeVersion >= 20 && !process.execArgv.includes("--no-node-snapshot")) {
|
||||
const argCopy = cloneDeep(process.argv);
|
||||
|
||||
// Replace first argument with --no-node-snapshot
|
||||
// We can get argv[0] from process.argv0
|
||||
argCopy[0] = "--no-node-snapshot";
|
||||
|
||||
const result = spawnSync(
|
||||
process.argv0,
|
||||
argCopy,
|
||||
{ stdio: "inherit" }
|
||||
);
|
||||
|
||||
// Exit with the same status code as the spawned process
|
||||
process.exit(result.status ?? 0);
|
||||
} else {
|
||||
cli(process.argv);
|
||||
}
|
||||
cli(process.argv);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@hoppscotch/cli",
|
||||
"version": "0.8.0",
|
||||
"version": "0.7.0",
|
||||
"description": "A CLI to run Hoppscotch test scripts in CI environments.",
|
||||
"homepage": "https://hoppscotch.io",
|
||||
"type": "module",
|
||||
@@ -44,7 +44,6 @@
|
||||
"axios": "1.6.7",
|
||||
"chalk": "5.3.0",
|
||||
"commander": "11.1.0",
|
||||
"isolated-vm": "4.7.2",
|
||||
"lodash-es": "4.17.21",
|
||||
"qs": "6.11.2",
|
||||
"verzod": "0.2.2",
|
||||
@@ -66,4 +65,4 @@
|
||||
"tsup": "8.0.2",
|
||||
"typescript": "5.3.3"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,7 @@ describe("Test `hopp test <file>` command:", () => {
|
||||
const out = getErrorCode(stderr);
|
||||
expect(out).toBe<HoppErrorCode>("INVALID_ARGUMENT");
|
||||
});
|
||||
});
|
||||
})
|
||||
|
||||
describe("Supplied collection export file validations", () => {
|
||||
test("Errors with the code `FILE_NOT_FOUND` if the supplied collection export file doesn't exist", async () => {
|
||||
@@ -66,43 +66,6 @@ describe("Test `hopp test <file>` command:", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("Versioned entities", () => {
|
||||
describe("Collections & Requests", () => {
|
||||
const testFixtures = [
|
||||
{ fileName: "coll-v1-req-v0.json", collVersion: 1, reqVersion: 0 },
|
||||
{ fileName: "coll-v1-req-v1.json", collVersion: 1, reqVersion: 1 },
|
||||
{ fileName: "coll-v2-req-v2.json", collVersion: 2, reqVersion: 2 },
|
||||
{ fileName: "coll-v2-req-v3.json", collVersion: 2, reqVersion: 3 },
|
||||
];
|
||||
|
||||
testFixtures.forEach(({ collVersion, fileName, reqVersion }) => {
|
||||
test(`Successfully processes a supplied collection export file where the collection is based on the "v${collVersion}" schema and the request following the "v${reqVersion}" schema`, async () => {
|
||||
const args = `test ${getTestJsonFilePath(fileName, "collection")}`;
|
||||
const { error } = await runCLI(args);
|
||||
|
||||
expect(error).toBeNull();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("Environments", () => {
|
||||
const testFixtures = [
|
||||
{ fileName: "env-v0.json", version: 0 },
|
||||
{ fileName: "env-v1.json", version: 1 },
|
||||
];
|
||||
|
||||
testFixtures.forEach(({ fileName, version }) => {
|
||||
test(`Successfully processes the supplied collection and environment export files where the environment is based on the "v${version}" schema`, async () => {
|
||||
const ENV_PATH = getTestJsonFilePath(fileName, "environment");
|
||||
const args = `test ${getTestJsonFilePath("sample-coll.json", "collection")} --env ${ENV_PATH}`;
|
||||
const { error } = await runCLI(args);
|
||||
|
||||
expect(error).toBeNull();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test("Successfully processes a supplied collection export file of the expected format", async () => {
|
||||
const args = `test ${getTestJsonFilePath("passes-coll.json", "collection")}`;
|
||||
const { error } = await runCLI(args);
|
||||
@@ -112,8 +75,7 @@ describe("Test `hopp test <file>` command:", () => {
|
||||
|
||||
test("Successfully inherits headers and authorization set at the root collection", async () => {
|
||||
const args = `test ${getTestJsonFilePath(
|
||||
"collection-level-headers-auth-coll.json",
|
||||
"collection"
|
||||
"collection-level-headers-auth-coll.json", "collection"
|
||||
)}`;
|
||||
const { error } = await runCLI(args);
|
||||
|
||||
@@ -122,8 +84,7 @@ describe("Test `hopp test <file>` command:", () => {
|
||||
|
||||
test("Persists environment variables set in the pre-request script for consumption in the test script", async () => {
|
||||
const args = `test ${getTestJsonFilePath(
|
||||
"pre-req-script-env-var-persistence-coll.json",
|
||||
"collection"
|
||||
"pre-req-script-env-var-persistence-coll.json", "collection"
|
||||
)}`;
|
||||
const { error } = await runCLI(args);
|
||||
|
||||
@@ -145,8 +106,7 @@ describe("Test `hopp test <file> --env <file>` command:", () => {
|
||||
|
||||
test("Errors with the code `INVALID_FILE_TYPE` if the supplied environment export file doesn't end with the `.json` extension", async () => {
|
||||
const args = `${VALID_TEST_ARGS} --env ${getTestJsonFilePath(
|
||||
"notjson-coll.txt",
|
||||
"collection"
|
||||
"notjson-coll.txt", "collection"
|
||||
)}`;
|
||||
const { stderr } = await runCLI(args);
|
||||
|
||||
@@ -163,10 +123,7 @@ describe("Test `hopp test <file> --env <file>` command:", () => {
|
||||
});
|
||||
|
||||
test("Errors with the code `MALFORMED_ENV_FILE` on supplying a malformed environment export file", async () => {
|
||||
const ENV_PATH = getTestJsonFilePath(
|
||||
"malformed-envs.json",
|
||||
"environment"
|
||||
);
|
||||
const ENV_PATH = getTestJsonFilePath("malformed-envs.json", "environment");
|
||||
const args = `${VALID_TEST_ARGS} --env ${ENV_PATH}`;
|
||||
const { stderr } = await runCLI(args);
|
||||
|
||||
@@ -185,10 +142,7 @@ describe("Test `hopp test <file> --env <file>` command:", () => {
|
||||
});
|
||||
|
||||
test("Successfully resolves values from the supplied environment export file", async () => {
|
||||
const TESTS_PATH = getTestJsonFilePath(
|
||||
"env-flag-tests-coll.json",
|
||||
"collection"
|
||||
);
|
||||
const TESTS_PATH = getTestJsonFilePath("env-flag-tests-coll.json", "collection");
|
||||
const ENV_PATH = getTestJsonFilePath("env-flag-envs.json", "environment");
|
||||
const args = `test ${TESTS_PATH} --env ${ENV_PATH}`;
|
||||
|
||||
@@ -197,14 +151,8 @@ describe("Test `hopp test <file> --env <file>` command:", () => {
|
||||
});
|
||||
|
||||
test("Successfully resolves environment variables referenced in the request body", async () => {
|
||||
const COLL_PATH = getTestJsonFilePath(
|
||||
"req-body-env-vars-coll.json",
|
||||
"collection"
|
||||
);
|
||||
const ENVS_PATH = getTestJsonFilePath(
|
||||
"req-body-env-vars-envs.json",
|
||||
"environment"
|
||||
);
|
||||
const COLL_PATH = getTestJsonFilePath("req-body-env-vars-coll.json", "collection");
|
||||
const ENVS_PATH = getTestJsonFilePath("req-body-env-vars-envs.json", "environment");
|
||||
const args = `test ${COLL_PATH} --env ${ENVS_PATH}`;
|
||||
|
||||
const { error } = await runCLI(args);
|
||||
@@ -212,10 +160,7 @@ describe("Test `hopp test <file> --env <file>` command:", () => {
|
||||
});
|
||||
|
||||
test("Works with shorth `-e` flag", async () => {
|
||||
const TESTS_PATH = getTestJsonFilePath(
|
||||
"env-flag-tests-coll.json",
|
||||
"collection"
|
||||
);
|
||||
const TESTS_PATH = getTestJsonFilePath("env-flag-tests-coll.json", "collection");
|
||||
const ENV_PATH = getTestJsonFilePath("env-flag-envs.json", "environment");
|
||||
const args = `test ${TESTS_PATH} -e ${ENV_PATH}`;
|
||||
|
||||
@@ -224,7 +169,7 @@ describe("Test `hopp test <file> --env <file>` command:", () => {
|
||||
});
|
||||
|
||||
describe("Secret environment variables", () => {
|
||||
jest.setTimeout(100000);
|
||||
jest.setTimeout(10000);
|
||||
|
||||
// Reads secret environment values from system environment
|
||||
test("Successfully picks the values for secret environment variables from `process.env` and persists the variables set from the pre-request script", async () => {
|
||||
@@ -238,10 +183,7 @@ describe("Test `hopp test <file> --env <file>` command:", () => {
|
||||
secretHeaderValue: "secret-header-value",
|
||||
};
|
||||
|
||||
const COLL_PATH = getTestJsonFilePath(
|
||||
"secret-envs-coll.json",
|
||||
"collection"
|
||||
);
|
||||
const COLL_PATH = getTestJsonFilePath("secret-envs-coll.json", "collection");
|
||||
const ENVS_PATH = getTestJsonFilePath("secret-envs.json", "environment");
|
||||
const args = `test ${COLL_PATH} --env ${ENVS_PATH}`;
|
||||
|
||||
@@ -255,14 +197,8 @@ describe("Test `hopp test <file> --env <file>` command:", () => {
|
||||
|
||||
// Prefers values specified in the environment export file over values set in the system environment
|
||||
test("Successfully picks the values for secret environment variables set directly in the environment export file and persists the environment variables set from the pre-request script", async () => {
|
||||
const COLL_PATH = getTestJsonFilePath(
|
||||
"secret-envs-coll.json",
|
||||
"collection"
|
||||
);
|
||||
const ENVS_PATH = getTestJsonFilePath(
|
||||
"secret-supplied-values-envs.json",
|
||||
"environment"
|
||||
);
|
||||
const COLL_PATH = getTestJsonFilePath("secret-envs-coll.json", "collection");
|
||||
const ENVS_PATH = getTestJsonFilePath("secret-supplied-values-envs.json", "environment");
|
||||
const args = `test ${COLL_PATH} --env ${ENVS_PATH}`;
|
||||
|
||||
const { error, stdout } = await runCLI(args);
|
||||
@@ -276,13 +212,9 @@ describe("Test `hopp test <file> --env <file>` command:", () => {
|
||||
// Values set from the scripting context takes the highest precedence
|
||||
test("Setting values for secret environment variables from the pre-request script overrides values set at the supplied environment export file", async () => {
|
||||
const COLL_PATH = getTestJsonFilePath(
|
||||
"secret-envs-persistence-coll.json",
|
||||
"collection"
|
||||
);
|
||||
const ENVS_PATH = getTestJsonFilePath(
|
||||
"secret-supplied-values-envs.json",
|
||||
"environment"
|
||||
"secret-envs-persistence-coll.json", "collection"
|
||||
);
|
||||
const ENVS_PATH = getTestJsonFilePath("secret-supplied-values-envs.json", "environment");
|
||||
const args = `test ${COLL_PATH} --env ${ENVS_PATH}`;
|
||||
|
||||
const { error, stdout } = await runCLI(args);
|
||||
@@ -295,12 +227,10 @@ describe("Test `hopp test <file> --env <file>` command:", () => {
|
||||
|
||||
test("Persists secret environment variable values set from the pre-request script for consumption in the request and post-request script context", async () => {
|
||||
const COLL_PATH = getTestJsonFilePath(
|
||||
"secret-envs-persistence-scripting-coll.json",
|
||||
"collection"
|
||||
"secret-envs-persistence-scripting-coll.json", "collection"
|
||||
);
|
||||
const ENVS_PATH = getTestJsonFilePath(
|
||||
"secret-envs-persistence-scripting-envs.json",
|
||||
"environment"
|
||||
"secret-envs-persistence-scripting-envs.json", "environment"
|
||||
);
|
||||
const args = `test ${COLL_PATH} --env ${ENVS_PATH}`;
|
||||
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
import { isRESTCollection } from "../../../utils/checks";
|
||||
|
||||
describe("isRESTCollection", () => {
|
||||
test("Undefined collection value.", () => {
|
||||
expect(isRESTCollection(undefined)).toBeFalsy();
|
||||
});
|
||||
|
||||
test("Invalid id value.", () => {
|
||||
expect(
|
||||
isRESTCollection({
|
||||
v: 1,
|
||||
name: "test",
|
||||
id: 1,
|
||||
})
|
||||
).toBeFalsy();
|
||||
});
|
||||
|
||||
test("Invalid requests value.", () => {
|
||||
expect(
|
||||
isRESTCollection({
|
||||
v: 1,
|
||||
name: "test",
|
||||
id: "1",
|
||||
requests: null,
|
||||
})
|
||||
).toBeFalsy();
|
||||
});
|
||||
|
||||
test("Invalid folders value.", () => {
|
||||
expect(
|
||||
isRESTCollection({
|
||||
v: 1,
|
||||
name: "test",
|
||||
id: "1",
|
||||
requests: [],
|
||||
folders: undefined,
|
||||
})
|
||||
).toBeFalsy();
|
||||
});
|
||||
|
||||
test("Invalid RESTCollection(s) in folders.", () => {
|
||||
expect(
|
||||
isRESTCollection({
|
||||
v: 1,
|
||||
name: "test",
|
||||
id: "1",
|
||||
requests: [],
|
||||
folders: [
|
||||
{
|
||||
v: 1,
|
||||
name: "test1",
|
||||
id: "2",
|
||||
requests: undefined,
|
||||
folders: [],
|
||||
},
|
||||
],
|
||||
})
|
||||
).toBeFalsy();
|
||||
});
|
||||
|
||||
test("Invalid HoppRESTRequest(s) in requests.", () => {
|
||||
expect(
|
||||
isRESTCollection({
|
||||
v: 1,
|
||||
name: "test",
|
||||
id: "1",
|
||||
requests: [{}],
|
||||
folders: [],
|
||||
})
|
||||
).toBeFalsy();
|
||||
});
|
||||
|
||||
test("Valid RESTCollection.", () => {
|
||||
expect(
|
||||
isRESTCollection({
|
||||
v: 1,
|
||||
name: "test",
|
||||
id: "1",
|
||||
requests: [],
|
||||
folders: [],
|
||||
})
|
||||
).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"v": 1,
|
||||
"name": "coll-v1",
|
||||
"folders": [
|
||||
{
|
||||
"v": 1,
|
||||
"name": "coll-v1-child",
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"url": "https://echo.hoppscotch.io",
|
||||
"path": "/get",
|
||||
"headers": [
|
||||
{ "key": "Inactive-Header", "value": "Inactive Header", "active": false },
|
||||
{ "key": "Authorization", "value": "Bearer token123", "active": true }
|
||||
],
|
||||
"params": [
|
||||
{ "key": "key", "value": "value", "active": true },
|
||||
{ "key": "inactive-key", "value": "inactive-param", "active": false }
|
||||
],
|
||||
"name": "req-v0-II",
|
||||
"method": "GET",
|
||||
"preRequestScript": "",
|
||||
"testScript": "pw.test(\"Asserts request params\", () => {\n pw.expect(pw.response.body.args.key).toBe(\"value\")\n pw.expect(pw.response.body.args[\"inactive-key\"]).toBe(undefined)\n})\n\npw.test(\"Asserts request headers\", () => {\n pw.expect(pw.response.body.headers[\"authorization\"]).toBe(\"Bearer token123\")\n pw.expect(pw.response.body.headers[\"inactive-header\"]).toBe(undefined)\n})",
|
||||
"contentType": "application/json",
|
||||
"body": "",
|
||||
"auth": "Bearer Token",
|
||||
"bearerToken": "token123"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"requests": [
|
||||
{
|
||||
"url": "https://echo.hoppscotch.io",
|
||||
"path": "/get",
|
||||
"headers": [
|
||||
{ "key": "Inactive-Header", "value": "Inactive Header", "active": false },
|
||||
{ "key": "Authorization", "value": "Bearer token123", "active": true }
|
||||
],
|
||||
"params": [
|
||||
{ "key": "key", "value": "value", "active": true },
|
||||
{ "key": "inactive-key", "value": "inactive-param", "active": false }
|
||||
],
|
||||
"name": "req-v0",
|
||||
"method": "GET",
|
||||
"preRequestScript": "",
|
||||
"testScript": "pw.test(\"Asserts request params\", () => {\n pw.expect(pw.response.body.args.key).toBe(\"value\")\n pw.expect(pw.response.body.args[\"inactive-key\"]).toBe(undefined)\n})\n\npw.test(\"Asserts request headers\", () => {\n pw.expect(pw.response.body.headers[\"authorization\"]).toBe(\"Bearer token123\")\n pw.expect(pw.response.body.headers[\"inactive-header\"]).toBe(undefined)\n})",
|
||||
"contentType": "application/json",
|
||||
"body": "",
|
||||
"auth": "Bearer Token",
|
||||
"bearerToken": "token123"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,97 +0,0 @@
|
||||
{
|
||||
"v": 1,
|
||||
"name": "coll-v1",
|
||||
"folders": [
|
||||
{
|
||||
"v": 1,
|
||||
"name": "coll-v1-child",
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"v": "1",
|
||||
"endpoint": "https://echo.hoppscotch.io",
|
||||
"headers": [
|
||||
{
|
||||
"key": "Inactive-Header",
|
||||
"value": "Inactive Header",
|
||||
"active": false
|
||||
},
|
||||
{
|
||||
"key": "Authorization",
|
||||
"value": "Bearer token123",
|
||||
"active": true
|
||||
}
|
||||
],
|
||||
"params": [
|
||||
{
|
||||
"key": "key",
|
||||
"value": "value",
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"key": "inactive-key",
|
||||
"value": "inactive-param",
|
||||
"active": false
|
||||
}
|
||||
],
|
||||
"name": "req-v1-II",
|
||||
"method": "GET",
|
||||
"preRequestScript": "",
|
||||
"testScript": "pw.test(\"Asserts request params\", () => {\n pw.expect(pw.response.body.args.key).toBe(\"value\")\n pw.expect(pw.response.body.args[\"inactive-key\"]).toBe(undefined)\n})\n\npw.test(\"Asserts request headers\", () => {\n pw.expect(pw.response.body.headers[\"authorization\"]).toBe(\"Bearer token123\")\n pw.expect(pw.response.body.headers[\"inactive-header\"]).toBe(undefined)\n})",
|
||||
"body": {
|
||||
"contentType": null,
|
||||
"body": null
|
||||
},
|
||||
"auth": {
|
||||
"authType": "bearer",
|
||||
"authActive": true,
|
||||
"token": "token123"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"requests": [
|
||||
{
|
||||
"v": "1",
|
||||
"endpoint": "https://echo.hoppscotch.io",
|
||||
"headers": [
|
||||
{
|
||||
"key": "Inactive-Header",
|
||||
"value": "Inactive Header",
|
||||
"active": false
|
||||
},
|
||||
{
|
||||
"key": "Authorization",
|
||||
"value": "Bearer token123",
|
||||
"active": true
|
||||
}
|
||||
],
|
||||
"params": [
|
||||
{
|
||||
"key": "key",
|
||||
"value": "value",
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"key": "inactive-key",
|
||||
"value": "inactive-param",
|
||||
"active": false
|
||||
}
|
||||
],
|
||||
"name": "req-v1",
|
||||
"method": "GET",
|
||||
"preRequestScript": "",
|
||||
"testScript": "pw.test(\"Asserts request params\", () => {\n pw.expect(pw.response.body.args.key).toBe(\"value\")\n pw.expect(pw.response.body.args[\"inactive-key\"]).toBe(undefined)\n})\n\npw.test(\"Asserts request headers\", () => {\n pw.expect(pw.response.body.headers[\"authorization\"]).toBe(\"Bearer token123\")\n pw.expect(pw.response.body.headers[\"inactive-header\"]).toBe(undefined)\n})",
|
||||
"body": {
|
||||
"contentType": null,
|
||||
"body": null
|
||||
},
|
||||
"auth": {
|
||||
"authType": "bearer",
|
||||
"authActive": true,
|
||||
"token": "token123"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,109 +0,0 @@
|
||||
{
|
||||
"v": 2,
|
||||
"name": "coll-v2",
|
||||
"folders": [
|
||||
{
|
||||
"v": 2,
|
||||
"name": "coll-v2-child",
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"v": "2",
|
||||
"endpoint": "https://echo.hoppscotch.io",
|
||||
"headers": [
|
||||
{
|
||||
"key": "Inactive-Header",
|
||||
"value": "Inactive Header",
|
||||
"active": false
|
||||
},
|
||||
{
|
||||
"key": "Authorization",
|
||||
"value": "Bearer token123",
|
||||
"active": true
|
||||
}
|
||||
],
|
||||
"params": [
|
||||
{
|
||||
"key": "key",
|
||||
"value": "value",
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"key": "inactive-key",
|
||||
"value": "inactive-param",
|
||||
"active": false
|
||||
}
|
||||
],
|
||||
"name": "req-v2-II",
|
||||
"method": "GET",
|
||||
"preRequestScript": "",
|
||||
"testScript": "pw.test(\"Asserts request params\", () => {\n pw.expect(pw.response.body.args.key).toBe(\"value\")\n pw.expect(pw.response.body.args[\"inactive-key\"]).toBe(undefined)\n})\n\npw.test(\"Asserts request headers\", () => {\n pw.expect(pw.response.body.headers[\"authorization\"]).toBe(\"Bearer token123\")\n pw.expect(pw.response.body.headers[\"inactive-header\"]).toBe(undefined)\n})",
|
||||
"body": {
|
||||
"contentType": null,
|
||||
"body": null
|
||||
},
|
||||
"auth": {
|
||||
"authType": "bearer",
|
||||
"authActive": true,
|
||||
"token": "token123"
|
||||
},
|
||||
"requestVariables": []
|
||||
}
|
||||
],
|
||||
"auth": {
|
||||
"authType": "inherit",
|
||||
"authActive": true
|
||||
},
|
||||
"headers": []
|
||||
}
|
||||
],
|
||||
"requests": [
|
||||
{
|
||||
"v": "2",
|
||||
"endpoint": "https://echo.hoppscotch.io",
|
||||
"headers": [
|
||||
{
|
||||
"key": "Inactive-Header",
|
||||
"value": "Inactive Header",
|
||||
"active": false
|
||||
},
|
||||
{
|
||||
"key": "Authorization",
|
||||
"value": "Bearer token123",
|
||||
"active": true
|
||||
}
|
||||
],
|
||||
"params": [
|
||||
{
|
||||
"key": "key",
|
||||
"value": "value",
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"key": "inactive-key",
|
||||
"value": "inactive-param",
|
||||
"active": false
|
||||
}
|
||||
],
|
||||
"name": "req-v2",
|
||||
"method": "GET",
|
||||
"preRequestScript": "",
|
||||
"testScript": "pw.test(\"Asserts request params\", () => {\n pw.expect(pw.response.body.args.key).toBe(\"value\")\n pw.expect(pw.response.body.args[\"inactive-key\"]).toBe(undefined)\n})\n\npw.test(\"Asserts request headers\", () => {\n pw.expect(pw.response.body.headers[\"authorization\"]).toBe(\"Bearer token123\")\n pw.expect(pw.response.body.headers[\"inactive-header\"]).toBe(undefined)\n})",
|
||||
"body": {
|
||||
"contentType": null,
|
||||
"body": null
|
||||
},
|
||||
"auth": {
|
||||
"authType": "bearer",
|
||||
"authActive": true,
|
||||
"token": "token123"
|
||||
},
|
||||
"requestVariables": []
|
||||
}
|
||||
],
|
||||
"auth": {
|
||||
"authType": "inherit",
|
||||
"authActive": true
|
||||
},
|
||||
"headers": []
|
||||
}
|
||||
@@ -1,109 +0,0 @@
|
||||
{
|
||||
"v": 2,
|
||||
"name": "coll-v2",
|
||||
"folders": [
|
||||
{
|
||||
"v": 2,
|
||||
"name": "coll-v2-child",
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"endpoint": "https://echo.hoppscotch.io",
|
||||
"headers": [
|
||||
{
|
||||
"key": "Inactive-Header",
|
||||
"value": "Inactive Header",
|
||||
"active": false
|
||||
},
|
||||
{
|
||||
"key": "Authorization",
|
||||
"value": "Bearer token123",
|
||||
"active": true
|
||||
}
|
||||
],
|
||||
"params": [
|
||||
{
|
||||
"key": "key",
|
||||
"value": "value",
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"key": "inactive-key",
|
||||
"value": "inactive-param",
|
||||
"active": false
|
||||
}
|
||||
],
|
||||
"name": "req-v3-II",
|
||||
"method": "GET",
|
||||
"preRequestScript": "",
|
||||
"testScript": "pw.test(\"Asserts request params\", () => {\n pw.expect(pw.response.body.args.key).toBe(\"value\")\n pw.expect(pw.response.body.args[\"inactive-key\"]).toBe(undefined)\n})\n\npw.test(\"Asserts request headers\", () => {\n pw.expect(pw.response.body.headers[\"authorization\"]).toBe(\"Bearer token123\")\n pw.expect(pw.response.body.headers[\"inactive-header\"]).toBe(undefined)\n})",
|
||||
"body": {
|
||||
"contentType": null,
|
||||
"body": null
|
||||
},
|
||||
"auth": {
|
||||
"authType": "bearer",
|
||||
"authActive": true,
|
||||
"token": "token123"
|
||||
},
|
||||
"requestVariables": []
|
||||
}
|
||||
],
|
||||
"auth": {
|
||||
"authType": "inherit",
|
||||
"authActive": true
|
||||
},
|
||||
"headers": []
|
||||
}
|
||||
],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"endpoint": "https://echo.hoppscotch.io",
|
||||
"headers": [
|
||||
{
|
||||
"key": "Inactive-Header",
|
||||
"value": "Inactive Header",
|
||||
"active": false
|
||||
},
|
||||
{
|
||||
"key": "Authorization",
|
||||
"value": "Bearer token123",
|
||||
"active": true
|
||||
}
|
||||
],
|
||||
"params": [
|
||||
{
|
||||
"key": "key",
|
||||
"value": "value",
|
||||
"active": true
|
||||
},
|
||||
{
|
||||
"key": "inactive-key",
|
||||
"value": "inactive-param",
|
||||
"active": false
|
||||
}
|
||||
],
|
||||
"name": "req-v3",
|
||||
"method": "GET",
|
||||
"preRequestScript": "",
|
||||
"testScript": "pw.test(\"Asserts request params\", () => {\n pw.expect(pw.response.body.args.key).toBe(\"value\")\n pw.expect(pw.response.body.args[\"inactive-key\"]).toBe(undefined)\n})\n\npw.test(\"Asserts request headers\", () => {\n pw.expect(pw.response.body.headers[\"authorization\"]).toBe(\"Bearer token123\")\n pw.expect(pw.response.body.headers[\"inactive-header\"]).toBe(undefined)\n})",
|
||||
"body": {
|
||||
"contentType": null,
|
||||
"body": null
|
||||
},
|
||||
"auth": {
|
||||
"authType": "bearer",
|
||||
"authActive": true,
|
||||
"token": "token123"
|
||||
},
|
||||
"requestVariables": []
|
||||
}
|
||||
],
|
||||
"auth": {
|
||||
"authType": "inherit",
|
||||
"authActive": true
|
||||
},
|
||||
"headers": []
|
||||
}
|
||||
@@ -1,23 +1,23 @@
|
||||
[
|
||||
{
|
||||
"v": 2,
|
||||
"v": 1,
|
||||
"name": "CollectionA",
|
||||
"folders": [
|
||||
{
|
||||
"v": 2,
|
||||
"v": 1,
|
||||
"name": "FolderA",
|
||||
"folders": [
|
||||
{
|
||||
"v": 2,
|
||||
"v": 1,
|
||||
"name": "FolderB",
|
||||
"folders": [
|
||||
{
|
||||
"v": 2,
|
||||
"v": 1,
|
||||
"name": "FolderC",
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"endpoint": "https://echo.hoppscotch.io",
|
||||
"name": "RequestD",
|
||||
"params": [],
|
||||
@@ -53,7 +53,7 @@
|
||||
],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"endpoint": "https://echo.hoppscotch.io",
|
||||
"name": "RequestC",
|
||||
"params": [],
|
||||
@@ -75,7 +75,7 @@
|
||||
"auth": {
|
||||
"authType": "api-key",
|
||||
"authActive": true,
|
||||
"addTo": "HEADERS",
|
||||
"addTo": "Headers",
|
||||
"key": "key",
|
||||
"value": "test-key"
|
||||
},
|
||||
@@ -90,7 +90,7 @@
|
||||
],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"endpoint": "https://echo.hoppscotch.io",
|
||||
"name": "RequestB",
|
||||
"params": [],
|
||||
@@ -119,7 +119,7 @@
|
||||
],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"endpoint": "https://echo.hoppscotch.io",
|
||||
"name": "RequestA",
|
||||
"params": [],
|
||||
@@ -153,16 +153,16 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"v": 2,
|
||||
"v": 1,
|
||||
"name": "CollectionB",
|
||||
"folders": [
|
||||
{
|
||||
"v": 2,
|
||||
"v": 1,
|
||||
"name": "FolderA",
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"endpoint": "https://echo.hoppscotch.io",
|
||||
"name": "RequestB",
|
||||
"params": [],
|
||||
@@ -191,7 +191,7 @@
|
||||
],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"endpoint": "https://echo.hoppscotch.io",
|
||||
"name": "RequestA",
|
||||
"params": [],
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"endpoint": "<<URL>>",
|
||||
"name": "test1",
|
||||
"params": [],
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"endpoint": "https://echo.hoppscotch.io/<<HEADERS_TYPE1>>",
|
||||
"name": "",
|
||||
"params": [],
|
||||
@@ -13,7 +13,10 @@
|
||||
"method": "GET",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
"authActive": true,
|
||||
"addTo": "Headers",
|
||||
"key": "",
|
||||
"value": ""
|
||||
},
|
||||
"preRequestScript": "pw.env.set(\"HEADERS_TYPE1\", \"devblin_local1\");",
|
||||
"testScript": "// Check status code is 200\npwd.test(\"Status code is 200\", ()=> {\n pw.expect(pw.response.status).toBe(200);\n});\n\n// Check JSON response property\npw.test(\"Check JSON response property\", ()=> {\n pw.expect(pw.response.body.method).toBe(\"GET\");\n pw.expect(pw.response.body.headers).toBeType(\"string\");\n});",
|
||||
@@ -21,10 +24,10 @@
|
||||
"contentType": "application/json",
|
||||
"body": "{\n\"test\": \"<<HEADERS_TYPE1>>\"\n}"
|
||||
},
|
||||
"requestVariables": []
|
||||
"requestVariables": [],
|
||||
},
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"endpoint": "https://echo.hoppscotch.dio/<<HEADERS_TYPE2>>",
|
||||
"name": "success",
|
||||
"params": [],
|
||||
@@ -32,7 +35,10 @@
|
||||
"method": "GET",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
"authActive": true,
|
||||
"addTo": "Headers",
|
||||
"key": "",
|
||||
"value": ""
|
||||
},
|
||||
"preRequestScript": "pw.env.setd(\"HEADERS_TYPE2\", \"devblin_local2\");",
|
||||
"testScript": "// Check status code is 200\npw.test(\"Status code is 200\", ()=> {\n pw.expect(pw.response.status).toBe(300);\n});\n\n// Check JSON response property\npw.test(\"Check JSON response property\", ()=> {\n pw.expect(pw.response.body.method).toBe(\"GET\");\n pw.expect(pw.response.body.headers).toBeType(\"object\");\n});",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"folders": [],
|
||||
"requests":
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"endpoint": "https://echo.hoppscotch.io/<<HEADERS_TYPE1>>",
|
||||
"name": "fail",
|
||||
"params": [],
|
||||
@@ -12,7 +12,10 @@
|
||||
"method": "GET",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
"authActive": true,
|
||||
"addTo": "Headers",
|
||||
"key": "",
|
||||
"value": ""
|
||||
},
|
||||
"preRequestScript": "pw.env.set(\"HEADERS_TYPE1\", \"devblin_local1\");",
|
||||
"testScript": "// Check status code is 200\npw.test(\"Status code is 200\", ()=> {\n pw.expect(pw.response.status).toBe(200);\n});\n\n// Check JSON response property\npw.test(\"Check JSON response property\", ()=> {\n pw.expect(pw.response.body.method).toBe(\"GET\");\n pw.expect(pw.response.body.headers).toBeType(\"string\");\n});",
|
||||
@@ -23,7 +26,7 @@
|
||||
"requestVariables": [],
|
||||
},
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"endpoint": "https://echo.hoppscotch.io/<<HEADERS_TYPE2>>",
|
||||
"name": "success",
|
||||
"params": [],
|
||||
@@ -31,7 +34,10 @@
|
||||
"method": "GET",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
"authActive": true,
|
||||
"addTo": "Headers",
|
||||
"key": "",
|
||||
"value": ""
|
||||
},
|
||||
"preRequestScript": "pw.env.set(\"HEADERS_TYPE2\", \"devblin_local2\");",
|
||||
"testScript": "// Check status code is 200\npw.test(\"Status code is 200\", ()=> {\n pw.expect(pw.response.status).toBe(300);\n});\n\n// Check JSON response property\npw.test(\"Check JSON response property\", ()=> {\n pw.expect(pw.response.body.method).toBe(\"GET\");\n pw.expect(pw.response.body.headers).toBeType(\"object\");\n});",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"endpoint": "https://echo.hoppscotch.io/<<HEADERS_TYPE1>>",
|
||||
"name": "",
|
||||
"params": [],
|
||||
@@ -13,7 +13,10 @@
|
||||
"method": "GET",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
"authActive": true,
|
||||
"addTo": "Headers",
|
||||
"key": "",
|
||||
"value": ""
|
||||
},
|
||||
"preRequestScript": "pw.env.set(\"HEADERS_TYPE1\", \"devblin_local1\");",
|
||||
"testScript": "// Check status code is 200\npw.test(\"Status code is 200\", ()=> {\n pw.expect(pw.response.status).toBe(200);\n});\n\n// Check JSON response property\npw.test(\"Check JSON response property\", ()=> {\n pw.expect(pw.response.body.method).toBe(\"GET\");\n pw.expect(pw.response.body.headers).toBeType(\"object\");\n});",
|
||||
@@ -24,7 +27,7 @@
|
||||
"requestVariables": []
|
||||
},
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"endpoint": "https://echo.hoppscotch.io/<<HEADERS_TYPE2>>",
|
||||
"name": "success",
|
||||
"params": [],
|
||||
@@ -32,7 +35,10 @@
|
||||
"method": "GET",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
"authActive": true,
|
||||
"addTo": "Headers",
|
||||
"key": "",
|
||||
"value": ""
|
||||
},
|
||||
"preRequestScript": "pw.env.set(\"HEADERS_TYPE2\", \"devblin_local2\");",
|
||||
"testScript": "// Check status code is 200\npw.test(\"Status code is 200\", ()=> {\n pw.expect(pw.response.status).toBe(200);\n});\n\n// Check JSON response property\npw.test(\"Check JSON response property\", ()=> {\n pw.expect(pw.response.body.method).toBe(\"GET\");\n pw.expect(pw.response.body.headers).toBeType(\"object\");\n});",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"auth": { "authType": "none", "authActive": true },
|
||||
"body": { "body": null, "contentType": null },
|
||||
"name": "sample-req",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"name": "test-request",
|
||||
"endpoint": "https://echo.hoppscotch.io",
|
||||
"method": "POST",
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"v": 1,
|
||||
"name": "tests",
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"v": "2",
|
||||
"endpoint": "<<baseURL>>",
|
||||
"name": "",
|
||||
"params": [],
|
||||
"headers": [],
|
||||
"method": "GET",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
},
|
||||
"preRequestScript": "",
|
||||
"testScript": "// Check status code is 200\npw.test(\"Status code is 200\", ()=> {\n pw.expect(pw.response.status).toBe(200);\n});\n\n// Check JSON response property\npw.test(\"Check JSON response property\", ()=> {\n pw.expect(pw.response.body.method).toBe(\"GET\");\n pw.expect(pw.response.body.headers).toBeType(\"object\");\n});",
|
||||
"body": {
|
||||
"contentType": null,
|
||||
"body": null
|
||||
},
|
||||
"requestVariables": []
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -4,15 +4,9 @@
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
},
|
||||
"body": {
|
||||
"body": null,
|
||||
"contentType": null
|
||||
},
|
||||
"v": "2",
|
||||
"auth": { "authType": "none", "authActive": true },
|
||||
"body": { "body": null, "contentType": null },
|
||||
"name": "test-secret-headers",
|
||||
"method": "GET",
|
||||
"params": [],
|
||||
@@ -24,16 +18,13 @@
|
||||
}
|
||||
],
|
||||
"requestVariables": [],
|
||||
"endpoint": "<<echoHoppBaseURL>>/headers",
|
||||
"testScript": "pw.test(\"Successfully parses secret variable holding the header value\", () => {\n const secretHeaderValue = pw.env.get(\"secretHeaderValue\")\n pw.expect(secretHeaderValue).toBe(\"secret-header-value\")\n \n if (secretHeaderValue) {\n pw.expect(pw.response.body.headers[\"secret-header-key\"]).toBe(secretHeaderValue)\n }\n\n pw.expect(pw.env.get(\"secretHeaderValueFromPreReqScript\")).toBe(\"secret-header-value\")\n})",
|
||||
"endpoint": "<<baseURL>>/headers",
|
||||
"testScript": "pw.test(\"Successfully parses secret variable holding the header value\", () => {\n const secretHeaderValue = pw.env.get(\"secretHeaderValue\")\n pw.expect(secretHeaderValue).toBe(\"secret-header-value\")\n \n if (secretHeaderValue) {\n pw.expect(pw.response.body.headers[\"Secret-Header-Key\"]).toBe(secretHeaderValue)\n }\n\n pw.expect(pw.env.get(\"secretHeaderValueFromPreReqScript\")).toBe(\"secret-header-value\")\n})",
|
||||
"preRequestScript": "const secretHeaderValueFromPreReqScript = pw.env.get(\"secretHeaderValue\")\npw.env.set(\"secretHeaderValueFromPreReqScript\", secretHeaderValueFromPreReqScript)"
|
||||
},
|
||||
{
|
||||
"v": "3",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
},
|
||||
"v": "2",
|
||||
"auth": { "authType": "none", "authActive": true },
|
||||
"body": {
|
||||
"body": "{\n \"secretBodyKey\": \"<<secretBodyValue>>\"\n}",
|
||||
"contentType": "application/json"
|
||||
@@ -43,20 +34,14 @@
|
||||
"params": [],
|
||||
"headers": [],
|
||||
"requestVariables": [],
|
||||
"endpoint": "<<echoHoppBaseURL>>/post",
|
||||
"testScript": "pw.test(\"Successfully parses secret variable holding the request body value\", () => {\n const secretBodyValue = pw.env.get(\"secretBodyValue\")\n pw.expect(secretBodyValue).toBe(\"secret-body-value\")\n \n if (secretBodyValue) {\n pw.expect(JSON.parse(pw.response.body.data).secretBodyKey).toBe(secretBodyValue)\n }\n\n pw.expect(pw.env.get(\"secretBodyValueFromPreReqScript\")).toBe(\"secret-body-value\")\n})",
|
||||
"endpoint": "<<baseURL>>/post",
|
||||
"testScript": "pw.test(\"Successfully parses secret variable holding the request body value\", () => {\n const secretBodyValue = pw.env.get(\"secretBodyValue\")\n pw.expect(secretBodyValue).toBe(\"secret-body-value\")\n \n if (secretBodyValue) {\n pw.expect(pw.response.body.json.secretBodyKey).toBe(secretBodyValue)\n }\n\n pw.expect(pw.env.get(\"secretBodyValueFromPreReqScript\")).toBe(\"secret-body-value\")\n})",
|
||||
"preRequestScript": "const secretBodyValueFromPreReqScript = pw.env.get(\"secretBodyValue\")\npw.env.set(\"secretBodyValueFromPreReqScript\", secretBodyValueFromPreReqScript)"
|
||||
},
|
||||
{
|
||||
"v": "3",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
},
|
||||
"body": {
|
||||
"body": null,
|
||||
"contentType": null
|
||||
},
|
||||
"v": "2",
|
||||
"auth": { "authType": "none", "authActive": true },
|
||||
"body": { "body": null, "contentType": null },
|
||||
"name": "test-secret-query-params",
|
||||
"method": "GET",
|
||||
"params": [
|
||||
@@ -68,33 +53,30 @@
|
||||
],
|
||||
"headers": [],
|
||||
"requestVariables": [],
|
||||
"endpoint": "<<echoHoppBaseURL>>",
|
||||
"endpoint": "<<baseURL>>/get",
|
||||
"testScript": "pw.test(\"Successfully parses secret variable holding the query param value\", () => {\n const secretQueryParamValue = pw.env.get(\"secretQueryParamValue\")\n pw.expect(secretQueryParamValue).toBe(\"secret-query-param-value\")\n \n if (secretQueryParamValue) {\n pw.expect(pw.response.body.args.secretQueryParamKey).toBe(secretQueryParamValue)\n }\n\n pw.expect(pw.env.get(\"secretQueryParamValueFromPreReqScript\")).toBe(\"secret-query-param-value\")\n})",
|
||||
"preRequestScript": "const secretQueryParamValueFromPreReqScript = pw.env.get(\"secretQueryParamValue\")\npw.env.set(\"secretQueryParamValueFromPreReqScript\", secretQueryParamValueFromPreReqScript)"
|
||||
},
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"auth": {
|
||||
"authType": "basic",
|
||||
"password": "<<secretBasicAuthPassword>>",
|
||||
"username": "<<secretBasicAuthUsername>>",
|
||||
"authActive": true
|
||||
},
|
||||
"body": {
|
||||
"body": null,
|
||||
"contentType": null
|
||||
},
|
||||
"body": { "body": null, "contentType": null },
|
||||
"name": "test-secret-basic-auth",
|
||||
"method": "GET",
|
||||
"params": [],
|
||||
"headers": [],
|
||||
"requestVariables": [],
|
||||
"endpoint": "<<httpbinBaseURL>>/basic-auth/<<secretBasicAuthUsername>>/<<secretBasicAuthPassword>>",
|
||||
"testScript": "pw.test(\"Successfully parses secret variables holding basic auth credentials\", () => {\n\tconst secretBasicAuthUsername = pw.env.get(\"secretBasicAuthUsername\")\n \tconst secretBasicAuthPassword = pw.env.get(\"secretBasicAuthPassword\")\n\n pw.expect(secretBasicAuthUsername).toBe(\"test-user\")\n pw.expect(secretBasicAuthPassword).toBe(\"test-pass\")\n\n // The endpoint at times results in a `502` bad gateway\n if (pw.response.status !== 200) {\n return\n }\n\n if (secretBasicAuthUsername && secretBasicAuthPassword) {\n const { authenticated, user } = pw.response.body\n pw.expect(authenticated).toBe(true)\n pw.expect(user).toBe(secretBasicAuthUsername)\n }\n});",
|
||||
"endpoint": "<<baseURL>>/basic-auth/<<secretBasicAuthUsername>>/<<secretBasicAuthPassword>>",
|
||||
"testScript": "pw.test(\"Successfully parses secret variables holding basic auth credentials\", () => {\n\tconst secretBasicAuthUsername = pw.env.get(\"secretBasicAuthUsername\")\n \tconst secretBasicAuthPassword = pw.env.get(\"secretBasicAuthPassword\")\n\n pw.expect(secretBasicAuthUsername).toBe(\"test-user\")\n pw.expect(secretBasicAuthPassword).toBe(\"test-pass\")\n\n if (secretBasicAuthUsername && secretBasicAuthPassword) {\n const { authenticated, user } = pw.response.body\n pw.expect(authenticated).toBe(true)\n pw.expect(user).toBe(secretBasicAuthUsername)\n }\n});",
|
||||
"preRequestScript": ""
|
||||
},
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"auth": {
|
||||
"token": "<<secretBearerToken>>",
|
||||
"authType": "bearer",
|
||||
@@ -102,42 +84,30 @@
|
||||
"username": "testuser",
|
||||
"authActive": true
|
||||
},
|
||||
"body": {
|
||||
"body": null,
|
||||
"contentType": null
|
||||
},
|
||||
"body": { "body": null, "contentType": null },
|
||||
"name": "test-secret-bearer-auth",
|
||||
"method": "GET",
|
||||
"params": [],
|
||||
"headers": [],
|
||||
"requestVariables": [],
|
||||
"endpoint": "<<httpbinBaseURL>>/bearer",
|
||||
"testScript": "pw.test(\"Successfully parses secret variable holding the bearer token\", () => {\n const secretBearerToken = pw.env.get(\"secretBearerToken\")\n const preReqSecretBearerToken = pw.env.get(\"preReqSecretBearerToken\")\n\n pw.expect(secretBearerToken).toBe(\"test-token\")\n\n // Safeguard to prevent test failures due to the endpoint\n if (pw.response.status !== 200) {\n return\n }\n\n if (secretBearerToken) { \n pw.expect(pw.response.body.token).toBe(secretBearerToken)\n pw.expect(preReqSecretBearerToken).toBe(\"test-token\")\n }\n});",
|
||||
"endpoint": "<<baseURL>>/bearer",
|
||||
"testScript": "pw.test(\"Successfully parses secret variable holding the bearer token\", () => {\n const secretBearerToken = pw.env.get(\"secretBearerToken\")\n const preReqSecretBearerToken = pw.env.get(\"preReqSecretBearerToken\")\n\n pw.expect(secretBearerToken).toBe(\"test-token\")\n\n if (secretBearerToken) { \n pw.expect(pw.response.body.token).toBe(secretBearerToken)\n pw.expect(preReqSecretBearerToken).toBe(\"test-token\")\n }\n});",
|
||||
"preRequestScript": "const secretBearerToken = pw.env.get(\"secretBearerToken\")\npw.env.set(\"preReqSecretBearerToken\", secretBearerToken)"
|
||||
},
|
||||
{
|
||||
"v": "3",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
},
|
||||
"body": {
|
||||
"body": null,
|
||||
"contentType": null
|
||||
},
|
||||
"v": "2",
|
||||
"auth": { "authType": "none", "authActive": true },
|
||||
"body": { "body": null, "contentType": null },
|
||||
"name": "test-secret-fallback",
|
||||
"method": "GET",
|
||||
"params": [],
|
||||
"headers": [],
|
||||
"requestVariables": [],
|
||||
"endpoint": "<<echoHoppBaseURL>>",
|
||||
"endpoint": "<<baseURL>>",
|
||||
"testScript": "pw.test(\"Returns an empty string if the value for a secret environment variable is not found in the system environment\", () => {\n pw.expect(pw.env.get(\"nonExistentValueInSystemEnv\")).toBe(\"\")\n})",
|
||||
"preRequestScript": ""
|
||||
}
|
||||
],
|
||||
"auth": {
|
||||
"authType": "inherit",
|
||||
"authActive": false
|
||||
},
|
||||
"auth": { "authType": "inherit", "authActive": false },
|
||||
"headers": []
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"v": 2,
|
||||
"name": "secret-envs-persistence-coll",
|
||||
"name": "secret-envs-setters-coll",
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
@@ -24,12 +24,12 @@
|
||||
"active": true
|
||||
}
|
||||
],
|
||||
"endpoint": "<<echoHoppBaseURL>>",
|
||||
"testScript": "pw.test(\"Successfully parses secret variable holding the header value\", () => {\n const secretHeaderValue = pw.env.getResolve(\"secretHeaderValue\")\n pw.expect(secretHeaderValue).toBe(\"secret-header-value\")\n \n if (secretHeaderValue) {\n pw.expect(pw.response.body.headers[\"secret-header-key\"]).toBe(secretHeaderValue)\n }\n\n pw.expect(pw.env.getResolve(\"secretHeaderValueFromPreReqScript\")).toBe(\"secret-header-value\")\n})",
|
||||
"endpoint": "<<baseURL>>/headers",
|
||||
"testScript": "pw.test(\"Successfully parses secret variable holding the header value\", () => {\n const secretHeaderValue = pw.env.getResolve(\"secretHeaderValue\")\n pw.expect(secretHeaderValue).toBe(\"secret-header-value\")\n \n if (secretHeaderValue) {\n pw.expect(pw.response.body.headers[\"Secret-Header-Key\"]).toBe(secretHeaderValue)\n }\n\n pw.expect(pw.env.getResolve(\"secretHeaderValueFromPreReqScript\")).toBe(\"secret-header-value\")\n})",
|
||||
"preRequestScript": "pw.env.set(\"secretHeaderValue\", \"secret-header-value\")\n\nconst secretHeaderValueFromPreReqScript = pw.env.getResolve(\"secretHeaderValue\")\npw.env.set(\"secretHeaderValueFromPreReqScript\", secretHeaderValueFromPreReqScript)"
|
||||
},
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
@@ -49,12 +49,12 @@
|
||||
"active": true
|
||||
}
|
||||
],
|
||||
"endpoint": "<<echoHoppBaseURL>>",
|
||||
"testScript": "pw.test(\"Value set at the pre-request script takes precedence\", () => {\n const secretHeaderValue = pw.env.getResolve(\"secretHeaderValue\")\n pw.expect(secretHeaderValue).toBe(\"secret-header-value-overriden\")\n \n if (secretHeaderValue) {\n pw.expect(pw.response.body.headers[\"secret-header-key\"]).toBe(secretHeaderValue)\n }\n\n pw.expect(pw.env.getResolve(\"secretHeaderValueFromPreReqScript\")).toBe(\"secret-header-value-overriden\")\n})",
|
||||
"endpoint": "<<baseURL>>/headers",
|
||||
"testScript": "pw.test(\"Value set at the pre-request script takes precedence\", () => {\n const secretHeaderValue = pw.env.getResolve(\"secretHeaderValue\")\n pw.expect(secretHeaderValue).toBe(\"secret-header-value-overriden\")\n \n if (secretHeaderValue) {\n pw.expect(pw.response.body.headers[\"Secret-Header-Key\"]).toBe(secretHeaderValue)\n }\n\n pw.expect(pw.env.getResolve(\"secretHeaderValueFromPreReqScript\")).toBe(\"secret-header-value-overriden\")\n})",
|
||||
"preRequestScript": "pw.env.set(\"secretHeaderValue\", \"secret-header-value-overriden\")\n\nconst secretHeaderValueFromPreReqScript = pw.env.getResolve(\"secretHeaderValue\")\npw.env.set(\"secretHeaderValueFromPreReqScript\", secretHeaderValueFromPreReqScript)"
|
||||
},
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
@@ -68,12 +68,12 @@
|
||||
"params": [],
|
||||
"requestVariables": [],
|
||||
"headers": [],
|
||||
"endpoint": "<<echoHoppBaseURL>>/post",
|
||||
"testScript": "pw.test(\"Successfully parses secret variable holding the request body value\", () => {\n const secretBodyValue = pw.env.get(\"secretBodyValue\")\n pw.expect(secretBodyValue).toBe(\"secret-body-value\")\n \n if (secretBodyValue) {\n pw.expect(JSON.parse(pw.response.body.data).secretBodyKey).toBe(secretBodyValue)\n }\n\n pw.expect(pw.env.get(\"secretBodyValueFromPreReqScript\")).toBe(\"secret-body-value\")\n})",
|
||||
"endpoint": "<<baseURL>>/post",
|
||||
"testScript": "pw.test(\"Successfully parses secret variable holding the request body value\", () => {\n const secretBodyValue = pw.env.get(\"secretBodyValue\")\n pw.expect(secretBodyValue).toBe(\"secret-body-value\")\n \n if (secretBodyValue) {\n pw.expect(pw.response.body.json.secretBodyKey).toBe(secretBodyValue)\n }\n\n pw.expect(pw.env.get(\"secretBodyValueFromPreReqScript\")).toBe(\"secret-body-value\")\n})",
|
||||
"preRequestScript": "const secretBodyValue = pw.env.get(\"secretBodyValue\")\n\nif (!secretBodyValue) { \n pw.env.set(\"secretBodyValue\", \"secret-body-value\")\n}\n\nconst secretBodyValueFromPreReqScript = pw.env.get(\"secretBodyValue\")\npw.env.set(\"secretBodyValueFromPreReqScript\", secretBodyValueFromPreReqScript)"
|
||||
},
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"auth": {
|
||||
"authType": "none",
|
||||
"authActive": true
|
||||
@@ -93,12 +93,12 @@
|
||||
],
|
||||
"requestVariables": [],
|
||||
"headers": [],
|
||||
"endpoint": "<<echoHoppBaseURL>>",
|
||||
"endpoint": "<<baseURL>>/get",
|
||||
"testScript": "pw.test(\"Successfully parses secret variable holding the query param value\", () => {\n const secretQueryParamValue = pw.env.get(\"secretQueryParamValue\")\n pw.expect(secretQueryParamValue).toBe(\"secret-query-param-value\")\n \n if (secretQueryParamValue) {\n pw.expect(pw.response.body.args.secretQueryParamKey).toBe(secretQueryParamValue)\n }\n\n pw.expect(pw.env.get(\"secretQueryParamValueFromPreReqScript\")).toBe(\"secret-query-param-value\")\n})",
|
||||
"preRequestScript": "const secretQueryParamValue = pw.env.get(\"secretQueryParamValue\")\n\nif (!secretQueryParamValue) {\n pw.env.set(\"secretQueryParamValue\", \"secret-query-param-value\")\n}\n\nconst secretQueryParamValueFromPreReqScript = pw.env.get(\"secretQueryParamValue\")\npw.env.set(\"secretQueryParamValueFromPreReqScript\", secretQueryParamValueFromPreReqScript)"
|
||||
},
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"auth": {
|
||||
"authType": "basic",
|
||||
"password": "<<secretBasicAuthPassword>>",
|
||||
@@ -114,12 +114,12 @@
|
||||
"params": [],
|
||||
"requestVariables": [],
|
||||
"headers": [],
|
||||
"endpoint": "<<httpbinBaseURL>>/basic-auth/<<secretBasicAuthUsername>>/<<secretBasicAuthPassword>>",
|
||||
"testScript": "pw.test(\"Successfully parses secret variables holding basic auth credentials\", () => {\n\tconst secretBasicAuthUsername = pw.env.get(\"secretBasicAuthUsername\")\n \tconst secretBasicAuthPassword = pw.env.get(\"secretBasicAuthPassword\")\n\n pw.expect(secretBasicAuthUsername).toBe(\"test-user\")\n pw.expect(secretBasicAuthPassword).toBe(\"test-pass\")\n\n // The endpoint at times results in a `502` bad gateway\n if (pw.response.status !== 200) {\n return\n }\n\n if (secretBasicAuthUsername && secretBasicAuthPassword) {\n const { authenticated, user } = pw.response.body\n pw.expect(authenticated).toBe(true)\n pw.expect(user).toBe(secretBasicAuthUsername)\n }\n});",
|
||||
"endpoint": "<<baseURL>>/basic-auth/<<secretBasicAuthUsername>>/<<secretBasicAuthPassword>>",
|
||||
"testScript": "pw.test(\"Successfully parses secret variables holding basic auth credentials\", () => {\n\tconst secretBasicAuthUsername = pw.env.get(\"secretBasicAuthUsername\")\n \tconst secretBasicAuthPassword = pw.env.get(\"secretBasicAuthPassword\")\n\n pw.expect(secretBasicAuthUsername).toBe(\"test-user\")\n pw.expect(secretBasicAuthPassword).toBe(\"test-pass\")\n\n if (secretBasicAuthUsername && secretBasicAuthPassword) {\n const { authenticated, user } = pw.response.body\n pw.expect(authenticated).toBe(true)\n pw.expect(user).toBe(secretBasicAuthUsername)\n }\n});",
|
||||
"preRequestScript": "let secretBasicAuthUsername = pw.env.get(\"secretBasicAuthUsername\")\n\nlet secretBasicAuthPassword = pw.env.get(\"secretBasicAuthPassword\")\n\nif (!secretBasicAuthUsername) {\n pw.env.set(\"secretBasicAuthUsername\", \"test-user\")\n}\n\nif (!secretBasicAuthPassword) {\n pw.env.set(\"secretBasicAuthPassword\", \"test-pass\")\n}"
|
||||
},
|
||||
{
|
||||
"v": "3",
|
||||
"v": "2",
|
||||
"auth": {
|
||||
"token": "<<secretBearerToken>>",
|
||||
"authType": "bearer",
|
||||
@@ -136,8 +136,8 @@
|
||||
"params": [],
|
||||
"requestVariables": [],
|
||||
"headers": [],
|
||||
"endpoint": "<<httpbinBaseURL>>/bearer",
|
||||
"testScript": "pw.test(\"Successfully parses secret variable holding the bearer token\", () => {\n const secretBearerToken = pw.env.resolve(\"<<secretBearerToken>>\")\n const preReqSecretBearerToken = pw.env.resolve(\"<<preReqSecretBearerToken>>\")\n\n pw.expect(secretBearerToken).toBe(\"test-token\")\n\n // Safeguard to prevent test failures due to the endpoint\n if (pw.response.status !== 200) {\n return\n }\n\n if (secretBearerToken) { \n pw.expect(pw.response.body.token).toBe(secretBearerToken)\n pw.expect(preReqSecretBearerToken).toBe(\"test-token\")\n }\n});",
|
||||
"endpoint": "<<baseURL>>/bearer",
|
||||
"testScript": "pw.test(\"Successfully parses secret variable holding the bearer token\", () => {\n const secretBearerToken = pw.env.resolve(\"<<secretBearerToken>>\")\n const preReqSecretBearerToken = pw.env.resolve(\"<<preReqSecretBearerToken>>\")\n\n pw.expect(secretBearerToken).toBe(\"test-token\")\n\n if (secretBearerToken) { \n pw.expect(pw.response.body.token).toBe(secretBearerToken)\n pw.expect(preReqSecretBearerToken).toBe(\"test-token\")\n }\n});",
|
||||
"preRequestScript": "let secretBearerToken = pw.env.resolve(\"<<secretBearerToken>>\")\n\nif (!secretBearerToken) {\n pw.env.set(\"secretBearerToken\", \"test-token\")\n secretBearerToken = pw.env.resolve(\"<<secretBearerToken>>\")\n}\n\npw.env.set(\"preReqSecretBearerToken\", secretBearerToken)"
|
||||
}
|
||||
],
|
||||
@@ -146,4 +146,4 @@
|
||||
"authActive": false
|
||||
},
|
||||
"headers": []
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
"folders": [],
|
||||
"requests": [
|
||||
{
|
||||
"v": "3",
|
||||
"endpoint": "https://echo.hoppscotch.io/post",
|
||||
"v": "2",
|
||||
"endpoint": "https://httpbin.org/post",
|
||||
"name": "req",
|
||||
"params": [],
|
||||
"headers": [
|
||||
@@ -18,7 +18,7 @@
|
||||
"method": "POST",
|
||||
"auth": { "authType": "none", "authActive": true },
|
||||
"preRequestScript": "pw.env.set(\"preReqVarOne\", \"pre-req-value-one\")\n\npw.env.set(\"preReqVarTwo\", \"pre-req-value-two\")\n\npw.env.set(\"customHeaderValueFromSecretVar\", \"custom-header-secret-value\")\n\npw.env.set(\"customBodyValue\", \"custom-body-value\")",
|
||||
"testScript": "pw.test(\"Secret environment value set from the pre-request script takes precedence\", () => {\n pw.expect(pw.env.get(\"preReqVarOne\")).toBe(\"pre-req-value-one\")\n})\n\npw.test(\"Successfully sets initial value for the secret variable from the pre-request script\", () => {\n pw.env.set(\"postReqVarTwo\", \"post-req-value-two\")\n pw.expect(pw.env.get(\"postReqVarTwo\")).toBe(\"post-req-value-two\")\n})\n\npw.test(\"Successfully resolves secret variable values referred in request headers that are set in pre-request script\", () => {\n pw.expect(pw.response.body.headers[\"custom-header\"]).toBe(\"custom-header-secret-value\")\n})\n\npw.test(\"Successfully resolves secret variable values referred in request body that are set in pre-request script\", () => {\n pw.expect(JSON.parse(pw.response.body.data).key).toBe(\"custom-body-value\")\n})\n\npw.test(\"Secret environment variable set from the post-request script takes precedence\", () => {\n pw.env.set(\"postReqVarOne\", \"post-req-value-one\")\n pw.expect(pw.env.get(\"postReqVarOne\")).toBe(\"post-req-value-one\")\n})\n\npw.test(\"Successfully sets initial value for the secret variable from the post-request script\", () => {\n pw.env.set(\"postReqVarTwo\", \"post-req-value-two\")\n pw.expect(pw.env.get(\"postReqVarTwo\")).toBe(\"post-req-value-two\")\n})\n\npw.test(\"Successfully removes environment variables via the pw.env.unset method\", () => {\n pw.env.unset(\"preReqVarOne\")\n pw.env.unset(\"postReqVarTwo\")\n\n pw.expect(pw.env.get(\"preReqVarOne\")).toBe(undefined)\n pw.expect(pw.env.get(\"postReqVarTwo\")).toBe(undefined)\n})",
|
||||
"testScript": "pw.test(\"Secret environment value set from the pre-request script takes precedence\", () => {\n pw.expect(pw.env.get(\"preReqVarOne\")).toBe(\"pre-req-value-one\")\n})\n\npw.test(\"Successfully sets initial value for the secret variable from the pre-request script\", () => {\n pw.env.set(\"postReqVarTwo\", \"post-req-value-two\")\n pw.expect(pw.env.get(\"postReqVarTwo\")).toBe(\"post-req-value-two\")\n})\n\npw.test(\"Successfully resolves secret variable values referred in request headers that are set in pre-request sccript\", () => {\n pw.expect(pw.response.body.headers[\"Custom-Header\"]).toBe(\"custom-header-secret-value\")\n})\n\npw.test(\"Successfully resolves secret variable values referred in request body that are set in pre-request sccript\", () => {\n pw.expect(pw.response.body.json.key).toBe(\"custom-body-value\")\n})\n\npw.test(\"Secret environment variable set from the post-request script takes precedence\", () => {\n pw.env.set(\"postReqVarOne\", \"post-req-value-one\")\n pw.expect(pw.env.get(\"postReqVarOne\")).toBe(\"post-req-value-one\")\n})\n\npw.test(\"Successfully sets initial value for the secret variable from the post-request script\", () => {\n pw.env.set(\"postReqVarTwo\", \"post-req-value-two\")\n pw.expect(pw.env.get(\"postReqVarTwo\")).toBe(\"post-req-value-two\")\n})\n\npw.test(\"Successfully removes environment variables via the pw.env.unset method\", () => {\n pw.env.unset(\"preReqVarOne\")\n pw.env.unset(\"postReqVarTwo\")\n\n pw.expect(pw.env.get(\"preReqVarOne\")).toBe(undefined)\n pw.expect(pw.env.get(\"postReqVarTwo\")).toBe(undefined)\n})",
|
||||
"body": {
|
||||
"contentType": "application/json",
|
||||
"body": "{\n \"key\": \"<<customBodyValue>>\"\n}"
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"name": "env-v0",
|
||||
"variables": [
|
||||
{
|
||||
"key": "baseURL",
|
||||
"value": "https://echo.hoppscotch.io"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"name": "env-v0",
|
||||
"variables": [
|
||||
{
|
||||
"key": "baseURL",
|
||||
"value": "https://echo.hoppscotch.io",
|
||||
"secret": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -32,12 +32,7 @@
|
||||
"secret": true
|
||||
},
|
||||
{
|
||||
"key": "echoHoppBaseURL",
|
||||
"value": "https://echo.hoppscotch.io",
|
||||
"secret": false
|
||||
},
|
||||
{
|
||||
"key": "httpbinBaseURL",
|
||||
"key": "baseURL",
|
||||
"value": "https://httpbin.org",
|
||||
"secret": false
|
||||
}
|
||||
|
||||
@@ -38,12 +38,7 @@
|
||||
"secret": true
|
||||
},
|
||||
{
|
||||
"key": "echoHoppBaseURL",
|
||||
"value": "https://echo.hoppscotch.io",
|
||||
"secret": false
|
||||
},
|
||||
{
|
||||
"key": "httpbinBaseURL",
|
||||
"key": "baseURL",
|
||||
"value": "https://httpbin.org",
|
||||
"secret": false
|
||||
}
|
||||
|
||||
@@ -3,16 +3,15 @@ import { resolve } from "path";
|
||||
|
||||
import { ExecResponse } from "./types";
|
||||
|
||||
export const runCLI = (args: string, options = {}): Promise<ExecResponse> => {
|
||||
const CLI_PATH = resolve(__dirname, "../../bin/hopp.js");
|
||||
const command = `node ${CLI_PATH} ${args}`;
|
||||
export const runCLI = (args: string, options = {}): Promise<ExecResponse> =>
|
||||
{
|
||||
const CLI_PATH = resolve(__dirname, "../../bin/hopp");
|
||||
const command = `node ${CLI_PATH} ${args}`
|
||||
|
||||
return new Promise((resolve) =>
|
||||
exec(command, options, (error, stdout, stderr) =>
|
||||
resolve({ error, stdout, stderr })
|
||||
)
|
||||
);
|
||||
};
|
||||
return new Promise((resolve) =>
|
||||
exec(command, options, (error, stdout, stderr) => resolve({ error, stdout, stderr }))
|
||||
);
|
||||
}
|
||||
|
||||
export const trimAnsi = (target: string) => {
|
||||
const ansiRegex =
|
||||
@@ -26,18 +25,12 @@ export const getErrorCode = (out: string) => {
|
||||
return ansiTrimmedStr.split(" ")[0];
|
||||
};
|
||||
|
||||
export const getTestJsonFilePath = (
|
||||
file: string,
|
||||
kind: "collection" | "environment"
|
||||
) => {
|
||||
export const getTestJsonFilePath = (file: string, kind: "collection" | "environment") => {
|
||||
const kindDir = {
|
||||
collection: "collections",
|
||||
environment: "environments",
|
||||
}[kind];
|
||||
|
||||
const filePath = resolve(
|
||||
__dirname,
|
||||
`../../src/__tests__/samples/${kindDir}/${file}`
|
||||
);
|
||||
const filePath = resolve(__dirname, `../../src/__tests__/samples/${kindDir}/${file}`);
|
||||
return filePath;
|
||||
};
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import chalk from "chalk";
|
||||
import { Command } from "commander";
|
||||
import * as E from "fp-ts/Either";
|
||||
|
||||
import { version } from "../package.json";
|
||||
import { test } from "./commands/test";
|
||||
import { handleError } from "./handlers/error";
|
||||
@@ -21,7 +20,7 @@ const CLI_AFTER_ALL_TXT = `\nFor more help, head on to ${accent(
|
||||
"https://docs.hoppscotch.io/documentation/clients/cli"
|
||||
)}`;
|
||||
|
||||
const program = new Command();
|
||||
const program = new Command()
|
||||
|
||||
program
|
||||
.name("hopp")
|
||||
|
||||
@@ -6,7 +6,7 @@ import { error } from "../../types/errors";
|
||||
import {
|
||||
HoppEnvKeyPairObject,
|
||||
HoppEnvPair,
|
||||
HoppEnvs,
|
||||
HoppEnvs
|
||||
} from "../../types/request";
|
||||
import { readJsonFile } from "../../utils/mutators";
|
||||
|
||||
@@ -17,7 +17,7 @@ import { readJsonFile } from "../../utils/mutators";
|
||||
*/
|
||||
export async function parseEnvsData(path: string) {
|
||||
const contents = await readJsonFile(path);
|
||||
const envPairs: Array<HoppEnvPair | Record<string, string>> = [];
|
||||
const envPairs: Array<Environment["variables"][number] | HoppEnvPair> = [];
|
||||
|
||||
// The legacy key-value pair format that is still supported
|
||||
const HoppEnvKeyPairResult = HoppEnvKeyPairObject.safeParse(contents);
|
||||
@@ -26,9 +26,7 @@ export async function parseEnvsData(path: string) {
|
||||
const HoppEnvExportObjectResult = Environment.safeParse(contents);
|
||||
|
||||
// Shape of the bulk environment export object that is exported from the app
|
||||
const HoppBulkEnvExportObjectResult = z
|
||||
.array(entityReference(Environment))
|
||||
.safeParse(contents);
|
||||
const HoppBulkEnvExportObjectResult = z.array(entityReference(Environment)).safeParse(contents)
|
||||
|
||||
// CLI doesnt support bulk environments export
|
||||
// Hence we check for this case and throw an error if it matches the format
|
||||
@@ -38,16 +36,13 @@ export async function parseEnvsData(path: string) {
|
||||
|
||||
// Checks if the environment file is of the correct format
|
||||
// If it doesnt match either of them, we throw an error
|
||||
if (
|
||||
!HoppEnvKeyPairResult.success &&
|
||||
HoppEnvExportObjectResult.type === "err"
|
||||
) {
|
||||
if (!HoppEnvKeyPairResult.success && HoppEnvExportObjectResult.type === "err") {
|
||||
throw error({ code: "MALFORMED_ENV_FILE", path, data: error });
|
||||
}
|
||||
|
||||
if (HoppEnvKeyPairResult.success) {
|
||||
for (const [key, value] of Object.entries(HoppEnvKeyPairResult.data)) {
|
||||
envPairs.push({ key, value, secret: false });
|
||||
envPairs.push({ key, value });
|
||||
}
|
||||
} else if (HoppEnvExportObjectResult.type === "ok") {
|
||||
envPairs.push(...HoppEnvExportObjectResult.value.variables);
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { HoppCollection, isHoppRESTRequest } from "@hoppscotch/data";
|
||||
import * as A from "fp-ts/Array";
|
||||
import { CommanderError } from "commander";
|
||||
import { HoppCLIError, HoppErrnoException } from "../types/errors";
|
||||
|
||||
@@ -12,6 +14,48 @@ export const hasProperty = <P extends PropertyKey>(
|
||||
prop: P
|
||||
): target is Record<P, unknown> => prop in target;
|
||||
|
||||
/**
|
||||
* Typeguard to check valid Hoppscotch REST Collection.
|
||||
* @param param The object to be checked.
|
||||
* @returns True, if unknown parameter is valid Hoppscotch REST Collection;
|
||||
* False, otherwise.
|
||||
*/
|
||||
export const isRESTCollection = (param: unknown): param is HoppCollection => {
|
||||
if (!!param && typeof param === "object") {
|
||||
if (!hasProperty(param, "v") || typeof param.v !== "number") {
|
||||
return false;
|
||||
}
|
||||
if (!hasProperty(param, "name") || typeof param.name !== "string") {
|
||||
return false;
|
||||
}
|
||||
if (hasProperty(param, "id") && typeof param.id !== "string") {
|
||||
return false;
|
||||
}
|
||||
if (!hasProperty(param, "requests") || !Array.isArray(param.requests)) {
|
||||
return false;
|
||||
} else {
|
||||
// Checks each requests array to be valid HoppRESTRequest.
|
||||
const checkRequests = A.every(isHoppRESTRequest)(param.requests);
|
||||
if (!checkRequests) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!hasProperty(param, "folders") || !Array.isArray(param.folders)) {
|
||||
return false;
|
||||
} else {
|
||||
// Checks each folder to be valid REST collection.
|
||||
const checkFolders = A.every(isRESTCollection)(param.folders);
|
||||
if (!checkFolders) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
/**
|
||||
* Checks if given error data is of type HoppCLIError, based on existence
|
||||
* of code property.
|
||||
|
||||
@@ -1,46 +1,8 @@
|
||||
import { HoppCollection, HoppRESTRequest } from "@hoppscotch/data";
|
||||
import fs from "fs/promises";
|
||||
import { entityReference } from "verzod";
|
||||
import { z } from "zod";
|
||||
|
||||
import { error } from "../types/errors";
|
||||
import { FormDataEntry } from "../types/request";
|
||||
import { isHoppErrnoException } from "./checks";
|
||||
|
||||
const getValidRequests = (
|
||||
collections: HoppCollection[],
|
||||
collectionFilePath: string
|
||||
) => {
|
||||
return collections.map((collection) => {
|
||||
// Validate requests using zod schema
|
||||
const requestSchemaParsedResult = z
|
||||
.array(entityReference(HoppRESTRequest))
|
||||
.safeParse(collection.requests);
|
||||
|
||||
// Handle validation errors
|
||||
if (!requestSchemaParsedResult.success) {
|
||||
throw error({
|
||||
code: "MALFORMED_COLLECTION",
|
||||
path: collectionFilePath,
|
||||
data: "Please check the collection data.",
|
||||
});
|
||||
}
|
||||
|
||||
// Recursively validate requests in nested folders
|
||||
if (collection.folders.length > 0) {
|
||||
collection.folders = getValidRequests(
|
||||
collection.folders,
|
||||
collectionFilePath
|
||||
);
|
||||
}
|
||||
|
||||
// Return validated collection
|
||||
return {
|
||||
...collection,
|
||||
requests: requestSchemaParsedResult.data,
|
||||
};
|
||||
});
|
||||
};
|
||||
import { error } from "../types/errors";
|
||||
import { isRESTCollection, isHoppErrnoException } from "./checks";
|
||||
import { HoppCollection } from "@hoppscotch/data";
|
||||
|
||||
/**
|
||||
* Parses array of FormDataEntry to FormData.
|
||||
@@ -105,11 +67,7 @@ export async function parseCollectionData(
|
||||
? contents
|
||||
: [contents];
|
||||
|
||||
const collectionSchemaParsedResult = z
|
||||
.array(entityReference(HoppCollection))
|
||||
.safeParse(maybeArrayOfCollections);
|
||||
|
||||
if (!collectionSchemaParsedResult.success) {
|
||||
if (maybeArrayOfCollections.some((x) => !isRESTCollection(x))) {
|
||||
throw error({
|
||||
code: "MALFORMED_COLLECTION",
|
||||
path,
|
||||
@@ -117,5 +75,5 @@ export async function parseCollectionData(
|
||||
});
|
||||
}
|
||||
|
||||
return getValidRequests(collectionSchemaParsedResult.data, path);
|
||||
return maybeArrayOfCollections as HoppCollection[];
|
||||
}
|
||||
|
||||
@@ -109,40 +109,27 @@ export function getEffectiveRESTRequest(
|
||||
key: "Authorization",
|
||||
value: `Basic ${btoa(`${username}:${password}`)}`,
|
||||
});
|
||||
} else if (request.auth.authType === "bearer") {
|
||||
} else if (
|
||||
request.auth.authType === "bearer" ||
|
||||
request.auth.authType === "oauth-2"
|
||||
) {
|
||||
effectiveFinalHeaders.push({
|
||||
active: true,
|
||||
key: "Authorization",
|
||||
value: `Bearer ${parseTemplateString(request.auth.token, envVariables)}`,
|
||||
value: `Bearer ${parseTemplateString(
|
||||
request.auth.token,
|
||||
envVariables
|
||||
)}`,
|
||||
});
|
||||
} else if (request.auth.authType === "oauth-2") {
|
||||
const { addTo } = request.auth;
|
||||
|
||||
if (addTo === "HEADERS") {
|
||||
effectiveFinalHeaders.push({
|
||||
active: true,
|
||||
key: "Authorization",
|
||||
value: `Bearer ${parseTemplateString(request.auth.grantTypeInfo.token, envVariables)}`,
|
||||
});
|
||||
} else if (addTo === "QUERY_PARAMS") {
|
||||
effectiveFinalParams.push({
|
||||
active: true,
|
||||
key: "access_token",
|
||||
value: parseTemplateString(
|
||||
request.auth.grantTypeInfo.token,
|
||||
envVariables
|
||||
),
|
||||
});
|
||||
}
|
||||
} else if (request.auth.authType === "api-key") {
|
||||
const { key, value, addTo } = request.auth;
|
||||
if (addTo === "HEADERS") {
|
||||
if (addTo === "Headers") {
|
||||
effectiveFinalHeaders.push({
|
||||
active: true,
|
||||
key: parseTemplateString(key, envVariables),
|
||||
value: parseTemplateString(value, envVariables),
|
||||
});
|
||||
} else if (addTo === "QUERY_PARAMS") {
|
||||
} else if (addTo === "Query params") {
|
||||
effectiveFinalParams.push({
|
||||
active: true,
|
||||
key: parseTemplateString(key, envVariables),
|
||||
|
||||
@@ -41,10 +41,10 @@ const processVariables = (variable: Environment["variables"][number]) => {
|
||||
...variable,
|
||||
value:
|
||||
"value" in variable ? variable.value : process.env[variable.key] || "",
|
||||
};
|
||||
}
|
||||
}
|
||||
return variable;
|
||||
};
|
||||
return variable
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes given envs, which includes processing each variable in global
|
||||
@@ -56,10 +56,10 @@ const processEnvs = (envs: HoppEnvs) => {
|
||||
const processedEnvs = {
|
||||
global: envs.global.map(processVariables),
|
||||
selected: envs.selected.map(processVariables),
|
||||
};
|
||||
}
|
||||
|
||||
return processedEnvs;
|
||||
};
|
||||
return processedEnvs
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms given request data to request-config used by request-runner to
|
||||
@@ -70,7 +70,7 @@ const processEnvs = (envs: HoppEnvs) => {
|
||||
export const createRequest = (req: EffectiveHoppRESTRequest): RequestConfig => {
|
||||
const config: RequestConfig = {
|
||||
supported: true,
|
||||
displayUrl: req.effectiveFinalDisplayURL,
|
||||
displayUrl: req.effectiveFinalDisplayURL
|
||||
};
|
||||
const { finalBody, finalEndpoint, finalHeaders, finalParams } = getRequest;
|
||||
const reqParams = finalParams(req);
|
||||
@@ -131,7 +131,6 @@ export const requestRunner =
|
||||
let status: number;
|
||||
const baseResponse = await axios(requestConfig);
|
||||
const { config } = baseResponse;
|
||||
// PR-COMMENT: type error
|
||||
const runnerResponse: RequestRunnerResponse = {
|
||||
...baseResponse,
|
||||
endpoint: getRequest.endpoint(config.url),
|
||||
@@ -258,13 +257,10 @@ export const processRequest =
|
||||
let updatedEnvs = <HoppEnvs>{};
|
||||
|
||||
// Fetch values for secret environment variables from system environment
|
||||
const processedEnvs = processEnvs(envs);
|
||||
const processedEnvs = processEnvs(envs)
|
||||
|
||||
// Executing pre-request-script
|
||||
const preRequestRes = await preRequestScriptRunner(
|
||||
request,
|
||||
processedEnvs
|
||||
)();
|
||||
const preRequestRes = await preRequestScriptRunner(request, processedEnvs)();
|
||||
if (E.isLeft(preRequestRes)) {
|
||||
printPreRequestRunner.fail();
|
||||
|
||||
@@ -351,7 +347,7 @@ export const processRequest =
|
||||
*/
|
||||
export const preProcessRequest = (
|
||||
request: HoppRESTRequest,
|
||||
collection: HoppCollection
|
||||
collection: HoppCollection,
|
||||
): HoppRESTRequest => {
|
||||
const tempRequest = Object.assign({}, request);
|
||||
const { headers: parentHeaders, auth: parentAuth } = collection;
|
||||
@@ -376,10 +372,8 @@ export const preProcessRequest = (
|
||||
// Filter out header entries present in the parent (folder/collection) under the same name
|
||||
// This ensures the child headers take precedence over the parent headers
|
||||
const filteredEntries = parentHeaders.filter((parentHeaderEntries) => {
|
||||
return !tempRequest.headers.some(
|
||||
(reqHeaderEntries) => reqHeaderEntries.key === parentHeaderEntries.key
|
||||
);
|
||||
});
|
||||
return !tempRequest.headers.some((reqHeaderEntries) => reqHeaderEntries.key === parentHeaderEntries.key)
|
||||
})
|
||||
tempRequest.headers.push(...filteredEntries);
|
||||
} else if (!tempRequest.headers) {
|
||||
tempRequest.headers = [];
|
||||
|
||||
@@ -10,9 +10,6 @@ module.exports = {
|
||||
parserOptions: {
|
||||
sourceType: "module",
|
||||
requireConfigFile: false,
|
||||
ecmaFeatures: {
|
||||
jsx: false,
|
||||
},
|
||||
},
|
||||
extends: [
|
||||
"@vue/typescript/recommended",
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
"hide_secret": "Hide secret",
|
||||
"label": "Label",
|
||||
"learn_more": "Learn more",
|
||||
"download_here": "Download here",
|
||||
"less": "Less",
|
||||
"more": "More",
|
||||
"new": "New",
|
||||
@@ -104,10 +103,8 @@
|
||||
"auth": {
|
||||
"account_exists": "Account exists with different credential - Login to link both accounts",
|
||||
"all_sign_in_options": "All sign in options",
|
||||
"continue_with_auth_provider": "Continue with {provider}",
|
||||
"continue_with_email": "Continue with Email",
|
||||
"continue_with_github": "Continue with GitHub",
|
||||
"continue_with_github_enterprise": "Continue with GitHub Enterprise",
|
||||
"continue_with_google": "Continue with Google",
|
||||
"continue_with_microsoft": "Continue with Microsoft",
|
||||
"email": "Email",
|
||||
@@ -140,30 +137,9 @@
|
||||
"redirect_no_token_endpoint": "No Token Endpoint Defined",
|
||||
"something_went_wrong_on_oauth_redirect": "Something went wrong during OAuth Redirect",
|
||||
"something_went_wrong_on_token_generation": "Something went wrong on token generation",
|
||||
"token_generation_oidc_discovery_failed": "Failure on token generation: OpenID Connect Discovery Failed",
|
||||
"grant_type": "Grant Type",
|
||||
"grant_type_auth_code": "Authorization Code",
|
||||
"token_fetched_successfully": "Token fetched successfully",
|
||||
"token_fetch_failed": "Failed to fetch token",
|
||||
"validation_failed": "Validation Failed, please check the form fields",
|
||||
"label_authorization_endpoint": "Authorization Endpoint",
|
||||
"label_client_id": "Client ID",
|
||||
"label_client_secret": "Client Secret",
|
||||
"label_code_challenge": "Code Challenge",
|
||||
"label_code_challenge_method": "Code Challenge Method",
|
||||
"label_code_verifier": "Code Verifier",
|
||||
"label_scopes": "Scopes",
|
||||
"label_token_endpoint": "Token Endpoint",
|
||||
"label_use_pkce": "Use PKCE",
|
||||
"label_implicit": "Implicit",
|
||||
"label_password": "Password",
|
||||
"label_username": "Username",
|
||||
"label_auth_code": "Authorization Code",
|
||||
"label_client_credentials": "Client Credentials"
|
||||
"token_generation_oidc_discovery_failed": "Failure on token generation: OpenID Connect Discovery Failed"
|
||||
},
|
||||
"pass_key_by": "Pass by",
|
||||
"pass_by_query_params_label": "Query Parameters",
|
||||
"pass_by_headers_label": "Headers",
|
||||
"password": "Password",
|
||||
"save_to_inherit": "Please save this request in any collection to inherit the authorization",
|
||||
"token": "Token",
|
||||
@@ -175,7 +151,6 @@
|
||||
"different_parent": "Cannot reorder collection with different parent",
|
||||
"edit": "Edit Collection",
|
||||
"import_or_create": "Import or create a collection",
|
||||
"import_collection":"Import Collection",
|
||||
"invalid_name": "Please provide a name for the collection",
|
||||
"invalid_root_move": "Collection already in the root",
|
||||
"moved": "Moved Successfully",
|
||||
@@ -306,7 +281,7 @@
|
||||
"updated": "Environment updated",
|
||||
"value": "Value",
|
||||
"variable": "Variable",
|
||||
"variables": "Variables",
|
||||
"variables":"Variables",
|
||||
"variable_list": "Variable List"
|
||||
},
|
||||
"error": {
|
||||
@@ -318,7 +293,6 @@
|
||||
"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.",
|
||||
"empty_profile_name": "Profile name cannot be empty",
|
||||
"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",
|
||||
@@ -338,7 +312,6 @@
|
||||
"page_not_found": "This page could not be found",
|
||||
"please_install_extension": "Please install the extension and add origin to the extension.",
|
||||
"proxy_error": "Proxy error",
|
||||
"same_profile_name": "Updated profile name is same as the current profile name",
|
||||
"script_fail": "Could not execute pre-request script",
|
||||
"something_went_wrong": "Something went wrong",
|
||||
"test_script_fail": "Could not execute post-request script",
|
||||
@@ -374,8 +347,7 @@
|
||||
"mutations": "Mutations",
|
||||
"schema": "Schema",
|
||||
"subscriptions": "Subscriptions",
|
||||
"switch_connection": "Switch connection",
|
||||
"url_placeholder": "Enter a GraphQL endpoint URL"
|
||||
"switch_connection": "Switch connection"
|
||||
},
|
||||
"graphql_collections": {
|
||||
"title": "GraphQL Collections"
|
||||
@@ -455,7 +427,7 @@
|
||||
"not_found": "Environment variable “{environment}” not found."
|
||||
},
|
||||
"header": {
|
||||
"cookie": "The browser doesn't allow Hoppscotch to set Cookie Headers. Please use Authorization Headers instead. However, our Hoppscotch Desktop App is live now and supports Cookies."
|
||||
"cookie": "The browser doesn't allow Hoppscotch to set the Cookie Header. While we're working on the Hoppscotch Desktop App (coming soon), please use the Authorization Header instead."
|
||||
},
|
||||
"response": {
|
||||
"401_error": "Please check your authentication credentials.",
|
||||
@@ -599,7 +571,6 @@
|
||||
"title": "Request",
|
||||
"type": "Request type",
|
||||
"url": "URL",
|
||||
"url_placeholder": "Enter a URL or paste a cURL command",
|
||||
"variables": "Variables",
|
||||
"view_my_links": "View my links"
|
||||
},
|
||||
@@ -852,13 +823,6 @@
|
||||
"new": "Create new workspace",
|
||||
"switch_to_personal": "Switch to your personal workspace",
|
||||
"title": "Workspaces"
|
||||
},
|
||||
"phrases":{
|
||||
"try": "Try",
|
||||
"import_collections": "Import collections",
|
||||
"create_environment": "Create environment",
|
||||
"create_workspace": "Create workspace",
|
||||
"share_request": "Share request"
|
||||
}
|
||||
},
|
||||
"sse": {
|
||||
@@ -997,8 +961,7 @@
|
||||
"success_invites": "Success invites",
|
||||
"title": "Workspaces",
|
||||
"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.",
|
||||
"search_title": "Team Requests"
|
||||
"we_sent_invite_link_description": "Ask all invitees to check their inbox. Click on the link to join the workspace."
|
||||
},
|
||||
"team_environment": {
|
||||
"deleted": "Environment Deleted",
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
"no": "No",
|
||||
"open_workspace": "Abrir espacio de trabajo",
|
||||
"paste": "Pegar",
|
||||
"prettify": "Formatear",
|
||||
"properties": "Propiedades",
|
||||
"prettify": "Embellecer",
|
||||
"properties": "Properties",
|
||||
"remove": "Eliminar",
|
||||
"rename": "Rename",
|
||||
"restore": "Restaurar",
|
||||
@@ -63,7 +63,7 @@
|
||||
"contact_us": "Contáctanos",
|
||||
"cookies": "Cookies",
|
||||
"copy": "Copiar",
|
||||
"copy_interface_type": "Copiar tipo de interfaz",
|
||||
"copy_interface_type": "Copy interface type",
|
||||
"copy_user_id": "Copiar token de autenticación de usuario",
|
||||
"developer_option": "Opciones para desarrolladores",
|
||||
"developer_option_description": "Herramientas para desarrolladores que ayudan en el desarrollo y mantenimiento de Hoppscotch.",
|
||||
@@ -80,14 +80,14 @@
|
||||
"name": "Hoppscotch",
|
||||
"new_version_found": "Se ha encontrado una nueva versión. Recarga la página para usarla.",
|
||||
"open_in_hoppscotch": "Open in Hoppscotch",
|
||||
"options": "Opciones",
|
||||
"options": "Options",
|
||||
"proxy_privacy_policy": "Política de privacidad de proxy",
|
||||
"reload": "Recargar",
|
||||
"search": "Buscar",
|
||||
"share": "Compartir",
|
||||
"shortcuts": "Atajos",
|
||||
"social_description": "Síguenos en redes sociales para estar al día de las últimas noticias, actualizaciones y lanzamientos.",
|
||||
"social_links": "Redes sociales",
|
||||
"social_description": "Follow us on social media to stay updated with the latest news, updates and releases.",
|
||||
"social_links": "Social links",
|
||||
"spotlight": "Destacar",
|
||||
"status": "Estado",
|
||||
"status_description": "Comprobar el estado del sitio web",
|
||||
@@ -119,27 +119,27 @@
|
||||
},
|
||||
"authorization": {
|
||||
"generate_token": "Generar token",
|
||||
"graphql_headers": "Las cabeceras de autorización se envían como parte de la carga útil de connection_init",
|
||||
"graphql_headers": "Authorization Headers are sent as part of the payload to connection_init",
|
||||
"include_in_url": "Incluir en la URL",
|
||||
"inherited_from": "Heredado {auth} de colección padre {collection} ",
|
||||
"inherited_from": "Inherited from {auth} from Parent Collection {collection} ",
|
||||
"learn": "Aprender",
|
||||
"oauth": {
|
||||
"redirect_auth_server_returned_error": "El servidor de autenticación ha devuelto un estado de error",
|
||||
"redirect_auth_token_request_failed": "Fallo en la solicitud de token de autentificación",
|
||||
"redirect_auth_token_request_invalid_response": "Respuesta no válida del punto final de Token al solicitar un token de autentificación",
|
||||
"redirect_invalid_state": "Valor de estado no válido presente en la redirección",
|
||||
"redirect_no_auth_code": "No hay código de autorización en la redirección",
|
||||
"redirect_no_client_id": "No se ha definido el ID de cliente",
|
||||
"redirect_no_client_secret": "No se ha definido ningún ID secreto de cliente",
|
||||
"redirect_no_code_verifier": "No se ha definido ningún verificador de códigos",
|
||||
"redirect_no_token_endpoint": "No se ha definido ningún punto final de token",
|
||||
"something_went_wrong_on_oauth_redirect": "Algo ha ido mal durante la redirección OAuth",
|
||||
"something_went_wrong_on_token_generation": "Algo salió mal en la generación del token",
|
||||
"token_generation_oidc_discovery_failed": "Fallo en la generación del token: OpenID Connect Discovery Failed"
|
||||
"redirect_auth_server_returned_error": "Auth Server returned an error state",
|
||||
"redirect_auth_token_request_failed": "Request to get the auth token failed",
|
||||
"redirect_auth_token_request_invalid_response": "Invalid Response from the Token Endpoint when requesting for an auth token",
|
||||
"redirect_invalid_state": "Invalid State value present in the redirect",
|
||||
"redirect_no_auth_code": "No Authorization Code present in the redirect",
|
||||
"redirect_no_client_id": "No Client ID defined",
|
||||
"redirect_no_client_secret": "No Client Secret Defined",
|
||||
"redirect_no_code_verifier": "No Code Verifier Defined",
|
||||
"redirect_no_token_endpoint": "No Token Endpoint Defined",
|
||||
"something_went_wrong_on_oauth_redirect": "Something went wrong during OAuth Redirect",
|
||||
"something_went_wrong_on_token_generation": "Something went wrong on token generation",
|
||||
"token_generation_oidc_discovery_failed": "Failure on token generation: OpenID Connect Discovery Failed"
|
||||
},
|
||||
"pass_key_by": "Pasar por",
|
||||
"password": "Contraseña",
|
||||
"save_to_inherit": "Por favor, guarda esta solicitud en cualquier colección para heredar la autorización",
|
||||
"save_to_inherit": "Please save this request in any collection to inherit the authorization",
|
||||
"token": "Token",
|
||||
"type": "Tipo de autorización",
|
||||
"username": "Nombre de usuario"
|
||||
@@ -148,7 +148,7 @@
|
||||
"created": "Colección creada",
|
||||
"different_parent": "No se puede reordenar la colección con un padre diferente",
|
||||
"edit": "Editar colección",
|
||||
"import_or_create": "Importar o crear una colección",
|
||||
"import_or_create": "Import or create a collection",
|
||||
"invalid_name": "Proporciona un nombre válido para la colección.",
|
||||
"invalid_root_move": "La colección ya está en la raíz",
|
||||
"moved": "Movido con éxito",
|
||||
@@ -157,20 +157,20 @@
|
||||
"name_length_insufficient": "El nombre de la colección debe tener al menos 3 caracteres",
|
||||
"new": "Nueva colección",
|
||||
"order_changed": "Orden de colección actualizada",
|
||||
"properties": "Propiedades de la colección",
|
||||
"properties_updated": "Propiedades de la colección actualizadas",
|
||||
"properties": "Collection Properties",
|
||||
"properties_updated": "Collection Properties Updated",
|
||||
"renamed": "Colección renombrada",
|
||||
"request_in_use": "Solicitud en uso",
|
||||
"save_as": "Guardar como",
|
||||
"save_to_collection": "Guardar en la colección",
|
||||
"save_to_collection": "Save to Collection",
|
||||
"select": "Seleccionar colección",
|
||||
"select_location": "Seleccionar ubicación",
|
||||
"select_team": "Seleccionar equipo",
|
||||
"team_collections": "Colecciones de equipos"
|
||||
},
|
||||
"confirm": {
|
||||
"close_unsaved_tab": "¿Seguro que quieres cerrar esta pestaña?",
|
||||
"close_unsaved_tabs": "¿Estás seguro de que quieres cerrar todas las pestañas? {count} pestañas no guardadas se perderán.",
|
||||
"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": "¿Estás seguro de que quieres dejar este equipo?",
|
||||
"logout": "¿Estás seguro de que deseas cerrar la sesión?",
|
||||
"remove_collection": "¿Estás seguro de que deseas eliminar esta colección de forma permanente?",
|
||||
@@ -178,7 +178,7 @@
|
||||
"remove_folder": "¿Estás seguro de que deseas eliminar esta carpeta de forma permanente?",
|
||||
"remove_history": "¿Estás seguro de que deseas eliminar todo el historial de forma permanente?",
|
||||
"remove_request": "¿Estás seguro de que deseas eliminar esta solicitud de forma permanente?",
|
||||
"remove_shared_request": "¿Estás seguro de que quieres eliminar definitivamente esta solicitud compartida?",
|
||||
"remove_shared_request": "Are you sure you want to permanently delete this shared request?",
|
||||
"remove_team": "¿Estás seguro de que deseas eliminar este equipo?",
|
||||
"remove_telemetry": "¿Estás seguro de que deseas darse de baja de la telemetría?",
|
||||
"request_change": "¿Estás seguro de que deseas descartar la solicitud actual, los cambios no guardados se perderán.",
|
||||
@@ -186,35 +186,35 @@
|
||||
"sync": "¿Estás seguro de que deseas sincronizar este espacio de trabajo?"
|
||||
},
|
||||
"context_menu": {
|
||||
"add_parameters": "Añadir a parámetros",
|
||||
"open_request_in_new_tab": "Abrir solicitud en una nueva pestaña",
|
||||
"set_environment_variable": "Establecer como variable"
|
||||
"add_parameters": "Add to parameters",
|
||||
"open_request_in_new_tab": "Open request in new tab",
|
||||
"set_environment_variable": "Set as variable"
|
||||
},
|
||||
"cookies": {
|
||||
"modal": {
|
||||
"cookie_expires": "Expira en",
|
||||
"cookie_name": "Nombre",
|
||||
"cookie_path": "Ruta",
|
||||
"cookie_string": "Cookies",
|
||||
"cookie_value": "Valor",
|
||||
"empty_domain": "Dominio vacio",
|
||||
"empty_domains": "No hay dominios",
|
||||
"enter_cookie_string": "Introducir cookies",
|
||||
"interceptor_no_support": "El interceptor seleccionado actualmente no admite cookies. Seleccione otro interceptor e inténtelo de nuevo.",
|
||||
"managed_tab": "Gestionado",
|
||||
"new_domain_name": "Nuevo nombre de dominio",
|
||||
"no_cookies_in_domain": "No hay cookies para este dominio",
|
||||
"raw_tab": "Sin procesar",
|
||||
"set": "Establecer una cookie"
|
||||
"cookie_expires": "Expires",
|
||||
"cookie_name": "Name",
|
||||
"cookie_path": "Path",
|
||||
"cookie_string": "Cookie string",
|
||||
"cookie_value": "Value",
|
||||
"empty_domain": "Domain is empty",
|
||||
"empty_domains": "Domain list is empty",
|
||||
"enter_cookie_string": "Enter cookie string",
|
||||
"interceptor_no_support": "Your currently selected interceptor does not support cookies. Select a different Interceptor and try again.",
|
||||
"managed_tab": "Managed",
|
||||
"new_domain_name": "New domain name",
|
||||
"no_cookies_in_domain": "No cookies set for this domain",
|
||||
"raw_tab": "Raw",
|
||||
"set": "Set a cookie"
|
||||
}
|
||||
},
|
||||
"count": {
|
||||
"header": "{count} encabezado(s)",
|
||||
"message": "{count} mensaje(s)",
|
||||
"parameter": "{count} parámetro(s)",
|
||||
"protocol": "{count} protocolo(s)",
|
||||
"value": "{cuenta} valor(es)",
|
||||
"variable": "{count} variable(es)"
|
||||
"header": "Encabezado {count}",
|
||||
"message": "Mensaje {count}",
|
||||
"parameter": "Parámetro {count}",
|
||||
"protocol": "Protocolo {count}",
|
||||
"value": "Valor {cuenta}",
|
||||
"variable": "Variable {count}"
|
||||
},
|
||||
"documentation": {
|
||||
"generate": "Generar documentación",
|
||||
@@ -223,26 +223,26 @@
|
||||
"empty": {
|
||||
"authorization": "Esta solicitud no utiliza ninguna autorización.",
|
||||
"body": "Esta solicitud no tiene cuerpo",
|
||||
"collection": "Colección vacía",
|
||||
"collections": "No hay colecciones",
|
||||
"collection": "La colección está vacía",
|
||||
"collections": "Las colecciones están vacías",
|
||||
"documentation": "Conectarse a un punto final de GraphQL para ver la documentación",
|
||||
"endpoint": "El punto final no puede estar vacío",
|
||||
"environments": "No hay entornos",
|
||||
"folder": "Carpeta vacía",
|
||||
"environments": "Los entornos están vacíos",
|
||||
"folder": "La carpeta está vacía",
|
||||
"headers": "Esta solicitud no tiene encabezados",
|
||||
"history": "No hay historial",
|
||||
"invites": "Lista de invitados vacía",
|
||||
"members": "No hay miembros en el equipo",
|
||||
"history": "El historial está vacío",
|
||||
"invites": "La lista de invitados está vacía",
|
||||
"members": "El equipo está vacío",
|
||||
"parameters": "Esta solicitud no tiene ningún parámetro",
|
||||
"pending_invites": "No hay invitaciones pendientes para este equipo",
|
||||
"profile": "Iniciar sesión para ver tu perfil",
|
||||
"protocols": "No hay protocolos",
|
||||
"protocols": "Los protocolos están vacíos",
|
||||
"schema": "Conectarse a un punto final de GraphQL",
|
||||
"shared_requests": "No hay solicitudes compartidas",
|
||||
"shared_requests_logout": "Iniciar sesión para ver sus solicitudes compartidas o crear una nueva",
|
||||
"subscription": "No hay suscripciones",
|
||||
"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": "Nombre del equipo vacío",
|
||||
"teams": "No hay equipos",
|
||||
"teams": "Los equipos están vacíos",
|
||||
"tests": "No hay pruebas para esta solicitud",
|
||||
"shortcodes": "Aún no se han creado Shortcodes"
|
||||
},
|
||||
@@ -250,41 +250,41 @@
|
||||
"add_to_global": "Añadir a Global",
|
||||
"added": "Adición al entorno",
|
||||
"create_new": "Crear un nuevo entorno",
|
||||
"created": "Entorno creado",
|
||||
"created": "Environment created",
|
||||
"deleted": "Eliminar el entorno",
|
||||
"duplicated": "Entorno duplicado",
|
||||
"duplicated": "Environment duplicated",
|
||||
"edit": "Editar entorno",
|
||||
"empty_variables": "No hay variables",
|
||||
"empty_variables": "No variables",
|
||||
"global": "Global",
|
||||
"global_variables": "Variables globales",
|
||||
"import_or_create": "Importar o crear un entorno",
|
||||
"global_variables": "Global variables",
|
||||
"import_or_create": "Import or create a environment",
|
||||
"invalid_name": "Proporciona un nombre válido para el entorno.",
|
||||
"list": "Variables de entorno",
|
||||
"list": "Environment variables",
|
||||
"my_environments": "Mis entornos",
|
||||
"name": "Nombre",
|
||||
"name": "Name",
|
||||
"nested_overflow": "las variables de entorno anidadas están limitadas a 10 niveles",
|
||||
"new": "Nuevo entorno",
|
||||
"no_active_environment": "Ningún entorno activo",
|
||||
"no_active_environment": "No active environment",
|
||||
"no_environment": "Sin entorno",
|
||||
"no_environment_description": "No se ha seleccionado ningún entorno. Elije qué hacer con las siguientes variables.",
|
||||
"quick_peek": "Vistazo rápido al entorno",
|
||||
"replace_with_variable": "Sustituir por variable",
|
||||
"scope": "Ámbito",
|
||||
"quick_peek": "Environment Quick Peek",
|
||||
"replace_with_variable": "Replace with variable",
|
||||
"scope": "Scope",
|
||||
"select": "Seleccionar entorno",
|
||||
"set": "Establecer entorno",
|
||||
"set_as_environment": "Establecer como entorno",
|
||||
"set": "Set environment",
|
||||
"set_as_environment": "Set as environment",
|
||||
"team_environments": "Entornos de trabajo en equipo",
|
||||
"title": "Entornos",
|
||||
"updated": "Entorno actualizado",
|
||||
"value": "Valor",
|
||||
"value": "Value",
|
||||
"variable": "Variable",
|
||||
"variable_list": "Lista de variables"
|
||||
},
|
||||
"error": {
|
||||
"authproviders_load_error": "No se han podido cargar los proveedores de autenticación",
|
||||
"authproviders_load_error": "Unable to load auth providers",
|
||||
"browser_support_sse": "Este navegador no parece ser compatible con los eventos enviados por el servidor.",
|
||||
"check_console_details": "Consulta el registro de la consola para obtener más detalles.",
|
||||
"check_how_to_add_origin": "Comprueba cómo puede añadir un origen",
|
||||
"check_how_to_add_origin": "Check how you can add an origin",
|
||||
"curl_invalid_format": "cURL no está formateado correctamente",
|
||||
"danger_zone": "Zona de peligro",
|
||||
"delete_account": "Tu cuenta es actualmente propietaria en estos equipos:",
|
||||
@@ -300,13 +300,13 @@
|
||||
"json_prettify_invalid_body": "No se puede aplicar embellecedor a un cuerpo inválido, resuelve errores de sintaxis json y vuelve a intentarlo",
|
||||
"network_error": "Parece que hay un error de red. Por favor, inténtalo de nuevo.",
|
||||
"network_fail": "No se pudo enviar la solicitud",
|
||||
"no_collections_to_export": "No hay colecciones para exportar. Crea una colección para empezar.",
|
||||
"no_collections_to_export": "No collections to export. Please create a collection to get started.",
|
||||
"no_duration": "Sin duración",
|
||||
"no_environments_to_export": "No hay entornos para exportar. Por favor, crea un entorno para empezar.",
|
||||
"no_environments_to_export": "No environments to export. Please create an environment to get started.",
|
||||
"no_results_found": "No se han encontrado coincidencias",
|
||||
"page_not_found": "No se ha podido encontrar esta página",
|
||||
"please_install_extension": "Please install the extension and add origin to the extension.",
|
||||
"proxy_error": "Error de proxy",
|
||||
"proxy_error": "Proxy error",
|
||||
"script_fail": "No se pudo ejecutar el script de solicitud previa",
|
||||
"something_went_wrong": "Algo salió mal",
|
||||
"test_script_fail": "No se ha podido ejecutar la secuencia de comandos posterior a la solicitud"
|
||||
@@ -314,15 +314,15 @@
|
||||
"export": {
|
||||
"as_json": "Exportar como JSON",
|
||||
"create_secret_gist": "Crear un Gist secreto",
|
||||
"failed": "Algo ha ido mal al exportar",
|
||||
"failed": "Something went wrong while exporting",
|
||||
"gist_created": "Gist creado",
|
||||
"require_github": "Iniciar sesión con GitHub para crear un Gist secreto",
|
||||
"title": "Exportar"
|
||||
},
|
||||
"filter": {
|
||||
"all": "Todos",
|
||||
"none": "Ninguno",
|
||||
"starred": "Destacado"
|
||||
"all": "All",
|
||||
"none": "None",
|
||||
"starred": "Starred"
|
||||
},
|
||||
"folder": {
|
||||
"created": "Carpeta creada",
|
||||
@@ -333,16 +333,16 @@
|
||||
"renamed": "Carpeta renombrada"
|
||||
},
|
||||
"graphql": {
|
||||
"connection_switch_confirm": "¿Deseas conectarte con el endpoint GraphQL más reciente?",
|
||||
"connection_switch_new_url": "Al cambiar a una pestaña se desconectará de la conexión GraphQL activa. La nueva URL de conexión es",
|
||||
"connection_switch_url": "Estás conectado a un endpoint GraphQL cuya URL de conexión es",
|
||||
"connection_switch_confirm": "Do you want to connect with the latest GraphQL endpoint?",
|
||||
"connection_switch_new_url": "Switching to a tab will disconnected you from the active GraphQL connection. New connection URL is",
|
||||
"connection_switch_url": "You're connected to a GraphQL endpoint the connection URL is",
|
||||
"mutations": "Mutaciones",
|
||||
"schema": "Esquema",
|
||||
"subscriptions": "Suscripciones",
|
||||
"switch_connection": "Cambiar conexión"
|
||||
"switch_connection": "Switch connection"
|
||||
},
|
||||
"graphql_collections": {
|
||||
"title": "Colecciones de GraphQL"
|
||||
"title": "GraphQL Collections"
|
||||
},
|
||||
"group": {
|
||||
"time": "Tiempo",
|
||||
@@ -355,8 +355,8 @@
|
||||
},
|
||||
"helpers": {
|
||||
"authorization": "El encabezado de autorización se generará automáticamente cuando se envía la solicitud.",
|
||||
"collection_properties_authorization": " Esta autorización se establecerá para cada solicitud de esta colección.",
|
||||
"collection_properties_header": "Este encabezado se establecerá para cada solicitud de esta colección.",
|
||||
"collection_properties_authorization": " This authorization will be set for every request in this collection.",
|
||||
"collection_properties_header": "This header will be set for every request in this collection.",
|
||||
"generate_documentation_first": "Generar la documentación primero",
|
||||
"network_fail": "No se puede acceder a la API. Comprueba tu conexión de red y vuelve a intentarlo.",
|
||||
"offline": "Parece estar desconectado. Es posible que los datos de este espacio de trabajo no estén actualizados.",
|
||||
@@ -376,10 +376,10 @@
|
||||
"import": {
|
||||
"collections": "Importar colecciones",
|
||||
"curl": "Importar cURL",
|
||||
"environments_from_gist": "Importar desde Gist",
|
||||
"environments_from_gist_description": "Importar entornos Hoppscotch desde Gist",
|
||||
"environments_from_gist": "Import From Gist",
|
||||
"environments_from_gist_description": "Import Hoppscotch Environments From Gist",
|
||||
"failed": "Importación fallida",
|
||||
"from_file": "Importar desde archivo",
|
||||
"from_file": "Import from File",
|
||||
"from_gist": "Importar desde Gist",
|
||||
"from_gist_description": "Importar desde URL de Gist",
|
||||
"from_insomnia": "Importar desde Insomnia",
|
||||
@@ -394,41 +394,41 @@
|
||||
"from_postman_description": "Importar desde una colección de Postman",
|
||||
"from_url": "Importar desde una URL",
|
||||
"gist_url": "Introduce la URL de Gist",
|
||||
"gql_collections_from_gist_description": "Importar colecciones GraphQL desde Gist",
|
||||
"hoppscotch_environment": "Entorno de Hoppscotch",
|
||||
"hoppscotch_environment_description": "Importar archivo JSON del entorno de Hoppscotch",
|
||||
"import_from_url_invalid_fetch": "No se han podido obtener datos de la url",
|
||||
"import_from_url_invalid_file_format": "Error al importar colecciones",
|
||||
"import_from_url_invalid_type": "Tipo no admitido. Los valores aceptados son \"hoppscotch\", \"openapi\", \"postman\", \"insomnia\".",
|
||||
"import_from_url_success": "Colecciones Importadas",
|
||||
"insomnia_environment_description": "Importar el entorno de Insomnia desde un archivo JSON/YAML",
|
||||
"gql_collections_from_gist_description": "Import GraphQL Collections From Gist",
|
||||
"hoppscotch_environment": "Hoppscotch Environment",
|
||||
"hoppscotch_environment_description": "Import Hoppscotch Environment JSON file",
|
||||
"import_from_url_invalid_fetch": "Couldn't get data from the url",
|
||||
"import_from_url_invalid_file_format": "Error while importing collections",
|
||||
"import_from_url_invalid_type": "Unsupported type. accepted values are 'hoppscotch', 'openapi', 'postman', 'insomnia'",
|
||||
"import_from_url_success": "Collections Imported",
|
||||
"insomnia_environment_description": "Import Insomnia Environment from a JSON/YAML file",
|
||||
"json_description": "Importar colecciones desde un archivo JSON de colecciones de Hoppscotch",
|
||||
"postman_environment": "Entorno de Postman",
|
||||
"postman_environment_description": "Importar entorno de Postman desde un archivo JSON",
|
||||
"postman_environment": "Postman Environment",
|
||||
"postman_environment_description": "Import Postman Environment from a JSON file",
|
||||
"title": "Importar"
|
||||
},
|
||||
"inspections": {
|
||||
"description": "Inspeccionar posibles errores",
|
||||
"description": "Inspect possible errors",
|
||||
"environment": {
|
||||
"add_environment": "Añadir al Entorno",
|
||||
"not_found": "No se ha encontrado la variable de entorno \"{environment}\"."
|
||||
"add_environment": "Add to Environment",
|
||||
"not_found": "Environment variable “{environment}” not found."
|
||||
},
|
||||
"header": {
|
||||
"cookie": "El navegador no permite que Hoppscotch establezca el encabezado Cookie. Mientras trabajamos en la aplicación de escritorio de Hoppscotch (próximamente), por favor utilice el encabezado de autorización en su lugar."
|
||||
"cookie": "The browser doesn't allow Hoppscotch to set the Cookie Header. While we're working on the Hoppscotch Desktop App (coming soon), please use the Authorization Header instead."
|
||||
},
|
||||
"response": {
|
||||
"401_error": "Compruebe tus credenciales de autenticación.",
|
||||
"404_error": "Compruebe la URL de su solicitud y el tipo de método.",
|
||||
"cors_error": "Por favor, comprueba tu configuración de Compartición de Recursos \"Cross-Origin\".",
|
||||
"default_error": "Por favor, comprueba tu solicitud.",
|
||||
"network_error": "Comprueba tu conexión de red."
|
||||
"401_error": "Please check your authentication credentials.",
|
||||
"404_error": "Please check your request URL and method type.",
|
||||
"cors_error": "Please check your Cross-Origin Resource Sharing configuration.",
|
||||
"default_error": "Please check your request.",
|
||||
"network_error": "Please check your network connection."
|
||||
},
|
||||
"title": "Inspeccionador",
|
||||
"title": "Inspector",
|
||||
"url": {
|
||||
"extension_not_installed": "Extensión no instalada.",
|
||||
"extension_unknown_origin": "Asegúrate de haber agregado el origen del punto final de la API a la lista de Extensiones del Navegador Hoppscotch.",
|
||||
"extention_enable_action": "Activar la extensión del navegador",
|
||||
"extention_not_enabled": "Extensión no habilitada."
|
||||
"extension_not_installed": "Extension not installed.",
|
||||
"extension_unknown_origin": "Make sure you've added the API endpoint's origin to the Hoppscotch Browser Extension list.",
|
||||
"extention_enable_action": "Enable Browser Extension",
|
||||
"extention_not_enabled": "Extension not enabled."
|
||||
}
|
||||
},
|
||||
"layout": {
|
||||
@@ -442,10 +442,10 @@
|
||||
"close_unsaved_tab": "Tienes cambios sin guardar",
|
||||
"collections": "Colecciones",
|
||||
"confirm": "Confirmar",
|
||||
"customize_request": "Personalizar solicitud",
|
||||
"customize_request": "Customize Request",
|
||||
"edit_request": "Editar solicitud",
|
||||
"import_export": "Importación y exportación",
|
||||
"share_request": "Compartir solicitud"
|
||||
"share_request": "Share Request"
|
||||
},
|
||||
"mqtt": {
|
||||
"already_subscribed": "Ya estás suscrito a este tema.",
|
||||
@@ -493,7 +493,7 @@
|
||||
},
|
||||
"profile": {
|
||||
"app_settings": "Ajustes de la aplicación",
|
||||
"default_hopp_displayname": "Usuario anónimo",
|
||||
"default_hopp_displayname": "Unnamed User",
|
||||
"editor": "Editor",
|
||||
"editor_description": "Los editores pueden añadir, editar y eliminar solicitudes.",
|
||||
"email_verification_mail": "Se ha enviado un correo electrónico de verificación a tu dirección de correo electrónico. Haz clic en el enlace para verificar tu dirección de correo electrónico.",
|
||||
@@ -526,12 +526,12 @@
|
||||
"enter_curl": "Ingrese cURL",
|
||||
"generate_code": "Generar código",
|
||||
"generated_code": "Código generado",
|
||||
"go_to_authorization_tab": "Ir a la pestaña Autorización",
|
||||
"go_to_body_tab": "Ir a la pestaña de cuerpo",
|
||||
"go_to_authorization_tab": "Go to Authorization tab",
|
||||
"go_to_body_tab": "Go to Body tab",
|
||||
"header_list": "Lista de encabezados",
|
||||
"invalid_name": "Proporciona un nombre para la solicitud.",
|
||||
"method": "Método",
|
||||
"moved": "Solicitud movida",
|
||||
"moved": "Request moved",
|
||||
"name": "Nombre de solicitud",
|
||||
"new": "Nueva solicitud",
|
||||
"order_changed": "Orden de solicitudes actualizadas",
|
||||
@@ -543,8 +543,8 @@
|
||||
"path": "Ruta",
|
||||
"payload": "Carga útil",
|
||||
"query": "Consulta",
|
||||
"raw_body": "cuerpo sin procesar",
|
||||
"rename": "Renombrar solicitud",
|
||||
"raw_body": "Cuerpo de solicitud sin procesar",
|
||||
"rename": "Rename Request",
|
||||
"renamed": "Solicitud renombrada",
|
||||
"run": "Ejecutar",
|
||||
"save": "Guardar",
|
||||
@@ -552,8 +552,8 @@
|
||||
"saved": "Solicitud guardada",
|
||||
"share": "Compartir",
|
||||
"share_description": "Comparte Hoppscotch con tus amigos",
|
||||
"share_request": "Compartir solicitud",
|
||||
"stop": "Detener",
|
||||
"share_request": "Share Request",
|
||||
"stop": "Stop",
|
||||
"title": "Solicitud",
|
||||
"type": "Tipo de solicitud",
|
||||
"url": "URL",
|
||||
@@ -571,7 +571,7 @@
|
||||
"json": "JSON",
|
||||
"pdf": "PDF",
|
||||
"preview_html": "Vista previa de HTML",
|
||||
"raw": "Sin procesar",
|
||||
"raw": "Crudo",
|
||||
"size": "Tamaño",
|
||||
"status": "Estado",
|
||||
"time": "Tiempo",
|
||||
@@ -635,29 +635,29 @@
|
||||
"verify_email": "Verificar correo electrónico"
|
||||
},
|
||||
"shared_requests": {
|
||||
"button": "Botón",
|
||||
"button_info": "Crea un botón \"Ejecutar en Hoppscotch\" para tu página web, blog o un README.",
|
||||
"copy_html": "Copiar HTML",
|
||||
"copy_link": "Copiar enlace",
|
||||
"copy_markdown": "Copiar Markdown",
|
||||
"creating_widget": "Crear widget",
|
||||
"customize": "Personalizar",
|
||||
"deleted": "Solicitud compartida eliminada",
|
||||
"description": "Selecciona un widget, puedes cambiarlo y personalizarlo más tarde",
|
||||
"embed": "Incrustar",
|
||||
"embed_info": "Añada un mini \"Hoppscotch API Playground\" a tu sitio web, blog o documentación.",
|
||||
"link": "Enlace",
|
||||
"link_info": "Crea un enlace compartible para compartirlo con cualquier persona en Internet con acceso de visualización.",
|
||||
"modified": "Solicitud compartida modificada",
|
||||
"not_found": "Solicitud compartida no encontrada",
|
||||
"open_new_tab": "Abrir en una nueva pestaña",
|
||||
"preview": "Vista previa",
|
||||
"run_in_hoppscotch": "Correr en Hoppscotch",
|
||||
"button": "Button",
|
||||
"button_info": "Create a 'Run in Hoppscotch' button for your website, blog or a README.",
|
||||
"copy_html": "Copy HTML",
|
||||
"copy_link": "Copy Link",
|
||||
"copy_markdown": "Copy Markdown",
|
||||
"creating_widget": "Creating widget",
|
||||
"customize": "Customize",
|
||||
"deleted": "Shared request deleted",
|
||||
"description": "Select a widget, you can change and customize this later",
|
||||
"embed": "Embed",
|
||||
"embed_info": "Add a mini 'Hoppscotch API Playground' to your website, blog or documentation.",
|
||||
"link": "Link",
|
||||
"link_info": "Create a shareable link to share with anyone on the internet with view access.",
|
||||
"modified": "Shared request modified",
|
||||
"not_found": "Shared request not found",
|
||||
"open_new_tab": "Open in new tab",
|
||||
"preview": "Preview",
|
||||
"run_in_hoppscotch": "Run in Hoppscotch",
|
||||
"theme": {
|
||||
"dark": "Oscuro",
|
||||
"light": "Claro",
|
||||
"system": "Sistema",
|
||||
"title": "Tema"
|
||||
"dark": "Dark",
|
||||
"light": "Light",
|
||||
"system": "System",
|
||||
"title": "Theme"
|
||||
}
|
||||
},
|
||||
"shortcut": {
|
||||
@@ -684,8 +684,8 @@
|
||||
"title": "Navegación"
|
||||
},
|
||||
"others": {
|
||||
"prettify": "Formatear el contenido del editor",
|
||||
"title": "Otros"
|
||||
"prettify": "Prettify Editor's Content",
|
||||
"title": "Others"
|
||||
},
|
||||
"request": {
|
||||
"delete_method": "Seleccionar método DELETE",
|
||||
@@ -697,13 +697,13 @@
|
||||
"post_method": "Seleccionar método POST",
|
||||
"previous_method": "Seleccionar método anterior",
|
||||
"put_method": "Seleccionar método PUT",
|
||||
"rename": "Renombrar solicitud",
|
||||
"rename": "Rename Request",
|
||||
"reset_request": "Solicitud de reinicio",
|
||||
"save_request": "Guardar solicitud",
|
||||
"save_request": "Save Request",
|
||||
"save_to_collections": "Guardar en colecciones",
|
||||
"send_request": "Enviar solicitud",
|
||||
"share_request": "Compartir solicitud",
|
||||
"show_code": "Generar fragmento de código",
|
||||
"share_request": "Share Request",
|
||||
"show_code": "Generate code snippet",
|
||||
"title": "Solicitud",
|
||||
"copy_request_link": "Copiar enlace de solicitud"
|
||||
},
|
||||
@@ -722,95 +722,95 @@
|
||||
},
|
||||
"show": {
|
||||
"code": "Mostrar código",
|
||||
"collection": "Ampliar el panel de colecciones",
|
||||
"collection": "Expand Collection Panel",
|
||||
"more": "Mostrar más",
|
||||
"sidebar": "Mostrar barra lateral"
|
||||
},
|
||||
"socketio": {
|
||||
"communication": "Comunicación",
|
||||
"connection_not_authorized": "Esta conexión SocketIO no utiliza ningún tipo de autenticación.",
|
||||
"connection_not_authorized": "This SocketIO connection does not use any authentication.",
|
||||
"event_name": "Nombre del evento",
|
||||
"events": "Eventos",
|
||||
"log": "Registro",
|
||||
"url": "URL"
|
||||
},
|
||||
"spotlight": {
|
||||
"change_language": "Cambiar idioma",
|
||||
"change_language": "Change Language",
|
||||
"environments": {
|
||||
"delete": "Borrar el entorno actual",
|
||||
"duplicate": "Duplicar el entorno actual",
|
||||
"duplicate_global": "Entorno global duplicado",
|
||||
"edit": "Editar el entorno actual",
|
||||
"edit_global": "Editar el entorno global",
|
||||
"new": "Crear un nuevo entorno",
|
||||
"new_variable": "Crear una nueva variable de entorno",
|
||||
"title": "Entornos"
|
||||
"delete": "Delete current environment",
|
||||
"duplicate": "Duplicate current environment",
|
||||
"duplicate_global": "Duplicate global environment",
|
||||
"edit": "Edit current environment",
|
||||
"edit_global": "Edit global environment",
|
||||
"new": "Create new environment",
|
||||
"new_variable": "Create a new environment variable",
|
||||
"title": "Environments"
|
||||
},
|
||||
"general": {
|
||||
"chat": "Chatear con el servicio de asistencia",
|
||||
"help_menu": "Ayuda y asistencia",
|
||||
"open_docs": "Leer la documentación",
|
||||
"open_github": "Abrir repositorio de GitHub",
|
||||
"open_keybindings": "Atajos de teclado",
|
||||
"chat": "Chat with support",
|
||||
"help_menu": "Help and support",
|
||||
"open_docs": "Read Documentation",
|
||||
"open_github": "Open GitHub repository",
|
||||
"open_keybindings": "Keyboard shortcuts",
|
||||
"social": "Social",
|
||||
"title": "General"
|
||||
},
|
||||
"graphql": {
|
||||
"connect": "Conectarse al servidor",
|
||||
"disconnect": "Desconectarse del servidor"
|
||||
"connect": "Connect to server",
|
||||
"disconnect": "Disconnect from server"
|
||||
},
|
||||
"miscellaneous": {
|
||||
"invite": "Invita a tus amigos a Hoppscotch",
|
||||
"title": "Varios"
|
||||
"invite": "Invite your friends to Hoppscotch",
|
||||
"title": "Miscellaneous"
|
||||
},
|
||||
"request": {
|
||||
"save_as_new": "Guardar como nueva solicitud",
|
||||
"select_method": "Seleccionar método",
|
||||
"switch_to": "Cambiar a",
|
||||
"tab_authorization": "Pestaña de autorización",
|
||||
"tab_body": "Pestaña de cuerpo",
|
||||
"tab_headers": "Pestaña de encabezados",
|
||||
"tab_parameters": "Pestaña de parámetros",
|
||||
"tab_pre_request_script": "Pestaña del script de pre-solicitud",
|
||||
"tab_query": "Pestaña de consulta",
|
||||
"tab_tests": "Pestaña de pruebas",
|
||||
"tab_variables": "Pestaña de variables"
|
||||
"save_as_new": "Save as new request",
|
||||
"select_method": "Select method",
|
||||
"switch_to": "Switch to",
|
||||
"tab_authorization": "Authorization tab",
|
||||
"tab_body": "Body tab",
|
||||
"tab_headers": "Headers tab",
|
||||
"tab_parameters": "Parameters tab",
|
||||
"tab_pre_request_script": "Pre-request script tab",
|
||||
"tab_query": "Query tab",
|
||||
"tab_tests": "Tests tab",
|
||||
"tab_variables": "Variables tab"
|
||||
},
|
||||
"response": {
|
||||
"copy": "Copiar respuesta",
|
||||
"download": "Descargar la respuesta como archivo",
|
||||
"title": "Respuesta"
|
||||
"copy": "Copy response",
|
||||
"download": "Download response as file",
|
||||
"title": "Response"
|
||||
},
|
||||
"section": {
|
||||
"interceptor": "Interceptor",
|
||||
"interface": "Interfaz",
|
||||
"theme": "Tema",
|
||||
"user": "Usuario"
|
||||
"interface": "Interface",
|
||||
"theme": "Theme",
|
||||
"user": "User"
|
||||
},
|
||||
"settings": {
|
||||
"change_interceptor": "Cambiar Interceptor",
|
||||
"change_language": "Cambiar idioma",
|
||||
"change_interceptor": "Change Interceptor",
|
||||
"change_language": "Change Language",
|
||||
"theme": {
|
||||
"black": "Negro",
|
||||
"dark": "Oscuro",
|
||||
"light": "Claro",
|
||||
"system": "Preferencia del sistema"
|
||||
"black": "Black",
|
||||
"dark": "Dark",
|
||||
"light": "Light",
|
||||
"system": "System preference"
|
||||
}
|
||||
},
|
||||
"tab": {
|
||||
"close_current": "Cerrar la pestaña actual",
|
||||
"close_others": "Cerrar todas las demás pestañas",
|
||||
"duplicate": "Duplicar pestaña actual",
|
||||
"new_tab": "Abrir una nueva pestaña",
|
||||
"title": "Pestañas"
|
||||
"close_current": "Close current tab",
|
||||
"close_others": "Close all other tabs",
|
||||
"duplicate": "Duplicate current tab",
|
||||
"new_tab": "Open a new tab",
|
||||
"title": "Tabs"
|
||||
},
|
||||
"workspace": {
|
||||
"delete": "Borrar el equipo actual",
|
||||
"edit": "Editar el equipo actual",
|
||||
"invite": "Invitar al equipo",
|
||||
"new": "Crear un nuevo equipo",
|
||||
"switch_to_personal": "Cambia a tu espacio de trabajo personal",
|
||||
"title": "Equipos"
|
||||
"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": "Teams"
|
||||
}
|
||||
},
|
||||
"sse": {
|
||||
@@ -825,10 +825,10 @@
|
||||
"connected": "Conectado",
|
||||
"connected_to": "Conectado a {name}",
|
||||
"connecting_to": "Conectando con {name}...",
|
||||
"connection_error": "Error de conexión",
|
||||
"connection_failed": "Conexión fallida",
|
||||
"connection_error": "Failed to connect",
|
||||
"connection_failed": "Error de conexión",
|
||||
"connection_lost": "Conexión perdida",
|
||||
"copied_interface_to_clipboard": "Copiado tipo de interfaz {language} al portapapeles",
|
||||
"copied_interface_to_clipboard": "Copied {language} interface type to clipboard",
|
||||
"copied_to_clipboard": "Copiado al portapapeles",
|
||||
"deleted": "Eliminado",
|
||||
"deprecated": "OBSOLETO",
|
||||
@@ -836,21 +836,21 @@
|
||||
"disconnected": "Desconectado",
|
||||
"disconnected_from": "Desconectado de {name}",
|
||||
"docs_generated": "Documentación generada",
|
||||
"download_failed": "Descarga fallida",
|
||||
"download_failed": "Download failed",
|
||||
"download_started": "Descarga iniciada",
|
||||
"enabled": "Activado",
|
||||
"file_imported": "Archivo importado",
|
||||
"finished_in": "Terminado en {duration}ms",
|
||||
"hide": "Ocultar",
|
||||
"finished_in": "Terminado en {duration} ms",
|
||||
"hide": "Hide",
|
||||
"history_deleted": "Historial eliminado",
|
||||
"linewrap": "Envolver líneas",
|
||||
"loading": "Cargando...",
|
||||
"message_received": "Mensaje: llegó {message} al: {topic}",
|
||||
"message_received": "Mensaje: {mensaje} llegó sobre el tema: {topic}",
|
||||
"mqtt_subscription_failed": "Algo ha ido mal al suscribirse al tema: {topic}",
|
||||
"none": "Ninguno",
|
||||
"nothing_found": "Nada encontrado para",
|
||||
"published_error": "Algo ha ido mal al publicar el mensaje: {message} al tema: {topic}",
|
||||
"published_message": "Mensaje publicado: {message} al tema: {topic}",
|
||||
"published_error": "Algo ha ido mal al publicar el mensaje: {topic} al tema: {message}",
|
||||
"published_message": "Mensaje publicado: {mensaje} al tema: {topic}",
|
||||
"reconnection_error": "Fallo en la reconexión",
|
||||
"show": "Show",
|
||||
"subscribed_failed": "Error al suscribirse al tema: {topic}",
|
||||
@@ -874,12 +874,12 @@
|
||||
"tab": {
|
||||
"authorization": "Autorización",
|
||||
"body": "Cuerpo",
|
||||
"close": "Cerrar pestaña",
|
||||
"close_others": "Cerrar otras pestañas",
|
||||
"close": "Close Tab",
|
||||
"close_others": "Close other Tabs",
|
||||
"collections": "Colecciones",
|
||||
"documentation": "Documentación",
|
||||
"duplicate": "Duplicar pestaña",
|
||||
"environments": "Entornos",
|
||||
"duplicate": "Duplicate Tab",
|
||||
"environments": "Environments",
|
||||
"headers": "Encabezados",
|
||||
"history": "Historial",
|
||||
"mqtt": "MQTT",
|
||||
@@ -888,7 +888,7 @@
|
||||
"queries": "Consultas",
|
||||
"query": "Consulta",
|
||||
"schema": "Esquema",
|
||||
"shared_requests": "Solicitudes compartidas",
|
||||
"shared_requests": "Shared Requests",
|
||||
"socketio": "Socket.IO",
|
||||
"sse": "SSE",
|
||||
"tests": "Pruebas",
|
||||
@@ -905,7 +905,7 @@
|
||||
"email_do_not_match": "El correo electrónico no coincide con los datos de tu cuenta. Ponte en contacto con el propietario de tu equipo.",
|
||||
"exit": "Salir del equipo",
|
||||
"exit_disabled": "Solo el propietario puede salir del equipo",
|
||||
"failed_invites": "Invitaciones fallidas",
|
||||
"failed_invites": "Failed invites",
|
||||
"invalid_coll_id": "Identificador de colección no válido",
|
||||
"invalid_email_format": "El formato de correo electrónico no es válido",
|
||||
"invalid_id": "Identificador de equipo inválido. Ponte en contacto con el propietario de tu equipo.",
|
||||
@@ -915,7 +915,7 @@
|
||||
"invite": "Invitar",
|
||||
"invite_more": "Invitar a más",
|
||||
"invite_tooltip": "Invite a personas a este espacio de trabajo",
|
||||
"invited_to_team": "{owner} te ha invitado al equipo {team}",
|
||||
"invited_to_team": "{owner} te ha invitado a unirte al {tema}",
|
||||
"join": "Invitación aceptada",
|
||||
"join_beta": "Únete al programa beta para acceder a los equipos.",
|
||||
"join_team": "Entrar a {team}",
|
||||
@@ -930,7 +930,7 @@
|
||||
"member_removed": "Usuario eliminado",
|
||||
"member_role_updated": "Funciones de usuario actualizadas",
|
||||
"members": "Miembros",
|
||||
"more_members": "+{count} más",
|
||||
"more_members": "+{count} more",
|
||||
"name_length_insufficient": "El nombre del equipo debe tener al menos 6 caracteres",
|
||||
"name_updated": "Nombre de equipo actualizado",
|
||||
"new": "Nuevo equipo",
|
||||
@@ -944,13 +944,13 @@
|
||||
"parent_coll_move": "No se puede mover la colección a una colección hija",
|
||||
"pending_invites": "Invitaciones pendientes",
|
||||
"permissions": "Permisos",
|
||||
"same_target_destination": "Mismo objetivo y destino",
|
||||
"same_target_destination": "Same target and destination",
|
||||
"saved": "Equipo guardado",
|
||||
"select_a_team": "Seleccionar un equipo",
|
||||
"success_invites": "Invitaciones con éxito",
|
||||
"success_invites": "Success invites",
|
||||
"title": "Equipos",
|
||||
"we_sent_invite_link": "¡Hemos enviado un enlace de invitación a todos los invitados!",
|
||||
"we_sent_invite_link_description": "Pide a todos los invitados que revisen su bandeja de entrada. Tienen que hacer clic en el enlace para unirse al equipo."
|
||||
"we_sent_invite_link_description": "Pide a todos los invitados que revisen tu bandeja de entrada. Haz clic en el enlace para unirse al equipo."
|
||||
},
|
||||
"team_environment": {
|
||||
"deleted": "Entorno eliminado",
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"action": {
|
||||
"add": "Ajouter",
|
||||
"autoscroll": "Auto-scroll",
|
||||
"add": "Add",
|
||||
"autoscroll": "Autoscroll",
|
||||
"cancel": "Annuler",
|
||||
"choose_file": "Choisir un fichier",
|
||||
"clear": "Effacer",
|
||||
"clear_all": "Tout effacer",
|
||||
"clear_history": "Effacer tout l'historique",
|
||||
"close": "Fermer",
|
||||
"clear_history": "Clear all History",
|
||||
"close": "Close",
|
||||
"connect": "Connecter",
|
||||
"connecting": "Connexion",
|
||||
"connecting": "Connecting",
|
||||
"copy": "Copier",
|
||||
"create": "Create",
|
||||
"delete": "Supprimer",
|
||||
@@ -22,8 +22,8 @@
|
||||
"edit": "Éditer",
|
||||
"filter": "Filter",
|
||||
"go_back": "Retour",
|
||||
"go_forward": "Avancer",
|
||||
"group_by": "Grouper par",
|
||||
"go_forward": "Go forward",
|
||||
"group_by": "Group by",
|
||||
"label": "Étiqueter",
|
||||
"learn_more": "En savoir plus",
|
||||
"less": "Moins",
|
||||
@@ -35,16 +35,16 @@
|
||||
"prettify": "Formater",
|
||||
"properties": "Properties",
|
||||
"remove": "Supprimer",
|
||||
"rename": "Renommer",
|
||||
"rename": "Rename",
|
||||
"restore": "Restaurer",
|
||||
"save": "Sauvegarder",
|
||||
"scroll_to_bottom": "Défiler vers le bas",
|
||||
"scroll_to_top": "Défiler vers le haut",
|
||||
"scroll_to_bottom": "Scroll to bottom",
|
||||
"scroll_to_top": "Scroll to top",
|
||||
"search": "Chercher",
|
||||
"send": "Envoyer",
|
||||
"share": "Share",
|
||||
"start": "Démarrer",
|
||||
"starting": "Démarrage",
|
||||
"starting": "Starting",
|
||||
"stop": "Arrêter",
|
||||
"to_close": "pour fermer",
|
||||
"to_navigate": "pour naviguer",
|
||||
@@ -86,8 +86,8 @@
|
||||
"search": "Chercher",
|
||||
"share": "Partager",
|
||||
"shortcuts": "Raccourcis",
|
||||
"social_description": "Suivez-nous sur les médias sociaux pour rester informé des dernières nouvelles, mises à jour et communiqués.",
|
||||
"social_links": "Liens sociaux",
|
||||
"social_description": "Follow us on social media to stay updated with the latest news, updates and releases.",
|
||||
"social_links": "Social links",
|
||||
"spotlight": "Projecteur",
|
||||
"status": "Statut",
|
||||
"status_description": "Vérifier l'état du site web",
|
||||
@@ -95,7 +95,7 @@
|
||||
"twitter": "Twitter",
|
||||
"type_a_command_search": "Tapez une commande ou recherchez…",
|
||||
"we_use_cookies": "Nous utilisons des cookies",
|
||||
"whats_new": "Quoi de neuf ?",
|
||||
"whats_new": "Quoi de neuf?",
|
||||
"wiki": "Wiki"
|
||||
},
|
||||
"auth": {
|
||||
@@ -119,38 +119,39 @@
|
||||
},
|
||||
"authorization": {
|
||||
"generate_token": "Générer un jeton",
|
||||
"graphql_headers": "Les en-têtes d'autorisation sont envoyés en tant que partie de la charge utile de connection_init.",
|
||||
"graphql_headers": "Authorization Headers are sent as part of the payload to connection_init",
|
||||
"include_in_url": "Inclure dans l'URL",
|
||||
"inherited_from": "Inherited from {auth} from Parent Collection {collection} ",
|
||||
"learn": "Apprendre comment",
|
||||
"oauth": {
|
||||
"redirect_auth_server_returned_error": "Auth Server returned an error state",
|
||||
"redirect_auth_token_request_failed": "Request to get the auth token failed",
|
||||
"redirect_auth_token_request_invalid_response": "Invalid Response from the Token Endpoint when requesting for an auth token",
|
||||
"redirect_invalid_state": "Invalid State value present in the redirect",
|
||||
"redirect_no_auth_code": "No Authorization Code present in the redirect",
|
||||
"redirect_no_client_id": "No Client ID defined",
|
||||
"redirect_no_client_secret": "No Client Secret Defined",
|
||||
"redirect_no_code_verifier": "No Code Verifier Defined",
|
||||
"redirect_no_token_endpoint": "No Token Endpoint Defined",
|
||||
"something_went_wrong_on_oauth_redirect": "Something went wrong during OAuth Redirect",
|
||||
"something_went_wrong_on_token_generation": "Something went wrong on token generation",
|
||||
"token_generation_oidc_discovery_failed": "Failure on token generation: OpenID Connect Discovery Failed"
|
||||
},
|
||||
"pass_key_by": "Pass by",
|
||||
"password": "Mot de passe",
|
||||
"save_to_inherit": "Please save this request in any collection to inherit the authorization",
|
||||
"token": "Jeton",
|
||||
"type": "Type d'autorisation",
|
||||
"username": "Nom d'utilisateur",
|
||||
"oauth": {
|
||||
"something_went_wrong_on_token_generation": "Un problème s'est produit lors de la génération des jetons",
|
||||
"redirect_auth_server_returned_error": "Le serveur d'authentification a renvoyé un état d'erreur",
|
||||
"redirect_no_auth_code": "Pas de code d'autorisation dans la redirection",
|
||||
"redirect_invalid_state": "Valeur d'état non valide présente dans la redirection",
|
||||
"redirect_no_token_endpoint": "Aucun point de terminaison de jeton n'est défini",
|
||||
"redirect_no_client_id": "Pas d'ID client défini",
|
||||
"redirect_no_client_secret": "Pas de secret client défini",
|
||||
"redirect_no_code_verifier": "Pas de vérificateur de code défini",
|
||||
"redirect_auth_token_request_failed": "La demande d'obtention du jeton d'authentification a échoué",
|
||||
"redirect_auth_token_request_invalid_response": "Réponse invalide du point de terminaison Token lors de la demande d'un jeton d'authentification",
|
||||
"something_went_wrong_on_oauth_redirect": "Quelque chose s'est mal passé lors de la redirection OAuth"
|
||||
}
|
||||
"username": "Nom d'utilisateur"
|
||||
},
|
||||
"collection": {
|
||||
"created": "Collection créée",
|
||||
"different_parent": "Impossible de réorganiser une collection dont le parent est différent",
|
||||
"different_parent": "Cannot reorder collection with different parent",
|
||||
"edit": "Modifier la collection",
|
||||
"import_or_create": "Importer ou créer une collection",
|
||||
"import_or_create": "Import or create a collection",
|
||||
"invalid_name": "Veuillez fournir un nom valide pour la collection",
|
||||
"invalid_root_move": "Collection déjà présente dans la racine",
|
||||
"moved": "Déplacement réussi",
|
||||
"invalid_root_move": "Collection already in the root",
|
||||
"moved": "Moved Successfully",
|
||||
"my_collections": "Mes collections",
|
||||
"name": "Ma nouvelle collection",
|
||||
"name_length_insufficient": "Le nom de la collection doit comporter au moins 3 caractères",
|
||||
@@ -161,16 +162,16 @@
|
||||
"renamed": "Collection renommée",
|
||||
"request_in_use": "Demande en cours d'utilisation",
|
||||
"save_as": "Enregistrer sous",
|
||||
"save_to_collection": "Enregistrer dans la collection",
|
||||
"save_to_collection": "Save to Collection",
|
||||
"select": "Sélectionnez une collection",
|
||||
"select_location": "Sélectionnez l'emplacement",
|
||||
"select_team": "Sélectionnez une équipe",
|
||||
"team_collections": "Collections de l'équipe"
|
||||
},
|
||||
"confirm": {
|
||||
"close_unsaved_tab": "Êtes-vous sûr de vouloir fermer cet onglet ?",
|
||||
"close_unsaved_tabs": "Êtes-vous sûr de vouloir fermer tous les onglets ? {count} onglets non enregistrés seront perdus",
|
||||
"exit_team": "Êtes-vous sûr de vouloir quitter cette équipe ?",
|
||||
"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 team?",
|
||||
"logout": "Êtes-vous sûr de vouloir vous déconnecter?",
|
||||
"remove_collection": "Voulez-vous vraiment supprimer définitivement cette collection ?",
|
||||
"remove_environment": "Voulez-vous vraiment supprimer définitivement cet environnement ?",
|
||||
@@ -180,31 +181,31 @@
|
||||
"remove_shared_request": "Are you sure you want to permanently delete this shared request?",
|
||||
"remove_team": "Voulez-vous vraiment supprimer cette équipe ?",
|
||||
"remove_telemetry": "Êtes-vous sûr de vouloir désactiver la télémétrie ?",
|
||||
"request_change": "Êtes-vous sûr de vouloir rejeter la demande en cours ? Les modifications non enregistrées seront perdues.",
|
||||
"save_unsaved_tab": "Souhaitez-vous enregistrer les modifications apportées dans cet onglet ?",
|
||||
"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?",
|
||||
"sync": "Voulez-vous vraiment synchroniser cet espace de travail ?"
|
||||
},
|
||||
"context_menu": {
|
||||
"add_parameters": "Ajouter aux paramètres",
|
||||
"open_request_in_new_tab": "Ouvrir la demande dans un nouvel onglet",
|
||||
"set_environment_variable": "Définir comme variable"
|
||||
"add_parameters": "Add to parameters",
|
||||
"open_request_in_new_tab": "Open request in new tab",
|
||||
"set_environment_variable": "Set as variable"
|
||||
},
|
||||
"cookies": {
|
||||
"modal": {
|
||||
"new_domain_name": "Nouveau nom de domaine",
|
||||
"set": "Définir un cookie",
|
||||
"cookie_string": "Chaîne de caractères de cookie",
|
||||
"enter_cookie_string": "Saisir la chaîne de caractères du cookie",
|
||||
"cookie_name": "Nom",
|
||||
"cookie_value": "Valeur",
|
||||
"cookie_path": "Chemin d'accès",
|
||||
"cookie_expires": "Expiration",
|
||||
"managed_tab": "Gestion",
|
||||
"raw_tab": "Brut",
|
||||
"interceptor_no_support": "L'intercepteur que vous avez sélectionné ne prend pas en charge les cookies. Sélectionnez un autre intercepteur et réessayez.",
|
||||
"empty_domains": "La liste des domaines est vide",
|
||||
"empty_domain": "Le domaine est vide",
|
||||
"no_cookies_in_domain": "Aucun cookie n'est défini pour ce domaine"
|
||||
"cookie_expires": "Expires",
|
||||
"cookie_name": "Name",
|
||||
"cookie_path": "Path",
|
||||
"cookie_string": "Cookie string",
|
||||
"cookie_value": "Value",
|
||||
"empty_domain": "Domain is empty",
|
||||
"empty_domains": "Domain list is empty",
|
||||
"enter_cookie_string": "Enter cookie string",
|
||||
"interceptor_no_support": "Your currently selected interceptor does not support cookies. Select a different Interceptor and try again.",
|
||||
"managed_tab": "Managed",
|
||||
"new_domain_name": "New domain name",
|
||||
"no_cookies_in_domain": "No cookies set for this domain",
|
||||
"raw_tab": "Raw",
|
||||
"set": "Set a cookie"
|
||||
}
|
||||
},
|
||||
"count": {
|
||||
@@ -237,7 +238,7 @@
|
||||
"profile": "Connectez-vous pour voir votre profil",
|
||||
"protocols": "Les protocoles sont vides",
|
||||
"schema": "Se connecter à un point de terminaison GraphQL",
|
||||
"shared_requests": "Il n'y a pas de requêtes partagées",
|
||||
"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": "Nom de l'équipe vide",
|
||||
@@ -251,15 +252,15 @@
|
||||
"create_new": "Créer un nouvel environnement",
|
||||
"created": "Environnement créé",
|
||||
"deleted": "Environnement supprimé",
|
||||
"duplicated": "Environnement dupliqué",
|
||||
"duplicated": "Environment duplicated",
|
||||
"edit": "Modifier l'environnement",
|
||||
"empty_variables": "No variables",
|
||||
"global": "Global",
|
||||
"global_variables": "Variables globales",
|
||||
"import_or_create": "Importer ou créer un environnement",
|
||||
"global_variables": "Global variables",
|
||||
"import_or_create": "Import or create a environment",
|
||||
"invalid_name": "Veuillez fournir un nom valide pour l'environnement",
|
||||
"list": "Variables d'environnement",
|
||||
"my_environments": "Mes environnements",
|
||||
"list": "Environment variables",
|
||||
"my_environments": "My Environments",
|
||||
"name": "Name",
|
||||
"nested_overflow": "les variables d'environnement imbriquées sont limitées à 10 niveaux",
|
||||
"new": "Nouvel environnement",
|
||||
@@ -283,11 +284,11 @@
|
||||
"authproviders_load_error": "Unable to load auth providers",
|
||||
"browser_support_sse": "Ce navigateur ne semble pas prendre en charge les événements envoyés par le serveur.",
|
||||
"check_console_details": "Consultez le journal de la console pour plus de détails.",
|
||||
"check_how_to_add_origin": "Vérifiez comment vous pouvez ajouter une origine",
|
||||
"check_how_to_add_origin": "Check how you can add an origin",
|
||||
"curl_invalid_format": "cURL n'est pas formaté correctement",
|
||||
"danger_zone": "Zone de danger",
|
||||
"delete_account": "Votre compte est actuellement propriétaire de ces équipes :",
|
||||
"delete_account_description": "Vous devez vous retirer, transférer la propriété ou supprimer ces équipes avant de pouvoir supprimer votre compte.",
|
||||
"danger_zone": "Danger zone",
|
||||
"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": "Nom de la requête vide",
|
||||
"f12_details": "(F12 pour les détails)",
|
||||
"gql_prettify_invalid_query": "Impossible de formater une requête non valide, résolvez les erreurs de syntaxe de la requête et réessayer",
|
||||
@@ -299,13 +300,13 @@
|
||||
"json_prettify_invalid_body": "Impossible de formater un corps non valide, résolvez les erreurs de syntaxe json et réessayez",
|
||||
"network_error": "Il semble y avoir une erreur de réseau. Veuillez réessayer.",
|
||||
"network_fail": "Impossible d'envoyer la requête",
|
||||
"no_collections_to_export": "Aucune collection à exporter. Veuillez créer une collection pour commencer.",
|
||||
"no_collections_to_export": "No collections to export. Please create a collection to get started.",
|
||||
"no_duration": "Pas de durée",
|
||||
"no_environments_to_export": "Aucun environnement à exporter. Veuillez créer un environnement pour commencer.",
|
||||
"no_environments_to_export": "No environments to export. Please create an environment to get started.",
|
||||
"no_results_found": "Aucune correspondance trouvée",
|
||||
"page_not_found": "Cette page n'a pas pu être trouvée",
|
||||
"please_install_extension": "Veuillez installer l'extension et ajouter l'origine à l'extension.",
|
||||
"proxy_error": "Erreur de proxy",
|
||||
"please_install_extension": "Please install the extension and add origin to the extension.",
|
||||
"proxy_error": "Proxy error",
|
||||
"script_fail": "Impossible d'exécuter le script de pré-requête",
|
||||
"something_went_wrong": "Quelque chose s'est mal passé",
|
||||
"test_script_fail": "Impossible d'exécuter le script post-requête"
|
||||
@@ -319,9 +320,9 @@
|
||||
"title": "Exportation"
|
||||
},
|
||||
"filter": {
|
||||
"all": "Tout",
|
||||
"none": "Aucun",
|
||||
"starred": "Étoilé"
|
||||
"all": "All",
|
||||
"none": "None",
|
||||
"starred": "Starred"
|
||||
},
|
||||
"folder": {
|
||||
"created": "Dossier créé",
|
||||
@@ -332,19 +333,19 @@
|
||||
"renamed": "Dossier renommé"
|
||||
},
|
||||
"graphql": {
|
||||
"connection_switch_confirm": "Voulez-vous vous connecter avec le dernier point de terminaison GraphQL ?",
|
||||
"connection_switch_new_url": "Le passage à un autre onglet vous déconnectera de la connexion GraphQL active. La nouvelle URL de connexion est",
|
||||
"connection_switch_url": "Vous êtes connecté à un point de terminaison GraphQL dont l'URL de connexion est",
|
||||
"connection_switch_confirm": "Do you want to connect with the latest GraphQL endpoint?",
|
||||
"connection_switch_new_url": "Switching to a tab will disconnected you from the active GraphQL connection. New connection URL is",
|
||||
"connection_switch_url": "You're connected to a GraphQL endpoint the connection URL is",
|
||||
"mutations": "Mutations",
|
||||
"schema": "Schéma",
|
||||
"subscriptions": "Abonnements",
|
||||
"switch_connection": "Changer de connexion"
|
||||
"switch_connection": "Switch connection"
|
||||
},
|
||||
"graphql_collections": {
|
||||
"title": "GraphQL Collections"
|
||||
},
|
||||
"group": {
|
||||
"time": "Temps",
|
||||
"time": "Time",
|
||||
"url": "URL"
|
||||
},
|
||||
"header": {
|
||||
@@ -375,7 +376,7 @@
|
||||
"import": {
|
||||
"collections": "Importer des collections",
|
||||
"curl": "Importer en cURL",
|
||||
"environments_from_gist": "Importer depuis Gist",
|
||||
"environments_from_gist": "Import From Gist",
|
||||
"environments_from_gist_description": "Import Hoppscotch Environments From Gist",
|
||||
"failed": "Échec de l'importation",
|
||||
"from_file": "Import from File",
|
||||
@@ -407,27 +408,27 @@
|
||||
"title": "Importer"
|
||||
},
|
||||
"inspections": {
|
||||
"description": "Inspecter les erreurs possibles",
|
||||
"description": "Inspect possible errors",
|
||||
"environment": {
|
||||
"add_environment": "Ajouter à l'environnement",
|
||||
"not_found": "La variable d'environnement “{environment}“ n'a pas été trouvée."
|
||||
"add_environment": "Add to Environment",
|
||||
"not_found": "Environment variable “{environment}” not found."
|
||||
},
|
||||
"header": {
|
||||
"cookie": "Le navigateur ne permet pas à Hoppscotch de définir l'en-tête Cookie. Pendant que nous travaillons sur l'application de bureau Hoppscotch (bientôt disponible), veuillez utiliser l'en-tête d'autorisation à la place."
|
||||
"cookie": "The browser doesn't allow Hoppscotch to set the Cookie Header. While we're working on the Hoppscotch Desktop App (coming soon), please use the Authorization Header instead."
|
||||
},
|
||||
"response": {
|
||||
"401_error": "Veuillez vérifier vos informations d'authentification.",
|
||||
"404_error": "Veuillez vérifier l'URL de votre demande et le type de méthode.",
|
||||
"cors_error": "Veuillez vérifier la configuration du partage des ressources entre les origines.",
|
||||
"default_error": "Veuillez vérifier votre demande.",
|
||||
"network_error": "Veuillez vérifier votre connexion réseau."
|
||||
"401_error": "Please check your authentication credentials.",
|
||||
"404_error": "Please check your request URL and method type.",
|
||||
"cors_error": "Please check your Cross-Origin Resource Sharing configuration.",
|
||||
"default_error": "Please check your request.",
|
||||
"network_error": "Please check your network connection."
|
||||
},
|
||||
"title": "Inspecteur",
|
||||
"title": "Inspector",
|
||||
"url": {
|
||||
"extension_not_installed": "L'extension n'est pas installée.",
|
||||
"extension_unknown_origin": "Assurez-vous d'avoir ajouté l'origine du point de terminaison de l'API à la liste des extensions du navigateur Hoppscotch.",
|
||||
"extention_enable_action": "Activer l'extension du navigateur",
|
||||
"extention_not_enabled": "L'extension n'est pas activée."
|
||||
"extension_not_installed": "Extension not installed.",
|
||||
"extension_unknown_origin": "Make sure you've added the API endpoint's origin to the Hoppscotch Browser Extension list.",
|
||||
"extention_enable_action": "Enable Browser Extension",
|
||||
"extention_not_enabled": "Extension not enabled."
|
||||
}
|
||||
},
|
||||
"layout": {
|
||||
@@ -438,25 +439,25 @@
|
||||
"row": "Disposition horizontale"
|
||||
},
|
||||
"modal": {
|
||||
"close_unsaved_tab": "Vous avez des modifications non enregistrées",
|
||||
"close_unsaved_tab": "You have unsaved changes",
|
||||
"collections": "Collections",
|
||||
"confirm": "Confirmer",
|
||||
"customize_request": "Customize Request",
|
||||
"edit_request": "Modifier la requête",
|
||||
"import_export": "Importer / Exporter",
|
||||
"share_request": "Partager une requête"
|
||||
"share_request": "Share Request"
|
||||
},
|
||||
"mqtt": {
|
||||
"already_subscribed": "Vous êtes déjà abonné à ce sujet.",
|
||||
"clean_session": "Effacer la Session",
|
||||
"clear_input": "Effacer la saisie",
|
||||
"clear_input_on_send": "Effacer la saisie lors de l'envoi",
|
||||
"already_subscribed": "You are already subscribed to this topic.",
|
||||
"clean_session": "Clean Session",
|
||||
"clear_input": "Clear input",
|
||||
"clear_input_on_send": "Clear input on send",
|
||||
"client_id": "Client ID",
|
||||
"color": "Choisir la couleur",
|
||||
"color": "Pick a color",
|
||||
"communication": "Communication",
|
||||
"connection_config": "Connection Config",
|
||||
"connection_not_authorized": "Cette connexion MQTT n'utilise pas d'authentification.",
|
||||
"invalid_topic": "Veuillez fournir un sujet pour l'abonnement",
|
||||
"connection_not_authorized": "This MQTT connection does not use any authentication.",
|
||||
"invalid_topic": "Please provide a topic for the subscription",
|
||||
"keep_alive": "Keep Alive",
|
||||
"log": "Infos",
|
||||
"lw_message": "Last-Will Message",
|
||||
@@ -465,7 +466,7 @@
|
||||
"lw_topic": "Last-Will Topic",
|
||||
"message": "Message",
|
||||
"new": "New Subscription",
|
||||
"not_connected": "Veuillez d'abord établir une connexion MQTT.",
|
||||
"not_connected": "Please start a MQTT connection first.",
|
||||
"publish": "Publier",
|
||||
"qos": "QoS",
|
||||
"ssl": "SSL",
|
||||
@@ -479,7 +480,7 @@
|
||||
"navigation": {
|
||||
"doc": "Documents",
|
||||
"graphql": "GraphQL",
|
||||
"profile": "Profil",
|
||||
"profile": "Profile",
|
||||
"realtime": "Temps réel",
|
||||
"rest": "REST",
|
||||
"settings": "Paramètres"
|
||||
@@ -492,7 +493,7 @@
|
||||
},
|
||||
"profile": {
|
||||
"app_settings": "Réglages de l'application",
|
||||
"default_hopp_displayname": "Utilisateur anonyme",
|
||||
"default_hopp_displayname": "Unnamed User",
|
||||
"editor": "Éditeur",
|
||||
"editor_description": "Les éditeurs peuvent ajouter, modifier et supprimer des demandes.",
|
||||
"email_verification_mail": "Un e-mail de vérification a été envoyé à votre adresse e-mail. Veuillez cliquer sur le lien pour vérifier votre adresse électronique.",
|
||||
@@ -525,17 +526,17 @@
|
||||
"enter_curl": "Entrer cURL",
|
||||
"generate_code": "Générer le code",
|
||||
"generated_code": "Code généré",
|
||||
"go_to_authorization_tab": "Go to Authorization tab",
|
||||
"go_to_body_tab": "Go to Body tab",
|
||||
"go_to_authorization_tab": "Aller à l'autorisation",
|
||||
"header_list": "Liste des en-têtes",
|
||||
"invalid_name": "Veuillez fournir un nom pour la requête",
|
||||
"method": "Méthode",
|
||||
"moved": "Request moved",
|
||||
"name": "Nom de la requête",
|
||||
"new": "Nouvelle requête",
|
||||
"order_changed": "Demande de commande Mise à jour",
|
||||
"order_changed": "Request Order Updated",
|
||||
"override": "Remplacer",
|
||||
"override_help": "Définir <xmp>Content-Type</xmp> dans les en-têtes",
|
||||
"override_help": "Set <xmp>Content-Type</xmp> in Headers",
|
||||
"overriden": "Remplacé",
|
||||
"parameter_list": "Paramètres de requête",
|
||||
"parameters": "Paramètres",
|
||||
@@ -543,7 +544,7 @@
|
||||
"payload": "Charge utile",
|
||||
"query": "Requête",
|
||||
"raw_body": "Corps de requête brut",
|
||||
"rename": "Demande de renommage",
|
||||
"rename": "Rename Request",
|
||||
"renamed": "Requête renommée",
|
||||
"run": "Lancer",
|
||||
"save": "Sauvegarder",
|
||||
@@ -563,7 +564,7 @@
|
||||
"response": {
|
||||
"audio": "Audio",
|
||||
"body": "Corps de réponse",
|
||||
"filter_response_body": "Filtrer le corps de la réponse JSON (utilise la syntaxe JSONPath)",
|
||||
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)",
|
||||
"headers": "En-têtes",
|
||||
"html": "HTML",
|
||||
"image": "Image",
|
||||
@@ -575,14 +576,14 @@
|
||||
"status": "Statut",
|
||||
"time": "Temps",
|
||||
"title": "Réponse",
|
||||
"video": "Vidéo",
|
||||
"video": "Video",
|
||||
"waiting_for_connection": "En attente de connexion",
|
||||
"xml": "XML"
|
||||
},
|
||||
"settings": {
|
||||
"accent_color": "Couleur d'accent",
|
||||
"account": "Compte",
|
||||
"account_deleted": "Votre compte a été supprimé",
|
||||
"account_deleted": "Your account has been deleted",
|
||||
"account_description": "Personnalisez les paramètres de votre compte.",
|
||||
"account_email_description": "Votre adresse e-mail principale.",
|
||||
"account_name_description": "Ceci est votre nom d'affichage.",
|
||||
@@ -591,8 +592,8 @@
|
||||
"black_mode": "Noir",
|
||||
"choose_language": "Choisissez la langue",
|
||||
"dark_mode": "Sombre",
|
||||
"delete_account": "Supprimer le compte",
|
||||
"delete_account_description": "Lorsque vous supprimez votre compte, toutes vos données sont définitivement effacées. Cette action ne peut être annulée.",
|
||||
"delete_account": "Delete account",
|
||||
"delete_account_description": "Once you delete your account, all your data will be permanently deleted. This action cannot be undone.",
|
||||
"expand_navigation": "Expand navigation",
|
||||
"experiments": "Expériences",
|
||||
"experiments_notice": "Il s'agit d'une collection d'expériences sur lesquelles nous travaillons et qui pourraient s'avérer utiles, amusantes, les deux ou aucune. Ils ne sont pas définitifs et peuvent ne pas être stables, donc si quelque chose de trop étrange se produit, ne paniquez pas. Il suffit d'éteindre le truc. Blague à part,",
|
||||
@@ -600,7 +601,7 @@
|
||||
"extension_version": "Version d'extension",
|
||||
"extensions": "Extensions",
|
||||
"extensions_use_toggle": "Utilisez l'extension de navigateur pour envoyer des requêtes (le cas échéant)",
|
||||
"follow": "Suivez-nous",
|
||||
"follow": "Follow Us",
|
||||
"interceptor": "Intercepteur",
|
||||
"interceptor_description": "Middleware entre l'application et les API.",
|
||||
"language": "Langue",
|
||||
@@ -630,7 +631,7 @@
|
||||
"theme_description": "Personnalisez le thème de votre application.",
|
||||
"use_experimental_url_bar": "Utiliser la barre d'URL expérimentale avec mise en évidence de l'environnement",
|
||||
"user": "Utilisateur",
|
||||
"verified_email": "E-mail vérifié",
|
||||
"verified_email": "Verified email",
|
||||
"verify_email": "Vérifier l'email"
|
||||
},
|
||||
"shared_requests": {
|
||||
@@ -683,20 +684,20 @@
|
||||
"title": "Navigation"
|
||||
},
|
||||
"others": {
|
||||
"prettify": "Améliorer le contenu de l'éditeur",
|
||||
"title": "Autres"
|
||||
"prettify": "Prettify Editor's Content",
|
||||
"title": "Others"
|
||||
},
|
||||
"request": {
|
||||
"delete_method": "Sélectionnez la méthode DELETE",
|
||||
"get_method": "Sélectionnez la méthode GET",
|
||||
"head_method": "Sélectionnez la méthode HEAD",
|
||||
"import_curl": "Importer cURL",
|
||||
"import_curl": "Import cURL",
|
||||
"method": "Méthode",
|
||||
"next_method": "Sélectionnez la méthode suivante",
|
||||
"post_method": "Sélectionnez la méthode POST",
|
||||
"previous_method": "Sélectionnez la méthode précédente",
|
||||
"put_method": "Sélectionnez la méthode PUT",
|
||||
"rename": "Demande de renommage",
|
||||
"rename": "Rename Request",
|
||||
"reset_request": "Réinitialiser la requête",
|
||||
"save_request": "Save Request",
|
||||
"save_to_collections": "Enregistrer dans les collections",
|
||||
@@ -727,89 +728,89 @@
|
||||
},
|
||||
"socketio": {
|
||||
"communication": "Communication",
|
||||
"connection_not_authorized": "Cette connexion SocketIO n'utilise pas d'authentification.",
|
||||
"connection_not_authorized": "This SocketIO connection does not use any authentication.",
|
||||
"event_name": "Nom de l'événement",
|
||||
"events": "Événements",
|
||||
"log": "Infos",
|
||||
"url": "URL"
|
||||
},
|
||||
"spotlight": {
|
||||
"change_language": "Changer de langue",
|
||||
"change_language": "Change Language",
|
||||
"environments": {
|
||||
"delete": "Supprimer l'environnement actuel",
|
||||
"duplicate": "Dupliquer l'environnement actuel",
|
||||
"duplicate_global": "Duplication de l'environnement global",
|
||||
"edit": "Modifier l'environnement actuel",
|
||||
"edit_global": "Modifier l'environnement mondial",
|
||||
"new": "Créer un nouvel environnement",
|
||||
"new_variable": "Créer une nouvelle variable d'environnement",
|
||||
"delete": "Delete current environment",
|
||||
"duplicate": "Duplicate current environment",
|
||||
"duplicate_global": "Duplicate global environment",
|
||||
"edit": "Edit current environment",
|
||||
"edit_global": "Edit global environment",
|
||||
"new": "Create new environment",
|
||||
"new_variable": "Create a new environment variable",
|
||||
"title": "Environments"
|
||||
},
|
||||
"general": {
|
||||
"chat": "Chat avec le support",
|
||||
"help_menu": "Aide et assistance",
|
||||
"open_docs": "Lire la documentation",
|
||||
"open_github": "Ouvrir le dépôt GitHub",
|
||||
"open_keybindings": "Raccourcis clavier",
|
||||
"chat": "Chat with support",
|
||||
"help_menu": "Help and support",
|
||||
"open_docs": "Read Documentation",
|
||||
"open_github": "Open GitHub repository",
|
||||
"open_keybindings": "Keyboard shortcuts",
|
||||
"social": "Social",
|
||||
"title": "Général"
|
||||
"title": "General"
|
||||
},
|
||||
"graphql": {
|
||||
"connect": "Connexion au serveur",
|
||||
"disconnect": "Déconnexion du serveur"
|
||||
"connect": "Connect to server",
|
||||
"disconnect": "Disconnect from server"
|
||||
},
|
||||
"miscellaneous": {
|
||||
"invite": "Invitez vos amis à Hoppscotch",
|
||||
"title": "Divers"
|
||||
"invite": "Invite your friends to Hoppscotch",
|
||||
"title": "Miscellaneous"
|
||||
},
|
||||
"request": {
|
||||
"save_as_new": "Sauvegarder comme nouvelle demande",
|
||||
"select_method": "Sélectionner la méthode",
|
||||
"switch_to": "Basculer vers",
|
||||
"tab_authorization": "Onglet Autorisation",
|
||||
"tab_body": "Onglet du corps",
|
||||
"tab_headers": "Onglet En-têtes",
|
||||
"tab_parameters": "Onglet Paramètres",
|
||||
"tab_pre_request_script": "Onglet script de pré-demande",
|
||||
"tab_query": "Onglet Requête",
|
||||
"tab_tests": "Onglet Tests",
|
||||
"tab_variables": "Onglet Variables"
|
||||
"save_as_new": "Save as new request",
|
||||
"select_method": "Select method",
|
||||
"switch_to": "Switch to",
|
||||
"tab_authorization": "Authorization tab",
|
||||
"tab_body": "Body tab",
|
||||
"tab_headers": "Headers tab",
|
||||
"tab_parameters": "Parameters tab",
|
||||
"tab_pre_request_script": "Pre-request script tab",
|
||||
"tab_query": "Query tab",
|
||||
"tab_tests": "Tests tab",
|
||||
"tab_variables": "Variables tab"
|
||||
},
|
||||
"response": {
|
||||
"copy": "Copier la réponse",
|
||||
"download": "Télécharger la réponse sous forme de fichier",
|
||||
"title": "Réponse"
|
||||
"copy": "Copy response",
|
||||
"download": "Download response as file",
|
||||
"title": "Response"
|
||||
},
|
||||
"section": {
|
||||
"interceptor": "Intercepteur",
|
||||
"interceptor": "Interceptor",
|
||||
"interface": "Interface",
|
||||
"theme": "Thème",
|
||||
"user": "Utilisateur"
|
||||
"theme": "Theme",
|
||||
"user": "User"
|
||||
},
|
||||
"settings": {
|
||||
"change_interceptor": "Changer d'intercepteur",
|
||||
"change_language": "Changer de langue",
|
||||
"change_interceptor": "Change Interceptor",
|
||||
"change_language": "Change Language",
|
||||
"theme": {
|
||||
"black": "Noir",
|
||||
"dark": "Sombre",
|
||||
"light": "Clair",
|
||||
"system": "Préférence du système"
|
||||
"black": "Black",
|
||||
"dark": "Dark",
|
||||
"light": "Light",
|
||||
"system": "System preference"
|
||||
}
|
||||
},
|
||||
"tab": {
|
||||
"close_current": "Fermer l'onglet actuel",
|
||||
"close_others": "Fermer tous les autres onglets",
|
||||
"duplicate": "Dupliquer l'onglet actuel",
|
||||
"new_tab": "Ouvrir un nouvel onglet",
|
||||
"title": "Onglets"
|
||||
"close_current": "Close current tab",
|
||||
"close_others": "Close all other tabs",
|
||||
"duplicate": "Duplicate current tab",
|
||||
"new_tab": "Open a new tab",
|
||||
"title": "Tabs"
|
||||
},
|
||||
"workspace": {
|
||||
"delete": "Supprimer l'équipe actuelle",
|
||||
"edit": "Modifier l'équipe actuelle",
|
||||
"invite": "Inviter les gens à rejoindre l'équipe",
|
||||
"new": "Créer une nouvelle équipe",
|
||||
"switch_to_personal": "Passez à votre espace de travail personnel",
|
||||
"title": "Les équipes"
|
||||
"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": "Teams"
|
||||
}
|
||||
},
|
||||
"sse": {
|
||||
@@ -835,12 +836,12 @@
|
||||
"disconnected": "Déconnecté",
|
||||
"disconnected_from": "Déconnecté de {name}",
|
||||
"docs_generated": "Documentation générée",
|
||||
"download_failed": "Download failed",
|
||||
"download_started": "Téléchargement commencé",
|
||||
"download_failed": "Téléchargement échoué",
|
||||
"enabled": "Active",
|
||||
"file_imported": "Fichier importé",
|
||||
"finished_in": "Terminé en {duration} ms",
|
||||
"hide": "Cacher",
|
||||
"hide": "Hide",
|
||||
"history_deleted": "Historique supprimé",
|
||||
"linewrap": "Retour à la ligne",
|
||||
"loading": "Chargement...",
|
||||
@@ -851,7 +852,7 @@
|
||||
"published_error": "Quelque chose s'est mal passé lors de la publication du message : {topic} dans le sujet : {message}",
|
||||
"published_message": "Message publié : {message} au sujet : {topic}",
|
||||
"reconnection_error": "Échec de la reconnexion",
|
||||
"show": "Afficher",
|
||||
"show": "Show",
|
||||
"subscribed_failed": "Échec de l'inscription au sujet : {topic}",
|
||||
"subscribed_success": "Inscription réussie au sujet : {topic}",
|
||||
"unsubscribed_failed": "Échec de la désinscription du sujet : {topic}",
|
||||
@@ -860,7 +861,7 @@
|
||||
},
|
||||
"support": {
|
||||
"changelog": "En savoir plus sur les dernières versions",
|
||||
"chat": "Des questions ? Discutez avec nous!",
|
||||
"chat": "Des questions? Discutez avec nous!",
|
||||
"community": "Posez des questions et aidez les autres",
|
||||
"documentation": "En savoir plus sur Hoppscotch",
|
||||
"forum": "Posez des questions et obtenez des réponses",
|
||||
@@ -873,21 +874,21 @@
|
||||
"tab": {
|
||||
"authorization": "Autorisation",
|
||||
"body": "Corps",
|
||||
"close": "Fermer l'onglet",
|
||||
"close_others": "Fermer les autres onglets",
|
||||
"close": "Close Tab",
|
||||
"close_others": "Close other Tabs",
|
||||
"collections": "Collections",
|
||||
"documentation": "Documentation",
|
||||
"duplicate": "Dupliquer l'onglet",
|
||||
"duplicate": "Duplicate Tab",
|
||||
"environments": "Environments",
|
||||
"headers": "En-têtes",
|
||||
"history": "Historique",
|
||||
"history": "Histoire",
|
||||
"mqtt": "MQTT",
|
||||
"parameters": "Paramètres",
|
||||
"pre_request_script": "Script de pré-requête",
|
||||
"queries": "Requêtes",
|
||||
"query": "Requête",
|
||||
"schema": "Schema",
|
||||
"shared_requests": "Requêtes partagées",
|
||||
"shared_requests": "Shared Requests",
|
||||
"socketio": "Socket.IO",
|
||||
"sse": "ESS",
|
||||
"tests": "Tests",
|
||||
@@ -904,6 +905,7 @@
|
||||
"email_do_not_match": "L'email ne correspond pas aux détails de votre compte. Contactez le propriétaire de votre équipe.",
|
||||
"exit": "Quitter l'équipe",
|
||||
"exit_disabled": "Seul le propriétaire ne peut pas quitter l'équipe",
|
||||
"failed_invites": "Failed invites",
|
||||
"invalid_coll_id": "Invalid collection ID",
|
||||
"invalid_email_format": "Le format de l'e-mail n'est pas valide",
|
||||
"invalid_id": "L'email ne correspond pas aux détails de votre compte. Contactez le propriétaire de votre équipe.",
|
||||
@@ -939,22 +941,21 @@
|
||||
"no_request_found": "Request not found.",
|
||||
"not_found": "Équipe non trouvée. Contactez le propriétaire de votre équipe.",
|
||||
"not_valid_viewer": "Vous n'êtes pas un visionneur valide. Contactez le propriétaire de votre équipe.",
|
||||
"parent_coll_move": "Impossible de déplacer une collection vers une collection enfant",
|
||||
"success_invites": "Les invitations réussites",
|
||||
"parent_coll_move": "Cannot move collection to a child collection",
|
||||
"pending_invites": "Invitations en attente",
|
||||
"failed_invites": "Échec des invitations",
|
||||
"permissions": "Autorisations",
|
||||
"same_target_destination": "Même destinataire et même cible",
|
||||
"same_target_destination": "Same target and destination",
|
||||
"saved": "Équipe enregistrée",
|
||||
"select_a_team": "Choisir une équipe",
|
||||
"success_invites": "Success invites",
|
||||
"title": "Équipes",
|
||||
"we_sent_invite_link": "Nous avons envoyé un lien d'invitation à tous les invités !",
|
||||
"we_sent_invite_link_description": "Demandez à tous les invités de vérifier leur boîte de réception. Cliquez sur le lien pour rejoindre l'équipe."
|
||||
},
|
||||
"team_environment": {
|
||||
"deleted": "Environment supprimé",
|
||||
"duplicate": "Environment dupliqué",
|
||||
"not_found": "Environment non trouvé"
|
||||
"deleted": "Environment Deleted",
|
||||
"duplicate": "Environment Duplicated",
|
||||
"not_found": "Environment not found."
|
||||
},
|
||||
"test": {
|
||||
"failed": "Test échoué",
|
||||
@@ -974,10 +975,10 @@
|
||||
"url": "URL"
|
||||
},
|
||||
"workspace": {
|
||||
"change": "Changer d'espace de travail",
|
||||
"personal": "Mon espace de travail",
|
||||
"team": "Espace de travail de l'équipe",
|
||||
"title": "Espaces de travail"
|
||||
"change": "Change workspace",
|
||||
"personal": "My Workspace",
|
||||
"team": "Team Workspace",
|
||||
"title": "Workspaces"
|
||||
},
|
||||
"shortcodes": {
|
||||
"actions": "Actions",
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"action": {
|
||||
"add": "Hozzáadás",
|
||||
"add": "Add",
|
||||
"autoscroll": "Automatikus görgetés",
|
||||
"cancel": "Mégse",
|
||||
"choose_file": "Válasszon egy fájlt",
|
||||
"clear": "Törlés",
|
||||
"clear_all": "Összes törlése",
|
||||
"clear_history": "Összes előzmény törlése",
|
||||
"clear_history": "Clear all History",
|
||||
"close": "Bezárás",
|
||||
"connect": "Kapcsolódás",
|
||||
"connecting": "Kapcsolódás",
|
||||
"copy": "Másolás",
|
||||
"create": "Létrehozás",
|
||||
"create": "Create",
|
||||
"delete": "Törlés",
|
||||
"disconnect": "Leválasztás",
|
||||
"dismiss": "Eltüntetés",
|
||||
@@ -33,16 +33,16 @@
|
||||
"open_workspace": "Munkaterület megnyitása",
|
||||
"paste": "Beillesztés",
|
||||
"prettify": "Csinosítás",
|
||||
"properties": "Tulajdonságok",
|
||||
"properties": "Properties",
|
||||
"remove": "Eltávolítás",
|
||||
"rename": "Átnevezés",
|
||||
"rename": "Rename",
|
||||
"restore": "Visszaállítás",
|
||||
"save": "Mentés",
|
||||
"scroll_to_bottom": "Görgetés az aljára",
|
||||
"scroll_to_top": "Görgetés a tetejére",
|
||||
"search": "Keresés",
|
||||
"send": "Küldés",
|
||||
"share": "Megosztás",
|
||||
"share": "Share",
|
||||
"start": "Indítás",
|
||||
"starting": "Indítás",
|
||||
"stop": "Leállítás",
|
||||
@@ -61,9 +61,9 @@
|
||||
"app": {
|
||||
"chat_with_us": "Csevegjen velünk",
|
||||
"contact_us": "Lépjen kapcsolatba velünk",
|
||||
"cookies": "Sütik",
|
||||
"cookies": "Cookies",
|
||||
"copy": "Másolás",
|
||||
"copy_interface_type": "Interface típusának másolása",
|
||||
"copy_interface_type": "Copy interface type",
|
||||
"copy_user_id": "Felhasználó-hitelesítési token másolása",
|
||||
"developer_option": "Fejlesztői beállítások",
|
||||
"developer_option_description": "Fejlesztői eszközök, amelyek segítenek a Hoppscotch fejlesztésében és karbantartásában.",
|
||||
@@ -79,15 +79,15 @@
|
||||
"keyboard_shortcuts": "Gyorsbillentyűk",
|
||||
"name": "Hoppscotch",
|
||||
"new_version_found": "Új verzió található. Töltse újra az oldalt a frissítéshez.",
|
||||
"open_in_hoppscotch": "Megnyitás Hoppscotch-ban.",
|
||||
"open_in_hoppscotch": "Open in Hoppscotch",
|
||||
"options": "Beállítások",
|
||||
"proxy_privacy_policy": "Proxy adatvédelmi irányelvei",
|
||||
"reload": "Újratöltés",
|
||||
"search": "Keresés",
|
||||
"share": "Megosztás",
|
||||
"shortcuts": "Gyorsbillentyűk",
|
||||
"social_description": "Kövess minket a közösségi médiában, hogy ne maradj le a hírekről, frissítésekről és új kiadásokról.",
|
||||
"social_links": "Közösségi média linkek",
|
||||
"social_description": "Follow us on social media to stay updated with the latest news, updates and releases.",
|
||||
"social_links": "Social links",
|
||||
"spotlight": "Reflektorfény",
|
||||
"status": "Állapot",
|
||||
"status_description": "A weboldal állapotának ellenőrzése",
|
||||
@@ -119,27 +119,27 @@
|
||||
},
|
||||
"authorization": {
|
||||
"generate_token": "Token előállítása",
|
||||
"graphql_headers": "Azonosító fejléc connection_init tartalmaként elküldve",
|
||||
"graphql_headers": "Authorization Headers are sent as part of the payload to connection_init",
|
||||
"include_in_url": "Felvétel az URL-be",
|
||||
"inherited_from": "Örökölt a(z) {auth}-tól, a(z) {collection} gyűjteményből ",
|
||||
"inherited_from": "Inherited from {auth} from Parent Collection {collection} ",
|
||||
"learn": "Tudja meg, hogyan",
|
||||
"oauth": {
|
||||
"redirect_auth_server_returned_error": "Az Auth szerver hibás állapottal tért vissza",
|
||||
"redirect_auth_token_request_failed": "Kérés az auth token lekéréséhez sikertelen",
|
||||
"redirect_auth_token_request_invalid_response": "Érvénytelen válasz a Token Endpoint-tól, az auth token lekérésekpr",
|
||||
"redirect_invalid_state": "Érvénytelen állapotérték az átirányításban",
|
||||
"redirect_no_auth_code": "Nincs azonosítás az átirányításban",
|
||||
"redirect_no_client_id": "Nincs felhasználó azonosító",
|
||||
"redirect_no_client_secret": "Nincs felhasználó jelszó",
|
||||
"redirect_no_code_verifier": "Nincs kódellenőrző",
|
||||
"redirect_no_token_endpoint": "Nincs \"Token Endpoint\"",
|
||||
"something_went_wrong_on_oauth_redirect": "Valami rosszul sikerült az OAuth átirányításakor",
|
||||
"something_went_wrong_on_token_generation": "Valami rosszul sikerült a token generálásakor",
|
||||
"token_generation_oidc_discovery_failed": "Hiba a token generálásakor: OpenID Connect Discovery hiba"
|
||||
"redirect_auth_server_returned_error": "Auth Server returned an error state",
|
||||
"redirect_auth_token_request_failed": "Request to get the auth token failed",
|
||||
"redirect_auth_token_request_invalid_response": "Invalid Response from the Token Endpoint when requesting for an auth token",
|
||||
"redirect_invalid_state": "Invalid State value present in the redirect",
|
||||
"redirect_no_auth_code": "No Authorization Code present in the redirect",
|
||||
"redirect_no_client_id": "No Client ID defined",
|
||||
"redirect_no_client_secret": "No Client Secret Defined",
|
||||
"redirect_no_code_verifier": "No Code Verifier Defined",
|
||||
"redirect_no_token_endpoint": "No Token Endpoint Defined",
|
||||
"something_went_wrong_on_oauth_redirect": "Something went wrong during OAuth Redirect",
|
||||
"something_went_wrong_on_token_generation": "Something went wrong on token generation",
|
||||
"token_generation_oidc_discovery_failed": "Failure on token generation: OpenID Connect Discovery Failed"
|
||||
},
|
||||
"pass_key_by": "Átadta",
|
||||
"password": "Jelszó",
|
||||
"save_to_inherit": "Kérjük, mentse el ezt kérést bármelyik gyűjteménybe, hogy az azonosítás örökölhető lehessen",
|
||||
"save_to_inherit": "Please save this request in any collection to inherit the authorization",
|
||||
"token": "Token",
|
||||
"type": "Felhatalmazás típusa",
|
||||
"username": "Felhasználónév"
|
||||
@@ -148,7 +148,7 @@
|
||||
"created": "Gyűjtemény létrehozva",
|
||||
"different_parent": "Nem lehet átrendezni a különböző szülővel rendelkező gyűjteményt",
|
||||
"edit": "Gyűjtemény szerkesztése",
|
||||
"import_or_create": "Gyűjtemény importálása vagy létrehozása",
|
||||
"import_or_create": "Import or create a collection",
|
||||
"invalid_name": "Adjon nevet a gyűjteménynek",
|
||||
"invalid_root_move": "A gyűjtemény már a gyökérben van",
|
||||
"moved": "Sikeresen áthelyezve",
|
||||
@@ -157,20 +157,20 @@
|
||||
"name_length_insufficient": "A gyűjtemény nevének legalább 3 karakter hosszúságúnak kell lennie",
|
||||
"new": "Új gyűjtemény",
|
||||
"order_changed": "Gyűjtemény sorrendje frissítve",
|
||||
"properties": "Gyűjtemény tulajdonságok",
|
||||
"properties_updated": "Gyűjtemény tulajdonságai frissítve",
|
||||
"properties": "Collection Properties",
|
||||
"properties_updated": "Collection Properties Updated",
|
||||
"renamed": "Gyűjtemény átnevezve",
|
||||
"request_in_use": "A kérés használatban",
|
||||
"save_as": "Mentés másként",
|
||||
"save_to_collection": "Mentés egy gyűjteménybe",
|
||||
"save_to_collection": "Save to Collection",
|
||||
"select": "Gyűjtemény kiválasztása",
|
||||
"select_location": "Hely kiválasztása",
|
||||
"select_team": "Csapat kiválasztása",
|
||||
"team_collections": "Csapat gyűjteményei"
|
||||
},
|
||||
"confirm": {
|
||||
"close_unsaved_tab": "Biztos, hogy bezárja ezt a lapot?",
|
||||
"close_unsaved_tabs": "Biztos, hogy bezárja az összes lapot? {count} elmentetlen lap el fog veszni.",
|
||||
"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": "Biztosan el szeretné hagyni ezt a csapatot?",
|
||||
"logout": "Biztosan ki szeretne jelentkezni?",
|
||||
"remove_collection": "Biztosan véglegesen törölni szeretné ezt a gyűjteményt?",
|
||||
@@ -178,7 +178,7 @@
|
||||
"remove_folder": "Biztosan véglegesen törölni szeretné ezt a mappát?",
|
||||
"remove_history": "Biztosan véglegesen törölni szeretné az összes előzményt?",
|
||||
"remove_request": "Biztosan véglegesen törölni szeretné ezt a kérést?",
|
||||
"remove_shared_request": "Biztos, hogy véglegesen törölni szeretné ezt a megosztott kérést?",
|
||||
"remove_shared_request": "Are you sure you want to permanently delete this shared request?",
|
||||
"remove_team": "Biztosan törölni szeretné ezt a csapatot?",
|
||||
"remove_telemetry": "Biztosan ki szeretné kapcsolni a telemetriát?",
|
||||
"request_change": "Biztosan el szeretné vetni a jelenlegi kérést? Minden mentetlen változtatás el fog veszni.",
|
||||
@@ -186,26 +186,26 @@
|
||||
"sync": "Szeretné visszaállítani a munkaterületét a felhőből? Ez el fogja vetni a helyi folyamatát."
|
||||
},
|
||||
"context_menu": {
|
||||
"add_parameters": "Paraméterek hozzáadása",
|
||||
"open_request_in_new_tab": "Kérés megnyitása új lapot",
|
||||
"set_environment_variable": "Változóként való beállítás"
|
||||
"add_parameters": "Add to parameters",
|
||||
"open_request_in_new_tab": "Open request in new tab",
|
||||
"set_environment_variable": "Set as variable"
|
||||
},
|
||||
"cookies": {
|
||||
"modal": {
|
||||
"cookie_expires": "Lejárat",
|
||||
"cookie_name": "Név",
|
||||
"cookie_path": "Útvonal",
|
||||
"cookie_string": "Süti szöveg",
|
||||
"cookie_value": "Érték",
|
||||
"empty_domain": "Üres domain",
|
||||
"empty_domains": "Domain lista üres",
|
||||
"enter_cookie_string": "Süti szövegének megadása",
|
||||
"interceptor_no_support": "A kiválasztott interceptor nem támogatja a sütiket. Válasszon ki egy másik interceptor-t és próbálja újra.",
|
||||
"managed_tab": "Menedzselt",
|
||||
"new_domain_name": "Új domain neve",
|
||||
"no_cookies_in_domain": "Nincs süti beállítva ehhez a domainhez.",
|
||||
"raw_tab": "Nyers",
|
||||
"set": "Süti beállítása"
|
||||
"cookie_expires": "Expires",
|
||||
"cookie_name": "Name",
|
||||
"cookie_path": "Path",
|
||||
"cookie_string": "Cookie string",
|
||||
"cookie_value": "Value",
|
||||
"empty_domain": "Domain is empty",
|
||||
"empty_domains": "Domain list is empty",
|
||||
"enter_cookie_string": "Enter cookie string",
|
||||
"interceptor_no_support": "Your currently selected interceptor does not support cookies. Select a different Interceptor and try again.",
|
||||
"managed_tab": "Managed",
|
||||
"new_domain_name": "New domain name",
|
||||
"no_cookies_in_domain": "No cookies set for this domain",
|
||||
"raw_tab": "Raw",
|
||||
"set": "Set a cookie"
|
||||
}
|
||||
},
|
||||
"count": {
|
||||
@@ -221,7 +221,7 @@
|
||||
"generate_message": "Importáljon bármilyen Hoppscotch-gyűjteményt, hogy API-dokumentációt készítsen a folyamat során."
|
||||
},
|
||||
"empty": {
|
||||
"authorization": "Ez a kérés nem használ azonosítást",
|
||||
"authorization": "Ez a kérés nem használ felhatalmazást",
|
||||
"body": "Ennek a kérésnek nincs törzse",
|
||||
"collection": "A gyűjtemény üres",
|
||||
"collections": "A gyűjtemények üresek",
|
||||
@@ -252,39 +252,39 @@
|
||||
"create_new": "Új környezet létrehozása",
|
||||
"created": "Környezet létrehozva",
|
||||
"deleted": "Környezet törlése",
|
||||
"duplicated": "Környezet duplikálása",
|
||||
"duplicated": "Environment duplicated",
|
||||
"edit": "Környezet szerkesztése",
|
||||
"empty_variables": "Nincs változó",
|
||||
"global": "Globális",
|
||||
"global_variables": "Globális változók",
|
||||
"import_or_create": "Környezet importálása vagy létrehozása",
|
||||
"empty_variables": "No variables",
|
||||
"global": "Global",
|
||||
"global_variables": "Global variables",
|
||||
"import_or_create": "Import or create a environment",
|
||||
"invalid_name": "Adjon nevet a környezetnek",
|
||||
"list": "Környezeti változók",
|
||||
"list": "Environment variables",
|
||||
"my_environments": "Saját környezetek",
|
||||
"name": "Név",
|
||||
"name": "Name",
|
||||
"nested_overflow": "az egymásba ágyazott környezeti változók 10 szintre vannak korlátozva",
|
||||
"new": "Új környezet",
|
||||
"no_active_environment": "Nincs aktív környezet",
|
||||
"no_active_environment": "No active environment",
|
||||
"no_environment": "Nincs környezet",
|
||||
"no_environment_description": "Nem lettek környezetek kiválasztva. Válassza ki, hogy mit kell tenni a következő változókkal.",
|
||||
"quick_peek": "Környezet gyors megnézése",
|
||||
"replace_with_variable": "Cserélje le egy változóra",
|
||||
"scope": "Hatókör",
|
||||
"quick_peek": "Environment Quick Peek",
|
||||
"replace_with_variable": "Replace with variable",
|
||||
"scope": "Scope",
|
||||
"select": "Környezet kiválasztása",
|
||||
"set": "Környezet beállítása",
|
||||
"set_as_environment": "Környezetként való beállítás",
|
||||
"set": "Set environment",
|
||||
"set_as_environment": "Set as environment",
|
||||
"team_environments": "Csapatkörnyezetek",
|
||||
"title": "Környezetek",
|
||||
"updated": "Környezet frissítve",
|
||||
"value": "Érték",
|
||||
"variable": "Változó",
|
||||
"value": "Value",
|
||||
"variable": "Variable",
|
||||
"variable_list": "Változólista"
|
||||
},
|
||||
"error": {
|
||||
"authproviders_load_error": "Nem sikerült betölteni az azonosító szolgáltatókat",
|
||||
"authproviders_load_error": "Unable to load auth providers",
|
||||
"browser_support_sse": "Úgy tűnik, hogy ez a böngésző nem támogatja a kiszolgáló által küldött eseményeket.",
|
||||
"check_console_details": "Nézze meg a konzolnaplót a részletekért.",
|
||||
"check_how_to_add_origin": "Ellenőrizze, hogy hogyan adhat hozzá forrást",
|
||||
"check_how_to_add_origin": "Check how you can add an origin",
|
||||
"curl_invalid_format": "A cURL nincs megfelelően formázva",
|
||||
"danger_zone": "Veszélyes zóna",
|
||||
"delete_account": "Az Ön fiókja jelenleg tulajdonos ezekben a csapatokban:",
|
||||
@@ -300,13 +300,13 @@
|
||||
"json_prettify_invalid_body": "Nem sikerült csinosítani egy érvénytelen törzset, oldja meg a JSON szintaktikai hibáit, és próbálja újra",
|
||||
"network_error": "Úgy tűnik, hogy hálózati hiba van. Próbálja újra.",
|
||||
"network_fail": "Nem sikerült elküldeni a kérést",
|
||||
"no_collections_to_export": "Nincs exportálható gyűjtemény. Kérjük, hozzon létre egyet, hogy elkezdhesse.",
|
||||
"no_collections_to_export": "No collections to export. Please create a collection to get started.",
|
||||
"no_duration": "Nincs időtartam",
|
||||
"no_environments_to_export": "Nincs exportálható környezet. Kérjük, hozzon létre egyet, hogy elkezdhesse.",
|
||||
"no_environments_to_export": "No environments to export. Please create an environment to get started.",
|
||||
"no_results_found": "Nincs találat",
|
||||
"page_not_found": "Ez az oldal nem található",
|
||||
"please_install_extension": "Kérjük telepítse a bővítményt és adja hozzá a forráshoz.",
|
||||
"proxy_error": "Proxy hiba",
|
||||
"please_install_extension": "Please install the extension and add origin to the extension.",
|
||||
"proxy_error": "Proxy error",
|
||||
"script_fail": "Nem sikerült végrehajtani a kérés előtti parancsfájlt",
|
||||
"something_went_wrong": "Valami elromlott",
|
||||
"test_script_fail": "Nem sikerült végrehajtani a kérés utáni parancsfájlt"
|
||||
@@ -314,7 +314,7 @@
|
||||
"export": {
|
||||
"as_json": "Exportálás JSON formátumban",
|
||||
"create_secret_gist": "Titkos Gist létrehozása",
|
||||
"failed": "Valami hiba történt az exportálás közben",
|
||||
"failed": "Something went wrong while exporting",
|
||||
"gist_created": "Gist létrehozva",
|
||||
"require_github": "Jelentkezzen be GitHub használatával a titkos Gist létrehozásához",
|
||||
"title": "Exportálás"
|
||||
@@ -333,16 +333,16 @@
|
||||
"renamed": "Mappa átnevezve"
|
||||
},
|
||||
"graphql": {
|
||||
"connection_switch_confirm": "Szeretne csatlakozni a legújabb GraphQL végponttal?",
|
||||
"connection_switch_new_url": "A tab váltása lecsatlakoztatta az aktív GraphQL kapcsolatról. Az új kapcsolat",
|
||||
"connection_switch_url": "Kapcsolódott a GraphQL végponthoz. A kapcsolat",
|
||||
"connection_switch_confirm": "Do you want to connect with the latest GraphQL endpoint?",
|
||||
"connection_switch_new_url": "Switching to a tab will disconnected you from the active GraphQL connection. New connection URL is",
|
||||
"connection_switch_url": "You're connected to a GraphQL endpoint the connection URL is",
|
||||
"mutations": "Mutációk",
|
||||
"schema": "Séma",
|
||||
"subscriptions": "Feliratkozások",
|
||||
"switch_connection": "Kapcsolat váltása"
|
||||
"switch_connection": "Switch connection"
|
||||
},
|
||||
"graphql_collections": {
|
||||
"title": "GraphQL gyűjtemény"
|
||||
"title": "GraphQL Collections"
|
||||
},
|
||||
"group": {
|
||||
"time": "Idő",
|
||||
@@ -354,9 +354,9 @@
|
||||
"save_workspace": "Saját munkaterület mentése"
|
||||
},
|
||||
"helpers": {
|
||||
"authorization": "Az Azonosítás fejléc automatikusan elő lesz állítva a kérés elküldésekor.",
|
||||
"collection_properties_authorization": " Ez az azonosítás be lesz állítva minden kéréshez ebben a gyűjteményben.",
|
||||
"collection_properties_header": "Ez a fejléc be lesz állítva mint minden kéréshez ebben a gyűjteményben.",
|
||||
"authorization": "A felhatalmazási fejléc automatikusan elő lesz állítva a kérés elküldésekor.",
|
||||
"collection_properties_authorization": " This authorization will be set for every request in this collection.",
|
||||
"collection_properties_header": "This header will be set for every request in this collection.",
|
||||
"generate_documentation_first": "Először állítsa elő a dokumentációt",
|
||||
"network_fail": "Nem lehet elérni az API-végpontot. Ellenőrizze a hálózati kapcsolatot vagy válasszon egy másik elfogót, és próbálja újra.",
|
||||
"offline": "Úgy tűnik, hogy kapcsolat nélküli módban van. Előfordulhat, hogy a munkaterületen lévő adatok nem naprakészek.",
|
||||
@@ -376,11 +376,11 @@
|
||||
"import": {
|
||||
"collections": "Gyűjtemények importálása",
|
||||
"curl": "cURL importálása",
|
||||
"environments_from_gist": "Importálás Gist-ből",
|
||||
"environments_from_gist_description": "Hoppscotch környezetek importálása Gist-ből",
|
||||
"environments_from_gist": "Import From Gist",
|
||||
"environments_from_gist_description": "Import Hoppscotch Environments From Gist",
|
||||
"failed": "Hiba az importálás során: a formátum nem azonosítható",
|
||||
"from_file": "Importálás fájlból",
|
||||
"from_gist": "Importálás Gist-ből",
|
||||
"from_file": "Import from File",
|
||||
"from_gist": "Importálás Gistből",
|
||||
"from_gist_description": "Importálás Gist URL-ből",
|
||||
"from_insomnia": "Importálás Insomniából",
|
||||
"from_insomnia_description": "Importálás Insomnia-gyűjteményből",
|
||||
@@ -390,45 +390,45 @@
|
||||
"from_my_collections_description": "Importálás saját gyűjtemények fájlból",
|
||||
"from_openapi": "Importálás OpenAPI-ból",
|
||||
"from_openapi_description": "Importálás OpenAPI specifikációs fájlból (YML/JSON)",
|
||||
"from_postman": "Importálás Postman-ből",
|
||||
"from_postman": "Importálás Postmanből",
|
||||
"from_postman_description": "Importálás Postman-gyűjteményből",
|
||||
"from_url": "Importálás URL-ből",
|
||||
"gist_url": "Gist URL megadása",
|
||||
"gql_collections_from_gist_description": "GraphQL gyűjtemények importálása Gist-ből",
|
||||
"hoppscotch_environment": "Hoppscotch környezet",
|
||||
"hoppscotch_environment_description": "Hoppscotch környezet importálása JSON fájlból",
|
||||
"gql_collections_from_gist_description": "Import GraphQL Collections From Gist",
|
||||
"hoppscotch_environment": "Hoppscotch Environment",
|
||||
"hoppscotch_environment_description": "Import Hoppscotch Environment JSON file",
|
||||
"import_from_url_invalid_fetch": "Nem sikerült lekérni az adatokat az URL-ről",
|
||||
"import_from_url_invalid_file_format": "Hiba a gyűjtemények importálása során",
|
||||
"import_from_url_invalid_type": "Nem támogatott típus. Az elfogadott értékek: „hoppscotch”, „openapi”, „postman” vagy „insomnia”.",
|
||||
"import_from_url_success": "Gyűjtemények importálva",
|
||||
"insomnia_environment_description": "Insomnia környezet importálása JSON/YAML fájlból",
|
||||
"insomnia_environment_description": "Import Insomnia Environment from a JSON/YAML file",
|
||||
"json_description": "Gyűjtemények importálása Hoppscotch-gyűjtemények JSON-fájlból",
|
||||
"postman_environment": "Postman környezet",
|
||||
"postman_environment_description": "Postman környezet importálása JSON fájlból",
|
||||
"postman_environment": "Postman Environment",
|
||||
"postman_environment_description": "Import Postman Environment from a JSON file",
|
||||
"title": "Importálás"
|
||||
},
|
||||
"inspections": {
|
||||
"description": "Lehetséges hibák ellenőrzése",
|
||||
"description": "Inspect possible errors",
|
||||
"environment": {
|
||||
"add_environment": "Hozzáadás a környezethez",
|
||||
"not_found": "\"{environment}\" környezet nem található."
|
||||
"add_environment": "Add to Environment",
|
||||
"not_found": "Environment variable “{environment}” not found."
|
||||
},
|
||||
"header": {
|
||||
"cookie": "A böngésző nem engedélyezi a Hoppscotch-nak, hogy süti fejlécet állítson be. Amíg dolgozunk a Hoppscotch asztali alkalmazáson (hamarosan), kérjük használjon Authorization Header fejlécet."
|
||||
"cookie": "The browser doesn't allow Hoppscotch to set the Cookie Header. While we're working on the Hoppscotch Desktop App (coming soon), please use the Authorization Header instead."
|
||||
},
|
||||
"response": {
|
||||
"401_error": "Kérjük ellenőrizze az autentikációs adatokat.",
|
||||
"404_error": "Kérjük ellenőrizze a kérés URL-jét és típusát.",
|
||||
"cors_error": "Kérjük ellenőrizze a Cross-Origin Resource Sharing beállítást.",
|
||||
"default_error": "Kérjük ellenőrizze a kérését.",
|
||||
"network_error": "Kérjük ellenőrizze a internet elérhetőségét."
|
||||
"401_error": "Please check your authentication credentials.",
|
||||
"404_error": "Please check your request URL and method type.",
|
||||
"cors_error": "Please check your Cross-Origin Resource Sharing configuration.",
|
||||
"default_error": "Please check your request.",
|
||||
"network_error": "Please check your network connection."
|
||||
},
|
||||
"title": "Inspector",
|
||||
"url": {
|
||||
"extension_not_installed": "Bővítmény nincs telepítve.",
|
||||
"extension_unknown_origin": "Ellenőrizze, hogy hozzáadta az API végpont forrását Hoppscotch Browser bővítmény listájához.",
|
||||
"extention_enable_action": "Bővítmény engedélyezése",
|
||||
"extention_not_enabled": "Bővítmény nincs engedélyezve."
|
||||
"extension_not_installed": "Extension not installed.",
|
||||
"extension_unknown_origin": "Make sure you've added the API endpoint's origin to the Hoppscotch Browser Extension list.",
|
||||
"extention_enable_action": "Enable Browser Extension",
|
||||
"extention_not_enabled": "Extension not enabled."
|
||||
}
|
||||
},
|
||||
"layout": {
|
||||
@@ -442,10 +442,10 @@
|
||||
"close_unsaved_tab": "Elmentetlen változtatásai vannak",
|
||||
"collections": "Gyűjtemények",
|
||||
"confirm": "Megerősítés",
|
||||
"customize_request": "Kérés testreszabása",
|
||||
"customize_request": "Customize Request",
|
||||
"edit_request": "Kérés szerkesztése",
|
||||
"import_export": "Importálás és exportálás",
|
||||
"share_request": "Kérés megosztása"
|
||||
"share_request": "Share Request"
|
||||
},
|
||||
"mqtt": {
|
||||
"already_subscribed": "Ön már feliratkozott erre a témára.",
|
||||
@@ -511,7 +511,7 @@
|
||||
},
|
||||
"request": {
|
||||
"added": "Kérés hozzáadva",
|
||||
"authorization": "Azonosítás",
|
||||
"authorization": "Felhatalmazás",
|
||||
"body": "Kérés törzse",
|
||||
"choose_language": "Nyelv kiválasztása",
|
||||
"content_type": "Tartalom típusa",
|
||||
@@ -526,8 +526,8 @@
|
||||
"enter_curl": "cURL-parancs megadása",
|
||||
"generate_code": "Kód előállítása",
|
||||
"generated_code": "Előállított kód",
|
||||
"go_to_authorization_tab": "Navigálás az Azonosítás lapra",
|
||||
"go_to_body_tab": "Navigálás a Törzs lapra.",
|
||||
"go_to_authorization_tab": "Go to Authorization tab",
|
||||
"go_to_body_tab": "Go to Body tab",
|
||||
"header_list": "Fejléclista",
|
||||
"invalid_name": "Adjon nevet a kérésnek",
|
||||
"method": "Módszer",
|
||||
@@ -552,8 +552,8 @@
|
||||
"saved": "Kérés elmentve",
|
||||
"share": "Megosztás",
|
||||
"share_description": "A Hoppscotch megosztása az ismerőseivel",
|
||||
"share_request": "Kérés megosztása",
|
||||
"stop": "Leállítás",
|
||||
"share_request": "Share Request",
|
||||
"stop": "Stop",
|
||||
"title": "Kérés",
|
||||
"type": "Kérés típusa",
|
||||
"url": "URL",
|
||||
@@ -587,7 +587,7 @@
|
||||
"account_description": "A fiókbeállítások személyre szabása.",
|
||||
"account_email_description": "Az Ön elsődleges e-mail-címe.",
|
||||
"account_name_description": "Ez a megjelenített neve.",
|
||||
"additional": "További beállítások",
|
||||
"additional": "Additional Settings",
|
||||
"background": "Háttér",
|
||||
"black_mode": "Fekete",
|
||||
"choose_language": "Nyelv kiválasztása",
|
||||
@@ -635,29 +635,29 @@
|
||||
"verify_email": "E-mail-cím ellenőrzése"
|
||||
},
|
||||
"shared_requests": {
|
||||
"button": "Gomb",
|
||||
"button_info": "Hozza létre a 'Futtatás Hoppscotch-ban' gombot a weboldalán vagy blogján.",
|
||||
"copy_html": "HTML másolása",
|
||||
"copy_link": "Link másolása",
|
||||
"copy_markdown": "Jelölő másolása",
|
||||
"creating_widget": "Widget létrehozása",
|
||||
"customize": "Testreszabás",
|
||||
"deleted": "Megosztott kérés törölve",
|
||||
"description": "Válasszon ki egy widgetet, ezt később módosíthatja és testreszabhatja",
|
||||
"embed": "Beágyazás",
|
||||
"embed_info": "Adja hozzá a \"Hoppscotch API Playground\"-ot weboldalához vagy blogjához.",
|
||||
"button": "Button",
|
||||
"button_info": "Create a 'Run in Hoppscotch' button for your website, blog or a README.",
|
||||
"copy_html": "Copy HTML",
|
||||
"copy_link": "Copy Link",
|
||||
"copy_markdown": "Copy Markdown",
|
||||
"creating_widget": "Creating widget",
|
||||
"customize": "Customize",
|
||||
"deleted": "Shared request deleted",
|
||||
"description": "Select a widget, you can change and customize this later",
|
||||
"embed": "Embed",
|
||||
"embed_info": "Add a mini 'Hoppscotch API Playground' to your website, blog or documentation.",
|
||||
"link": "Link",
|
||||
"link_info": "Link létrehozása olvasási joggal való megosztáshoz.",
|
||||
"modified": "Megosztott kérés módosítva",
|
||||
"not_found": "Megosztott kérés nem található.",
|
||||
"open_new_tab": "Megnyitás új lapon.",
|
||||
"preview": "Előnézet",
|
||||
"run_in_hoppscotch": "Futtatás Hoppscotch-ban.",
|
||||
"link_info": "Create a shareable link to share with anyone on the internet with view access.",
|
||||
"modified": "Shared request modified",
|
||||
"not_found": "Shared request not found",
|
||||
"open_new_tab": "Open in new tab",
|
||||
"preview": "Preview",
|
||||
"run_in_hoppscotch": "Run in Hoppscotch",
|
||||
"theme": {
|
||||
"dark": "Sötét",
|
||||
"light": "Világos",
|
||||
"system": "Rendszer",
|
||||
"title": "Téma"
|
||||
"dark": "Dark",
|
||||
"light": "Light",
|
||||
"system": "System",
|
||||
"title": "Theme"
|
||||
}
|
||||
},
|
||||
"shortcut": {
|
||||
@@ -669,7 +669,7 @@
|
||||
"title": "Általános"
|
||||
},
|
||||
"miscellaneous": {
|
||||
"invite": "Emberek meghívása a Hoppscotch-ba",
|
||||
"invite": "Emberek meghívása a Hoppscotchba",
|
||||
"title": "Egyebek"
|
||||
},
|
||||
"navigation": {
|
||||
@@ -691,19 +691,19 @@
|
||||
"delete_method": "DELETE módszer kiválasztása",
|
||||
"get_method": "GET módszer kiválasztása",
|
||||
"head_method": "HEAD módszer kiválasztása",
|
||||
"import_curl": "cURL importálása",
|
||||
"import_curl": "Import cURL",
|
||||
"method": "Módszer",
|
||||
"next_method": "Következő módszer kiválasztása",
|
||||
"post_method": "POST módszer kiválasztása",
|
||||
"previous_method": "Előző módszer kiválasztása",
|
||||
"put_method": "PUT módszer kiválasztása",
|
||||
"rename": "Kérés átnevezése",
|
||||
"rename": "Rename Request",
|
||||
"reset_request": "Kérés visszaállítása",
|
||||
"save_request": "Kérés mentése",
|
||||
"save_request": "Save Request",
|
||||
"save_to_collections": "Mentés a gyűjteményekbe",
|
||||
"send_request": "Kérés elküldése",
|
||||
"share_request": "Kérés megosztása",
|
||||
"show_code": "Kódrészlet generálása",
|
||||
"share_request": "Share Request",
|
||||
"show_code": "Generate code snippet",
|
||||
"title": "Kérés",
|
||||
"copy_request_link": "Kérés hivatkozásának másolása"
|
||||
},
|
||||
@@ -735,82 +735,82 @@
|
||||
"url": "URL"
|
||||
},
|
||||
"spotlight": {
|
||||
"change_language": "Nyelv váltása",
|
||||
"change_language": "Change Language",
|
||||
"environments": {
|
||||
"delete": "Jelenlegi környezet törlése",
|
||||
"duplicate": "Jelenlegi környezet duplikálása",
|
||||
"duplicate_global": "Globális környezet duplikálása",
|
||||
"edit": "Jelenlegi környezet szerkesztése",
|
||||
"edit_global": "Globális környezet szerkesztése",
|
||||
"new": "Új környezet létrehozása",
|
||||
"new_variable": "Új környezeti változó létrehozása",
|
||||
"title": "Környezetek"
|
||||
"delete": "Delete current environment",
|
||||
"duplicate": "Duplicate current environment",
|
||||
"duplicate_global": "Duplicate global environment",
|
||||
"edit": "Edit current environment",
|
||||
"edit_global": "Edit global environment",
|
||||
"new": "Create new environment",
|
||||
"new_variable": "Create a new environment variable",
|
||||
"title": "Environments"
|
||||
},
|
||||
"general": {
|
||||
"chat": "Üzenet a supportnak",
|
||||
"help_menu": "Segítség és support",
|
||||
"open_docs": "Dokumentáció olvasása",
|
||||
"open_github": "GitHub repository megnyitása",
|
||||
"open_keybindings": "Billentyűkombinációk megnyitása",
|
||||
"social": "Közösség",
|
||||
"title": "Általános"
|
||||
"chat": "Chat with support",
|
||||
"help_menu": "Help and support",
|
||||
"open_docs": "Read Documentation",
|
||||
"open_github": "Open GitHub repository",
|
||||
"open_keybindings": "Keyboard shortcuts",
|
||||
"social": "Social",
|
||||
"title": "General"
|
||||
},
|
||||
"graphql": {
|
||||
"connect": "Csatlakozás a szerverhez",
|
||||
"disconnect": "Lecsatlakozás a szerverről"
|
||||
"connect": "Connect to server",
|
||||
"disconnect": "Disconnect from server"
|
||||
},
|
||||
"miscellaneous": {
|
||||
"invite": "Hívja meg barátait a Hoppscotch-ba",
|
||||
"title": "Egyéb"
|
||||
"invite": "Invite your friends to Hoppscotch",
|
||||
"title": "Miscellaneous"
|
||||
},
|
||||
"request": {
|
||||
"save_as_new": "Mentés új kérésként",
|
||||
"select_method": "Módszer kiválasztása",
|
||||
"switch_to": "Váltás",
|
||||
"tab_authorization": "Azonosítás lap",
|
||||
"tab_body": "Törzs lap",
|
||||
"tab_headers": "Fejlécek lap",
|
||||
"tab_parameters": "Paraméterek lap",
|
||||
"tab_pre_request_script": "Előzetes script lap",
|
||||
"tab_query": "Kérés lap",
|
||||
"tab_tests": "Tesztek lap",
|
||||
"tab_variables": "Változók lap"
|
||||
"save_as_new": "Save as new request",
|
||||
"select_method": "Select method",
|
||||
"switch_to": "Switch to",
|
||||
"tab_authorization": "Authorization tab",
|
||||
"tab_body": "Body tab",
|
||||
"tab_headers": "Headers tab",
|
||||
"tab_parameters": "Parameters tab",
|
||||
"tab_pre_request_script": "Pre-request script tab",
|
||||
"tab_query": "Query tab",
|
||||
"tab_tests": "Tests tab",
|
||||
"tab_variables": "Variables tab"
|
||||
},
|
||||
"response": {
|
||||
"copy": "Válasz másolása",
|
||||
"download": "Válasz letöltése fájlként",
|
||||
"title": "Válasz"
|
||||
"copy": "Copy response",
|
||||
"download": "Download response as file",
|
||||
"title": "Response"
|
||||
},
|
||||
"section": {
|
||||
"interceptor": "Interceptor",
|
||||
"interface": "Interface",
|
||||
"theme": "Téma",
|
||||
"user": "Felhasználó"
|
||||
"theme": "Theme",
|
||||
"user": "User"
|
||||
},
|
||||
"settings": {
|
||||
"change_interceptor": "Interceptor váltása",
|
||||
"change_language": "Nyelv váltása",
|
||||
"change_interceptor": "Change Interceptor",
|
||||
"change_language": "Change Language",
|
||||
"theme": {
|
||||
"black": "Fekete",
|
||||
"dark": "Sötét",
|
||||
"light": "Világos",
|
||||
"system": "Rendszer"
|
||||
"black": "Black",
|
||||
"dark": "Dark",
|
||||
"light": "Light",
|
||||
"system": "System preference"
|
||||
}
|
||||
},
|
||||
"tab": {
|
||||
"close_current": "Jelenlegi lap bezására",
|
||||
"close_others": "Összes többi lap bezására",
|
||||
"duplicate": "Jelenlegi lap diplikálása",
|
||||
"new_tab": "Új lap megnyitása",
|
||||
"title": "Lapok"
|
||||
"close_current": "Close current tab",
|
||||
"close_others": "Close all other tabs",
|
||||
"duplicate": "Duplicate current tab",
|
||||
"new_tab": "Open a new tab",
|
||||
"title": "Tabs"
|
||||
},
|
||||
"workspace": {
|
||||
"delete": "Jelenlegi csapat törlése",
|
||||
"edit": "Jelenlegi csapat szerkesztése",
|
||||
"invite": "Emberek meghívása a jelenlegi csapatba",
|
||||
"new": "Új csapat létrehozása",
|
||||
"switch_to_personal": "Váltás a személyes munkaterületére",
|
||||
"title": "Csapatok"
|
||||
"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": "Teams"
|
||||
}
|
||||
},
|
||||
"sse": {
|
||||
@@ -828,20 +828,20 @@
|
||||
"connection_error": "Nem sikerült kapcsolódni",
|
||||
"connection_failed": "A kapcsolódás sikertelen",
|
||||
"connection_lost": "A kapcsolat elveszett",
|
||||
"copied_interface_to_clipboard": "{language} interface típusa vágólapra másolva",
|
||||
"copied_interface_to_clipboard": "Copied {language} interface type to clipboard",
|
||||
"copied_to_clipboard": "Vágólapra másolva",
|
||||
"deleted": "Törölve",
|
||||
"deprecated": "ELAVULT",
|
||||
"disabled": "Letiltva",
|
||||
"disconnected": "Lecsatlakoztatva",
|
||||
"disconnected_from": "Lecsatlakoztatva innen: {name}",
|
||||
"disconnected": "Leválasztva",
|
||||
"disconnected_from": "Leválasztva innen: {name}",
|
||||
"docs_generated": "Dokumentáció előállítva",
|
||||
"download_failed": "Letöltés sikertelen",
|
||||
"download_failed": "Download failed",
|
||||
"download_started": "A letöltés elkezdődött",
|
||||
"enabled": "Engedélyezve",
|
||||
"file_imported": "Fájl importálva",
|
||||
"finished_in": "Befejeződött {duration} ms alatt",
|
||||
"hide": "Elrejtés",
|
||||
"hide": "Hide",
|
||||
"history_deleted": "Előzmények törölve",
|
||||
"linewrap": "Sorok tördelése",
|
||||
"loading": "Betöltés…",
|
||||
@@ -872,13 +872,13 @@
|
||||
"twitter": "Kövessen minket Twitteren"
|
||||
},
|
||||
"tab": {
|
||||
"authorization": "Azonosítás",
|
||||
"authorization": "Felhatalmazás",
|
||||
"body": "Törzs",
|
||||
"close": "Lap bezárása",
|
||||
"close_others": "Többi lap bezárása",
|
||||
"close": "Close Tab",
|
||||
"close_others": "Close other Tabs",
|
||||
"collections": "Gyűjtemények",
|
||||
"documentation": "Dokumentáció",
|
||||
"duplicate": "Lap duplikálása",
|
||||
"duplicate": "Duplicate Tab",
|
||||
"environments": "Környezetek",
|
||||
"headers": "Fejlécek",
|
||||
"history": "Előzmények",
|
||||
@@ -905,7 +905,7 @@
|
||||
"email_do_not_match": "Az e-mail-cím nem egyezik a fiókja részleteivel. Vegye fel a kapcsolatot a csapat tulajdonosával.",
|
||||
"exit": "Kilépés a csapatból",
|
||||
"exit_disabled": "Csak a tulajdonos nem léphet ki a csapatból",
|
||||
"failed_invites": "Hiba a meghívás közben",
|
||||
"failed_invites": "Failed invites",
|
||||
"invalid_coll_id": "Érvénytelen gyűjteményazonosító",
|
||||
"invalid_email_format": "Az e-mail formátuma érvénytelen",
|
||||
"invalid_id": "Érvénytelen csapatazonosító. Vegye fel a kapcsolatot a csapat tulajdonosával.",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -11,13 +11,12 @@
|
||||
"connect": "Подключиться",
|
||||
"connecting": "Соединение...",
|
||||
"copy": "Скопировать",
|
||||
"create": "Создать",
|
||||
"create": "Create",
|
||||
"delete": "Удалить",
|
||||
"disconnect": "Отключиться",
|
||||
"dismiss": "Скрыть",
|
||||
"dont_save": "Не сохранять",
|
||||
"download_file": "Скачать файл",
|
||||
"download_here": "Download here",
|
||||
"drag_to_reorder": "Перетягивайте для сортировки",
|
||||
"duplicate": "Дублировать",
|
||||
"edit": "Редактировать",
|
||||
@@ -25,7 +24,6 @@
|
||||
"go_back": "Вернуться",
|
||||
"go_forward": "Вперёд",
|
||||
"group_by": "Сгруппировать по",
|
||||
"hide_secret": "Hide secret",
|
||||
"label": "Название",
|
||||
"learn_more": "Узнать больше",
|
||||
"less": "Меньше",
|
||||
@@ -35,7 +33,7 @@
|
||||
"open_workspace": "Открыть пространство",
|
||||
"paste": "Вставить",
|
||||
"prettify": "Форматировать",
|
||||
"properties": "Параметры",
|
||||
"properties": "Properties",
|
||||
"remove": "Удалить",
|
||||
"rename": "Переименовать",
|
||||
"restore": "Восстановить",
|
||||
@@ -44,14 +42,13 @@
|
||||
"scroll_to_top": "Вверх",
|
||||
"search": "Поиск",
|
||||
"send": "Отправить",
|
||||
"share": "Поделиться",
|
||||
"show_secret": "Show secret",
|
||||
"share": "Share",
|
||||
"start": "Начать",
|
||||
"starting": "Запускаю",
|
||||
"stop": "Стоп",
|
||||
"to_close": "закрыть",
|
||||
"to_close": "что бы закрыть",
|
||||
"to_navigate": "для навигации",
|
||||
"to_select": "выбрать",
|
||||
"to_select": "выборать",
|
||||
"turn_off": "Выключить",
|
||||
"turn_on": "Включить",
|
||||
"undo": "Отменить",
|
||||
@@ -69,12 +66,12 @@
|
||||
"copy_interface_type": "Copy interface type",
|
||||
"copy_user_id": "Копировать токен пользователя",
|
||||
"developer_option": "Настройки разработчика",
|
||||
"developer_option_description": "Инструмент разработчика помогает обслуживать и развивать Hoppscotch",
|
||||
"developer_option_description": "Инструмент разработчика помогает обслуживить и развивить Hoppscotch",
|
||||
"discord": "Discord",
|
||||
"documentation": "Документация",
|
||||
"github": "GitHub",
|
||||
"help": "Справка, отзывы и документация",
|
||||
"home": "На главную",
|
||||
"home": "Дом",
|
||||
"invite": "Пригласить",
|
||||
"invite_description": "В Hoppscotch мы разработали простой и интуитивно понятный интерфейс для создания и управления вашими API. Hoppscotch - это инструмент, который помогает создавать, тестировать, документировать и делиться своими API.",
|
||||
"invite_your_friends": "Пригласить своих друзей",
|
||||
@@ -88,7 +85,7 @@
|
||||
"reload": "Перезагрузить",
|
||||
"search": "Поиск",
|
||||
"share": "Поделиться",
|
||||
"shortcuts": "Горячие клавиши",
|
||||
"shortcuts": "Ярлыки",
|
||||
"social_description": "Подписывайся на наши соц. сети и оставайся всегда в курсе последних новостей, обновлений и релизов.",
|
||||
"social_links": "Социальные сети",
|
||||
"spotlight": "Прожектор",
|
||||
@@ -99,19 +96,17 @@
|
||||
"type_a_command_search": "Введите команду или выполните поиск…",
|
||||
"we_use_cookies": "Мы используем куки",
|
||||
"whats_new": "Что нового?",
|
||||
"wiki": "Узнать больше"
|
||||
"wiki": "Вики"
|
||||
},
|
||||
"auth": {
|
||||
"account_exists": "Учетная запись существует с разными учетными данными - войдите, чтобы связать обе учетные записи",
|
||||
"all_sign_in_options": "Все варианты входа",
|
||||
"continue_with_auth_provider": "Continue with {provider}",
|
||||
"continue_with_email": "Продолжить с электронной почтой",
|
||||
"continue_with_github": "Продолжить с GitHub",
|
||||
"continue_with_github_enterprise": "Continue with GitHub Enterprise",
|
||||
"continue_with_google": "Продолжить с Google",
|
||||
"continue_with_microsoft": "Продолжить с Microsoft",
|
||||
"email": "Электронное письмо",
|
||||
"logged_out": "Успешно вышли. Будем скучать!",
|
||||
"logged_out": "Вышли из",
|
||||
"login": "Авторизоваться",
|
||||
"login_success": "Успешный вход в систему",
|
||||
"login_to_hoppscotch": "Войти в Hoppscotch",
|
||||
@@ -126,7 +121,7 @@
|
||||
"generate_token": "Сгенерировать токен",
|
||||
"graphql_headers": "Authorization Headers are sent as part of the payload to connection_init",
|
||||
"include_in_url": "Добавить в URL",
|
||||
"inherited_from": "Унаследован тип аутентификации {auth} из родительской коллекции {collection}",
|
||||
"inherited_from": "Inherited {auth} from parent collection {collection} ",
|
||||
"learn": "Узнать больше",
|
||||
"oauth": {
|
||||
"redirect_auth_server_returned_error": "Auth Server returned an error state",
|
||||
@@ -140,32 +135,11 @@
|
||||
"redirect_no_token_endpoint": "No Token Endpoint Defined",
|
||||
"something_went_wrong_on_oauth_redirect": "Something went wrong during OAuth Redirect",
|
||||
"something_went_wrong_on_token_generation": "Something went wrong on token generation",
|
||||
"token_generation_oidc_discovery_failed": "Failure on token generation: OpenID Connect Discovery Failed",
|
||||
"grant_type": "Grant Type",
|
||||
"grant_type_auth_code": "Authorization Code",
|
||||
"token_fetched_successfully": "Token fetched successfully",
|
||||
"token_fetch_failed": "Failed to fetch token",
|
||||
"validation_failed": "Validation Failed, please check the form fields",
|
||||
"label_authorization_endpoint": "Authorization Endpoint",
|
||||
"label_client_id": "Client ID",
|
||||
"label_client_secret": "Client Secret",
|
||||
"label_code_challenge": "Code Challenge",
|
||||
"label_code_challenge_method": "Code Challenge Method",
|
||||
"label_code_verifier": "Code Verifier",
|
||||
"label_scopes": "Scopes",
|
||||
"label_token_endpoint": "Token Endpoint",
|
||||
"label_use_pkce": "Use PKCE",
|
||||
"label_implicit": "Implicit",
|
||||
"label_password": "Password",
|
||||
"label_username": "Username",
|
||||
"label_auth_code": "Authorization Code",
|
||||
"label_client_credentials": "Client Credentials"
|
||||
"token_generation_oidc_discovery_failed": "Failure on token generation: OpenID Connect Discovery Failed"
|
||||
},
|
||||
"pass_by_headers_label": "Headers",
|
||||
"pass_by_query_params_label": "Query Parameters",
|
||||
"pass_key_by": "Pass by",
|
||||
"password": "Пароль",
|
||||
"save_to_inherit": "Чтобы унаследовать аутентификации, нужно сохранить запрос в коллекции",
|
||||
"save_to_inherit": "Please save this request in any collection to inherit the authorization",
|
||||
"token": "Токен",
|
||||
"type": "Метод авторизации",
|
||||
"username": "Имя пользователя"
|
||||
@@ -175,7 +149,6 @@
|
||||
"different_parent": "Нельзя сортировать коллекцию с разной родительской коллекцией",
|
||||
"edit": "Редактировать коллекцию",
|
||||
"import_or_create": "Вы можете импортировать существующую или создать новую коллекцию",
|
||||
"import_collection": "Импортировать коллекцию",
|
||||
"invalid_name": "Укажите допустимое название коллекции",
|
||||
"invalid_root_move": "Коллекция уже в корне",
|
||||
"moved": "Перемещено успешно",
|
||||
@@ -184,36 +157,38 @@
|
||||
"name_length_insufficient": "Имя коллекции должно иметь 3 или более символов",
|
||||
"new": "Создать коллекцию",
|
||||
"order_changed": "Порядок коллекции обновлён",
|
||||
"properties": "Параметры коллекции",
|
||||
"properties_updated": "Параметры коллекции обновлены",
|
||||
"properties": "Collection Properties",
|
||||
"properties_updated": "Collection Properties Updated",
|
||||
"renamed": "Коллекция переименована",
|
||||
"request_in_use": "Запрос обрабатывается",
|
||||
"save_as": "Сохранить как",
|
||||
"save_to_collection": "Сохранить в коллекцию",
|
||||
"select": "Выбрать коллекцию",
|
||||
"select_location": "Выберите местоположение"
|
||||
"select_location": "Выберите местоположение",
|
||||
"select_team": "Выберите команду",
|
||||
"team_collections": "Коллекции команд"
|
||||
},
|
||||
"confirm": {
|
||||
"close_unsaved_tab": "Вы уверены, что хотите закрыть эту вкладку?",
|
||||
"close_unsaved_tabs": "Вы уверены, что хотите закрыть все эти вкладки? Несохранённые данные {count} вкладок будут утеряны.",
|
||||
"close_unsaved_tab": "Вы уверены что хотите закрыть эту вкладку?",
|
||||
"close_unsaved_tabs": "Вы уверены что хотите закрыть все эти вкладки? Несохранённые данные {count} вкладок будут утеряны.",
|
||||
"exit_team": "Вы точно хотите покинуть эту команду?",
|
||||
"logout": "Вы действительно хотите выйти?",
|
||||
"remove_collection": "Вы уверены, что хотите навсегда удалить эту коллекцию?",
|
||||
"remove_environment": "Вы действительно хотите удалить это окружение без возможности восстановления?",
|
||||
"remove_environment": "Вы действительно хотите удалить эту среду без возможности восстановления?",
|
||||
"remove_folder": "Вы уверены, что хотите навсегда удалить эту папку?",
|
||||
"remove_history": "Вы уверены, что хотите навсегда удалить всю историю?",
|
||||
"remove_request": "Вы уверены, что хотите навсегда удалить этот запрос?",
|
||||
"remove_shared_request": "Вы уверены, что хотите навсегда удалить этот запрос?",
|
||||
"remove_shared_request": "Are you sure you want to permanently delete this shared request?",
|
||||
"remove_team": "Вы уверены, что хотите удалить эту команду?",
|
||||
"remove_telemetry": "Вы действительно хотите отказаться от телеметрии?",
|
||||
"request_change": "Вы уверены, что хотите сбросить текущий запрос, все не сохранённые данные будт утеряны?",
|
||||
"request_change": "Вы уверены что хотите сбросить текущий запрос, все не сохранённые данные будт утеряны?",
|
||||
"save_unsaved_tab": "Вы хотите сохранить изменения в этой вкладке?",
|
||||
"sync": "Вы уверены, что хотите синхронизировать это рабочее пространство?"
|
||||
},
|
||||
"context_menu": {
|
||||
"add_parameters": "Добавить в список параметров",
|
||||
"open_request_in_new_tab": "Открыть запрос в новом окне",
|
||||
"set_environment_variable": "Добавить значение в переменную"
|
||||
"add_parameters": "Add to parameters",
|
||||
"open_request_in_new_tab": "Open request in new tab",
|
||||
"set_environment_variable": "Set as variable"
|
||||
},
|
||||
"cookies": {
|
||||
"modal": {
|
||||
@@ -252,25 +227,24 @@
|
||||
"collections": "Коллекции пустые",
|
||||
"documentation": "Подключите GraphQL endpoint, чтобы увидеть документацию.",
|
||||
"endpoint": "Endpoint не может быть пустым",
|
||||
"environments": "Переменных окружения нет",
|
||||
"environments": "Окружения пусты",
|
||||
"folder": "Папка пуста",
|
||||
"headers": "У этого запроса нет заголовков",
|
||||
"history": "История пуста",
|
||||
"invites": "Вы еще никого не приглашали",
|
||||
"members": "В этой команде еще нет участников",
|
||||
"parameters": "Этот запрос не содержит параметров",
|
||||
"parameters": "Этот запрос не имеет параметров",
|
||||
"pending_invites": "Пока что нет ожидающих заявок на вступление в команду",
|
||||
"profile": "Войдите, чтобы просмотреть свой профиль",
|
||||
"protocols": "Протоколы пустые",
|
||||
"request_variables": "Этот запрос не содержит никаких переменных",
|
||||
"secret_environments": "Секреты хранятся только на этом устройстве и не синхронизируются с сервером",
|
||||
"schema": "Подключиться к конечной точке GraphQL",
|
||||
"shared_requests": "Вы еще не делились запросами с другими",
|
||||
"shared_requests_logout": "Нужно войти, чтобы делиться запросами и управлять ими",
|
||||
"shared_requests": "Shared requests are empty",
|
||||
"shared_requests_logout": "Login to view your shared requests or create a new one",
|
||||
"subscription": "Нет подписок",
|
||||
"team_name": "Название команды пусто",
|
||||
"teams": "Команды пустые",
|
||||
"tests": "Для этого запроса нет тестов"
|
||||
"tests": "Для этого запроса нет тестов",
|
||||
"shortcodes": "Нет коротких ссылок"
|
||||
},
|
||||
"environment": {
|
||||
"add_to_global": "Добавить в глобальное окружение",
|
||||
@@ -278,57 +252,53 @@
|
||||
"create_new": "Создать новое окружение",
|
||||
"created": "Окружение создано",
|
||||
"deleted": "Окружение удалено",
|
||||
"duplicated": "Окружение продублировано",
|
||||
"duplicated": "Environment duplicated",
|
||||
"edit": "Редактировать окружение",
|
||||
"empty_variables": "Переменные еще не добавлены",
|
||||
"empty_variables": "No variables",
|
||||
"global": "Global",
|
||||
"global_variables": "Глобальные переменные",
|
||||
"global_variables": "Global variables",
|
||||
"import_or_create": "Импортировать или создать новое окружение",
|
||||
"invalid_name": "Укажите допустимое имя для окружения",
|
||||
"list": "Переменные окружения",
|
||||
"my_environments": "Мои окружения",
|
||||
"name": "Имя",
|
||||
"name": "Name",
|
||||
"nested_overflow": "максимальный уровень вложения переменных окружения - 10",
|
||||
"new": "Новая среда",
|
||||
"no_active_environment": "Нет активных окружений",
|
||||
"no_environment": "Нет окружения",
|
||||
"no_environment_description": "Не выбрано окружение, выберите что делать с переменными.",
|
||||
"quick_peek": "Быстрый просмотр переменных",
|
||||
"quick_peek": "Environment Quick Peek",
|
||||
"replace_with_variable": "Replace with variable",
|
||||
"scope": "Scope",
|
||||
"secrets": "Секретные переменные",
|
||||
"secret_value": "Секретное значение",
|
||||
"select": "Выберите среду",
|
||||
"set": "Выбрать окружение",
|
||||
"set_as_environment": "Поместить значение в переменную",
|
||||
"set": "Set environment",
|
||||
"set_as_environment": "Set as environment",
|
||||
"team_environments": "Окружения команды",
|
||||
"title": "Окружения",
|
||||
"updated": "Окружение обновлено",
|
||||
"value": "Значение",
|
||||
"variable": "Переменная",
|
||||
"variables": "Переменные",
|
||||
"value": "Value",
|
||||
"variable": "Variable",
|
||||
"variable_list": "Список переменных"
|
||||
},
|
||||
"error": {
|
||||
"authproviders_load_error": "Unable to load auth providers",
|
||||
"browser_support_sse": "Похоже, в этом браузере нет поддержки событий, отправленных сервером.",
|
||||
"check_console_details": "Подробности смотрите в журнале консоли.",
|
||||
"check_how_to_add_origin": "Инструкция как это сделать",
|
||||
"check_how_to_add_origin": "Инструкция как добавить origin в настройки расширения",
|
||||
"curl_invalid_format": "cURL неправильно отформатирован",
|
||||
"danger_zone": "Опасная зона",
|
||||
"delete_account": "Вы являетесь владельцем этой команды:",
|
||||
"delete_account_description": "Прежде чем удалить аккаунт вам необходимо либо назначить владельцом другого пользователя, либо удалить команды в которых вы являетесь владельцем.",
|
||||
"empty_profile_name": "Имя пользователя не может быть пустым",
|
||||
"empty_req_name": "Пустое имя запроса",
|
||||
"f12_details": "(F12 для подробностей)",
|
||||
"gql_prettify_invalid_query": "Не удалось отформатировать, т.к. в запросе есть синтаксические ошибки. Устраните их и повторите попытку.",
|
||||
"gql_prettify_invalid_query": "Не удалось определить недопустимый запрос, устранить синтаксические ошибки запроса и повторить попытку.",
|
||||
"incomplete_config_urls": "Не заполнены URL конфигурации",
|
||||
"incorrect_email": "Не корректный Email",
|
||||
"invalid_link": "Не корректная ссылка",
|
||||
"invalid_link_description": "Ссылка, по которой вы перешли, - недействительна, либо срок ее действия истек.",
|
||||
"invalid_embed_link": "The embed does not exist or is invalid.",
|
||||
"json_parsing_failed": "Не корректный JSON",
|
||||
"json_prettify_invalid_body": "Не удалось определить формат строки, устраните синтаксические ошибки и повторите попытку.",
|
||||
"json_prettify_invalid_body": "Не удалось определить недопустимое тело, устранить синтаксические ошибки json и повторить попытку.",
|
||||
"network_error": "Похоже, возникла проблема с соединением. Попробуйте еще раз.",
|
||||
"network_fail": "Не удалось отправить запрос",
|
||||
"no_collections_to_export": "Нечего экспортировать. Для начала нужно создать коллекцию.",
|
||||
@@ -336,10 +306,8 @@
|
||||
"no_environments_to_export": "Нечего экспортировать. Для начала нужно создать переменные окружения.",
|
||||
"no_results_found": "Совпадения не найдены",
|
||||
"page_not_found": "Эта страница не найдена",
|
||||
"please_install_extension": "Ничего страшного. Просто нужно установить специальное расширение в браузере.",
|
||||
"please_install_extension": "Нужно установить специальное расширение и добавить этот домен как новый origin в настройках расширения.",
|
||||
"proxy_error": "Proxy error",
|
||||
"reading_files": "Произошла ошибка при чтении файла или нескольких файлов",
|
||||
"same_profile_name": "Задано имя пользователя такое же как и было",
|
||||
"script_fail": "Не удалось выполнить сценарий предварительного запроса",
|
||||
"something_went_wrong": "Что-то пошло не так",
|
||||
"test_script_fail": "Не удалось выполнить тестирование запроса"
|
||||
@@ -347,12 +315,13 @@
|
||||
"export": {
|
||||
"as_json": "Экспорт как JSON",
|
||||
"create_secret_gist": "Создать секретный Gist",
|
||||
"create_secret_gist_tooltip_text": "Экспортировать как секретный Gist",
|
||||
"failed": "Произошла ошибка во время экспорта",
|
||||
"secret_gist_success": "Успешно экспортировано как секретный Gist",
|
||||
"create_secret_gist_tooltip_text": "Export as secret Gist",
|
||||
"failed": "Something went wrong while exporting",
|
||||
"secret_gist_success": "Successfully exported as secret Gist",
|
||||
"require_github": "Войдите через GitHub, чтобы создать секретную суть",
|
||||
"title": "Экспорт",
|
||||
"success": "Успешно экспортировано"
|
||||
"success": "Successfully exported",
|
||||
"gist_created": "Gist создан"
|
||||
},
|
||||
"filter": {
|
||||
"all": "Все",
|
||||
@@ -377,7 +346,7 @@
|
||||
"switch_connection": "Изменить соединение"
|
||||
},
|
||||
"graphql_collections": {
|
||||
"title": "Коллекции GraphQL"
|
||||
"title": "GraphQL Collections"
|
||||
},
|
||||
"group": {
|
||||
"time": "Время",
|
||||
@@ -390,8 +359,8 @@
|
||||
},
|
||||
"helpers": {
|
||||
"authorization": "Заголовок авторизации будет автоматически сгенерирован при отправке запроса.",
|
||||
"collection_properties_authorization": "Этот заголовок авторизации будет подставляться при каждом запросе в этой коллекции.",
|
||||
"collection_properties_header": "Этот заголовок будет подставляться при каждом запросе в этой коллекции.",
|
||||
"collection_properties_authorization": " This authorization will be set for every request in this collection.",
|
||||
"collection_properties_header": "This header will be set for every request in this collection.",
|
||||
"generate_documentation_first": "Сначала создайте документацию",
|
||||
"network_fail": "Невозможно достичь конечной точки API. Проверьте подключение к сети и попробуйте еще раз.",
|
||||
"offline": "Кажется, вы не в сети. Данные в этой рабочей области могут быть устаревшими.",
|
||||
@@ -411,12 +380,10 @@
|
||||
"import": {
|
||||
"collections": "Импортировать коллекции",
|
||||
"curl": "Импортировать из cURL",
|
||||
"environments_from_gist": "Импортировать из Gist",
|
||||
"environments_from_gist_description": "Импортировать переменные окружения Hoppscotch из Gist",
|
||||
"environments_from_gist": "Import From Gist",
|
||||
"environments_from_gist_description": "Import Hoppscotch Environments From Gist",
|
||||
"failed": "Ошибка импорта",
|
||||
"file_size_limit_exceeded_warning_multiple_files": "Выбранные файлы превышают рекомендованный лимит в 10MB. Были импортированы только первые {files}",
|
||||
"file_size_limit_exceeded_warning_single_file": "Размер выбранного в данный момент файла превышает рекомендуемый лимит в 10 МБ. Пожалуйста, выберите другой файл.",
|
||||
"from_file": "Импортировать из одного или нескольких файлов",
|
||||
"from_file": "Import from File",
|
||||
"from_gist": "Импорт из Gist",
|
||||
"from_gist_description": "Импортировать через Gist URL",
|
||||
"from_insomnia": "Импортировать с Insomnia",
|
||||
@@ -431,9 +398,9 @@
|
||||
"from_postman_description": "Импортировать из коллекции Postman",
|
||||
"from_url": "Импортировать из URL",
|
||||
"gist_url": "Введите URL-адрес Gist",
|
||||
"gql_collections_from_gist_description": "Импортировать GraphQL коллекцию из Gist",
|
||||
"gql_collections_from_gist_description": "Import GraphQL Collections From Gist",
|
||||
"hoppscotch_environment": "Hoppscotch Environment",
|
||||
"hoppscotch_environment_description": "Импортировать окружение Hoppscotch из JSON файла",
|
||||
"hoppscotch_environment_description": "Import Hoppscotch Environment JSON file",
|
||||
"import_from_url_invalid_fetch": "Не удалить получить данные по этому URL",
|
||||
"import_from_url_invalid_file_format": "Ошибка при импорте коллекций",
|
||||
"import_from_url_invalid_type": "Неподдерживаемый тип. Поддерживаемые типы: 'hoppscotch', 'openapi', 'postman', 'insomnia'",
|
||||
@@ -442,19 +409,16 @@
|
||||
"json_description": "Импортировать из коллекции Hoppscotch",
|
||||
"postman_environment": "Postman Environment",
|
||||
"postman_environment_description": "Import Postman Environment from a JSON file",
|
||||
"success": "Успешно импортировано",
|
||||
"title": "Импортировать"
|
||||
},
|
||||
"inspections": {
|
||||
"description": "Показать возможные ошибки",
|
||||
"description": "Inspect possible errors",
|
||||
"environment": {
|
||||
"add_environment": "Добавить переменную",
|
||||
"add_environment_value": "Заполнить значение",
|
||||
"empty_value": "Значение переменной окружения '{variable}' пустое",
|
||||
"not_found": "Переменная окружения “{environment}” не задана."
|
||||
"add_environment": "Add to Environment",
|
||||
"not_found": "Environment variable “{environment}” not found."
|
||||
},
|
||||
"header": {
|
||||
"cookie": "Из-за ограничений безопасности в веб версии нельзя задать Cookie параметры. Пожалуйста, используйте Hoppscotch Desktop приложение или используйте заголовок Authorization вместо этого."
|
||||
"cookie": "The browser doesn't allow Hoppscotch to set the Cookie Header. While we're working on the Hoppscotch Desktop App (coming soon), please use the Authorization Header instead."
|
||||
},
|
||||
"response": {
|
||||
"401_error": "Please check your authentication credentials.",
|
||||
@@ -463,12 +427,12 @@
|
||||
"default_error": "Please check your request.",
|
||||
"network_error": "Please check your network connection."
|
||||
},
|
||||
"title": "Помощник",
|
||||
"title": "Inspector",
|
||||
"url": {
|
||||
"extension_not_installed": "Расширение не установлено.",
|
||||
"extension_unknown_origin": "Убедитесь, что текущий домен добавлен в список доверенных ресурсов в расширении браузера",
|
||||
"extention_enable_action": "Подключить расширение",
|
||||
"extention_not_enabled": "Расширение в браузере не подключено."
|
||||
"extension_not_installed": "Extension not installed.",
|
||||
"extension_unknown_origin": "Make sure you've added the API endpoint's origin to the Hoppscotch Browser Extension list.",
|
||||
"extention_enable_action": "Enable Browser Extension",
|
||||
"extention_not_enabled": "Extension not enabled."
|
||||
}
|
||||
},
|
||||
"layout": {
|
||||
@@ -481,11 +445,11 @@
|
||||
"modal": {
|
||||
"close_unsaved_tab": "У вас есть не сохранённые изменения",
|
||||
"collections": "Коллекции",
|
||||
"confirm": "Подтвердите действие",
|
||||
"confirm": "Подтверждать",
|
||||
"customize_request": "Customize Request",
|
||||
"edit_request": "Изменить запрос",
|
||||
"import_export": "Импорт Экспорт",
|
||||
"share_request": "Поделиться запросом"
|
||||
"share_request": "Share Request"
|
||||
},
|
||||
"mqtt": {
|
||||
"already_subscribed": "Вы уже подписаны на этот топик",
|
||||
@@ -521,7 +485,7 @@
|
||||
"doc": "Документы",
|
||||
"graphql": "GraphQL",
|
||||
"profile": "Профиль",
|
||||
"realtime": "Realtime",
|
||||
"realtime": "В реальном времени",
|
||||
"rest": "REST",
|
||||
"settings": "Настройки"
|
||||
},
|
||||
@@ -543,8 +507,8 @@
|
||||
"roles": "Роли",
|
||||
"roles_description": "Роли позволяют настраивать доступ конкретным людям к публичным коллекциям.",
|
||||
"updated": "Профиль обновлен",
|
||||
"viewer": "Читатель",
|
||||
"viewer_description": "Могут только просматривать и использовать запросы."
|
||||
"viewer": "Зритель",
|
||||
"viewer_description": "Зрительно могут только просматривать и использовать запросы."
|
||||
},
|
||||
"remove": {
|
||||
"star": "Удалить звезду"
|
||||
@@ -566,11 +530,11 @@
|
||||
"enter_curl": "Введите сюда команду cURL",
|
||||
"generate_code": "Сгенерировать код",
|
||||
"generated_code": "Сгенерированный код",
|
||||
"go_to_authorization_tab": "Перейти на вкладку авторизации",
|
||||
"go_to_body_tab": "Перейти на вкладку тела запроса",
|
||||
"go_to_authorization_tab": "Go to Authorization",
|
||||
"go_to_body_tab": "Go to Body tab",
|
||||
"header_list": "Список заголовков",
|
||||
"invalid_name": "Укажите имя для запроса",
|
||||
"method": "Метод",
|
||||
"method": "Методика",
|
||||
"moved": "Запрос перемещён",
|
||||
"name": "Имя запроса",
|
||||
"new": "Новый запрос",
|
||||
@@ -584,22 +548,22 @@
|
||||
"payload": "Полезная нагрузка",
|
||||
"query": "Запрос",
|
||||
"raw_body": "Необработанное тело запроса",
|
||||
"rename": "Переименовать запрос",
|
||||
"rename": "Переименость запрос",
|
||||
"renamed": "Запрос переименован",
|
||||
"request_variables": "Переменные запроса",
|
||||
"run": "Запустить",
|
||||
"save": "Сохранить",
|
||||
"save_as": "Сохранить как",
|
||||
"saved": "Запрос сохранен",
|
||||
"share": "Поделиться",
|
||||
"share": "Делиться",
|
||||
"share_description": "Поделиться Hoppscotch с друзьями",
|
||||
"share_request": "Поделиться запросом",
|
||||
"stop": "Стоп",
|
||||
"share_request": "Share Request",
|
||||
"stop": "Stop",
|
||||
"title": "Запрос",
|
||||
"type": "Тип запроса",
|
||||
"url": "URL",
|
||||
"variables": "Переменные",
|
||||
"view_my_links": "Посмотреть мои ссылки"
|
||||
"view_my_links": "Посмотреть мои ссылки",
|
||||
"copy_link": "Копировать ссылку"
|
||||
},
|
||||
"response": {
|
||||
"audio": "Аудио",
|
||||
@@ -622,7 +586,7 @@
|
||||
},
|
||||
"settings": {
|
||||
"accent_color": "Основной цвет",
|
||||
"account": "Аккаунт",
|
||||
"account": "Счет",
|
||||
"account_deleted": "Ваш аккаунт был удалён",
|
||||
"account_description": "Настройте параметры своей учетной записи.",
|
||||
"account_email_description": "Ваш основной адрес электронной почты.",
|
||||
@@ -675,29 +639,29 @@
|
||||
"verify_email": "Подтвердить Email"
|
||||
},
|
||||
"shared_requests": {
|
||||
"button": "Кнопка",
|
||||
"button_info": "Создать кнопку 'Run in Hoppscotch' на свой сайт, блог или README.",
|
||||
"copy_html": "Копировать HTML код",
|
||||
"copy_link": "Копировать ссылку",
|
||||
"copy_markdown": "Копировать Markdown",
|
||||
"creating_widget": "Создание виджет",
|
||||
"customize": "Настроить",
|
||||
"deleted": "Запрос удален",
|
||||
"description": "Выберите вид как вы поделитесь запросом, позже вы сможете дополнительно его настроить",
|
||||
"embed": "Встраиваемое окно",
|
||||
"embed_info": "Добавьте небольшую площадку 'Hoppscotch API Playground' на свой веб-сайт, блог или документацию.",
|
||||
"link": "Ссылка",
|
||||
"link_info": "Создайте общедоступную ссылку, которой можно поделиться с любым пользователем, имеющим доступ к просмотру.",
|
||||
"modified": "Запрос изменен",
|
||||
"not_found": "Такой ссылке не нашлось",
|
||||
"open_new_tab": "Открыть в новом окне",
|
||||
"button": "Button",
|
||||
"button_info": "Create a 'Run in Hoppscotch' button for your website, blog or a README.",
|
||||
"copy_html": "Copy HTML",
|
||||
"copy_link": "Copy Link",
|
||||
"copy_markdown": "Copy Markdown",
|
||||
"creating_widget": "Creating widget",
|
||||
"customize": "Customize",
|
||||
"deleted": "Shared request deleted",
|
||||
"description": "Select a widget, you can change and customize this later",
|
||||
"embed": "Embed",
|
||||
"embed_info": "Add a mini 'Hoppscotch API Playground' to your website, blog or documentation.",
|
||||
"link": "Link",
|
||||
"link_info": "Create a shareable link to share with anyone on the internet with view access.",
|
||||
"modified": "Shared request modified",
|
||||
"not_found": "Shared request not found",
|
||||
"open_new_tab": "Open in new tab",
|
||||
"preview": "Preview",
|
||||
"run_in_hoppscotch": "Run in Hoppscotch",
|
||||
"theme": {
|
||||
"dark": "Темная",
|
||||
"light": "Светлая",
|
||||
"system": "Системная",
|
||||
"title": "Тема"
|
||||
"dark": "Dark",
|
||||
"light": "Light",
|
||||
"system": "System",
|
||||
"title": "Theme"
|
||||
}
|
||||
},
|
||||
"shortcut": {
|
||||
@@ -705,7 +669,7 @@
|
||||
"close_current_menu": "Закрыть текущее меню",
|
||||
"command_menu": "Меню поиска и команд",
|
||||
"help_menu": "Меню помощи",
|
||||
"show_all": "Список горячих клавиш",
|
||||
"show_all": "Горячие клавиши",
|
||||
"title": "Общий"
|
||||
},
|
||||
"miscellaneous": {
|
||||
@@ -732,19 +696,20 @@
|
||||
"get_method": "Выберите метод GET",
|
||||
"head_method": "Выберите метод HEAD",
|
||||
"import_curl": "Импортировать из cURL",
|
||||
"method": "Метод",
|
||||
"method": "Методика",
|
||||
"next_method": "Выберите следующий метод",
|
||||
"post_method": "Выберите метод POST",
|
||||
"previous_method": "Выбрать предыдущий метод",
|
||||
"put_method": "Выберите метод PUT",
|
||||
"rename": "Переименовать запрос",
|
||||
"reset_request": "Сбросить запрос",
|
||||
"save_request": "Сохранить запрос",
|
||||
"save_request": "Сохарнить запрос",
|
||||
"save_to_collections": "Сохранить в коллекции",
|
||||
"send_request": "Послать запрос",
|
||||
"share_request": "Поделиться запросом",
|
||||
"show_code": "Сгенерировать фрагмент кода из запроса",
|
||||
"title": "Запрос"
|
||||
"share_request": "Share Request",
|
||||
"show_code": "Generate code snippet",
|
||||
"title": "Запрос",
|
||||
"copy_request_link": "Копировать ссылку на запрос"
|
||||
},
|
||||
"response": {
|
||||
"copy": "Копировать запрос в буфер обмена",
|
||||
@@ -752,11 +717,11 @@
|
||||
"title": "Запрос"
|
||||
},
|
||||
"theme": {
|
||||
"black": "Переключить на черный режим",
|
||||
"dark": "Переключить на тёмный режим",
|
||||
"light": "Переключить на светлый режим",
|
||||
"system": "Переключить на тему, исходя из настроек системы",
|
||||
"title": "Внешний вид"
|
||||
"black": "Черный режим",
|
||||
"dark": "Тёмный режим",
|
||||
"light": "Светлый режим",
|
||||
"system": "Определяется системой",
|
||||
"title": "Тема"
|
||||
}
|
||||
},
|
||||
"show": {
|
||||
@@ -765,11 +730,6 @@
|
||||
"more": "Показать больше",
|
||||
"sidebar": "Показать боковую панель"
|
||||
},
|
||||
"site_protection": {
|
||||
"error_fetching_site_protection_status": "Something Went Wrong While Fetching Site Protection Status",
|
||||
"login_to_continue": "Login to continue",
|
||||
"login_to_continue_description": "You need to be logged in to access this Hoppscotch Enterprise Instance."
|
||||
},
|
||||
"socketio": {
|
||||
"communication": "Коммуникация",
|
||||
"connection_not_authorized": "Это SocketIO соединение не использует какую-либо авторизацию.",
|
||||
@@ -779,89 +739,82 @@
|
||||
"url": "URL"
|
||||
},
|
||||
"spotlight": {
|
||||
"change_language": "Изменить язык",
|
||||
"change_language": "Change Language",
|
||||
"environments": {
|
||||
"delete": "Удалить текущее окружение",
|
||||
"duplicate": "Дублировать текущее окружение",
|
||||
"duplicate_global": "Дублировать глобальное окружение",
|
||||
"edit": "Редактировать текущее окружение",
|
||||
"edit_global": "Редактировать глобальное окружение",
|
||||
"new": "Создать новое окружение",
|
||||
"new_variable": "Создать новую переменную окружения",
|
||||
"title": "Окружение"
|
||||
"delete": "Delete current environment",
|
||||
"duplicate": "Duplicate current environment",
|
||||
"duplicate_global": "Duplicate global environment",
|
||||
"edit": "Edit current environment",
|
||||
"edit_global": "Edit global environment",
|
||||
"new": "Create new environment",
|
||||
"new_variable": "Create a new environment variable",
|
||||
"title": "Environments"
|
||||
},
|
||||
"general": {
|
||||
"chat": "Чат с поддержкой",
|
||||
"help_menu": "Помощь",
|
||||
"open_docs": "Почитать документацию",
|
||||
"open_github": "Открыть GitHub репозиторий",
|
||||
"open_keybindings": "Горячие клавиши",
|
||||
"social": "Соц. сети",
|
||||
"title": "Общее"
|
||||
"chat": "Chat with support",
|
||||
"help_menu": "Help and support",
|
||||
"open_docs": "Read Documentation",
|
||||
"open_github": "Open GitHub repository",
|
||||
"open_keybindings": "Keyboard shortcuts",
|
||||
"social": "Social",
|
||||
"title": "General"
|
||||
},
|
||||
"graphql": {
|
||||
"connect": "Подключиться к серверу",
|
||||
"disconnect": "Отключиться от сервера"
|
||||
"connect": "Connect to server",
|
||||
"disconnect": "Disconnect from server"
|
||||
},
|
||||
"miscellaneous": {
|
||||
"invite": "Пригласить друзей в Hoppscotch",
|
||||
"title": "Другое"
|
||||
},
|
||||
"phrases": {
|
||||
"create_environment": "Создать окружение",
|
||||
"create_workspace": "Создать пространство",
|
||||
"import_collections": "Импортировать коллекцию",
|
||||
"share_request": "Поделиться запросом",
|
||||
"try": "Попробовать"
|
||||
"invite": "Invite your friends to Hoppscotch",
|
||||
"title": "Miscellaneous"
|
||||
},
|
||||
"request": {
|
||||
"save_as_new": "Сохранить как новый запрос",
|
||||
"select_method": "Выбрать метод",
|
||||
"switch_to": "Переключиться",
|
||||
"tab_authorization": "На вкладку авторизации",
|
||||
"tab_body": "На вкладку тела запроса",
|
||||
"tab_headers": "На вкладку заголовков",
|
||||
"tab_parameters": "На вкладку параметров",
|
||||
"tab_pre_request_script": "На вкладку пред-скрипта запроса",
|
||||
"tab_query": "На вкладку запроса",
|
||||
"tab_tests": "На вкладку тестов",
|
||||
"tab_variables": "На вкладку переменных запроса"
|
||||
"save_as_new": "Save as new request",
|
||||
"select_method": "Select method",
|
||||
"switch_to": "Switch to",
|
||||
"tab_authorization": "Authorization tab",
|
||||
"tab_body": "Body tab",
|
||||
"tab_headers": "Headers tab",
|
||||
"tab_parameters": "Parameters tab",
|
||||
"tab_pre_request_script": "Pre-request script tab",
|
||||
"tab_query": "Query tab",
|
||||
"tab_tests": "Tests tab",
|
||||
"tab_variables": "Variables tab"
|
||||
},
|
||||
"response": {
|
||||
"copy": "Копировать содержимое ответа",
|
||||
"download": "Сказать содержимое ответа как файл",
|
||||
"title": "Ответ запроса"
|
||||
"copy": "Copy response",
|
||||
"download": "Download response as file",
|
||||
"title": "Response"
|
||||
},
|
||||
"section": {
|
||||
"interceptor": "Перехватчик",
|
||||
"interface": "Интерфейс",
|
||||
"theme": "Внешний вид",
|
||||
"user": "Пользователь"
|
||||
"interceptor": "Interceptor",
|
||||
"interface": "Interface",
|
||||
"theme": "Theme",
|
||||
"user": "User"
|
||||
},
|
||||
"settings": {
|
||||
"change_interceptor": "Изменить перехватчик",
|
||||
"change_language": "Изменить язык",
|
||||
"change_interceptor": "Change Interceptor",
|
||||
"change_language": "Change Language",
|
||||
"theme": {
|
||||
"black": "Черная",
|
||||
"dark": "Темная",
|
||||
"light": "Светлая",
|
||||
"system": "Как задано в системе"
|
||||
"black": "Black",
|
||||
"dark": "Dark",
|
||||
"light": "Light",
|
||||
"system": "System preference"
|
||||
}
|
||||
},
|
||||
"tab": {
|
||||
"close_current": "Закрыть текущую вкладку",
|
||||
"close_others": "Закрыть все вкладки",
|
||||
"duplicate": "Продублировать текущую вкладку",
|
||||
"new_tab": "Открыть в новой вкладке",
|
||||
"title": "Вкладки"
|
||||
"close_current": "Close current tab",
|
||||
"close_others": "Close all other tabs",
|
||||
"duplicate": "Duplicate current tab",
|
||||
"new_tab": "Open a new tab",
|
||||
"title": "Tabs"
|
||||
},
|
||||
"workspace": {
|
||||
"delete": "Удалить текущую команду",
|
||||
"edit": "Редактировать текущую команду",
|
||||
"invite": "Пригласить людей в команду",
|
||||
"new": "Создать новую команду",
|
||||
"switch_to_personal": "Переключить на персональное пространство",
|
||||
"title": "Команды"
|
||||
"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": "Teams"
|
||||
}
|
||||
},
|
||||
"sse": {
|
||||
@@ -871,7 +824,7 @@
|
||||
},
|
||||
"state": {
|
||||
"bulk_mode": "Множественное редактирование",
|
||||
"bulk_mode_placeholder": "Каждый параметр должен начинаться с новой строки\nКлючи и значения разделяются двоеточием\nИспользуйте # для комментария",
|
||||
"bulk_mode_placeholder": "Каждый параметр должен начинаться с новой строки\nКлючи и значения разедляются двоеточием\nИспользуйте # для комментария",
|
||||
"cleared": "Очищено",
|
||||
"connected": "Связаны",
|
||||
"connected_to": "Подключено к {name}",
|
||||
@@ -890,20 +843,20 @@
|
||||
"download_failed": "Download failed",
|
||||
"download_started": "Скачивание началось",
|
||||
"enabled": "Включено",
|
||||
"file_imported": "Файл успешно импортирован",
|
||||
"file_imported": "Файл импортирован",
|
||||
"finished_in": "Завершено через {duration} мс",
|
||||
"hide": "Скрыть",
|
||||
"hide": "Hide",
|
||||
"history_deleted": "История удалена",
|
||||
"linewrap": "Обернуть линии",
|
||||
"loading": "Загрузка...",
|
||||
"message_received": "Сообщение: {message} получено по топику: {topic}",
|
||||
"mqtt_subscription_failed": "Что-то пошло не так, при попытке подписаться на топик: {topic}",
|
||||
"none": "Не задан",
|
||||
"none": "Никто",
|
||||
"nothing_found": "Ничего не найдено для",
|
||||
"published_error": "Что-то пошло не так при попытке опубликовать сообщение в топик {topic}: {message}",
|
||||
"published_message": "Опубликовано сообщение: {message} в топик: {topic}",
|
||||
"reconnection_error": "Не удалось переподключиться",
|
||||
"show": "Показать",
|
||||
"show": "Show",
|
||||
"subscribed_failed": "Не удалось подписаться на топик: {topic}",
|
||||
"subscribed_success": "Успешно подписался на топик: {topic}",
|
||||
"unsubscribed_failed": "Не удалось отписаться от топика: {topic}",
|
||||
@@ -918,6 +871,7 @@
|
||||
"forum": "Задавайте вопросы и получайте ответы",
|
||||
"github": "Подпишитесь на нас на Github",
|
||||
"shortcuts": "Просматривайте приложение быстрее",
|
||||
"team": "Свяжитесь с командой",
|
||||
"title": "Служба поддержки",
|
||||
"twitter": "Следуйте за нами на Twitter"
|
||||
},
|
||||
@@ -928,7 +882,7 @@
|
||||
"close_others": "Закрыть остальные вкладки",
|
||||
"collections": "Коллекции",
|
||||
"documentation": "Документация",
|
||||
"duplicate": "Дублировать вкладку",
|
||||
"duplicate": "Duplicate Tab",
|
||||
"environments": "Окружения",
|
||||
"headers": "Заголовки",
|
||||
"history": "История",
|
||||
@@ -938,8 +892,7 @@
|
||||
"queries": "Запросы",
|
||||
"query": "Запрос",
|
||||
"schema": "Схема",
|
||||
"shared_requests": "Запросы в общем доступе",
|
||||
"share_tab_request": "Поделиться запросом",
|
||||
"shared_requests": "Shared Requests",
|
||||
"socketio": "Socket.IO",
|
||||
"sse": "SSE",
|
||||
"tests": "Тесты",
|
||||
@@ -968,6 +921,7 @@
|
||||
"invite_tooltip": "Пригласить людей в Ваше рабочее пространство",
|
||||
"invited_to_team": "{owner} приглашает Вас присоединиться к команде {team}",
|
||||
"join": "Приглашение принято",
|
||||
"join_beta": "Присоединяйтесь к бета-программе, чтобы получить доступ к командам.",
|
||||
"join_team": "Присоединиться к {team}",
|
||||
"joined_team": "Вы присоединились к команде {team}",
|
||||
"joined_team_description": "Теперь Вы участник этой команды",
|
||||
@@ -996,7 +950,6 @@
|
||||
"permissions": "Разрешения",
|
||||
"same_target_destination": "Таже цель и конечная точка",
|
||||
"saved": "Команда сохранена",
|
||||
"search_title": "Team Requests",
|
||||
"select_a_team": "Выбрать команду",
|
||||
"success_invites": "Принятые приглашения",
|
||||
"title": "Команды",
|
||||
@@ -1028,8 +981,16 @@
|
||||
"workspace": {
|
||||
"change": "Изменить пространство",
|
||||
"personal": "Моё пространство",
|
||||
"other_workspaces": "Пространства",
|
||||
"team": "Пространство команды",
|
||||
"title": "Рабочие пространства"
|
||||
},
|
||||
"shortcodes": {
|
||||
"actions": "Действия",
|
||||
"created_on": "Создано",
|
||||
"deleted": "Удалёна",
|
||||
"method": "Метод",
|
||||
"not_found": "Короткая ссылка не найдена",
|
||||
"short_code": "Короткая ссылка",
|
||||
"url": "URL"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,9 +68,9 @@
|
||||
"developer_option": "Developer options",
|
||||
"developer_option_description": "Developer tools which helps in development and maintenance of Hoppscotch.",
|
||||
"discord": "Discord",
|
||||
"documentation": "Dokümanlar",
|
||||
"documentation": "Dökümanlar",
|
||||
"github": "GitHub",
|
||||
"help": "Yardım, geri bildirim ve dokümanlar",
|
||||
"help": "Yardım, geri bildirim ve dökümanlar",
|
||||
"home": "Ana sayfa",
|
||||
"invite": "Davet et",
|
||||
"invite_description": "Hoppscotch'ta API'lerinizi oluşturmak ve yönetmek için basit ve sezgisel bir arayüz tasarladık. Hoppscotch, API'lerinizi oluşturmanıza, test etmenize, belgelemenize ve paylaşmanıza yardımcı olan bir araçtır.",
|
||||
@@ -225,7 +225,7 @@
|
||||
"body": "Bu isteğin bir gövdesi yok",
|
||||
"collection": "Koleksiyon boş",
|
||||
"collections": "Koleksiyonlar boş",
|
||||
"documentation": "Dokümanları görmek için GraphQL uç noktasını bağlayın",
|
||||
"documentation": "Dökümanları görmek için GraphQL uç noktasını bağlayın",
|
||||
"endpoint": "Uç nokta boş olamaz",
|
||||
"environments": "Ortamlar boş",
|
||||
"folder": "Klasör boş",
|
||||
@@ -735,7 +735,7 @@
|
||||
"url": "Bağlantı"
|
||||
},
|
||||
"spotlight": {
|
||||
"change_language": "Dil Değiştir",
|
||||
"change_language": "Change Language",
|
||||
"environments": {
|
||||
"delete": "Delete current environment",
|
||||
"duplicate": "Duplicate current environment",
|
||||
@@ -744,7 +744,7 @@
|
||||
"edit_global": "Edit global environment",
|
||||
"new": "Create new environment",
|
||||
"new_variable": "Create a new environment variable",
|
||||
"title": "Ortamlar"
|
||||
"title": "Environments"
|
||||
},
|
||||
"general": {
|
||||
"chat": "Chat with support",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@hoppscotch/common",
|
||||
"private": true,
|
||||
"version": "2024.3.3",
|
||||
"version": "2024.3.0",
|
||||
"scripts": {
|
||||
"dev": "pnpm exec npm-run-all -p -l dev:*",
|
||||
"test": "vitest --run",
|
||||
@@ -50,7 +50,7 @@
|
||||
"axios": "1.6.2",
|
||||
"buffer": "6.0.3",
|
||||
"cookie-es": "1.0.0",
|
||||
"dioc": "3.0.1",
|
||||
"dioc": "1.0.1",
|
||||
"esprima": "4.0.1",
|
||||
"events": "3.3.0",
|
||||
"fp-ts": "2.16.1",
|
||||
@@ -127,8 +127,8 @@
|
||||
"@types/splitpanes": "2.2.6",
|
||||
"@types/uuid": "9.0.7",
|
||||
"@types/yargs-parser": "21.0.3",
|
||||
"@typescript-eslint/eslint-plugin": "7.3.1",
|
||||
"@typescript-eslint/parser": "7.3.1",
|
||||
"@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",
|
||||
@@ -136,9 +136,9 @@
|
||||
"autoprefixer": "10.4.16",
|
||||
"cross-env": "7.0.3",
|
||||
"dotenv": "16.3.1",
|
||||
"eslint": "8.57.0",
|
||||
"eslint-plugin-prettier": "5.1.3",
|
||||
"eslint-plugin-vue": "9.24.0",
|
||||
"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",
|
||||
@@ -164,4 +164,4 @@
|
||||
"vitest": "0.34.6",
|
||||
"vue-tsc": "1.8.24"
|
||||
}
|
||||
}
|
||||
}
|
||||
415
packages/hoppscotch-common/src/components.d.ts
vendored
415
packages/hoppscotch-common/src/components.d.ts
vendored
@@ -1,217 +1,214 @@
|
||||
/* 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']
|
||||
AppContextMenu: typeof import('./components/app/ContextMenu.vue')['default']
|
||||
AppDeveloperOptions: typeof import('./components/app/DeveloperOptions.vue')['default']
|
||||
AppFooter: typeof import('./components/app/Footer.vue')['default']
|
||||
AppGitHubStarButton: typeof import('./components/app/GitHubStarButton.vue')['default']
|
||||
AppHeader: typeof import('./components/app/Header.vue')['default']
|
||||
AppInspection: typeof import('./components/app/Inspection.vue')['default']
|
||||
AppInterceptor: typeof import('./components/app/Interceptor.vue')['default']
|
||||
AppLogo: typeof import('./components/app/Logo.vue')['default']
|
||||
AppOptions: typeof import('./components/app/Options.vue')['default']
|
||||
AppPaneLayout: typeof import('./components/app/PaneLayout.vue')['default']
|
||||
AppShare: typeof import('./components/app/Share.vue')['default']
|
||||
AppShortcuts: typeof import('./components/app/Shortcuts.vue')['default']
|
||||
AppShortcutsEntry: typeof import('./components/app/ShortcutsEntry.vue')['default']
|
||||
AppShortcutsPrompt: typeof import('./components/app/ShortcutsPrompt.vue')['default']
|
||||
AppSidenav: typeof import('./components/app/Sidenav.vue')['default']
|
||||
AppSpotlight: typeof import('./components/app/spotlight/index.vue')['default']
|
||||
AppSpotlightEntry: typeof import('./components/app/spotlight/Entry.vue')['default']
|
||||
AppSpotlightEntryGQLHistory: typeof import('./components/app/spotlight/entry/GQLHistory.vue')['default']
|
||||
AppSpotlightEntryGQLRequest: typeof import('./components/app/spotlight/entry/GQLRequest.vue')['default']
|
||||
AppSpotlightEntryIconSelected: typeof import('./components/app/spotlight/entry/IconSelected.vue')['default']
|
||||
AppSpotlightEntryRESTHistory: typeof import('./components/app/spotlight/entry/RESTHistory.vue')['default']
|
||||
AppSpotlightEntryRESTRequest: typeof import('./components/app/spotlight/entry/RESTRequest.vue')['default']
|
||||
AppSpotlightEntryRESTTeamRequestEntry: typeof import('./components/app/spotlight/entry/RESTTeamRequestEntry.vue')['default']
|
||||
AppSpotlightSearch: typeof import('./components/app/SpotlightSearch.vue')['default']
|
||||
AppSupport: typeof import('./components/app/Support.vue')['default']
|
||||
Collections: typeof import('./components/collections/index.vue')['default']
|
||||
CollectionsAdd: typeof import('./components/collections/Add.vue')['default']
|
||||
CollectionsAddFolder: typeof import('./components/collections/AddFolder.vue')['default']
|
||||
CollectionsAddRequest: typeof import('./components/collections/AddRequest.vue')['default']
|
||||
CollectionsCollection: typeof import('./components/collections/Collection.vue')['default']
|
||||
CollectionsEdit: typeof import('./components/collections/Edit.vue')['default']
|
||||
CollectionsEditFolder: typeof import('./components/collections/EditFolder.vue')['default']
|
||||
CollectionsEditRequest: typeof import('./components/collections/EditRequest.vue')['default']
|
||||
CollectionsGraphql: typeof import('./components/collections/graphql/index.vue')['default']
|
||||
CollectionsGraphqlAdd: typeof import('./components/collections/graphql/Add.vue')['default']
|
||||
CollectionsGraphqlAddFolder: typeof import('./components/collections/graphql/AddFolder.vue')['default']
|
||||
CollectionsGraphqlAddRequest: typeof import('./components/collections/graphql/AddRequest.vue')['default']
|
||||
CollectionsGraphqlCollection: typeof import('./components/collections/graphql/Collection.vue')['default']
|
||||
CollectionsGraphqlEdit: typeof import('./components/collections/graphql/Edit.vue')['default']
|
||||
CollectionsGraphqlEditFolder: typeof import('./components/collections/graphql/EditFolder.vue')['default']
|
||||
CollectionsGraphqlEditRequest: typeof import('./components/collections/graphql/EditRequest.vue')['default']
|
||||
CollectionsGraphqlFolder: typeof import('./components/collections/graphql/Folder.vue')['default']
|
||||
CollectionsGraphqlImportExport: typeof import('./components/collections/graphql/ImportExport.vue')['default']
|
||||
CollectionsGraphqlRequest: typeof import('./components/collections/graphql/Request.vue')['default']
|
||||
CollectionsImportExport: typeof import('./components/collections/ImportExport.vue')['default']
|
||||
CollectionsMyCollections: typeof import('./components/collections/MyCollections.vue')['default']
|
||||
CollectionsProperties: typeof import('./components/collections/Properties.vue')['default']
|
||||
CollectionsRequest: typeof import('./components/collections/Request.vue')['default']
|
||||
CollectionsSaveRequest: typeof import('./components/collections/SaveRequest.vue')['default']
|
||||
CollectionsTeamCollections: typeof import('./components/collections/TeamCollections.vue')['default']
|
||||
CookiesAllModal: typeof import('./components/cookies/AllModal.vue')['default']
|
||||
CookiesEditCookie: typeof import('./components/cookies/EditCookie.vue')['default']
|
||||
Embeds: typeof import('./components/embeds/index.vue')['default']
|
||||
Environments: typeof import('./components/environments/index.vue')['default']
|
||||
EnvironmentsAdd: typeof import('./components/environments/Add.vue')['default']
|
||||
EnvironmentsImportExport: typeof import('./components/environments/ImportExport.vue')['default']
|
||||
EnvironmentsMy: typeof import('./components/environments/my/index.vue')['default']
|
||||
EnvironmentsMyDetails: typeof import('./components/environments/my/Details.vue')['default']
|
||||
EnvironmentsMyEnvironment: typeof import('./components/environments/my/Environment.vue')['default']
|
||||
EnvironmentsSelector: typeof import('./components/environments/Selector.vue')['default']
|
||||
EnvironmentsTeams: typeof import('./components/environments/teams/index.vue')['default']
|
||||
EnvironmentsTeamsDetails: typeof import('./components/environments/teams/Details.vue')['default']
|
||||
EnvironmentsTeamsEnvironment: typeof import('./components/environments/teams/Environment.vue')['default']
|
||||
FirebaseLogin: typeof import('./components/firebase/Login.vue')['default']
|
||||
FirebaseLogout: typeof import('./components/firebase/Logout.vue')['default']
|
||||
GraphqlAuthorization: typeof import('./components/graphql/Authorization.vue')['default']
|
||||
GraphqlField: typeof import('./components/graphql/Field.vue')['default']
|
||||
GraphqlHeaders: typeof import('./components/graphql/Headers.vue')['default']
|
||||
GraphqlQuery: typeof import('./components/graphql/Query.vue')['default']
|
||||
GraphqlRequest: typeof import('./components/graphql/Request.vue')['default']
|
||||
GraphqlRequestOptions: typeof import('./components/graphql/RequestOptions.vue')['default']
|
||||
GraphqlRequestTab: typeof import('./components/graphql/RequestTab.vue')['default']
|
||||
GraphqlResponse: typeof import('./components/graphql/Response.vue')['default']
|
||||
GraphqlSidebar: typeof import('./components/graphql/Sidebar.vue')['default']
|
||||
GraphqlSubscriptionLog: typeof import('./components/graphql/SubscriptionLog.vue')['default']
|
||||
GraphqlTabHead: typeof import('./components/graphql/TabHead.vue')['default']
|
||||
GraphqlType: typeof import('./components/graphql/Type.vue')['default']
|
||||
GraphqlTypeLink: typeof import('./components/graphql/TypeLink.vue')['default']
|
||||
GraphqlVariable: typeof import('./components/graphql/Variable.vue')['default']
|
||||
History: typeof import('./components/history/index.vue')['default']
|
||||
HistoryGraphqlCard: typeof import('./components/history/graphql/Card.vue')['default']
|
||||
HistoryRestCard: typeof import('./components/history/rest/Card.vue')['default']
|
||||
HoppButtonPrimary: typeof import('@hoppscotch/ui')['HoppButtonPrimary']
|
||||
HoppButtonSecondary: typeof import('@hoppscotch/ui')['HoppButtonSecondary']
|
||||
HoppSmartAnchor: typeof import('@hoppscotch/ui')['HoppSmartAnchor']
|
||||
HoppSmartCheckbox: typeof import('@hoppscotch/ui')['HoppSmartCheckbox']
|
||||
HoppSmartConfirmModal: typeof import('@hoppscotch/ui')['HoppSmartConfirmModal']
|
||||
HoppSmartExpand: typeof import('@hoppscotch/ui')['HoppSmartExpand']
|
||||
HoppSmartFileChip: typeof import('@hoppscotch/ui')['HoppSmartFileChip']
|
||||
HoppSmartInput: typeof import('@hoppscotch/ui')['HoppSmartInput']
|
||||
HoppSmartIntersection: typeof import('@hoppscotch/ui')['HoppSmartIntersection']
|
||||
HoppSmartItem: typeof import('@hoppscotch/ui')['HoppSmartItem']
|
||||
HoppSmartLink: typeof import('@hoppscotch/ui')['HoppSmartLink']
|
||||
HoppSmartModal: typeof import('@hoppscotch/ui')['HoppSmartModal']
|
||||
HoppSmartPicture: typeof import('@hoppscotch/ui')['HoppSmartPicture']
|
||||
HoppSmartPlaceholder: typeof import('@hoppscotch/ui')['HoppSmartPlaceholder']
|
||||
HoppSmartProgressRing: typeof import('@hoppscotch/ui')['HoppSmartProgressRing']
|
||||
HoppSmartRadio: typeof import('@hoppscotch/ui')['HoppSmartRadio']
|
||||
HoppSmartRadioGroup: typeof import('@hoppscotch/ui')['HoppSmartRadioGroup']
|
||||
HoppSmartSelectWrapper: typeof import('@hoppscotch/ui')['HoppSmartSelectWrapper']
|
||||
HoppSmartSlideOver: typeof import('@hoppscotch/ui')['HoppSmartSlideOver']
|
||||
HoppSmartSpinner: typeof import('@hoppscotch/ui')['HoppSmartSpinner']
|
||||
HoppSmartTab: typeof import('@hoppscotch/ui')['HoppSmartTab']
|
||||
HoppSmartTabs: typeof import('@hoppscotch/ui')['HoppSmartTabs']
|
||||
HoppSmartToggle: typeof import('@hoppscotch/ui')['HoppSmartToggle']
|
||||
HoppSmartTree: typeof import('@hoppscotch/ui')['HoppSmartTree']
|
||||
HoppSmartWindow: typeof import('@hoppscotch/ui')['HoppSmartWindow']
|
||||
HoppSmartWindows: typeof import('@hoppscotch/ui')['HoppSmartWindows']
|
||||
HttpAuthorization: typeof import('./components/http/Authorization.vue')['default']
|
||||
HttpAuthorizationApiKey: typeof import('./components/http/authorization/ApiKey.vue')['default']
|
||||
HttpAuthorizationBasic: typeof import('./components/http/authorization/Basic.vue')['default']
|
||||
HttpBody: typeof import('./components/http/Body.vue')['default']
|
||||
HttpBodyParameters: typeof import('./components/http/BodyParameters.vue')['default']
|
||||
HttpCodegenModal: typeof import('./components/http/CodegenModal.vue')['default']
|
||||
HttpHeaders: typeof import('./components/http/Headers.vue')['default']
|
||||
HttpImportCurl: typeof import('./components/http/ImportCurl.vue')['default']
|
||||
HttpOAuth2Authorization: typeof import('./components/http/OAuth2Authorization.vue')['default']
|
||||
HttpParameters: typeof import('./components/http/Parameters.vue')['default']
|
||||
HttpPreRequestScript: typeof import('./components/http/PreRequestScript.vue')['default']
|
||||
HttpRawBody: typeof import('./components/http/RawBody.vue')['default']
|
||||
HttpReqChangeConfirmModal: typeof import('./components/http/ReqChangeConfirmModal.vue')['default']
|
||||
HttpRequest: typeof import('./components/http/Request.vue')['default']
|
||||
HttpRequestOptions: typeof import('./components/http/RequestOptions.vue')['default']
|
||||
HttpRequestTab: typeof import('./components/http/RequestTab.vue')['default']
|
||||
HttpRequestVariables: typeof import('./components/http/RequestVariables.vue')['default']
|
||||
HttpResponse: typeof import('./components/http/Response.vue')['default']
|
||||
HttpResponseMeta: typeof import('./components/http/ResponseMeta.vue')['default']
|
||||
HttpSidebar: typeof import('./components/http/Sidebar.vue')['default']
|
||||
HttpTabHead: typeof import('./components/http/TabHead.vue')['default']
|
||||
HttpTestResult: typeof import('./components/http/TestResult.vue')['default']
|
||||
HttpTestResultEntry: typeof import('./components/http/TestResultEntry.vue')['default']
|
||||
HttpTestResultEnv: typeof import('./components/http/TestResultEnv.vue')['default']
|
||||
HttpTestResultReport: typeof import('./components/http/TestResultReport.vue')['default']
|
||||
HttpTests: typeof import('./components/http/Tests.vue')['default']
|
||||
HttpURLEncodedParams: typeof import('./components/http/URLEncodedParams.vue')['default']
|
||||
IconLucideActivity: typeof import('~icons/lucide/activity')['default']
|
||||
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']
|
||||
AppActionHandler: (typeof import("./components/app/ActionHandler.vue"))["default"]
|
||||
AppBanner: (typeof import("./components/app/Banner.vue"))["default"]
|
||||
AppContextMenu: (typeof import("./components/app/ContextMenu.vue"))["default"]
|
||||
AppDeveloperOptions: (typeof import("./components/app/DeveloperOptions.vue"))["default"]
|
||||
AppFooter: (typeof import("./components/app/Footer.vue"))["default"]
|
||||
AppGitHubStarButton: (typeof import("./components/app/GitHubStarButton.vue"))["default"]
|
||||
AppHeader: (typeof import("./components/app/Header.vue"))["default"]
|
||||
AppInspection: (typeof import("./components/app/Inspection.vue"))["default"]
|
||||
AppInterceptor: (typeof import("./components/app/Interceptor.vue"))["default"]
|
||||
AppLogo: (typeof import("./components/app/Logo.vue"))["default"]
|
||||
AppOptions: (typeof import("./components/app/Options.vue"))["default"]
|
||||
AppPaneLayout: (typeof import("./components/app/PaneLayout.vue"))["default"]
|
||||
AppShare: (typeof import("./components/app/Share.vue"))["default"]
|
||||
AppShortcuts: (typeof import("./components/app/Shortcuts.vue"))["default"]
|
||||
AppShortcutsEntry: (typeof import("./components/app/ShortcutsEntry.vue"))["default"]
|
||||
AppShortcutsPrompt: (typeof import("./components/app/ShortcutsPrompt.vue"))["default"]
|
||||
AppSidenav: (typeof import("./components/app/Sidenav.vue"))["default"]
|
||||
AppSpotlight: (typeof import("./components/app/spotlight/index.vue"))["default"]
|
||||
AppSpotlightEntry: (typeof import("./components/app/spotlight/Entry.vue"))["default"]
|
||||
AppSpotlightEntryGQLHistory: (typeof import("./components/app/spotlight/entry/GQLHistory.vue"))["default"]
|
||||
AppSpotlightEntryGQLRequest: (typeof import("./components/app/spotlight/entry/GQLRequest.vue"))["default"]
|
||||
AppSpotlightEntryIconSelected: (typeof import("./components/app/spotlight/entry/IconSelected.vue"))["default"]
|
||||
AppSpotlightEntryRESTHistory: (typeof import("./components/app/spotlight/entry/RESTHistory.vue"))["default"]
|
||||
AppSpotlightEntryRESTRequest: (typeof import("./components/app/spotlight/entry/RESTRequest.vue"))["default"]
|
||||
AppSupport: (typeof import("./components/app/Support.vue"))["default"]
|
||||
Collections: (typeof import("./components/collections/index.vue"))["default"]
|
||||
CollectionsAdd: (typeof import("./components/collections/Add.vue"))["default"]
|
||||
CollectionsAddFolder: (typeof import("./components/collections/AddFolder.vue"))["default"]
|
||||
CollectionsAddRequest: (typeof import("./components/collections/AddRequest.vue"))["default"]
|
||||
CollectionsCollection: (typeof import("./components/collections/Collection.vue"))["default"]
|
||||
CollectionsEdit: (typeof import("./components/collections/Edit.vue"))["default"]
|
||||
CollectionsEditFolder: (typeof import("./components/collections/EditFolder.vue"))["default"]
|
||||
CollectionsEditRequest: (typeof import("./components/collections/EditRequest.vue"))["default"]
|
||||
CollectionsGraphql: (typeof import("./components/collections/graphql/index.vue"))["default"]
|
||||
CollectionsGraphqlAdd: (typeof import("./components/collections/graphql/Add.vue"))["default"]
|
||||
CollectionsGraphqlAddFolder: (typeof import("./components/collections/graphql/AddFolder.vue"))["default"]
|
||||
CollectionsGraphqlAddRequest: (typeof import("./components/collections/graphql/AddRequest.vue"))["default"]
|
||||
CollectionsGraphqlCollection: (typeof import("./components/collections/graphql/Collection.vue"))["default"]
|
||||
CollectionsGraphqlEdit: (typeof import("./components/collections/graphql/Edit.vue"))["default"]
|
||||
CollectionsGraphqlEditFolder: (typeof import("./components/collections/graphql/EditFolder.vue"))["default"]
|
||||
CollectionsGraphqlEditRequest: (typeof import("./components/collections/graphql/EditRequest.vue"))["default"]
|
||||
CollectionsGraphqlFolder: (typeof import("./components/collections/graphql/Folder.vue"))["default"]
|
||||
CollectionsGraphqlImportExport: (typeof import("./components/collections/graphql/ImportExport.vue"))["default"]
|
||||
CollectionsGraphqlRequest: (typeof import("./components/collections/graphql/Request.vue"))["default"]
|
||||
CollectionsImportExport: (typeof import("./components/collections/ImportExport.vue"))["default"]
|
||||
CollectionsMyCollections: (typeof import("./components/collections/MyCollections.vue"))["default"]
|
||||
CollectionsProperties: (typeof import("./components/collections/Properties.vue"))["default"]
|
||||
CollectionsRequest: (typeof import("./components/collections/Request.vue"))["default"]
|
||||
CollectionsSaveRequest: (typeof import("./components/collections/SaveRequest.vue"))["default"]
|
||||
CollectionsTeamCollections: (typeof import("./components/collections/TeamCollections.vue"))["default"]
|
||||
CookiesAllModal: (typeof import("./components/cookies/AllModal.vue"))["default"]
|
||||
CookiesEditCookie: (typeof import("./components/cookies/EditCookie.vue"))["default"]
|
||||
Embeds: (typeof import("./components/embeds/index.vue"))["default"]
|
||||
Environments: (typeof import("./components/environments/index.vue"))["default"]
|
||||
EnvironmentsAdd: (typeof import("./components/environments/Add.vue"))["default"]
|
||||
EnvironmentsImportExport: (typeof import("./components/environments/ImportExport.vue"))["default"]
|
||||
EnvironmentsMy: (typeof import("./components/environments/my/index.vue"))["default"]
|
||||
EnvironmentsMyDetails: (typeof import("./components/environments/my/Details.vue"))["default"]
|
||||
EnvironmentsMyEnvironment: (typeof import("./components/environments/my/Environment.vue"))["default"]
|
||||
EnvironmentsSelector: (typeof import("./components/environments/Selector.vue"))["default"]
|
||||
EnvironmentsTeams: (typeof import("./components/environments/teams/index.vue"))["default"]
|
||||
EnvironmentsTeamsDetails: (typeof import("./components/environments/teams/Details.vue"))["default"]
|
||||
EnvironmentsTeamsEnvironment: (typeof import("./components/environments/teams/Environment.vue"))["default"]
|
||||
FirebaseLogin: (typeof import("./components/firebase/Login.vue"))["default"]
|
||||
FirebaseLogout: (typeof import("./components/firebase/Logout.vue"))["default"]
|
||||
GraphqlAuthorization: (typeof import("./components/graphql/Authorization.vue"))["default"]
|
||||
GraphqlField: (typeof import("./components/graphql/Field.vue"))["default"]
|
||||
GraphqlHeaders: (typeof import("./components/graphql/Headers.vue"))["default"]
|
||||
GraphqlQuery: (typeof import("./components/graphql/Query.vue"))["default"]
|
||||
GraphqlRequest: (typeof import("./components/graphql/Request.vue"))["default"]
|
||||
GraphqlRequestOptions: (typeof import("./components/graphql/RequestOptions.vue"))["default"]
|
||||
GraphqlRequestTab: (typeof import("./components/graphql/RequestTab.vue"))["default"]
|
||||
GraphqlResponse: (typeof import("./components/graphql/Response.vue"))["default"]
|
||||
GraphqlSidebar: (typeof import("./components/graphql/Sidebar.vue"))["default"]
|
||||
GraphqlSubscriptionLog: (typeof import("./components/graphql/SubscriptionLog.vue"))["default"]
|
||||
GraphqlTabHead: (typeof import("./components/graphql/TabHead.vue"))["default"]
|
||||
GraphqlType: (typeof import("./components/graphql/Type.vue"))["default"]
|
||||
GraphqlTypeLink: (typeof import("./components/graphql/TypeLink.vue"))["default"]
|
||||
GraphqlVariable: (typeof import("./components/graphql/Variable.vue"))["default"]
|
||||
History: (typeof import("./components/history/index.vue"))["default"]
|
||||
HistoryGraphqlCard: (typeof import("./components/history/graphql/Card.vue"))["default"]
|
||||
HistoryRestCard: (typeof import("./components/history/rest/Card.vue"))["default"]
|
||||
HoppButtonPrimary: (typeof import("@hoppscotch/ui"))["HoppButtonPrimary"]
|
||||
HoppButtonSecondary: (typeof import("@hoppscotch/ui"))["HoppButtonSecondary"]
|
||||
HoppSmartAnchor: (typeof import("@hoppscotch/ui"))["HoppSmartAnchor"]
|
||||
HoppSmartCheckbox: (typeof import("@hoppscotch/ui"))["HoppSmartCheckbox"]
|
||||
HoppSmartConfirmModal: (typeof import("@hoppscotch/ui"))["HoppSmartConfirmModal"]
|
||||
HoppSmartExpand: (typeof import("@hoppscotch/ui"))["HoppSmartExpand"]
|
||||
HoppSmartFileChip: (typeof import("@hoppscotch/ui"))["HoppSmartFileChip"]
|
||||
HoppSmartInput: (typeof import("@hoppscotch/ui"))["HoppSmartInput"]
|
||||
HoppSmartIntersection: (typeof import("@hoppscotch/ui"))["HoppSmartIntersection"]
|
||||
HoppSmartItem: (typeof import("@hoppscotch/ui"))["HoppSmartItem"]
|
||||
HoppSmartLink: (typeof import("@hoppscotch/ui"))["HoppSmartLink"]
|
||||
HoppSmartModal: (typeof import("@hoppscotch/ui"))["HoppSmartModal"]
|
||||
HoppSmartPicture: (typeof import("@hoppscotch/ui"))["HoppSmartPicture"]
|
||||
HoppSmartPlaceholder: (typeof import("@hoppscotch/ui"))["HoppSmartPlaceholder"]
|
||||
HoppSmartProgressRing: (typeof import("@hoppscotch/ui"))["HoppSmartProgressRing"]
|
||||
HoppSmartRadio: (typeof import("@hoppscotch/ui"))["HoppSmartRadio"]
|
||||
HoppSmartRadioGroup: (typeof import("@hoppscotch/ui"))["HoppSmartRadioGroup"]
|
||||
HoppSmartSelectWrapper: (typeof import("@hoppscotch/ui"))["HoppSmartSelectWrapper"]
|
||||
HoppSmartSlideOver: (typeof import("@hoppscotch/ui"))["HoppSmartSlideOver"]
|
||||
HoppSmartSpinner: (typeof import("@hoppscotch/ui"))["HoppSmartSpinner"]
|
||||
HoppSmartTab: (typeof import("@hoppscotch/ui"))["HoppSmartTab"]
|
||||
HoppSmartTabs: (typeof import("@hoppscotch/ui"))["HoppSmartTabs"]
|
||||
HoppSmartToggle: (typeof import("@hoppscotch/ui"))["HoppSmartToggle"]
|
||||
HoppSmartTree: (typeof import("@hoppscotch/ui"))["HoppSmartTree"]
|
||||
HoppSmartWindow: (typeof import("@hoppscotch/ui"))["HoppSmartWindow"]
|
||||
HoppSmartWindows: (typeof import("@hoppscotch/ui"))["HoppSmartWindows"]
|
||||
HttpAuthorization: (typeof import("./components/http/Authorization.vue"))["default"]
|
||||
HttpAuthorizationApiKey: (typeof import("./components/http/authorization/ApiKey.vue"))["default"]
|
||||
HttpAuthorizationBasic: (typeof import("./components/http/authorization/Basic.vue"))["default"]
|
||||
HttpBody: (typeof import("./components/http/Body.vue"))["default"]
|
||||
HttpBodyParameters: (typeof import("./components/http/BodyParameters.vue"))["default"]
|
||||
HttpCodegenModal: (typeof import("./components/http/CodegenModal.vue"))["default"]
|
||||
HttpHeaders: (typeof import("./components/http/Headers.vue"))["default"]
|
||||
HttpImportCurl: (typeof import("./components/http/ImportCurl.vue"))["default"]
|
||||
HttpOAuth2Authorization: (typeof import("./components/http/OAuth2Authorization.vue"))["default"]
|
||||
HttpParameters: (typeof import("./components/http/Parameters.vue"))["default"]
|
||||
HttpPreRequestScript: (typeof import("./components/http/PreRequestScript.vue"))["default"]
|
||||
HttpRawBody: (typeof import("./components/http/RawBody.vue"))["default"]
|
||||
HttpReqChangeConfirmModal: (typeof import("./components/http/ReqChangeConfirmModal.vue"))["default"]
|
||||
HttpRequest: (typeof import("./components/http/Request.vue"))["default"]
|
||||
HttpRequestOptions: (typeof import("./components/http/RequestOptions.vue"))["default"]
|
||||
HttpRequestTab: (typeof import("./components/http/RequestTab.vue"))["default"]
|
||||
HttpResponse: (typeof import("./components/http/Response.vue"))["default"]
|
||||
HttpResponseMeta: (typeof import("./components/http/ResponseMeta.vue"))["default"]
|
||||
HttpSidebar: (typeof import("./components/http/Sidebar.vue"))["default"]
|
||||
HttpTabHead: (typeof import("./components/http/TabHead.vue"))["default"]
|
||||
HttpTestResult: (typeof import("./components/http/TestResult.vue"))["default"]
|
||||
HttpTestResultEntry: (typeof import("./components/http/TestResultEntry.vue"))["default"]
|
||||
HttpTestResultEnv: (typeof import("./components/http/TestResultEnv.vue"))["default"]
|
||||
HttpTestResultReport: (typeof import("./components/http/TestResultReport.vue"))["default"]
|
||||
HttpTests: (typeof import("./components/http/Tests.vue"))["default"]
|
||||
HttpURLEncodedParams: (typeof import("./components/http/URLEncodedParams.vue"))["default"]
|
||||
IconLucideActivity: (typeof import("~icons/lucide/activity"))["default"]
|
||||
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']
|
||||
IconLucideHelpCircle: typeof import('~icons/lucide/help-circle')['default']
|
||||
IconLucideInbox: typeof import('~icons/lucide/inbox')['default']
|
||||
IconLucideInfo: typeof import('~icons/lucide/info')['default']
|
||||
IconLucideLayers: typeof import('~icons/lucide/layers')['default']
|
||||
IconLucideListEnd: typeof import('~icons/lucide/list-end')['default']
|
||||
IconLucideMinus: typeof import('~icons/lucide/minus')['default']
|
||||
IconLucideCheckCircle: (typeof import("~icons/lucide/check-circle"))["default"]
|
||||
IconLucideChevronRight: (typeof import("~icons/lucide/chevron-right"))["default"]
|
||||
IconLucideGlobe: (typeof import("~icons/lucide/globe"))["default"]
|
||||
IconLucideHelpCircle: (typeof import("~icons/lucide/help-circle"))["default"]
|
||||
IconLucideInbox: (typeof import("~icons/lucide/inbox"))["default"]
|
||||
IconLucideInfo: (typeof import("~icons/lucide/info"))["default"]
|
||||
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']
|
||||
ImportExportBase: typeof import('./components/importExport/Base.vue')['default']
|
||||
ImportExportImportExportList: typeof import('./components/importExport/ImportExportList.vue')['default']
|
||||
ImportExportImportExportSourcesList: typeof import('./components/importExport/ImportExportSourcesList.vue')['default']
|
||||
ImportExportImportExportStepsFileImport: typeof import('./components/importExport/ImportExportSteps/FileImport.vue')['default']
|
||||
ImportExportImportExportStepsMyCollectionImport: typeof import('./components/importExport/ImportExportSteps/MyCollectionImport.vue')['default']
|
||||
ImportExportImportExportStepsUrlImport: typeof import('./components/importExport/ImportExportSteps/UrlImport.vue')['default']
|
||||
InterceptorsErrorPlaceholder: typeof import('./components/interceptors/ErrorPlaceholder.vue')['default']
|
||||
InterceptorsExtensionSubtitle: typeof import('./components/interceptors/ExtensionSubtitle.vue')['default']
|
||||
LensesHeadersRenderer: typeof import('./components/lenses/HeadersRenderer.vue')['default']
|
||||
LensesHeadersRendererEntry: typeof import('./components/lenses/HeadersRendererEntry.vue')['default']
|
||||
LensesRenderersAudioLensRenderer: typeof import('./components/lenses/renderers/AudioLensRenderer.vue')['default']
|
||||
LensesRenderersHTMLLensRenderer: typeof import('./components/lenses/renderers/HTMLLensRenderer.vue')['default']
|
||||
LensesRenderersImageLensRenderer: typeof import('./components/lenses/renderers/ImageLensRenderer.vue')['default']
|
||||
LensesRenderersJSONLensRenderer: typeof import('./components/lenses/renderers/JSONLensRenderer.vue')['default']
|
||||
LensesRenderersPDFLensRenderer: typeof import('./components/lenses/renderers/PDFLensRenderer.vue')['default']
|
||||
LensesRenderersRawLensRenderer: typeof import('./components/lenses/renderers/RawLensRenderer.vue')['default']
|
||||
LensesRenderersVideoLensRenderer: typeof import('./components/lenses/renderers/VideoLensRenderer.vue')['default']
|
||||
LensesRenderersXMLLensRenderer: typeof import('./components/lenses/renderers/XMLLensRenderer.vue')['default']
|
||||
LensesResponseBodyRenderer: typeof import('./components/lenses/ResponseBodyRenderer.vue')['default']
|
||||
ProfileUserDelete: typeof import('./components/profile/UserDelete.vue')['default']
|
||||
RealtimeCommunication: typeof import('./components/realtime/Communication.vue')['default']
|
||||
RealtimeConnectionConfig: typeof import('./components/realtime/ConnectionConfig.vue')['default']
|
||||
RealtimeLog: typeof import('./components/realtime/Log.vue')['default']
|
||||
RealtimeLogEntry: typeof import('./components/realtime/LogEntry.vue')['default']
|
||||
RealtimeSubscription: typeof import('./components/realtime/Subscription.vue')['default']
|
||||
SettingsExtension: typeof import('./components/settings/Extension.vue')['default']
|
||||
SettingsProxy: typeof import('./components/settings/Proxy.vue')['default']
|
||||
Share: typeof import('./components/share/index.vue')['default']
|
||||
ShareCreateModal: typeof import('./components/share/CreateModal.vue')['default']
|
||||
ShareCustomizeModal: typeof import('./components/share/CustomizeModal.vue')['default']
|
||||
ShareModal: typeof import('./components/share/Modal.vue')['default']
|
||||
ShareRequest: typeof import('./components/share/Request.vue')['default']
|
||||
ShareTemplatesButton: typeof import('./components/share/templates/Button.vue')['default']
|
||||
ShareTemplatesEmbeds: typeof import('./components/share/templates/Embeds.vue')['default']
|
||||
ShareTemplatesLink: typeof import('./components/share/templates/Link.vue')['default']
|
||||
SmartAccentModePicker: typeof import('./components/smart/AccentModePicker.vue')['default']
|
||||
SmartChangeLanguage: typeof import('./components/smart/ChangeLanguage.vue')['default']
|
||||
SmartColorModePicker: typeof import('./components/smart/ColorModePicker.vue')['default']
|
||||
SmartEnvInput: typeof import('./components/smart/EnvInput.vue')['default']
|
||||
TabPrimary: typeof import('./components/tab/Primary.vue')['default']
|
||||
TabSecondary: typeof import('./components/tab/Secondary.vue')['default']
|
||||
Teams: typeof import('./components/teams/index.vue')['default']
|
||||
TeamsAdd: typeof import('./components/teams/Add.vue')['default']
|
||||
TeamsEdit: typeof import('./components/teams/Edit.vue')['default']
|
||||
TeamsInvite: typeof import('./components/teams/Invite.vue')['default']
|
||||
TeamsMemberStack: typeof import('./components/teams/MemberStack.vue')['default']
|
||||
TeamsModal: typeof import('./components/teams/Modal.vue')['default']
|
||||
TeamsTeam: typeof import('./components/teams/Team.vue')['default']
|
||||
Tippy: typeof import('vue-tippy')['Tippy']
|
||||
WorkspaceCurrent: typeof import('./components/workspace/Current.vue')['default']
|
||||
WorkspaceSelector: typeof import('./components/workspace/Selector.vue')['default']
|
||||
IconLucideSearch: (typeof import("~icons/lucide/search"))["default"]
|
||||
IconLucideUsers: (typeof import("~icons/lucide/users"))["default"]
|
||||
IconLucideX: (typeof import("~icons/lucide/x"))["default"]
|
||||
ImportExportBase: (typeof import("./components/importExport/Base.vue"))["default"]
|
||||
ImportExportImportExportList: (typeof import("./components/importExport/ImportExportList.vue"))["default"]
|
||||
ImportExportImportExportSourcesList: (typeof import("./components/importExport/ImportExportSourcesList.vue"))["default"]
|
||||
ImportExportImportExportStepsFileImport: (typeof import("./components/importExport/ImportExportSteps/FileImport.vue"))["default"]
|
||||
ImportExportImportExportStepsMyCollectionImport: (typeof import("./components/importExport/ImportExportSteps/MyCollectionImport.vue"))["default"]
|
||||
ImportExportImportExportStepsUrlImport: (typeof import("./components/importExport/ImportExportSteps/UrlImport.vue"))["default"]
|
||||
InterceptorsErrorPlaceholder: (typeof import("./components/interceptors/ErrorPlaceholder.vue"))["default"]
|
||||
InterceptorsExtensionSubtitle: (typeof import("./components/interceptors/ExtensionSubtitle.vue"))["default"]
|
||||
LensesHeadersRenderer: (typeof import("./components/lenses/HeadersRenderer.vue"))["default"]
|
||||
LensesHeadersRendererEntry: (typeof import("./components/lenses/HeadersRendererEntry.vue"))["default"]
|
||||
LensesRenderersAudioLensRenderer: (typeof import("./components/lenses/renderers/AudioLensRenderer.vue"))["default"]
|
||||
LensesRenderersHTMLLensRenderer: (typeof import("./components/lenses/renderers/HTMLLensRenderer.vue"))["default"]
|
||||
LensesRenderersImageLensRenderer: (typeof import("./components/lenses/renderers/ImageLensRenderer.vue"))["default"]
|
||||
LensesRenderersJSONLensRenderer: (typeof import("./components/lenses/renderers/JSONLensRenderer.vue"))["default"]
|
||||
LensesRenderersPDFLensRenderer: (typeof import("./components/lenses/renderers/PDFLensRenderer.vue"))["default"]
|
||||
LensesRenderersRawLensRenderer: (typeof import("./components/lenses/renderers/RawLensRenderer.vue"))["default"]
|
||||
LensesRenderersVideoLensRenderer: (typeof import("./components/lenses/renderers/VideoLensRenderer.vue"))["default"]
|
||||
LensesRenderersXMLLensRenderer: (typeof import("./components/lenses/renderers/XMLLensRenderer.vue"))["default"]
|
||||
LensesResponseBodyRenderer: (typeof import("./components/lenses/ResponseBodyRenderer.vue"))["default"]
|
||||
ProfileUserDelete: (typeof import("./components/profile/UserDelete.vue"))["default"]
|
||||
RealtimeCommunication: (typeof import("./components/realtime/Communication.vue"))["default"]
|
||||
RealtimeConnectionConfig: (typeof import("./components/realtime/ConnectionConfig.vue"))["default"]
|
||||
RealtimeLog: (typeof import("./components/realtime/Log.vue"))["default"]
|
||||
RealtimeLogEntry: (typeof import("./components/realtime/LogEntry.vue"))["default"]
|
||||
RealtimeSubscription: (typeof import("./components/realtime/Subscription.vue"))["default"]
|
||||
SettingsExtension: (typeof import("./components/settings/Extension.vue"))["default"]
|
||||
SettingsProxy: (typeof import("./components/settings/Proxy.vue"))["default"]
|
||||
Share: (typeof import("./components/share/index.vue"))["default"]
|
||||
ShareCreateModal: (typeof import("./components/share/CreateModal.vue"))["default"]
|
||||
ShareCustomizeModal: (typeof import("./components/share/CustomizeModal.vue"))["default"]
|
||||
ShareModal: (typeof import("./components/share/Modal.vue"))["default"]
|
||||
ShareRequest: (typeof import("./components/share/Request.vue"))["default"]
|
||||
ShareTemplatesButton: (typeof import("./components/share/templates/Button.vue"))["default"]
|
||||
ShareTemplatesEmbeds: (typeof import("./components/share/templates/Embeds.vue"))["default"]
|
||||
ShareTemplatesLink: (typeof import("./components/share/templates/Link.vue"))["default"]
|
||||
SmartAccentModePicker: (typeof import("./components/smart/AccentModePicker.vue"))["default"]
|
||||
SmartChangeLanguage: (typeof import("./components/smart/ChangeLanguage.vue"))["default"]
|
||||
SmartColorModePicker: (typeof import("./components/smart/ColorModePicker.vue"))["default"]
|
||||
SmartEnvInput: (typeof import("./components/smart/EnvInput.vue"))["default"]
|
||||
TabPrimary: (typeof import("./components/tab/Primary.vue"))["default"]
|
||||
TabSecondary: (typeof import("./components/tab/Secondary.vue"))["default"]
|
||||
Teams: (typeof import("./components/teams/index.vue"))["default"]
|
||||
TeamsAdd: (typeof import("./components/teams/Add.vue"))["default"]
|
||||
TeamsEdit: (typeof import("./components/teams/Edit.vue"))["default"]
|
||||
TeamsInvite: (typeof import("./components/teams/Invite.vue"))["default"]
|
||||
TeamsMemberStack: (typeof import("./components/teams/MemberStack.vue"))["default"]
|
||||
TeamsModal: (typeof import("./components/teams/Modal.vue"))["default"]
|
||||
TeamsTeam: (typeof import("./components/teams/Team.vue"))["default"]
|
||||
Tippy: (typeof import("vue-tippy"))["Tippy"]
|
||||
WorkspaceCurrent: (typeof import("./components/workspace/Current.vue"))["default"]
|
||||
WorkspaceSelector: (typeof import("./components/workspace/Selector.vue"))["default"]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,19 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-span-1 flex items-center justify-between space-x-2">
|
||||
<AppSpotlightSearch />
|
||||
<button
|
||||
class="flex h-full flex-1 cursor-text items-center justify-between self-stretch rounded border border-dividerDark bg-primaryDark px-2 text-secondaryLight transition hover:border-dividerDark hover:bg-primaryLight hover:text-secondary focus-visible:border-dividerDark focus-visible:bg-primaryLight focus-visible:text-secondary"
|
||||
@click="invokeAction('modals.search.toggle', undefined, 'mouseclick')"
|
||||
>
|
||||
<span class="inline-flex flex-1 items-center">
|
||||
<icon-lucide-search class="svg-icons mr-2" />
|
||||
{{ t("app.search") }}
|
||||
</span>
|
||||
<span class="flex space-x-1">
|
||||
<kbd class="shortcut-key">{{ getPlatformSpecialKey() }}</kbd>
|
||||
<kbd class="shortcut-key">K</kbd>
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="col-span-2 flex items-center justify-between space-x-2">
|
||||
<div class="flex">
|
||||
@@ -43,19 +55,12 @@
|
||||
@click="invokeAction('modals.support.toggle')"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
class="flex"
|
||||
:class="{
|
||||
'flex-row-reverse gap-2':
|
||||
workspaceSelectorFlagEnabled && !currentUser,
|
||||
}"
|
||||
>
|
||||
<div class="flex">
|
||||
<div
|
||||
v-if="currentUser === null"
|
||||
class="inline-flex items-center space-x-2"
|
||||
>
|
||||
<HoppButtonSecondary
|
||||
v-if="!workspaceSelectorFlagEnabled"
|
||||
:icon="IconUploadCloud"
|
||||
:label="t('header.save_workspace')"
|
||||
class="!focus-visible:text-emerald-600 !hover:text-emerald-600 hidden h-8 border border-emerald-600/25 bg-emerald-500/10 !text-emerald-500 hover:border-emerald-600/20 hover:bg-emerald-600/20 focus-visible:border-emerald-600/20 focus-visible:bg-emerald-600/20 md:flex"
|
||||
@@ -67,22 +72,18 @@
|
||||
@click="invokeAction('modals.login.toggle')"
|
||||
/>
|
||||
</div>
|
||||
<TeamsMemberStack
|
||||
v-else-if="
|
||||
currentUser !== null &&
|
||||
workspace.type === 'team' &&
|
||||
selectedTeam &&
|
||||
selectedTeam.teamMembers.length > 1
|
||||
"
|
||||
:team-members="selectedTeam.teamMembers"
|
||||
show-count
|
||||
class="mx-2"
|
||||
@handle-click="handleTeamEdit()"
|
||||
/>
|
||||
<div
|
||||
v-if="workspaceSelectorFlagEnabled || currentUser"
|
||||
class="inline-flex items-center space-x-2"
|
||||
>
|
||||
<div v-else class="inline-flex items-center space-x-2">
|
||||
<TeamsMemberStack
|
||||
v-if="
|
||||
workspace.type === 'team' &&
|
||||
selectedTeam &&
|
||||
selectedTeam.teamMembers.length > 1
|
||||
"
|
||||
:team-members="selectedTeam.teamMembers"
|
||||
show-count
|
||||
class="mx-2"
|
||||
@handle-click="handleTeamEdit()"
|
||||
/>
|
||||
<div
|
||||
class="flex h-8 divide-x divide-emerald-600/25 rounded border border-emerald-600/25 bg-emerald-500/10 focus-within:divide-emerald-600/20 focus-within:border-emerald-600/20 focus-within:bg-emerald-600/20 hover:divide-emerald-600/20 hover:border-emerald-600/20 hover:bg-emerald-600/20"
|
||||
>
|
||||
@@ -95,7 +96,6 @@
|
||||
/>
|
||||
<HoppButtonSecondary
|
||||
v-if="
|
||||
currentUser &&
|
||||
workspace.type === 'team' &&
|
||||
selectedTeam &&
|
||||
selectedTeam?.myRole === 'OWNER'
|
||||
@@ -136,7 +136,7 @@
|
||||
</div>
|
||||
</template>
|
||||
</tippy>
|
||||
<span v-if="currentUser" class="px-2">
|
||||
<span class="px-2">
|
||||
<tippy
|
||||
interactive
|
||||
trigger="click"
|
||||
@@ -251,6 +251,7 @@ import { breakpointsTailwind, useBreakpoints, useNetwork } from "@vueuse/core"
|
||||
import { computed, reactive, ref, watch } from "vue"
|
||||
import { useToast } from "~/composables/toast"
|
||||
import { GetMyTeamsQuery, TeamMemberRole } from "~/helpers/backend/graphql"
|
||||
import { getPlatformSpecialKey } from "~/helpers/platformutils"
|
||||
import { platform } from "~/platform"
|
||||
import IconDownload from "~icons/lucide/download"
|
||||
import IconLifeBuoy from "~icons/lucide/life-buoy"
|
||||
@@ -271,13 +272,6 @@ import {
|
||||
const t = useI18n()
|
||||
const toast = useToast()
|
||||
|
||||
/**
|
||||
* Feature flag to enable the workspace selector login conversion
|
||||
*/
|
||||
const workspaceSelectorFlagEnabled = computed(
|
||||
() => !!platform.platformFeatureFlags.workspaceSwitcherLogin?.value
|
||||
)
|
||||
|
||||
/**
|
||||
* Once the PWA code is initialized, this holds a method
|
||||
* that can be called to show the user the installation
|
||||
@@ -399,8 +393,6 @@ const inviteTeam = (team: { name: string }, teamID: string) => {
|
||||
|
||||
// Show the workspace selected team invite modal if the user is an owner of the team else show the default invite modal
|
||||
const handleInvite = () => {
|
||||
if (!currentUser.value) return invokeAction("modals.login.toggle")
|
||||
|
||||
if (
|
||||
workspace.value.type === "team" &&
|
||||
workspace.value.teamID &&
|
||||
|
||||
@@ -1,135 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
class="border-animation relative p-[1px] rounded flex-1 self-stretch overflow-hidden flex items-center justify-center"
|
||||
:class="{
|
||||
'before:top-1/2 before:left-1/2 before:-translate-x-1/2 before:-translate-y-1/2 before:aspect-square before:w-full before:absolute before:bg-':
|
||||
!HAS_OPENED_SPOTLIGHT,
|
||||
}"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<button
|
||||
class="relative flex flex-1 cursor-text items-center justify-between self-stretch rounded bg-primaryDark px-2 text-secondaryLight transition hover:border-dividerDark hover:bg-primaryLight hover:text-secondary focus-visible:border-dividerDark focus-visible:bg-primaryLight focus-visible:text-secondary overflow-hidden"
|
||||
@click="
|
||||
() => {
|
||||
invokeAction('modals.search.toggle', undefined, 'mouseclick')
|
||||
!HAS_OPENED_SPOTLIGHT && toggleSetting('HAS_OPENED_SPOTLIGHT')
|
||||
}
|
||||
"
|
||||
>
|
||||
<span class="inline-flex flex-1 items-center">
|
||||
<icon-lucide-search class="svg-icons mr-2" />
|
||||
<span v-if="!HAS_OPENED_SPOTLIGHT" class="flex flex-1">
|
||||
{{ t("spotlight.phrases.try") }}
|
||||
<TransitionGroup tag="div" name="list" class="ml-1 relative">
|
||||
<span
|
||||
v-for="(phrase, index) in phraseToShow"
|
||||
:key="phrase.text"
|
||||
:data-index="index"
|
||||
class="truncate"
|
||||
>
|
||||
"{{ t(phrase.text) }}"
|
||||
</span>
|
||||
</TransitionGroup>
|
||||
</span>
|
||||
<template v-else>
|
||||
{{ t("app.search") }}
|
||||
</template>
|
||||
</span>
|
||||
<span class="flex space-x-1">
|
||||
<kbd class="shortcut-key">{{ getPlatformSpecialKey() }}</kbd>
|
||||
<kbd class="shortcut-key">K</kbd>
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { watch, computed, ref } from "vue"
|
||||
import { useI18n } from "~/composables/i18n"
|
||||
import { useSetting } from "~/composables/settings"
|
||||
import { invokeAction } from "~/helpers/actions"
|
||||
import { getPlatformSpecialKey } from "~/helpers/platformutils"
|
||||
import { toggleSetting } from "~/newstore/settings"
|
||||
|
||||
const t = useI18n()
|
||||
|
||||
const HAS_OPENED_SPOTLIGHT = useSetting("HAS_OPENED_SPOTLIGHT")
|
||||
|
||||
const phrases = ref([
|
||||
{ text: "spotlight.phrases.import_collections", show: true },
|
||||
{ text: "spotlight.phrases.create_environment", show: false },
|
||||
{ text: "spotlight.phrases.create_workspace", show: false },
|
||||
{ text: "spotlight.phrases.share_request", show: false },
|
||||
])
|
||||
|
||||
let intervalId: ReturnType<typeof setTimeout> | null = null
|
||||
|
||||
//cycle through the phrases
|
||||
const showNextPhrase = () => {
|
||||
let i = 0
|
||||
intervalId = setInterval(() => {
|
||||
phrases.value[i].show = false
|
||||
i++
|
||||
if (i >= phrases.value.length) {
|
||||
i = 0
|
||||
}
|
||||
phrases.value[i].show = true
|
||||
}, 3000)
|
||||
}
|
||||
|
||||
const stopPhraseInterval = () => {
|
||||
if (intervalId) clearInterval(intervalId)
|
||||
}
|
||||
|
||||
const phraseToShow = computed(() => {
|
||||
return phrases.value.filter((phrase) => phrase.show)
|
||||
})
|
||||
|
||||
watch(
|
||||
HAS_OPENED_SPOTLIGHT,
|
||||
() => {
|
||||
!HAS_OPENED_SPOTLIGHT.value ? showNextPhrase() : stopPhraseInterval()
|
||||
},
|
||||
{
|
||||
immediate: true,
|
||||
}
|
||||
)
|
||||
</script>
|
||||
|
||||
<style>
|
||||
/* Transition Classes */
|
||||
.list-enter-active {
|
||||
transition: all 1s ease;
|
||||
}
|
||||
.list-leave-active {
|
||||
transition: all 0.4s ease;
|
||||
}
|
||||
.list-enter-from,
|
||||
.list-leave-to {
|
||||
opacity: 0;
|
||||
transform: translateY(-30px);
|
||||
}
|
||||
.list-leave-active {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
/* Conic gradient */
|
||||
.border-animation::before {
|
||||
background: conic-gradient(
|
||||
transparent 270deg,
|
||||
var(--accent-color),
|
||||
transparent
|
||||
);
|
||||
animation: rotate 4s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes rotate {
|
||||
from {
|
||||
transform: translate(-50%, -50%) scale(1.4) rotate(0turn);
|
||||
}
|
||||
|
||||
to {
|
||||
transform: translate(-50%, -50%) scale(1.4) rotate(1turn);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,32 +0,0 @@
|
||||
<template>
|
||||
<span class="flex flex-1 items-center space-x-2">
|
||||
<template v-for="(title, index) in collectionTitles" :key="index">
|
||||
<span class="block" :class="{ truncate: index !== 0 }">
|
||||
{{ title }}
|
||||
</span>
|
||||
<icon-lucide-chevron-right class="flex flex-shrink-0" />
|
||||
</template>
|
||||
<span
|
||||
v-if="request"
|
||||
class="flex flex-shrink-0 truncate rounded-md border border-dividerDark px-1 text-tiny font-semibold"
|
||||
:style="{ color: getMethodLabelColor(request.method) }"
|
||||
>
|
||||
{{ request.method.toUpperCase() }}
|
||||
</span>
|
||||
<span v-if="request" class="block">
|
||||
{{ request.name }}
|
||||
</span>
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { getMethodLabelColor } from "~/helpers/rest/labelColoring"
|
||||
|
||||
defineProps<{
|
||||
collectionTitles: string[]
|
||||
request: {
|
||||
name: string
|
||||
method: string
|
||||
}
|
||||
}>()
|
||||
</script>
|
||||
@@ -111,7 +111,6 @@ import { RequestSpotlightSearcherService } from "~/services/spotlight/searchers/
|
||||
import { ResponseSpotlightSearcherService } from "~/services/spotlight/searchers/response.searcher"
|
||||
import { SettingsSpotlightSearcherService } from "~/services/spotlight/searchers/settings.searcher"
|
||||
import { TabSpotlightSearcherService } from "~/services/spotlight/searchers/tab.searcher"
|
||||
import { TeamsSpotlightSearcherService } from "~/services/spotlight/searchers/teamRequest.searcher"
|
||||
import { UserSpotlightSearcherService } from "~/services/spotlight/searchers/user.searcher"
|
||||
import {
|
||||
SwitchWorkspaceSpotlightSearcherService,
|
||||
@@ -145,7 +144,6 @@ useService(SwitchEnvSpotlightSearcherService)
|
||||
useService(WorkspaceSpotlightSearcherService)
|
||||
useService(SwitchWorkspaceSpotlightSearcherService)
|
||||
useService(InterceptorSpotlightSearcherService)
|
||||
useService(TeamsSpotlightSearcherService)
|
||||
|
||||
platform.spotlight?.additionalSearchers?.forEach((searcher) =>
|
||||
useService(searcher)
|
||||
|
||||
@@ -32,6 +32,7 @@ import { useI18n } from "~/composables/i18n"
|
||||
import { useToast } from "~/composables/toast"
|
||||
import { appendRESTCollections, restCollections$ } from "~/newstore/collections"
|
||||
import MyCollectionImport from "~/components/importExport/ImportExportSteps/MyCollectionImport.vue"
|
||||
import { GetMyTeamsQuery } from "~/helpers/backend/graphql"
|
||||
|
||||
import IconFolderPlus from "~icons/lucide/folder-plus"
|
||||
import IconOpenAPI from "~icons/lucide/file"
|
||||
@@ -54,15 +55,16 @@ import { teamCollectionsExporter } from "~/helpers/import-export/export/teamColl
|
||||
|
||||
import { GistSource } from "~/helpers/import-export/import/import-sources/GistSource"
|
||||
import { ImporterOrExporter } from "~/components/importExport/types"
|
||||
import { TeamWorkspace } from "~/services/workspace.service"
|
||||
|
||||
const t = useI18n()
|
||||
const toast = useToast()
|
||||
|
||||
type SelectedTeam = GetMyTeamsQuery["myTeams"][number] | undefined
|
||||
|
||||
type CollectionType =
|
||||
| {
|
||||
type: "team-collections"
|
||||
selectedTeam: TeamWorkspace
|
||||
selectedTeam: SelectedTeam
|
||||
}
|
||||
| { type: "my-collections" }
|
||||
|
||||
@@ -431,7 +433,7 @@ const HoppTeamCollectionsExporter: ImporterOrExporter = {
|
||||
props.collectionsType.selectedTeam
|
||||
) {
|
||||
const res = await teamCollectionsExporter(
|
||||
props.collectionsType.selectedTeam.teamID
|
||||
props.collectionsType.selectedTeam.id
|
||||
)
|
||||
|
||||
if (E.isRight(res)) {
|
||||
@@ -567,8 +569,8 @@ const hasTeamWriteAccess = computed(() => {
|
||||
}
|
||||
|
||||
return (
|
||||
collectionsType.selectedTeam.role === "EDITOR" ||
|
||||
collectionsType.selectedTeam.role === "OWNER"
|
||||
collectionsType.selectedTeam.myRole === "EDITOR" ||
|
||||
collectionsType.selectedTeam.myRole === "OWNER"
|
||||
)
|
||||
})
|
||||
|
||||
@@ -576,17 +578,17 @@ const selectedTeamID = computed(() => {
|
||||
const { collectionsType } = props
|
||||
|
||||
return collectionsType.type === "team-collections"
|
||||
? collectionsType.selectedTeam?.teamID
|
||||
? collectionsType.selectedTeam?.id
|
||||
: undefined
|
||||
})
|
||||
|
||||
const getCollectionJSON = async () => {
|
||||
if (
|
||||
props.collectionsType.type === "team-collections" &&
|
||||
props.collectionsType.selectedTeam?.teamID
|
||||
props.collectionsType.selectedTeam?.id
|
||||
) {
|
||||
const res = await getTeamCollectionJSON(
|
||||
props.collectionsType.selectedTeam?.teamID
|
||||
props.collectionsType.selectedTeam?.id
|
||||
)
|
||||
|
||||
return E.isRight(res)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
>
|
||||
<template #body>
|
||||
<HoppSmartTabs
|
||||
v-model="activeTab"
|
||||
v-model="selectedOptionTab"
|
||||
styles="sticky overflow-x-auto flex-shrink-0 bg-primary top-0 z-10 !-py-4"
|
||||
render-inactive-tabs
|
||||
>
|
||||
@@ -16,6 +16,7 @@
|
||||
<HttpHeaders
|
||||
v-model="editableCollection"
|
||||
:is-collection-property="true"
|
||||
@change-tab="changeOptionTab"
|
||||
/>
|
||||
<div
|
||||
class="bg-bannerInfo px-4 py-2 flex items-center sticky bottom-0"
|
||||
@@ -33,7 +34,6 @@
|
||||
:is-collection-property="true"
|
||||
:is-root-collection="editingProperties?.isRootCollection"
|
||||
:inherited-properties="editingProperties?.inheritedProperties"
|
||||
:source="source"
|
||||
/>
|
||||
<div
|
||||
class="bg-bannerInfo px-4 py-2 flex items-center sticky bottom-0"
|
||||
@@ -64,42 +64,27 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { watch, ref } from "vue"
|
||||
import { useI18n } from "@composables/i18n"
|
||||
import {
|
||||
GQLHeader,
|
||||
HoppCollection,
|
||||
HoppGQLAuth,
|
||||
HoppRESTAuth,
|
||||
HoppRESTHeaders,
|
||||
} from "@hoppscotch/data"
|
||||
import { useVModel } from "@vueuse/core"
|
||||
import { useService } from "dioc/vue"
|
||||
import { HoppCollection, HoppRESTAuth, HoppRESTHeaders } from "@hoppscotch/data"
|
||||
import { RESTOptionTabs } from "../http/RequestOptions.vue"
|
||||
import { clone } from "lodash-es"
|
||||
import { ref, watch } from "vue"
|
||||
|
||||
import { HoppInheritedProperty } from "~/helpers/types/HoppInheritedProperties"
|
||||
import { PersistenceService } from "~/services/persistence"
|
||||
|
||||
const persistenceService = useService(PersistenceService)
|
||||
const t = useI18n()
|
||||
|
||||
export type EditingProperties = {
|
||||
type EditingProperties = {
|
||||
collection: Partial<HoppCollection> | null
|
||||
isRootCollection: boolean
|
||||
path: string
|
||||
inheritedProperties?: HoppInheritedProperty
|
||||
}
|
||||
|
||||
type HoppCollectionAuth = HoppRESTAuth | HoppGQLAuth
|
||||
type HoppCollectionHeaders = HoppRESTHeaders | GQLHeader[]
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
show: boolean
|
||||
loadingState: boolean
|
||||
editingProperties: EditingProperties | null
|
||||
source: "REST" | "GraphQL"
|
||||
modelValue: string
|
||||
}>(),
|
||||
{
|
||||
show: false,
|
||||
@@ -114,12 +99,11 @@ const emit = defineEmits<{
|
||||
newCollection: Omit<EditingProperties, "inheritedProperties">
|
||||
): void
|
||||
(e: "hide-modal"): void
|
||||
(e: "update:modelValue"): void
|
||||
}>()
|
||||
|
||||
const editableCollection = ref<{
|
||||
headers: HoppCollectionHeaders
|
||||
auth: HoppCollectionAuth
|
||||
headers: HoppRESTHeaders
|
||||
auth: HoppRESTAuth
|
||||
}>({
|
||||
headers: [],
|
||||
auth: {
|
||||
@@ -128,38 +112,21 @@ const editableCollection = ref<{
|
||||
},
|
||||
})
|
||||
|
||||
watch(
|
||||
editableCollection,
|
||||
(updatedEditableCollection) => {
|
||||
if (props.show && props.editingProperties) {
|
||||
const unsavedCollectionProperties: EditingProperties = {
|
||||
collection: updatedEditableCollection,
|
||||
isRootCollection: props.editingProperties?.isRootCollection ?? false,
|
||||
path: props.editingProperties?.path,
|
||||
inheritedProperties: props.editingProperties?.inheritedProperties,
|
||||
}
|
||||
persistenceService.setLocalConfig(
|
||||
"unsaved_collection_properties",
|
||||
JSON.stringify(unsavedCollectionProperties)
|
||||
)
|
||||
}
|
||||
},
|
||||
{
|
||||
deep: true,
|
||||
}
|
||||
)
|
||||
const selectedOptionTab = ref("headers")
|
||||
|
||||
const activeTab = useVModel(props, "modelValue", emit)
|
||||
const changeOptionTab = (tab: RESTOptionTabs) => {
|
||||
selectedOptionTab.value = tab
|
||||
}
|
||||
|
||||
watch(
|
||||
() => props.show,
|
||||
(show) => {
|
||||
if (show && props.editingProperties?.collection) {
|
||||
editableCollection.value.auth = clone(
|
||||
props.editingProperties.collection.auth as HoppCollectionAuth
|
||||
props.editingProperties.collection.auth as HoppRESTAuth
|
||||
)
|
||||
editableCollection.value.headers = clone(
|
||||
props.editingProperties.collection.headers as HoppCollectionHeaders
|
||||
props.editingProperties.collection.headers as HoppRESTHeaders
|
||||
)
|
||||
} else {
|
||||
editableCollection.value = {
|
||||
@@ -169,8 +136,6 @@ watch(
|
||||
authActive: false,
|
||||
},
|
||||
}
|
||||
|
||||
persistenceService.removeLocalConfig("unsaved_collection_properties")
|
||||
}
|
||||
}
|
||||
)
|
||||
@@ -187,11 +152,9 @@ const saveEditedCollection = () => {
|
||||
isRootCollection: props.editingProperties.isRootCollection,
|
||||
}
|
||||
emit("set-collection-properties", collection as EditingProperties)
|
||||
persistenceService.removeLocalConfig("unsaved_collection_properties")
|
||||
}
|
||||
|
||||
const hideModal = () => {
|
||||
persistenceService.removeLocalConfig("unsaved_collection_properties")
|
||||
emit("hide-modal")
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -56,25 +56,23 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { useI18n } from "@composables/i18n"
|
||||
import { useToast } from "@composables/toast"
|
||||
import { computed, nextTick, reactive, ref, watch } from "vue"
|
||||
import { cloneDeep } from "lodash-es"
|
||||
import {
|
||||
HoppGQLRequest,
|
||||
HoppRESTRequest,
|
||||
isHoppRESTRequest,
|
||||
} from "@hoppscotch/data"
|
||||
import { computedWithControl } from "@vueuse/core"
|
||||
import { useService } from "dioc/vue"
|
||||
import * as TE from "fp-ts/TaskEither"
|
||||
import { pipe } from "fp-ts/function"
|
||||
import { cloneDeep } from "lodash-es"
|
||||
import { computed, nextTick, reactive, ref, watch } from "vue"
|
||||
import { GQLError } from "~/helpers/backend/GQLClient"
|
||||
import * as TE from "fp-ts/TaskEither"
|
||||
import { GetMyTeamsQuery } from "~/helpers/backend/graphql"
|
||||
import {
|
||||
createRequestInCollection,
|
||||
updateTeamRequest,
|
||||
} from "~/helpers/backend/mutations/TeamRequest"
|
||||
import { Picked } from "~/helpers/types/HoppPicked"
|
||||
import { useI18n } from "@composables/i18n"
|
||||
import { useToast } from "@composables/toast"
|
||||
import {
|
||||
cascadeParentCollectionForHeaderAuth,
|
||||
editGraphqlRequest,
|
||||
@@ -82,10 +80,12 @@ import {
|
||||
saveGraphqlRequestAs,
|
||||
saveRESTRequestAs,
|
||||
} from "~/newstore/collections"
|
||||
import { GQLError } from "~/helpers/backend/GQLClient"
|
||||
import { computedWithControl } from "@vueuse/core"
|
||||
import { platform } from "~/platform"
|
||||
import { GQLTabService } from "~/services/tab/graphql"
|
||||
import { useService } from "dioc/vue"
|
||||
import { RESTTabService } from "~/services/tab/rest"
|
||||
import { TeamWorkspace } from "~/services/workspace.service"
|
||||
import { GQLTabService } from "~/services/tab/graphql"
|
||||
|
||||
const t = useI18n()
|
||||
const toast = useToast()
|
||||
@@ -93,10 +93,12 @@ const toast = useToast()
|
||||
const RESTTabs = useService(RESTTabService)
|
||||
const GQLTabs = useService(GQLTabService)
|
||||
|
||||
type SelectedTeam = GetMyTeamsQuery["myTeams"][number] | undefined
|
||||
|
||||
type CollectionType =
|
||||
| {
|
||||
type: "team-collections"
|
||||
selectedTeam: TeamWorkspace
|
||||
selectedTeam: SelectedTeam
|
||||
}
|
||||
| { type: "my-collections"; selectedTeam: undefined }
|
||||
|
||||
@@ -190,7 +192,7 @@ watch(
|
||||
}
|
||||
)
|
||||
|
||||
const updateTeam = (newTeam: TeamWorkspace) => {
|
||||
const updateTeam = (newTeam: SelectedTeam) => {
|
||||
collectionsType.value.selectedTeam = newTeam
|
||||
}
|
||||
|
||||
@@ -491,7 +493,7 @@ const updateTeamCollectionOrFolder = (
|
||||
const data = {
|
||||
title: requestUpdated.name,
|
||||
request: JSON.stringify(requestUpdated),
|
||||
teamID: collectionsType.value.selectedTeam.teamID,
|
||||
teamID: collectionsType.value.selectedTeam.id,
|
||||
}
|
||||
pipe(
|
||||
createRequestInCollection(collectionID, data),
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"
|
||||
>
|
||||
<HoppButtonSecondary
|
||||
v-if="hasNoTeamAccess || isShowingSearchResults"
|
||||
v-if="hasNoTeamAccess"
|
||||
v-tippy="{ theme: 'tooltip' }"
|
||||
disabled
|
||||
class="!rounded-none"
|
||||
@@ -36,9 +36,8 @@
|
||||
v-if="!saveRequest"
|
||||
v-tippy="{ theme: 'tooltip' }"
|
||||
:disabled="
|
||||
(collectionsType.type === 'team-collections' &&
|
||||
collectionsType.selectedTeam === undefined) ||
|
||||
isShowingSearchResults
|
||||
collectionsType.type === 'team-collections' &&
|
||||
collectionsType.selectedTeam === undefined
|
||||
"
|
||||
:icon="IconImport"
|
||||
:title="t('modal.import_export')"
|
||||
@@ -59,7 +58,7 @@
|
||||
:collections-type="collectionsType.type"
|
||||
:is-open="isOpen"
|
||||
:export-loading="exportLoading"
|
||||
:has-no-team-access="hasNoTeamAccess || isShowingSearchResults"
|
||||
:has-no-team-access="hasNoTeamAccess"
|
||||
:collection-move-loading="collectionMoveLoading"
|
||||
:is-last-item="node.data.isLastItem"
|
||||
:is-selected="
|
||||
@@ -129,14 +128,6 @@
|
||||
})
|
||||
}
|
||||
"
|
||||
@click="
|
||||
() => {
|
||||
handleCollectionClick({
|
||||
collectionID: node.id,
|
||||
isOpen,
|
||||
})
|
||||
}
|
||||
"
|
||||
/>
|
||||
<CollectionsCollection
|
||||
v-if="node.data.type === 'folders'"
|
||||
@@ -146,7 +137,7 @@
|
||||
:collections-type="collectionsType.type"
|
||||
:is-open="isOpen"
|
||||
:export-loading="exportLoading"
|
||||
:has-no-team-access="hasNoTeamAccess || isShowingSearchResults"
|
||||
:has-no-team-access="hasNoTeamAccess"
|
||||
:collection-move-loading="collectionMoveLoading"
|
||||
:is-last-item="node.data.isLastItem"
|
||||
:is-selected="
|
||||
@@ -218,15 +209,6 @@
|
||||
})
|
||||
}
|
||||
"
|
||||
@click="
|
||||
() => {
|
||||
handleCollectionClick({
|
||||
// for the folders, we get a path, so we need to get the last part of the path which is the folder id
|
||||
collectionID: node.id.split('/').pop() as string,
|
||||
isOpen,
|
||||
})
|
||||
}
|
||||
"
|
||||
/>
|
||||
<CollectionsRequest
|
||||
v-if="node.data.type === 'requests'"
|
||||
@@ -236,7 +218,7 @@
|
||||
:collections-type="collectionsType.type"
|
||||
:duplicate-loading="duplicateLoading"
|
||||
:is-active="isActiveRequest(node.data.data.data.id)"
|
||||
:has-no-team-access="hasNoTeamAccess || isShowingSearchResults"
|
||||
:has-no-team-access="hasNoTeamAccess"
|
||||
:request-move-loading="requestMoveLoading"
|
||||
:is-last-item="node.data.isLastItem"
|
||||
:is-selected="
|
||||
@@ -301,15 +283,7 @@
|
||||
</template>
|
||||
<template #emptyNode="{ node }">
|
||||
<HoppSmartPlaceholder
|
||||
v-if="filterText.length !== 0 && teamCollectionList.length === 0"
|
||||
:text="`${t('state.nothing_found')} ‟${filterText}”`"
|
||||
>
|
||||
<template #icon>
|
||||
<icon-lucide-search class="svg-icons opacity-75" />
|
||||
</template>
|
||||
</HoppSmartPlaceholder>
|
||||
<HoppSmartPlaceholder
|
||||
v-else-if="node === null"
|
||||
v-if="node === null"
|
||||
:src="`/images/states/${colorMode.value}/pack.svg`"
|
||||
:alt="`${t('empty.collections')}`"
|
||||
:text="t('empty.collections')"
|
||||
@@ -387,6 +361,7 @@ import IconPlus from "~icons/lucide/plus"
|
||||
import IconHelpCircle from "~icons/lucide/help-circle"
|
||||
import IconImport from "~icons/lucide/folder-down"
|
||||
import { computed, PropType, Ref, toRef } from "vue"
|
||||
import { GetMyTeamsQuery } from "~/helpers/backend/graphql"
|
||||
import { useI18n } from "@composables/i18n"
|
||||
import { useColorMode } from "@composables/theming"
|
||||
import { TeamCollection } from "~/helpers/teams/TeamCollection"
|
||||
@@ -399,16 +374,17 @@ import * as O from "fp-ts/Option"
|
||||
import { Picked } from "~/helpers/types/HoppPicked.js"
|
||||
import { RESTTabService } from "~/services/tab/rest"
|
||||
import { useService } from "dioc/vue"
|
||||
import { TeamWorkspace } from "~/services/workspace.service"
|
||||
|
||||
const t = useI18n()
|
||||
const colorMode = useColorMode()
|
||||
const tabs = useService(RESTTabService)
|
||||
|
||||
type SelectedTeam = GetMyTeamsQuery["myTeams"][number] | undefined
|
||||
|
||||
type CollectionType =
|
||||
| {
|
||||
type: "team-collections"
|
||||
selectedTeam: TeamWorkspace
|
||||
selectedTeam: SelectedTeam
|
||||
}
|
||||
| { type: "my-collections"; selectedTeam: undefined }
|
||||
|
||||
@@ -418,11 +394,6 @@ const props = defineProps({
|
||||
default: () => ({ type: "my-collections", selectedTeam: undefined }),
|
||||
required: true,
|
||||
},
|
||||
filterText: {
|
||||
type: String as PropType<string>,
|
||||
default: "",
|
||||
required: true,
|
||||
},
|
||||
teamCollectionList: {
|
||||
type: Array as PropType<TeamCollection[]>,
|
||||
default: () => [],
|
||||
@@ -465,8 +436,6 @@ const props = defineProps({
|
||||
},
|
||||
})
|
||||
|
||||
const isShowingSearchResults = computed(() => props.filterText.length > 0)
|
||||
|
||||
const emit = defineEmits<{
|
||||
(
|
||||
event: "add-request",
|
||||
@@ -574,14 +543,6 @@ const emit = defineEmits<{
|
||||
}
|
||||
}
|
||||
): void
|
||||
(
|
||||
event: "collection-click",
|
||||
payload: {
|
||||
// if the collection is open or not in the tree
|
||||
isOpen: boolean
|
||||
collectionID: string
|
||||
}
|
||||
): void
|
||||
(event: "select", payload: Picked | null): void
|
||||
(event: "expand-team-collection", payload: string): void
|
||||
(event: "display-modal-add"): void
|
||||
@@ -594,25 +555,13 @@ const getPath = (path: string) => {
|
||||
return pathArray.join("/")
|
||||
}
|
||||
|
||||
const handleCollectionClick = (payload: {
|
||||
collectionID: string
|
||||
isOpen: boolean
|
||||
}) => {
|
||||
const { collectionID, isOpen } = payload
|
||||
|
||||
emit("collection-click", {
|
||||
collectionID,
|
||||
isOpen,
|
||||
})
|
||||
}
|
||||
|
||||
const teamCollectionsList = toRef(props, "teamCollectionList")
|
||||
|
||||
const hasNoTeamAccess = computed(
|
||||
() =>
|
||||
props.collectionsType.type === "team-collections" &&
|
||||
(props.collectionsType.selectedTeam === undefined ||
|
||||
props.collectionsType.selectedTeam.role === "VIEWER")
|
||||
props.collectionsType.selectedTeam.myRole === "VIEWER")
|
||||
)
|
||||
|
||||
const isSelected = ({
|
||||
|
||||
@@ -146,10 +146,8 @@
|
||||
@hide-modal="displayModalImportExport(false)"
|
||||
/>
|
||||
<CollectionsProperties
|
||||
v-model="collectionPropertiesModalActiveTab"
|
||||
:show="showModalEditProperties"
|
||||
:editing-properties="editingProperties"
|
||||
source="GraphQL"
|
||||
@hide-modal="displayModalEditProperties(false)"
|
||||
@set-collection-properties="setCollectionProperties"
|
||||
/>
|
||||
@@ -157,7 +155,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { nextTick, onMounted, ref } from "vue"
|
||||
import { nextTick, ref } from "vue"
|
||||
import { clone, cloneDeep } from "lodash-es"
|
||||
import {
|
||||
graphqlCollections$,
|
||||
@@ -188,11 +186,6 @@ import { HoppInheritedProperty } from "~/helpers/types/HoppInheritedProperties"
|
||||
import { updateInheritedPropertiesForAffectedRequests } from "~/helpers/collection/collection"
|
||||
import { useToast } from "~/composables/toast"
|
||||
import { getRequestsByPath } from "~/helpers/collection/request"
|
||||
import { PersistenceService } from "~/services/persistence"
|
||||
import { PersistedOAuthConfig } from "~/services/oauth/oauth.service"
|
||||
import { GQLOptionTabs } from "~/components/graphql/RequestOptions.vue"
|
||||
import { EditingProperties } from "../Properties.vue"
|
||||
import { defineActionHandler } from "~/helpers/actions"
|
||||
|
||||
const t = useI18n()
|
||||
const toast = useToast()
|
||||
@@ -200,7 +193,7 @@ const toast = useToast()
|
||||
defineProps<{
|
||||
// Whether to activate the ability to pick items (activates 'select' events)
|
||||
saveRequest: boolean
|
||||
picked: Picked | null
|
||||
picked: Picked
|
||||
}>()
|
||||
|
||||
const collections = useReadonlyStream(graphqlCollections$, [], "deep")
|
||||
@@ -226,7 +219,7 @@ const editingRequest = ref<HoppGQLRequest | null>(null)
|
||||
const editingRequestIndex = ref<number | null>(null)
|
||||
|
||||
const editingProperties = ref<{
|
||||
collection: Partial<HoppCollection> | null
|
||||
collection: HoppCollection | null
|
||||
isRootCollection: boolean
|
||||
path: string
|
||||
inheritedProperties?: HoppInheritedProperty
|
||||
@@ -239,53 +232,6 @@ const editingProperties = ref<{
|
||||
|
||||
const filterText = ref("")
|
||||
|
||||
const persistenceService = useService(PersistenceService)
|
||||
|
||||
const collectionPropertiesModalActiveTab = ref<GQLOptionTabs>("headers")
|
||||
|
||||
onMounted(() => {
|
||||
const localOAuthTempConfig =
|
||||
persistenceService.getLocalConfig("oauth_temp_config")
|
||||
|
||||
if (!localOAuthTempConfig) {
|
||||
return
|
||||
}
|
||||
|
||||
const { context, source, token }: PersistedOAuthConfig =
|
||||
JSON.parse(localOAuthTempConfig)
|
||||
|
||||
if (source === "REST") {
|
||||
return
|
||||
}
|
||||
|
||||
if (context?.type === "collection-properties") {
|
||||
// load the unsaved editing properties
|
||||
const unsavedCollectionPropertiesString = persistenceService.getLocalConfig(
|
||||
"unsaved_collection_properties"
|
||||
)
|
||||
|
||||
if (unsavedCollectionPropertiesString) {
|
||||
const unsavedCollectionProperties: EditingProperties = JSON.parse(
|
||||
unsavedCollectionPropertiesString
|
||||
)
|
||||
|
||||
const auth = unsavedCollectionProperties.collection?.auth
|
||||
|
||||
if (auth?.authType === "oauth-2") {
|
||||
const grantTypeInfo = auth.grantTypeInfo
|
||||
|
||||
grantTypeInfo && (grantTypeInfo.token = token ?? "")
|
||||
}
|
||||
|
||||
editingProperties.value = unsavedCollectionProperties
|
||||
}
|
||||
|
||||
persistenceService.removeLocalConfig("oauth_temp_config")
|
||||
collectionPropertiesModalActiveTab.value = "authorization"
|
||||
showModalEditProperties.value = true
|
||||
}
|
||||
})
|
||||
|
||||
const filteredCollections = computed(() => {
|
||||
const collectionsClone = clone(collections.value)
|
||||
|
||||
@@ -611,7 +557,7 @@ const editProperties = ({
|
||||
if (collectionIndex === null || collection === null) return
|
||||
|
||||
const parentIndex = collectionIndex.split("/").slice(0, -1).join("/") // remove last folder to get parent folder
|
||||
let inheritedProperties = undefined
|
||||
let inheritedProperties = {}
|
||||
|
||||
if (parentIndex) {
|
||||
const { auth, headers } = cascadeParentCollectionForHeaderAuth(
|
||||
@@ -622,7 +568,7 @@ const editProperties = ({
|
||||
inheritedProperties = {
|
||||
auth,
|
||||
headers,
|
||||
}
|
||||
} as HoppInheritedProperty
|
||||
}
|
||||
|
||||
editingProperties.value = {
|
||||
@@ -636,15 +582,11 @@ const editProperties = ({
|
||||
}
|
||||
|
||||
const setCollectionProperties = (newCollection: {
|
||||
collection: Partial<HoppCollection> | null
|
||||
collection: HoppCollection
|
||||
path: string
|
||||
isRootCollection: boolean
|
||||
}) => {
|
||||
const { collection, path, isRootCollection } = newCollection
|
||||
if (!collection) {
|
||||
return
|
||||
}
|
||||
|
||||
if (isRootCollection) {
|
||||
editGraphqlCollection(parseInt(path), collection)
|
||||
} else {
|
||||
@@ -677,11 +619,4 @@ const resetSelectedData = () => {
|
||||
editingRequest.value = null
|
||||
editingRequestIndex.value = null
|
||||
}
|
||||
|
||||
defineActionHandler("collection.new", () => {
|
||||
displayModalAdd(true)
|
||||
})
|
||||
defineActionHandler("modals.collection.import", () => {
|
||||
displayModalImportExport(true)
|
||||
})
|
||||
</script>
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
autocomplete="off"
|
||||
class="flex w-full bg-transparent px-4 py-2 h-8"
|
||||
:placeholder="t('action.search')"
|
||||
:disabled="collectionsType.type === 'team-collections'"
|
||||
/>
|
||||
</div>
|
||||
<CollectionsMyCollections
|
||||
@@ -57,15 +58,8 @@
|
||||
<CollectionsTeamCollections
|
||||
v-else
|
||||
:collections-type="collectionsType"
|
||||
:team-collection-list="
|
||||
filterTexts.length > 0 ? teamsSearchResults : teamCollectionList
|
||||
"
|
||||
:team-loading-collections="
|
||||
filterTexts.length > 0
|
||||
? collectionsBeingLoadedFromSearch
|
||||
: teamLoadingCollections
|
||||
"
|
||||
:filter-text="filterTexts"
|
||||
:team-collection-list="teamCollectionList"
|
||||
:team-loading-collections="teamLoadingCollections"
|
||||
:export-loading="exportLoading"
|
||||
:duplicate-loading="duplicateLoading"
|
||||
:save-request="saveRequest"
|
||||
@@ -93,7 +87,6 @@
|
||||
@expand-team-collection="expandTeamCollection"
|
||||
@display-modal-add="displayModalAdd(true)"
|
||||
@display-modal-import-export="displayModalImportExport(true)"
|
||||
@collection-click="handleCollectionClick"
|
||||
/>
|
||||
<div
|
||||
class="py-15 hidden flex-1 flex-col items-center justify-center bg-primaryDark px-4 text-secondaryLight"
|
||||
@@ -161,10 +154,8 @@
|
||||
@hide-modal="displayTeamModalAdd(false)"
|
||||
/>
|
||||
<CollectionsProperties
|
||||
v-model="collectionPropertiesModalActiveTab"
|
||||
:show="showModalEditProperties"
|
||||
:editing-properties="editingProperties"
|
||||
source="REST"
|
||||
@hide-modal="displayModalEditProperties(false)"
|
||||
@set-collection-properties="setCollectionProperties"
|
||||
/>
|
||||
@@ -172,12 +163,13 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, nextTick, onMounted, PropType, ref, watch } from "vue"
|
||||
import { computed, nextTick, PropType, ref, watch } from "vue"
|
||||
import { useToast } from "@composables/toast"
|
||||
import { useI18n } from "@composables/i18n"
|
||||
import { Picked } from "~/helpers/types/HoppPicked"
|
||||
import { useReadonlyStream } from "~/composables/stream"
|
||||
import { useLocalState } from "~/newstore/localstate"
|
||||
import { GetMyTeamsQuery } from "~/helpers/backend/graphql"
|
||||
import { pipe } from "fp-ts/function"
|
||||
import * as TE from "fp-ts/TaskEither"
|
||||
import {
|
||||
@@ -207,7 +199,7 @@ import {
|
||||
HoppRESTRequest,
|
||||
makeCollection,
|
||||
} from "@hoppscotch/data"
|
||||
import { cloneDeep, debounce, isEqual } from "lodash-es"
|
||||
import { cloneDeep, isEqual } from "lodash-es"
|
||||
import { GQLError } from "~/helpers/backend/GQLClient"
|
||||
import {
|
||||
createNewRootCollection,
|
||||
@@ -244,15 +236,10 @@ import {
|
||||
} from "~/helpers/collection/collection"
|
||||
import { currentReorderingStatus$ } from "~/newstore/reordering"
|
||||
import { defineActionHandler, invokeAction } from "~/helpers/actions"
|
||||
import { TeamWorkspace, WorkspaceService } from "~/services/workspace.service"
|
||||
import { WorkspaceService } from "~/services/workspace.service"
|
||||
import { useService } from "dioc/vue"
|
||||
import { RESTTabService } from "~/services/tab/rest"
|
||||
import { HoppInheritedProperty } from "~/helpers/types/HoppInheritedProperties"
|
||||
import { TeamSearchService } from "~/helpers/teams/TeamsSearch.service"
|
||||
import { PersistenceService } from "~/services/persistence"
|
||||
import { PersistedOAuthConfig } from "~/services/oauth/oauth.service"
|
||||
import { RESTOptionTabs } from "../http/RequestOptions.vue"
|
||||
import { EditingProperties } from "./Properties.vue"
|
||||
|
||||
const t = useI18n()
|
||||
const toast = useToast()
|
||||
@@ -273,14 +260,16 @@ const props = defineProps({
|
||||
|
||||
const emit = defineEmits<{
|
||||
(event: "select", payload: Picked | null): void
|
||||
(event: "update-team", team: TeamWorkspace): void
|
||||
(event: "update-team", team: SelectedTeam): void
|
||||
(event: "update-collection-type", type: CollectionType["type"]): void
|
||||
}>()
|
||||
|
||||
type SelectedTeam = GetMyTeamsQuery["myTeams"][number] | undefined
|
||||
|
||||
type CollectionType =
|
||||
| {
|
||||
type: "team-collections"
|
||||
selectedTeam: TeamWorkspace
|
||||
selectedTeam: SelectedTeam
|
||||
}
|
||||
| { type: "my-collections"; selectedTeam: undefined }
|
||||
|
||||
@@ -302,7 +291,12 @@ const editingRequestName = ref("")
|
||||
const editingRequestIndex = ref<number | null>(null)
|
||||
const editingRequestID = ref<string | null>(null)
|
||||
|
||||
const editingProperties = ref<EditingProperties>({
|
||||
const editingProperties = ref<{
|
||||
collection: Partial<HoppCollection> | null
|
||||
isRootCollection: boolean
|
||||
path: string
|
||||
inheritedProperties?: HoppInheritedProperty
|
||||
}>({
|
||||
collection: null,
|
||||
isRootCollection: false,
|
||||
path: "",
|
||||
@@ -327,7 +321,9 @@ const requestMoveLoading = ref<string[]>([])
|
||||
// TeamList-Adapter
|
||||
const workspaceService = useService(WorkspaceService)
|
||||
const teamListAdapter = workspaceService.acquireTeamListAdapter(null)
|
||||
const myTeams = useReadonlyStream(teamListAdapter.teamList$, null)
|
||||
const REMEMBERED_TEAM_ID = useLocalState("REMEMBERED_TEAM_ID")
|
||||
const teamListFetched = ref(false)
|
||||
|
||||
// Team Collection Adapter
|
||||
const teamCollectionAdapter = new TeamCollectionAdapter(null)
|
||||
@@ -340,95 +336,27 @@ const teamLoadingCollections = useReadonlyStream(
|
||||
[]
|
||||
)
|
||||
|
||||
const {
|
||||
cascadeParentCollectionForHeaderAuthForSearchResults,
|
||||
searchTeams,
|
||||
teamsSearchResults,
|
||||
teamsSearchResultsLoading,
|
||||
expandCollection,
|
||||
expandingCollections,
|
||||
} = useService(TeamSearchService)
|
||||
|
||||
watch(teamsSearchResults, (newSearchResults) => {
|
||||
if (newSearchResults.length === 1 && filterTexts.value.length > 0) {
|
||||
expandCollection(newSearchResults[0].id)
|
||||
}
|
||||
})
|
||||
|
||||
const debouncedSearch = debounce(searchTeams, 400)
|
||||
|
||||
const collectionsBeingLoadedFromSearch = computed(() => {
|
||||
const collections = []
|
||||
|
||||
if (teamsSearchResultsLoading.value) {
|
||||
collections.push("root")
|
||||
}
|
||||
|
||||
collections.push(...expandingCollections.value)
|
||||
|
||||
return collections
|
||||
})
|
||||
|
||||
watch(
|
||||
filterTexts,
|
||||
(newFilterText) => {
|
||||
if (collectionsType.value.type === "team-collections") {
|
||||
const selectedTeamID = collectionsType.value.selectedTeam?.teamID
|
||||
|
||||
selectedTeamID &&
|
||||
debouncedSearch(newFilterText, selectedTeamID)?.catch(() => {})
|
||||
() => myTeams.value,
|
||||
(newTeams) => {
|
||||
if (newTeams && !teamListFetched.value) {
|
||||
teamListFetched.value = true
|
||||
if (REMEMBERED_TEAM_ID.value && currentUser.value) {
|
||||
const team = newTeams.find((t) => t.id === REMEMBERED_TEAM_ID.value)
|
||||
if (team) updateSelectedTeam(team)
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
immediate: true,
|
||||
}
|
||||
)
|
||||
const persistenceService = useService(PersistenceService)
|
||||
|
||||
const collectionPropertiesModalActiveTab = ref<RESTOptionTabs>("headers")
|
||||
|
||||
onMounted(() => {
|
||||
const localOAuthTempConfig =
|
||||
persistenceService.getLocalConfig("oauth_temp_config")
|
||||
|
||||
if (!localOAuthTempConfig) {
|
||||
return
|
||||
}
|
||||
|
||||
const { context, source, token }: PersistedOAuthConfig =
|
||||
JSON.parse(localOAuthTempConfig)
|
||||
|
||||
if (source === "GraphQL") {
|
||||
return
|
||||
}
|
||||
|
||||
if (context?.type === "collection-properties") {
|
||||
// load the unsaved editing properties
|
||||
const unsavedCollectionPropertiesString = persistenceService.getLocalConfig(
|
||||
"unsaved_collection_properties"
|
||||
)
|
||||
|
||||
if (unsavedCollectionPropertiesString) {
|
||||
const unsavedCollectionProperties: EditingProperties = JSON.parse(
|
||||
unsavedCollectionPropertiesString
|
||||
)
|
||||
|
||||
const auth = unsavedCollectionProperties.collection?.auth
|
||||
|
||||
if (auth?.authType === "oauth-2") {
|
||||
const grantTypeInfo = auth.grantTypeInfo
|
||||
|
||||
grantTypeInfo && (grantTypeInfo.token = token ?? "")
|
||||
}
|
||||
|
||||
editingProperties.value = unsavedCollectionProperties
|
||||
watch(
|
||||
() => collectionsType.value.selectedTeam,
|
||||
(newTeam) => {
|
||||
if (newTeam) {
|
||||
teamCollectionAdapter.changeTeamID(newTeam.id)
|
||||
}
|
||||
|
||||
persistenceService.removeLocalConfig("oauth_temp_config")
|
||||
collectionPropertiesModalActiveTab.value = "authorization"
|
||||
showModalEditProperties.value = true
|
||||
}
|
||||
})
|
||||
)
|
||||
|
||||
const switchToMyCollections = () => {
|
||||
collectionsType.value.type = "my-collections"
|
||||
@@ -436,37 +364,15 @@ const switchToMyCollections = () => {
|
||||
teamCollectionAdapter.changeTeamID(null)
|
||||
}
|
||||
|
||||
/**
|
||||
* right now, for search results, we rely on collection click + isOpen to expand the collection
|
||||
*/
|
||||
const handleCollectionClick = (payload: {
|
||||
collectionID: string
|
||||
isOpen: boolean
|
||||
}) => {
|
||||
if (
|
||||
filterTexts.value.length > 0 &&
|
||||
teamsSearchResults.value.length &&
|
||||
payload.isOpen
|
||||
) {
|
||||
expandCollection(payload.collectionID)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
const expandTeamCollection = (collectionID: string) => {
|
||||
if (filterTexts.value.length > 0 && teamsSearchResults.value) {
|
||||
return
|
||||
}
|
||||
|
||||
teamCollectionAdapter.expandCollection(collectionID)
|
||||
}
|
||||
|
||||
const updateSelectedTeam = (team: TeamWorkspace) => {
|
||||
const updateSelectedTeam = (team: SelectedTeam) => {
|
||||
if (team) {
|
||||
collectionsType.value.type = "team-collections"
|
||||
teamCollectionAdapter.changeTeamID(team.teamID)
|
||||
collectionsType.value.selectedTeam = team
|
||||
REMEMBERED_TEAM_ID.value = team.teamID
|
||||
REMEMBERED_TEAM_ID.value = team.id
|
||||
emit("update-team", team)
|
||||
emit("update-collection-type", "team-collections")
|
||||
}
|
||||
@@ -475,14 +381,23 @@ const updateSelectedTeam = (team: TeamWorkspace) => {
|
||||
const workspace = workspaceService.currentWorkspace
|
||||
|
||||
// Used to switch collection type and team when user switch workspace in the global workspace switcher
|
||||
// Check if there is a teamID in the workspace, if yes, switch to team collections and select the team
|
||||
// If there is no teamID, switch to my collections
|
||||
watch(
|
||||
workspace,
|
||||
(newWorkspace) => {
|
||||
if (newWorkspace.type === "personal") {
|
||||
switchToMyCollections()
|
||||
} else if (newWorkspace.type === "team") {
|
||||
updateSelectedTeam(newWorkspace)
|
||||
() => {
|
||||
const space = workspace.value
|
||||
return space.type === "personal" ? undefined : space.teamID
|
||||
},
|
||||
(teamID) => {
|
||||
if (teamID) {
|
||||
const team = myTeams.value?.find((t) => t.id === teamID)
|
||||
if (team) {
|
||||
updateSelectedTeam(team)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
return switchToMyCollections()
|
||||
},
|
||||
{
|
||||
immediate: true,
|
||||
@@ -510,7 +425,7 @@ const hasTeamWriteAccess = computed(() => {
|
||||
return false
|
||||
}
|
||||
|
||||
const role = collectionsType.value.selectedTeam?.role
|
||||
const role = collectionsType.value.selectedTeam?.myRole
|
||||
return role === "OWNER" || role === "EDITOR"
|
||||
})
|
||||
|
||||
@@ -725,7 +640,7 @@ const addNewRootCollection = (name: string) => {
|
||||
})
|
||||
|
||||
pipe(
|
||||
createNewRootCollection(name, collectionsType.value.selectedTeam.teamID),
|
||||
createNewRootCollection(name, collectionsType.value.selectedTeam.id),
|
||||
TE.match(
|
||||
(err: GQLError<string>) => {
|
||||
toast.error(`${getErrorMessage(err)}`)
|
||||
@@ -796,7 +711,7 @@ const onAddRequest = (requestName: string) => {
|
||||
|
||||
const data = {
|
||||
request: JSON.stringify(newRequest),
|
||||
teamID: collectionsType.value.selectedTeam.teamID,
|
||||
teamID: collectionsType.value.selectedTeam.id,
|
||||
title: requestName,
|
||||
}
|
||||
|
||||
@@ -1123,7 +1038,7 @@ const duplicateRequest = (payload: {
|
||||
|
||||
const data = {
|
||||
request: JSON.stringify(newRequest),
|
||||
teamID: collectionsType.value.selectedTeam.teamID,
|
||||
teamID: collectionsType.value.selectedTeam.id,
|
||||
title: `${request.name} - ${t("action.duplicate")}`,
|
||||
}
|
||||
|
||||
@@ -1415,25 +1330,13 @@ const selectRequest = (selectedRequest: {
|
||||
let possibleTab = null
|
||||
|
||||
if (collectionsType.value.type === "team-collections") {
|
||||
let inheritedProperties: HoppInheritedProperty | undefined = undefined
|
||||
const { auth, headers } =
|
||||
teamCollectionAdapter.cascadeParentCollectionForHeaderAuth(folderPath)
|
||||
|
||||
if (filterTexts.value.length > 0) {
|
||||
const collectionID = folderPath.split("/").at(-1)
|
||||
|
||||
if (!collectionID) return
|
||||
|
||||
inheritedProperties =
|
||||
cascadeParentCollectionForHeaderAuthForSearchResults(collectionID)
|
||||
} else {
|
||||
inheritedProperties =
|
||||
teamCollectionAdapter.cascadeParentCollectionForHeaderAuth(folderPath)
|
||||
}
|
||||
|
||||
const possibleTab = tabs.getTabRefWithSaveContext({
|
||||
possibleTab = tabs.getTabRefWithSaveContext({
|
||||
originLocation: "team-collection",
|
||||
requestID: requestIndex,
|
||||
})
|
||||
|
||||
if (possibleTab) {
|
||||
tabs.setActiveTab(possibleTab.value.id)
|
||||
} else {
|
||||
@@ -1445,7 +1348,10 @@ const selectRequest = (selectedRequest: {
|
||||
requestID: requestIndex,
|
||||
collectionID: folderPath,
|
||||
},
|
||||
inheritedProperties: inheritedProperties,
|
||||
inheritedProperties: {
|
||||
auth,
|
||||
headers,
|
||||
},
|
||||
})
|
||||
}
|
||||
} else {
|
||||
@@ -2316,7 +2222,4 @@ const getErrorMessage = (err: GQLError<string>) => {
|
||||
defineActionHandler("collection.new", () => {
|
||||
displayModalAdd(true)
|
||||
})
|
||||
defineActionHandler("modals.collection.import", () => {
|
||||
displayModalImportExport(true)
|
||||
})
|
||||
</script>
|
||||
|
||||
@@ -364,7 +364,6 @@ const switchToTeamWorkspace = (team: GetMyTeamsQuery["myTeams"][number]) => {
|
||||
teamID: team.id,
|
||||
teamName: team.name,
|
||||
type: "team",
|
||||
role: team.myRole,
|
||||
})
|
||||
}
|
||||
watch(
|
||||
|
||||
@@ -46,38 +46,41 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { useReadonlyStream, useStream } from "@composables/stream"
|
||||
import { Environment } from "@hoppscotch/data"
|
||||
import { useService } from "dioc/vue"
|
||||
import * as TE from "fp-ts/TaskEither"
|
||||
import { pipe } from "fp-ts/function"
|
||||
import { isEqual } from "lodash-es"
|
||||
import { computed, ref, watch } from "vue"
|
||||
import { isEqual } from "lodash-es"
|
||||
import { platform } from "~/platform"
|
||||
import { GetMyTeamsQuery } from "~/helpers/backend/graphql"
|
||||
import { useReadonlyStream, useStream } from "@composables/stream"
|
||||
import { useI18n } from "~/composables/i18n"
|
||||
import { useToast } from "~/composables/toast"
|
||||
import { defineActionHandler } from "~/helpers/actions"
|
||||
import { GQLError } from "~/helpers/backend/GQLClient"
|
||||
import { deleteTeamEnvironment } from "~/helpers/backend/mutations/TeamEnvironment"
|
||||
import TeamEnvironmentAdapter from "~/helpers/teams/TeamEnvironmentAdapter"
|
||||
import {
|
||||
deleteEnvironment,
|
||||
getSelectedEnvironmentIndex,
|
||||
globalEnv$,
|
||||
selectedEnvironmentIndex$,
|
||||
setSelectedEnvironmentIndex,
|
||||
} from "~/newstore/environments"
|
||||
import TeamEnvironmentAdapter from "~/helpers/teams/TeamEnvironmentAdapter"
|
||||
import { defineActionHandler } from "~/helpers/actions"
|
||||
import { useLocalState } from "~/newstore/localstate"
|
||||
import { platform } from "~/platform"
|
||||
import { TeamWorkspace, WorkspaceService } from "~/services/workspace.service"
|
||||
import { pipe } from "fp-ts/function"
|
||||
import * as TE from "fp-ts/TaskEither"
|
||||
import { GQLError } from "~/helpers/backend/GQLClient"
|
||||
import { deleteEnvironment } from "~/newstore/environments"
|
||||
import { deleteTeamEnvironment } from "~/helpers/backend/mutations/TeamEnvironment"
|
||||
import { useToast } from "~/composables/toast"
|
||||
import { WorkspaceService } from "~/services/workspace.service"
|
||||
import { useService } from "dioc/vue"
|
||||
import { Environment } from "@hoppscotch/data"
|
||||
|
||||
const t = useI18n()
|
||||
const toast = useToast()
|
||||
|
||||
type EnvironmentType = "my-environments" | "team-environments"
|
||||
|
||||
type SelectedTeam = GetMyTeamsQuery["myTeams"][number] | undefined
|
||||
|
||||
type EnvironmentsChooseType = {
|
||||
type: EnvironmentType
|
||||
selectedTeam: TeamWorkspace | undefined
|
||||
selectedTeam: SelectedTeam
|
||||
}
|
||||
|
||||
const environmentType = ref<EnvironmentsChooseType>({
|
||||
@@ -99,7 +102,11 @@ const currentUser = useReadonlyStream(
|
||||
platform.auth.getCurrentUser()
|
||||
)
|
||||
|
||||
// TeamList-Adapter
|
||||
const workspaceService = useService(WorkspaceService)
|
||||
const teamListAdapter = workspaceService.acquireTeamListAdapter(null)
|
||||
const myTeams = useReadonlyStream(teamListAdapter.teamList$, null)
|
||||
const teamListFetched = ref(false)
|
||||
const REMEMBERED_TEAM_ID = useLocalState("REMEMBERED_TEAM_ID")
|
||||
|
||||
const adapter = new TeamEnvironmentAdapter(undefined)
|
||||
@@ -111,17 +118,29 @@ const loading = computed(
|
||||
() => adapterLoading.value && teamEnvironmentList.value.length === 0
|
||||
)
|
||||
|
||||
watch(
|
||||
() => myTeams.value,
|
||||
(newTeams) => {
|
||||
if (newTeams && !teamListFetched.value) {
|
||||
teamListFetched.value = true
|
||||
if (REMEMBERED_TEAM_ID.value && currentUser.value) {
|
||||
const team = newTeams.find((t) => t.id === REMEMBERED_TEAM_ID.value)
|
||||
if (team) updateSelectedTeam(team)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
const switchToMyEnvironments = () => {
|
||||
environmentType.value.selectedTeam = undefined
|
||||
updateEnvironmentType("my-environments")
|
||||
adapter.changeTeamID(undefined)
|
||||
}
|
||||
|
||||
const updateSelectedTeam = (newSelectedTeam: TeamWorkspace | undefined) => {
|
||||
const updateSelectedTeam = (newSelectedTeam: SelectedTeam | undefined) => {
|
||||
if (newSelectedTeam) {
|
||||
adapter.changeTeamID(newSelectedTeam.teamID)
|
||||
environmentType.value.selectedTeam = newSelectedTeam
|
||||
REMEMBERED_TEAM_ID.value = newSelectedTeam.teamID
|
||||
REMEMBERED_TEAM_ID.value = newSelectedTeam.id
|
||||
updateEnvironmentType("team-environments")
|
||||
}
|
||||
}
|
||||
@@ -129,6 +148,15 @@ const updateEnvironmentType = (newEnvironmentType: EnvironmentType) => {
|
||||
environmentType.value.type = newEnvironmentType
|
||||
}
|
||||
|
||||
watch(
|
||||
() => environmentType.value.selectedTeam,
|
||||
(newTeam) => {
|
||||
if (newTeam) {
|
||||
adapter.changeTeamID(newTeam.id)
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
const workspace = workspaceService.currentWorkspace
|
||||
|
||||
// Switch to my environments if workspace is personal and to team environments if workspace is team
|
||||
@@ -142,7 +170,8 @@ watch(workspace, (newWorkspace) => {
|
||||
})
|
||||
}
|
||||
} else if (newWorkspace.type === "team") {
|
||||
updateSelectedTeam(newWorkspace)
|
||||
const team = myTeams.value?.find((t) => t.id === newWorkspace.teamID)
|
||||
updateSelectedTeam(team)
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -54,7 +54,9 @@
|
||||
:key="tab.id"
|
||||
:label="tab.label"
|
||||
>
|
||||
<div class="divide-y divide-dividerLight">
|
||||
<div
|
||||
class="divide-y divide-dividerLight rounded border border-divider"
|
||||
>
|
||||
<HoppSmartPlaceholder
|
||||
v-if="tab.variables.length === 0"
|
||||
:src="`/images/states/${colorMode.value}/blockchain.svg`"
|
||||
|
||||
@@ -56,7 +56,9 @@
|
||||
:key="tab.id"
|
||||
:label="tab.label"
|
||||
>
|
||||
<div class="divide-y divide-dividerLight">
|
||||
<div
|
||||
class="divide-y divide-dividerLight rounded border border-divider"
|
||||
>
|
||||
<HoppSmartPlaceholder
|
||||
v-if="tab.variables.length === 0"
|
||||
:src="`/images/states/${colorMode.value}/blockchain.svg`"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
class="sticky top-upperPrimaryStickyFold z-10 flex flex-1 flex-shrink-0 justify-between overflow-x-auto border-b border-dividerLight bg-primary"
|
||||
>
|
||||
<HoppButtonSecondary
|
||||
v-if="team === undefined || team.role === 'VIEWER'"
|
||||
v-if="team === undefined || team.myRole === 'VIEWER'"
|
||||
v-tippy="{ theme: 'tooltip' }"
|
||||
disabled
|
||||
class="!rounded-none"
|
||||
@@ -28,7 +28,7 @@
|
||||
:icon="IconHelpCircle"
|
||||
/>
|
||||
<HoppButtonSecondary
|
||||
v-if="team !== undefined && team.role === 'VIEWER'"
|
||||
v-if="team !== undefined && team.myRole === 'VIEWER'"
|
||||
v-tippy="{ theme: 'tooltip' }"
|
||||
disabled
|
||||
:icon="IconImport"
|
||||
@@ -84,7 +84,7 @@
|
||||
)"
|
||||
:key="`environment-${index}`"
|
||||
:environment="environment"
|
||||
:is-viewer="team?.role === 'VIEWER'"
|
||||
:is-viewer="team?.myRole === 'VIEWER'"
|
||||
@edit-environment="editEnvironment(environment)"
|
||||
/>
|
||||
</div>
|
||||
@@ -103,16 +103,16 @@
|
||||
:show="showModalDetails"
|
||||
:action="action"
|
||||
:editing-environment="editingEnvironment"
|
||||
:editing-team-id="team?.teamID"
|
||||
:editing-team-id="team?.id"
|
||||
:editing-variable-name="editingVariableName"
|
||||
:is-secret-option-selected="secretOptionSelected"
|
||||
:is-viewer="team?.role === 'VIEWER'"
|
||||
:is-viewer="team?.myRole === 'VIEWER'"
|
||||
@hide-modal="displayModalEdit(false)"
|
||||
/>
|
||||
<EnvironmentsImportExport
|
||||
v-if="showModalImportExport"
|
||||
:team-environments="teamEnvironments"
|
||||
:team-id="team?.teamID"
|
||||
:team-id="team?.id"
|
||||
environment-type="TEAM_ENV"
|
||||
@hide-modal="displayModalImportExport(false)"
|
||||
/>
|
||||
@@ -129,14 +129,16 @@ import IconPlus from "~icons/lucide/plus"
|
||||
import IconHelpCircle from "~icons/lucide/help-circle"
|
||||
import IconImport from "~icons/lucide/folder-down"
|
||||
import { defineActionHandler } from "~/helpers/actions"
|
||||
import { TeamWorkspace } from "~/services/workspace.service"
|
||||
import { GetMyTeamsQuery } from "~/helpers/backend/graphql"
|
||||
|
||||
const t = useI18n()
|
||||
|
||||
const colorMode = useColorMode()
|
||||
|
||||
type SelectedTeam = GetMyTeamsQuery["myTeams"][number] | undefined
|
||||
|
||||
const props = defineProps<{
|
||||
team: TeamWorkspace | undefined
|
||||
team: SelectedTeam
|
||||
teamEnvironments: TeamEnvironment[]
|
||||
adapterError: GQLError<string> | null
|
||||
loading: boolean
|
||||
@@ -149,7 +151,7 @@ const editingEnvironment = ref<TeamEnvironment | null>(null)
|
||||
const editingVariableName = ref("")
|
||||
const secretOptionSelected = ref(false)
|
||||
|
||||
const isTeamViewer = computed(() => props.team?.role === "VIEWER")
|
||||
const isTeamViewer = computed(() => props.team?.myRole === "VIEWER")
|
||||
|
||||
const displayModalAdd = (shouldDisplay: boolean) => {
|
||||
action.value = "new"
|
||||
|
||||
@@ -23,10 +23,10 @@
|
||||
@click="provider.action"
|
||||
/>
|
||||
|
||||
<hr v-if="additionalLoginItems.length > 0" />
|
||||
<hr v-if="additonalLoginItems.length > 0" />
|
||||
|
||||
<HoppSmartItem
|
||||
v-for="loginItem in additionalLoginItems"
|
||||
v-for="loginItem in additonalLoginItems"
|
||||
:key="loginItem.id"
|
||||
:icon="loginItem.icon"
|
||||
:label="loginItem.text(t)"
|
||||
@@ -170,7 +170,7 @@ type AuthProviderItem = {
|
||||
}
|
||||
|
||||
let allowedAuthProviders: AuthProviderItem[] = []
|
||||
const additionalLoginItems: LoginItemDef[] = []
|
||||
let additonalLoginItems: LoginItemDef[] = []
|
||||
|
||||
const doAdditionalLoginItemClickAction = async (item: LoginItemDef) => {
|
||||
await item.onClick()
|
||||
@@ -199,33 +199,10 @@ onMounted(async () => {
|
||||
allowedAuthProviders = enabledAuthProviders
|
||||
|
||||
// setup the additional login items
|
||||
platform.auth.additionalLoginItems?.forEach((item) => {
|
||||
if (res.right.includes(item.id)) {
|
||||
additionalLoginItems.push(item)
|
||||
}
|
||||
|
||||
// since the BE send the OIDC auth providers as OIDC:providerName,
|
||||
// we need to split the string and use the providerName as the text
|
||||
if (item.id === "OIDC") {
|
||||
res.right
|
||||
.filter((provider) => provider.startsWith("OIDC"))
|
||||
.forEach((provider) => {
|
||||
const OIDCName = provider.split(":")[1]
|
||||
const loginItemText = OIDCName
|
||||
? () =>
|
||||
t("auth.continue_with_auth_provider", {
|
||||
provider: OIDCName,
|
||||
})
|
||||
: item.text
|
||||
|
||||
const OIDCLoginItem = {
|
||||
...item,
|
||||
text: loginItemText,
|
||||
}
|
||||
additionalLoginItems.push(OIDCLoginItem)
|
||||
})
|
||||
}
|
||||
})
|
||||
additonalLoginItems =
|
||||
platform.auth.additionalLoginItems?.filter((item) =>
|
||||
res.right.includes(item.id)
|
||||
) ?? []
|
||||
|
||||
isLoadingAllowedAuthProviders.value = false
|
||||
})
|
||||
@@ -334,14 +311,6 @@ const authProvidersAvailable: AuthProviderItem[] = [
|
||||
action: signInWithGithub,
|
||||
isLoading: signingInWithGitHub,
|
||||
},
|
||||
// the authprovider either send github or github:enterprise and both are handled by the same route
|
||||
{
|
||||
id: "GITHUB:ENTERPRISE",
|
||||
icon: IconGithub,
|
||||
label: t("auth.continue_with_github_enterprise"),
|
||||
action: signInWithGithub,
|
||||
isLoading: signingInWithGitHub,
|
||||
},
|
||||
{
|
||||
id: "GOOGLE",
|
||||
icon: IconGoogle,
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
:active="authName === 'OAuth 2.0'"
|
||||
@click="
|
||||
() => {
|
||||
selectOAuth2AuthType()
|
||||
auth.authType = 'oauth-2'
|
||||
hide()
|
||||
}
|
||||
"
|
||||
@@ -189,12 +189,12 @@
|
||||
<div v-if="auth.authType === 'oauth-2'">
|
||||
<div class="flex flex-1 border-b border-dividerLight">
|
||||
<SmartEnvInput
|
||||
v-model="auth.grantTypeInfo.token"
|
||||
v-model="auth.token"
|
||||
:environment-highlights="false"
|
||||
placeholder="Token"
|
||||
/>
|
||||
</div>
|
||||
<HttpOAuth2Authorization v-model="auth" source="GraphQL" />
|
||||
<HttpOAuth2Authorization v-model="auth" />
|
||||
</div>
|
||||
<div v-if="auth.authType === 'api-key'">
|
||||
<HttpAuthorizationApiKey v-model="auth" />
|
||||
@@ -220,22 +220,19 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { useI18n } from "@composables/i18n"
|
||||
import { pluckRef } from "@composables/ref"
|
||||
import { useColorMode } from "@composables/theming"
|
||||
import { HoppGQLAuth, HoppGQLAuthOAuth2 } from "@hoppscotch/data"
|
||||
import { useVModel } from "@vueuse/core"
|
||||
import { computed, onMounted, ref } from "vue"
|
||||
|
||||
import { HoppInheritedProperty } from "~/helpers/types/HoppInheritedProperties"
|
||||
|
||||
import IconCircle from "~icons/lucide/circle"
|
||||
import IconCircleDot from "~icons/lucide/circle-dot"
|
||||
import IconExternalLink from "~icons/lucide/external-link"
|
||||
import IconHelpCircle from "~icons/lucide/help-circle"
|
||||
import IconTrash2 from "~icons/lucide/trash-2"
|
||||
|
||||
import { getDefaultAuthCodeOauthFlowParams } from "~/services/oauth/flows/authCode"
|
||||
import IconExternalLink from "~icons/lucide/external-link"
|
||||
import IconCircleDot from "~icons/lucide/circle-dot"
|
||||
import IconCircle from "~icons/lucide/circle"
|
||||
import { computed, ref } from "vue"
|
||||
import { HoppGQLAuth } from "@hoppscotch/data"
|
||||
import { pluckRef } from "@composables/ref"
|
||||
import { useI18n } from "@composables/i18n"
|
||||
import { useColorMode } from "@composables/theming"
|
||||
import { useVModel } from "@vueuse/core"
|
||||
import { HoppInheritedProperty } from "~/helpers/types/HoppInheritedProperties"
|
||||
import { onMounted } from "vue"
|
||||
|
||||
const t = useI18n()
|
||||
|
||||
@@ -283,30 +280,6 @@ const getAuthName = (type: HoppGQLAuth["authType"] | undefined) => {
|
||||
return AUTH_KEY_NAME[type] ? AUTH_KEY_NAME[type] : "None"
|
||||
}
|
||||
|
||||
const selectOAuth2AuthType = () => {
|
||||
const defaultGrantTypeInfo: HoppGQLAuthOAuth2["grantTypeInfo"] = {
|
||||
...getDefaultAuthCodeOauthFlowParams(),
|
||||
grantType: "AUTHORIZATION_CODE",
|
||||
token: "",
|
||||
}
|
||||
|
||||
// @ts-expect-error - the existing grantTypeInfo might be in the auth object, typescript doesnt know that
|
||||
const existingGrantTypeInfo = auth.value.grantTypeInfo as
|
||||
| HoppGQLAuthOAuth2["grantTypeInfo"]
|
||||
| undefined
|
||||
|
||||
const grantTypeInfo = existingGrantTypeInfo
|
||||
? existingGrantTypeInfo
|
||||
: defaultGrantTypeInfo
|
||||
|
||||
auth.value = {
|
||||
...auth.value,
|
||||
authType: "oauth-2",
|
||||
addTo: "HEADERS",
|
||||
grantTypeInfo: grantTypeInfo,
|
||||
}
|
||||
}
|
||||
|
||||
const authActive = pluckRef(auth, "authActive")
|
||||
|
||||
const clearContent = () => {
|
||||
|
||||
@@ -579,23 +579,17 @@ const getComputedAuthHeaders = (
|
||||
})
|
||||
} else if (
|
||||
request.auth.authType === "bearer" ||
|
||||
(request.auth.authType === "oauth-2" && request.auth.addTo === "HEADERS")
|
||||
request.auth.authType === "oauth-2"
|
||||
) {
|
||||
const requestAuth = request.auth
|
||||
|
||||
const isOAuth2 = requestAuth.authType === "oauth-2"
|
||||
|
||||
const token = isOAuth2 ? requestAuth.grantTypeInfo.token : requestAuth.token
|
||||
|
||||
headers.push({
|
||||
active: true,
|
||||
key: "Authorization",
|
||||
value: `Bearer ${token}`,
|
||||
value: `Bearer ${request.auth.token}`,
|
||||
})
|
||||
} else if (request.auth.authType === "api-key") {
|
||||
const { key, addTo } = request.auth
|
||||
|
||||
if (addTo === "HEADERS" && key) {
|
||||
if (addTo === "Headers" && key) {
|
||||
headers.push({
|
||||
active: true,
|
||||
key,
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
autocomplete="off"
|
||||
spellcheck="false"
|
||||
class="w-full rounded border border-divider bg-primaryLight px-4 py-2 text-secondaryDark"
|
||||
:placeholder="`${t('graphql.url_placeholder')}`"
|
||||
:placeholder="`${t('request.url')}`"
|
||||
:disabled="connected"
|
||||
@keyup.enter="onConnectClick"
|
||||
/>
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
:active="authName === 'OAuth 2.0'"
|
||||
@click="
|
||||
() => {
|
||||
selectOAuth2AuthType()
|
||||
auth.authType = 'oauth-2'
|
||||
hide()
|
||||
}
|
||||
"
|
||||
@@ -177,24 +177,15 @@
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="auth.authType === 'oauth-2'" class="w-full">
|
||||
<div v-if="auth.authType === 'oauth-2'">
|
||||
<div class="flex flex-1 border-b border-dividerLight">
|
||||
<!-- Ensure a new object is assigned here to avoid reactivity issues -->
|
||||
<SmartEnvInput
|
||||
:model-value="auth.grantTypeInfo.token"
|
||||
v-model="auth.token"
|
||||
placeholder="Token"
|
||||
:envs="envs"
|
||||
@update:model-value="
|
||||
auth.grantTypeInfo = { ...auth.grantTypeInfo, token: $event }
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
<HttpOAuth2Authorization
|
||||
v-model="auth"
|
||||
:is-collection-property="isCollectionProperty"
|
||||
:envs="envs"
|
||||
:source="source"
|
||||
/>
|
||||
<HttpOAuth2Authorization v-model="auth" :envs="envs" />
|
||||
</div>
|
||||
<div v-if="auth.authType === 'api-key'">
|
||||
<HttpAuthorizationApiKey v-model="auth" :envs="envs" />
|
||||
@@ -226,7 +217,7 @@ import IconExternalLink from "~icons/lucide/external-link"
|
||||
import IconCircleDot from "~icons/lucide/circle-dot"
|
||||
import IconCircle from "~icons/lucide/circle"
|
||||
import { computed, ref } from "vue"
|
||||
import { HoppRESTAuth, HoppRESTAuthOAuth2 } from "@hoppscotch/data"
|
||||
import { HoppRESTAuth } from "@hoppscotch/data"
|
||||
import { pluckRef } from "@composables/ref"
|
||||
import { useI18n } from "@composables/i18n"
|
||||
import { useColorMode } from "@composables/theming"
|
||||
@@ -235,27 +226,17 @@ import { onMounted } from "vue"
|
||||
import { HoppInheritedProperty } from "~/helpers/types/HoppInheritedProperties"
|
||||
import { AggregateEnvironment } from "~/newstore/environments"
|
||||
|
||||
import { getDefaultAuthCodeOauthFlowParams } from "~/services/oauth/flows/authCode"
|
||||
|
||||
const t = useI18n()
|
||||
|
||||
const colorMode = useColorMode()
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
modelValue: HoppRESTAuth
|
||||
isCollectionProperty?: boolean
|
||||
isRootCollection?: boolean
|
||||
inheritedProperties?: HoppInheritedProperty
|
||||
envs?: AggregateEnvironment[]
|
||||
source?: "REST" | "GraphQL"
|
||||
}>(),
|
||||
{
|
||||
source: "REST",
|
||||
envs: undefined,
|
||||
inheritedProperties: undefined,
|
||||
}
|
||||
)
|
||||
const props = defineProps<{
|
||||
modelValue: HoppRESTAuth
|
||||
isCollectionProperty?: boolean
|
||||
isRootCollection?: boolean
|
||||
inheritedProperties?: HoppInheritedProperty
|
||||
envs?: AggregateEnvironment[]
|
||||
}>()
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: "update:modelValue", value: HoppRESTAuth): void
|
||||
@@ -291,30 +272,6 @@ const getAuthName = (type: HoppRESTAuth["authType"] | undefined) => {
|
||||
return AUTH_KEY_NAME[type] ? AUTH_KEY_NAME[type] : "None"
|
||||
}
|
||||
|
||||
const selectOAuth2AuthType = () => {
|
||||
const defaultGrantTypeInfo: HoppRESTAuthOAuth2["grantTypeInfo"] = {
|
||||
...getDefaultAuthCodeOauthFlowParams(),
|
||||
grantType: "AUTHORIZATION_CODE",
|
||||
token: "",
|
||||
}
|
||||
|
||||
// @ts-expect-error - the existing grantTypeInfo might be in the auth object, typescript doesnt know that
|
||||
const existingGrantTypeInfo = auth.value.grantTypeInfo as
|
||||
| HoppRESTAuthOAuth2["grantTypeInfo"]
|
||||
| undefined
|
||||
|
||||
const grantTypeInfo = existingGrantTypeInfo
|
||||
? existingGrantTypeInfo
|
||||
: defaultGrantTypeInfo
|
||||
|
||||
auth.value = {
|
||||
...auth.value,
|
||||
authType: "oauth-2",
|
||||
addTo: "HEADERS",
|
||||
grantTypeInfo: grantTypeInfo,
|
||||
}
|
||||
}
|
||||
|
||||
const authActive = pluckRef(auth, "authActive")
|
||||
|
||||
const clearContent = () => {
|
||||
|
||||
@@ -98,7 +98,6 @@ import { RESTTabService } from "~/services/tab/rest"
|
||||
import { useService } from "dioc/vue"
|
||||
import { useNestedSetting } from "~/composables/settings"
|
||||
import { toggleNestedSetting } from "~/newstore/settings"
|
||||
import { EditorView } from "@codemirror/view"
|
||||
|
||||
const t = useI18n()
|
||||
|
||||
@@ -125,7 +124,6 @@ useCodemirror(
|
||||
linter: null,
|
||||
completer: null,
|
||||
environmentHighlights: false,
|
||||
onInit: (view: EditorView) => view.focus(),
|
||||
})
|
||||
)
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -89,7 +89,6 @@ import { readFileAsText } from "~/helpers/functional/files"
|
||||
import xmlFormat from "xml-formatter"
|
||||
import { useNestedSetting } from "~/composables/settings"
|
||||
import { toggleNestedSetting } from "~/newstore/settings"
|
||||
import * as LJSON from "lossless-json"
|
||||
|
||||
type PossibleContentTypes = Exclude<
|
||||
ValidContentTypes,
|
||||
@@ -188,8 +187,8 @@ const prettifyRequestBody = () => {
|
||||
let prettifyBody = ""
|
||||
try {
|
||||
if (body.value.contentType.endsWith("json")) {
|
||||
const jsonObj = LJSON.parse(rawParamsBody.value as string)
|
||||
prettifyBody = LJSON.stringify(jsonObj, undefined, 2) as string
|
||||
const jsonObj = JSON.parse(rawParamsBody.value as string)
|
||||
prettifyBody = JSON.stringify(jsonObj, null, 2)
|
||||
} else if (body.value.contentType === "application/xml") {
|
||||
prettifyBody = prettifyXML(rawParamsBody.value as string)
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
>
|
||||
<SmartEnvInput
|
||||
v-model="tab.document.request.endpoint"
|
||||
:placeholder="`${t('request.url_placeholder')}`"
|
||||
:placeholder="`${t('request.url')}`"
|
||||
:auto-complete-source="userHistories"
|
||||
:auto-complete-env="true"
|
||||
:inspection-results="tabResults"
|
||||
|
||||
@@ -28,13 +28,7 @@
|
||||
>
|
||||
<HoppSmartSelectWrapper>
|
||||
<HoppButtonSecondary
|
||||
:label="
|
||||
auth.addTo
|
||||
? auth.addTo === 'HEADERS'
|
||||
? t('authorization.pass_by_headers_label')
|
||||
: t('authorization.pass_by_query_params_label')
|
||||
: t('state.none')
|
||||
"
|
||||
:label="auth.addTo || t('state.none')"
|
||||
class="ml-2 rounded-none pr-8"
|
||||
/>
|
||||
</HoppSmartSelectWrapper>
|
||||
@@ -46,23 +40,23 @@
|
||||
@keyup.escape="hide()"
|
||||
>
|
||||
<HoppSmartItem
|
||||
:icon="auth.addTo === 'HEADERS' ? IconCircleDot : IconCircle"
|
||||
:active="auth.addTo === 'HEADERS'"
|
||||
:label="t('authorization.pass_by_headers_label')"
|
||||
:icon="auth.addTo === 'Headers' ? IconCircleDot : IconCircle"
|
||||
:active="auth.addTo === 'Headers'"
|
||||
:label="'Headers'"
|
||||
@click="
|
||||
() => {
|
||||
auth.addTo = 'HEADERS'
|
||||
auth.addTo = 'Headers'
|
||||
hide()
|
||||
}
|
||||
"
|
||||
/>
|
||||
<HoppSmartItem
|
||||
:icon="auth.addTo === 'QUERY_PARAMS' ? IconCircleDot : IconCircle"
|
||||
:active="auth.addTo === 'QUERY_PARAMS'"
|
||||
:label="t('authorization.pass_by_query_params_label')"
|
||||
:icon="auth.addTo === 'Query params' ? IconCircleDot : IconCircle"
|
||||
:active="auth.addTo === 'Query params'"
|
||||
:label="'Query params'"
|
||||
@click="
|
||||
() => {
|
||||
auth.addTo = 'QUERY_PARAMS'
|
||||
auth.addTo = 'Query params'
|
||||
hide()
|
||||
}
|
||||
"
|
||||
|
||||
@@ -273,10 +273,6 @@ const loading = computed(
|
||||
)
|
||||
|
||||
onLoggedIn(() => {
|
||||
if (adapter.isInitialized()) {
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
// wait for a bit to let the auth token to be set
|
||||
// because in some race conditions, the token is not set this fixes that
|
||||
|
||||
@@ -37,17 +37,13 @@ import { TeamNameCodec } from "~/helpers/backend/types/TeamName"
|
||||
import { useI18n } from "@composables/i18n"
|
||||
import { useToast } from "@composables/toast"
|
||||
import { platform } from "~/platform"
|
||||
import { useService } from "dioc/vue"
|
||||
import { WorkspaceService } from "~/services/workspace.service"
|
||||
import { useLocalState } from "~/newstore/localstate"
|
||||
|
||||
const t = useI18n()
|
||||
|
||||
const toast = useToast()
|
||||
|
||||
const props = defineProps<{
|
||||
defineProps<{
|
||||
show: boolean
|
||||
switchWorkspaceAfterCreation?: boolean
|
||||
}>()
|
||||
|
||||
const emit = defineEmits<{
|
||||
@@ -56,12 +52,8 @@ const emit = defineEmits<{
|
||||
|
||||
const editingName = ref<string | null>(null)
|
||||
|
||||
const REMEMBERED_TEAM_ID = useLocalState("REMEMBERED_TEAM_ID")
|
||||
|
||||
const isLoading = ref(false)
|
||||
|
||||
const workspaceService = useService(WorkspaceService)
|
||||
|
||||
const addNewTeam = async () => {
|
||||
isLoading.value = true
|
||||
await pipe(
|
||||
@@ -84,19 +76,8 @@ const addNewTeam = async () => {
|
||||
// Handle GQL errors (use err obj)
|
||||
}
|
||||
},
|
||||
(team) => {
|
||||
() => {
|
||||
toast.success(`${t("team.new_created")}`)
|
||||
|
||||
if (props.switchWorkspaceAfterCreation) {
|
||||
REMEMBERED_TEAM_ID.value = team.id
|
||||
workspaceService.changeWorkspace({
|
||||
teamID: team.id,
|
||||
teamName: team.name,
|
||||
type: "team",
|
||||
role: team.myRole,
|
||||
})
|
||||
}
|
||||
|
||||
hideModal()
|
||||
}
|
||||
)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
: ''
|
||||
"
|
||||
>
|
||||
<div class="p-4 truncate">
|
||||
<div class="p-4">
|
||||
<label
|
||||
class="font-semibold text-secondaryDark"
|
||||
:class="{ 'cursor-pointer': compact && team.myRole === 'OWNER' }"
|
||||
@@ -131,7 +131,6 @@
|
||||
<HoppSmartConfirmModal
|
||||
:show="confirmRemove"
|
||||
:title="t('confirm.remove_team')"
|
||||
:loading-state="loading"
|
||||
@hide-modal="confirmRemove = false"
|
||||
@resolve="deleteTeam()"
|
||||
/>
|
||||
@@ -162,8 +161,6 @@ import IconMoreVertical from "~icons/lucide/more-vertical"
|
||||
import IconUserX from "~icons/lucide/user-x"
|
||||
import IconUserPlus from "~icons/lucide/user-plus"
|
||||
import IconTrash2 from "~icons/lucide/trash-2"
|
||||
import { useService } from "dioc/vue"
|
||||
import { WorkspaceService } from "~/services/workspace.service"
|
||||
|
||||
const t = useI18n()
|
||||
|
||||
@@ -176,7 +173,6 @@ const props = defineProps<{
|
||||
const emit = defineEmits<{
|
||||
(e: "edit-team"): void
|
||||
(e: "invite-team"): void
|
||||
(e: "refetch-teams"): void
|
||||
}>()
|
||||
|
||||
const toast = useToast()
|
||||
@@ -184,12 +180,7 @@ const toast = useToast()
|
||||
const confirmRemove = ref(false)
|
||||
const confirmExit = ref(false)
|
||||
|
||||
const loading = ref(false)
|
||||
|
||||
const workspaceService = useService(WorkspaceService)
|
||||
|
||||
const deleteTeam = () => {
|
||||
loading.value = true
|
||||
pipe(
|
||||
backendDeleteTeam(props.teamID),
|
||||
TE.match(
|
||||
@@ -197,25 +188,9 @@ const deleteTeam = () => {
|
||||
// TODO: Better errors ? We know the possible errors now
|
||||
toast.error(`${t("error.something_went_wrong")}`)
|
||||
console.error(err)
|
||||
loading.value = false
|
||||
confirmRemove.value = false
|
||||
},
|
||||
() => {
|
||||
toast.success(`${t("team.deleted")}`)
|
||||
loading.value = false
|
||||
emit("refetch-teams")
|
||||
|
||||
const currentWorkspace = workspaceService.currentWorkspace.value
|
||||
|
||||
// If the current workspace is the deleted workspace, change the workspace to personal
|
||||
if (
|
||||
currentWorkspace.type === "team" &&
|
||||
currentWorkspace.teamID === props.teamID
|
||||
) {
|
||||
workspaceService.changeWorkspace({ type: "personal" })
|
||||
}
|
||||
|
||||
confirmRemove.value = false
|
||||
}
|
||||
)
|
||||
)() // Tasks (and TEs) are lazy, so call the function returned
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
<HoppButtonSecondary
|
||||
:label="`${t('team.create_new')}`"
|
||||
outline
|
||||
:icon="IconPlus"
|
||||
@click="displayModalAdd(true)"
|
||||
/>
|
||||
<div v-if="loading" class="flex flex-col items-center justify-center">
|
||||
@@ -17,6 +16,13 @@
|
||||
:alt="`${t('empty.teams')}`"
|
||||
:text="`${t('empty.teams')}`"
|
||||
>
|
||||
<template #body>
|
||||
<HoppButtonSecondary
|
||||
:label="`${t('team.create_new')}`"
|
||||
filled
|
||||
@click="displayModalAdd(true)"
|
||||
/>
|
||||
</template>
|
||||
</HoppSmartPlaceholder>
|
||||
<div
|
||||
v-else-if="!loading"
|
||||
@@ -33,7 +39,6 @@
|
||||
:compact="modal"
|
||||
@edit-team="editTeam(team, team.id)"
|
||||
@invite-team="inviteTeam(team, team.id)"
|
||||
@refetch-teams="refetchTeams"
|
||||
/>
|
||||
</div>
|
||||
<div v-if="!loading && adapterError" class="flex flex-col items-center">
|
||||
@@ -71,7 +76,6 @@ import { useReadonlyStream } from "@composables/stream"
|
||||
import { useColorMode } from "@composables/theming"
|
||||
import { WorkspaceService } from "~/services/workspace.service"
|
||||
import { useService } from "dioc/vue"
|
||||
import IconPlus from "~icons/lucide/plus"
|
||||
|
||||
const t = useI18n()
|
||||
|
||||
|
||||
@@ -59,18 +59,14 @@
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
v-else-if="teamListAdapterError"
|
||||
v-if="!loading && teamListAdapterError"
|
||||
class="flex flex-col items-center py-4"
|
||||
>
|
||||
<icon-lucide-help-circle class="svg-icons mb-4" />
|
||||
{{ t("error.something_went_wrong") }}
|
||||
</div>
|
||||
</div>
|
||||
<TeamsAdd
|
||||
:show="showModalAdd"
|
||||
:switch-workspace-after-creation="true"
|
||||
@hide-modal="displayModalAdd(false)"
|
||||
/>
|
||||
<TeamsAdd :show="showModalAdd" @hide-modal="displayModalAdd(false)" />
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
@@ -85,7 +81,7 @@ import { useColorMode } from "@composables/theming"
|
||||
import { GetMyTeamsQuery } from "~/helpers/backend/graphql"
|
||||
import IconDone from "~icons/lucide/check"
|
||||
import { useLocalState } from "~/newstore/localstate"
|
||||
import { defineActionHandler, invokeAction } from "~/helpers/actions"
|
||||
import { defineActionHandler } from "~/helpers/actions"
|
||||
import { WorkspaceService } from "~/services/workspace.service"
|
||||
import { useService } from "dioc/vue"
|
||||
import { useElementVisibility, useIntervalFn } from "@vueuse/core"
|
||||
@@ -158,7 +154,6 @@ const switchToTeamWorkspace = (team: GetMyTeamsQuery["myTeams"][number]) => {
|
||||
teamID: team.id,
|
||||
teamName: team.name,
|
||||
type: "team",
|
||||
role: team.myRole,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -174,14 +169,11 @@ watch(
|
||||
(user) => {
|
||||
if (!user) {
|
||||
switchToPersonalWorkspace()
|
||||
teamListadapter.dispose()
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
const displayModalAdd = (shouldDisplay: boolean) => {
|
||||
if (!currentUser.value) return invokeAction("modals.login.toggle")
|
||||
|
||||
showModalAdd.value = shouldDisplay
|
||||
teamListadapter.fetchList()
|
||||
}
|
||||
|
||||
@@ -68,9 +68,6 @@ type CodeMirrorOptions = {
|
||||
|
||||
// callback on editor update
|
||||
onUpdate?: (view: ViewUpdate) => void
|
||||
|
||||
// callback on view initialization
|
||||
onInit?: (view: EditorView) => void
|
||||
}
|
||||
|
||||
const hoppCompleterExt = (completer: Completer): Extension => {
|
||||
@@ -211,9 +208,7 @@ export function useCodemirror(
|
||||
el: Ref<any | null>,
|
||||
value: Ref<string | undefined>,
|
||||
options: CodeMirrorOptions
|
||||
): {
|
||||
cursor: Ref<{ line: number; ch: number }>
|
||||
} {
|
||||
): { cursor: Ref<{ line: number; ch: number }> } {
|
||||
const { subscribeToStream } = useStreamSubscriber()
|
||||
|
||||
// Set default value for contextMenuEnabled if not provided
|
||||
@@ -388,8 +383,6 @@ export function useCodemirror(
|
||||
extensions,
|
||||
}),
|
||||
})
|
||||
|
||||
options.onInit?.(view.value)
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { customRef, onBeforeUnmount, ref, Ref, UnwrapRef, watch } from "vue"
|
||||
import { customRef, onBeforeUnmount, Ref, watch } from "vue"
|
||||
|
||||
export function pluckRef<T, K extends keyof T>(ref: Ref<T>, key: K): Ref<T[K]> {
|
||||
return customRef((track, trigger) => {
|
||||
@@ -31,16 +31,3 @@ export function pluckMultipleFromRef<T, K extends Array<keyof T>>(
|
||||
): { [key in K[number]]: Ref<T[key]> } {
|
||||
return Object.fromEntries(keys.map((x) => [x, pluckRef(sourceRef, x)])) as any
|
||||
}
|
||||
|
||||
export const refWithCallbackOnChange = <T>(
|
||||
initialValue: T,
|
||||
callback: (value: UnwrapRef<T>) => void
|
||||
) => {
|
||||
const targetRef = ref(initialValue)
|
||||
|
||||
watch(targetRef, (value) => {
|
||||
callback(value)
|
||||
})
|
||||
|
||||
return targetRef
|
||||
}
|
||||
|
||||
@@ -36,7 +36,6 @@ export type HoppAction =
|
||||
| "collection.new" // Create root collection
|
||||
| "flyouts.chat.open" // Shows the keybinds flyout
|
||||
| "flyouts.keybinds.toggle" // Shows the keybinds flyout
|
||||
| "modals.collection.import" // Shows the collection import modal
|
||||
| "modals.search.toggle" // Shows the search modal
|
||||
| "modals.support.toggle" // Shows the support modal
|
||||
| "modals.share.toggle" // Shows the share modal
|
||||
|
||||
@@ -66,20 +66,12 @@ export function getRequestsByPath(
|
||||
let currentCollection = collections[pathArray[0]]
|
||||
|
||||
if (pathArray.length === 1) {
|
||||
const latestVersionedRequests = currentCollection.requests.filter(
|
||||
(req): req is HoppRESTRequest => req.v === "3"
|
||||
)
|
||||
|
||||
return latestVersionedRequests
|
||||
return currentCollection.requests
|
||||
}
|
||||
for (let i = 1; i < pathArray.length; i++) {
|
||||
const folder = currentCollection.folders[pathArray[i]]
|
||||
if (folder) currentCollection = folder
|
||||
}
|
||||
|
||||
const latestVersionedRequests = currentCollection.requests.filter(
|
||||
(req): req is HoppRESTRequest => req.v === "3"
|
||||
)
|
||||
|
||||
return latestVersionedRequests
|
||||
return currentCollection.requests
|
||||
}
|
||||
|
||||
@@ -868,38 +868,6 @@ const samples = [
|
||||
requestVariables: [],
|
||||
}),
|
||||
},
|
||||
{
|
||||
command: `curl --location 'https://api.example.net/id/1164/requests' \
|
||||
--header 'Accept: application/vnd.test-data.v2.1+json' \
|
||||
--header 'Content-Type: application/x-www-form-urlencoded' \
|
||||
--data-urlencode 'data={"type":"test","typeId":"101"}' \
|
||||
--data-urlencode 'data2={"type":"test2","typeId":"123"}'`,
|
||||
response: makeRESTRequest({
|
||||
method: "POST",
|
||||
name: "Untitled",
|
||||
endpoint: "https://api.example.net/id/1164/requests",
|
||||
auth: {
|
||||
authType: "inherit",
|
||||
authActive: true,
|
||||
},
|
||||
body: {
|
||||
contentType: "application/x-www-form-urlencoded",
|
||||
body: `data: {"type":"test","typeId":"101"}
|
||||
data2: {"type":"test2","typeId":"123"}`,
|
||||
},
|
||||
params: [],
|
||||
headers: [
|
||||
{
|
||||
active: true,
|
||||
key: "Accept",
|
||||
value: "application/vnd.test-data.v2.1+json",
|
||||
},
|
||||
],
|
||||
preRequestScript: "",
|
||||
testScript: "",
|
||||
requestVariables: [],
|
||||
}),
|
||||
},
|
||||
]
|
||||
|
||||
describe("Parse curl command to Hopp REST Request", () => {
|
||||
|
||||
@@ -33,27 +33,7 @@ export const parseCurlCommand = (curlCommand: string) => {
|
||||
// const compressed = !!parsedArguments.compressed
|
||||
|
||||
curlCommand = preProcessCurlCommand(curlCommand)
|
||||
|
||||
const args: parser.Arguments = parser(curlCommand)
|
||||
|
||||
const parsedArguments = pipe(
|
||||
args,
|
||||
O.fromPredicate(
|
||||
(args) =>
|
||||
objHasProperty("dataUrlencode", "string")(args) ||
|
||||
objHasProperty("dataUrlencode", "object")(args)
|
||||
),
|
||||
O.map((args) => {
|
||||
const urlEncodedData: string[] = Array.isArray(args.dataUrlencode)
|
||||
? args.dataUrlencode
|
||||
: [args.dataUrlencode]
|
||||
|
||||
const data = A.map(decodeURIComponent)(urlEncodedData)
|
||||
|
||||
return { ...args, d: data }
|
||||
}),
|
||||
O.getOrElse(() => args)
|
||||
)
|
||||
const parsedArguments = parser(curlCommand)
|
||||
|
||||
const headerObject = getHeaders(parsedArguments)
|
||||
const { headers } = headerObject
|
||||
|
||||
@@ -269,21 +269,13 @@ export const runGQLOperation = async (options: RunQueryOptions) => {
|
||||
const username = auth.username
|
||||
const password = auth.password
|
||||
finalHeaders.Authorization = `Basic ${btoa(`${username}:${password}`)}`
|
||||
} else if (auth.authType === "bearer") {
|
||||
} else if (auth.authType === "bearer" || auth.authType === "oauth-2") {
|
||||
finalHeaders.Authorization = `Bearer ${auth.token}`
|
||||
} else if (auth.authType === "oauth-2") {
|
||||
const { addTo } = auth
|
||||
|
||||
if (addTo === "HEADERS") {
|
||||
finalHeaders.Authorization = `Bearer ${auth.grantTypeInfo.token}`
|
||||
} else if (addTo === "QUERY_PARAMS") {
|
||||
params["access_token"] = auth.grantTypeInfo.token
|
||||
}
|
||||
} else if (auth.authType === "api-key") {
|
||||
const { key, value, addTo } = auth
|
||||
if (addTo === "HEADERS") {
|
||||
if (addTo === "Headers") {
|
||||
finalHeaders[key] = value
|
||||
} else if (addTo === "QUERY_PARAMS") {
|
||||
} else if (addTo === "Query params") {
|
||||
params[key] = value
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,15 @@
|
||||
import {
|
||||
HoppCollection,
|
||||
HoppRESTRequest,
|
||||
getDefaultGQLRequest,
|
||||
getDefaultRESTRequest,
|
||||
translateToNewRESTCollection,
|
||||
} from "@hoppscotch/data"
|
||||
import * as A from "fp-ts/Array"
|
||||
import { pipe, flow } from "fp-ts/function"
|
||||
import * as TE from "fp-ts/TaskEither"
|
||||
import * as O from "fp-ts/Option"
|
||||
import * as RA from "fp-ts/ReadonlyArray"
|
||||
import * as TE from "fp-ts/TaskEither"
|
||||
import { flow, pipe } from "fp-ts/function"
|
||||
import * as A from "fp-ts/Array"
|
||||
import { translateToNewRESTCollection, HoppCollection } from "@hoppscotch/data"
|
||||
|
||||
import { HoppGQLRequest, translateToNewGQLCollection } from "@hoppscotch/data"
|
||||
import { safeParseJSON } from "~/helpers/functional/json"
|
||||
import { IMPORTER_INVALID_FILE_FORMAT } from "."
|
||||
import { safeParseJSON } from "~/helpers/functional/json"
|
||||
import { translateToNewGQLCollection } from "@hoppscotch/data"
|
||||
import { entityReference } from "verzod"
|
||||
import { z } from "zod"
|
||||
|
||||
export const hoppRESTImporter = (content: string[]) =>
|
||||
pipe(
|
||||
@@ -36,24 +32,8 @@ export const hoppRESTImporter = (content: string[]) =>
|
||||
* else translate it into one.
|
||||
*/
|
||||
const validateCollection = (collection: unknown) => {
|
||||
const collectionSchemaParsedResult = HoppCollection.safeParse(collection)
|
||||
|
||||
if (collectionSchemaParsedResult.type === "ok") {
|
||||
const requests = collectionSchemaParsedResult.value.requests.map(
|
||||
(request) => {
|
||||
const requestSchemaParsedResult = HoppRESTRequest.safeParse(request)
|
||||
|
||||
return requestSchemaParsedResult.type === "ok"
|
||||
? requestSchemaParsedResult.value
|
||||
: getDefaultRESTRequest()
|
||||
}
|
||||
)
|
||||
|
||||
return O.some({
|
||||
...collectionSchemaParsedResult.value,
|
||||
requests,
|
||||
})
|
||||
}
|
||||
const result = entityReference(HoppCollection).safeParse(collection)
|
||||
if (result.success) return O.some(result.data)
|
||||
|
||||
return O.some(translateToNewRESTCollection(collection))
|
||||
}
|
||||
@@ -84,24 +64,9 @@ export const hoppGQLImporter = (content: string) =>
|
||||
* @returns the collection if it is valid, else a translated version of the collection
|
||||
*/
|
||||
export const validateGQLCollection = (collection: unknown) => {
|
||||
const collectionSchemaParsedResult = HoppCollection.safeParse(collection)
|
||||
const result = z.array(entityReference(HoppCollection)).safeParse(collection)
|
||||
|
||||
if (collectionSchemaParsedResult.type === "ok") {
|
||||
const requests = collectionSchemaParsedResult.value.requests.map(
|
||||
(request) => {
|
||||
const requestSchemaParsedResult = HoppGQLRequest.safeParse(request)
|
||||
|
||||
return requestSchemaParsedResult.type === "ok"
|
||||
? requestSchemaParsedResult.value
|
||||
: getDefaultGQLRequest()
|
||||
}
|
||||
)
|
||||
|
||||
return O.some({
|
||||
...collectionSchemaParsedResult.value,
|
||||
requests,
|
||||
})
|
||||
}
|
||||
if (result.success) return O.some(result.data)
|
||||
|
||||
return O.some(translateToNewGQLCollection(collection))
|
||||
}
|
||||
|
||||
@@ -111,16 +111,12 @@ const getHoppReqAuth = (req: InsomniaRequestResource): HoppRESTAuth => {
|
||||
return {
|
||||
authType: "oauth-2",
|
||||
authActive: !(auth.disabled ?? false),
|
||||
grantTypeInfo: {
|
||||
authEndpoint: replaceVarTemplating(auth.authorizationUrl ?? ""),
|
||||
clientID: replaceVarTemplating(auth.clientId ?? ""),
|
||||
clientSecret: "",
|
||||
grantType: "AUTHORIZATION_CODE",
|
||||
scopes: replaceVarTemplating(auth.scope ?? ""),
|
||||
token: "",
|
||||
isPKCE: false,
|
||||
tokenEndpoint: replaceVarTemplating(auth.accessTokenUrl ?? ""),
|
||||
},
|
||||
accessTokenURL: replaceVarTemplating(auth.accessTokenUrl ?? ""),
|
||||
authURL: replaceVarTemplating(auth.authorizationUrl ?? ""),
|
||||
clientID: replaceVarTemplating(auth.clientId ?? ""),
|
||||
oidcDiscoveryURL: "",
|
||||
scope: replaceVarTemplating(auth.scope ?? ""),
|
||||
token: "",
|
||||
}
|
||||
else if (auth.type === "bearer")
|
||||
return {
|
||||
|
||||
@@ -260,7 +260,7 @@ const resolveOpenAPIV3SecurityObj = (
|
||||
return {
|
||||
authType: "api-key",
|
||||
authActive: true,
|
||||
addTo: "HEADERS",
|
||||
addTo: "Headers",
|
||||
key: scheme.name,
|
||||
value: "",
|
||||
}
|
||||
@@ -268,7 +268,7 @@ const resolveOpenAPIV3SecurityObj = (
|
||||
return {
|
||||
authType: "api-key",
|
||||
authActive: true,
|
||||
addTo: "QUERY_PARAMS",
|
||||
addTo: "Query params",
|
||||
key: scheme.in,
|
||||
value: "",
|
||||
}
|
||||
@@ -279,92 +279,67 @@ const resolveOpenAPIV3SecurityObj = (
|
||||
return {
|
||||
authType: "oauth-2",
|
||||
authActive: true,
|
||||
grantTypeInfo: {
|
||||
grantType: "AUTHORIZATION_CODE",
|
||||
authEndpoint: scheme.flows.authorizationCode.authorizationUrl ?? "",
|
||||
clientID: "",
|
||||
scopes: _schemeData.join(" "),
|
||||
token: "",
|
||||
isPKCE: false,
|
||||
tokenEndpoint: scheme.flows.authorizationCode.tokenUrl ?? "",
|
||||
clientSecret: "",
|
||||
},
|
||||
addTo: "HEADERS",
|
||||
accessTokenURL: scheme.flows.authorizationCode.tokenUrl ?? "",
|
||||
authURL: scheme.flows.authorizationCode.authorizationUrl ?? "",
|
||||
clientID: "",
|
||||
oidcDiscoveryURL: "",
|
||||
scope: _schemeData.join(" "),
|
||||
token: "",
|
||||
}
|
||||
} else if (scheme.flows.implicit) {
|
||||
return {
|
||||
authType: "oauth-2",
|
||||
authActive: true,
|
||||
grantTypeInfo: {
|
||||
grantType: "IMPLICIT",
|
||||
authEndpoint: scheme.flows.implicit.authorizationUrl ?? "",
|
||||
clientID: "",
|
||||
token: "",
|
||||
scopes: _schemeData.join(" "),
|
||||
},
|
||||
addTo: "HEADERS",
|
||||
authURL: scheme.flows.implicit.authorizationUrl ?? "",
|
||||
accessTokenURL: "",
|
||||
clientID: "",
|
||||
oidcDiscoveryURL: "",
|
||||
scope: _schemeData.join(" "),
|
||||
token: "",
|
||||
}
|
||||
} else if (scheme.flows.password) {
|
||||
return {
|
||||
authType: "oauth-2",
|
||||
authActive: true,
|
||||
grantTypeInfo: {
|
||||
grantType: "PASSWORD",
|
||||
clientID: "",
|
||||
authEndpoint: scheme.flows.password.tokenUrl,
|
||||
clientSecret: "",
|
||||
password: "",
|
||||
username: "",
|
||||
token: "",
|
||||
scopes: _schemeData.join(" "),
|
||||
},
|
||||
addTo: "HEADERS",
|
||||
authURL: "",
|
||||
accessTokenURL: scheme.flows.password.tokenUrl ?? "",
|
||||
clientID: "",
|
||||
oidcDiscoveryURL: "",
|
||||
scope: _schemeData.join(" "),
|
||||
token: "",
|
||||
}
|
||||
} else if (scheme.flows.clientCredentials) {
|
||||
return {
|
||||
authType: "oauth-2",
|
||||
authActive: true,
|
||||
grantTypeInfo: {
|
||||
grantType: "CLIENT_CREDENTIALS",
|
||||
authEndpoint: scheme.flows.clientCredentials.tokenUrl ?? "",
|
||||
clientID: "",
|
||||
clientSecret: "",
|
||||
scopes: _schemeData.join(" "),
|
||||
token: "",
|
||||
},
|
||||
addTo: "HEADERS",
|
||||
accessTokenURL: scheme.flows.clientCredentials.tokenUrl ?? "",
|
||||
authURL: "",
|
||||
clientID: "",
|
||||
oidcDiscoveryURL: "",
|
||||
scope: _schemeData.join(" "),
|
||||
token: "",
|
||||
}
|
||||
}
|
||||
return {
|
||||
authType: "oauth-2",
|
||||
authActive: true,
|
||||
grantTypeInfo: {
|
||||
grantType: "AUTHORIZATION_CODE",
|
||||
authEndpoint: "",
|
||||
clientID: "",
|
||||
scopes: _schemeData.join(" "),
|
||||
token: "",
|
||||
isPKCE: false,
|
||||
tokenEndpoint: "",
|
||||
clientSecret: "",
|
||||
},
|
||||
addTo: "HEADERS",
|
||||
accessTokenURL: "",
|
||||
authURL: "",
|
||||
clientID: "",
|
||||
oidcDiscoveryURL: "",
|
||||
scope: _schemeData.join(" "),
|
||||
token: "",
|
||||
}
|
||||
} else if (scheme.type === "openIdConnect") {
|
||||
return {
|
||||
authType: "oauth-2",
|
||||
authActive: true,
|
||||
grantTypeInfo: {
|
||||
grantType: "AUTHORIZATION_CODE",
|
||||
authEndpoint: "",
|
||||
clientID: "",
|
||||
scopes: _schemeData.join(" "),
|
||||
token: "",
|
||||
isPKCE: false,
|
||||
tokenEndpoint: "",
|
||||
clientSecret: "",
|
||||
},
|
||||
addTo: "HEADERS",
|
||||
accessTokenURL: "",
|
||||
authURL: "",
|
||||
clientID: "",
|
||||
oidcDiscoveryURL: scheme.openIdConnectUrl ?? "",
|
||||
scope: _schemeData.join(" "),
|
||||
token: "",
|
||||
}
|
||||
}
|
||||
|
||||
@@ -430,7 +405,7 @@ const resolveOpenAPIV2SecurityScheme = (
|
||||
// V2 only supports in: header and in: query
|
||||
return {
|
||||
authType: "api-key",
|
||||
addTo: scheme.in === "header" ? "HEADERS" : "QUERY_PARAMS",
|
||||
addTo: scheme.in === "header" ? "Headers" : "Query params",
|
||||
authActive: true,
|
||||
key: scheme.name,
|
||||
value: "",
|
||||
@@ -441,76 +416,56 @@ const resolveOpenAPIV2SecurityScheme = (
|
||||
return {
|
||||
authType: "oauth-2",
|
||||
authActive: true,
|
||||
grantTypeInfo: {
|
||||
authEndpoint: scheme.authorizationUrl ?? "",
|
||||
clientID: "",
|
||||
clientSecret: "",
|
||||
grantType: "AUTHORIZATION_CODE",
|
||||
scopes: _schemeData.join(" "),
|
||||
token: "",
|
||||
isPKCE: false,
|
||||
tokenEndpoint: scheme.tokenUrl ?? "",
|
||||
},
|
||||
addTo: "HEADERS",
|
||||
accessTokenURL: scheme.tokenUrl ?? "",
|
||||
authURL: scheme.authorizationUrl ?? "",
|
||||
clientID: "",
|
||||
oidcDiscoveryURL: "",
|
||||
scope: _schemeData.join(" "),
|
||||
token: "",
|
||||
}
|
||||
} else if (scheme.flow === "implicit") {
|
||||
return {
|
||||
authType: "oauth-2",
|
||||
authActive: true,
|
||||
grantTypeInfo: {
|
||||
authEndpoint: scheme.authorizationUrl ?? "",
|
||||
clientID: "",
|
||||
grantType: "IMPLICIT",
|
||||
scopes: _schemeData.join(" "),
|
||||
token: "",
|
||||
},
|
||||
addTo: "HEADERS",
|
||||
accessTokenURL: "",
|
||||
authURL: scheme.authorizationUrl ?? "",
|
||||
clientID: "",
|
||||
oidcDiscoveryURL: "",
|
||||
scope: _schemeData.join(" "),
|
||||
token: "",
|
||||
}
|
||||
} else if (scheme.flow === "application") {
|
||||
return {
|
||||
authType: "oauth-2",
|
||||
authActive: true,
|
||||
grantTypeInfo: {
|
||||
authEndpoint: scheme.tokenUrl ?? "",
|
||||
clientID: "",
|
||||
clientSecret: "",
|
||||
grantType: "CLIENT_CREDENTIALS",
|
||||
scopes: _schemeData.join(" "),
|
||||
token: "",
|
||||
},
|
||||
addTo: "HEADERS",
|
||||
accessTokenURL: scheme.tokenUrl ?? "",
|
||||
authURL: "",
|
||||
clientID: "",
|
||||
oidcDiscoveryURL: "",
|
||||
scope: _schemeData.join(" "),
|
||||
token: "",
|
||||
}
|
||||
} else if (scheme.flow === "password") {
|
||||
return {
|
||||
authType: "oauth-2",
|
||||
authActive: true,
|
||||
grantTypeInfo: {
|
||||
grantType: "PASSWORD",
|
||||
authEndpoint: scheme.tokenUrl ?? "",
|
||||
clientID: "",
|
||||
clientSecret: "",
|
||||
password: "",
|
||||
scopes: _schemeData.join(" "),
|
||||
token: "",
|
||||
username: "",
|
||||
},
|
||||
addTo: "HEADERS",
|
||||
accessTokenURL: scheme.tokenUrl ?? "",
|
||||
authURL: "",
|
||||
clientID: "",
|
||||
oidcDiscoveryURL: "",
|
||||
scope: _schemeData.join(" "),
|
||||
token: "",
|
||||
}
|
||||
}
|
||||
return {
|
||||
authType: "oauth-2",
|
||||
authActive: true,
|
||||
grantTypeInfo: {
|
||||
authEndpoint: "",
|
||||
clientID: "",
|
||||
clientSecret: "",
|
||||
grantType: "AUTHORIZATION_CODE",
|
||||
scopes: _schemeData.join(" "),
|
||||
token: "",
|
||||
isPKCE: false,
|
||||
tokenEndpoint: "",
|
||||
},
|
||||
addTo: "HEADERS",
|
||||
accessTokenURL: "",
|
||||
authURL: "",
|
||||
clientID: "",
|
||||
oidcDiscoveryURL: "",
|
||||
scope: _schemeData.join(" "),
|
||||
token: "",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -150,8 +150,8 @@ const getHoppReqAuth = (item: Item): HoppRESTAuth => {
|
||||
),
|
||||
addTo:
|
||||
(getVariableValue(auth.apikey, "in") ?? "query") === "query"
|
||||
? "QUERY_PARAMS"
|
||||
: "HEADERS",
|
||||
? "Query params"
|
||||
: "Headers",
|
||||
}
|
||||
} else if (auth.type === "bearer") {
|
||||
return {
|
||||
@@ -162,36 +162,25 @@ const getHoppReqAuth = (item: Item): HoppRESTAuth => {
|
||||
),
|
||||
}
|
||||
} else if (auth.type === "oauth2") {
|
||||
const accessTokenURL = replacePMVarTemplating(
|
||||
getVariableValue(auth.oauth2, "accessTokenUrl") ?? ""
|
||||
)
|
||||
const authURL = replacePMVarTemplating(
|
||||
getVariableValue(auth.oauth2, "authUrl") ?? ""
|
||||
)
|
||||
const clientId = replacePMVarTemplating(
|
||||
getVariableValue(auth.oauth2, "clientId") ?? ""
|
||||
)
|
||||
const scope = replacePMVarTemplating(
|
||||
getVariableValue(auth.oauth2, "scope") ?? ""
|
||||
)
|
||||
const token = replacePMVarTemplating(
|
||||
getVariableValue(auth.oauth2, "accessToken") ?? ""
|
||||
)
|
||||
|
||||
return {
|
||||
authType: "oauth-2",
|
||||
authActive: true,
|
||||
grantTypeInfo: {
|
||||
grantType: "AUTHORIZATION_CODE",
|
||||
authEndpoint: authURL,
|
||||
clientID: clientId,
|
||||
scopes: scope,
|
||||
token: token,
|
||||
tokenEndpoint: accessTokenURL,
|
||||
clientSecret: "",
|
||||
isPKCE: false,
|
||||
},
|
||||
addTo: "HEADERS",
|
||||
accessTokenURL: replacePMVarTemplating(
|
||||
getVariableValue(auth.oauth2, "accessTokenUrl") ?? ""
|
||||
),
|
||||
authURL: replacePMVarTemplating(
|
||||
getVariableValue(auth.oauth2, "authUrl") ?? ""
|
||||
),
|
||||
clientID: replacePMVarTemplating(
|
||||
getVariableValue(auth.oauth2, "clientId") ?? ""
|
||||
),
|
||||
scope: replacePMVarTemplating(
|
||||
getVariableValue(auth.oauth2, "scope") ?? ""
|
||||
),
|
||||
token: replacePMVarTemplating(
|
||||
getVariableValue(auth.oauth2, "accessToken") ?? ""
|
||||
),
|
||||
oidcDiscoveryURL: "",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -132,23 +132,30 @@ function generateKeybindingString(ev: KeyboardEvent): ShortcutKey | null {
|
||||
|
||||
function getPressedKey(ev: KeyboardEvent): Key | null {
|
||||
// Sometimes the property code is not available on the KeyboardEvent object
|
||||
const key = (ev.key ?? "").toLowerCase()
|
||||
const val = (ev.code ?? "").toLowerCase()
|
||||
|
||||
// Check arrow keys
|
||||
if (key.startsWith("arrow")) {
|
||||
return key.slice(5) as Key
|
||||
}
|
||||
if (val === "arrowup") return "up"
|
||||
else if (val === "arrowdown") return "down"
|
||||
else if (val === "arrowleft") return "left"
|
||||
else if (val === "arrowright") return "right"
|
||||
|
||||
// Check letter keys
|
||||
const isLetter = key.length === 1 && key >= "a" && key <= "z"
|
||||
if (isLetter) return key as Key
|
||||
const isLetter = val.startsWith("key")
|
||||
if (isLetter) return val.substring(3) as Key
|
||||
|
||||
// Check if number keys
|
||||
const isDigit = key.length === 1 && key >= "0" && key <= "9"
|
||||
if (isDigit) return key as Key
|
||||
const isDigit = val.startsWith("digit")
|
||||
if (isDigit) return val.substring(5) as Key
|
||||
|
||||
// Check if slash, period or enter
|
||||
if (key === "/" || key === "." || key === "enter") return key
|
||||
// Check if slash
|
||||
if (val === "slash") return "/"
|
||||
|
||||
// Check if period
|
||||
if (val === "period") return "."
|
||||
|
||||
// Check if enter
|
||||
if (val === "enter") return "enter"
|
||||
|
||||
// If no other cases match, this is not a valid key
|
||||
return null
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user