From 70a80d676f195f395489c2fa60857abda74e9151 Mon Sep 17 00:00:00 2001 From: Presley Date: Wed, 12 Jan 2022 03:27:51 +0000 Subject: [PATCH 1/3] Install XState --- package.json | 4 ++++ yarn.lock | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/package.json b/package.json index eb099b34916a0..377f29cec0d36 100644 --- a/package.json +++ b/package.json @@ -9,5 +9,9 @@ }, "devDependencies": { "prettier": "2.5.1" + }, + "dependencies": { + "@xstate/react": "^1.6.3", + "xstate": "^4.27.0" } } diff --git a/yarn.lock b/yarn.lock index 68fc04f270f0a..f741abad9ce5c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,37 @@ # yarn lockfile v1 +"@xstate/react@^1.6.3": + version "1.6.3" + resolved "https://registry.yarnpkg.com/@xstate/react/-/react-1.6.3.tgz#706f3beb7bc5879a78088985c8fd43b9dab7f725" + integrity sha512-NCUReRHPGvvCvj2yLZUTfR0qVp6+apc8G83oXSjN4rl89ZjyujiKrTff55bze/HrsvCsP/sUJASf2n0nzMF1KQ== + dependencies: + use-isomorphic-layout-effect "^1.0.0" + use-subscription "^1.3.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + prettier@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== + +use-isomorphic-layout-effect@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz#7bb6589170cd2987a152042f9084f9effb75c225" + integrity sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ== + +use-subscription@^1.3.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" + integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== + dependencies: + object-assign "^4.1.1" + +xstate@^4.27.0: + version "4.27.0" + resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.27.0.tgz#f3c918ac4229bd5e6dec2231e991ba55c6bfa559" + integrity sha512-ohOwDM9tViC/zSSmY9261CHblDPqiaAk5vyjVbi69uJv9fGWMzlm0VDQwM2OvC61GKfXVBeuWSMkL7LPUsTpfA== From 7a90d628790cf84205aaec0bb481a7050351bd43 Mon Sep 17 00:00:00 2001 From: Presley Date: Wed, 12 Jan 2022 03:27:59 +0000 Subject: [PATCH 2/3] Add models --- provisionersdk/proto/xstate_models.ts | 116 ++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 provisionersdk/proto/xstate_models.ts diff --git a/provisionersdk/proto/xstate_models.ts b/provisionersdk/proto/xstate_models.ts new file mode 100644 index 0000000000000..75f14f4b7765c --- /dev/null +++ b/provisionersdk/proto/xstate_models.ts @@ -0,0 +1,116 @@ +import { createMachine } from 'xstate'; + +/** If using VSCode, install the XState VSCode extension to get a + * "Open Inspector" link above each machine in your code that will + * visualize the machine. Otherwise, you can paste code into stately.ai/viz. + */ + +interface WorkspaceContext { + errorMessage?: string +} + +type WorkspaceEvent = + | { type: "START" } + | { type: "STOP" } + | { type: "REBUILD" } + +export const workspaceModel = createMachine( + { + id: "workspaceV2Model", + initial: "off", + states: { + off: { + on: { + START: "starting" + } + }, + starting: { + invoke: { + src: "buildWorkspace", + onDone: "running", + onError: "error", + }, + }, + running: { + on: { + STOP: "stopping", + REBUILD: "rebuilding" + } + }, + stopping: { + invoke: { + src: "stopWorkspace", + onDone: "off", + onError: "error" + } + }, + rebuilding: { + invoke: { + src: "stopAndStartWorkspace", + onDone: "running", + onError: "error" + } + }, + error: { + entry: "saveErrorMessage", + }, + }, + }, +) + +export const provisionerModel = createMachine({ + id: 'provisionerModel', + initial: 'starting', + context: { + automator: undefined, + supportedProjects: [] + }, + states: { + starting: { + on: { + PROVISION: 'provisioning', + PARSE: 'parsing' + } + }, + provisioning: { + invoke: { + src: "provision", + onDone: 'off', + onError: 'off' + } + }, + parsing: { + invoke: { + src: 'parse', + onDone: 'off', + onError: 'off' + } + }, + off: { + type: 'final' + } + } +}) + +export const provisionerDaemonModel = createMachine({ + id: 'provisionerd', + initial: 'polling', + states: { + polling: { + on: { + JOB_HAS_PROVISIONER_REGISTERED: 'executing', + NO_JOB_READY: 'polling' + } + }, + executing: { + invoke: { + id: 'callProvisionerWithParameters', + src: 'provisionerModel', + onDone: {target: 'polling', actions: ['returnState', 'parseProjectCode']}, + onError: {target: 'polling', actions: ['returnState', 'markJobFailed']} + } + } + } +}, { + services: { provisionerModel } +}) \ No newline at end of file From a1ea349de3861df3aa6de170673c391a88b15701 Mon Sep 17 00:00:00 2001 From: Presley Date: Wed, 12 Jan 2022 03:45:28 +0000 Subject: [PATCH 3/3] Lint --- provisionersdk/proto/xstate_models.ts | 158 +++++++++++++------------- 1 file changed, 78 insertions(+), 80 deletions(-) diff --git a/provisionersdk/proto/xstate_models.ts b/provisionersdk/proto/xstate_models.ts index 75f14f4b7765c..21cd2c6bfd597 100644 --- a/provisionersdk/proto/xstate_models.ts +++ b/provisionersdk/proto/xstate_models.ts @@ -1,7 +1,7 @@ -import { createMachine } from 'xstate'; +import { createMachine } from "xstate" -/** If using VSCode, install the XState VSCode extension to get a - * "Open Inspector" link above each machine in your code that will +/** If using VSCode, install the XState VSCode extension to get a + * "Open Inspector" link above each machine in your code that will * visualize the machine. Otherwise, you can paste code into stately.ai/viz. */ @@ -9,108 +9,106 @@ interface WorkspaceContext { errorMessage?: string } -type WorkspaceEvent = - | { type: "START" } - | { type: "STOP" } - | { type: "REBUILD" } +type WorkspaceEvent = { type: "START" } | { type: "STOP" } | { type: "REBUILD" } -export const workspaceModel = createMachine( - { - id: "workspaceV2Model", - initial: "off", - states: { - off: { - on: { - START: "starting" - } - }, - starting: { - invoke: { - src: "buildWorkspace", - onDone: "running", - onError: "error", - }, +export const workspaceModel = createMachine({ + id: "workspaceV2Model", + initial: "off", + states: { + off: { + on: { + START: "starting", }, - running: { - on: { - STOP: "stopping", - REBUILD: "rebuilding" - } + }, + starting: { + invoke: { + src: "buildWorkspace", + onDone: "running", + onError: "error", }, - stopping: { - invoke: { - src: "stopWorkspace", - onDone: "off", - onError: "error" - } + }, + running: { + on: { + STOP: "stopping", + REBUILD: "rebuilding", }, - rebuilding: { - invoke: { - src: "stopAndStartWorkspace", - onDone: "running", - onError: "error" - } + }, + stopping: { + invoke: { + src: "stopWorkspace", + onDone: "off", + onError: "error", }, - error: { - entry: "saveErrorMessage", + }, + rebuilding: { + invoke: { + src: "stopAndStartWorkspace", + onDone: "running", + onError: "error", }, }, + error: { + entry: "saveErrorMessage", + }, }, -) +}) export const provisionerModel = createMachine({ - id: 'provisionerModel', - initial: 'starting', + id: "provisionerModel", + initial: "starting", context: { automator: undefined, - supportedProjects: [] + supportedProjects: [], }, states: { starting: { on: { - PROVISION: 'provisioning', - PARSE: 'parsing' - } + PROVISION: "provisioning", + PARSE: "parsing", + }, }, provisioning: { invoke: { src: "provision", - onDone: 'off', - onError: 'off' - } + onDone: "off", + onError: "off", + }, }, parsing: { invoke: { - src: 'parse', - onDone: 'off', - onError: 'off' - } + src: "parse", + onDone: "off", + onError: "off", + }, }, off: { - type: 'final' - } - } + type: "final", + }, + }, }) -export const provisionerDaemonModel = createMachine({ - id: 'provisionerd', - initial: 'polling', - states: { - polling: { - on: { - JOB_HAS_PROVISIONER_REGISTERED: 'executing', - NO_JOB_READY: 'polling' - } +export const provisionerDaemonModel = createMachine( + { + id: "provisionerd", + initial: "polling", + states: { + polling: { + on: { + JOB_HAS_PROVISIONER_REGISTERED: "executing", + NO_JOB_READY: "polling", + }, + }, + executing: { + invoke: { + id: "callProvisionerWithParameters", + src: "provisionerModel", + onDone: { target: "polling", actions: ["returnState", "parseProjectCode"] }, + onError: { target: "polling", actions: ["returnState", "markJobFailed"] }, + }, + }, }, - executing: { - invoke: { - id: 'callProvisionerWithParameters', - src: 'provisionerModel', - onDone: {target: 'polling', actions: ['returnState', 'parseProjectCode']}, - onError: {target: 'polling', actions: ['returnState', 'markJobFailed']} - } - } - } -}, { - services: { provisionerModel } -}) \ No newline at end of file + }, + { + services: { provisionerModel }, + }, +)