From da74077954ea9fa86f231fa2b4dd2477486aeac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samy=20Pess=C3=A9?= Date: Tue, 8 Apr 2025 23:58:19 +0200 Subject: [PATCH] Remove proxy package (#3124) --- bun.lock | 9 --- packages/proxy/.gitignore | 1 - packages/proxy/CHANGELOG.md | 7 --- packages/proxy/README.md | 28 --------- packages/proxy/package.json | 23 -------- packages/proxy/src/index.test.ts | 59 ------------------- packages/proxy/src/index.ts | 97 -------------------------------- packages/proxy/tsconfig.json | 23 -------- 8 files changed, 247 deletions(-) delete mode 100644 packages/proxy/.gitignore delete mode 100644 packages/proxy/CHANGELOG.md delete mode 100644 packages/proxy/README.md delete mode 100644 packages/proxy/package.json delete mode 100644 packages/proxy/src/index.test.ts delete mode 100644 packages/proxy/src/index.ts delete mode 100644 packages/proxy/tsconfig.json diff --git a/bun.lock b/bun.lock index a1b47c777..f8a0f6ffc 100644 --- a/bun.lock +++ b/bun.lock @@ -196,13 +196,6 @@ "typescript": "^5.5.3", }, }, - "packages/proxy": { - "name": "@gitbook/proxy", - "version": "0.1.0", - "devDependencies": { - "typescript": "^5.5.3", - }, - }, "packages/react-contentkit": { "name": "@gitbook/react-contentkit", "version": "0.7.0", @@ -642,8 +635,6 @@ "@gitbook/openapi-parser": ["@gitbook/openapi-parser@workspace:packages/openapi-parser"], - "@gitbook/proxy": ["@gitbook/proxy@workspace:packages/proxy"], - "@gitbook/react-contentkit": ["@gitbook/react-contentkit@workspace:packages/react-contentkit"], "@gitbook/react-math": ["@gitbook/react-math@workspace:packages/react-math"], diff --git a/packages/proxy/.gitignore b/packages/proxy/.gitignore deleted file mode 100644 index 849ddff3b..000000000 --- a/packages/proxy/.gitignore +++ /dev/null @@ -1 +0,0 @@ -dist/ diff --git a/packages/proxy/CHANGELOG.md b/packages/proxy/CHANGELOG.md deleted file mode 100644 index 308869fa5..000000000 --- a/packages/proxy/CHANGELOG.md +++ /dev/null @@ -1,7 +0,0 @@ -# @gitbook/proxy - -## 0.1.0 - -### Minor Changes - -- 53b9f10: First version diff --git a/packages/proxy/README.md b/packages/proxy/README.md deleted file mode 100644 index e9e609601..000000000 --- a/packages/proxy/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# `@gitbook/proxy` - -Host a GitBook site on your own domain as a subpath. - -## Usage - -```ts -import { proxyToGitBook } from '@gitbook/proxy'; - -const site = proxyToGitBook(event.request, { - site: 'mycompany.gitbook.io/site/', - basePath: '/docs', -}); - -export default { - async fetch(request) { - // If the requst matches the basePath /docs, we serve from GitBook - if (site.match(request)) { - return site.fetch(request); - } - - // Otherwise we do something else. - return new Response('Not found', { - statusCode: 404, - }); - }, -}; -``` diff --git a/packages/proxy/package.json b/packages/proxy/package.json deleted file mode 100644 index 796ac7d96..000000000 --- a/packages/proxy/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "@gitbook/proxy", - "description": "Host a GitBook site on your own domain as a subpath", - "version": "0.1.0", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "development": "./src/index.ts", - "default": "./dist/index.js" - } - }, - "dependencies": {}, - "devDependencies": { - "typescript": "^5.5.3" - }, - "scripts": { - "build": "tsc", - "typecheck": "tsc --noEmit", - "clean": "rm -rf ./dist", - "unit": "bun test" - }, - "files": ["dist", "src", "README.md", "CHANGELOG.md"] -} diff --git a/packages/proxy/src/index.test.ts b/packages/proxy/src/index.test.ts deleted file mode 100644 index 81fa218a1..000000000 --- a/packages/proxy/src/index.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { describe, expect, it } from 'bun:test'; -import { proxyToGitBook } from '.'; - -describe('.match', () => { - it('should return true if the request is below the base path', () => { - const site = proxyToGitBook({ site: 'https://org.gitbook.io/example/', basePath: '/docs' }); - expect(site.match('/docs')).toBe(true); - expect(site.match('/docs/')).toBe(true); - expect(site.match('/docs/hello')).toBe(true); - expect(site.match('/docs/hello/world')).toBe(true); - - expect(site.match('/hello/world')).toBe(false); - expect(site.match('/')).toBe(false); - }); -}); - -describe('.request', () => { - it('should compute a proper request for a sub-path', () => { - const site = proxyToGitBook({ site: 'https://org.gitbook.io/example/', basePath: '/docs' }); - const request = new Request('https://example.com/docs/hello/world'); - - const proxiedRequest = site.request(request); - expect(proxiedRequest.url).toBe('https://hosting.gitbook.io/docs/hello/world'); - expect(proxiedRequest.headers.get('Host')).toBe('hosting.gitbook.io'); - expect(proxiedRequest.headers.get('X-Forwarded-Host')).toBe('example.com'); - expect(proxiedRequest.headers.get('X-GitBook-BasePath')).toBe('/docs'); - expect(proxiedRequest.headers.get('X-GitBook-Site-URL')).toBe( - 'https://org.gitbook.io/example/' - ); - }); - - it('should compute a proper request on the root', () => { - const site = proxyToGitBook({ site: 'https://org.gitbook.io/example/', basePath: '/docs' }); - const request = new Request('https://example.com/docs'); - - const proxiedRequest = site.request(request); - expect(proxiedRequest.url).toBe('https://hosting.gitbook.io/docs'); - expect(proxiedRequest.headers.get('Host')).toBe('hosting.gitbook.io'); - expect(proxiedRequest.headers.get('X-Forwarded-Host')).toBe('example.com'); - expect(proxiedRequest.headers.get('X-GitBook-BasePath')).toBe('/docs'); - expect(proxiedRequest.headers.get('X-GitBook-Site-URL')).toBe( - 'https://org.gitbook.io/example/' - ); - }); - - it('should normalize the basepath', () => { - const site = proxyToGitBook({ site: 'https://org.gitbook.io/example/', basePath: 'docs/' }); - const request = new Request('https://example.com/docs/hello/world'); - - const proxiedRequest = site.request(request); - expect(proxiedRequest.url).toBe('https://hosting.gitbook.io/docs/hello/world'); - expect(proxiedRequest.headers.get('Host')).toBe('hosting.gitbook.io'); - expect(proxiedRequest.headers.get('X-Forwarded-Host')).toBe('example.com'); - expect(proxiedRequest.headers.get('X-GitBook-BasePath')).toBe('/docs'); - expect(proxiedRequest.headers.get('X-GitBook-Site-URL')).toBe( - 'https://org.gitbook.io/example/' - ); - }); -}); diff --git a/packages/proxy/src/index.ts b/packages/proxy/src/index.ts deleted file mode 100644 index 1d960637f..000000000 --- a/packages/proxy/src/index.ts +++ /dev/null @@ -1,97 +0,0 @@ -export interface ProxyToGitBookOptions { - /** - * The URL of the published site. - * @example "https://mycompany.gitbook.io/docs" - */ - site: string; - - /** - * Base path to serve the site on. - * @example "/docs" - */ - basePath: string; - - /** - * Hostname used by GitBook to serve content. - * Do not set this option unless you know what you are doing. - */ - gitbookHost?: string; -} - -export interface ProxySite { - /** - * Test if the request should be proxied to this site. - */ - match(request: Request | string): boolean; - - /** - * Get the proxied request for a given request. - */ - request(request: Request): Request; - - /** - * Fetch the request from the site. - */ - fetch(request: Request): Promise; -} - -/** - * Proxies requests to a GitBook site. - */ -export function proxyToGitBook(options: ProxyToGitBookOptions): ProxySite { - const { gitbookHost = 'hosting.gitbook.io' } = options; - - const siteUrl = new URL(options.site); - const rawSiteUrl = siteUrl.toString(); - - const basePath = normalizeBasePath(options.basePath); - - const site: ProxySite = { - match: (request) => { - const pathname = typeof request === 'string' ? request : new URL(request.url).pathname; - return pathname === basePath || pathname.startsWith(`${basePath}/`); - }, - - request: (originRequest) => { - const originUrl = new URL(originRequest.url); - - const url = new URL(originUrl); - url.hostname = gitbookHost; - - const proxyRequest = new Request(url, originRequest); - proxyRequest.headers.set('Host', gitbookHost); - - // Pass the original host and protocol - proxyRequest.headers.set('X-Forwarded-Host', originUrl.hostname); - proxyRequest.headers.set('X-Forwarded-Proto', 'https'); - - // Pass the basepath on the original URL - proxyRequest.headers.set('X-GitBook-BasePath', basePath); - - // Pass the site URL - proxyRequest.headers.set('X-GitBook-Site-URL', rawSiteUrl); - - return proxyRequest; - }, - - fetch: async (originRequest) => { - return fetch(site.request(originRequest)); - }, - }; - - return site; -} - -function normalizeBasePath(basePath: string): string { - let result = withLeadingSlash(basePath); - result = withoutTrailingSlash(result); - return result; -} - -function withLeadingSlash(path: string): string { - return path.startsWith('/') ? path : `/${path}`; -} - -function withoutTrailingSlash(path: string): string { - return path.endsWith('/') ? path.slice(0, -1) : path; -} diff --git a/packages/proxy/tsconfig.json b/packages/proxy/tsconfig.json deleted file mode 100644 index aa63c0ef4..000000000 --- a/packages/proxy/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": false, - "declaration": true, - "outDir": "dist", - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "incremental": true, - "types": [ - "bun-types" // add Bun global - ] - }, - "include": ["src/**/*.ts"], - "exclude": ["node_modules"] -}