Skip to content

Commit

Permalink
feat(core): add guards to check step completion
Browse files Browse the repository at this point in the history
  • Loading branch information
Pmejna committed Nov 4, 2024
1 parent 3b8984a commit 5ac55db
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 2 deletions.
88 changes: 86 additions & 2 deletions packages/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
PromiseSnapshot,
} from 'xstate';

import { ProjectOptions, StaplerState } from './types';
import { ProjectOptions, StaplerState, StepsCompleted } from './types';
import { initializeState, saveState } from './utils/stateManager/stateManager';
import { createEnvFile } from './utils/env/createEnvFile';
import { initializeRepository } from './utils/github/install';
Expand All @@ -31,6 +31,12 @@ interface InstallMachineContext {
stateData: StaplerState;
}

const isStepCompleted = (stepName: keyof StepsCompleted) => {
return ({ context }: { context: InstallMachineContext; event: AnyEventObject }) => {
return context.stateData.stepsCompleted[stepName] === true;
};
};

const createStepMachine = (
performStepFunction: ActorLogic<PromiseSnapshot<void, InstallMachineContext>, AnyEventObject, InstallMachineContext>,
) => {
Expand Down Expand Up @@ -64,6 +70,12 @@ const createInstallMachine = (initialContext: InstallMachineContext) => {
context: initialContext,
states: {
initializeProject: {
always: [
{
guard: isStepCompleted('initializeProject'),
target: 'createEnvFile',
},
],
invoke: {
src: 'initializeProjectActor',
input: ({ context }) => context,
Expand All @@ -72,6 +84,12 @@ const createInstallMachine = (initialContext: InstallMachineContext) => {
},
},
createEnvFile: {
always: [
{
guard: isStepCompleted('createEnvFile'),
target: 'installPayload',
},
],
invoke: {
src: 'createEnvFileActor',
onDone: [
Expand All @@ -85,76 +103,142 @@ const createInstallMachine = (initialContext: InstallMachineContext) => {
},
},
installPayload: {
always: [
{
guard: isStepCompleted('installPayload'),
target: 'installSupabase',
},
],
invoke: {
src: 'installPayloadActor',
onDone: 'installSupabase',
onError: 'failed',
},
},
installSupabase: {
always: [
{
guard: isStepCompleted('installSupabase'),
target: 'createDocFiles',
},
],
invoke: {
src: 'installSupabaseActor',
onDone: 'createDocFiles',
onError: 'failed',
},
},
createDocFiles: {
always: [
{
guard: isStepCompleted('createDocFiles'),
target: 'prettifyCode',
},
],
invoke: {
src: 'createDocFilesActor',
onDone: 'prettifyCode',
onError: 'failed',
},
},
prettifyCode: {
always: [
{
guard: isStepCompleted('prettifyCode'),
target: 'initializeRepository',
},
],
invoke: {
src: 'prettifyCodeActor',
onDone: 'initializeRepository',
onError: 'failed',
},
},
initializeRepository: {
always: [
{
guard: isStepCompleted('initializeRepository'),
target: 'pushToGitHub',
},
],
invoke: {
src: 'initializeRepositoryActor',
onDone: 'pushToGitHub',
onError: 'failed',
},
},
pushToGitHub: {
always: [
{
guard: isStepCompleted('pushToGitHub'),
target: 'createSupabaseProject',
},
],
invoke: {
src: 'pushToGitHubActor',
onDone: 'createSupabaseProject',
onError: 'failed',
},
},
createSupabaseProject: {
always: [
{
guard: isStepCompleted('createSupabaseProject'),
target: 'setupAndCreateVercelProject',
},
],
invoke: {
src: 'createSupabaseProjectActor',
onDone: 'setupAndCreateVercelProject',
onError: 'failed',
},
},
setupAndCreateVercelProject: {
always: [
{
guard: isStepCompleted('setupAndCreateVercelProject'),
target: 'connectSupabaseProject',
},
],
invoke: {
src: 'setupAndCreateVercelProjectActor',
onDone: 'connectSupabaseProject',
onError: 'failed',
},
},
connectSupabaseProject: {
always: [
{
guard: isStepCompleted('connectSupabaseProject'),
target: 'deployVercelProject',
},
],
invoke: {
src: 'connectSupabaseProjectActor',
onDone: 'deployVercelProject',
onError: 'failed',
},
},
deployVercelProject: {
always: [
{
guard: isStepCompleted('deployVercelProject'),
target: 'prepareDrink',
},
],
invoke: {
src: 'deployVercelProjectActor',
onDone: 'prepareDrink',
onError: 'failed',
},
},
prepareDrink: {
always: [
{
guard: isStepCompleted('prepareDrink'),
target: 'done',
},
],
invoke: {
src: 'prepareDrinkActor',
onDone: 'done',
Expand Down Expand Up @@ -198,7 +282,7 @@ const createInstallMachine = (initialContext: InstallMachineContext) => {
createEnvFileActor: createStepMachine(
fromPromise<void, InstallMachineContext, AnyEventObject>(async ({ input }) => {
try {
logWithColoredPrefix('stapler', 'Creating env file in actor...');
logWithColoredPrefix('stapler', 'Creating env file in actor... in');
createEnvFile(input.projectDir);
input.stateData.stepsCompleted.createEnvFile = true;
saveState(input.stateData, input.projectDir);
Expand Down
1 change: 1 addition & 0 deletions packages/core/utils/env/createEnvFile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const requiredEnvVariables: Record<string, 'required' | 'optional'> = {
// Function to create .env file with empty fields
export const createEnvFile = (destinationDirectory: string) => {
logWithColoredPrefix('stapler', 'Creating .env file...');
logWithColoredPrefix('stapler', destinationDirectory);
let envTemplate = '';
for (const [key, status] of Object.entries(requiredEnvVariables)) {
envTemplate += `${key}=\n`;
Expand Down

0 comments on commit 5ac55db

Please sign in to comment.