Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
2ad2f46
feat(common): URL encode/decode context menu actions (#5782)
KanhaiyaPandey Feb 16, 2026
98aa036
fix(common): correctly resolve secret environment variables in basic …
aviu16 Feb 16, 2026
a22389c
fix: auto-recover from corrupted sandbox state (#5874)
jamesgeorge007 Feb 18, 2026
28a6569
chore: merge `hoppscotch/patch` into `hoppscotch/next`
jamesgeorge007 Feb 18, 2026
680439a
fix(common): improve responsive layout and overflow in realtime pages…
chandraprakash-pandey Feb 18, 2026
4fe0e37
chore: security patch for the dependency chain `v2026.2.0` (#5887)
mirarifhasan Feb 19, 2026
1de672b
feat(sh-admin): add search and pagination to teams list (#5803)
Leon-Luu Feb 20, 2026
2e989cf
chore(common): deprecate legacy interceptor system (#5830)
CuriousCorrelation Feb 21, 2026
a37d19b
chore(common): update `Czech` locale with improved translations (#5895)
lubomirblazekcz Feb 21, 2026
eb4b6a8
chore: update lock file
jamesgeorge007 Feb 23, 2026
a40c491
chore: bump version to `2026.2.0`
jamesgeorge007 Feb 23, 2026
55c1cb8
chore: bump CLI version
jamesgeorge007 Feb 23, 2026
a1be60d
fix(backend): resolve security advisories for IDOR and onboarding byp…
mirarifhasan Feb 23, 2026
faf2bfc
feat(common): add foundational support for dropdown-based organizatio…
jamesgeorge007 Feb 23, 2026
803e463
feat: api documentation versioning (#5676)
mirarifhasan Feb 23, 2026
c687473
chore: streamline pnpm versioning
jamesgeorge007 Feb 23, 2026
562d291
fix(common): constrain variable tooltip to viewport for long values (…
aviu16 Feb 23, 2026
b906404
chore: update lock file
jamesgeorge007 Feb 24, 2026
77e420d
fix(common): resolve TypeError when opening request from search resul…
Leon-Luu Feb 24, 2026
5ae9639
fix(common): increase modal dialog width for more screen sizes (#5884)
iDschepe Feb 24, 2026
02b3dbc
feat(desktop): cloud for orgs platform contract (#5903)
CuriousCorrelation Feb 24, 2026
57be05c
fix(backend): prevent IDOR in user collection and request endpoints (…
mirarifhasan Feb 24, 2026
12fea3d
chore: ignore AI coding assistant config dirs
jamesgeorge007 Feb 26, 2026
1119a22
chore(common): add `no_active_orgs_found` locale string
jamesgeorge007 Feb 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -182,3 +182,9 @@ devenv.local.nix

# pre-commit
.pre-commit-config.yaml

# AI Coding Assistants
.claude/
.cursor/
.aider*
.windsurfrules
18 changes: 9 additions & 9 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"author": "Hoppscotch (support@hoppscotch.io)",
"private": true,
"license": "MIT",
"packageManager": "pnpm@10.28.1",
"packageManager": "pnpm@10.29.3",
"scripts": {
"preinstall": "npx only-allow pnpm",
"prepare": "husky",
Expand All @@ -24,8 +24,8 @@
"./packages/*"
],
"devDependencies": {
"@commitlint/cli": "20.2.0",
"@commitlint/config-conventional": "20.3.1",
"@commitlint/cli": "20.4.1",
"@commitlint/config-conventional": "20.4.1",
"@hoppscotch/ui": "0.2.5",
"@types/node": "24.10.1",
"cross-env": "10.1.0",
Expand All @@ -39,15 +39,15 @@
"apiconnect-wsdl": "2.0.36",
"body-parser": "2.2.1",
"cross-spawn": "7.0.6",
"execa@0.10.0": "2.0.0",
"execa@<2.0.0": "2.0.0",
"form-data": "4.0.4",
"glob@<11.1.0": "11.1.0",
"hono@4.10.6": "4.11.4",
"jws@<3.2.3": "3.2.3",
"nodemailer@<7.0.12": "8.0.0",
"qs@6.14.0": "6.14.1",
"hono@4.11.4": "4.11.7",
"lodash@4.17.21": "4.17.23",
"nodemailer@<7.0.11": "7.0.11",
"qs@6.14.1": "6.14.2",
"subscriptions-transport-ws>ws": "7.5.10",
"vue": "3.5.27",
"vue": "3.5.28",
"ws": "8.17.1"
},
"onlyBuiltDependencies": [
Expand Down
22 changes: 11 additions & 11 deletions packages/hoppscotch-agent/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,26 +20,26 @@
"@hoppscotch/ui": "0.2.5",
"@tauri-apps/api": "2.1.1",
"@tauri-apps/plugin-shell": "2.3.3",
"@vueuse/core": "14.1.0",
"axios": "1.13.2",
"@vueuse/core": "14.2.1",
"axios": "1.13.5",
"fp-ts": "2.16.11",
"lodash-es": "4.17.22",
"vue": "3.5.27"
"lodash-es": "4.17.23",
"vue": "3.5.28"
},
"devDependencies": {
"@iconify-json/lucide": "1.2.86",
"@iconify-json/lucide": "1.2.91",
"@tauri-apps/cli": "2.9.3",
"@types/lodash-es": "4.17.12",
"@types/node": "24.10.1",
"@typescript-eslint/eslint-plugin": "8.53.1",
"@typescript-eslint/parser": "8.53.1",
"@vitejs/plugin-vue": "6.0.3",
"@vue/eslint-config-typescript": "14.6.0",
"autoprefixer": "10.4.23",
"@typescript-eslint/eslint-plugin": "8.56.0",
"@typescript-eslint/parser": "8.56.0",
"@vitejs/plugin-vue": "6.0.4",
"@vue/eslint-config-typescript": "14.7.0",
"autoprefixer": "10.4.24",
"cross-env": "10.1.0",
"eslint": "9.39.2",
"eslint-plugin-prettier": "5.5.5",
"eslint-plugin-vue": "10.6.2",
"eslint-plugin-vue": "10.8.0",
"globals": "16.5.0",
"postcss": "8.5.6",
"tailwindcss": "3.4.16",
Expand Down
56 changes: 28 additions & 28 deletions packages/hoppscotch-backend/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "hoppscotch-backend",
"version": "2026.1.1",
"version": "2026.2.0",
"description": "",
"author": "",
"private": true,
Expand Down Expand Up @@ -31,32 +31,32 @@
"do-test": "pnpm run test"
},
"dependencies": {
"@apollo/server": "5.2.0",
"@apollo/server": "5.4.0",
"@as-integrations/express5": "1.1.2",
"@nestjs-modules/mailer": "2.0.2",
"@nestjs/apollo": "13.2.3",
"@nestjs/common": "11.1.12",
"@nestjs/config": "4.0.2",
"@nestjs/core": "11.1.12",
"@nestjs/graphql": "13.2.3",
"@nestjs/apollo": "13.2.4",
"@nestjs/common": "11.1.13",
"@nestjs/config": "4.0.3",
"@nestjs/core": "11.1.13",
"@nestjs/graphql": "13.2.4",
"@nestjs/jwt": "11.0.2",
"@nestjs/passport": "11.0.0",
"@nestjs/platform-express": "11.1.12",
"@nestjs/schedule": "6.1.0",
"@nestjs/swagger": "11.2.5",
"@nestjs/platform-express": "11.1.13",
"@nestjs/schedule": "6.1.1",
"@nestjs/swagger": "11.2.6",
"@nestjs/terminus": "11.0.0",
"@nestjs/throttler": "6.5.0",
"@prisma/adapter-pg": "7.2.0",
"@prisma/client": "7.2.0",
"@prisma/adapter-pg": "7.4.0",
"@prisma/client": "7.4.0",
"argon2": "0.44.0",
"bcrypt": "6.0.0",
"class-transformer": "0.5.1",
"class-validator": "0.14.3",
"cookie": "1.1.1",
"cookie-parser": "1.4.7",
"dotenv": "17.2.3",
"dotenv": "17.3.1",
"express": "5.2.1",
"express-session": "1.18.2",
"express-session": "1.19.0",
"fp-ts": "2.16.11",
"graphql": "16.12.0",
"graphql-query-complexity": "1.1.0",
Expand All @@ -65,49 +65,49 @@
"handlebars": "4.7.8",
"io-ts": "2.2.22",
"morgan": "1.10.1",
"nodemailer": "8.0.0",
"nodemailer": "8.0.1",
"passport": "0.7.0",
"passport-github2": "0.1.12",
"passport-google-oauth20": "2.0.0",
"passport-jwt": "4.0.1",
"passport-local": "1.0.0",
"passport-microsoft": "2.1.0",
"pg": "8.17.1",
"posthog-node": "5.23.0",
"prisma": "7.2.0",
"pg": "8.18.0",
"posthog-node": "5.24.15",
"prisma": "7.4.0",
"reflect-metadata": "0.2.2",
"rimraf": "6.1.2",
"rimraf": "6.1.3",
"rxjs": "7.8.2"
},
"devDependencies": {
"@eslint/eslintrc": "3.3.3",
"@eslint/js": "9.39.2",
"@eslint/js": "10.0.1",
"@nestjs/cli": "11.0.16",
"@nestjs/schematics": "11.0.9",
"@nestjs/testing": "11.1.12",
"@nestjs/testing": "11.1.13",
"@relmify/jest-fp-ts": "2.1.1",
"@types/bcrypt": "6.0.0",
"@types/cookie-parser": "1.4.10",
"@types/express": "5.0.6",
"@types/jest": "30.0.0",
"@types/node": "25.0.9",
"@types/nodemailer": "7.0.5",
"@types/node": "25.2.3",
"@types/nodemailer": "7.0.10",
"@types/passport-github2": "1.2.9",
"@types/passport-google-oauth20": "2.0.17",
"@types/passport-jwt": "4.0.1",
"@types/passport-microsoft": "2.1.1",
"@types/pg": "8.16.0",
"@types/supertest": "6.0.3",
"@typescript-eslint/eslint-plugin": "8.53.1",
"@typescript-eslint/parser": "8.53.1",
"@typescript-eslint/eslint-plugin": "8.56.0",
"@typescript-eslint/parser": "8.56.0",
"cross-env": "10.1.0",
"eslint": "9.39.2",
"eslint": "10.0.0",
"eslint-config-prettier": "10.1.8",
"eslint-plugin-prettier": "5.5.5",
"globals": "17.0.0",
"globals": "17.3.0",
"jest": "30.2.0",
"jest-mock-extended": "4.0.0",
"prettier": "3.8.0",
"prettier": "3.8.1",
"source-map-support": "0.5.21",
"supertest": "7.2.2",
"ts-jest": "29.4.6",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
-- Step 1: Add slug column as nullable first
ALTER TABLE "PublishedDocs" ADD COLUMN "slug" TEXT;

-- Step 2: For backward compatibility, set slug = id for existing records
UPDATE "PublishedDocs" SET "slug" = "id" WHERE "slug" IS NULL;

-- Step 3: Handle duplicates - for multiple published docs with same collection and version
-- Keep the latest one (most recent), delete all older ones
-- delete old duplicates are safe, as multiple published docs with same collection and version is not expected behavior till v2025.11.x
WITH ranked_docs AS (
SELECT
id,
"collectionID",
version,
"createdOn",
ROW_NUMBER() OVER (PARTITION BY "collectionID", version ORDER BY "createdOn" DESC) as rn
FROM "PublishedDocs"
)
DELETE FROM "PublishedDocs"
WHERE id IN (
SELECT id FROM ranked_docs WHERE rn > 1
);

-- Step 4: Now make slug NOT NULL
ALTER TABLE "PublishedDocs" ALTER COLUMN "slug" SET NOT NULL;

-- CreateIndex
CREATE INDEX "PublishedDocs_collectionID_idx" ON "PublishedDocs"("collectionID");

-- CreateIndex
CREATE UNIQUE INDEX "PublishedDocs_slug_version_key" ON "PublishedDocs"("slug", "version");
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
-- AlterTable
ALTER TABLE "PublishedDocs" ADD COLUMN "environmentID" TEXT,
ADD COLUMN "environmentName" TEXT,
ADD COLUMN "environmentVariables" JSONB;
31 changes: 19 additions & 12 deletions packages/hoppscotch-backend/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -297,18 +297,25 @@ model MockServerActivity {
}

model PublishedDocs {
id String @id @default(cuid())
title String
collectionID String
creatorUid String
version String
autoSync Boolean
documentTree Json? // Optional if autoSync is true
workspaceType WorkspaceType
workspaceID String
metadata Json?
createdOn DateTime @default(now()) @db.Timestamptz(3)
updatedOn DateTime @updatedAt @db.Timestamptz(3)
id String @id @default(cuid())
slug String
title String
collectionID String
creatorUid String
version String
autoSync Boolean
documentTree Json? // Optional if autoSync is true
workspaceType WorkspaceType
workspaceID String
environmentID String?
environmentName String?
environmentVariables Json?
metadata Json?
createdOn DateTime @default(now()) @db.Timestamptz(3)
updatedOn DateTime @updatedAt @db.Timestamptz(3)

@@unique([slug, version])
@@index([collectionID])
}

enum WorkspaceType {
Expand Down
18 changes: 18 additions & 0 deletions packages/hoppscotch-backend/src/admin/admin.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -220,12 +220,30 @@ export class AdminService {
* @param cursorID team id
* @param take number of items to fetch
* @returns an array of teams
* @deprecated use fetchAllTeamsV2 instead
*/
async fetchAllTeams(cursorID: string, take: number) {
const allTeams = await this.teamService.fetchAllTeams(cursorID, take);
return allTeams;
}

/**
* Fetch all the teams in the infra.
* @param searchString search on team name or ID
* @param paginationOption pagination options
* @returns an array of teams
*/
async fetchAllTeamsV2(
searchString: string,
paginationOption: OffsetPaginationArgs,
) {
const allTeams = await this.teamService.fetchAllTeamsV2(
searchString,
paginationOption,
);
return allTeams;
}

/**
* Fetch the count of all the members in a team.
* @param teamID team id
Expand Down
20 changes: 20 additions & 0 deletions packages/hoppscotch-backend/src/admin/infra.resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,12 +120,32 @@ export class InfraResolver {

@ResolveField(() => [Team], {
description: 'Returns a list of all the teams in the infra',
deprecationReason: 'Use allTeamsV2 instead',
})
async allTeams(@Args() args: PaginationArgs): Promise<Team[]> {
const teams = await this.adminService.fetchAllTeams(args.cursor, args.take);
return teams;
}

@ResolveField(() => [Team], {
description: 'Returns a list of all the teams in the infra',
})
async allTeamsV2(
@Args({
name: 'searchString',
nullable: true,
description: 'Search on team name or ID',
})
searchString: string,
@Args() paginationOption: OffsetPaginationArgs,
): Promise<Team[]> {
const teams = await this.adminService.fetchAllTeamsV2(
searchString,
paginationOption,
);
return teams;
}

@ResolveField(() => Team, {
description: 'Returns a team info by ID when requested by Admin',
})
Expand Down
19 changes: 19 additions & 0 deletions packages/hoppscotch-backend/src/errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -783,6 +783,18 @@ export const INFRA_CONFIG_SERVICE_NOT_CONFIGURED =
export const INFRA_CONFIG_OPERATION_NOT_ALLOWED =
'infra_config/operation_not_allowed';

/**
* Error message for when the onboarding status fetch fails
* (InfraConfigService)
*/
export const INFRA_CONFIG_FETCH_FAILED = 'infra_config/fetch_failed' as const;

/**
* Onboarding has already been completed and cannot be re-run
* (OnboardingController)
*/
export const ONBOARDING_CANNOT_BE_RERUN = 'onboarding/cannot_be_rerun' as const;

/**
* Error message for when the database table does not exist
* (InfraConfigService)
Expand Down Expand Up @@ -961,6 +973,13 @@ export const PUBLISHED_DOCS_UPDATE_FAILED = 'published_docs/update_failed';
*/
export const PUBLISHED_DOCS_DELETION_FAILED = 'published_docs/deletion_failed';

/**
* Published Docs invalid environment
* (PublishedDocsService)
*/
export const PUBLISHED_DOCS_INVALID_ENVIRONMENT =
'published_docs/invalid_environment';

/**
* Published Docs not found
* (PublishedDocsService)
Expand Down
Loading
Loading