diff --git a/.changeset/chatty-clocks-relax.md b/.changeset/chatty-clocks-relax.md new file mode 100644 index 000000000..d6edb7d11 --- /dev/null +++ b/.changeset/chatty-clocks-relax.md @@ -0,0 +1,5 @@ +--- +'@openfn/ws-worker': patch +--- + +Allow steps to specify their own adaptor version diff --git a/packages/ws-worker/src/util/convert-lightning-plan.ts b/packages/ws-worker/src/util/convert-lightning-plan.ts index 45a5e52e7..39629935e 100644 --- a/packages/ws-worker/src/util/convert-lightning-plan.ts +++ b/packages/ws-worker/src/util/convert-lightning-plan.ts @@ -88,8 +88,16 @@ export default ( const job = step as Job; if (job.expression?.match(/(collections\.)/)) { hasCollections = true; - job.adaptors ??= []; - job.adaptors.push(`@openfn/language-collections@${collectionsVersion}`); + if ( + !job.adaptors?.find((v) => + v.startsWith('@openfn/language-collections') + ) + ) { + job.adaptors ??= []; + job.adaptors.push( + `@openfn/language-collections@${collectionsVersion}` + ); + } } }); return hasCollections; diff --git a/packages/ws-worker/test/util/convert-lightning-plan.test.ts b/packages/ws-worker/test/util/convert-lightning-plan.test.ts index ed8f9da31..e193a7273 100644 --- a/packages/ws-worker/test/util/convert-lightning-plan.test.ts +++ b/packages/ws-worker/test/util/convert-lightning-plan.test.ts @@ -614,7 +614,36 @@ test('append the collections adaptor to jobs that use it', (t) => { t.deepEqual(b.adaptors, ['common', '@openfn/language-collections@1.0.0']); }); -test('append the collections credential to jobs that use it', (t) => { +test('do not append the collections adaptor to jobs that already have it', (t) => { + const run: Partial = { + id: 'w', + jobs: [ + createNode({ + id: 'a', + body: 'collections.each("c", "k", (state) => state)', + adaptor: '@openfn/language-collections@latest', + }), + ], + triggers: [{ id: 't', type: 'cron' }], + edges: [createEdge('t', 'a')], + }; + + const { plan } = convertPlan(run as LightningPlan, { + collectionsVersion: '1.0.0', + }); + + const [_t, a] = plan.workflow.steps; + + // @ts-ignore + t.deepEqual(a.adaptors, ['@openfn/language-collections@latest']); + + t.deepEqual(plan.workflow.credentials, { + collections_token: true, + collections_endpoint: true, + }); +}); + +test('append the collections credential to workflows that use it', (t) => { const run: Partial = { id: 'w', jobs: [