chore: generic create new file

This commit is contained in:
Kevin Nadro
2025-04-14 16:45:38 -06:00
parent 216af5a0ca
commit fcffc72655
4 changed files with 100 additions and 2 deletions

View File

@ -100,7 +100,8 @@ export async function mkdirOrNOOP(directoryPath: string): Promise<string> {
export async function createNewProjectDirectory( export async function createNewProjectDirectory(
projectName: string, projectName: string,
initialCode?: string, initialCode?: string,
configuration?: DeepPartial<Configuration> | Error configuration?: DeepPartial<Configuration> | Error,
initialFileName?: string
): Promise<Project> { ): Promise<Project> {
if (!configuration) { if (!configuration) {
configuration = await readAppSettingsFile() configuration = await readAppSettingsFile()
@ -126,7 +127,8 @@ export async function createNewProjectDirectory(
} }
} }
const projectFile = window.electron.path.join(projectDir, PROJECT_ENTRYPOINT) const kclFileName = initialFileName || PROJECT_ENTRYPOINT
const projectFile = window.electron.path.join(projectDir, kclFileName)
// When initialCode is present, we're loading existing code. If it's not // When initialCode is present, we're loading existing code. If it's not
// present, we're creating a new project, and we want to incorporate the // present, we're creating a new project, and we want to incorporate the
// user's settings. // user's settings.

View File

@ -50,6 +50,14 @@ export const systemIOMachine = setup({
| { | {
type: SystemIOMachineEvents.deleteProject type: SystemIOMachineEvents.deleteProject
data: { requestedProjectName: string } data: { requestedProjectName: string }
}
| {
type: SystemIOMachineEvents.createKCLFile
data: {
requestedProjectName: string
requestedFileName: string
requestedCode: string
}
}, },
}, },
actions: { actions: {
@ -116,6 +124,18 @@ export const systemIOMachine = setup({
} }
}) => {} }) => {}
), ),
[SystemIOMachineActors.createKCLFile]: fromPromise(
async ({
input,
}: {
input: {
context: SystemIOContext
requestedProjectName: string
requestedFileName: string
requestedCode: string
}
}) => {}
),
}, },
}).createMachine({ }).createMachine({
initial: SystemIOMachineStates.idle, initial: SystemIOMachineStates.idle,
@ -158,6 +178,9 @@ export const systemIOMachine = setup({
[SystemIOMachineEvents.deleteProject]: { [SystemIOMachineEvents.deleteProject]: {
target: SystemIOMachineStates.deletingProject, target: SystemIOMachineStates.deletingProject,
}, },
[SystemIOMachineEvents.createKCLFile]: {
target: SystemIOMachineStates.creatingKCLFile,
},
}, },
}, },
[SystemIOMachineStates.readingFolders]: { [SystemIOMachineStates.readingFolders]: {
@ -234,6 +257,27 @@ export const systemIOMachine = setup({
}, },
}, },
}, },
[SystemIOMachineStates.creatingKCLFile]: {
invoke: {
id: SystemIOMachineActors.createKCLFile,
src: SystemIOMachineActors.createKCLFile,
input: ({ context, event }) => {
assertEvent(event, SystemIOMachineEvents.createKCLFile)
return {
context,
requestedProjectName: event.data.requestedProjectName,
requestedFileName: event.data.requestedFileName,
requestedCode: event.data.requestedCode,
}
},
onDone: {
target: SystemIOMachineStates.idle,
},
onError: {
target: SystemIOMachineStates.idle,
},
},
},
}, },
}) })

View File

@ -2,10 +2,12 @@ import {
createNewProjectDirectory, createNewProjectDirectory,
getProjectInfo, getProjectInfo,
mkdirOrNOOP, mkdirOrNOOP,
readAppSettingsFile,
renameProjectDirectory, renameProjectDirectory,
} from '@src/lib/desktop' } from '@src/lib/desktop'
import { import {
doesProjectNameNeedInterpolated, doesProjectNameNeedInterpolated,
getNextFileName,
getNextProjectIndex, getNextProjectIndex,
getUniqueProjectName, getUniqueProjectName,
interpolateProjectNameWithIndex, interpolateProjectNameWithIndex,
@ -132,5 +134,52 @@ export const systemIOMachineDesktop = systemIOMachine.provide({
) )
} }
), ),
[SystemIOMachineActors.createKCLFile]: fromPromise(
async ({
input,
}: {
input: {
context: SystemIOContext
requestedProjectName: string
requestedFileName: string
requestedCode: string
}
}) => {
const requestedProjectName = input.requestedProjectName
const requestedFileName = input.requestedFileName
const requestedCode = input.requestedCode
const folders = input.context.folders
let newProjectName = requestedProjectName
const needsInterpolated =
doesProjectNameNeedInterpolated(newProjectName)
if (needsInterpolated) {
const nextIndex = getNextProjectIndex(newProjectName, folders)
newProjectName = interpolateProjectNameWithIndex(
newProjectName,
nextIndex
)
}
const baseDir = window.electron.join(
input.context.projectDirectoryPath,
newProjectName
)
const { name: newFileName } = getNextFileName({
entryName: requestedFileName,
baseDir,
})
const configuration = await readAppSettingsFile()
// Create the project around the file if newProject
await createNewProjectDirectory(
newProjectName,
requestedCode,
configuration,
newFileName
)
}
),
}, },
}) })

View File

@ -6,6 +6,7 @@ export enum SystemIOMachineActors {
createProject = 'create project', createProject = 'create project',
renameProject = 'rename project', renameProject = 'rename project',
deleteProject = 'delete project', deleteProject = 'delete project',
createKCLFile = 'create kcl file',
} }
export enum SystemIOMachineStates { export enum SystemIOMachineStates {
@ -15,6 +16,7 @@ export enum SystemIOMachineStates {
creatingProject = 'creatingProject', creatingProject = 'creatingProject',
renamingProject = 'renamingProject', renamingProject = 'renamingProject',
deletingProject = 'deletingProject', deletingProject = 'deletingProject',
creatingKCLFile = 'creatingKCLFile',
} }
const donePrefix = 'xstate.done.actor.' const donePrefix = 'xstate.done.actor.'
@ -29,6 +31,7 @@ export enum SystemIOMachineEvents {
createProject = 'create project', createProject = 'create project',
renameProject = 'rename project', renameProject = 'rename project',
deleteProject = 'delete project', deleteProject = 'delete project',
createKCLFile = 'create kcl file',
} }
export enum SystemIOMachineActions { export enum SystemIOMachineActions {