diff --git a/lib/state-machines/state-types/instrinsics/index.js b/lib/state-machines/state-types/instrinsics/index.js index e29ccf27..40a1b881 100644 --- a/lib/state-machines/state-types/instrinsics/index.js +++ b/lib/state-machines/state-types/instrinsics/index.js @@ -1,11 +1,7 @@ -const statesFormat = require('./format') -const statesArray = require('./array') -const statesStringToJson = require('./stringToJson') -const statesJsonToString = require('./jsonToString') - module.exports = { - Format: statesFormat, - Array: statesArray, - StringToJson: statesStringToJson, - JsonToString: statesJsonToString + Format: require('./format'), + Array: require('./array'), + StringToJson: require('./stringToJson'), + JsonToString: require('./jsonToString'), + UUID: require('./uuid') } diff --git a/lib/state-machines/state-types/instrinsics/uuid.js b/lib/state-machines/state-types/instrinsics/uuid.js new file mode 100644 index 00000000..9c1ad276 --- /dev/null +++ b/lib/state-machines/state-types/instrinsics/uuid.js @@ -0,0 +1,21 @@ +/* + Description from https://states-language.net/#appendix-b + + Use the States.UUID intrinsic function to return a version 4 universally unique identifier (v4 UUID) generated using random numbers. + For example, you can use this function to call other AWS services or resources that need a UUID parameter or insert items in a DynamoDB table. + + The States.UUID function is called with no arguments specified: + + "uuid.$": "States.UUID()" + The function returns a randomly generated UUID, as in the following example: + + {"uuid": "ca4c1140-dcc1-40cd-ad05-7b4aa23df4a8" } +*/ + +const { v4: uuid } = require('uuid') + +function statesUUID () { + return uuid() +} + +module.exports = statesUUID diff --git a/test/fixtures/state-machines/intrinsic-functions/index.js b/test/fixtures/state-machines/intrinsic-functions/index.js index 7447c7a6..432f787a 100644 --- a/test/fixtures/state-machines/intrinsic-functions/index.js +++ b/test/fixtures/state-machines/intrinsic-functions/index.js @@ -25,5 +25,7 @@ module.exports = { Array_emptyArray: require('./array/empty-array.json'), Array_numbers: require('./array/numbers.json'), Array_strings: require('./array/strings.json'), - Array_nestedStatesArray: require('./array/nested-states-array.json') + Array_nestedStatesArray: require('./array/nested-states-array.json'), + + UUID: require('./uuid.json') } diff --git a/test/fixtures/state-machines/intrinsic-functions/uuid.json b/test/fixtures/state-machines/intrinsic-functions/uuid.json new file mode 100644 index 00000000..b2177f56 --- /dev/null +++ b/test/fixtures/state-machines/intrinsic-functions/uuid.json @@ -0,0 +1,13 @@ +{ + "Comment": "Example of the Intrinsic Function State", + "StartAt": "First", + "States": { + "First": { + "Type": "Pass", + "Parameters": { + "foo.$": "States.UUID()" + }, + "End": true + } + } +} diff --git a/test/intrinsic-functions.js b/test/intrinsic-functions.js index a171f7f5..46f5c562 100644 --- a/test/intrinsic-functions.js +++ b/test/intrinsic-functions.js @@ -17,14 +17,14 @@ describe('Intrinsic Functions', function () { describe('Function parsing', () => { describe('function call', () => { const goodCalls = [ - "States.Format('hello {}', 'world')", + 'States.Format(\'hello {}\', \'world\')', 'States.StringToJson($path)', 'States.JsonToString($path)', 'States.Array()', 'States.Array(99)', 'States.Array(true)', 'States.Array(false)', - "States.Array('fridge-freezer')", + 'States.Array(\'fridge-freezer\')', 'States.Array(null)', 'States.Array(States.Array(1, 2))', 'States.Array(1, 2, States.Array(3, 4))', @@ -56,7 +56,7 @@ describe('Intrinsic Functions', function () { describe('tokenise arguments', () => { const args = [ - ["'a string'", 'string:a string'], + ['\'a string\'', 'string:a string'], ['123', 'number:123'], ['123.45', 'number:123.45'], ['-123', 'number:-123'], @@ -66,11 +66,11 @@ describe('Intrinsic Functions', function () { ['null', 'null:null'], ['$.path', 'path:$.path'], ['$.array[0:2]', 'path:$.array[0:2]'], - ["'\\''", "string:\\'"], - ["'\\}'", 'string:\\}'], - ["'\\{'", 'string:\\{'], - ["'\\\\'", 'string:\\\\'], - ["'embedded \\{\\'hello\\'\\}'", "string:embedded \\{\\'hello\\'\\}"] + ['\'\\\'\'', 'string:\\\''], + ['\'\\}\'', 'string:\\}'], + ['\'\\{\'', 'string:\\{'], + ['\'\\\\\'', 'string:\\\\'], + ['\'embedded \\{\\\'hello\\\'\\}\'', 'string:embedded \\{\\\'hello\\\'\\}'] ] const context = { @@ -127,9 +127,9 @@ describe('Intrinsic Functions', function () { [['{}', null], 'null'], [['{}{}', null, null], 'nullnull'], [['{}', '\\{\\}'], '{}'], - [["\\\\\\{\\'Socks\\'\\}\\\\"], "\\{'Socks'}\\"], - [['{}', "\\\\\\{\\'Socks\\'\\}\\\\"], "\\{'Socks'}\\"], - [['\\\\\\{{}\\}\\\\', "\\'Socks\\'"], "\\{'Socks'}\\"] + [['\\\\\\{\\\'Socks\\\'\\}\\\\'], '\\{\'Socks\'}\\'], + [['{}', '\\\\\\{\\\'Socks\\\'\\}\\\\'], '\\{\'Socks\'}\\'], + [['\\\\\\{{}\\}\\\\', '\\\'Socks\\\''], '\\{\'Socks\'}\\'] ] for (const [args, expected] of goodFormatTests) { @@ -187,6 +187,13 @@ describe('Intrinsic Functions', function () { } }) + describe('States.UUID', () => { + it('States.UUID()', () => { + const uuid = intrinsicFunctions.UUID() + expect(uuid).to.be.a('string') + }) + }) + describe('In State Machines', () => { let statebox @@ -260,5 +267,24 @@ describe('Intrinsic Functions', function () { } }) } + + describe('UUID', () => { + it('UUID', async () => { + const stateMachineName = 'UUID' + + let executionDescription = await statebox.startExecution( + {}, + stateMachineName, + {} // options + ) + + executionDescription = await statebox.waitUntilStoppedRunning(executionDescription.executionName) + + expect(executionDescription.status).to.eql('SUCCEEDED') + expect(executionDescription.stateMachineName).to.eql(stateMachineName) + expect(executionDescription.currentResource).to.eql(undefined) + expect(executionDescription.ctx.foo).to.be.a('string') + }) + }) }) // called from state machines })