diff --git a/integration-tests/execute/CHANGELOG.md b/integration-tests/execute/CHANGELOG.md index 70a4e33fa..a41799f84 100644 --- a/integration-tests/execute/CHANGELOG.md +++ b/integration-tests/execute/CHANGELOG.md @@ -1,5 +1,12 @@ # @openfn/integration-tests-execute +## 1.0.11 + +### Patch Changes + +- Updated dependencies + - @openfn/compiler@0.4.2 + ## 1.0.10 ### Patch Changes diff --git a/integration-tests/execute/ava.config.js b/integration-tests/execute/ava.config.js new file mode 100644 index 000000000..7322d907f --- /dev/null +++ b/integration-tests/execute/ava.config.js @@ -0,0 +1,13 @@ +export default { + extensions: { + ts: 'module', + }, + + environmentVariables: { + TS_NODE_TRANSPILE_ONLY: 'true', + }, + + nodeArguments: ['--loader=ts-node/esm', '--no-warnings', '--experimental-vm-modules'], + + files: ['test/**/*test.ts'], +}; diff --git a/integration-tests/execute/package.json b/integration-tests/execute/package.json index 5d9e6e7d9..bdb6d3b9b 100644 --- a/integration-tests/execute/package.json +++ b/integration-tests/execute/package.json @@ -1,7 +1,7 @@ { "name": "@openfn/integration-tests-execute", "private": true, - "version": "1.0.10", + "version": "1.0.11", "description": "Job execution tests", "author": "Open Function Group ", "license": "ISC", diff --git a/integration-tests/execute/test/lazy-state.test.ts b/integration-tests/execute/test/lazy-state.test.ts new file mode 100644 index 000000000..eef9f8c28 --- /dev/null +++ b/integration-tests/execute/test/lazy-state.test.ts @@ -0,0 +1,51 @@ +import test from 'ava'; +import execute from '../src/execute'; + +test.serial( + 'use lazy-state in template literal & property access', + async (t) => { + const state = { + keyName: 'someKey', + firstName: 'John', + lastName: 'Doe', + }; + const job = ` +fnIf(\`$\{$.keyName\}\` === 'someKey', state => { + state.literal = true; + return state; +}) + +fnIf($.firstName + $['lastName'] === 'JohnDoe', state=> { + state.concat = true; + return state; +})`; + + const result = await execute(job, state); + t.is(result.literal, true); + t.is(result.concat, true); + } +); + +test.serial('state function called with lazy-state', async (t) => { + const state = { data: {} }; + + const job = ` +fn((state) => { + state.callMeMaybe = (value) => { + state.data.greetings = "Hello " + value + return state; + } + return state +}); + +fn(state => { + state.data.name = "John" + return state; +}) + +fn($.callMeMaybe($.data.name))`; + + const result = await execute(job, state); + + t.deepEqual(result, { data: { name: 'John', greetings: 'Hello John' } }); +}); diff --git a/integration-tests/worker/CHANGELOG.md b/integration-tests/worker/CHANGELOG.md index a051d5ee7..2a4ccfa94 100644 --- a/integration-tests/worker/CHANGELOG.md +++ b/integration-tests/worker/CHANGELOG.md @@ -1,5 +1,14 @@ # @openfn/integration-tests-worker +## 1.0.69 + +### Patch Changes + +- Updated dependencies + - @openfn/ws-worker@1.8.6 + - @openfn/engine-multi@1.4.5 + - @openfn/lightning-mock@2.0.26 + ## 1.0.68 ### Patch Changes diff --git a/integration-tests/worker/package.json b/integration-tests/worker/package.json index d42e29cbc..3f114b736 100644 --- a/integration-tests/worker/package.json +++ b/integration-tests/worker/package.json @@ -1,7 +1,7 @@ { "name": "@openfn/integration-tests-worker", "private": true, - "version": "1.0.68", + "version": "1.0.69", "description": "Lightning WOrker integration tests", "author": "Open Function Group ", "license": "ISC", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index d92e20c1a..e757e2776 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,13 @@ # @openfn/cli +## 1.8.12 + +### Patch Changes + +- When using lazy state in job code, allow functions to be called directly on the state object, ie, `$.generateUUID()` +- Updated dependencies + - @openfn/compiler@0.4.2 + ## 1.8.11 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 5d85d7415..18accbab3 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@openfn/cli", - "version": "1.8.11", + "version": "1.8.12", "description": "CLI devtools for the openfn toolchain.", "engines": { "node": ">=18", diff --git a/packages/compiler/CHANGELOG.md b/packages/compiler/CHANGELOG.md index 0dbb9eff4..856ba7b1d 100644 --- a/packages/compiler/CHANGELOG.md +++ b/packages/compiler/CHANGELOG.md @@ -1,5 +1,11 @@ # @openfn/compiler +## 0.4.2 + +### Patch Changes + +- When using lazy state in job code, allow functions to be called directly on the state object, ie, `$.generateUUID()` + ## 0.4.1 ### Patch Changes diff --git a/packages/compiler/package.json b/packages/compiler/package.json index b68b6f06d..04c9164b9 100644 --- a/packages/compiler/package.json +++ b/packages/compiler/package.json @@ -1,6 +1,6 @@ { "name": "@openfn/compiler", - "version": "0.4.1", + "version": "0.4.2", "description": "Compiler and language tooling for openfn jobs.", "author": "Open Function Group ", "license": "ISC", diff --git a/packages/compiler/src/transforms/lazy-state.ts b/packages/compiler/src/transforms/lazy-state.ts index 7cc8ae13a..457ebc8d2 100644 --- a/packages/compiler/src/transforms/lazy-state.ts +++ b/packages/compiler/src/transforms/lazy-state.ts @@ -29,7 +29,15 @@ const ensureParentArrow = (path: NodePath) => { } if (root && n.CallExpression.check(root.node)) { - const arg = last as NodePath; + let arg = last as NodePath; + if ( + arg.parentPath && + n.CallExpression.check(arg.parentPath.node) && + n.MemberExpression.check(arg.parentPath.node.callee) && + arg.parentPath.node.callee.object.name === 'state' + ) { + arg = arg.parentPath; + } if (!isOpenFunction(arg)) { const params = b.identifier('state'); diff --git a/packages/compiler/test/transforms/lazy-state.test.ts b/packages/compiler/test/transforms/lazy-state.test.ts index bdd939d74..a941cdab1 100644 --- a/packages/compiler/test/transforms/lazy-state.test.ts +++ b/packages/compiler/test/transforms/lazy-state.test.ts @@ -219,3 +219,21 @@ test('convert logical not', (t) => { t.is(code, 'get(state => !state.data.x)'); }); + +test('convert function call on state', (t) => { + const ast = parse('fn($.callMeMaybe())'); + + const transformed = transform(ast, [visitors]); + const { code } = print(transformed); + + t.is(code, 'fn(state => state.callMeMaybe())'); +}); + +test('convert function call on state with state argument', (t) => { + const ast = parse('fn($.callMeMaybe($.age))'); + + const transformed = transform(ast, [visitors]); + const { code } = print(transformed); + + t.is(code, 'fn(state => state.callMeMaybe(state.age))'); +}); diff --git a/packages/engine-multi/CHANGELOG.md b/packages/engine-multi/CHANGELOG.md index 8839cee34..9d1431ec7 100644 --- a/packages/engine-multi/CHANGELOG.md +++ b/packages/engine-multi/CHANGELOG.md @@ -1,5 +1,12 @@ # engine-multi +## 1.4.5 + +### Patch Changes + +- Updated dependencies + - @openfn/compiler@0.4.2 + ## 1.4.4 ### Patch Changes diff --git a/packages/engine-multi/package.json b/packages/engine-multi/package.json index 638111cbb..6ddc63cc5 100644 --- a/packages/engine-multi/package.json +++ b/packages/engine-multi/package.json @@ -1,6 +1,6 @@ { "name": "@openfn/engine-multi", - "version": "1.4.4", + "version": "1.4.5", "description": "Multi-process runtime engine", "main": "dist/index.js", "type": "module", diff --git a/packages/lightning-mock/CHANGELOG.md b/packages/lightning-mock/CHANGELOG.md index fff473786..b67ec1a22 100644 --- a/packages/lightning-mock/CHANGELOG.md +++ b/packages/lightning-mock/CHANGELOG.md @@ -1,5 +1,11 @@ # @openfn/lightning-mock +## 2.0.26 + +### Patch Changes + +- @openfn/engine-multi@1.4.5 + ## 2.0.25 ### Patch Changes diff --git a/packages/lightning-mock/package.json b/packages/lightning-mock/package.json index 404159a8f..f9634537c 100644 --- a/packages/lightning-mock/package.json +++ b/packages/lightning-mock/package.json @@ -1,6 +1,6 @@ { "name": "@openfn/lightning-mock", - "version": "2.0.25", + "version": "2.0.26", "private": true, "description": "A mock Lightning server", "main": "dist/index.js", diff --git a/packages/ws-worker/CHANGELOG.md b/packages/ws-worker/CHANGELOG.md index ef521c17e..ab50792c9 100644 --- a/packages/ws-worker/CHANGELOG.md +++ b/packages/ws-worker/CHANGELOG.md @@ -1,5 +1,12 @@ # ws-worker +## 1.8.6 + +### Patch Changes + +- When using lazy state in job code, allow functions to be called directly on the state object, ie, `$.generateUUID()` + - @openfn/engine-multi@1.4.5 + ## 1.8.5 ### Patch Changes diff --git a/packages/ws-worker/package.json b/packages/ws-worker/package.json index 95afa5274..b1a1bd5ef 100644 --- a/packages/ws-worker/package.json +++ b/packages/ws-worker/package.json @@ -1,6 +1,6 @@ { "name": "@openfn/ws-worker", - "version": "1.8.5", + "version": "1.8.6", "description": "A Websocket Worker to connect Lightning to a Runtime Engine", "main": "dist/index.js", "type": "module",