diff --git a/source/SIL.AppBuilder.Portal/node-server/workflow.ts b/source/SIL.AppBuilder.Portal/node-server/workflow.ts new file mode 100644 index 000000000..5e255c269 --- /dev/null +++ b/source/SIL.AppBuilder.Portal/node-server/workflow.ts @@ -0,0 +1,42 @@ +import { createMachine } from "xstate"; + + +export const NoAdminS3 = createMachine({ + initial: 'start', + states: { + AppBuilderConfiguration: { + on: { + 'Continue': { + target: 'ProductBuild' + } + } + }, + SynchronizeData: { + on: { + 'Continue': { + target: 'ProductBuild' + } + } + }, + ProductBuild: { + on: { + 'BuildSuccessful': { + target: 'VerifyAndPublish' + } + } + }, + VerifyAndPublish: { + on: { + 'Reject': { + target: 'SynchronizeData' + }, + 'Approve': { + target: 'Published' + } + } + }, + Published: { + type: 'final' + } + } +}); diff --git a/source/SIL.AppBuilder.Portal/package-lock.json b/source/SIL.AppBuilder.Portal/package-lock.json index 0ff5596ab..0d3375964 100644 --- a/source/SIL.AppBuilder.Portal/package-lock.json +++ b/source/SIL.AppBuilder.Portal/package-lock.json @@ -11,8 +11,10 @@ "@auth/express": "^0.6.0", "@auth/sveltekit": "^1.4.2", "@bull-board/express": "^5.21.3", + "@statelyai/inspect": "^0.4.0", "express": "^4.19.2", - "sil.appbuilder.portal.common": "file:common" + "sil.appbuilder.portal.common": "file:common", + "xstate": "^5.18.1" }, "devDependencies": { "@auth/core": "^0.32.0", @@ -28,6 +30,7 @@ "@typescript-eslint/eslint-plugin": "^6.0.0", "@typescript-eslint/parser": "^6.0.0", "@vvo/tzdb": "^6.142.0", + "@xstate/svelte": "^3.0.4", "autoprefixer": "^10.4.16", "commander": "^11.1.0", "daisyui": "^4.12.10", @@ -2367,6 +2370,22 @@ "dev": true, "optional": true }, + "node_modules/@statelyai/inspect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@statelyai/inspect/-/inspect-0.4.0.tgz", + "integrity": "sha512-VxQldRlKYcu6rzLY83RSXVwMYexkH6hNx85B89YWYyXYWtNGaWHFCwV7a/Kz8FFPeUz8EKVAnyMOg2kNpn07wQ==", + "dependencies": { + "fast-safe-stringify": "^2.1.1", + "isomorphic-ws": "^5.0.0", + "partysocket": "^0.0.25", + "safe-stable-stringify": "^2.4.3", + "superjson": "^1.13.3", + "uuid": "^9.0.1" + }, + "peerDependencies": { + "xstate": "^5.5.1" + } + }, "node_modules/@sveltejs/adapter-node": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-5.2.0.tgz", @@ -3027,6 +3046,21 @@ "integrity": "sha512-k10BEEr0c3q65yPkhLp4fdMwSMJVj6jP+UDWRG8Psb6R/BLs9yKuz23pf+1rH5Naztiu1d4KM3eArvf3bjS6ZQ==", "dev": true }, + "node_modules/@xstate/svelte": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@xstate/svelte/-/svelte-3.0.4.tgz", + "integrity": "sha512-C/ZNdVEFt3algFzWk2XFZh6WLrlxW0dRjqSan92n75qOUuW0grRnPGZtVId9f9TOLoqi5T/LWzWhuPZ7BWhC7w==", + "dev": true, + "peerDependencies": { + "svelte": "^3.24.1 || ^4", + "xstate": "^5.18.1" + }, + "peerDependenciesMeta": { + "xstate": { + "optional": true + } + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -3754,6 +3788,20 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", @@ -4502,6 +4550,17 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz", + "integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==", + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -4625,6 +4684,11 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "node_modules/fastparse": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", @@ -5336,12 +5400,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "peerDependencies": { + "ws": "*" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -6247,6 +6330,14 @@ "node": ">= 0.8" } }, + "node_modules/partysocket": { + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/partysocket/-/partysocket-0.0.25.tgz", + "integrity": "sha512-1oCGA65fydX/FgdnsiBh68buOvfxuteoZVSb3Paci2kRp/7lhF0HyA8EDb5X/O6FxId1e+usPTQNRuzFEvkJbQ==", + "dependencies": { + "event-target-shim": "^6.0.2" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -7054,6 +7145,14 @@ } ] }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -7561,6 +7660,17 @@ "node": ">= 6" } }, + "node_modules/superjson": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-1.13.3.tgz", + "integrity": "sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/superstruct": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", @@ -9069,6 +9179,36 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xstate": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/xstate/-/xstate-5.18.1.tgz", + "integrity": "sha512-m02IqcCQbaE/kBQLunwub/5i8epvkD2mFutnL17Oeg1eXTShe1sRF4D5mhv1dlaFO4vbW5gRGRhraeAD5c938g==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/xstate" + } + }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", diff --git a/source/SIL.AppBuilder.Portal/package.json b/source/SIL.AppBuilder.Portal/package.json index d6f3d96b9..475b5779b 100644 --- a/source/SIL.AppBuilder.Portal/package.json +++ b/source/SIL.AppBuilder.Portal/package.json @@ -33,6 +33,7 @@ "@typescript-eslint/eslint-plugin": "^6.0.0", "@typescript-eslint/parser": "^6.0.0", "@vvo/tzdb": "^6.142.0", + "@xstate/svelte": "^3.0.4", "autoprefixer": "^10.4.16", "commander": "^11.1.0", "daisyui": "^4.12.10", @@ -65,7 +66,9 @@ "@auth/express": "^0.6.0", "@auth/sveltekit": "^1.4.2", "@bull-board/express": "^5.21.3", + "@statelyai/inspect": "^0.4.0", "express": "^4.19.2", - "sil.appbuilder.portal.common": "file:common" + "sil.appbuilder.portal.common": "file:common", + "xstate": "^5.18.1" } }