Files
apophis-fastify/docs/attic/root-history/NEXT_STEPS_424.md
T

3.0 KiB

NEXT_STEPS_424.md

Status

v1.1 released 2026-04-24. All planned features complete. 468 tests passing.

Completed

Feature Tests Files
Core Extension Points 14 src/extension/types.ts, src/extension/registry.ts, src/formula/parser.ts
Multipart Uploads 9 src/types.ts, src/domain/schema-to-arbitrary.ts, src/domain/request-builder.ts, src/infrastructure/http-executor.ts, src/formula/evaluator.ts
Streaming / NDJSON 7 src/types.ts, src/infrastructure/http-executor.ts, src/formula/evaluator.ts
Extension System Polish 5 src/plugin/index.ts, src/domain/contract-validation.ts
SSE Extension 7 src/extensions/sse/
Serializers Extension 4 src/extensions/serializers/
WebSockets Extension 5 src/extensions/websocket/
Code Cleanup 5 src/formula/evaluator.ts, src/domain/error-suggestions.ts, src/extension/registry.ts, src/test/helpers.ts, src/test/runner-utils.ts

Architecture

Core vs Extensions

Core features require changes to the schema-to-arbitrary pipeline or HTTP executor:

  • Multipart uploads
  • Streaming/NDJSON
  • Timeouts, redirects

Extensions are opt-in modules:

  • SSE: specialized parser
  • Serializers: external dependencies (protobuf, msgpack)
  • WebSockets: different protocol

Extension Registration

await fastify.register(apophis, {
  extensions: [
    sseExtension,
    createSerializerExtension(registry),
    websocketExtension,
  ]
})

Each extension provides:

  • headers: APOSTL operations for parser validation
  • predicates: custom formula evaluation
  • onBuildRequest / onBeforeRequest / onAfterRequest: lifecycle hooks
  • onSuiteStart / onSuiteEnd: suite-level hooks

Test Strategy

First-Class Features

Red-green-refactor cycle:

  1. Add operation to parser
  2. Add parser test
  3. Add operation to evaluator
  4. Add evaluator test
  5. Add HTTP executor support
  6. Add integration test with Fastify
  7. Add schema-to-arbitrary support (for multipart)
  8. Add generation test
  9. Add request builder support
  10. Add end-to-end test

Extensions

Self-contained modules with own test suites:

// src/extensions/NAME/test.ts
import { test } from 'node:test'
import assert from 'node:assert'
import { extension } from './extension.js'

test('predicate returns correct value', () => {
  const resolver = extension.predicates!.predicate_name
  const result = resolver(mockContext)
  assert.strictEqual(result.value, expected)
})

Migration

v1.0 → v1.1

No breaking changes.

To use new features:

  1. Multipart: add x-content-type: multipart/form-data to schema
  2. Streaming: add x-streaming: true to response schema
  3. Extensions: import and register via extensions: [...] option

Reference

  • Architecture: docs/extensions/EXTENSION-ARCHITECTURE.md
  • Quick Reference: docs/extensions/QUICK-REFERENCE.md
  • Extension Specs: docs/extensions/WEBSOCKETS.md, HTTP-EXTENSIONS.md
  • API Design: docs/API_REDESIGN_V1.md