From 881800f4f1c7b106f3444753f4ff8d45928d1a7d Mon Sep 17 00:00:00 2001 From: Patrick McElhaney Date: Mon, 6 May 2024 17:26:43 -0400 Subject: [PATCH 1/3] fix #721 - .proxy on / .proxy off commands in REPL have no effect --- src/server/koa-middleware.ts | 5 ++++- src/server/transpiler.ts | 1 - test/server/koa-middleware.test.ts | 23 ++++++++++++++++------- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/server/koa-middleware.ts b/src/server/koa-middleware.ts index 7341b82f..c503d6dd 100644 --- a/src/server/koa-middleware.ts +++ b/src/server/koa-middleware.ts @@ -3,6 +3,7 @@ import type { IncomingHttpHeaders } from "node:http"; import type Koa from "koa"; import koaProxy from "koa-proxy"; +import type { Config } from "./config.js"; import type { Dispatcher } from "./dispatcher.js"; import type { HttpMethods } from "./registry.js"; @@ -50,11 +51,13 @@ function getAuthObject( export function koaMiddleware( dispatcher: Dispatcher, - { proxyEnabled = false, proxyUrl = "", routePrefix = "" } = {}, + config: Config, proxy = koaProxy, ): Koa.Middleware { // eslint-disable-next-line max-statements return async function middleware(ctx, next) { + const { proxyEnabled, proxyUrl, routePrefix } = config; + if (!ctx.request.path.startsWith(routePrefix)) { // eslint-disable-next-line @typescript-eslint/no-unsafe-return return await next(); diff --git a/src/server/transpiler.ts b/src/server/transpiler.ts index c11449f0..792b5e40 100644 --- a/src/server/transpiler.ts +++ b/src/server/transpiler.ts @@ -127,7 +127,6 @@ export class Transpiler extends EventTarget { convertFileExtensionsToCjs(result); try { - // eslint-disable-next-line total-functions/no-unsafe-readonly-mutable-assignment await fs.writeFile(fullDestination, resultWithTransformedFileExtensions); } catch { debug("error transpiling %s", fullDestination); diff --git a/test/server/koa-middleware.test.ts b/test/server/koa-middleware.test.ts index 259b079c..88b34c64 100644 --- a/test/server/koa-middleware.test.ts +++ b/test/server/koa-middleware.test.ts @@ -9,6 +9,15 @@ import { Dispatcher } from "../../src/server/dispatcher.js"; import { koaMiddleware } from "../../src/server/koa-middleware.js"; import { Registry } from "../../src/server/registry.js"; +const CONFIG = { + basePath: "", + openApiPath: "", + port: 9999, + proxyEnabled: false, + proxyUrl: "", + routePrefix: "", +}; + const mockKoaProxy = (options: KoaProxy.Options | undefined) => function proxy(ctx: KoaContext) { ctx.mockProxyHost = options?.host; @@ -28,7 +37,7 @@ describe("koa middleware", () => { }); const dispatcher = new Dispatcher(registry, new ContextRegistry()); - const middleware = koaMiddleware(dispatcher); + const middleware = koaMiddleware(dispatcher, CONFIG); // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const ctx = { req: { @@ -65,7 +74,7 @@ describe("koa middleware", () => { }); const dispatcher = new Dispatcher(registry, new ContextRegistry()); - const middleware = koaMiddleware(dispatcher); + const middleware = koaMiddleware(dispatcher, CONFIG); const ctx = { request: { headers: {}, method: "GET", path: "/not-modified" }, @@ -93,7 +102,7 @@ describe("koa middleware", () => { const dispatcher = new Dispatcher(registry, new ContextRegistry()); const middleware = koaMiddleware( dispatcher, - { proxyEnabled: true, proxyUrl: "https://example.com" }, + { ...CONFIG, proxyEnabled: true, proxyUrl: "https://example.com" }, mockKoaProxy, ); const ctx = { @@ -122,7 +131,7 @@ describe("koa middleware", () => { }); const dispatcher = new Dispatcher(registry, new ContextRegistry()); - const middleware = koaMiddleware(dispatcher); + const middleware = koaMiddleware(dispatcher, CONFIG); const ctx = { body: undefined, @@ -172,7 +181,7 @@ describe("koa middleware", () => { }); const dispatcher = new Dispatcher(registry, new ContextRegistry()); - const middleware = koaMiddleware(dispatcher); + const middleware = koaMiddleware(dispatcher, CONFIG); const ctx = { body: undefined, @@ -237,7 +246,7 @@ describe("koa middleware", () => { }); const dispatcher = new Dispatcher(registry, new ContextRegistry()); - const middleware = koaMiddleware(dispatcher); + const middleware = koaMiddleware(dispatcher, CONFIG); const ctx = { body: undefined, @@ -318,7 +327,7 @@ describe("koa middleware", () => { }); const dispatcher = new Dispatcher(registry, new ContextRegistry()); - const middleware = koaMiddleware(dispatcher); + const middleware = koaMiddleware(dispatcher, CONFIG); // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const ctx = { req: { From 1f44f3dec8c3fd878180d94b6ee66b29ff75f2dd Mon Sep 17 00:00:00 2001 From: Patrick McElhaney Date: Mon, 6 May 2024 17:26:43 -0400 Subject: [PATCH 2/3] fix #721 - .proxy on / .proxy off commands in REPL have no effect --- .changeset/odd-dancers-burn.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/odd-dancers-burn.md diff --git a/.changeset/odd-dancers-burn.md b/.changeset/odd-dancers-burn.md new file mode 100644 index 00000000..c4acbe85 --- /dev/null +++ b/.changeset/odd-dancers-burn.md @@ -0,0 +1,5 @@ +--- +"counterfact": patch +--- + +fixed #721: .proxy on / .proxy off commands in REPL have no effect From 3e93665964bd06dc53c8c79b6b9195020c7dc5fa Mon Sep 17 00:00:00 2001 From: Patrick McElhaney Date: Tue, 7 May 2024 16:21:51 -0400 Subject: [PATCH 3/3] set default value for routePrefix, add some debugging --- bin/counterfact.js | 1 + src/server/koa-middleware.ts | 6 ++++++ src/server/page-middleware.ts | 5 +++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/bin/counterfact.js b/bin/counterfact.js index c88895a4..acfcbb75 100755 --- a/bin/counterfact.js +++ b/bin/counterfact.js @@ -137,6 +137,7 @@ program .option( "--prefix ", "base path from which routes will be served (e.g. /api/v1)", + "", ) .action(main) // eslint-disable-next-line sonar/process-argv diff --git a/src/server/koa-middleware.ts b/src/server/koa-middleware.ts index c503d6dd..238218d6 100644 --- a/src/server/koa-middleware.ts +++ b/src/server/koa-middleware.ts @@ -1,5 +1,6 @@ import type { IncomingHttpHeaders } from "node:http"; +import createDebug from "debug"; import type Koa from "koa"; import koaProxy from "koa-proxy"; @@ -7,6 +8,8 @@ import type { Config } from "./config.js"; import type { Dispatcher } from "./dispatcher.js"; import type { HttpMethods } from "./registry.js"; +const debug = createDebug("counterfact:server:create-koa-app"); + const HTTP_STATUS_CODE_OK = 200; function addCors(ctx: Koa.ExtendableContext, headers?: IncomingHttpHeaders) { @@ -58,6 +61,9 @@ export function koaMiddleware( return async function middleware(ctx, next) { const { proxyEnabled, proxyUrl, routePrefix } = config; + debug("middleware running for path: %s", ctx.request.path); + debug("routePrefix: %s", routePrefix); + if (!ctx.request.path.startsWith(routePrefix)) { // eslint-disable-next-line @typescript-eslint/no-unsafe-return return await next(); diff --git a/src/server/page-middleware.ts b/src/server/page-middleware.ts index 769f3a44..2c2e3c10 100644 --- a/src/server/page-middleware.ts +++ b/src/server/page-middleware.ts @@ -26,11 +26,12 @@ export function pageMiddleware( .join(__dirname, `../client/${templateName}.html.hbs`) .replaceAll("\\", "/"); - debug("pathToHandlebarsTemplate: %s", pathToHandlebarsTemplate); - const render = Handlebars.compile(await readFile(pathToHandlebarsTemplate)); if (ctx.URL.pathname === pathname) { + debug("rendering page: %s", pathname); + debug("locals: %o", locals); + ctx.body = render(locals); return;