From d685cb4c55dff7f93eced3f21926856b85641fd9 Mon Sep 17 00:00:00 2001 From: "kozhin.iv" Date: Thu, 18 Jun 2026 18:33:32 +0500 Subject: [PATCH 1/7] chore: prepare public repo metadata --- .github/ISSUE_TEMPLATE/bug_report.yml | 80 +++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.yml | 56 +++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 32 ++++++++ CONTRIBUTING.md | 91 ++++++++++++++++++++++ README.md | 1 + apps/api/src/app-config-response.test.ts | 2 + apps/api/src/app-config-response.ts | 3 +- apps/api/src/app.test.ts | 1 + apps/web/src/App.tsx | 28 ++++++- apps/web/src/app/deployment-policy.test.ts | 8 +- apps/web/src/app/deployment-policy.ts | 3 +- apps/web/src/styles.css | 1 + apps/web/src/styles/header-meta.css | 68 ++++++++++++++++ packages/core/src/api-types.ts | 1 + 14 files changed, 368 insertions(+), 7 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 CONTRIBUTING.md create mode 100644 apps/web/src/styles/header-meta.css diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..c3d1ec1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,80 @@ +name: Bug report +description: Report something that is broken or behaves unexpectedly. +title: "[Bug]: " +labels: + - bug +body: + - type: markdown + attributes: + value: | + Thanks for reporting a bug. Please avoid sharing secrets, API keys, + auth headers, cookies, request bodies, or private response bodies. + - type: textarea + id: summary + attributes: + label: Summary + description: What went wrong? + placeholder: Importing an OpenAPI spec from URL fails with... + validations: + required: true + - type: textarea + id: steps + attributes: + label: Steps to reproduce + description: List the smallest set of steps that reproduces the issue. + placeholder: | + 1. Open SpecDock + 2. Import ... + 3. Click ... + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected behavior + description: What did you expect to happen? + validations: + required: true + - type: textarea + id: actual + attributes: + label: Actual behavior + description: What happened instead? + validations: + required: true + - type: dropdown + id: environment + attributes: + label: Environment + options: + - Hosted demo + - Local development + - Docker + - Self-hosted deployment + validations: + required: true + - type: input + id: version + attributes: + label: SpecDock version + description: Use the release tag, Docker image tag, or commit SHA if known. + placeholder: v0.2.3 + - type: input + id: browser + attributes: + label: Browser and OS + placeholder: Chrome 126 on macOS + - type: textarea + id: logs + attributes: + label: Logs or screenshots + description: Paste relevant logs or screenshots. Redact sensitive values first. + - type: checkboxes + id: checks + attributes: + label: Checklist + options: + - label: I have removed secrets, tokens, cookies, auth headers, request bodies, and private response bodies. + required: true + - label: I searched existing issues before opening this report. + required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..7a2d456 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,56 @@ +name: Feature request +description: Suggest an improvement or new capability for SpecDock. +title: "[Feature]: " +labels: + - enhancement +body: + - type: textarea + id: problem + attributes: + label: Problem + description: What workflow problem should this solve? + placeholder: When exploring an API contract, I need to... + validations: + required: true + - type: textarea + id: proposal + attributes: + label: Proposed solution + description: Describe the behavior you want. + validations: + required: true + - type: dropdown + id: area + attributes: + label: Area + options: + - Import + - Explore + - Test + - Generate + - Storage + - Public demo + - Self-hosting + - Documentation + - Other + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: What workarounds or other designs have you considered? + - type: textarea + id: context + attributes: + label: Additional context + description: Add links, screenshots, examples, or constraints. + - type: checkboxes + id: checks + attributes: + label: Checklist + options: + - label: This request fits SpecDock's local-first API contract workspace goal. + required: true + - label: I searched existing issues before opening this request. + required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..6203737 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,32 @@ +## Summary + + + +## Type of Change + +- [ ] Bug fix +- [ ] Feature +- [ ] Documentation +- [ ] Refactor or maintenance +- [ ] Security hardening + +## Testing + +- [ ] `npm run lint` +- [ ] `npm run typecheck` +- [ ] `npm run test` +- [ ] `npm run test:sdk-smoke` +- [ ] `npm run build` + + + +## Security Checklist + +- [ ] No secrets, auth headers, cookies, request bodies, or response bodies are logged. +- [ ] No new raw HTML or code execution sinks were introduced. +- [ ] URL, proxy, import, and request execution changes preserve SSRF and public demo restrictions. +- [ ] Untrusted OpenAPI specs, cURL input, URLs, localStorage values, and network responses are validated or safely rendered. + +## Notes for Reviewers + + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..44d8210 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,91 @@ +# Contributing + +Thanks for helping improve SpecDock. + +SpecDock is a local-first API contract workspace. Keep changes aligned with the +core flow: + +```txt +Import -> Explore -> Test -> Generate +``` + +## Before You Start + +- Check existing issues and pull requests to avoid duplicate work. +- Open an issue first for large UX, architecture, storage, proxy, or generator + changes. +- Keep public demo behavior safe: no unrestricted public proxying. + +## Development Setup + +Prerequisites: + +```txt +Node.js >=20.19.0 <21 or >=22.13.0 +npm +``` + +Install and run: + +```bash +nvm use +npm install +npm run dev +``` + +Open: + +```txt +http://127.0.0.1:5174 +``` + +Use npm only. Do not use pnpm or yarn in this repository. + +## Quality Checks + +Run the same checks as GitHub CI before opening a pull request: + +```bash +nvm use +npm run lint +npm run typecheck +npm run test +npm run test:sdk-smoke +npm run build +``` + +If a check is not relevant or cannot run locally, explain why in the pull +request. + +## Security Expectations + +SpecDock can handle API contracts, request data, and auth profile metadata. +Treat OpenAPI specs, cURL input, URLs, localStorage values, and network +responses as untrusted input. + +Do not log or persist secrets such as: + +- Authorization headers +- Cookie headers +- API keys or tokens +- request bodies or response bodies + +Proxy mode must remain disabled by default, explicitly enabled with +`PROXY_ENABLED=true`, and protected by allowed hosts, SSRF checks, timeouts, and +size limits. + +Report security issues using the instructions in [docs/SECURITY.md](docs/SECURITY.md). + +## Pull Request Guidelines + +- Keep changes focused and scoped to one problem. +- Include tests or explain why the change does not need tests. +- Update documentation when behavior, setup, deployment, or security posture + changes. +- Avoid committing generated build output, local credentials, or local-only + files. + +## Release Notes + +User-visible changes should be reflected in release notes under +`docs/release-notes/` when preparing a release. diff --git a/README.md b/README.md index 48be30b..de08759 100644 --- a/README.md +++ b/README.md @@ -210,6 +210,7 @@ docs Architecture, security, deployment, smoke tests, and roadmap - [Smoke tests](docs/SMOKE_TESTS.md) - [Release](docs/RELEASE.md) - [Roadmap](docs/ROADMAP.md) +- [Contributing](CONTRIBUTING.md) ## Open-Source Hygiene diff --git a/apps/api/src/app-config-response.test.ts b/apps/api/src/app-config-response.test.ts index 4b51028..66143f9 100644 --- a/apps/api/src/app-config-response.test.ts +++ b/apps/api/src/app-config-response.test.ts @@ -4,6 +4,7 @@ import { resolveAppConfigResponse } from "./app-config-response.js"; describe("resolveAppConfigResponse", () => { it("keeps direct requests unrestricted outside public demo mode", () => { expect(resolveAppConfigResponse({ PUBLIC_DEMO: "false" })).toEqual({ + version: expect.stringMatching(/^\d+\.\d+\.\d+$/), publicDemo: false, directRequest: { restricted: false, @@ -14,6 +15,7 @@ describe("resolveAppConfigResponse", () => { it("restricts direct requests to default demo hosts in public demo mode", () => { expect(resolveAppConfigResponse({ PUBLIC_DEMO: "true" })).toMatchObject({ + version: expect.stringMatching(/^\d+\.\d+\.\d+$/), publicDemo: true, directRequest: { restricted: true, diff --git a/apps/api/src/app-config-response.ts b/apps/api/src/app-config-response.ts index 7996424..5c62295 100644 --- a/apps/api/src/app-config-response.ts +++ b/apps/api/src/app-config-response.ts @@ -1,4 +1,4 @@ -import type { AppConfigResponse } from "@specdock/core"; +import { APP_VERSION, type AppConfigResponse } from "@specdock/core"; const defaultDemoDirectAllowedHosts = [ "dummyjson.com", @@ -12,6 +12,7 @@ export const resolveAppConfigResponse = ( const publicDemo = env.PUBLIC_DEMO === "true"; return { + version: APP_VERSION, publicDemo, directRequest: { restricted: publicDemo, diff --git a/apps/api/src/app.test.ts b/apps/api/src/app.test.ts index 78528df..32f4946 100644 --- a/apps/api/src/app.test.ts +++ b/apps/api/src/app.test.ts @@ -47,6 +47,7 @@ describe("app", () => { expect(response.statusCode).toBe(200); expect(response.json()).toEqual({ + version: expect.stringMatching(/^\d+\.\d+\.\d+$/), publicDemo: true, directRequest: { restricted: true, diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index a2ce4cf..deee7d0 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -1,4 +1,4 @@ -import { Moon, SlidersHorizontal, Sun } from "lucide-react"; +import { Github, Moon, SlidersHorizontal, Sun } from "lucide-react"; import { useState } from "react"; import { SettingsDialog } from "./components/SettingsDialog.js"; import { WorkspaceColumns } from "./components/WorkspaceColumns.js"; @@ -6,6 +6,8 @@ import { WorkspaceJumpNav } from "./components/WorkspaceJumpNav.js"; import { type PanelId, usePanelLayout } from "./app/usePanelLayout.js"; import { useSpecDockController } from "./app/useSpecDockController.js"; +const githubRepositoryUrl = "https://github.com/dev-ik/specdock"; + export const App = () => { const app = useSpecDockController(); const panelLayout = usePanelLayout(); @@ -22,9 +24,27 @@ export const App = () => {
-
-

SpecDock

-

API contract workspace

+
+
+

SpecDock

+ v{app.appConfig.version} + {app.appConfig.publicDemo ? ( + Public demo + ) : null} +
+
+

API contract workspace

+ + +
diff --git a/apps/web/src/app/deployment-policy.test.ts b/apps/web/src/app/deployment-policy.test.ts index 2684bd5..fdc24bf 100644 --- a/apps/web/src/app/deployment-policy.test.ts +++ b/apps/web/src/app/deployment-policy.test.ts @@ -1,7 +1,9 @@ +import { APP_VERSION } from "@specdock/core"; import { describe, expect, it } from "vitest"; import { directRequestBlockReason } from "./deployment-policy.js"; const publicDemoConfig = { + version: APP_VERSION, publicDemo: true, directRequest: { restricted: true, @@ -13,7 +15,11 @@ describe("directRequestBlockReason", () => { it("allows unrestricted self-hosted direct requests", () => { expect( directRequestBlockReason( - { publicDemo: false, directRequest: { restricted: false, allowedHosts: [] } }, + { + version: APP_VERSION, + publicDemo: false, + directRequest: { restricted: false, allowedHosts: [] } + }, "direct", "https://api.example.com/users" ) diff --git a/apps/web/src/app/deployment-policy.ts b/apps/web/src/app/deployment-policy.ts index cd7c92d..8b8a47f 100644 --- a/apps/web/src/app/deployment-policy.ts +++ b/apps/web/src/app/deployment-policy.ts @@ -1,6 +1,7 @@ -import type { AppConfigResponse, RequestState } from "@specdock/core"; +import { APP_VERSION, type AppConfigResponse, type RequestState } from "@specdock/core"; export const defaultAppConfig: AppConfigResponse = { + version: APP_VERSION, publicDemo: false, directRequest: { restricted: false, diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css index 7ff05dd..986f6cc 100644 --- a/apps/web/src/styles.css +++ b/apps/web/src/styles.css @@ -1,6 +1,7 @@ @import "tailwindcss"; @import "./styles/tokens.css"; @import "./styles/layout.css"; +@import "./styles/header-meta.css"; @import "./styles/panels.css"; @import "./styles/controls.css"; @import "./styles/endpoints.css"; diff --git a/apps/web/src/styles/header-meta.css b/apps/web/src/styles/header-meta.css new file mode 100644 index 0000000..fdf7bc6 --- /dev/null +++ b/apps/web/src/styles/header-meta.css @@ -0,0 +1,68 @@ +.app-brand { + min-width: 0; +} + +.app-title-row, +.app-subtitle-row { + display: flex; + align-items: center; + gap: 0.5rem; + min-width: 0; +} + +.app-title-row { + flex-wrap: wrap; +} + +.app-subtitle-row { + margin-top: 0.2rem; +} + +.app-subtitle-row .app-subtitle { + margin-top: 0; +} + +.app-version-badge, +.app-demo-badge, +.app-github-link { + display: inline-flex; + align-items: center; + border-radius: 999px; + font-size: 0.72rem; + font-weight: 700; + line-height: 1; +} + +.app-version-badge, +.app-demo-badge { + border: 1px solid var(--border); + background: var(--panel-subtle); + padding: 0.26rem 0.45rem; + color: var(--muted); +} + +.app-demo-badge { + border-color: rgba(34, 197, 94, 0.32); + background: rgba(34, 197, 94, 0.1); + color: var(--success); +} + +.app-github-link { + gap: 0.28rem; + color: var(--muted); + text-decoration: none; +} + +.app-github-link:hover, +.app-github-link:focus-visible { + color: var(--text); + outline: none; +} + +@media (max-width: 560px) { + .app-subtitle-row { + align-items: flex-start; + flex-direction: column; + gap: 0.35rem; + } +} diff --git a/packages/core/src/api-types.ts b/packages/core/src/api-types.ts index b85f034..7fe00c2 100644 --- a/packages/core/src/api-types.ts +++ b/packages/core/src/api-types.ts @@ -14,6 +14,7 @@ export type HealthResponse = { }; export type AppConfigResponse = { + version: string; publicDemo: boolean; directRequest: { restricted: boolean; From 3a81d07d057a84d41e8793c59801c6772389d71e Mon Sep 17 00:00:00 2001 From: "kozhin.iv" Date: Thu, 18 Jun 2026 19:05:54 +0500 Subject: [PATCH 2/7] Improve repository presentation --- CODE_OF_CONDUCT.md | 35 +++++++++ README.md | 12 ++- SECURITY.md | 35 +++++++++ docs/assets/specdock-preview.svg | 96 ++++++++++++++++++++++++ docs/assets/specdock-social-preview.png | Bin 0 -> 128867 bytes 5 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 SECURITY.md create mode 100644 docs/assets/specdock-preview.svg create mode 100644 docs/assets/specdock-social-preview.png diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..4f1cb2a --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,35 @@ +# Code of Conduct + +SpecDock is an open-source project for practical API contract tooling. The +project should be useful, direct, and safe for maintainers, users, and +contributors. + +## Expected Behavior + +- Be respectful and constructive. +- Keep discussion focused on the project and its users. +- Explain technical disagreements with concrete reasoning. +- Assume public comments may be read by new contributors. +- Report security issues through private security channels, not public issues. + +## Unacceptable Behavior + +- Harassment, threats, personal attacks, or discriminatory language. +- Publishing private information without explicit permission. +- Repeated off-topic or disruptive comments. +- Trolling, spam, or intentionally misleading reports. +- Public disclosure of security vulnerabilities before maintainers have had a + reasonable chance to respond. + +## Enforcement + +Maintainers may edit, hide, or delete comments; close issues or pull requests; +block users; or restrict participation when behavior harms the project or its +community. + +If you see a conduct issue, contact the maintainer through the GitHub profile +linked from the repository owner account. Include relevant links, screenshots, +and context when possible. + +This code applies to project spaces including issues, pull requests, +discussions, release comments, and official project communication channels. diff --git a/README.md b/README.md index de08759..62082ea 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,11 @@ # SpecDock -Local-first API contract workspace for OpenAPI teams. +[![CI](https://github.com/dev-ik/specdock/actions/workflows/ci.yml/badge.svg)](https://github.com/dev-ik/specdock/actions/workflows/ci.yml) +[![Release](https://img.shields.io/github/v/release/dev-ik/specdock?color=0f766e)](https://github.com/dev-ik/specdock/releases) +[![Docker](https://img.shields.io/badge/docker-d8vik%2Fspecdock-2496ED?logo=docker&logoColor=white)](https://hub.docker.com/r/d8vik/specdock) +[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) + +Local-first OpenAPI workspace to import specs, test requests, and generate SDKs. SpecDock keeps the everyday API contract loop in one browser workspace: @@ -10,6 +15,8 @@ Import -> Explore -> Test -> Generate Try the hosted demo: [https://specdock.ru](https://specdock.ru) +![SpecDock product preview](docs/assets/specdock-preview.svg) + ## What It Does - Import OpenAPI 3.0/3.1 specs from raw text, file upload, or URL. @@ -206,11 +213,12 @@ docs Architecture, security, deployment, smoke tests, and roadmap - [SDK output spec](docs/SDK_SPEC.md) - [Multi-language SDK generation plan](docs/implementation-plan/multi-language-sdk.md) - [Deployment](docs/DEPLOYMENT.md) -- [Security](docs/SECURITY.md) +- [Security](SECURITY.md) - [Smoke tests](docs/SMOKE_TESTS.md) - [Release](docs/RELEASE.md) - [Roadmap](docs/ROADMAP.md) - [Contributing](CONTRIBUTING.md) +- [Code of conduct](CODE_OF_CONDUCT.md) ## Open-Source Hygiene diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..a113593 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,35 @@ +# Security Policy + +SpecDock is a local-first API contract workspace. Imported contracts, auth +profiles, request preferences, and generated previews stay in the user's +browser unless the user exports or sends them. + +For the full security model, deployment guidance, proxy rules, and sensitive +data handling notes, see [docs/SECURITY.md](docs/SECURITY.md). + +## Reporting Vulnerabilities + +Please do not report suspected security vulnerabilities in public issues. + +Use GitHub's private vulnerability reporting flow for this repository when it +is available. If that flow is unavailable, contact the maintainer through the +GitHub profile linked from the repository owner account. + +Include: + +- affected version or commit +- clear reproduction steps +- expected and actual behavior +- impact assessment +- any relevant logs with secrets removed + +SpecDock does not currently run a paid bug bounty program. + +## Security Expectations + +- Public demo deployments must keep `PROXY_ENABLED=false`. +- Self-hosted proxy mode must use explicit allowed hosts and SSRF protections. +- Do not log or persist Authorization headers, Cookie headers, API keys, + tokens, request bodies, or response bodies. +- Treat OpenAPI specs, cURL input, URL input, localStorage, and network + responses as untrusted input. diff --git a/docs/assets/specdock-preview.svg b/docs/assets/specdock-preview.svg new file mode 100644 index 0000000..0747d8a --- /dev/null +++ b/docs/assets/specdock-preview.svg @@ -0,0 +1,96 @@ + + SpecDock product preview + A preview of the SpecDock local-first API contract workspace with import, explorer, request, response, and SDK generation panels. + + + + + + + + + + + + + + + + + + + + + + SpecDock + Local-first API contract workspace + + + + Import + + OpenAPI 3.0 / 3.1 + + + + File + + URL + Browser storage only + + + + + Explore + + Search endpoints + + + GET + /posts + + GET + /posts/{id} + + POST + /posts + + Quality and diff panels + + + + + Test + + Base URL + + Direct + + Proxy + + curl -X GET + https://api.example + Auth profiles stay local + + + + + Generate + + + TS + + Go + + Java + + PHP + + + + SDK ZIP downloads + + + Import -> Explore -> Test -> Generate + OpenAPI-first, self-hosted, security-first developer tooling. + diff --git a/docs/assets/specdock-social-preview.png b/docs/assets/specdock-social-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b0e390e81f479bedee2538f8abe6bfac24e92d GIT binary patch literal 128867 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%0AD+=d$Y z|70f@tjVEoy*MFgKVzHY;y#eCc}u!%i028T%`mkQFE}}UL%-x{WqstB={cX1y(Wvw zx(bAsWjJ?w1^>ftqH)3K9Hx+J(bo%^|J6&yK*SjVgj-dg9>dq+et%RlJK@~b6)D^! zGidrcG?J⪼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 UXD9Uq@C}U-!VG>}*EQ;Y0D5zDbN~PV literal 0 HcmV?d00001 From b2e6ed93013b8af8b1478f0b3eba8acd1ce0fb54 Mon Sep 17 00:00:00 2001 From: "Igor K (DevIK)" Date: Fri, 19 Jun 2026 08:10:18 +0000 Subject: [PATCH 3/7] Improve repository presentation (#2) --- CHANGELOG.md | 16 ++ README.md | 15 +- apps/api/package.json | 6 +- apps/api/src/route-schemas.ts | 15 +- apps/web/package.json | 8 +- apps/web/src/app/auth-profiles.ts | 12 +- apps/web/src/app/base-url.test.ts | 38 +++ apps/web/src/app/base-url.ts | 19 ++ apps/web/src/app/curl-actions.ts | 101 +++++++ apps/web/src/app/project-actions.ts | 1 + apps/web/src/app/project-transfer-actions.ts | 66 +++++ apps/web/src/app/project-transfer.test.ts | 59 +++++ apps/web/src/app/project-transfer.ts | 96 +++++++ apps/web/src/app/request-actions.ts | 22 ++ apps/web/src/app/request-utils.ts | 11 +- apps/web/src/app/sdk-diff.test.ts | 19 +- apps/web/src/app/types.ts | 1 + apps/web/src/app/useSpecDockController.ts | 81 ++---- apps/web/src/app/useSpecDockDerivedState.ts | 11 +- apps/web/src/app/useSpecDockState.ts | 15 +- apps/web/src/components/GeneratePanel.tsx | 25 ++ apps/web/src/components/ImportPanelCards.tsx | 69 +++-- apps/web/src/components/RequestBodyFields.tsx | 15 +- apps/web/src/components/RequestFields.tsx | 4 +- apps/web/src/components/RequestPanel.tsx | 45 ++-- apps/web/src/components/ResponsePanel.tsx | 8 +- apps/web/src/components/WorkspaceColumns.tsx | 2 + .../src/components/WorkspacePanelCards.tsx | 2 + apps/web/src/curl-import.test.ts | 52 +++- apps/web/src/curl-import.ts | 131 +++++++++ apps/web/src/request-body-fields.ts | 6 + apps/web/src/request-parameter-meta.ts | 5 +- apps/web/src/request-serialization.ts | 141 ++++++++++ apps/web/src/request.test.ts | 147 ++++++++++ apps/web/src/request.ts | 101 +++++-- apps/web/src/styles/controls.css | 6 +- apps/web/src/styles/endpoints.css | 27 +- apps/web/src/workspace.ts | 1 + docs/DATA_MODELS.md | 3 + docs/DEPLOYMENT.md | 6 +- docs/IMPLEMENTATION_PLAN.md | 1 + docs/NON_FUNCTIONAL_REQUIREMENTS.md | 5 +- docs/RELEASE.md | 14 +- docs/ROADMAP.md | 3 + docs/SECURITY.md | 6 + docs/implementation-plan/release-roadmap.md | 51 ++++ docs/implementation-plan/release-v0.3.0.md | 120 +++++++++ docs/implementation-plan/release-v0.4.0.md | 93 +++++++ docs/implementation-plan/release-v0.5.0.md | 91 +++++++ package-lock.json | 26 +- package.json | 2 +- packages/core/package.json | 2 +- packages/core/src/api-types.ts | 3 + packages/core/src/constants.ts | 7 +- packages/core/src/generate-options.ts | 14 + packages/core/src/openapi-operation.ts | 18 +- packages/core/src/openapi-types.ts | 4 + packages/core/src/openapi.test.ts | 66 ++++- packages/core/src/openapi.ts | 10 +- packages/core/src/swagger2.ts | 250 ++++++++++++++++++ packages/generator/package.json | 4 +- packages/generator/src/client-file.ts | 21 +- packages/generator/src/csharp-file.ts | 36 ++- packages/generator/src/go-file.ts | 25 +- packages/generator/src/index.test.ts | 57 ++++ packages/generator/src/index.ts | 12 +- packages/generator/src/java-file.ts | 27 +- packages/generator/src/metadata-files.ts | 14 + packages/generator/src/php-file.ts | 32 ++- packages/generator/src/python-file.ts | 61 +++-- packages/generator/src/sdk-model.ts | 4 +- packages/ui/package.json | 2 +- 72 files changed, 2208 insertions(+), 281 deletions(-) create mode 100644 apps/web/src/app/base-url.test.ts create mode 100644 apps/web/src/app/base-url.ts create mode 100644 apps/web/src/app/curl-actions.ts create mode 100644 apps/web/src/app/project-transfer-actions.ts create mode 100644 apps/web/src/app/project-transfer.test.ts create mode 100644 apps/web/src/app/project-transfer.ts create mode 100644 apps/web/src/request-serialization.ts create mode 100644 docs/implementation-plan/release-roadmap.md create mode 100644 docs/implementation-plan/release-v0.3.0.md create mode 100644 docs/implementation-plan/release-v0.4.0.md create mode 100644 docs/implementation-plan/release-v0.5.0.md create mode 100644 packages/core/src/swagger2.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index a8bce84..718790c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## v0.3.0 + +### Added + +- Added Swagger 2.0 import by converting supported contracts into normalized OpenAPI 3 documents. +- Added OpenAPI parameter serialization for path/query request execution and cURL preview. +- Added multipart/form-data and application/octet-stream request body support with session-only file inputs. +- Added SDK preset options for package name, client name, naming style, and base URL strategy metadata. +- Added local `.specdock.json` project export/import with Zod validation and secret/body redaction. + +### Security + +- Public proxy behavior is unchanged. +- Project exports exclude auth secret values, manual headers, request bodies, response bodies, and file contents. +- Multipart and binary files stay in memory for the current browser session only. + ## v0.2.3 ### Fixed diff --git a/README.md b/README.md index 62082ea..d86cd99 100644 --- a/README.md +++ b/README.md @@ -19,14 +19,15 @@ Try the hosted demo: [https://specdock.ru](https://specdock.ru) ## What It Does -- Import OpenAPI 3.0/3.1 specs from raw text, file upload, or URL. +- Import OpenAPI 3.0/3.1 and Swagger 2.0 specs from raw text, file upload, or URL. - Explore endpoints grouped by tags with search and operation details. -- Build requests with path/query/header params, JSON body, cURL preview, and saved Base URL/Mode. +- Build requests with OpenAPI parameter serialization, JSON, form, multipart, binary bodies, cURL preview, and saved Base URL/Mode. - Store per-project auth profiles locally in the browser for repeat testing. - Execute requests in Direct Browser Mode or restricted self-hosted Proxy Mode. - Inspect saved request/response exchanges per endpoint or latest request. -- Generate TypeScript, Python, Go, Java, C#, and PHP SDK files with ZIP downloads. +- Generate TypeScript, Python, Go, Java, C#, and PHP SDK files with basic naming presets and ZIP downloads. - Store projects, settings, safe request preferences, and history metadata in local browser storage. +- Export/import local `.specdock.json` project files without auth secrets or request/response bodies. The hosted demo is for evaluation. It does not provide unrestricted proxying for arbitrary third-party APIs. For controlled proxy execution, run SpecDock yourself and configure an explicit host allowlist. @@ -76,7 +77,7 @@ docker run -d --name specdock \ -p 127.0.0.1:3000:3000 \ -e PUBLIC_DEMO=true \ -e PROXY_ENABLED=false \ - docker.io/d8vik/specdock:v0.2.3 + docker.io/d8vik/specdock:v0.3.0 ``` Or keep configuration in a local env file: @@ -92,7 +93,7 @@ PROXY_ALLOW_PRIVATE_TARGETS=false docker run -d --name specdock \ -p 127.0.0.1:3000:3000 \ --env-file ./specdock.env \ - docker.io/d8vik/specdock:v0.2.3 + docker.io/d8vik/specdock:v0.3.0 ``` If you prefer Compose with the published image, create your own @@ -101,7 +102,7 @@ If you prefer Compose with the published image, create your own ```yaml services: specdock: - image: docker.io/d8vik/specdock:v0.2.3 + image: docker.io/d8vik/specdock:v0.3.0 ports: - "127.0.0.1:3000:3000" environment: @@ -121,7 +122,7 @@ Check health: curl -fsS http://127.0.0.1:3000/api/health ``` -Use immutable version tags such as `docker.io/d8vik/specdock:v0.2.3`. +Use immutable version tags such as `docker.io/d8vik/specdock:v0.3.0`. The project does not rely on `latest` for releases. ## Configuration diff --git a/apps/api/package.json b/apps/api/package.json index bdecdec..b96da13 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,6 +1,6 @@ { "name": "@specdock/api", - "version": "0.2.3", + "version": "0.3.0", "private": true, "type": "module", "scripts": { @@ -12,8 +12,8 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@specdock/core": "0.2.3", - "@specdock/generator": "0.2.3", + "@specdock/core": "0.3.0", + "@specdock/generator": "0.3.0", "fastify": "5.8.5", "tsx": "4.22.4" }, diff --git a/apps/api/src/route-schemas.ts b/apps/api/src/route-schemas.ts index cbb4d87..fd7659b 100644 --- a/apps/api/src/route-schemas.ts +++ b/apps/api/src/route-schemas.ts @@ -16,7 +16,20 @@ const generateOptionsSchema = { pattern: "^/?(?!.*(?:^|/)\\.\\.?$)(?!.*(?:^|/)\\.\\.?/)(?!.*\\\\)[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*/?$" }, - namingStyle: { type: "string", enum: ["operationId", "camelCase"] } + namingStyle: { type: "string", enum: ["operationId", "camelCase"] }, + packageName: { + type: "string", + minLength: 1, + maxLength: 160, + pattern: "^(?!.*\\.\\.)[A-Za-z0-9][A-Za-z0-9._/-]*$" + }, + clientName: { + type: "string", + minLength: 1, + maxLength: 80, + pattern: "^[A-Za-z][A-Za-z0-9_]*$" + }, + baseUrlStrategy: { type: "string", enum: ["constructor", "perRequest"] } } } as const; diff --git a/apps/web/package.json b/apps/web/package.json index 1c97f9a..b5f242f 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@specdock/web", - "version": "0.2.3", + "version": "0.3.0", "private": true, "type": "module", "scripts": { @@ -11,9 +11,9 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@specdock/core": "0.2.3", - "@specdock/generator": "0.2.3", - "@specdock/ui": "0.2.3", + "@specdock/core": "0.3.0", + "@specdock/generator": "0.3.0", + "@specdock/ui": "0.3.0", "@tailwindcss/vite": "4.3.1", "@vitejs/plugin-react": "6.0.2", "tailwindcss": "4.3.1", diff --git a/apps/web/src/app/auth-profiles.ts b/apps/web/src/app/auth-profiles.ts index 62da647..cb0ee47 100644 --- a/apps/web/src/app/auth-profiles.ts +++ b/apps/web/src/app/auth-profiles.ts @@ -66,7 +66,8 @@ export const applyAuthProfileToRequest = ( export const redactRequestForPreview = (request: ApiRequest): ApiRequest => ({ ...request, url: redactSensitiveUrl(request.url), - body: redactRequestBody(request.body), + body: typeof request.body === "string" ? redactRequestBody(request.body) : request.body, + bodyPreview: redactMultipartPreview(request.bodyPreview), headers: Object.fromEntries( Object.entries(request.headers).map(([name, value]) => [ name, @@ -106,6 +107,13 @@ const redactSensitiveBodyFields = (value: unknown): unknown => { return value; }; +const redactMultipartPreview = (preview: string | undefined): string | undefined => { + if (!preview) return preview; + return preview.replace(/(-F\s+'?)([^='@\s]+)=([^'\s]+)/g, (_match, prefix: string, name: string, value: string) => + `${prefix}${name}=${isSensitiveParameterName(name) ? REDACTED_VALUE : value}` + ); +}; + const withHeader = ( request: ApiRequest, name: string, @@ -167,7 +175,7 @@ const withCsrfBodyField = ( profile: AuthProfile ): ApiRequest => { const token = profile.values.csrfToken?.trim(); - if (!token || !request.body?.trim()) { + if (!token || typeof request.body !== "string" || !request.body.trim()) { return request; } diff --git a/apps/web/src/app/base-url.test.ts b/apps/web/src/app/base-url.test.ts new file mode 100644 index 0000000..14e9ba7 --- /dev/null +++ b/apps/web/src/app/base-url.test.ts @@ -0,0 +1,38 @@ +import { describe, expect, it } from "vitest"; +import type { OpenApiProject } from "@specdock/core"; +import { applyProjectBaseUrl } from "./base-url.js"; + +const project = (url: string): OpenApiProject => ({ + id: "project-1", + name: "API", + source: { type: "raw" }, + spec: {}, + servers: url ? [{ url }] : [], + tags: [], + operations: [], + schemas: [], + createdAt: "2026-06-16T00:00:00.000Z", + updatedAt: "2026-06-16T00:00:00.000Z" +}); + +describe("project base URL policy", () => { + it("preserves saved project base URLs when opening existing projects", () => { + expect( + applyProjectBaseUrl( + { "project-1": "https://staging.example.com" }, + project("https://api.example.com"), + "preserve" + ) + ).toEqual({ "project-1": "https://staging.example.com" }); + }); + + it("resets stale base URLs when importing a replacement contract", () => { + expect( + applyProjectBaseUrl( + { "project-1": "https://dummyjson.com" }, + project("https://api.example.com/v1"), + "reset" + ) + ).toEqual({ "project-1": "https://api.example.com/v1" }); + }); +}); diff --git a/apps/web/src/app/base-url.ts b/apps/web/src/app/base-url.ts new file mode 100644 index 0000000..db0fc18 --- /dev/null +++ b/apps/web/src/app/base-url.ts @@ -0,0 +1,19 @@ +import type { OpenApiProject } from "@specdock/core"; +import type { ProjectBaseUrlMap } from "./types.js"; + +export type BaseUrlMode = "preserve" | "reset"; + +export const serverBaseUrl = (project: OpenApiProject): string => + project.servers[0]?.url ?? ""; + +export const applyProjectBaseUrl = ( + current: ProjectBaseUrlMap, + project: OpenApiProject, + mode: BaseUrlMode, + fallback = "https://api.example.com" +): ProjectBaseUrlMap => ({ + ...current, + [project.id]: mode === "reset" + ? serverBaseUrl(project) + : (current[project.id] ?? serverBaseUrl(project)) || fallback +}); diff --git a/apps/web/src/app/curl-actions.ts b/apps/web/src/app/curl-actions.ts new file mode 100644 index 0000000..a317ae2 --- /dev/null +++ b/apps/web/src/app/curl-actions.ts @@ -0,0 +1,101 @@ +import type { OpenApiProject } from "@specdock/core"; +import { appendCurlCommandToSpec, importCurlCommand } from "../curl-import.js"; +import { persistProjectFromSpecText } from "../workspace.js"; +import type { BaseUrlMode } from "./base-url.js"; +import { createOperationKey } from "./request-utils.js"; +import type { useSpecDockState } from "./useSpecDockState.js"; + +type State = ReturnType; +type ActivateProject = ( + project: OpenApiProject, + message: string, + options?: { previousProjectForDiff?: OpenApiProject; baseUrlMode?: BaseUrlMode } +) => void; + +export const createCurlActions = ( + state: State, + activateProject: ActivateProject, + refreshStoredProjects: (projectId?: string) => void +) => { + const importCurl = () => { + try { + const imported = importCurlCommand(state.curlInput, state.defaultRequestMode); + const project = persistProjectFromSpecText(state.storageAdapter, imported.specText, { type: "curl" }); + const operation = project.operations.find((candidate) => candidate.id === imported.operationId); + if (!operation) { + throw new Error("Imported cURL did not produce an operation."); + } + + refreshStoredProjects(project.id); + activateProject(project, `Imported cURL as ${operation.method} ${operation.path}`, { + baseUrlMode: "reset" + }); + state.setSpecText(imported.specText); + state.setCurrentSource({ type: "curl" }); + state.setBaseUrlsByProject((current) => ({ ...current, [project.id]: imported.baseUrl })); + state.setSelectedOperationId(operation.id); + saveImportedRequestState(state, project, operation.id, imported.requestState); + } catch (error) { + state.setStatus(error instanceof Error ? error.message : "Unable to import cURL."); + } + }; + + const appendCurlToActiveProject = () => { + if (!state.activeProject) { + state.setStatus("Open or import a project before adding cURL."); + return; + } + + try { + const previousProject = state.activeProject; + const imported = appendCurlCommandToSpec( + state.activeProject.spec, + state.curlInput, + state.defaultRequestMode + ); + const project = persistProjectFromSpecText( + state.storageAdapter, + imported.specText, + { type: "curl" }, + state.activeProject + ); + const operation = project.operations.find((candidate) => candidate.id === imported.operationId); + if (!operation) { + throw new Error("Imported cURL did not produce an operation."); + } + + refreshStoredProjects(project.id); + activateProject(project, `Added ${operation.method} ${operation.path} to ${project.name}`, { + previousProjectForDiff: previousProject, + baseUrlMode: "preserve" + }); + state.setSpecText(imported.specText); + state.setCurrentSource({ type: "curl" }); + state.setBaseUrlsByProject((current) => ({ + ...current, + [project.id]: current[project.id] || imported.baseUrl + })); + state.setSelectedOperationId(operation.id); + saveImportedRequestState(state, project, operation.id, imported.requestState); + } catch (error) { + state.setStatus(error instanceof Error ? error.message : "Unable to add cURL to project."); + } + }; + + return { importCurl, appendCurlToActiveProject }; +}; + +const saveImportedRequestState = ( + state: State, + project: OpenApiProject, + operationId: string, + requestState: State["requestStates"][string] +) => { + state.setRequestStates((current) => ({ + ...current, + [createOperationKey(project.id, operationId)]: { + ...requestState, + operationId + } + })); +}; diff --git a/apps/web/src/app/project-actions.ts b/apps/web/src/app/project-actions.ts index c84d27c..b325c84 100644 --- a/apps/web/src/app/project-actions.ts +++ b/apps/web/src/app/project-actions.ts @@ -23,6 +23,7 @@ export const createProjectActions = ( state.setHistoryCount(state.storageAdapter.getHistory().length); state.setBaseUrlsByProject((current) => omitProjectKey(current, project.id)); state.setRequestStates((current) => omitProjectOperationKeys(current, project.id)); + state.setRequestBodyFilesByOperation((current) => omitProjectOperationKeys(current, project.id)); state.setExchangesByOperation((current) => { const next = Object.fromEntries( Object.entries(current).filter(([, exchange]) => exchange.projectId !== project.id) diff --git a/apps/web/src/app/project-transfer-actions.ts b/apps/web/src/app/project-transfer-actions.ts new file mode 100644 index 0000000..fd91b49 --- /dev/null +++ b/apps/web/src/app/project-transfer-actions.ts @@ -0,0 +1,66 @@ +import type { OpenApiProject, RequestState } from "@specdock/core"; +import { persistProjectFromSpecText } from "../workspace.js"; +import { downloadTextFile } from "./controller-helpers.js"; +import { hydrateGenerateOptions } from "./generate-options.js"; +import { createProjectExport, parseProjectExport } from "./project-transfer.js"; +import { createOperationKey } from "./request-utils.js"; +import type { useSpecDockState } from "./useSpecDockState.js"; + +type State = ReturnType; + +export const createProjectTransferActions = ( + state: State, + activateProject: (project: OpenApiProject, message: string) => void, + refreshStoredProjects: (projectId?: string) => void +) => { + const importProjectExport = (text: string) => { + try { + const payload = parseProjectExport(text); + const project = persistProjectFromSpecText( + state.storageAdapter, + JSON.stringify(payload.project.spec, null, 2), + { type: "raw" } + ); + const rekeyedRequestStates = Object.fromEntries( + Object.entries(payload.preferences.requestStates).map(([operationId, requestState]) => [ + createOperationKey(project.id, operationId), + { ...(requestState as RequestState), operationId } + ]) + ); + + refreshStoredProjects(project.id); + activateProject(project, `Imported ${project.name} workspace`); + state.setBaseUrlsByProject((current) => ({ + ...current, + [project.id]: payload.preferences.baseUrl ?? project.servers[0]?.url ?? "" + })); + state.setRequestStates((current) => ({ ...current, ...rekeyedRequestStates })); + state.setGenerateOptions( + hydrateGenerateOptions( + state.storageAdapter.getSettings().defaultClient, + payload.preferences.generateOptions + ) + ); + state.setCurrentSource({ type: "raw" }); + } catch (error) { + state.setStatus(error instanceof Error ? error.message : "Unable to import SpecDock project."); + } + }; + + const exportProject = (project: OpenApiProject) => { + const content = createProjectExport({ + project, + baseUrl: state.baseUrlsByProject[project.id], + requestStates: state.requestStates, + generateOptions: state.generateOptions + }); + downloadTextFile(`${safeFileName(project.name)}.specdock.json`, content); + state.setStatus(`Exported ${project.name}`); + }; + + return { importProjectExport, exportProject }; +}; + +const safeFileName = (value: string): string => + value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || + "specdock-project"; diff --git a/apps/web/src/app/project-transfer.test.ts b/apps/web/src/app/project-transfer.test.ts new file mode 100644 index 0000000..6a2dc96 --- /dev/null +++ b/apps/web/src/app/project-transfer.test.ts @@ -0,0 +1,59 @@ +import { describe, expect, it } from "vitest"; +import { defaultGenerateOptions, type OpenApiProject, type RequestState } from "@specdock/core"; +import { createProjectExport, parseProjectExport } from "./project-transfer.js"; + +const project: OpenApiProject = { + id: "project-1", + name: "Transfer API", + source: { type: "raw" }, + specFormat: "openapi3", + spec: { + openapi: "3.1.0", + info: { title: "Transfer API", version: "1.0.0" }, + paths: {} + }, + servers: [{ url: "https://api.example.com" }], + tags: [], + operations: [], + schemas: [], + createdAt: "2026-06-16T00:00:00.000Z", + updatedAt: "2026-06-16T00:00:00.000Z" +}; + +const requestState: RequestState = { + operationId: "listUsers", + authProfileId: "auth-1", + pathParams: { id: "123" }, + queryParams: { include: "profile" }, + headers: { Authorization: "Bearer secret" }, + body: '{"token":"secret"}', + requestMode: "proxy" +}; + +describe("project transfer", () => { + it("exports safe workspace data without request secrets", () => { + const text = createProjectExport({ + project, + baseUrl: "https://api.example.com", + requestStates: { "project-1::listUsers": requestState }, + generateOptions: defaultGenerateOptions + }); + + expect(text).not.toContain("Bearer secret"); + expect(text).not.toContain("token"); + expect(text).not.toContain("Authorization"); + expect(parseProjectExport(text).preferences.requestStates.listUsers).toEqual({ + operationId: "listUsers", + authProfileId: "auth-1", + pathParams: { id: "123" }, + queryParams: { include: "profile" }, + headers: {}, + body: undefined, + requestMode: "proxy" + }); + }); + + it("rejects files that are not SpecDock project exports", () => { + expect(() => parseProjectExport('{"format":"other"}')).toThrow(); + }); +}); diff --git a/apps/web/src/app/project-transfer.ts b/apps/web/src/app/project-transfer.ts new file mode 100644 index 0000000..3550271 --- /dev/null +++ b/apps/web/src/app/project-transfer.ts @@ -0,0 +1,96 @@ +import { z } from "zod"; +import { + defaultGenerateOptions, + type GenerateOptions, + type OpenApiProject, + type RequestState +} from "@specdock/core"; +import { + hydrateStoredRequestStates, + sanitizeRequestStatesForStorage +} from "./request-state-storage.js"; + +const requestStateSchema = z.object({ + operationId: z.string(), + authProfileId: z.string().optional(), + pathParams: z.record(z.string()), + queryParams: z.record(z.string()), + requestMode: z.enum(["direct", "proxy"]) +}); + +const exportSchema = z.object({ + format: z.literal("specdock.project"), + version: z.literal(1), + exportedAt: z.string(), + project: z.object({ + name: z.string(), + source: z.unknown(), + specFormat: z.enum(["openapi3", "swagger2"]).optional(), + spec: z.unknown() + }), + preferences: z.object({ + baseUrl: z.string().optional(), + requestStates: z.record(requestStateSchema).default({}), + generateOptions: z.object({ + language: z.enum(["typescript", "python", "go", "java", "csharp", "php"]).default(defaultGenerateOptions.language), + client: z.enum(["fetch", "axios"]).default(defaultGenerateOptions.client), + generateTypes: z.boolean().default(defaultGenerateOptions.generateTypes), + generateReactQuery: z.boolean().default(defaultGenerateOptions.generateReactQuery), + generateZod: z.boolean().default(defaultGenerateOptions.generateZod), + outputPath: z.string().default(defaultGenerateOptions.outputPath), + namingStyle: z.enum(["operationId", "camelCase"]).default(defaultGenerateOptions.namingStyle), + packageName: z.string().default(defaultGenerateOptions.packageName), + clientName: z.string().default(defaultGenerateOptions.clientName), + baseUrlStrategy: z.enum(["constructor", "perRequest"]).default(defaultGenerateOptions.baseUrlStrategy) + }).partial().default({}) + }) +}); + +export type ProjectImportPayload = z.infer; + +export const createProjectExport = ({ + project, + baseUrl, + requestStates, + generateOptions +}: { + project: OpenApiProject; + baseUrl?: string; + requestStates: Record; + generateOptions: GenerateOptions; +}): string => { + const operationPrefix = `${project.id}::`; + const safeRequestStates = Object.fromEntries( + Object.entries(sanitizeRequestStatesForStorage(requestStates)) + .filter(([key]) => key.startsWith(operationPrefix)) + .map(([key, value]) => [key.slice(operationPrefix.length), value]) + ); + + return JSON.stringify({ + format: "specdock.project", + version: 1, + exportedAt: new Date().toISOString(), + project: { + name: project.name, + source: project.source, + specFormat: project.specFormat, + spec: project.spec + }, + preferences: { + baseUrl, + requestStates: safeRequestStates, + generateOptions + } + }, null, 2); +}; + +export const parseProjectExport = (text: string): ProjectImportPayload => { + const parsed = exportSchema.parse(JSON.parse(text)) as ProjectImportPayload; + return { + ...parsed, + preferences: { + ...parsed.preferences, + requestStates: hydrateStoredRequestStates(parsed.preferences.requestStates) + } + }; +}; diff --git a/apps/web/src/app/request-actions.ts b/apps/web/src/app/request-actions.ts index 0396068..3c72d46 100644 --- a/apps/web/src/app/request-actions.ts +++ b/apps/web/src/app/request-actions.ts @@ -104,6 +104,27 @@ export const createRequestActions = (state: State) => { } }); }; + const updateRequestBodyFile = ( + operationKey: string, + name: string, + file: File | undefined + ) => { + state.setRequestBodyFilesByOperation((current) => { + const currentFiles = current[operationKey] ?? {}; + const nextFiles = { ...currentFiles }; + + if (file) { + nextFiles[name] = file; + } else { + delete nextFiles[name]; + } + + return { + ...current, + [operationKey]: nextFiles + }; + }); + }; const fillRequestBodyExample = () => { if (!state.selectedOperation || !state.operationKey || !state.requestBodyExample) return; @@ -174,6 +195,7 @@ export const createRequestActions = (state: State) => { renameRecordField, removeRecordField, addHeader, + updateRequestBodyFile, fillRequestBodyExample, executeRequest }; diff --git a/apps/web/src/app/request-utils.ts b/apps/web/src/app/request-utils.ts index b76fe1d..06d8549 100644 --- a/apps/web/src/app/request-utils.ts +++ b/apps/web/src/app/request-utils.ts @@ -2,12 +2,21 @@ import type { ApiRequest, ResponseViewModel } from "../request.js"; import type { ApiErrorResponse } from "./types.js"; export const executeProxyRequest = async (request: ApiRequest): Promise => { + if (request.body !== undefined && typeof request.body !== "string") { + throw new Error("Proxy Mode supports text request bodies only. Use Direct Browser Mode for file uploads."); + } + const response = await fetch("/api/proxy/request", { method: "POST", headers: { "content-type": "application/json" }, - body: JSON.stringify(request) + body: JSON.stringify({ + url: request.url, + method: request.method, + headers: request.headers, + body: request.body + }) }); const text = await response.text(); diff --git a/apps/web/src/app/sdk-diff.test.ts b/apps/web/src/app/sdk-diff.test.ts index 4884d1e..5b478f8 100644 --- a/apps/web/src/app/sdk-diff.test.ts +++ b/apps/web/src/app/sdk-diff.test.ts @@ -68,23 +68,22 @@ describe("sdk diff", () => { }); it("does not diff generated files across SDK languages", () => { - const typescriptTarget = generatedFilesTargetFromOptions({ + const baseOptions = { language: "typescript", client: "fetch", generateTypes: true, generateReactQuery: false, generateZod: false, outputPath: "generated", - namingStyle: "operationId" - }); + namingStyle: "operationId", + packageName: "specdock-generated-client", + clientName: "SpecDockClient", + baseUrlStrategy: "constructor" + } as const; + const typescriptTarget = generatedFilesTargetFromOptions(baseOptions); const javaTarget = generatedFilesTargetFromOptions({ - language: "java", - client: "fetch", - generateTypes: true, - generateReactQuery: false, - generateZod: false, - outputPath: "generated", - namingStyle: "operationId" + ...baseOptions, + language: "java" }); expect(canDiffGeneratedFiles(typescriptTarget, typescriptTarget)).toBe(true); diff --git a/apps/web/src/app/types.ts b/apps/web/src/app/types.ts index 4138487..bf33c8b 100644 --- a/apps/web/src/app/types.ts +++ b/apps/web/src/app/types.ts @@ -27,6 +27,7 @@ export type ApiErrorResponse = { }; export type RequestStateMap = Record; +export type RequestBodyFileMap = Record>; export type ProjectBaseUrlMap = Record; export type ResponseScope = "operation" | "latest"; export type ThemeMode = "dark" | "light"; diff --git a/apps/web/src/app/useSpecDockController.ts b/apps/web/src/app/useSpecDockController.ts index 4e8ed2e..0721197 100644 --- a/apps/web/src/app/useSpecDockController.ts +++ b/apps/web/src/app/useSpecDockController.ts @@ -1,15 +1,16 @@ import type React from "react"; import { type GenerateOptions, type OpenApiProject } from "@specdock/core"; import { importOpenApiFromUrl } from "../import-url.js"; -import { importCurlCommand } from "../curl-import.js"; import { persistProjectFromSpecText } from "../workspace.js"; import { createAuthActions } from "./auth-actions.js"; +import { applyProjectBaseUrl, type BaseUrlMode } from "./base-url.js"; import { downloadSdkZip, downloadTextFile, generateSdkFiles } from "./controller-helpers.js"; +import { createCurlActions } from "./curl-actions.js"; import { directRequestBlockReason } from "./deployment-policy.js"; import { createHttpCollection } from "./http-collection.js"; import { createProjectActions } from "./project-actions.js"; +import { createProjectTransferActions } from "./project-transfer-actions.js"; import { createRequestActions } from "./request-actions.js"; -import { createOperationKey } from "./request-utils.js"; import { canDiffGeneratedFiles, diffGeneratedFiles, generatedFilesTargetFromOptions } from "./sdk-diff.js"; import { useSpecDockState } from "./useSpecDockState.js"; @@ -21,11 +22,7 @@ export const useSpecDockController = () => { state.setHistoryCount(state.storageAdapter.getHistory().length); state.setActiveProjectId(projectId ?? state.storageAdapter.getActiveProjectId()); }; - const activateProject = ( - project: OpenApiProject, - message: string, - previousProjectForDiff?: OpenApiProject - ) => { + const activateProject = (project: OpenApiProject, message: string, options: { previousProjectForDiff?: OpenApiProject; baseUrlMode?: BaseUrlMode } = {}) => { state.setSpecText(JSON.stringify(project.spec, null, 2)); state.setFiles([]); state.setGeneratedDiff(undefined); @@ -33,12 +30,9 @@ export const useSpecDockController = () => { state.setSelectedPath(undefined); state.setGenerateMeta(undefined); state.setSearchQuery(""); - state.setBaseUrlsByProject((current) => ({ - ...current, - [project.id]: current[project.id] ?? project.servers[0]?.url ?? "" - })); + state.setBaseUrlsByProject((current) => applyProjectBaseUrl(current, project, options.baseUrlMode ?? "preserve", "")); state.setSelectedOperationId(project.operations[0]?.id); - state.setPreviousProjectForDiff(previousProjectForDiff); + state.setPreviousProjectForDiff(options.previousProjectForDiff); state.setActiveProjectId(project.id); state.storageAdapter.saveActiveProjectId(project.id); state.setStatus(message); @@ -49,17 +43,9 @@ export const useSpecDockController = () => { }; const importCurrentSpec = () => { const previousProject = state.activeProject; - const project = persistProjectFromSpecText( - state.storageAdapter, - state.specText, - state.currentSource, - state.activeProject - ); + const project = persistProjectFromSpecText(state.storageAdapter, state.specText, state.currentSource, state.activeProject); refreshStoredProjects(project.id); - state.setBaseUrlsByProject((current) => ({ - ...current, - [project.id]: current[project.id] ?? project.servers[0]?.url ?? state.selectedBaseUrl - })); + state.setBaseUrlsByProject((current) => ({ ...current, [project.id]: current[project.id] ?? project.servers[0]?.url ?? state.selectedBaseUrl })); state.setSelectedOperationId(project.operations[0]?.id); state.setPreviousProjectForDiff(previousProject); return project; @@ -69,13 +55,10 @@ export const useSpecDockController = () => { state.setStatus("Importing OpenAPI URL"); try { const imported = await importOpenApiFromUrl(state.urlInput); - const project = persistProjectFromSpecText(state.storageAdapter, imported.text, { - type: "url", - url: imported.url - }); + const project = persistProjectFromSpecText(state.storageAdapter, imported.text, { type: "url", url: imported.url }); state.setSpecText(imported.text); refreshStoredProjects(project.id); - activateProject(project, `Imported ${project.name} from URL`); + activateProject(project, `Imported ${project.name} from URL`, { baseUrlMode: "reset" }); state.setCurrentSource({ type: "url", url: imported.url }); } catch (error) { state.setStatus(error instanceof Error ? error.message : "Unable to import OpenAPI URL."); @@ -89,42 +72,23 @@ export const useSpecDockController = () => { state.setCurrentSource({ type: "raw" }); const project = persistProjectFromSpecText(state.storageAdapter, state.specText, { type: "raw" }, state.activeProject); refreshStoredProjects(project.id); - activateProject(project, `Imported ${project.name}`, previousProject); + activateProject(project, `Imported ${project.name}`, { previousProjectForDiff: previousProject, baseUrlMode: "reset" }); } catch (error) { state.setStatus(error instanceof Error ? error.message : "Unable to import raw OpenAPI."); } }; - const importCurl = () => { - try { - const imported = importCurlCommand(state.curlInput, state.defaultRequestMode); - const project = persistProjectFromSpecText(state.storageAdapter, imported.specText, { type: "curl" }); - const operation = project.operations.find((candidate) => candidate.id === imported.operationId); - if (!operation) { - throw new Error("Imported cURL did not produce an operation."); - } - - refreshStoredProjects(project.id); - activateProject(project, `Imported cURL as ${operation.method} ${operation.path}`); - state.setSpecText(imported.specText); - state.setCurrentSource({ type: "curl" }); - state.setBaseUrlsByProject((current) => ({ ...current, [project.id]: imported.baseUrl })); - state.setSelectedOperationId(operation.id); - state.setRequestStates((current) => ({ - ...current, - [createOperationKey(project.id, operation.id)]: { - ...imported.requestState, - operationId: operation.id - } - })); - } catch (error) { - state.setStatus(error instanceof Error ? error.message : "Unable to import cURL."); - } - }; const uploadSpec = (event: React.ChangeEvent) => { const file = event.currentTarget.files?.[0]; if (!file) return; const reader = new FileReader(); - reader.onload = () => importUploadedText(file.name, String(reader.result ?? "")); + reader.onload = () => { + const text = String(reader.result ?? ""); + if (file.name.endsWith(".specdock.json")) { + projectTransferActions.importProjectExport(text); + } else { + importUploadedText(file.name, text); + } + }; reader.readAsText(file); }; const importUploadedText = (fileName: string, text: string) => { @@ -137,7 +101,7 @@ export const useSpecDockController = () => { try { const project = persistProjectFromSpecText(state.storageAdapter, text, { type: "file", fileName }); refreshStoredProjects(project.id); - activateProject(project, `Imported ${project.name} from ${fileName}`); + activateProject(project, `Imported ${project.name} from ${fileName}`, { baseUrlMode: "reset" }); state.setCurrentSource({ type: "file", fileName }); } catch (error) { state.setActiveProjectId(undefined); @@ -194,6 +158,8 @@ export const useSpecDockController = () => { }; const requestActions = createRequestActions(state); const projectActions = createProjectActions(state, activateProject); + const projectTransferActions = createProjectTransferActions(state, activateProject, refreshStoredProjects); + const curlActions = createCurlActions(state, activateProject, refreshStoredProjects); const authActions = createAuthActions(state); const requestExecutionBlockReason = directRequestBlockReason( state.appConfig, @@ -234,8 +200,9 @@ export const useSpecDockController = () => { }, openProject, ...projectActions, + ...projectTransferActions, + ...curlActions, importFromUrl, - importCurl, importRawSpec, uploadSpec, ...requestActions, diff --git a/apps/web/src/app/useSpecDockDerivedState.ts b/apps/web/src/app/useSpecDockDerivedState.ts index eab2381..4cf12f2 100644 --- a/apps/web/src/app/useSpecDockDerivedState.ts +++ b/apps/web/src/app/useSpecDockDerivedState.ts @@ -24,6 +24,7 @@ import { createOperationKey } from "./request-utils.js"; import type { ExchangeMap, ProjectBaseUrlMap, + RequestBodyFileMap, RequestStateMap, ResponseScope } from "./types.js"; @@ -34,6 +35,7 @@ type DerivedStateInput = { activeProjectId?: string; selectedOperationId?: string; requestStates: RequestStateMap; + requestBodyFilesByOperation: RequestBodyFileMap; authProfiles: AuthProfile[]; defaultRequestMode: RequestState["requestMode"]; baseUrlsByProject: ProjectBaseUrlMap; @@ -51,6 +53,7 @@ export const useSpecDockDerivedState = ({ activeProjectId, selectedOperationId, requestStates, + requestBodyFilesByOperation, authProfiles, defaultRequestMode, baseUrlsByProject, @@ -144,9 +147,10 @@ export const useSpecDockDerivedState = ({ () => selectedOperation ? getRequestBodySchemaFields(selectedOperation, activeProject?.spec) - : [], + : [], [activeProject?.spec, selectedOperation] ); + const requestBodyFiles = operationKey ? (requestBodyFilesByOperation[operationKey] ?? {}) : {}; const builtRequest = useMemo(() => { if (!selectedOperation || !requestState || !selectedBaseUrl.trim()) { return undefined; @@ -154,14 +158,14 @@ export const useSpecDockDerivedState = ({ try { return applyAuthProfileToRequest( - buildApiRequest(selectedOperation, requestState, selectedBaseUrl), + buildApiRequest(selectedOperation, requestState, selectedBaseUrl, requestBodyFiles), selectedAuthProfile, { requestMode: requestState.requestMode } ); } catch { return undefined; } - }, [requestState, selectedAuthProfile, selectedBaseUrl, selectedOperation]); + }, [requestBodyFiles, requestState, selectedAuthProfile, selectedBaseUrl, selectedOperation]); const displayedExchange = responseScope === "latest" ? exchangesByOperation[latestExchangeKey ?? ""] @@ -198,6 +202,7 @@ export const useSpecDockDerivedState = ({ diffFindings, requestBodyExample, requestBodyFields, + requestBodyFiles, builtRequest, displayedExchange, displayedContext, diff --git a/apps/web/src/app/useSpecDockState.ts b/apps/web/src/app/useSpecDockState.ts index 6c9fcb0..64b2a65 100644 --- a/apps/web/src/app/useSpecDockState.ts +++ b/apps/web/src/app/useSpecDockState.ts @@ -30,6 +30,7 @@ import { sanitizeRequestStatesForStorage } from "./request-state-storage.js"; import type { GeneratedFilesDiff, GeneratedFilesTarget } from "./sdk-diff.js"; +import { applyProjectBaseUrl } from "./base-url.js"; import { hydrateGenerateOptions } from "./generate-options.js"; import { useAppConfig } from "./useAppConfig.js"; import { useSpecDockDerivedState } from "./useSpecDockDerivedState.js"; @@ -37,6 +38,7 @@ import type { ExchangeMap, GenerateMeta, ProjectBaseUrlMap, + RequestBodyFileMap, RequestStateMap, ResponseScope, ThemeMode @@ -66,6 +68,7 @@ export const useSpecDockState = () => { const [requestStates, setRequestStates] = useState(() => hydrateStoredRequestStates(readLocalJson(requestStatesStorageKey, {})) ); + const [requestBodyFilesByOperation, setRequestBodyFilesByOperation] = useState({}); const [authProfiles, setAuthProfiles] = useState(() => storageAdapter.getAuthProfiles() ); @@ -106,6 +109,7 @@ export const useSpecDockState = () => { activeProjectId, selectedOperationId, requestStates, + requestBodyFilesByOperation, authProfiles, defaultRequestMode, baseUrlsByProject, @@ -130,13 +134,7 @@ export const useSpecDockState = () => { if (!activeProject) return; - setBaseUrlsByProject((current) => ({ - ...current, - [activeProject.id]: - current[activeProject.id] ?? - activeProject.servers[0]?.url ?? - "https://api.example.com" - })); + setBaseUrlsByProject((current) => applyProjectBaseUrl(current, activeProject, "preserve")); setSelectedOperationId((current) => current && activeProject.operations.some((operation) => operation.id === current) @@ -210,10 +208,13 @@ export const useSpecDockState = () => { setSelectedOperationId, requestStates, setRequestStates, + requestBodyFilesByOperation, + setRequestBodyFilesByOperation, authProfiles, setAuthProfiles, defaultRequestMode, setDefaultRequestMode, + baseUrlsByProject, setBaseUrlsByProject, files, setFiles, diff --git a/apps/web/src/components/GeneratePanel.tsx b/apps/web/src/components/GeneratePanel.tsx index 992a393..36db4b4 100644 --- a/apps/web/src/components/GeneratePanel.tsx +++ b/apps/web/src/components/GeneratePanel.tsx @@ -65,6 +65,24 @@ export const GeneratePanel = ({ onChange={(event) => onOptionsChange({ outputPath: event.target.value })} /> + + onOptionsChange({ namingStyle })} /> + onOptionsChange({ baseUrlStrategy })} + />
{options.language === "typescript" ? ( diff --git a/apps/web/src/components/ImportPanelCards.tsx b/apps/web/src/components/ImportPanelCards.tsx index 23d8c47..2c37f56 100644 --- a/apps/web/src/components/ImportPanelCards.tsx +++ b/apps/web/src/components/ImportPanelCards.tsx @@ -1,4 +1,4 @@ -import { Link, Terminal, Trash2, Upload, Wand2 } from "lucide-react"; +import { Download, Link, Plus, Terminal, Trash2, Upload, Wand2 } from "lucide-react"; import type React from "react"; import type { OpenApiProject } from "@specdock/core"; import type { PanelId } from "../app/usePanelLayout.js"; @@ -12,12 +12,14 @@ export type ImportPanelCardsProps = { curlInput: string; isImportingUrl: boolean; onOpenProject(project: OpenApiProject): void; + onExportProject(project: OpenApiProject): void; onDeleteProject(project: OpenApiProject): void; onSpecTextChange(value: string): void; onUrlInputChange(value: string): void; onCurlInputChange(value: string): void; onUrlImport(): void; onCurlImport(): void; + onCurlAppend(): void; onRawImport(): void; onUpload(event: React.ChangeEvent): void; getPanelReorderProps(panelId: PanelId): PanelReorderProps; @@ -37,6 +39,7 @@ const LocalProjectsPanel = ({ projects, activeProjectId, onOpenProject, + onExportProject, onDeleteProject, getPanelReorderProps }: ImportPanelCardsProps) => ( @@ -61,16 +64,27 @@ const LocalProjectsPanel = ({ {project.operations.length} operations - {project.schemas.length} schemas - {activeProjectId === project.id ? Active : null} - +
+ {activeProjectId === project.id ? Active : null} + + +
)) )} @@ -79,6 +93,7 @@ const LocalProjectsPanel = ({ ); const ImportSpecPanel = ({ + activeProjectId, specText, urlInput, curlInput, @@ -88,6 +103,7 @@ const ImportSpecPanel = ({ onCurlInputChange, onUrlImport, onCurlImport, + onCurlAppend, onRawImport, onUpload, getPanelReorderProps @@ -100,7 +116,7 @@ const ImportSpecPanel = ({ } > @@ -119,15 +135,26 @@ const ImportSpecPanel = ({
cURL request - +
+ + +