-
ffc7d53: Add
ApiRunnerclass insrc/api-runner.tsthat encapsulates the creation and lifecycle management of all Counterfact sub-systems (Registry, ContextRegistry, ScenarioRegistry, ScenarioFileGenerator, CodeGenerator, Dispatcher, Transpiler, ModuleLoader, and OpenApiDocument) for a single API specification.Each sub-system is exposed as a public property. The class provides four composite methods —
generate(),load(),watch(), andstopWatching()— that coordinate across multiple sub-systems based on the supplied configuration. Use the static asyncApiRunner.create(config)factory method to construct an instance.counterfact()inapp.tsnow usesApiRunnerinternally. -
a6bb5bc: Add support for multiple API specifications via
ApiRunner.ApiRunner.create(config, group?)now accepts an optionalgroupstring (default"") that places generated code in a subdirectory ofconfig.basePath.ApiRunnerexposesgroupas a public readonly property andsubdirectoryas a computed getter (returns""when group is empty, or"/${group}").CodeGeneratorreceivesconfig.basePath + runner.subdirectoryso each spec's generated files land in the right subdirectory.createKoaAppnow acceptsrunners: ApiRunner[](an array) instead of a singlerunner. It loops over all runners to mount per-spec OpenAPI document, Swagger UI, Admin API, and route-dispatching middleware.counterfact()accepts an optionalspecs: SpecConfig[]second argument (each entry hassource,prefix, andgroup). When omitted, a single spec is derived fromconfig.openApiPathandconfig.prefixfor full backward compatibility. The REPL is configured using the first spec's runner.- The
speckey incounterfact.yamlcan now be a single{source, prefix, group}object or an array of such objects to configure multiple APIs from the config file.
-
26e00eb: Add
openApiPathandprefixas public readonly properties onApiRunner.Refactor
createKoaAppto acceptrunner: ApiRunner(providing the dispatcher, registry, context registry, OpenAPI path, and route prefix) instead of aconfig: Configmonolith plus separate sub-system refs. All other config fields used bycreateKoaAppare now explicit named arguments, laying the groundwork for passing multiple runners tocreateKoaAppin the future.
- aa23b79: Support
.scenario <group> <path>in multi-API REPL sessions while preserving single-runner syntax. - d0dff90: Warn and skip loading context modules when they fail to import, including syntax errors in _.context files.
- 75938e3: Prefer OpenAPI route paths for REPL tab completion and refactor completer lookups into focused helpers.
- 7a8c0b6: Move MSW (Mock Service Worker) code out of
app.tsinto a dedicatedsrc/msw.tsmodule. TheMockRequesttype,handleMswRequest, andcreateMswHandlersare still re-exported fromapp.tsfor backward compatibility. Tests for these functions have been moved totest/msw.test.ts. - 4894f18: Organized Koa middleware into a dedicated
src/server/web-server/directory. Each middleware constructor now takes its path prefix as the first argument, makingcreateKoaAppeasier to read at a glance.openapiMiddlewaresimplified to handle a single path only. - 3aa8416: Expose grouped REPL context and routes for multi-API runners, and require non-empty unique group names when configuring multiple APIs.
- b270516: Move CLI logic from bin/counterfact.js into src/cli/ as TypeScript modules
- a3d16ab: Update REPL
.scenariotab completion to suggest groups first in multi-API mode and group-scoped scenarios after selection.
- 0b32088: Use
Pick<Config, ...>in function signatures to declare only the config keys each function actually uses. This improves readability and makes each function's dependencies explicit.
-
c6e0625: Add startup scenario: export a function named
startupfromscenarios/index.tsand it will run automatically when the server initializes, right before the REPL starts. Use it to seed dummy data so the server is immediately useful without any manual REPL commands. Ifstartupis not exported, the server starts normally with no error. -
a0cbfcc:
createKoaApp()now accepts named parameters via destructuring ({ config, dispatcher, registry, contextRegistry }) and createsroutesMiddlewareandadminApiMiddlewareinternally.counterfact()no longer returnsroutesMiddleware. -
ae11a87: Refactor
OpenApiDocumentfrom a plain interface into a class.OpenApiDocumentnow extendsEventTargetand manages its own lifecycle:new OpenApiDocument(source)— create an instance pointing at a local path or URLawait document.load()— read and parse the file, populatingpaths,basePath, andproducesawait document.watch()— start watching the source file; dispatches a"reload"event whenever the file changes on diskawait document.stopWatching()— stop the file watcher
The separate
OpenApiWatcherclass has been removed; its behaviour is now built intoOpenApiDocument. -
687f8fc: Remove the built-in GUI client (dashboard and RapiDoc pages) from src/client and the Handlebars dependency. The Swagger UI at /counterfact/swagger remains available. Navigating to /counterfact now redirects to /counterfact/swagger.
-
55ee5e2: Export
ContextArgstype from generatedtypes/_.context.tsso that_.context.tsfiles can strongly type theloadContextandreadJsonparameters received in the Context constructor. The default_.context.tstemplate now imports and usesContextArgs.
- 145c7f4: Add
toForwardSlashPathutility function andForwardSlashPathbranded type. All path normalization that previously used inline.replaceAll("\\", "/")now goes through this single, centralized function, making Windows path handling easier to find and reason about. - e0414c7: Add JSDoc comments throughout the codebase, covering all major classes, functions, and interfaces in
src/server/,src/typescript-generator/,src/repl/, andsrc/util/. - ea5b3e9: Make the hexagon in the REPL prompt the same shade of blue as the logo (#0071b5).
- c047a4d: Refactor: extract a
ScenarioFileGeneratorclass that encapsulateswriteScenarioContextTypeandwriteDefaultScenariosIndex, complete with its own file-system watcher for theroutes/directory.app.tsnow callsScenarioFileGeneratordirectly instead of hooking intocontextRegistryevents. - 919fd3c: Fix Jest worker process failing to exit gracefully by closing REPL servers after each test in the repl test suite.
- 688fb84: Fix TypeError when an OpenAPI Path Item Object contains non-HTTP-verb fields such as
summary,description,servers, orparameters. These fields are now correctly ignored during code generation instead of being treated as operations. - ca38a27: Moved
openapi-example.yamlfrom the repository root intotest/fixtures/openapi-example.yamland expanded it with many OpenAPI edge cases: CRUD operations on/usersand/users/{userId}, polymorphic events viaoneOf/allOf/discriminator, nullable fields, enum types, integer formats, file upload viamultipart/form-data, cookie parameters, deprecated endpoints, multiple response content types, a no-body204health-check endpoint, and free-formadditionalPropertiesobjects. - 8834b1d: Refactor
createKoaApp()to acceptadminApiMiddlewareas a parameter instead of constructing it internally. Rename thekoaMiddlewareparameter and export toroutesMiddleware. - 51e3cb1: Refactor docs information architecture:
docs/usage.mdis now a central hub page linking to individual feature pages underdocs/features/, and pattern pages are consolidated underdocs/patterns/index.md. - f97e8a7: Refactor
openapiMiddlewareto accept an array of{ path, baseUrl, id }document descriptors. When the array contains a single entry the document is still served at/counterfact/openapi(backward-compatible). When multiple entries are provided each document is served at/counterfact/openapi/{id}. - b26617e: Replaced the five-minute walkthrough README with a concise, confident two-paragraph introduction. Added ten README variants under
docs/readme-variants/for the team to review and choose from. - e4e8757: Rename the
.applyREPL command to.scenario. Update all references in code, tests, and documentation.
-
0043b20: Add support for a
counterfact.yamlconfig file. All CLI options can now be specified in acounterfact.yamlfile in the current working directory. Command-line options always take precedence over config file settings. Use--config <path>to load a config file from a non-default location. -
2cbd0d5: Add .empty() method to response builder for responses with no body
-
965dc4e: Add
.applyREPL dot-command (Approach 1: Minimalist Function Injection).The
.applycommand lets you run scenario scripts from the REPL prompt without leaving the terminal. A scenario is a plain TypeScript (or JavaScript) file that exports named functions. Each function receives anApplyContextobject with{ context, loadContext, routes, route }and can freely read or mutate state.Path resolution:
Command File Function .apply fooscenarios/index.tsfoo.apply foo/barscenarios/foo.tsbar.apply foo/bar/bazscenarios/foo/bar.tsbazThe
ApplyContexttype is written totypes/apply-context.tsduring code generation. -
a356bdf: Validate response headers at runtime and report type errors as
response-type-errorHTTP headers (one per error, multiple headers with the same name). Use --no-validate-response to disable.
- 54b866c: add docs/usage-patterns.md documenting seven usage patterns: explore a new API, simulate failures and edge cases, mock APIs with dummy data, fast sandbox for agentic coding, hybrid proxy, API reference implementation, and executable spec
- 6e0655b: fix type error when returning a response with no body (e.g.
$.response[200]or$.response[404]in routes where the spec defines no response body) - 754dbbd: add two new usage pattern docs: Automated Integration Tests (programmatic API in test suites) and Custom Middleware (_.middleware.ts for cross-cutting concerns); propose three future patterns as GitHub issues: Record and Replay, Webhook Simulation, and Persistent State
- f9a9790: Refactor
src/counterfact-types/so that each type lives in its own file with a JSDoc comment explaining its purpose. Theindex.tsnow re-exports all types from the individual files. This is an internal refactor with no change to the public API. - 6d50ae6: Updated dependency
ajvto8.18.0. - fa25ec3: Updated dependency
@swc/coreto1.15.24. - cbab929: Updated dependency
eslintto10.2.0. - 9c5fc1d: Replace deprecated
unescape()withdecodeURIComponent()wrapped in a try/catch inrequirement.ts. This avoids use of the deprecated global function while preserving the behavior of returning invalid percent-encoded sequences unchanged. - 323cf1c: Revised documentation for coherence: added table of contents to usage, reference, and FAQ pages; added "See also" sections to pages that were missing them; moved the usage guide link from the README footer into the "Go deeper" table.
-
3b0334a: Add JSDoc comment generation for types from OpenAPI metadata
Generated TypeScript types now include inline JSDoc comments derived from the OpenAPI spec:
- Schema-level JSDoc from
description/summary - Property-level JSDoc including
description,@example,@default,@format, and@deprecated - Operation-level JSDoc from operation
summary/description
This improves IDE hover documentation and AI-assisted development workflows.
- Schema-level JSDoc from
-
a3b24f0: Add request validation against the OpenAPI spec. Incoming requests are now validated by default — missing required query parameters, missing required headers, and request bodies that do not match the declared schema all result in a 400 response with a descriptive error message. Validation can be disabled with the
--no-validate-requestCLI flag. -
3c5c284: Add lightweight telemetry using PostHog to track usage of Counterfact. Fires a single
counterfact_startedevent on startup. Telemetry is disabled by default before May 1, 2026, disabled in CI, and can be controlled with theCOUNTERFACT_TELEMETRY_DISABLEDenvironment variable. A one-time warning is shown before the rollout date. -
6c9e30f: Add REPL-native request builder (
route()) with fluent API, OpenAPI introspection, and autocomplete support.The new
route()function is available in the REPL and allows users to discover, construct, and execute API requests interactively:const pet = route("/pet/{petId}").method("get").path({ petId: 1 }); await pet.send();
Key capabilities:
- Fluent, immutable builder API (
.method(),.path(),.query(),.headers(),.body()) - OpenAPI-backed introspection via
.help(),.ready(), and.missing() - Actionable feedback when required parameters are absent
- Custom REPL display showing parameter status
- Autocomplete for
route("in addition to existingclient.*patterns
- Fluent, immutable builder API (
- 7a89d27: Refactor internal plain objects to Maps where appropriate:
Directory.directoriesandDirectory.filesinmodule-tree.tsare nowMap<string, Directory>andMap<string, File>ParameterTypesinner types indispatcher.tsare nowMap<string, string>castParametersinregistry.tsnow acceptsMap<string, string>for parameter types
- 5b7d8b3: Improve error messages for malformed or missing OpenAPI specs. Instead of showing a JavaScript stack trace, Counterfact now displays a clear, actionable message that includes the spec path and the underlying reason for the failure.
- ff2ba80: Auto-detect TypeScript native runtime support (tsx, ts-node, node --experimental-strip-types) instead of requiring a --use-tsx flag
- a10ac3d: Convert remaining JavaScript source files and tests to TypeScript with proper types
- f440a20: Display the current version on startup and warn when a newer version is available on npm. The version check runs non-blocking in the background after the server starts, and can be suppressed with
--no-update-checkor by setting theCIenvironment variable.
- cdb4c42: Fix import path in generated route handler files when the OpenAPI path contains a colon (e.g.
/stuff:action). Previously, the import statement used a literal:but the type file was written to disk with the Unicode ratio symbol∶(U+2236), causing TypeScript to fail to resolve the type and fall back toany. - eb65932: Fix
Access-Control-Allow-MethodsCORS header to reflect only the HTTP methods actually implemented by the route handler, instead of hardcodingGET,HEAD,PUT,POST,DELETE,PATCHfor every route. - d522f6f: Fix crash when a route file is deleted while the server is running. Previously, the file-watch handler would attempt to re-import the deleted file after removing it from the registry, causing a
TypeError. Now the handler returns immediately after processing theunlinkevent. - d306720: Fix crash when a route file has a syntax error. Previously, Counterfact would crash with an unhandled promise rejection when a CommonJS route file had a syntax error. Now the server stays running and requests to that route return a 500 response with a message indicating which file has the error.
- 6ca6998: Fix request body parsing:
RawHttpClientnow automatically setsContent-Type: application/jsonwhen the body is an object, so$.bodyis populated correctly in route handlers. - df8abcf: Fix TypeError when a response content entry has no schema defined. Previously, the TypeScript type generator would crash with
TypeError: Cannot read properties of undefined (reading 'data')and emit an empty error comment type. Now it gracefully falls back tounknownfor the body type. - 37dec24: Updated dependency
koato3.2.0. - a1973c7: Updated dependency
lodashto4.18.1.
-
cb931d6: When multiple wildcard route handlers exist at the same path level (e.g.
/{x}and/{y}as siblings), Counterfact now:- Logs an error to stderr at load time listing the conflicting wildcard names.
- Returns an HTTP 500 response when a request could be routed to two or more handlers due to the ambiguity.
-
0a3039b: Add support for binary data in responses. Route handlers can now return binary content using the new
binary()method on the response builder, which accepts aBufferor a base64-encoded string. OpenAPI schemas withformat: "binary"(v3) ortype: "file"(v2) now generateBuffer | stringTypeScript types. -
d53f4c3: Break REPL out of
counterfact()and expose it as a callablestartRepl()on the returned object. This enables programmatic usage (e.g. from Playwright tests) without automatically starting an interactive terminal session.import { counterfact } from "counterfact"; const { contextRegistry, start, startRepl } = await counterfact(config); await start(config); // Manipulate server state directly from test code: const rootContext = contextRegistry.find("/"); rootContext.passwordResponse = "expired";
The CLI (
bin/counterfact.js) now explicitly callsstartRepl()when--replis passed, preserving existing behaviour. -
861c4db: Add route autocomplete to REPL for
client.<method>("...")patterns.When typing
client.get("/pin the REPL and pressing Tab, the REPL now suggests available routes (e.g./pets,/pets/{petId}) derived from the route registry.This works for all HTTP methods:
get,post,put,patch, anddelete. -
1e4d5cf: Add chainable
$.response.cookie()helper for setting response cookies.Route handlers can now set one or more cookies without manually building
Set-Cookieheader strings:return $.response[200] .cookie("sessionId", "abc123", { httpOnly: true, secure: true, sameSite: "lax", path: "/", maxAge: 3600, }) .cookie("theme", "dark") .json({ ok: true });
Supported options:
path,domain,maxAge,expires,httpOnly,secure,sameSite.
-
578faab: Fix REPL tab completion for built-in Node.js completions (e.g.
context.<Tab>).The custom route completer previously replaced Node's built-in REPL completer entirely, breaking property completion for objects like
contextandclient. The completer now delegates to the built-in completer when the input doesn't match theclient.<method>("...")pattern. -
76d3103: Updated dependency
json-schema-fakerto0.6.0. -
4229034: Updated dependency
eslintto10.0.3. -
635071c: Updated dependency
eslint-plugin-jestto29.15.1. -
ff36c53: Updated dependency
handlebarsto4.7.9. -
9e2b147: Updated dependency
typescriptto6.0.2. -
7f9ce73: Updated dependency
@swc/coreto1.15.21. -
a7a56a2: Updated dependency
eslintto10.1.0.
-
2fc3033: Added
--pruneoption to remove route files that no longer exist in the OpenAPI spec.When an OpenAPI spec renames a path parameter (e.g.
/pet/{id}/update/{Name}→/pet/{id}/update/{nickname}), running without--pruneleaves the old file in place alongside the newly generated one, causing wildcard ambiguity in route matching. The new flag cleans up defunct route files before generation runs.npx counterfact openapi.yaml ./out --generate --prune
Context files (
_.context.ts) and empty directories are handled correctly — context files are never pruned, and any directories left empty after pruning are removed automatically.
- eb72148: Add --spec flag as alternative to positional OpenAPI argument
- 79b4936: fixed a regression causing all 200 responses to be just "ok"
- 9a8dc4a: Add utility function for loading JSON files
- 86c4460: Updated dependency
@types/koato3.0.2. - 1d08f75: Fill in required response headers in
random(). When an OpenAPI response definition marks a header asrequired: true, therandom()function now automatically generates a value for that header using the header's schema. Headers that are already set are not overwritten.
-
304cbfe: Add
example(name)method to response builder for selecting named OpenAPI examplesDevelopers can now select a specific named example from the OpenAPI specification using the strongly-typed
example()method on a response builder:return $.response[200].example("namedExample1");
The method is fully type-safe: TypeScript will autocomplete the example names defined in the OpenAPI document and report a type error if an unknown name is used.
Example names are collected from the
examplesfield of each media type in the response content (OpenAPI 3.x). The method can be chained with other response builder methods:return $.response[200] .example("namedExample1") .header("some-header", "some-value");
- 008f133: Admin API and Agent Skill
- 23b219b: format JSON in HTTP responses for readability
- c92f975: Fixed Midleware matching all routes is not executed #1515
- 86f1de2: Return HTTP 405 (Method Not Allowed) with an
Allowheader when the requested path is registered but the HTTP method has no handler. Previously these requests returned 404, making it impossible to distinguish "path not found" from "method not allowed".
- ca69418: adds a notice linking to important discussion: #1527
-
3a7046b: Sanitize
operationIdvalues before using them as TypeScript identifiers in generated code.Previously, any
operationIdfrom an OpenAPI spec was used verbatim, which could produce invalid TypeScript when the value contained hyphens, dots, spaces, or other characters not permitted in identifiers. The value is now converted to camelCase (e.g.get-user-profile→getUserProfile) and any remaining invalid characters are stripped.
- 56ddbfe: BREAKING: Updates route types to use operationId for more explicit route types and operation types. Why: Presently the routes generated from the OpenApi specification all use the same exported type of HTTP*{method} such as HTTP_GET and HTTP_POST. When you open those types, the path parameters, query parameters and headers are just inline types in the parent exported class. Some of our users desired the inline types to be explicit so that they can use the generated query types in other places. Our first change was just to add explicit types to the query parameters, but in working through the change it made more sense to go ahead and also add types for the path parameters and headers. Then since those new types will attempt to use the operationId from the spec if it is available, it made sense to make the entire route type more unique to that operationId instead of all the routes using HTTP_GET, HTTP_POST, HTTP_DELETE, etc. What you need to do: On launch Counterfact will run a migration script to migrate all your existing routes to the new types. You will need to pay attention to the output after your first run to be sure the upgrade was correct. In the unlikely event that an end user has other places in their code where they directly reference the HTTP* types those will need to be manually updated.
- e82c2ce: Fix incorrect required property type generation in schema-type-coder
-
70b2855: Added explicit parameter type exports for query parameters, path parameters, and headers. Operation types now export separate named types (e.g.,
findPetsByStatus_Query,getPetById_Path,authenticate_Headers) when parameters exist and use the operationId from your OpenAPI specification. These types can be imported and reused elsewhere in your code. The main operation types (HTTP_GET, HTTP_POST, etc.) remain unchanged for backward compatibility.Example:
import type { HTTP_GET, findPetsByStatus_Query, } from "./types/paths/pet.types.ts"; // Use the query type elsewhere function validateQuery(query: findPetsByStatus_Query) { // ... }
- 5b52a18: make operation methods like GET() and POST() async
- da0c55e: Add a $.delay() utility for simulating slow responses (#720)
- 8349ae6: add a client object to the REPL for quickly sending HTTP requests
- df64c5a: feat: Speed up by using regex replace instead of recast (thanks jrunning!)
- c4e0c23: revert change in #1372 which broke type shortcuts like .json(), .html(), etc.
- e06b36a: Security update for js-yaml
- 56e0c54: better description in package.json
- 6d25133: fix an issue with proxy where headers are mangled
- 8f0d2d2: fix for Windows when a path contains a colon (:), resolves #1381
- f760bec: fix an issue where proxying to an HTTPS target does not work
- e8e6e6d: fix error with $.proxy() when making a GET request
- df23b2e: MaybeShortcut for content type is too strict #1370 -- thanks @ihor-rud!
- 12f22fd: Add buildCache CLI option
- d2f02bb: Add Mock Service Worker handler capability
- 9cde046: fix to buildMatch in module-tree
- b69d508: added extensibility via middleware
- 800d03c: Add alwaysFakeOptionals option
- 813ecec: follow $refs in parameters (fixes #1105)
- 3b4c9ea: work-around for URL-encoding in path names (#1083)
- af31a7c: fix types:
$.header should be $ .headers (#1160)
- 0a9df8f: also cast numbers (non-integers) and booleans to the right types at runtime
- 2d229c6: correct runtime type of parameters for Swagger v2 (fixes #1116)
- 06bf54d: fixed an issue where $refs were not followed (#1089)
- 707a0ec: Updates JSONSchemaFaker to have the fillProperties option false so it will not make up fake object properties
- b5578b5: fix vscode:// links on Windows (#1058)
- 1af9ec9: Fixes logic in module-tree when a path has multiple wildcard children at the same position
- c586ab8: minor change to REPL: if no action-related argument is passed (--generate, --watch, --serve, --repl), do all of the actions
- e4e1009: If a path is defined at the root (/) it's mapped to index.ts
- 2748fa2: fix: request body type is not found in OpenAPI 2 when consumes is in the root
- fcc9682: support arrays in JSON schema type property (#1005)
- e2f8ac8: Version 1.0!
- e2f8ac8: replaced koa-proxy with koa-proxies to get rid of a deprecation warning (as it turns out, koa-proxies had a different deprecation, but I was able to fix it with patch-package; unfortunately none of the alternatives seem to be currently maintained)
- 48a0c78: ability at runtime for a context object to access other context objects
- c45fcba: New logo! It's not perfect, but the best I can do by myself. If you have graphic design skills, I could use some help cleaning it up.
- 33ccdbf: Update context-registry find logic for bug with mixed path casing
- 4339e42: Fix paths to routes migration
- 0bcf083: fix argument type for .json() (third time's a charm?)
- 11518ab: New file structure - In preparation for the 1.0 release,
pathshas moved toroutes;path-typesandcomponentsare now undertypes. Counterfact will automatically migrate your code for you. We don't like making disruptive changes like this; this will be the last one for the foreseeable future.
- b09fb59: fixed the type system to address that fact that json() handles multiple content types
- 9e285a5: reverted type change for .json() -- it had unintended consequences
- 425e893: turn the proxy on or off for individual paths
- 4fed190: expand the .json() shortcut to include variations of JSON and XML content types
- 88adb61: fixes an issue where imports without a file extension were not transpiled properly
- e355b66: Add command line options for granular control of the different parts of CF
- ab15645: fix #898 hot reloading broken due to cache issues
- 46bd016: option to run Counterfact without OpenAPI (#834)
- 1f44f3d: fixed #721: .proxy on / .proxy off commands in REPL have no effect
- b731a44: fix invalid TypeScript generated for recursive types
- a5a728a: delete the .cache directory at startup so old leftover files don't make trouble
- 678c51b: when a file is changed, all files on which it depends are hot-reloaded (fixes #835)
- bb0a11c: performance fix that should significantly reduce startup time
- 5503a8e: a lot of refactoring of the code that loads modules
- ef57997: fixed: make --prefix work with Swagger
- cb1e12b: move patch-package to dependencies so it won't mess up install
- 1f7bfb9: support for basic auth (
$.auth.username and $ .auth.password)
- d0f6f5a: Updates dispatcher class to ignore case when matching paths
- c4e5ca0: make $ref work everywhere, not just inside schemas (#838)
- d00f6d7: Update usage docs for installing Counterfact as a dependency
- 49733d6: configure JSONSchemaFaker to not fail on invalid types
- 729a8e1: added an announcement about impeding 1.0 release
- b3ab833: fix a type checking issue where the response type has no headers or content
- 30440ae: fixed an edge case with types when the response type has some optional headers
- 9e7923c: strengthen the return type of an operation (the return value of GET(), POST(), etc.)
- f4f377e: useless properties (like $.query when there are no query parameters) are now excluded from types
- b888e11: added a $.x object which is the same as $ but less type safe
- 7f70c2c: added a comment to the top of files under types/paths which links to an FAQ on generated code -- thanks @ingovals for the nudge
- 7b4bdc2: fixed #788: On Windows, the import field from types/paths to context gets wrong slashes while others are fine
- 9601b20: Allows Counterfact to handle requests that contain the OpenApi basePath
- 7e66fba: fix issue where hot reload did not work unless the code is in a package with type: module"
- 5742050: exit gracefully if running Node < 17
- f1c360e: Node >= 17 is now required
- c62b113: If a property is changed in _.context.ts it will override runtime changes (See #747).
- ef4b6b3: fix an issue in which a file which is essential for type safety was not created (types.d.ts)
- 317fbaa: Fixed and simplified the way
\_.context.tsfiles work.- it's no longer necessary to have a
_.context.tsfile in every directory, only the ones where you want to establish a new context - removed the need for
export type ContextType
- it's no longer necessary to have a
-
6460017: minor breaking change:
$.context.tsis now_.context.tsand exports a class named ContextSee https://github.com/pmcelhaney/counterfact/blob/main/docs/context-change.md
- 8f028d5: CodeGenerator#watch() now waits until Chokidar completes its initial scan before resolving
-
479da6b: transpile TypeScript code to ES2022
-
8ab35b9: emit either CommonJS or ESM files depending on whether there's a package.json with type: module
This change makes it possible to create modules that are imported into files in the paths directory.
- 0610da9: Fix issue 703: Endpoint with trailing slash
- c000cfc: Fixed: a handler function (GET(), PUT(), etc) should always return a response, even if that response is just a status code. If the handler doesn't return, the server will response with a 500 error.
- 4cdcb2d: fix: the optional flag for a parameter was inside quotes, making it part of the name rather than TypeScript syntax
- 47374ee: Partial support for XML (if anyone still uses XML). See https://swagger.io/docs/specification/data-models/representing-xml/
- 2366b50: Removed link to the dashboard / admin console because it's not really useful yet.
- 5c6cce9: Until now the dashboard hasn't gotten much attention. Added a logo and took some baby steps toward the planned design. https://excalidraw.com/#json=THGkyuKCGr_69fFqUrghd,ecIPAvDtoAOajwZ9G4m3sg
- 5c6cce9: fix links to open in VSCode
- 93d7607: added a ⬣> to the prompt to make it look more distinguished
- 960105a: just for fun, the tagline when the CLI starts is different every time you run it
- cf203d7: ignore the HTTP accept header if the response has no body
- 25933c2: fix an issue where the types.d.ts file was not copied over
- 24d96c3: created a new intro banner for the CLI
- 88cebcd: fixed an issue where if there was a directory and file with the same name, one would shadow the other
- 0dc11ea: added a --prefix option to specify prefix from which routes are served (e.g. /api/v1)
- 4de94f0: Update dependency @types/jest to v29.5.7
- 5f8e97b: chore(deps): update dependency @types/jest to v29.5.8
- 0069e9b: The list of routes on on the dashboard (http://localhost:3100/counterfact) is now determined on the fly
- 0069e9b: Regenerate code if the OpenAPI file changes while Counterfact is running
- f89691a: configure json-schema-faker to create between 0 and 20 items when it generates an array
- 33d05f9: configure json-schema-aker to create between 0 and 20 items when it generates an array
- 7eba726: got a little carried away with typeof; it's needed for the instance, not the class
-
836b61d: Fixed an issue where the context object wasn't working as expected.
BREAKING CHANGE:
- the main $.context.ts file needs an extra line:
export type ContextType = Context; - $.context.ts files below the root need to change to
export type { ContextType } from "../$.context"; - if you modified any of the $.context.ts files below the root, treat the first bullet applies
When you run Counterfact, it will try to make these changes for you, so ideally you won't have to worry about it.
- the main $.context.ts file needs an extra line:
- 5f02963: Fixes issue #593 where custom response headers were not being set
- 9d7bc5c: Fixes issue #585 where dispatcher.ts needs to use the matchedPath when calling the contextRegistry.find method
- dd0aecb: remove postinstall script that was preventing counterfact from installing
- 61ba2c9: the server code has been converted to TypeScript -- let me know if something stopped working
- 28d21f8: put generated JS code under a .cache directory and add that directory to .gitignore
- 61ba2c9: fix for OpenAPI 3 examples, which weren't read correctly (hardly anyone uses them)
- 8d86f34: make paths in URLs case-insensitive (http://localhost:3100/FOO is the same as http://localhost:3100/foo)
- f60874f: fix a few edge cases found when running against Github's extensive OpenAPI description: https://github.com/github/rest-api-description
- 7f2e19e: fixed an issue in which routes on the start page weren't rendered correctly in Windows
- 02676a8: Fix typescript-generator importStatements logic for relative paths
- 5523d0f: fixed another bug caused by backslashes in Windows
- 226ce37: fixed a couple more issues in Windows
- 5a9f40a: added a bunch more debug logging
- fix Windows issue where "http://" gets changed to "http:/" and as a result the app hangs
- e1bbb42: added a bit of debug logging (use environment variable DEBUG=counterfact to see it)
- 1ea478a: remove the dependency on ts-node -- path files are now compiled with Typescript and output to a paths-js directory
- 8ef5f41: Windows support! (maybe -- I don't have a Windows machine so I can't test directly)
- 4dcfa06: add CORS headers to support local development (Thanks, dethell-jh!)
- dec64f4: Add CORS headers
- 1d13668: fix an issue where the random() function doesn't recognize it should use OpenAPI2
- 9ca754f: fix another bug where OpenAPI2 puts the produces proprty in the root
- 65f081b: fix error when the produces content type is defined at the root
- 9e0e4d3: it's Friday ¯_(ツ)_/¯
- d975833: fix an issue where ts-node was not being used, which basically broke everything
- 7d05529: fix $.proxy() -- it's better but still experimental
- 74c98aa: Fix: Found an error when headers name contains
-(thanks @hireza!)
- d2a3023: fix issues which made --proxy-url completely broken
- 120eb52: fixes an issue where files may not be treated as ESM
- bb8f5f4: fix an issue causing all endpoints to return 404
- 3c78a07: support for enum values in schemas
- b2bf1db: fix duplicate imports of Context object
- 0f4ead6: don't import HTTPStatusCode if not needed
- 8e4410c: redirect /counterfact to counterfact/
- ab730a8: fix an issue where top-level produces in OpenAPI 2 was not working
- 196f7f4: new
--proxyURL <url>CLI option and.proxy [on|off]command in the REPL
- 1244b6e: support for allOf, anyOf, oneOf, and not
- 1d360bd: OpenAPI 2 -- fall back to top-level produces and consumes
- 052db18: requires ts-node to be installed globally (for now)
- b99a1ed: fault tolerance: the server will not crash due to a syntax error
- b99a1ed: run TypeScript directly via ts-node loader instead of putting JS files on disk
- b7509d9: fix an issue where importing from $.context.ts did not work
- 78c0c31: return $.proxy(url) to proxy to another server
- 6bf3d42:
$context.ts -> $ .context.ts - 7c2893a: change rapidoc configuration to show paths in the nav bar
- 033c067: new landing page with links to Rapidoc and Swagger UI
- 6bf3d42: improve and document the REPL
- a2d6bf0: always start the server regardless of which command line options are present
- 4a96dfa: fix crash when a path is not found
- b177d1d: rebuilt (but very rough) landing page using rapidoc
- 9e457bd: Add OpenApi2 host property support
- 8f472c9: change the way JSONSchemaFaker is imported to avoid CJS -> ESM issues
- 30baae9: a couple of fixes to improve OpenAPI 2 support
- b212793: use OpenAPI to convert strings in path/query/header to numbers at runtime
- e141c46: Experimental support for OpenAPI 2
- 1a622d2: a REPL allows you to interact with the server's context programatically
- 5a7e12b: --open opens the browser to a landing page with pointers to the code, Swagger, and the docs
- f1360ba: made the generated code a bit cleaner
- d8cbc41: fix swagger-ui when the openapi doc has a host property
- d8cbc41: ensure a $context.ts file is created in every directory
- 15270ed: remove dead code in operation-coder.js
- c7a928f: encode non-alphanumeric name as valid variable names
- 02efcd5: fix so that Counterfact no longer depends on itself
- 7e6028c: reworked CLI: generate code then optionally start the server, Swagger UI, open a browser
- Updated dependencies [7e6028c]
- counterfact@0.10.0
- 88ed486: new $context.ts files which are used to define the server context / state
- Updated dependencies [88ed486]
- counterfact@0.9.0
- 920504a: when encoding JSON schema in TypeScript, mark object properties as optional unless they are required
- 92dc769: the open API document can now be loaded from a URL rather than a local path
- ed44ba4: fix so that response[statusCode].random() can use the OpenAPI spec
- 5a767e7: the generated code for a path now uses response[statusCode].random() instead of a bunch of ugly boilerplate
- a1de4c0: add headers to the generated response type
- 86c1412: fix an issue where random() wasn't reading the examples right
- Updated dependencies [a1de4c0]
- Updated dependencies [920504a]
- Updated dependencies [86c1412]
- Updated dependencies [92dc769]
- Updated dependencies [ed44ba4]
- Updated dependencies [5a767e7]
- counterfact@0.8.0
- 4f3c7c9: define a ResponseBuilder type -- to be refined later with one or more generic arguments
- 5f3ee3f: response builder fluent API which is going to make intellisense with TypeScript awesome
- 6221e7d:
counterfact startcommand to start a server - a3dfb48:
npm counterfact init <openapi-file> <destination>command to build a new package with a Counterfact server - 9f91d57: adds a 'go' command that generates code and starts the server in one step
- 25dcd45: ability to respond with multiple content types, return the best match for the request's accept header
- c84a4f4: Counterfact is now able to read an OpenAPI document and use it to generate a random response.
- c0cb938: a function can now return "hello world" as shorthand for
{status: 200, contentType: "text/plain", body: "hello world"}
- 69b4598: replaced EventEmitter with EventTarget
- a07c2b2: fix a crash when regenerating code
- 85c3349: fixed an issue where hot reload did not work in some cases
- 1551cbb: handle additionalProperties when converting a JSON Schema to TypeScript
- 9161d80: Setup basic devcontainer.
- 6d01563: fixed the generate script in the main package (yarn generate wasn't doing anything)
- 6f406c4: fixed an issue where the generated JSON schema was changing integer types to number
- 6f406c4: fixed an issue where a response with no content was blowing up
- 5e72a6c: CLI to generate TypeScript files
- de5e92b: use example values (if present) when generating random data
- ab38cb2: add a tools.randomFromSchema(schema: JSONSchema) function
- 406b907: Add a tools object that will be provided to the request
- 741e4fe: change path parameters from [this] to {this} for consistency with OpenAPI
- f237c38: proof of concept specifying routes with TypeScript and ts-node
- 420cd52: return a 404 with a helpful error message when a handler for a route does not exist
- c11a475: allow the intial context (nee "store") to be passed as the second argument to
counterfact()
- 3829a83: fix changeset access configuration (changesets/changesets#503)
- 4c2bad8: build: add npm token to the release workflow
- 719d932: support for HTTP response code
- a5cd8d4: Filled out missing properties in package.json.
- Deleted the original index.js file that does nothing.
- This is the first release that's actually usable.
- 6101623: Update the demo app to work with recent API changes
- 95f3ca2: no changes -- just trying to get a Github action to run