From 1ad59a63ada7590c36864c8a8787994b3a6b8f2a Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Tue, 26 May 2026 15:15:23 +0100 Subject: [PATCH 1/9] fix endpoint argument tracing and a little refactor to the v2 pull proxy --- packages/cli/src/deploy/handler.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cli/src/deploy/handler.ts b/packages/cli/src/deploy/handler.ts index b448a6210..a3ea04ae7 100644 --- a/packages/cli/src/deploy/handler.ts +++ b/packages/cli/src/deploy/handler.ts @@ -34,6 +34,7 @@ async function deployHandler( } try { + console.log({ options }); const config = mergeOverrides(await getConfig(options.configPath), options); const v2ConfigPath = path.join( From 05fad6c9559b9df8417711fca787087598dd2070 Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Tue, 26 May 2026 15:51:54 +0100 Subject: [PATCH 2/9] changeset --- .changeset/slimy-trams-bet.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/slimy-trams-bet.md diff --git a/.changeset/slimy-trams-bet.md b/.changeset/slimy-trams-bet.md new file mode 100644 index 000000000..af53bf59b --- /dev/null +++ b/.changeset/slimy-trams-bet.md @@ -0,0 +1,5 @@ +--- +'@openfn/cli': patch +--- + +Fix an issue where pull and deploy do not track the endpoint argument properly when redirecting to v2 From 422d95aecbf9cd09a96d917afc2727be25fbcb70 Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Tue, 26 May 2026 15:55:39 +0100 Subject: [PATCH 3/9] remove log --- packages/cli/src/deploy/handler.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/cli/src/deploy/handler.ts b/packages/cli/src/deploy/handler.ts index a3ea04ae7..b448a6210 100644 --- a/packages/cli/src/deploy/handler.ts +++ b/packages/cli/src/deploy/handler.ts @@ -34,7 +34,6 @@ async function deployHandler( } try { - console.log({ options }); const config = mergeOverrides(await getConfig(options.configPath), options); const v2ConfigPath = path.join( From 4d9bd0b3a9600c71648836af928b2f0664df91a1 Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Tue, 26 May 2026 16:05:06 +0100 Subject: [PATCH 4/9] version --- .changeset/slimy-trams-bet.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/slimy-trams-bet.md diff --git a/.changeset/slimy-trams-bet.md b/.changeset/slimy-trams-bet.md deleted file mode 100644 index af53bf59b..000000000 --- a/.changeset/slimy-trams-bet.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openfn/cli': patch ---- - -Fix an issue where pull and deploy do not track the endpoint argument properly when redirecting to v2 From 85df64a3941eca830a2fb46fd96d0dbc9a0e25a1 Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Tue, 26 May 2026 16:45:32 +0100 Subject: [PATCH 5/9] fix endpoint tracing on deploy --- packages/cli/src/deploy/command.ts | 2 ++ packages/cli/src/deploy/handler.ts | 9 ++++----- packages/cli/src/projects/deploy.ts | 2 +- packages/cli/src/projects/util.ts | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/cli/src/deploy/command.ts b/packages/cli/src/deploy/command.ts index 6b144f8ee..f6e32d1f6 100644 --- a/packages/cli/src/deploy/command.ts +++ b/packages/cli/src/deploy/command.ts @@ -8,6 +8,8 @@ import * as o2 from '../projects/options'; export type DeployOptions = Required< Pick< Opts & POpts, + | 'endpoint' + | 'apiKey' | 'beta' | 'command' | 'configPath' diff --git a/packages/cli/src/deploy/handler.ts b/packages/cli/src/deploy/handler.ts index b448a6210..1e52469cf 100644 --- a/packages/cli/src/deploy/handler.ts +++ b/packages/cli/src/deploy/handler.ts @@ -118,16 +118,15 @@ const redirectTov2 = async ( // default endpoint to one from openfn.yaml const v2config = yamlToJson(await fs.readFile(v2ConfigPath, 'utf-8')); - if (!config.endpoint && v2config?.project?.endpoint) { - config.endpoint = v2config.project.endpoint; - } + const endpoint = + options.endpoint ?? v2config?.project?.endpoint ?? config.endpoint; return beta.handler( { ...options, force: true, - endpoint: config.endpoint, - apiKey: config.apiKey ?? undefined, + endpoint, + apiKey: options.apiKey ?? config.apiKey ?? undefined, }, logger ); diff --git a/packages/cli/src/projects/deploy.ts b/packages/cli/src/projects/deploy.ts index 69f17d6aa..48d93d5a8 100644 --- a/packages/cli/src/projects/deploy.ts +++ b/packages/cli/src/projects/deploy.ts @@ -148,7 +148,7 @@ const syncProjects = async ( // TODO should we prefer endpoint over alias? // maybe if it's explicitly passed? const endpoint = trackedProject.openfn?.endpoint ?? config.endpoint; - + console.log({ config }); const { data } = await fetchProject( endpoint, config.apiKey, diff --git a/packages/cli/src/projects/util.ts b/packages/cli/src/projects/util.ts index 7a9185585..ef16d5825 100644 --- a/packages/cli/src/projects/util.ts +++ b/packages/cli/src/projects/util.ts @@ -121,7 +121,7 @@ export async function fetchProject( ): Promise<{ data: Provisioner.Project | null }> { const url = getLightningUrl(endpoint, projectId, snapshots); logger?.info(`Checking ${url} for existing project`); - + console.log({ apiKey }); try { const response = await fetch(url, { headers: { From 6a7e3ad9c222299e5a5d9e27803091be855441fe Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Tue, 26 May 2026 16:46:00 +0100 Subject: [PATCH 6/9] changeset --- .changeset/honest-aliens-sleep.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/honest-aliens-sleep.md diff --git a/.changeset/honest-aliens-sleep.md b/.changeset/honest-aliens-sleep.md new file mode 100644 index 000000000..6b6e7b87c --- /dev/null +++ b/.changeset/honest-aliens-sleep.md @@ -0,0 +1,5 @@ +--- +'@openfn/cli': patch +--- + +Fix endpoint tracing on deploy command From d453906f49d51fb9969bf0abef30cf6b1b48e70d Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Tue, 26 May 2026 17:03:21 +0100 Subject: [PATCH 7/9] add tests --- packages/cli/src/deploy/handler.ts | 19 ++++-- packages/cli/test/deploy/deploy.test.ts | 85 +++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 7 deletions(-) diff --git a/packages/cli/src/deploy/handler.ts b/packages/cli/src/deploy/handler.ts index 1e52469cf..13b0d7fd7 100644 --- a/packages/cli/src/deploy/handler.ts +++ b/packages/cli/src/deploy/handler.ts @@ -14,23 +14,27 @@ import { yamlToJson } from '@openfn/project'; import fs from 'node:fs/promises'; export type DeployFn = typeof deploy; +export type BetaHandlerFn = typeof beta.handler; const actualDeploy: DeployFn = deploy; +const actualBetaHandler: BetaHandlerFn = beta.handler; -// Flexible `deployFn` interface for testing. +// Flexible `deployFn` / `betaHandler` interfaces for testing. async function deployHandler any>( options: DeployOptions, logger: Logger, - deployFn: F + deployFn: F, + betaHandler?: BetaHandlerFn ): Promise>; async function deployHandler( options: DeployOptions, logger: Logger, - deployFn = actualDeploy + deployFn = actualDeploy, + betaHandler: BetaHandlerFn = actualBetaHandler ) { if (options.beta) { - return beta.handler(options as any, logger); + return betaHandler(options as any, logger); } try { @@ -41,7 +45,7 @@ async function deployHandler( 'openfn.yaml' ); if (!process.env.PREFER_LEGACY_SYNC && (await fileExists(v2ConfigPath))) { - return redirectTov2(v2ConfigPath, options, config, logger); + return redirectTov2(v2ConfigPath, options, config, logger, betaHandler); } if (options.confirm === false) { @@ -110,7 +114,8 @@ const redirectTov2 = async ( v2ConfigPath: string, options: DeployOptions, config: DeployConfig, - logger: Logger + logger: Logger, + betaHandler: BetaHandlerFn = actualBetaHandler ) => { logger.always( 'Detected openfn.yaml file - switching to v2 deploy (openfn project deploy). Set PREFER_LEGACY_SYNC to disable this.' @@ -121,7 +126,7 @@ const redirectTov2 = async ( const endpoint = options.endpoint ?? v2config?.project?.endpoint ?? config.endpoint; - return beta.handler( + return betaHandler( { ...options, force: true, diff --git a/packages/cli/test/deploy/deploy.test.ts b/packages/cli/test/deploy/deploy.test.ts index b58bc25a9..0e9ea411d 100644 --- a/packages/cli/test/deploy/deploy.test.ts +++ b/packages/cli/test/deploy/deploy.test.ts @@ -88,6 +88,91 @@ test.serial('sets the exit code to 1', async (t) => { process.exitCode = origExitCode; }); +test.serial( + 'redirects to beta handler when openfn.yaml exists in cwd', + async (t) => { + t.plan(3); + mockfs({ + ['./config.json']: `{"apiKey": "123"}`, + ['./project.yaml']: `{"apiKey": "123"}`, + ['./openfn.yaml']: 'project:\n endpoint: https://from-yaml.org', + }); + + await deployHandler(options, logger, mockDeploy, async (args: any) => { + t.is(args.force, true); + t.is(args.endpoint, 'https://from-yaml.org'); + t.truthy(logger._find('always', /Detected openfn.yaml file/i)); + }); + } +); + +test.serial('does not redirect when PREFER_LEGACY_SYNC is set', async (t) => { + t.plan(1); + mockfs({ + ['./config.json']: `{"apiKey": "123", "endpoint": "https://api.example.com"}`, + ['./project.yaml']: `{"apiKey": "123"}`, + ['./openfn.yaml']: 'project:\n endpoint: https://from-yaml.org', + }); + process.env.PREFER_LEGACY_SYNC = '1'; + + await deployHandler(options, logger, mockDeploy, async (args: any) => { + t.fail('called beta handler'); + }); + + delete process.env.PREFER_LEGACY_SYNC; + t.pass(); +}); + +test.serial('CLI endpoint preferred over openfn.yaml endpoint', async (t) => { + t.plan(1); + mockfs({ + ['./config.json']: `{"apiKey": "123"}`, + ['./project.yaml']: `{"apiKey": "123"}`, + ['./openfn.yaml']: 'project:\n endpoint: https://from-yaml.org', + }); + + await deployHandler( + { ...options, endpoint: 'https://from-cli.org' } as any, + logger, + mockDeploy, + async (args: any) => { + t.is(args.endpoint, 'https://from-cli.org'); + } + ); +}); + +test.serial( + 'openfn.yaml endpoint preferred over config.json endpoint', + async (t) => { + mockfs({ + ['./config.json']: `{"apiKey": "123", "endpoint": "https://from-config.org"}`, + ['./project.yaml']: `{"apiKey": "123"}`, + ['./openfn.yaml']: 'project:\n endpoint: https://from-yaml.org', + }); + + await deployHandler(options, logger, mockDeploy, async (args: any) => { + t.is(args.endpoint, 'https://from-yaml.org'); + }); + } +); + +test.serial('CLI apiKey preferred over config.json apiKey', async (t) => { + mockfs({ + ['./config.json']: `{"apiKey": "from-config"}`, + ['./project.yaml']: `{"apiKey": "from-config"}`, + ['./openfn.yaml']: 'project:\n endpoint: https://from-yaml.org', + }); + + await deployHandler( + { ...options, apiKey: 'from-cli' } as any, + logger, + mockDeploy, + async (args: any) => { + t.is(args.apiKey, 'from-cli'); + } + ); +}); + test.serial('catches DeployErrors', async (t) => { const origExitCode = process.exitCode; From e8c900dea6d0c2e57ba9aa0a3763813f599a4c5a Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Tue, 26 May 2026 18:02:41 +0100 Subject: [PATCH 8/9] tidy logging --- packages/cli/src/projects/deploy.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/cli/src/projects/deploy.ts b/packages/cli/src/projects/deploy.ts index 48d93d5a8..11185bee2 100644 --- a/packages/cli/src/projects/deploy.ts +++ b/packages/cli/src/projects/deploy.ts @@ -148,7 +148,6 @@ const syncProjects = async ( // TODO should we prefer endpoint over alias? // maybe if it's explicitly passed? const endpoint = trackedProject.openfn?.endpoint ?? config.endpoint; - console.log({ config }); const { data } = await fetchProject( endpoint, config.apiKey, @@ -162,7 +161,7 @@ const syncProjects = async ( logger.info('Downloaded latest version of project at ', endpoint); } catch (e) { - console.log(e); + logger.error(e); throw e; // If fetch failed because of compatiblity with the local project, what do we do? // Well, actually I don't think I want this fetch to write to disk yet From 3f652f6d8af806ec2b74185718463c33391041e6 Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Tue, 26 May 2026 18:03:27 +0100 Subject: [PATCH 9/9] remove log code --- packages/cli/src/projects/util.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/cli/src/projects/util.ts b/packages/cli/src/projects/util.ts index ef16d5825..abe1f7e7b 100644 --- a/packages/cli/src/projects/util.ts +++ b/packages/cli/src/projects/util.ts @@ -121,7 +121,6 @@ export async function fetchProject( ): Promise<{ data: Provisioner.Project | null }> { const url = getLightningUrl(endpoint, projectId, snapshots); logger?.info(`Checking ${url} for existing project`); - console.log({ apiKey }); try { const response = await fetch(url, { headers: {