Skip to content

Commit c1c9aac

Browse files
os-zhuangclaude
andcommitted
feat(spec)!: remove the never-implemented GraphQL surface (#2462 follow-on)
Product decision: GraphQL is not on the plan. It was schema-only from day one — 20+ spec config schemas, an unconditionally-501 handleGraphQL (kernel.graphql never assigned in the monorepo), and THREE separate mounts (dispatcher if-chain, dispatcher-plugin hono route, hono adapter) advertising the dead endpoint: the "declared ≠ mounted ≠ implemented" seam disease in one picture. Removed: spec schemas/contracts/enum members (CoreServiceName, ApiProtocolType, query dialects, graphql-playground), capability booleans, discovery/router fields, all three runtime mounts, the discovery advertisement, plugin-dev stubs, the now-dead resolveRequestExecutionContext, qa conformance rows + ratchet pins + dogfood surface cases, generated JSON-schema manifest keys + reference docs, and handwritten doc mentions. Kept deliberately: external-datasource 'graphql' protocol option (third parties may speak GraphQL to us as a CLIENT) and cloud's reserved slug. objectui's own dead 'graphql' union member noted for cross-repo cleanup. Verified: full monorepo build+test forced, 131 tasks green (spec 6675, core 386, runtime 647, dogfood 60, conformance 41 among them); api-surface + json-schema manifest + reference docs regenerated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 6163393 commit c1c9aac

57 files changed

Lines changed: 129 additions & 3756 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
"@objectstack/spec": major
3+
---
4+
5+
feat(spec)!: remove the never-implemented GraphQL surface from the product plan (#2462 follow-on)
6+
7+
GraphQL was schema-only from day one: the spec shipped 20+ config schemas
8+
(`GraphQLTypeConfig`, federation, persisted queries, …), the dispatcher's
9+
`handleGraphQL` answered 501 unconditionally (`kernel.graphql` was never
10+
assigned in the monorepo), and THREE separate mounts advertised the dead
11+
endpoint. Per the product decision, the surface is deleted rather than
12+
maintained:
13+
14+
- **spec**: `api/graphql.zod.ts` + `contracts/graphql-service.ts` deleted;
15+
`graphql` removed from `CoreServiceName`, `ApiProtocolType`, the
16+
query-adapter dialects, `graphql-playground` from testing-UI types; the
17+
`graphqlApi`/network capability booleans, discovery/router route fields
18+
dropped. BREAKING for consumers referencing those exports/enum members.
19+
- **runtime**: `handleGraphQL`, the if-chain branch, the dispatcher-plugin
20+
and hono-adapter mounts, discovery advertisement, and the now-dead
21+
`resolveRequestExecutionContext` helper removed.
22+
- **plugin-dev**: the graphql stub family removed.
23+
- **qa**: authz-conformance matrix rows, ratchet high-risk id, discover
24+
patterns and identity pins for the GraphQL surface retired; expression
25+
ledger covers updated.
26+
- **NOT removed**: the `'graphql'` protocol option on external datasource
27+
lookups (third-party systems may speak GraphQL) and cloud's reserved
28+
slug — those are not our API surface.
29+
30+
`/graphql` now 404s (was an unconditional 501); the anonymous-deny posture
31+
matrix shrinks by the two GraphQL rows.

content/docs/plugins/anatomy.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ ObjectStack uses `type` discrimination to optimize runtime behavior, allowing th
9090

9191
### 5. Server Plugin (`server`)
9292
* **Role:** Protocol Gateway.
93-
* **Use Cases:** REST API (`plugin-hono-server`), GraphQL, WebSocket.
93+
* **Use Cases:** REST API (`plugin-hono-server`), WebSocket.
9494
* **Behavior:** Responsible for binding ports and mapping incoming traffic.
9595

9696
### 6. Theme Plugin (`theme`)

content/docs/plugins/development.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ A plugin is a self-contained module that extends the ObjectStack kernel with:
2121
- **Hooks** — React to lifecycle events (before/after record create, update, delete)
2222
- **Objects** — Register new data objects and fields
2323
- **UI Components** — Add custom views, widgets, or actions
24-
- **API Endpoints** — Expose new REST or GraphQL endpoints
24+
- **API Endpoints** — Expose new REST endpoints
2525

2626
---
2727

content/docs/references/api/discovery.mdx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ const result = ApiRoutes.parse(data);
5151
| **automation** | `string` | optional | e.g. /api/v1/automation |
5252
| **storage** | `string` | optional | e.g. /api/v1/storage |
5353
| **analytics** | `string` | optional | e.g. /api/v1/analytics |
54-
| **graphql** | `string` | optional | e.g. /graphql |
5554
| **packages** | `string` | optional | e.g. /api/v1/packages |
5655
| **workflow** | `string` | optional | e.g. /api/v1/workflow |
5756
| **approvals** | `string` | optional | e.g. /api/v1/approvals |
@@ -76,7 +75,7 @@ const result = ApiRoutes.parse(data);
7675
| **locale** | `{ default: string; supported: string[]; timezone: string }` || |
7776
| **services** | `Record<string, { enabled: boolean; status: Enum<'available' \| 'registered' \| 'unavailable' \| 'degraded' \| 'stub'>; handlerReady?: boolean; route?: string; … }>` || Per-service availability map keyed by CoreServiceName |
7877
| **capabilities** | `Record<string, { enabled: boolean; features?: Record<string, boolean>; description?: string }>` | optional | Hierarchical capability descriptors for frontend intelligent adaptation |
79-
| **schemaDiscovery** | `{ openapi?: string; graphql?: string; jsonSchema?: string }` | optional | Schema discovery endpoints for API toolchain integration |
78+
| **schemaDiscovery** | `{ openapi?: string; jsonSchema?: string }` | optional | Schema discovery endpoints for API toolchain integration |
8079
| **metadata** | `Record<string, any>` | optional | Custom metadata key-value pairs for extensibility |
8180

8281

content/docs/references/api/dispatcher.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ const result = DispatcherConfig.parse(data);
5151

5252
| Property | Type | Required | Description |
5353
| :--- | :--- | :--- | :--- |
54-
| **routes** | `{ prefix: string; service: Enum<'metadata' \| 'data' \| 'auth' \| 'file-storage' \| 'search' \| 'cache' \| 'queue' \| 'automation' \| 'graphql' \| 'analytics' \| 'realtime' \| 'job' \| 'notification' \| 'ai' \| 'i18n' \| 'ui' \| 'workflow'>; authRequired: boolean; criticality: Enum<'required' \| 'core' \| 'optional'>; … }[]` || Route-to-service mappings |
54+
| **routes** | `{ prefix: string; service: Enum<'metadata' \| 'data' \| 'auth' \| 'file-storage' \| 'search' \| 'cache' \| 'queue' \| 'automation' \| 'analytics' \| 'realtime' \| 'job' \| 'notification' \| 'ai' \| 'i18n' \| 'ui' \| 'workflow'>; authRequired: boolean; criticality: Enum<'required' \| 'core' \| 'optional'>; … }[]` || Route-to-service mappings |
5555
| **fallback** | `Enum<'404' \| 'proxy' \| 'custom'>` || Behavior when no route matches |
5656
| **proxyTarget** | `string` | optional | Proxy target URL when fallback is "proxy" |
5757

@@ -91,7 +91,7 @@ const result = DispatcherConfig.parse(data);
9191
| Property | Type | Required | Description |
9292
| :--- | :--- | :--- | :--- |
9393
| **prefix** | `string` || URL path prefix for routing (e.g. /api/v1/data) |
94-
| **service** | `Enum<'metadata' \| 'data' \| 'auth' \| 'file-storage' \| 'search' \| 'cache' \| 'queue' \| 'automation' \| 'graphql' \| 'analytics' \| 'realtime' \| 'job' \| 'notification' \| 'ai' \| 'i18n' \| 'ui' \| 'workflow'>` || Target core service name |
94+
| **service** | `Enum<'metadata' \| 'data' \| 'auth' \| 'file-storage' \| 'search' \| 'cache' \| 'queue' \| 'automation' \| 'analytics' \| 'realtime' \| 'job' \| 'notification' \| 'ai' \| 'i18n' \| 'ui' \| 'workflow'>` || Target core service name |
9595
| **authRequired** | `boolean` || Whether authentication is required |
9696
| **criticality** | `Enum<'required' \| 'core' \| 'optional'>` || Service criticality level for unavailability handling |
9797
| **permissions** | `string[]` | optional | Required permissions for this route namespace |

content/docs/references/api/documentation.mdx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ API Documentation & Testing Interface Protocol
99

1010
Provides schemas for generating interactive API documentation and testing
1111

12-
interfaces similar to Swagger UI, GraphQL Playground, Postman, etc.
12+
interfaces similar to Swagger UI, Postman, etc.
1313

1414
Features:
1515

@@ -29,8 +29,6 @@ Architecture Alignment:
2929

3030
- Postman: API testing collections
3131

32-
- GraphQL Playground: GraphQL-specific testing
33-
3432
- Redoc: Documentation rendering
3533

3634
@example Documentation Config
@@ -102,7 +100,7 @@ const result = ApiChangelogEntry.parse(data);
102100
| **version** | `string` || API version |
103101
| **description** | `string` | optional | API description |
104102
| **servers** | `{ url: string; description?: string; variables?: Record<string, { default: string; description?: string; enum?: string[] }> }[]` || API server URLs |
105-
| **ui** | `{ type: Enum<'swagger-ui' \| 'redoc' \| 'rapidoc' \| 'stoplight' \| 'scalar' \| 'graphql-playground' \| 'graphiql' \| 'postman' \| 'custom'>; path: string; theme: Enum<'light' \| 'dark' \| 'auto'>; enableTryItOut: boolean; … }` | optional | Testing UI configuration |
103+
| **ui** | `{ type: Enum<'swagger-ui' \| 'redoc' \| 'rapidoc' \| 'stoplight' \| 'scalar' \| 'graphiql' \| 'postman' \| 'custom'>; path: string; theme: Enum<'light' \| 'dark' \| 'auto'>; enableTryItOut: boolean; … }` | optional | Testing UI configuration |
106104
| **generateOpenApi** | `boolean` || Generate OpenAPI 3.0 specification |
107105
| **generateTestCollections** | `boolean` || Generate API test collections |
108106
| **testCollections** | `{ name: string; description?: string; variables: Record<string, any>; requests: { name: string; description?: string; method: Enum<'GET' \| 'POST' \| 'PUT' \| 'PATCH' \| 'DELETE' \| 'HEAD' \| 'OPTIONS'>; url: string; … }[]; … }[]` || Predefined test collections |
@@ -158,7 +156,7 @@ const result = ApiChangelogEntry.parse(data);
158156

159157
| Property | Type | Required | Description |
160158
| :--- | :--- | :--- | :--- |
161-
| **type** | `Enum<'swagger-ui' \| 'redoc' \| 'rapidoc' \| 'stoplight' \| 'scalar' \| 'graphql-playground' \| 'graphiql' \| 'postman' \| 'custom'>` || Testing UI implementation |
159+
| **type** | `Enum<'swagger-ui' \| 'redoc' \| 'rapidoc' \| 'stoplight' \| 'scalar' \| 'graphiql' \| 'postman' \| 'custom'>` || Testing UI implementation |
162160
| **path** | `string` || URL path for documentation UI |
163161
| **theme** | `Enum<'light' \| 'dark' \| 'auto'>` || UI color theme |
164162
| **enableTryItOut** | `boolean` || Enable interactive API testing |
@@ -183,7 +181,6 @@ const result = ApiChangelogEntry.parse(data);
183181
* `rapidoc`
184182
* `stoplight`
185183
* `scalar`
186-
* `graphql-playground`
187184
* `graphiql`
188185
* `postman`
189186
* `custom`

0 commit comments

Comments
 (0)